blob: 702380d75338f6a5e87ea2501ff7ddd568211045 [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++;
1893 err = (tstate->c_tracefunc)(tstate->c_traceobj, f,
1894 PyTrace_LINE, Py_None);
1895 tstate->tracing--;
Guido van Rossum374a9221991-04-04 10:40:29 +00001896 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001897
1898 case CALL_FUNCTION:
Jeremy Hylton52820442001-01-03 23:52:36 +00001899 {
1900 int na = oparg & 0xff;
1901 int nk = (oparg>>8) & 0xff;
1902 int n = na + 2 * nk;
1903 PyObject **pfunc = stack_pointer - n - 1;
1904 PyObject *func = *pfunc;
1905 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1906
1907 /* Always dispatch PyCFunction first, because
1908 these are presumed to be the most frequent
1909 callable object.
1910 */
1911 if (PyCFunction_Check(func)) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001912 int flags = PyCFunction_GET_FLAGS(func);
Jeremy Hylton4c9dace2001-05-29 16:23:26 +00001913 if (flags > 1 || nk != 0)
1914 x = do_call(func, &stack_pointer,
1915 na, nk);
1916 else if (flags == METH_VARARGS) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001917 PyObject *callargs;
1918 callargs = load_args(&stack_pointer, na);
1919 x = call_cfunction(func, callargs, NULL);
1920 Py_XDECREF(callargs);
Jeremy Hylton4c9dace2001-05-29 16:23:26 +00001921 } else if (flags == 0)
Jeremy Hylton52820442001-01-03 23:52:36 +00001922 x = fast_cfunction(func,
Guido van Rossumac7be682001-01-17 15:42:30 +00001923 &stack_pointer, na);
Jeremy Hylton52820442001-01-03 23:52:36 +00001924 } else {
Guido van Rossumac7be682001-01-17 15:42:30 +00001925 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001926 && PyMethod_GET_SELF(func) != NULL) {
1927 /* optimize access to bound methods */
1928 PyObject *self = PyMethod_GET_SELF(func);
1929 Py_INCREF(self);
1930 func = PyMethod_GET_FUNCTION(func);
1931 Py_INCREF(func);
1932 Py_DECREF(*pfunc);
1933 *pfunc = self;
1934 na++;
1935 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00001936 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00001937 Py_INCREF(func);
1938 if (PyFunction_Check(func)) {
1939 x = fast_function(func, &stack_pointer,
Guido van Rossumac7be682001-01-17 15:42:30 +00001940 n, na, nk);
Jeremy Hylton52820442001-01-03 23:52:36 +00001941 } else {
1942 x = do_call(func, &stack_pointer,
1943 na, nk);
1944 }
1945 Py_DECREF(func);
1946 }
1947
1948 while (stack_pointer > pfunc) {
1949 w = POP();
1950 Py_DECREF(w);
1951 }
1952 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00001953 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00001954 continue;
1955 break;
1956 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001957
Jeremy Hylton76901512000-03-28 23:49:17 +00001958 case CALL_FUNCTION_VAR:
1959 case CALL_FUNCTION_KW:
1960 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001961 {
Jeremy Hylton76901512000-03-28 23:49:17 +00001962 int na = oparg & 0xff;
1963 int nk = (oparg>>8) & 0xff;
1964 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00001965 int n = na + 2 * nk;
1966 PyObject **pfunc, *func;
1967 if (flags & CALL_FLAG_VAR)
1968 n++;
1969 if (flags & CALL_FLAG_KW)
1970 n++;
1971 pfunc = stack_pointer - n - 1;
1972 func = *pfunc;
Jeremy Hylton76901512000-03-28 23:49:17 +00001973 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Jeremy Hylton52820442001-01-03 23:52:36 +00001974
Guido van Rossumac7be682001-01-17 15:42:30 +00001975 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001976 && PyMethod_GET_SELF(func) != NULL) {
1977 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00001978 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00001979 func = PyMethod_GET_FUNCTION(func);
1980 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00001981 Py_DECREF(*pfunc);
1982 *pfunc = self;
1983 na++;
1984 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00001985 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00001986 Py_INCREF(func);
1987 x = ext_do_call(func, &stack_pointer, flags, na, nk);
Jeremy Hylton76901512000-03-28 23:49:17 +00001988 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00001989
Jeremy Hylton76901512000-03-28 23:49:17 +00001990 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00001991 w = POP();
1992 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00001993 }
1994 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00001995 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00001996 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00001997 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001998 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001999
Guido van Rossum681d79a1995-07-18 14:51:37 +00002000 case MAKE_FUNCTION:
2001 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00002002 x = PyFunction_New(v, f->f_globals);
2003 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002004 /* XXX Maybe this should be a separate opcode? */
2005 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002006 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002007 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002008 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002009 x = NULL;
2010 break;
2011 }
2012 while (--oparg >= 0) {
2013 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002014 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002015 }
2016 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00002017 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002018 }
2019 PUSH(x);
2020 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002021
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002022 case MAKE_CLOSURE:
2023 {
2024 int nfree;
2025 v = POP(); /* code object */
2026 x = PyFunction_New(v, f->f_globals);
2027 nfree = PyTuple_GET_SIZE(((PyCodeObject *)v)->co_freevars);
2028 Py_DECREF(v);
2029 /* XXX Maybe this should be a separate opcode? */
2030 if (x != NULL && nfree > 0) {
2031 v = PyTuple_New(nfree);
2032 if (v == NULL) {
2033 Py_DECREF(x);
2034 x = NULL;
2035 break;
2036 }
2037 while (--nfree >= 0) {
2038 w = POP();
2039 PyTuple_SET_ITEM(v, nfree, w);
2040 }
2041 err = PyFunction_SetClosure(x, v);
2042 Py_DECREF(v);
2043 }
2044 if (x != NULL && oparg > 0) {
2045 v = PyTuple_New(oparg);
2046 if (v == NULL) {
2047 Py_DECREF(x);
2048 x = NULL;
2049 break;
2050 }
2051 while (--oparg >= 0) {
2052 w = POP();
2053 PyTuple_SET_ITEM(v, oparg, w);
2054 }
2055 err = PyFunction_SetDefaults(x, v);
2056 Py_DECREF(v);
2057 }
2058 PUSH(x);
2059 break;
2060 }
2061
Guido van Rossum8861b741996-07-30 16:49:37 +00002062 case BUILD_SLICE:
2063 if (oparg == 3)
2064 w = POP();
2065 else
2066 w = NULL;
2067 v = POP();
2068 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002069 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002070 Py_DECREF(u);
2071 Py_DECREF(v);
2072 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00002073 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002074 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002075 break;
2076
Fred Drakeef8ace32000-08-24 00:32:09 +00002077 case EXTENDED_ARG:
2078 opcode = NEXTOP();
2079 oparg = oparg<<16 | NEXTARG();
2080 goto dispatch_opcode;
Guido van Rossum8861b741996-07-30 16:49:37 +00002081
Guido van Rossum374a9221991-04-04 10:40:29 +00002082 default:
2083 fprintf(stderr,
2084 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00002085 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002086 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002087 why = WHY_EXCEPTION;
2088 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002089
2090#ifdef CASE_TOO_BIG
2091 }
2092#endif
2093
Guido van Rossum374a9221991-04-04 10:40:29 +00002094 } /* switch */
2095
2096 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002097
Guido van Rossum374a9221991-04-04 10:40:29 +00002098 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002099
Guido van Rossum374a9221991-04-04 10:40:29 +00002100 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002101 if (err == 0 && x != NULL) {
2102#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002103 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002104 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002105 fprintf(stderr,
2106 "XXX undetected error\n");
2107 else
2108#endif
2109 continue; /* Normal, fast path */
2110 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002111 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002112 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002113 err = 0;
2114 }
2115
Guido van Rossum374a9221991-04-04 10:40:29 +00002116 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002117
Guido van Rossum374a9221991-04-04 10:40:29 +00002118 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002119 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002120 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002121 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002122 why = WHY_EXCEPTION;
2123 }
2124 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002125#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002126 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002127 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002128 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002129 fprintf(stderr,
2130 "XXX undetected error (why=%d)\n",
2131 why);
2132 why = WHY_EXCEPTION;
2133 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002134 }
2135#endif
2136
2137 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002138
Guido van Rossum374a9221991-04-04 10:40:29 +00002139 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002140 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00002141 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00002142 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00002143 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002144
Fred Drake5755ce62001-06-27 19:19:46 +00002145 if (tstate->c_tracefunc)
2146 call_exc_trace(tstate->c_tracefunc,
2147 tstate->c_traceobj, f);
2148 if (tstate->c_profilefunc)
2149 call_exc_trace(tstate->c_profilefunc,
2150 tstate->c_profileobj, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002151 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002152
Guido van Rossum374a9221991-04-04 10:40:29 +00002153 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002154
Guido van Rossum374a9221991-04-04 10:40:29 +00002155 if (why == WHY_RERAISE)
2156 why = WHY_EXCEPTION;
2157
2158 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002159
Tim Peters5ca576e2001-06-18 22:08:13 +00002160 while (why != WHY_NOT && why != WHY_YIELD && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002161 PyTryBlock *b = PyFrame_BlockPop(f);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002162
2163 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2164 /* For a continue inside a try block,
2165 don't pop the block for the loop. */
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00002166 PyFrame_BlockSetup(f, b->b_type, b->b_level,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002167 b->b_handler);
2168 why = WHY_NOT;
2169 JUMPTO(PyInt_AS_LONG(retval));
2170 Py_DECREF(retval);
2171 break;
2172 }
2173
Guido van Rossum374a9221991-04-04 10:40:29 +00002174 while (STACK_LEVEL() > b->b_level) {
2175 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002176 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002177 }
2178 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2179 why = WHY_NOT;
2180 JUMPTO(b->b_handler);
2181 break;
2182 }
2183 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002184 (b->b_type == SETUP_EXCEPT &&
2185 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002186 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002187 PyObject *exc, *val, *tb;
2188 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002189 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002190 val = Py_None;
2191 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002192 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002193 /* Make the raw exception data
2194 available to the handler,
2195 so a program can emulate the
2196 Python main loop. Don't do
2197 this for 'finally'. */
2198 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002199 PyErr_NormalizeException(
2200 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002201 set_exc_info(tstate,
2202 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002203 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002204 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002205 PUSH(val);
2206 PUSH(exc);
2207 }
2208 else {
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002209 if (why == WHY_RETURN ||
2210 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00002211 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002212 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002213 PUSH(v);
2214 }
2215 why = WHY_NOT;
2216 JUMPTO(b->b_handler);
2217 break;
2218 }
2219 } /* unwind stack */
2220
2221 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002222
Guido van Rossum374a9221991-04-04 10:40:29 +00002223 if (why != WHY_NOT)
2224 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002225
Guido van Rossum374a9221991-04-04 10:40:29 +00002226 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002227
Tim Peters5ca576e2001-06-18 22:08:13 +00002228 if (why != WHY_RETURN && why != WHY_YIELD)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002229 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002230
Fred Drake5755ce62001-06-27 19:19:46 +00002231 if (tstate->c_tracefunc && !tstate->tracing) {
Tim Peters5ca576e2001-06-18 22:08:13 +00002232 if (why == WHY_RETURN || why == WHY_YIELD) {
Fred Drake5755ce62001-06-27 19:19:46 +00002233 if (call_trace(tstate->c_tracefunc, tstate->c_traceobj,
2234 f, PyTrace_RETURN, retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002235 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002236 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002237 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002238 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002239 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002240 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002241
Fred Drake5755ce62001-06-27 19:19:46 +00002242 if (tstate->c_profilefunc && !tstate->tracing
2243 && (why == WHY_RETURN || why == WHY_YIELD)) {
2244 if (call_trace(tstate->c_profilefunc, tstate->c_profileobj,
2245 f, PyTrace_RETURN, retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002246 Py_XDECREF(retval);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002247 retval = NULL;
2248 why = WHY_EXCEPTION;
2249 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002250 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002251
Guido van Rossuma027efa1997-05-05 20:56:21 +00002252 reset_exc_info(tstate);
2253
Tim Peters5ca576e2001-06-18 22:08:13 +00002254 /* pop frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002255 --tstate->recursion_depth;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002256 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00002257
Guido van Rossum96a42c81992-01-12 02:29:51 +00002258 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002259}
2260
Tim Peters5ca576e2001-06-18 22:08:13 +00002261static PyObject *
2262eval_code2(PyCodeObject *co, PyObject *globals, PyObject *locals,
2263 PyObject **args, int argcount, PyObject **kws, int kwcount,
2264 PyObject **defs, int defcount, PyObject *closure)
2265{
2266 register PyFrameObject *f;
2267 register PyObject *retval = NULL;
2268 register PyObject **fastlocals, **freevars;
2269 PyThreadState *tstate = PyThreadState_GET();
2270 PyObject *x, *u;
2271
2272 if (globals == NULL) {
2273 PyErr_SetString(PyExc_SystemError, "eval_code2: NULL globals");
2274 return NULL;
2275 }
2276
2277 f = PyFrame_New(tstate, /*back*/
2278 co, /*code*/
2279 globals, locals);
2280 if (f == NULL)
2281 return NULL;
2282
2283 fastlocals = f->f_localsplus;
2284 freevars = f->f_localsplus + f->f_nlocals;
2285
2286 if (co->co_argcount > 0 ||
2287 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
2288 int i;
2289 int n = argcount;
2290 PyObject *kwdict = NULL;
2291 if (co->co_flags & CO_VARKEYWORDS) {
2292 kwdict = PyDict_New();
2293 if (kwdict == NULL)
2294 goto fail;
2295 i = co->co_argcount;
2296 if (co->co_flags & CO_VARARGS)
2297 i++;
2298 SETLOCAL(i, kwdict);
2299 }
2300 if (argcount > co->co_argcount) {
2301 if (!(co->co_flags & CO_VARARGS)) {
2302 PyErr_Format(PyExc_TypeError,
2303 "%.200s() takes %s %d "
2304 "%sargument%s (%d given)",
2305 PyString_AsString(co->co_name),
2306 defcount ? "at most" : "exactly",
2307 co->co_argcount,
2308 kwcount ? "non-keyword " : "",
2309 co->co_argcount == 1 ? "" : "s",
2310 argcount);
2311 goto fail;
2312 }
2313 n = co->co_argcount;
2314 }
2315 for (i = 0; i < n; i++) {
2316 x = args[i];
2317 Py_INCREF(x);
2318 SETLOCAL(i, x);
2319 }
2320 if (co->co_flags & CO_VARARGS) {
2321 u = PyTuple_New(argcount - n);
2322 if (u == NULL)
2323 goto fail;
2324 SETLOCAL(co->co_argcount, u);
2325 for (i = n; i < argcount; i++) {
2326 x = args[i];
2327 Py_INCREF(x);
2328 PyTuple_SET_ITEM(u, i-n, x);
2329 }
2330 }
2331 for (i = 0; i < kwcount; i++) {
2332 PyObject *keyword = kws[2*i];
2333 PyObject *value = kws[2*i + 1];
2334 int j;
2335 if (keyword == NULL || !PyString_Check(keyword)) {
2336 PyErr_Format(PyExc_TypeError,
2337 "%.200s() keywords must be strings",
2338 PyString_AsString(co->co_name));
2339 goto fail;
2340 }
2341 /* XXX slow -- speed up using dictionary? */
2342 for (j = 0; j < co->co_argcount; j++) {
2343 PyObject *nm = PyTuple_GET_ITEM(
2344 co->co_varnames, j);
2345 int cmp = PyObject_RichCompareBool(
2346 keyword, nm, Py_EQ);
2347 if (cmp > 0)
2348 break;
2349 else if (cmp < 0)
2350 goto fail;
2351 }
2352 /* Check errors from Compare */
2353 if (PyErr_Occurred())
2354 goto fail;
2355 if (j >= co->co_argcount) {
2356 if (kwdict == NULL) {
2357 PyErr_Format(PyExc_TypeError,
2358 "%.200s() got an unexpected "
2359 "keyword argument '%.400s'",
2360 PyString_AsString(co->co_name),
2361 PyString_AsString(keyword));
2362 goto fail;
2363 }
2364 PyDict_SetItem(kwdict, keyword, value);
2365 }
2366 else {
2367 if (GETLOCAL(j) != NULL) {
2368 PyErr_Format(PyExc_TypeError,
2369 "%.200s() got multiple "
2370 "values for keyword "
2371 "argument '%.400s'",
2372 PyString_AsString(co->co_name),
2373 PyString_AsString(keyword));
2374 goto fail;
2375 }
2376 Py_INCREF(value);
2377 SETLOCAL(j, value);
2378 }
2379 }
2380 if (argcount < co->co_argcount) {
2381 int m = co->co_argcount - defcount;
2382 for (i = argcount; i < m; i++) {
2383 if (GETLOCAL(i) == NULL) {
2384 PyErr_Format(PyExc_TypeError,
2385 "%.200s() takes %s %d "
2386 "%sargument%s (%d given)",
2387 PyString_AsString(co->co_name),
2388 ((co->co_flags & CO_VARARGS) ||
2389 defcount) ? "at least"
2390 : "exactly",
2391 m, kwcount ? "non-keyword " : "",
2392 m == 1 ? "" : "s", i);
2393 goto fail;
2394 }
2395 }
2396 if (n > m)
2397 i = n - m;
2398 else
2399 i = 0;
2400 for (; i < defcount; i++) {
2401 if (GETLOCAL(m+i) == NULL) {
2402 PyObject *def = defs[i];
2403 Py_INCREF(def);
2404 SETLOCAL(m+i, def);
2405 }
2406 }
2407 }
2408 }
2409 else {
2410 if (argcount > 0 || kwcount > 0) {
2411 PyErr_Format(PyExc_TypeError,
2412 "%.200s() takes no arguments (%d given)",
2413 PyString_AsString(co->co_name),
2414 argcount + kwcount);
2415 goto fail;
2416 }
2417 }
2418 /* Allocate and initialize storage for cell vars, and copy free
2419 vars into frame. This isn't too efficient right now. */
2420 if (f->f_ncells) {
2421 int i = 0, j = 0, nargs, found;
2422 char *cellname, *argname;
2423 PyObject *c;
2424
2425 nargs = co->co_argcount;
2426 if (co->co_flags & CO_VARARGS)
2427 nargs++;
2428 if (co->co_flags & CO_VARKEYWORDS)
2429 nargs++;
2430
2431 /* Check for cells that shadow args */
2432 for (i = 0; i < f->f_ncells && j < nargs; ++i) {
2433 cellname = PyString_AS_STRING(
2434 PyTuple_GET_ITEM(co->co_cellvars, i));
2435 found = 0;
2436 while (j < nargs) {
2437 argname = PyString_AS_STRING(
2438 PyTuple_GET_ITEM(co->co_varnames, j));
2439 if (strcmp(cellname, argname) == 0) {
2440 c = PyCell_New(GETLOCAL(j));
2441 if (c == NULL)
2442 goto fail;
2443 GETLOCAL(f->f_nlocals + i) = c;
2444 found = 1;
2445 break;
2446 }
2447 j++;
2448 }
2449 if (found == 0) {
2450 c = PyCell_New(NULL);
2451 if (c == NULL)
2452 goto fail;
2453 SETLOCAL(f->f_nlocals + i, c);
2454 }
2455 }
2456 /* Initialize any that are left */
2457 while (i < f->f_ncells) {
2458 c = PyCell_New(NULL);
2459 if (c == NULL)
2460 goto fail;
2461 SETLOCAL(f->f_nlocals + i, c);
2462 i++;
2463 }
2464 }
2465 if (f->f_nfreevars) {
2466 int i;
2467 for (i = 0; i < f->f_nfreevars; ++i) {
2468 PyObject *o = PyTuple_GET_ITEM(closure, i);
2469 Py_INCREF(o);
2470 freevars[f->f_ncells + i] = o;
2471 }
2472 }
2473
Fred Drake5755ce62001-06-27 19:19:46 +00002474 if (tstate->c_tracefunc != NULL && !tstate->tracing) {
Tim Peters5ca576e2001-06-18 22:08:13 +00002475 /* tstate->sys_tracefunc, if defined, is a function that
2476 will be called on *every* entry to a code block.
2477 Its return value, if not None, is a function that
2478 will be called at the start of each executed line
2479 of code. (Actually, the function must return
2480 itself in order to continue tracing.)
2481 The trace functions are called with three arguments:
2482 a pointer to the current frame, a string indicating
2483 why the function is called, and an argument which
2484 depends on the situation. The global trace function
2485 (sys.trace) is also called whenever an exception
2486 is detected. */
Fred Drake5755ce62001-06-27 19:19:46 +00002487 if (call_trace(tstate->c_tracefunc, tstate->c_traceobj,
2488 f, PyTrace_CALL, Py_None)) {
2489 /* XXX Need way to compute arguments?? */
Tim Peters5ca576e2001-06-18 22:08:13 +00002490 /* Trace function raised an error */
2491 goto fail;
2492 }
2493 }
2494
Fred Drake5755ce62001-06-27 19:19:46 +00002495 if (tstate->c_profilefunc != NULL) {
Tim Peters5ca576e2001-06-18 22:08:13 +00002496 /* Similar for sys_profilefunc, except it needn't return
2497 itself and isn't called for "line" events */
Fred Drake5755ce62001-06-27 19:19:46 +00002498 if (call_trace(tstate->c_profilefunc, tstate->c_profileobj,
2499 f, PyTrace_CALL, Py_None)) {
2500 /* XXX Need way to compute arguments?? */
2501 /* Profile function raised an error */
Tim Peters5ca576e2001-06-18 22:08:13 +00002502 goto fail;
2503 }
2504 }
2505
2506 if (co->co_flags & CO_GENERATOR) {
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002507 /* Don't need to keep the reference to f_back, it will be set
2508 * when the generator is resumed. */
2509 Py_DECREF(f->f_back);
2510 f->f_back = NULL;
2511
2512 /* Create a new generator that owns the ready to run frame
2513 * and return that as the value. */
Tim Peters5ca576e2001-06-18 22:08:13 +00002514 return gen_new(f);
2515 }
2516
2517 retval = eval_frame(f);
2518
2519 fail: /* Jump here from prelude on failure */
2520
2521 Py_DECREF(f);
2522 return retval;
2523}
2524
2525
Guido van Rossuma027efa1997-05-05 20:56:21 +00002526static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002527set_exc_info(PyThreadState *tstate,
2528 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002529{
2530 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002531 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002532
Guido van Rossuma027efa1997-05-05 20:56:21 +00002533 frame = tstate->frame;
2534 if (frame->f_exc_type == NULL) {
2535 /* This frame didn't catch an exception before */
2536 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002537 if (tstate->exc_type == NULL) {
2538 Py_INCREF(Py_None);
2539 tstate->exc_type = Py_None;
2540 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002541 tmp_type = frame->f_exc_type;
2542 tmp_value = frame->f_exc_value;
2543 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002544 Py_XINCREF(tstate->exc_type);
2545 Py_XINCREF(tstate->exc_value);
2546 Py_XINCREF(tstate->exc_traceback);
2547 frame->f_exc_type = tstate->exc_type;
2548 frame->f_exc_value = tstate->exc_value;
2549 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002550 Py_XDECREF(tmp_type);
2551 Py_XDECREF(tmp_value);
2552 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002553 }
2554 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002555 tmp_type = tstate->exc_type;
2556 tmp_value = tstate->exc_value;
2557 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002558 Py_XINCREF(type);
2559 Py_XINCREF(value);
2560 Py_XINCREF(tb);
2561 tstate->exc_type = type;
2562 tstate->exc_value = value;
2563 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002564 Py_XDECREF(tmp_type);
2565 Py_XDECREF(tmp_value);
2566 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002567 /* For b/w compatibility */
2568 PySys_SetObject("exc_type", type);
2569 PySys_SetObject("exc_value", value);
2570 PySys_SetObject("exc_traceback", tb);
2571}
2572
2573static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002574reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002575{
2576 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002577 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002578 frame = tstate->frame;
2579 if (frame->f_exc_type != NULL) {
2580 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002581 tmp_type = tstate->exc_type;
2582 tmp_value = tstate->exc_value;
2583 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002584 Py_XINCREF(frame->f_exc_type);
2585 Py_XINCREF(frame->f_exc_value);
2586 Py_XINCREF(frame->f_exc_traceback);
2587 tstate->exc_type = frame->f_exc_type;
2588 tstate->exc_value = frame->f_exc_value;
2589 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002590 Py_XDECREF(tmp_type);
2591 Py_XDECREF(tmp_value);
2592 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002593 /* For b/w compatibility */
2594 PySys_SetObject("exc_type", frame->f_exc_type);
2595 PySys_SetObject("exc_value", frame->f_exc_value);
2596 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2597 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002598 tmp_type = frame->f_exc_type;
2599 tmp_value = frame->f_exc_value;
2600 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002601 frame->f_exc_type = NULL;
2602 frame->f_exc_value = NULL;
2603 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002604 Py_XDECREF(tmp_type);
2605 Py_XDECREF(tmp_value);
2606 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002607}
2608
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002609/* Logic for the raise statement (too complicated for inlining).
2610 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002611static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002612do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002613{
Guido van Rossumd295f121998-04-09 21:39:57 +00002614 if (type == NULL) {
2615 /* Reraise */
2616 PyThreadState *tstate = PyThreadState_Get();
2617 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2618 value = tstate->exc_value;
2619 tb = tstate->exc_traceback;
2620 Py_XINCREF(type);
2621 Py_XINCREF(value);
2622 Py_XINCREF(tb);
2623 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002624
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002625 /* We support the following forms of raise:
2626 raise <class>, <classinstance>
2627 raise <class>, <argument tuple>
2628 raise <class>, None
2629 raise <class>, <argument>
2630 raise <classinstance>, None
2631 raise <string>, <object>
2632 raise <string>, None
2633
2634 An omitted second argument is the same as None.
2635
2636 In addition, raise <tuple>, <anything> is the same as
2637 raising the tuple's first item (and it better have one!);
2638 this rule is applied recursively.
2639
2640 Finally, an optional third argument can be supplied, which
2641 gives the traceback to be substituted (useful when
2642 re-raising an exception after examining it). */
2643
2644 /* First, check the traceback argument, replacing None with
2645 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002646 if (tb == Py_None) {
2647 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002648 tb = NULL;
2649 }
2650 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002651 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002652 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002653 goto raise_error;
2654 }
2655
2656 /* Next, replace a missing value with None */
2657 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002658 value = Py_None;
2659 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002660 }
2661
2662 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002663 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2664 PyObject *tmp = type;
2665 type = PyTuple_GET_ITEM(type, 0);
2666 Py_INCREF(type);
2667 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002668 }
2669
Barry Warsaw4249f541997-08-22 21:26:19 +00002670 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002671 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002672
2673 else if (PyClass_Check(type))
2674 PyErr_NormalizeException(&type, &value, &tb);
2675
Guido van Rossumb209a111997-04-29 18:18:01 +00002676 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002677 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002678 if (value != Py_None) {
2679 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002680 "instance exception may not have a separate value");
2681 goto raise_error;
2682 }
2683 else {
2684 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002685 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002686 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002687 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2688 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002689 }
2690 }
2691 else {
2692 /* Not something you can raise. You get an exception
2693 anyway, just not what you specified :-) */
Jeremy Hylton960d9482001-04-27 02:25:33 +00002694 PyErr_Format(PyExc_TypeError,
2695 "exceptions must be strings, classes, or "
2696 "instances, not %s", type->ob_type->tp_name);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002697 goto raise_error;
2698 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002699 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002700 if (tb == NULL)
2701 return WHY_EXCEPTION;
2702 else
2703 return WHY_RERAISE;
2704 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002705 Py_XDECREF(value);
2706 Py_XDECREF(type);
2707 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002708 return WHY_EXCEPTION;
2709}
2710
Tim Petersd6d010b2001-06-21 02:49:55 +00002711/* Iterate v argcnt times and store the results on the stack (via decreasing
2712 sp). Return 1 for success, 0 if error. */
2713
Barry Warsawe42b18f1997-08-25 22:13:04 +00002714static int
Tim Petersd6d010b2001-06-21 02:49:55 +00002715unpack_iterable(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002716{
Tim Petersd6d010b2001-06-21 02:49:55 +00002717 int i = 0;
2718 PyObject *it; /* iter(v) */
Barry Warsawe42b18f1997-08-25 22:13:04 +00002719 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00002720
Tim Petersd6d010b2001-06-21 02:49:55 +00002721 assert(v != NULL);
2722
2723 it = PyObject_GetIter(v);
2724 if (it == NULL)
2725 goto Error;
2726
2727 for (; i < argcnt; i++) {
2728 w = PyIter_Next(it);
2729 if (w == NULL) {
2730 /* Iterator done, via error or exhaustion. */
2731 if (!PyErr_Occurred()) {
2732 PyErr_Format(PyExc_ValueError,
2733 "need more than %d value%s to unpack",
2734 i, i == 1 ? "" : "s");
2735 }
2736 goto Error;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002737 }
2738 *--sp = w;
2739 }
Tim Petersd6d010b2001-06-21 02:49:55 +00002740
2741 /* We better have exhausted the iterator now. */
2742 w = PyIter_Next(it);
2743 if (w == NULL) {
2744 if (PyErr_Occurred())
2745 goto Error;
2746 Py_DECREF(it);
2747 return 1;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002748 }
Tim Petersd6d010b2001-06-21 02:49:55 +00002749 PyErr_SetString(PyExc_ValueError, "too many values to unpack");
Barry Warsawe42b18f1997-08-25 22:13:04 +00002750 /* fall through */
Tim Petersd6d010b2001-06-21 02:49:55 +00002751Error:
Barry Warsaw91010551997-08-25 22:30:51 +00002752 for (; i > 0; i--, sp++)
2753 Py_DECREF(*sp);
Tim Petersd6d010b2001-06-21 02:49:55 +00002754 Py_XDECREF(it);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002755 return 0;
2756}
2757
2758
Guido van Rossum96a42c81992-01-12 02:29:51 +00002759#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002760static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002761prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002762{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002763 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002764 if (PyObject_Print(v, stdout, 0) != 0)
2765 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002766 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002767 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002768}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002769#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002770
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002771static void
Fred Drake5755ce62001-06-27 19:19:46 +00002772call_exc_trace(Py_tracefunc func, PyObject *self, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002773{
Guido van Rossumb209a111997-04-29 18:18:01 +00002774 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002775 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002776 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002777 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002778 value = Py_None;
2779 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002780 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002781 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002782 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002783 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002784 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002785 }
Fred Drake5755ce62001-06-27 19:19:46 +00002786 err = call_trace(func, self, f, PyTrace_EXCEPTION, arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002787 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002788 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002789 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002790 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002791 Py_XDECREF(type);
2792 Py_XDECREF(value);
2793 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002794 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002795}
2796
2797static int
Fred Drake5755ce62001-06-27 19:19:46 +00002798call_trace(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
2799 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002800{
Fred Drake5755ce62001-06-27 19:19:46 +00002801 register PyThreadState *tstate = frame->f_tstate;
2802 int result;
2803 if (tstate->tracing)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002804 return 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002805 tstate->tracing++;
Fred Drake5755ce62001-06-27 19:19:46 +00002806 result = func(obj, frame, what, arg);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002807 tstate->tracing--;
Fred Drake5755ce62001-06-27 19:19:46 +00002808 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002809}
2810
Fred Drake5755ce62001-06-27 19:19:46 +00002811void
2812PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00002813{
Fred Drake5755ce62001-06-27 19:19:46 +00002814 PyThreadState *tstate = PyThreadState_Get();
2815 PyObject *temp = tstate->c_profileobj;
2816 Py_XINCREF(arg);
2817 tstate->c_profilefunc = NULL;
2818 tstate->c_profileobj = NULL;
2819 Py_XDECREF(temp);
2820 tstate->c_profilefunc = func;
2821 tstate->c_profileobj = arg;
2822}
2823
2824void
2825PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
2826{
2827 PyThreadState *tstate = PyThreadState_Get();
2828 PyObject *temp = tstate->c_traceobj;
2829 Py_XINCREF(arg);
2830 tstate->c_tracefunc = NULL;
2831 tstate->c_traceobj = NULL;
2832 Py_XDECREF(temp);
2833 tstate->c_tracefunc = func;
2834 tstate->c_traceobj = arg;
Fred Draked0838392001-06-16 21:02:31 +00002835}
2836
Guido van Rossumb209a111997-04-29 18:18:01 +00002837PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002838PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002839{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002840 PyThreadState *tstate = PyThreadState_Get();
2841 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002842 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002843 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002844 else
2845 return current_frame->f_builtins;
2846}
2847
Guido van Rossumb209a111997-04-29 18:18:01 +00002848PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002849PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002850{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002851 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002852 if (current_frame == NULL)
2853 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002854 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002855 return current_frame->f_locals;
2856}
2857
Guido van Rossumb209a111997-04-29 18:18:01 +00002858PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002859PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002860{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002861 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002862 if (current_frame == NULL)
2863 return NULL;
2864 else
2865 return current_frame->f_globals;
2866}
2867
Guido van Rossumb209a111997-04-29 18:18:01 +00002868PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002869PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002870{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002871 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002872 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002873}
2874
Guido van Rossum6135a871995-01-09 17:53:26 +00002875int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002876PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002877{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002878 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002879 return current_frame == NULL ? 0 : current_frame->f_restricted;
2880}
2881
Guido van Rossumbe270261997-05-22 22:26:18 +00002882int
Jeremy Hylton061d1062001-03-22 02:32:48 +00002883PyEval_GetNestedScopes(void)
2884{
2885 PyFrameObject *current_frame = PyThreadState_Get()->frame;
2886 return current_frame == NULL ? 0 :
2887 current_frame->f_code->co_flags & CO_NESTED;
2888}
2889
2890int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002891Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002892{
Guido van Rossumb209a111997-04-29 18:18:01 +00002893 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002894 if (f == NULL)
2895 return 0;
2896 if (!PyFile_SoftSpace(f, 0))
2897 return 0;
2898 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002899}
2900
Guido van Rossum3f5da241990-12-20 15:06:42 +00002901
Guido van Rossum681d79a1995-07-18 14:51:37 +00002902/* External interface to call any callable object.
2903 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002904
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002905#undef PyEval_CallObject
2906/* for backward compatibility: export this interface */
2907
Guido van Rossumb209a111997-04-29 18:18:01 +00002908PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002909PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002910{
Guido van Rossumb209a111997-04-29 18:18:01 +00002911 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002912}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002913#define PyEval_CallObject(func,arg) \
2914 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002915
Guido van Rossumb209a111997-04-29 18:18:01 +00002916PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002917PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002918{
Jeremy Hylton52820442001-01-03 23:52:36 +00002919 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002920
2921 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002922 arg = PyTuple_New(0);
2923 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002924 PyErr_SetString(PyExc_TypeError,
2925 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002926 return NULL;
2927 }
2928 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002929 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002930
Guido van Rossumb209a111997-04-29 18:18:01 +00002931 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002932 PyErr_SetString(PyExc_TypeError,
2933 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00002934 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002935 return NULL;
2936 }
2937
Jeremy Hylton52820442001-01-03 23:52:36 +00002938 result = call_object(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002939 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00002940 return result;
2941}
2942
2943/* How often is each kind of object called? The answer depends on the
2944 program. An instrumented call_object() was used to run the Python
2945 regression test suite. The results were:
2946 4200000 PyCFunctions
2947 390000 fast_function() calls
2948 94000 other functions
2949 480000 all functions (sum of prev two)
2950 150000 methods
2951 100000 classes
2952
2953 Tests on other bodies of code show that PyCFunctions are still
2954 most common, but not by such a large margin.
2955*/
2956
Jeremy Hylton512a2372001-04-11 13:52:29 +00002957static char *
2958get_func_name(PyObject *func)
2959{
2960 if (PyMethod_Check(func))
2961 return get_func_name(PyMethod_GET_FUNCTION(func));
2962 else if (PyFunction_Check(func))
2963 return PyString_AsString(((PyFunctionObject*)func)->func_name);
2964 else if (PyCFunction_Check(func))
2965 return ((PyCFunctionObject*)func)->m_ml->ml_name;
2966 else if (PyClass_Check(func))
2967 return PyString_AsString(((PyClassObject*)func)->cl_name);
2968 else if (PyInstance_Check(func)) {
2969 return PyString_AsString(
2970 ((PyInstanceObject*)func)->in_class->cl_name);
2971 } else {
2972 return func->ob_type->tp_name;
2973 }
2974}
2975
2976static char *
2977get_func_desc(PyObject *func)
2978{
2979 if (PyMethod_Check(func))
2980 return "()";
2981 else if (PyFunction_Check(func))
2982 return "()";
2983 else if (PyCFunction_Check(func))
2984 return "()";
2985 else if (PyClass_Check(func))
2986 return " constructor";
2987 else if (PyInstance_Check(func)) {
2988 return " instance";
2989 } else {
2990 return " object";
2991 }
2992}
2993
Jeremy Hylton52820442001-01-03 23:52:36 +00002994static PyObject *
2995call_object(PyObject *func, PyObject *arg, PyObject *kw)
2996{
2997 ternaryfunc call;
2998 PyObject *result;
2999
3000 if (PyMethod_Check(func))
3001 result = call_method(func, arg, kw);
3002 else if (PyFunction_Check(func))
3003 result = call_eval_code2(func, arg, kw);
3004 else if (PyCFunction_Check(func))
3005 result = call_cfunction(func, arg, kw);
3006 else if (PyClass_Check(func))
3007 result = PyInstance_New(func, arg, kw);
3008 else if (PyInstance_Check(func))
3009 result = call_instance(func, arg, kw);
3010 else if ((call = func->ob_type->tp_call) != NULL)
3011 result = (*call)(func, arg, kw);
3012 else {
Tim Peters239508c2001-06-16 00:09:28 +00003013 PyErr_Format(PyExc_TypeError,
3014 "object of type '%.100s' is not callable",
3015 func->ob_type->tp_name);
Jeremy Hylton52820442001-01-03 23:52:36 +00003016 return NULL;
3017 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003018 if (result == NULL && !PyErr_Occurred())
3019 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003020 "NULL result without error in call_object");
Guido van Rossumac7be682001-01-17 15:42:30 +00003021
Guido van Rossume59214e1994-08-30 08:01:59 +00003022 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003023}
3024
Guido van Rossumb209a111997-04-29 18:18:01 +00003025static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00003026call_cfunction(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003027{
Jeremy Hylton52820442001-01-03 23:52:36 +00003028 PyCFunctionObject* f = (PyCFunctionObject*)func;
3029 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3030 PyObject *self = PyCFunction_GET_SELF(func);
3031 int flags = PyCFunction_GET_FLAGS(func);
3032
Jeremy Hylton52820442001-01-03 23:52:36 +00003033 if (flags & METH_KEYWORDS) {
3034 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003035 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003036 if (kw != NULL && PyDict_Size(kw) != 0) {
3037 PyErr_Format(PyExc_TypeError,
3038 "%.200s() takes no keyword arguments",
3039 f->m_ml->ml_name);
3040 return NULL;
3041 }
Fred Drake1a7aab72001-01-04 22:33:02 +00003042 if (flags & METH_VARARGS) {
3043 return (*meth)(self, arg);
3044 }
3045 if (!(flags & METH_VARARGS)) {
3046 /* the really old style */
3047 int size = PyTuple_GET_SIZE(arg);
3048 if (size == 1)
3049 arg = PyTuple_GET_ITEM(arg, 0);
3050 else if (size == 0)
3051 arg = NULL;
3052 return (*meth)(self, arg);
3053 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003054 /* should never get here ??? */
3055 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003056 return NULL;
3057}
3058
Guido van Rossumb209a111997-04-29 18:18:01 +00003059static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00003060call_instance(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003061{
Jeremy Hylton52820442001-01-03 23:52:36 +00003062 PyObject *res, *call = PyObject_GetAttrString(func, "__call__");
3063 if (call == NULL) {
3064 PyInstanceObject *inst = (PyInstanceObject*) func;
3065 PyErr_Clear();
3066 PyErr_Format(PyExc_AttributeError,
3067 "%.200s instance has no __call__ method",
3068 PyString_AsString(inst->in_class->cl_name));
Guido van Rossum681d79a1995-07-18 14:51:37 +00003069 return NULL;
3070 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003071 res = call_object(call, arg, kw);
3072 Py_DECREF(call);
3073 return res;
3074}
3075
3076static PyObject *
3077call_method(PyObject *func, PyObject *arg, PyObject *kw)
3078{
3079 PyObject *self = PyMethod_GET_SELF(func);
3080 PyObject *class = PyMethod_GET_CLASS(func);
3081 PyObject *result;
3082
3083 func = PyMethod_GET_FUNCTION(func);
3084 if (self == NULL) {
3085 /* Unbound methods must be called with an instance of
3086 the class (or a derived class) as first argument */
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00003087 int ok;
Jeremy Hylton52820442001-01-03 23:52:36 +00003088 if (PyTuple_Size(arg) >= 1)
3089 self = PyTuple_GET_ITEM(arg, 0);
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00003090 if (self == NULL)
3091 ok = 0;
3092 else {
3093 ok = PyObject_IsInstance(self, class);
3094 if (ok < 0)
3095 return NULL;
3096 }
3097 if (!ok) {
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00003098 PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00003099 "unbound method %s%s must be "
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00003100 "called with instance as first argument",
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00003101 get_func_name(func), get_func_desc(func));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003102 return NULL;
3103 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003104 Py_INCREF(arg);
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00003105 }
3106 else {
Jeremy Hylton52820442001-01-03 23:52:36 +00003107 int argcount = PyTuple_Size(arg);
3108 PyObject *newarg = PyTuple_New(argcount + 1);
3109 int i;
3110 if (newarg == NULL)
3111 return NULL;
3112 Py_INCREF(self);
3113 PyTuple_SET_ITEM(newarg, 0, self);
3114 for (i = 0; i < argcount; i++) {
3115 PyObject *v = PyTuple_GET_ITEM(arg, i);
3116 Py_XINCREF(v);
3117 PyTuple_SET_ITEM(newarg, i+1, v);
3118 }
3119 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003120 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003121 result = call_object(func, arg, kw);
3122 Py_DECREF(arg);
3123 return result;
3124}
3125
3126static PyObject *
3127call_eval_code2(PyObject *func, PyObject *arg, PyObject *kw)
3128{
3129 PyObject *result;
3130 PyObject *argdefs;
3131 PyObject **d, **k;
3132 int nk, nd;
3133
3134 argdefs = PyFunction_GET_DEFAULTS(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00003135 if (argdefs != NULL && PyTuple_Check(argdefs)) {
3136 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
3137 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003138 }
3139 else {
3140 d = NULL;
3141 nd = 0;
3142 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003143
Guido van Rossum681d79a1995-07-18 14:51:37 +00003144 if (kw != NULL) {
3145 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00003146 nk = PyDict_Size(kw);
3147 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003148 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003149 PyErr_NoMemory();
3150 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003151 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00003152 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003153 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00003154 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00003155 i += 2;
3156 nk = i/2;
3157 /* XXX This is broken if the caller deletes dict items! */
3158 }
3159 else {
3160 k = NULL;
3161 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00003162 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003163
Guido van Rossum681d79a1995-07-18 14:51:37 +00003164 result = eval_code2(
Jeremy Hylton52820442001-01-03 23:52:36 +00003165 (PyCodeObject *)PyFunction_GET_CODE(func),
3166 PyFunction_GET_GLOBALS(func), (PyObject *)NULL,
Guido van Rossumb209a111997-04-29 18:18:01 +00003167 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003168 k, nk, d, nd,
3169 PyFunction_GET_CLOSURE(func));
Guido van Rossumac7be682001-01-17 15:42:30 +00003170
Guido van Rossumb18618d2000-05-03 23:44:39 +00003171 if (k != NULL)
3172 PyMem_DEL(k);
Guido van Rossumac7be682001-01-17 15:42:30 +00003173
Guido van Rossum681d79a1995-07-18 14:51:37 +00003174 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003175}
3176
Jeremy Hylton52820442001-01-03 23:52:36 +00003177#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
3178
3179/* The two fast_xxx() functions optimize calls for which no argument
3180 tuple is necessary; the objects are passed directly from the stack.
3181 fast_cfunction() is called for METH_OLDARGS functions.
3182 fast_function() is for functions with no special argument handling.
3183*/
3184
3185static PyObject *
3186fast_cfunction(PyObject *func, PyObject ***pp_stack, int na)
3187{
3188 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3189 PyObject *self = PyCFunction_GET_SELF(func);
3190
3191 if (na == 0)
3192 return (*meth)(self, NULL);
Charles G. Waldmaneec72a72001-01-10 22:11:59 +00003193 else if (na == 1) {
3194 PyObject *arg = EXT_POP(*pp_stack);
Guido van Rossumac7be682001-01-17 15:42:30 +00003195 PyObject *result = (*meth)(self, arg);
Charles G. Waldmaneec72a72001-01-10 22:11:59 +00003196 Py_DECREF(arg);
3197 return result;
3198 } else {
Jeremy Hylton52820442001-01-03 23:52:36 +00003199 PyObject *args = load_args(pp_stack, na);
3200 PyObject *result = (*meth)(self, args);
3201 Py_DECREF(args);
3202 return result;
3203 }
3204}
3205
3206static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00003207fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00003208{
3209 PyObject *co = PyFunction_GET_CODE(func);
3210 PyObject *globals = PyFunction_GET_GLOBALS(func);
3211 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003212 PyObject *closure = PyFunction_GET_CLOSURE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003213 PyObject **d = NULL;
3214 int nd = 0;
3215
3216 if (argdefs != NULL) {
3217 d = &PyTuple_GET_ITEM(argdefs, 0);
3218 nd = ((PyTupleObject *)argdefs)->ob_size;
3219 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003220 return eval_code2((PyCodeObject *)co, globals,
Jeremy Hylton52820442001-01-03 23:52:36 +00003221 (PyObject *)NULL, (*pp_stack)-n, na,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003222 (*pp_stack)-2*nk, nk, d, nd,
3223 closure);
Jeremy Hylton52820442001-01-03 23:52:36 +00003224}
3225
3226static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00003227update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
3228 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00003229{
3230 PyObject *kwdict = NULL;
3231 if (orig_kwdict == NULL)
3232 kwdict = PyDict_New();
3233 else {
3234 kwdict = PyDict_Copy(orig_kwdict);
3235 Py_DECREF(orig_kwdict);
3236 }
3237 if (kwdict == NULL)
3238 return NULL;
3239 while (--nk >= 0) {
3240 int err;
3241 PyObject *value = EXT_POP(*pp_stack);
3242 PyObject *key = EXT_POP(*pp_stack);
3243 if (PyDict_GetItem(kwdict, key) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +00003244 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00003245 "%.200s%s got multiple values "
Jeremy Hylton512a2372001-04-11 13:52:29 +00003246 "for keyword argument '%.200s'",
3247 get_func_name(func),
3248 get_func_desc(func),
3249 PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00003250 Py_DECREF(key);
3251 Py_DECREF(value);
3252 Py_DECREF(kwdict);
3253 return NULL;
3254 }
3255 err = PyDict_SetItem(kwdict, key, value);
3256 Py_DECREF(key);
3257 Py_DECREF(value);
3258 if (err) {
3259 Py_DECREF(kwdict);
3260 return NULL;
3261 }
3262 }
3263 return kwdict;
3264}
3265
3266static PyObject *
3267update_star_args(int nstack, int nstar, PyObject *stararg,
3268 PyObject ***pp_stack)
3269{
3270 PyObject *callargs, *w;
3271
3272 callargs = PyTuple_New(nstack + nstar);
3273 if (callargs == NULL) {
3274 return NULL;
3275 }
3276 if (nstar) {
3277 int i;
3278 for (i = 0; i < nstar; i++) {
3279 PyObject *a = PyTuple_GET_ITEM(stararg, i);
3280 Py_INCREF(a);
3281 PyTuple_SET_ITEM(callargs, nstack + i, a);
3282 }
3283 }
3284 while (--nstack >= 0) {
3285 w = EXT_POP(*pp_stack);
3286 PyTuple_SET_ITEM(callargs, nstack, w);
3287 }
3288 return callargs;
3289}
3290
3291static PyObject *
3292load_args(PyObject ***pp_stack, int na)
3293{
3294 PyObject *args = PyTuple_New(na);
3295 PyObject *w;
3296
3297 if (args == NULL)
3298 return NULL;
3299 while (--na >= 0) {
3300 w = EXT_POP(*pp_stack);
3301 PyTuple_SET_ITEM(args, na, w);
3302 }
3303 return args;
3304}
3305
3306static PyObject *
3307do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
3308{
3309 PyObject *callargs = NULL;
3310 PyObject *kwdict = NULL;
3311 PyObject *result = NULL;
3312
3313 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003314 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003315 if (kwdict == NULL)
3316 goto call_fail;
3317 }
3318 callargs = load_args(pp_stack, na);
3319 if (callargs == NULL)
3320 goto call_fail;
3321 result = call_object(func, callargs, kwdict);
3322 call_fail:
3323 Py_XDECREF(callargs);
3324 Py_XDECREF(kwdict);
3325 return result;
3326}
3327
3328static PyObject *
3329ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3330{
3331 int nstar = 0;
3332 PyObject *callargs = NULL;
3333 PyObject *stararg = NULL;
3334 PyObject *kwdict = NULL;
3335 PyObject *result = NULL;
3336
3337 if (flags & CALL_FLAG_KW) {
3338 kwdict = EXT_POP(*pp_stack);
3339 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003340 PyErr_Format(PyExc_TypeError,
Jeremy Hylton512a2372001-04-11 13:52:29 +00003341 "%s%s argument after ** "
3342 "must be a dictionary",
3343 get_func_name(func),
3344 get_func_desc(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00003345 goto ext_call_fail;
3346 }
3347 }
3348 if (flags & CALL_FLAG_VAR) {
3349 stararg = EXT_POP(*pp_stack);
3350 if (!PyTuple_Check(stararg)) {
3351 PyObject *t = NULL;
3352 t = PySequence_Tuple(stararg);
3353 if (t == NULL) {
Jeremy Hylton512a2372001-04-11 13:52:29 +00003354 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
3355 PyErr_Format(PyExc_TypeError,
3356 "%s%s argument after * "
3357 "must be a sequence",
3358 get_func_name(func),
3359 get_func_desc(func));
3360 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003361 goto ext_call_fail;
3362 }
3363 Py_DECREF(stararg);
3364 stararg = t;
3365 }
3366 nstar = PyTuple_GET_SIZE(stararg);
3367 }
3368 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003369 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003370 if (kwdict == NULL)
3371 goto ext_call_fail;
3372 }
3373 callargs = update_star_args(na, nstar, stararg, pp_stack);
3374 if (callargs == NULL)
3375 goto ext_call_fail;
3376 result = call_object(func, callargs, kwdict);
3377 ext_call_fail:
3378 Py_XDECREF(callargs);
3379 Py_XDECREF(kwdict);
3380 Py_XDECREF(stararg);
3381 return result;
3382}
3383
Guido van Rossum3b9c6671996-07-30 18:40:29 +00003384#define SLICE_ERROR_MSG \
3385 "standard sequence type does not support step size other than one"
3386
Guido van Rossumb209a111997-04-29 18:18:01 +00003387static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003388loop_subscript(PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003389{
Guido van Rossumb209a111997-04-29 18:18:01 +00003390 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00003391 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003392 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003393 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003394 return NULL;
3395 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003396 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00003397 v = (*sq->sq_item)(v, i);
3398 if (v)
3399 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00003400 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00003401 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00003402 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003403}
3404
Guido van Rossum20c6add2000-05-08 14:06:50 +00003405/* Extract a slice index from a PyInt or PyLong, the index is bound to
3406 the range [-INT_MAX+1, INTMAX]. Returns 0 and an exception if there is
3407 and error. Returns 1 on success.*/
3408
3409int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003410_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003411{
3412 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003413 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003414 if (PyInt_Check(v)) {
3415 x = PyInt_AsLong(v);
3416 } else if (PyLong_Check(v)) {
3417 x = PyLong_AsLong(v);
3418 if (x==-1 && PyErr_Occurred()) {
3419 PyObject *long_zero;
Guido van Rossumac7be682001-01-17 15:42:30 +00003420 int cmp;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003421
Guido van Rossumac7be682001-01-17 15:42:30 +00003422 if (!PyErr_ExceptionMatches(
3423 PyExc_OverflowError)) {
3424 /* It's not an overflow error, so just
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003425 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00003426 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003427 }
3428
Guido van Rossumac7be682001-01-17 15:42:30 +00003429 /* Clear the OverflowError */
3430 PyErr_Clear();
3431
3432 /* It's an overflow error, so we need to
3433 check the sign of the long integer,
3434 set the value to INT_MAX or 0, and clear
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003435 the error. */
3436
3437 /* Create a long integer with a value of 0 */
Guido van Rossumac7be682001-01-17 15:42:30 +00003438 long_zero = PyLong_FromLong(0L);
Guido van Rossum20c6add2000-05-08 14:06:50 +00003439 if (long_zero == NULL) return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003440
3441 /* Check sign */
Guido van Rossumac7be682001-01-17 15:42:30 +00003442 cmp = PyObject_RichCompareBool(v, long_zero,
3443 Py_GT);
3444 Py_DECREF(long_zero);
3445 if (cmp < 0)
3446 return 0;
3447 else if (cmp > 0)
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003448 x = INT_MAX;
3449 else
3450 x = 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003451 }
3452 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003453 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003454 "slice indices must be integers");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003455 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003456 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003457 /* Truncate -- very long indices are truncated anyway */
3458 if (x > INT_MAX)
3459 x = INT_MAX;
3460 else if (x < -INT_MAX)
3461 x = 0;
3462 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003463 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003464 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003465}
3466
Guido van Rossumb209a111997-04-29 18:18:01 +00003467static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003468apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003469{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003470 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003471 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003472 return NULL;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003473 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum04691fc1992-08-12 15:35:34 +00003474 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003475 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003476}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003477
3478static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003479assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3480 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003481{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003482 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003483 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum3f5da241990-12-20 15:06:42 +00003484 return -1;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003485 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum3f5da241990-12-20 15:06:42 +00003486 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003487 if (x == NULL)
3488 return PySequence_DelSlice(u, ilow, ihigh);
3489 else
3490 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003491}
3492
Guido van Rossumb209a111997-04-29 18:18:01 +00003493static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003494cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003495{
Guido van Rossumac7be682001-01-17 15:42:30 +00003496 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003497 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00003498 case IS:
3499 case IS_NOT:
3500 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00003501 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003502 res = !res;
3503 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003504 case IN:
3505 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003506 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003507 if (res < 0)
3508 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00003509 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003510 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003511 break;
3512 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00003513 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003514 break;
3515 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003516 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003517 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003518 v = res ? Py_True : Py_False;
3519 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003520 return v;
3521}
3522
Thomas Wouters52152252000-08-17 22:55:00 +00003523static PyObject *
3524import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003525{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003526 PyObject *x;
3527
3528 x = PyObject_GetAttr(v, name);
3529 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00003530 PyErr_Format(PyExc_ImportError,
3531 "cannot import name %.230s",
3532 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003533 }
Thomas Wouters52152252000-08-17 22:55:00 +00003534 return x;
3535}
Guido van Rossumac7be682001-01-17 15:42:30 +00003536
Thomas Wouters52152252000-08-17 22:55:00 +00003537static int
3538import_all_from(PyObject *locals, PyObject *v)
3539{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003540 PyObject *all = PyObject_GetAttrString(v, "__all__");
3541 PyObject *dict, *name, *value;
3542 int skip_leading_underscores = 0;
3543 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003544
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003545 if (all == NULL) {
3546 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3547 return -1; /* Unexpected error */
3548 PyErr_Clear();
3549 dict = PyObject_GetAttrString(v, "__dict__");
3550 if (dict == NULL) {
3551 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3552 return -1;
3553 PyErr_SetString(PyExc_ImportError,
3554 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003555 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003556 }
3557 all = PyMapping_Keys(dict);
3558 Py_DECREF(dict);
3559 if (all == NULL)
3560 return -1;
3561 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003562 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003563
3564 for (pos = 0, err = 0; ; pos++) {
3565 name = PySequence_GetItem(all, pos);
3566 if (name == NULL) {
3567 if (!PyErr_ExceptionMatches(PyExc_IndexError))
3568 err = -1;
3569 else
3570 PyErr_Clear();
3571 break;
3572 }
3573 if (skip_leading_underscores &&
3574 PyString_Check(name) &&
3575 PyString_AS_STRING(name)[0] == '_')
3576 {
3577 Py_DECREF(name);
3578 continue;
3579 }
3580 value = PyObject_GetAttr(v, name);
3581 if (value == NULL)
3582 err = -1;
3583 else
3584 err = PyDict_SetItem(locals, name, value);
3585 Py_DECREF(name);
3586 Py_XDECREF(value);
3587 if (err != 0)
3588 break;
3589 }
3590 Py_DECREF(all);
3591 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003592}
3593
Guido van Rossumb209a111997-04-29 18:18:01 +00003594static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003595build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003596{
Guido van Rossumcd649651997-08-22 16:56:16 +00003597 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003598 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003599 PyErr_SetString(PyExc_SystemError,
3600 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00003601 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003602 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003603 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003604 PyErr_SetString(PyExc_SystemError,
3605 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00003606 return NULL;
3607 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003608 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003609 PyErr_SetString(PyExc_SystemError,
Guido van Rossum7a5b7962000-03-31 13:52:29 +00003610 "build_class with non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00003611 return NULL;
3612 }
Guido van Rossumcd649651997-08-22 16:56:16 +00003613 n = PyTuple_Size(bases);
3614 for (i = 0; i < n; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003615 PyObject *base = PyTuple_GET_ITEM(bases, i);
3616 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00003617 /* Call the base's *type*, if it is callable.
3618 This code is a hook for Donald Beaudry's
3619 and Jim Fulton's type extensions. In
Thomas Wouters7e474022000-07-16 12:04:32 +00003620 unextended Python it will never be triggered
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003621 since its types are not callable.
3622 Ditto: call the bases's *class*, if it has
3623 one. This makes the same thing possible
3624 without writing C code. A true meta-object
3625 protocol! */
3626 PyObject *basetype = (PyObject *)base->ob_type;
3627 PyObject *callable = NULL;
3628 if (PyCallable_Check(basetype))
3629 callable = basetype;
3630 else
3631 callable = PyObject_GetAttrString(
3632 base, "__class__");
3633 if (callable) {
3634 PyObject *args;
3635 PyObject *newclass = NULL;
3636 args = Py_BuildValue(
3637 "(OOO)", name, bases, methods);
3638 if (args != NULL) {
3639 newclass = PyEval_CallObject(
3640 callable, args);
3641 Py_DECREF(args);
3642 }
Guido van Rossum730806d1998-04-10 22:27:42 +00003643 if (callable != basetype) {
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003644 Py_DECREF(callable);
Guido van Rossum730806d1998-04-10 22:27:42 +00003645 }
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003646 return newclass;
Guido van Rossum150b2df1996-12-05 23:17:11 +00003647 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003648 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00003649 "base is not a class object");
3650 return NULL;
3651 }
3652 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003653 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00003654}
3655
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003656static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003657exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3658 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003659{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003660 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003661 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003662 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003663
Guido van Rossumb209a111997-04-29 18:18:01 +00003664 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3665 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003666 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003667 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003668 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003669 locals = PyTuple_GetItem(prog, 2);
3670 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003671 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003672 if (globals == Py_None) {
3673 globals = PyEval_GetGlobals();
3674 if (locals == Py_None) {
3675 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003676 plain = 1;
3677 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003678 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003679 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003680 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003681 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003682 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003683 !PyCode_Check(prog) &&
3684 !PyFile_Check(prog)) {
3685 PyErr_SetString(PyExc_TypeError,
Guido van Rossumac7be682001-01-17 15:42:30 +00003686 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003687 return -1;
3688 }
Fred Drake661ea262000-10-24 19:57:45 +00003689 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003690 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003691 "exec: arg 2 must be a dictionary or None");
3692 return -1;
3693 }
3694 if (!PyDict_Check(locals)) {
3695 PyErr_SetString(PyExc_TypeError,
3696 "exec: arg 3 must be a dictionary or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003697 return -1;
3698 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003699 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003700 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003701 if (PyCode_Check(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003702 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003703 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003704 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003705 FILE *fp = PyFile_AsFile(prog);
3706 char *name = PyString_AsString(PyFile_Name(prog));
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003707 if (PyEval_GetNestedScopes()) {
3708 PyCompilerFlags cf;
3709 cf.cf_nested_scopes = 1;
3710 v = PyRun_FileFlags(fp, name, Py_file_input, globals,
3711 locals, &cf);
3712 } else {
3713 v = PyRun_File(fp, name, Py_file_input, globals,
3714 locals);
3715 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003716 }
3717 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003718 char *str;
3719 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003720 return -1;
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003721 if (PyEval_GetNestedScopes()) {
3722 PyCompilerFlags cf;
3723 cf.cf_nested_scopes = 1;
3724 v = PyRun_StringFlags(str, Py_file_input, globals,
3725 locals, &cf);
3726 } else
3727 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003728 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003729 if (plain)
3730 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003731 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003732 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003733 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003734 return 0;
3735}
Guido van Rossum24c13741995-02-14 09:42:43 +00003736
Guido van Rossumac7be682001-01-17 15:42:30 +00003737static void
Paul Prescode68140d2000-08-30 20:25:01 +00003738format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3739{
3740 char *obj_str;
3741
3742 if (!obj)
3743 return;
3744
3745 obj_str = PyString_AsString(obj);
3746 if (!obj_str)
3747 return;
3748
3749 PyErr_Format(exc, format_str, obj_str);
3750}
Guido van Rossum950361c1997-01-24 13:49:28 +00003751
3752#ifdef DYNAMIC_EXECUTION_PROFILE
3753
3754PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003755getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003756{
3757 int i;
3758 PyObject *l = PyList_New(256);
3759 if (l == NULL) return NULL;
3760 for (i = 0; i < 256; i++) {
3761 PyObject *x = PyInt_FromLong(a[i]);
3762 if (x == NULL) {
3763 Py_DECREF(l);
3764 return NULL;
3765 }
3766 PyList_SetItem(l, i, x);
3767 }
3768 for (i = 0; i < 256; i++)
3769 a[i] = 0;
3770 return l;
3771}
3772
3773PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003774_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003775{
3776#ifndef DXPAIRS
3777 return getarray(dxp);
3778#else
3779 int i;
3780 PyObject *l = PyList_New(257);
3781 if (l == NULL) return NULL;
3782 for (i = 0; i < 257; i++) {
3783 PyObject *x = getarray(dxpairs[i]);
3784 if (x == NULL) {
3785 Py_DECREF(l);
3786 return NULL;
3787 }
3788 PyList_SetItem(l, i, x);
3789 }
3790 return l;
3791#endif
3792}
3793
3794#endif