blob: 132fb726a606b74f9ea729f97f06ee75ff7e5cdc [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:
Guido van Rossum681d79a1995-07-18 14:51:37 +00005 XXX speed up searching for keywords by using a dictionary
Guido van Rossum681d79a1995-07-18 14:51:37 +00006 XXX document it!
7 */
8
Guido van Rossumb209a111997-04-29 18:18:01 +00009#include "Python.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000010
Guido van Rossum10dc2e81990-11-18 17:27:39 +000011#include "compile.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000012#include "frameobject.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000013#include "eval.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000014#include "opcode.h"
Tim Peters6d6c1a32001-08-02 04:15:00 +000015#include "structmember.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000016
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 */
Tim Peters5ca576e2001-06-18 22:08:13 +000035static PyObject *eval_frame(PyFrameObject *);
Jeremy Hylton52820442001-01-03 23:52:36 +000036static PyObject *fast_function(PyObject *, PyObject ***, int, int, int);
37static PyObject *fast_cfunction(PyObject *, PyObject ***, int);
38static PyObject *do_call(PyObject *, PyObject ***, int, int);
39static PyObject *ext_do_call(PyObject *, PyObject ***, int, int, int);
Guido van Rossumac7be682001-01-17 15:42:30 +000040static PyObject *update_keyword_args(PyObject *, int, PyObject ***,PyObject *);
Ka-Ping Yee20579702001-01-15 22:14:16 +000041static PyObject *update_star_args(int, int, PyObject *, PyObject ***);
Jeremy Hylton52820442001-01-03 23:52:36 +000042static PyObject *load_args(PyObject ***, int);
43#define CALL_FLAG_VAR 1
44#define CALL_FLAG_KW 2
45
Guido van Rossum0a066c01992-03-27 17:29:15 +000046#ifdef LLTRACE
Tim Petersdbd9ba62000-07-09 03:09:57 +000047static int prtrace(PyObject *, char *);
Guido van Rossum0a066c01992-03-27 17:29:15 +000048#endif
Fred Drake5755ce62001-06-27 19:19:46 +000049static int call_trace(Py_tracefunc, PyObject *, PyFrameObject *,
50 int, PyObject *);
51static void call_exc_trace(Py_tracefunc, PyObject *, PyFrameObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000052static PyObject *loop_subscript(PyObject *, PyObject *);
53static PyObject *apply_slice(PyObject *, PyObject *, PyObject *);
54static int assign_slice(PyObject *, PyObject *,
55 PyObject *, PyObject *);
56static PyObject *cmp_outcome(int, PyObject *, PyObject *);
Thomas Wouters52152252000-08-17 22:55:00 +000057static PyObject *import_from(PyObject *, PyObject *);
58static int import_all_from(PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000059static PyObject *build_class(PyObject *, PyObject *, PyObject *);
60static int exec_statement(PyFrameObject *,
61 PyObject *, PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000062static void set_exc_info(PyThreadState *, PyObject *, PyObject *, PyObject *);
63static void reset_exc_info(PyThreadState *);
Paul Prescode68140d2000-08-30 20:25:01 +000064static void format_exc_check_arg(PyObject *, char *, PyObject *);
Guido van Rossum374a9221991-04-04 10:40:29 +000065
Paul Prescode68140d2000-08-30 20:25:01 +000066#define NAME_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000067 "name '%.200s' is not defined"
Jeremy Hylton64949cb2001-01-25 20:06:59 +000068#define GLOBAL_NAME_ERROR_MSG \
69 "global name '%.200s' is not defined"
Paul Prescode68140d2000-08-30 20:25:01 +000070#define UNBOUNDLOCAL_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000071 "local variable '%.200s' referenced before assignment"
Jeremy Hyltonc76770c2001-04-13 16:51:46 +000072#define UNBOUNDFREE_ERROR_MSG \
73 "free variable '%.200s' referenced before assignment" \
74 " in enclosing scope"
Guido van Rossum374a9221991-04-04 10:40:29 +000075
Guido van Rossum950361c1997-01-24 13:49:28 +000076/* Dynamic execution profile */
77#ifdef DYNAMIC_EXECUTION_PROFILE
78#ifdef DXPAIRS
79static long dxpairs[257][256];
80#define dxp dxpairs[256]
81#else
82static long dxp[256];
83#endif
84#endif
85
Tim Peters5ca576e2001-06-18 22:08:13 +000086staticforward PyTypeObject gentype;
87
88typedef struct {
89 PyObject_HEAD
Tim Petersd8e1c9e2001-06-26 20:58:58 +000090 /* The gi_ prefix is intended to remind of generator-iterator. */
91
92 PyFrameObject *gi_frame;
93
Tim Peterse77f2e22001-06-26 22:24:51 +000094 /* True if generator is being executed. */
95 int gi_running;
Tim Peters5ca576e2001-06-18 22:08:13 +000096} genobject;
97
98static PyObject *
99gen_new(PyFrameObject *f)
100{
101 genobject *gen = PyObject_New(genobject, &gentype);
102 if (gen == NULL) {
103 Py_DECREF(f);
104 return NULL;
105 }
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000106 gen->gi_frame = f;
107 gen->gi_running = 0;
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000108 PyObject_GC_Init(gen);
Tim Peters5ca576e2001-06-18 22:08:13 +0000109 return (PyObject *)gen;
110}
111
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000112static int
113gen_traverse(genobject *gen, visitproc visit, void *arg)
114{
115 return visit((PyObject *)gen->gi_frame, arg);
116}
117
Tim Peters5ca576e2001-06-18 22:08:13 +0000118static void
119gen_dealloc(genobject *gen)
120{
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000121 PyObject_GC_Fini(gen);
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000122 Py_DECREF(gen->gi_frame);
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000123 PyObject_Del(gen);
Tim Peters5ca576e2001-06-18 22:08:13 +0000124}
125
126static PyObject *
127gen_iternext(genobject *gen)
128{
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000129 PyThreadState *tstate = PyThreadState_GET();
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000130 PyFrameObject *f = gen->gi_frame;
Tim Peters5ca576e2001-06-18 22:08:13 +0000131 PyObject *result;
132
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000133 if (gen->gi_running) {
Tim Peters5ca576e2001-06-18 22:08:13 +0000134 PyErr_SetString(PyExc_ValueError,
135 "generator already executing");
136 return NULL;
137 }
Tim Peters8c963692001-06-23 05:26:56 +0000138 if (f->f_stacktop == NULL)
Tim Peters5ca576e2001-06-18 22:08:13 +0000139 return NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000140
141 /* Generators always return to their most recent caller, not
142 * necessarily their creator. */
Tim Peters5eb4b872001-06-23 05:47:56 +0000143 Py_XINCREF(tstate->frame);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000144 assert(f->f_back == NULL);
145 f->f_back = tstate->frame;
146
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000147 gen->gi_running = 1;
Tim Peters5ca576e2001-06-18 22:08:13 +0000148 result = eval_frame(f);
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000149 gen->gi_running = 0;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000150
151 /* Don't keep the reference to f_back any longer than necessary. It
152 * may keep a chain of frames alive or it could create a reference
153 * cycle. */
Tim Peters5eb4b872001-06-23 05:47:56 +0000154 Py_XDECREF(f->f_back);
Tim Peters6302ec62001-06-20 06:57:32 +0000155 f->f_back = NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000156
Tim Petersad1a18b2001-06-23 06:19:16 +0000157 /* If the generator just returned (as opposed to yielding), signal
158 * that the generator is exhausted. */
159 if (result == Py_None && f->f_stacktop == NULL) {
160 Py_DECREF(result);
161 result = NULL;
162 }
163
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000164 return result;
Tim Peters5ca576e2001-06-18 22:08:13 +0000165}
166
167static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000168gen_next(genobject *gen)
Tim Peters5ca576e2001-06-18 22:08:13 +0000169{
170 PyObject *result;
171
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000172 result = gen_iternext(gen);
Tim Peters5ca576e2001-06-18 22:08:13 +0000173
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000174 if (result == NULL && !PyErr_Occurred()) {
Tim Peters5ca576e2001-06-18 22:08:13 +0000175 PyErr_SetObject(PyExc_StopIteration, Py_None);
176 return NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000177 }
Tim Peters5ca576e2001-06-18 22:08:13 +0000178
179 return result;
180}
181
182static PyObject *
183gen_getiter(PyObject *gen)
184{
185 Py_INCREF(gen);
186 return gen;
187}
188
189static struct PyMethodDef gen_methods[] = {
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000190 {"next", (PyCFunction)gen_next, METH_NOARGS,
Tim Peterse77f2e22001-06-26 22:24:51 +0000191 "next() -- get the next value, or raise StopIteration"},
Tim Peters5ca576e2001-06-18 22:08:13 +0000192 {NULL, NULL} /* Sentinel */
193};
194
Guido van Rossum6f799372001-09-20 20:46:19 +0000195static PyMemberDef gen_memberlist[] = {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000196 {"gi_frame", T_OBJECT, offsetof(genobject, gi_frame), RO},
197 {"gi_running", T_INT, offsetof(genobject, gi_running), RO},
198 {NULL} /* Sentinel */
199};
Tim Peters5ca576e2001-06-18 22:08:13 +0000200
201statichere PyTypeObject gentype = {
202 PyObject_HEAD_INIT(&PyType_Type)
203 0, /* ob_size */
204 "generator", /* tp_name */
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000205 sizeof(genobject) + PyGC_HEAD_SIZE, /* tp_basicsize */
Tim Peters5ca576e2001-06-18 22:08:13 +0000206 0, /* tp_itemsize */
207 /* methods */
208 (destructor)gen_dealloc, /* tp_dealloc */
209 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000210 0, /* tp_getattr */
Tim Peters5ca576e2001-06-18 22:08:13 +0000211 0, /* tp_setattr */
212 0, /* tp_compare */
213 0, /* tp_repr */
214 0, /* tp_as_number */
215 0, /* tp_as_sequence */
216 0, /* tp_as_mapping */
217 0, /* tp_hash */
218 0, /* tp_call */
219 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000220 PyObject_GenericGetAttr, /* tp_getattro */
Tim Peters5ca576e2001-06-18 22:08:13 +0000221 0, /* tp_setattro */
222 0, /* tp_as_buffer */
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000223 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /* tp_flags */
Tim Peters5ca576e2001-06-18 22:08:13 +0000224 0, /* tp_doc */
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000225 (traverseproc)gen_traverse, /* tp_traverse */
Tim Peters5ca576e2001-06-18 22:08:13 +0000226 0, /* tp_clear */
227 0, /* tp_richcompare */
228 0, /* tp_weaklistoffset */
229 (getiterfunc)gen_getiter, /* tp_iter */
230 (iternextfunc)gen_iternext, /* tp_iternext */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000231 gen_methods, /* tp_methods */
232 gen_memberlist, /* tp_members */
233 0, /* tp_getset */
234 0, /* tp_base */
235 0, /* tp_dict */
Tim Peters5ca576e2001-06-18 22:08:13 +0000236};
237
238
Guido van Rossume59214e1994-08-30 08:01:59 +0000239#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000240
Guido van Rossum2571cc81999-04-07 16:07:23 +0000241#ifndef DONT_HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000242#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +0000243#endif
Guido van Rossum49b56061998-10-01 20:42:43 +0000244#include "pythread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000245
Guido van Rossuma027efa1997-05-05 20:56:21 +0000246extern int _PyThread_Started; /* Flag for Py_Exit */
247
Guido van Rossum65d5b571998-12-21 19:32:43 +0000248static PyThread_type_lock interpreter_lock = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000249static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000250
251void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000252PyEval_InitThreads(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000253{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000254 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000255 return;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000256 _PyThread_Started = 1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000257 interpreter_lock = PyThread_allocate_lock();
258 PyThread_acquire_lock(interpreter_lock, 1);
259 main_thread = PyThread_get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000260}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000261
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000262void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000263PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000264{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000265 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000266}
267
268void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000269PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000270{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000271 PyThread_release_lock(interpreter_lock);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000272}
273
274void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000275PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000276{
277 if (tstate == NULL)
278 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000279 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000280 if (PyThreadState_Swap(tstate) != NULL)
281 Py_FatalError(
282 "PyEval_AcquireThread: non-NULL old thread state");
283}
284
285void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000286PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000287{
288 if (tstate == NULL)
289 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
290 if (PyThreadState_Swap(NULL) != tstate)
291 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000292 PyThread_release_lock(interpreter_lock);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000293}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000294
295/* This function is called from PyOS_AfterFork to ensure that newly
296 created child processes don't hold locks referring to threads which
297 are not running in the child process. (This could also be done using
298 pthread_atfork mechanism, at least for the pthreads implementation.) */
299
300void
301PyEval_ReInitThreads(void)
302{
303 if (!interpreter_lock)
304 return;
305 /*XXX Can't use PyThread_free_lock here because it does too
306 much error-checking. Doing this cleanly would require
307 adding a new function to each thread_*.h. Instead, just
308 create a new lock and waste a little bit of memory */
309 interpreter_lock = PyThread_allocate_lock();
310 PyThread_acquire_lock(interpreter_lock, 1);
311 main_thread = PyThread_get_thread_ident();
312}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000313#endif
314
Guido van Rossumff4949e1992-08-05 19:58:53 +0000315/* Functions save_thread and restore_thread are always defined so
316 dynamically loaded modules needn't be compiled separately for use
317 with and without threads: */
318
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000319PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000320PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000321{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000322 PyThreadState *tstate = PyThreadState_Swap(NULL);
323 if (tstate == NULL)
324 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000325#ifdef WITH_THREAD
Guido van Rossumb74eca91997-09-30 22:03:16 +0000326 if (interpreter_lock)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000327 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000328#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000329 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000330}
331
332void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000333PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000334{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000335 if (tstate == NULL)
336 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000337#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000338 if (interpreter_lock) {
Guido van Rossumb74eca91997-09-30 22:03:16 +0000339 int err = errno;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000340 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000341 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000342 }
343#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000344 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000345}
346
347
Guido van Rossuma9672091994-09-14 13:31:22 +0000348/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
349 signal handlers or Mac I/O completion routines) can schedule calls
350 to a function to be called synchronously.
351 The synchronous function is called with one void* argument.
352 It should return 0 for success or -1 for failure -- failure should
353 be accompanied by an exception.
354
355 If registry succeeds, the registry function returns 0; if it fails
356 (e.g. due to too many pending calls) it returns -1 (without setting
357 an exception condition).
358
359 Note that because registry may occur from within signal handlers,
360 or other asynchronous events, calling malloc() is unsafe!
361
362#ifdef WITH_THREAD
363 Any thread can schedule pending calls, but only the main thread
364 will execute them.
365#endif
366
367 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
368 There are two possible race conditions:
369 (1) nested asynchronous registry calls;
370 (2) registry calls made while pending calls are being processed.
371 While (1) is very unlikely, (2) is a real possibility.
372 The current code is safe against (2), but not against (1).
373 The safety against (2) is derived from the fact that only one
374 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000375
Guido van Rossuma027efa1997-05-05 20:56:21 +0000376 XXX Darn! With the advent of thread state, we should have an array
377 of pending calls per thread in the thread state! Later...
378*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000379
Guido van Rossuma9672091994-09-14 13:31:22 +0000380#define NPENDINGCALLS 32
381static struct {
Thomas Wouters334fb892000-07-25 12:56:38 +0000382 int (*func)(void *);
383 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000384} pendingcalls[NPENDINGCALLS];
385static volatile int pendingfirst = 0;
386static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000387static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000388
389int
Thomas Wouters334fb892000-07-25 12:56:38 +0000390Py_AddPendingCall(int (*func)(void *), void *arg)
Guido van Rossuma9672091994-09-14 13:31:22 +0000391{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000392 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000393 int i, j;
394 /* XXX Begin critical section */
395 /* XXX If you want this to be safe against nested
396 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000397 if (busy)
398 return -1;
399 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000400 i = pendinglast;
401 j = (i + 1) % NPENDINGCALLS;
402 if (j == pendingfirst)
403 return -1; /* Queue full */
404 pendingcalls[i].func = func;
405 pendingcalls[i].arg = arg;
406 pendinglast = j;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000407 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000408 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000409 /* XXX End critical section */
410 return 0;
411}
412
Guido van Rossum180d7b41994-09-29 09:45:57 +0000413int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000414Py_MakePendingCalls(void)
Guido van Rossuma9672091994-09-14 13:31:22 +0000415{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000416 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000417#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000418 if (main_thread && PyThread_get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000419 return 0;
420#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000421 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000422 return 0;
423 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000424 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000425 for (;;) {
426 int i;
Thomas Wouters334fb892000-07-25 12:56:38 +0000427 int (*func)(void *);
428 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000429 i = pendingfirst;
430 if (i == pendinglast)
431 break; /* Queue empty */
432 func = pendingcalls[i].func;
433 arg = pendingcalls[i].arg;
434 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000435 if (func(arg) < 0) {
436 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000437 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000438 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000439 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000440 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000441 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000442 return 0;
443}
444
445
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000446/* The interpreter's recursion limit */
447
Guido van Rossum349ff6f2000-09-01 01:52:08 +0000448static int recursion_limit = 1000;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000449
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000450int
451Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000452{
453 return recursion_limit;
454}
455
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000456void
457Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000458{
459 recursion_limit = new_limit;
460}
461
Guido van Rossum374a9221991-04-04 10:40:29 +0000462/* Status code for main loop (reason for stack unwind) */
463
464enum why_code {
465 WHY_NOT, /* No error */
466 WHY_EXCEPTION, /* Exception occurred */
467 WHY_RERAISE, /* Exception re-raised by 'finally' */
468 WHY_RETURN, /* 'return' statement */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +0000469 WHY_BREAK, /* 'break' statement */
Tim Peters5ca576e2001-06-18 22:08:13 +0000470 WHY_CONTINUE, /* 'continue' statement */
471 WHY_YIELD, /* 'yield' operator */
Guido van Rossum374a9221991-04-04 10:40:29 +0000472};
473
Tim Petersdbd9ba62000-07-09 03:09:57 +0000474static enum why_code do_raise(PyObject *, PyObject *, PyObject *);
Tim Petersd6d010b2001-06-21 02:49:55 +0000475static int unpack_iterable(PyObject *, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000476
Guido van Rossum374a9221991-04-04 10:40:29 +0000477
Guido van Rossumb209a111997-04-29 18:18:01 +0000478PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000479PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000480{
Tim Peters6d6c1a32001-08-02 04:15:00 +0000481 return PyEval_EvalCodeEx(co,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000482 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000483 (PyObject **)NULL, 0,
484 (PyObject **)NULL, 0,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000485 (PyObject **)NULL, 0,
486 NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000487}
488
489
490/* Interpreter main loop */
491
Tim Peters6d6c1a32001-08-02 04:15:00 +0000492static PyObject *
Tim Peters5ca576e2001-06-18 22:08:13 +0000493eval_frame(PyFrameObject *f)
Guido van Rossum374a9221991-04-04 10:40:29 +0000494{
Guido van Rossum950361c1997-01-24 13:49:28 +0000495#ifdef DXPAIRS
496 int lastopcode = 0;
497#endif
Jeremy Hylton52820442001-01-03 23:52:36 +0000498 PyObject **stack_pointer;
Guido van Rossum374a9221991-04-04 10:40:29 +0000499 register unsigned char *next_instr;
Moshe Zadkaaa39a7e2000-08-07 06:34:45 +0000500 register int opcode=0; /* Current opcode */
501 register int oparg=0; /* Current opcode argument, if any */
Guido van Rossum374a9221991-04-04 10:40:29 +0000502 register enum why_code why; /* Reason for block stack unwind */
503 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000504 register PyObject *x; /* Result object -- NULL if error */
505 register PyObject *v; /* Temporary objects popped off stack */
506 register PyObject *w;
507 register PyObject *u;
508 register PyObject *t;
Barry Warsaw23c9ec82000-08-21 15:44:01 +0000509 register PyObject *stream = NULL; /* for PRINT opcodes */
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000510 register PyObject **fastlocals, **freevars;
Guido van Rossum014518f1998-11-23 21:09:51 +0000511 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000512 PyThreadState *tstate = PyThreadState_GET();
Tim Peters5ca576e2001-06-18 22:08:13 +0000513 PyCodeObject *co;
Guido van Rossumd076c731998-10-07 19:42:25 +0000514 unsigned char *first_instr;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000515#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000516 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000517#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000518#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000519 /* Make it easier to find out where we are with a debugger */
Tim Peters5ca576e2001-06-18 22:08:13 +0000520 char *filename;
Guido van Rossum99bec951992-09-03 20:29:45 +0000521#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000522
523/* Code access macros */
524
525#define GETCONST(i) Getconst(f, i)
526#define GETNAME(i) Getname(f, i)
527#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumd076c731998-10-07 19:42:25 +0000528#define INSTR_OFFSET() (next_instr - first_instr)
Guido van Rossum374a9221991-04-04 10:40:29 +0000529#define NEXTOP() (*next_instr++)
530#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossumd076c731998-10-07 19:42:25 +0000531#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000532#define JUMPBY(x) (next_instr += (x))
533
534/* Stack manipulation macros */
535
536#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
537#define EMPTY() (STACK_LEVEL() == 0)
538#define TOP() (stack_pointer[-1])
539#define BASIC_PUSH(v) (*stack_pointer++ = (v))
540#define BASIC_POP() (*--stack_pointer)
541
Guido van Rossum96a42c81992-01-12 02:29:51 +0000542#ifdef LLTRACE
543#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
544#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000545#else
546#define PUSH(v) BASIC_PUSH(v)
547#define POP() BASIC_POP()
548#endif
549
Guido van Rossum46add982001-08-30 16:06:23 +0000550/* Strict int check macros */
551#define ISSTRICTINT(v) ((v)->ob_type == &PyInt_Type)
552
Guido van Rossum681d79a1995-07-18 14:51:37 +0000553/* Local variable macros */
554
555#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumb209a111997-04-29 18:18:01 +0000556#define SETLOCAL(i, value) do { Py_XDECREF(GETLOCAL(i)); \
Guido van Rossum681d79a1995-07-18 14:51:37 +0000557 GETLOCAL(i) = value; } while (0)
558
Guido van Rossuma027efa1997-05-05 20:56:21 +0000559/* Start of code */
560
Tim Peters5ca576e2001-06-18 22:08:13 +0000561 if (f == NULL)
562 return NULL;
563
Guido van Rossum8861b741996-07-30 16:49:37 +0000564#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000565 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000566 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000567 return NULL;
568 }
569#endif
570
Tim Peters5ca576e2001-06-18 22:08:13 +0000571 /* push frame */
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000572 if (++tstate->recursion_depth > recursion_limit) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000573 --tstate->recursion_depth;
574 PyErr_SetString(PyExc_RuntimeError,
Fred Drake661ea262000-10-24 19:57:45 +0000575 "maximum recursion depth exceeded");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000576 tstate->frame = f->f_back;
Guido van Rossum8861b741996-07-30 16:49:37 +0000577 return NULL;
578 }
579
Tim Peters5ca576e2001-06-18 22:08:13 +0000580 tstate->frame = f;
Tim Peters5ca576e2001-06-18 22:08:13 +0000581 co = f->f_code;
582 fastlocals = f->f_localsplus;
583 freevars = f->f_localsplus + f->f_nlocals;
Guido van Rossumd076c731998-10-07 19:42:25 +0000584 _PyCode_GETCODEPTR(co, &first_instr);
Tim Peters5ca576e2001-06-18 22:08:13 +0000585 next_instr = first_instr + f->f_lasti;
Tim Peters8c963692001-06-23 05:26:56 +0000586 stack_pointer = f->f_stacktop;
587 assert(stack_pointer != NULL);
588 f->f_stacktop = NULL;
Tim Peters5ca576e2001-06-18 22:08:13 +0000589
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000590 if (tstate->use_tracing) {
591 if (tstate->c_tracefunc != NULL) {
592 /* tstate->c_tracefunc, if defined, is a
593 function that will be called on *every* entry
594 to a code block. Its return value, if not
595 None, is a function that will be called at
596 the start of each executed line of code.
597 (Actually, the function must return itself
598 in order to continue tracing.) The trace
599 functions are called with three arguments:
600 a pointer to the current frame, a string
601 indicating why the function is called, and
602 an argument which depends on the situation.
603 The global trace function is also called
604 whenever an exception is detected. */
605 if (call_trace(tstate->c_tracefunc, tstate->c_traceobj,
606 f, PyTrace_CALL, Py_None)) {
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000607 /* Trace function raised an error */
608 return NULL;
609 }
610 }
611 if (tstate->c_profilefunc != NULL) {
612 /* Similar for c_profilefunc, except it needn't
613 return itself and isn't called for "line" events */
614 if (call_trace(tstate->c_profilefunc,
615 tstate->c_profileobj,
616 f, PyTrace_CALL, Py_None)) {
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000617 /* Profile function raised an error */
618 return NULL;
619 }
620 }
621 }
622
Tim Peters5ca576e2001-06-18 22:08:13 +0000623#ifdef LLTRACE
624 lltrace = PyDict_GetItemString(f->f_globals,"__lltrace__") != NULL;
625#endif
626#if defined(Py_DEBUG) || defined(LLTRACE)
627 filename = PyString_AsString(co->co_filename);
628#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000629
Guido van Rossum374a9221991-04-04 10:40:29 +0000630 why = WHY_NOT;
631 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000632 x = Py_None; /* Not a reference, just anything non-NULL */
Fred Drake48fba732000-10-11 13:54:07 +0000633 w = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +0000634
Guido van Rossum374a9221991-04-04 10:40:29 +0000635 for (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000636 /* Do periodic things. Doing this every time through
637 the loop would add too much overhead, so we do it
638 only every Nth instruction. We also do it if
639 ``things_to_do'' is set, i.e. when an asynchronous
640 event needs attention (e.g. a signal handler or
641 async I/O handler); see Py_AddPendingCall() and
642 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +0000643
Guido van Rossuma027efa1997-05-05 20:56:21 +0000644 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000645 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000646 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000647 if (Py_MakePendingCalls() < 0) {
648 why = WHY_EXCEPTION;
649 goto on_error;
650 }
651 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000652#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000653 /* If we have true signals, the signal handler
654 will call Py_AddPendingCall() so we don't
655 have to call sigcheck(). On the Mac and
656 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000657 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000658 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000659 goto on_error;
660 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000661#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000662
Guido van Rossume59214e1994-08-30 08:01:59 +0000663#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000664 if (interpreter_lock) {
665 /* Give another thread a chance */
666
Guido van Rossum25ce5661997-08-02 03:10:38 +0000667 if (PyThreadState_Swap(NULL) != tstate)
668 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000669 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000670
671 /* Other threads may run now */
672
Guido van Rossum65d5b571998-12-21 19:32:43 +0000673 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000674 if (PyThreadState_Swap(tstate) != NULL)
675 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000676 }
677#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000678 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000679
Guido van Rossum374a9221991-04-04 10:40:29 +0000680 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000681
Guido van Rossum408027e1996-12-30 16:17:54 +0000682#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000683 f->f_lasti = INSTR_OFFSET();
684#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000685
Guido van Rossum374a9221991-04-04 10:40:29 +0000686 opcode = NEXTOP();
687 if (HAS_ARG(opcode))
688 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000689 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000690#ifdef DYNAMIC_EXECUTION_PROFILE
691#ifdef DXPAIRS
692 dxpairs[lastopcode][opcode]++;
693 lastopcode = opcode;
694#endif
695 dxp[opcode]++;
696#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000697
Guido van Rossum96a42c81992-01-12 02:29:51 +0000698#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000699 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +0000700
Guido van Rossum96a42c81992-01-12 02:29:51 +0000701 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000702 if (HAS_ARG(opcode)) {
703 printf("%d: %d, %d\n",
704 (int) (INSTR_OFFSET() - 3),
705 opcode, oparg);
706 }
707 else {
708 printf("%d: %d\n",
709 (int) (INSTR_OFFSET() - 1), opcode);
710 }
711 }
712#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000713 /* Main switch on opcode */
Jeremy Hylton52820442001-01-03 23:52:36 +0000714
Guido van Rossum374a9221991-04-04 10:40:29 +0000715 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000716
Guido van Rossum374a9221991-04-04 10:40:29 +0000717 /* BEWARE!
718 It is essential that any operation that fails sets either
719 x to NULL, err to nonzero, or why to anything but WHY_NOT,
720 and that no operation that succeeds does this! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000721
Guido van Rossum374a9221991-04-04 10:40:29 +0000722 /* case STOP_CODE: this is an error! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000723
Guido van Rossum374a9221991-04-04 10:40:29 +0000724 case POP_TOP:
725 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000726 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000727 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000728
Guido van Rossum374a9221991-04-04 10:40:29 +0000729 case ROT_TWO:
730 v = POP();
731 w = POP();
732 PUSH(v);
733 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000734 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000735
Guido van Rossum374a9221991-04-04 10:40:29 +0000736 case ROT_THREE:
737 v = POP();
738 w = POP();
739 x = POP();
740 PUSH(v);
741 PUSH(x);
742 PUSH(w);
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 ROT_FOUR:
746 u = POP();
747 v = POP();
748 w = POP();
749 x = POP();
750 PUSH(u);
751 PUSH(x);
752 PUSH(w);
753 PUSH(v);
754 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000755
Guido van Rossum374a9221991-04-04 10:40:29 +0000756 case DUP_TOP:
757 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000758 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000759 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000760 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000761
Thomas Wouters434d0822000-08-24 20:11:32 +0000762 case DUP_TOPX:
763 switch (oparg) {
Thomas Wouters434d0822000-08-24 20:11:32 +0000764 case 1:
Tim Peters35ba6892000-10-11 07:04:49 +0000765 x = TOP();
766 Py_INCREF(x);
767 PUSH(x);
768 continue;
769 case 2:
Thomas Wouters434d0822000-08-24 20:11:32 +0000770 x = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000771 Py_INCREF(x);
772 w = TOP();
773 Py_INCREF(w);
774 PUSH(x);
775 PUSH(w);
776 PUSH(x);
777 continue;
778 case 3:
779 x = POP();
780 Py_INCREF(x);
Thomas Wouters434d0822000-08-24 20:11:32 +0000781 w = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000782 Py_INCREF(w);
783 v = TOP();
784 Py_INCREF(v);
785 PUSH(w);
786 PUSH(x);
787 PUSH(v);
788 PUSH(w);
789 PUSH(x);
790 continue;
791 case 4:
792 x = POP();
793 Py_INCREF(x);
794 w = POP();
795 Py_INCREF(w);
Thomas Wouters434d0822000-08-24 20:11:32 +0000796 v = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000797 Py_INCREF(v);
798 u = TOP();
799 Py_INCREF(u);
800 PUSH(v);
801 PUSH(w);
802 PUSH(x);
803 PUSH(u);
804 PUSH(v);
805 PUSH(w);
806 PUSH(x);
807 continue;
808 case 5:
809 x = POP();
810 Py_INCREF(x);
811 w = POP();
812 Py_INCREF(w);
813 v = POP();
814 Py_INCREF(v);
Thomas Wouters434d0822000-08-24 20:11:32 +0000815 u = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000816 Py_INCREF(u);
817 t = TOP();
818 Py_INCREF(t);
819 PUSH(u);
820 PUSH(v);
821 PUSH(w);
822 PUSH(x);
823 PUSH(t);
824 PUSH(u);
825 PUSH(v);
826 PUSH(w);
827 PUSH(x);
828 continue;
Thomas Wouters434d0822000-08-24 20:11:32 +0000829 default:
Thomas Wouters0be483f2000-10-11 23:26:11 +0000830 Py_FatalError("invalid argument to DUP_TOPX"
831 " (bytecode corruption?)");
Thomas Wouters434d0822000-08-24 20:11:32 +0000832 }
Tim Peters35ba6892000-10-11 07:04:49 +0000833 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000834
Guido van Rossum374a9221991-04-04 10:40:29 +0000835 case UNARY_POSITIVE:
836 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000837 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000838 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000839 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000840 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000841 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000842
Guido van Rossum374a9221991-04-04 10:40:29 +0000843 case UNARY_NEGATIVE:
844 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000845 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000846 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000847 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000848 if (x != NULL) continue;
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_NOT:
852 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000853 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000854 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000855 if (err == 0) {
856 Py_INCREF(Py_True);
857 PUSH(Py_True);
858 continue;
859 }
860 else if (err > 0) {
861 Py_INCREF(Py_False);
862 PUSH(Py_False);
863 err = 0;
864 continue;
865 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000866 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000867
Guido van Rossum374a9221991-04-04 10:40:29 +0000868 case UNARY_CONVERT:
869 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000870 x = PyObject_Repr(v);
871 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000872 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000873 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000874 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000875
Guido van Rossum7928cd71991-10-24 14:59:31 +0000876 case UNARY_INVERT:
877 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000878 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000879 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000880 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000881 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000882 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000883
Guido van Rossum50564e81996-01-12 01:13:16 +0000884 case BINARY_POWER:
885 w = POP();
886 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000887 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000888 Py_DECREF(v);
889 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000890 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000891 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000892 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000893
Guido van Rossum374a9221991-04-04 10:40:29 +0000894 case BINARY_MULTIPLY:
895 w = POP();
896 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000897 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000898 Py_DECREF(v);
899 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000900 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000901 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000902 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000903
Guido van Rossum374a9221991-04-04 10:40:29 +0000904 case BINARY_DIVIDE:
905 w = POP();
906 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000907 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000908 Py_DECREF(v);
909 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000910 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000911 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000912 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000913
Guido van Rossum4668b002001-08-08 05:00:18 +0000914 case BINARY_FLOOR_DIVIDE:
915 w = POP();
916 v = POP();
917 x = PyNumber_FloorDivide(v, w);
918 Py_DECREF(v);
919 Py_DECREF(w);
920 PUSH(x);
921 if (x != NULL) continue;
922 break;
923
924 case BINARY_TRUE_DIVIDE:
925 w = POP();
926 v = POP();
927 x = PyNumber_TrueDivide(v, w);
928 Py_DECREF(v);
929 Py_DECREF(w);
930 PUSH(x);
931 if (x != NULL) continue;
932 break;
933
Guido van Rossum374a9221991-04-04 10:40:29 +0000934 case BINARY_MODULO:
935 w = POP();
936 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000937 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000938 Py_DECREF(v);
939 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000940 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000941 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000942 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000943
Guido van Rossum374a9221991-04-04 10:40:29 +0000944 case BINARY_ADD:
945 w = POP();
946 v = POP();
Guido van Rossum46add982001-08-30 16:06:23 +0000947 if (ISSTRICTINT(v) && ISSTRICTINT(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000948 /* INLINE: int + int */
949 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000950 a = PyInt_AS_LONG(v);
951 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000952 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +0000953 if ((i^a) < 0 && (i^b) < 0)
954 goto slow_add;
955 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000956 }
Guido van Rossum87780df2001-08-23 02:58:07 +0000957 else {
958 slow_add:
Guido van Rossumc12da691997-07-17 23:12:42 +0000959 x = PyNumber_Add(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +0000960 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000961 Py_DECREF(v);
962 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000963 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000964 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000965 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000966
Guido van Rossum374a9221991-04-04 10:40:29 +0000967 case BINARY_SUBTRACT:
968 w = POP();
969 v = POP();
Guido van Rossum46add982001-08-30 16:06:23 +0000970 if (ISSTRICTINT(v) && ISSTRICTINT(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000971 /* INLINE: int - int */
972 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000973 a = PyInt_AS_LONG(v);
974 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000975 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +0000976 if ((i^a) < 0 && (i^~b) < 0)
977 goto slow_sub;
978 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000979 }
Guido van Rossum87780df2001-08-23 02:58:07 +0000980 else {
981 slow_sub:
Guido van Rossumc12da691997-07-17 23:12:42 +0000982 x = PyNumber_Subtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +0000983 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000984 Py_DECREF(v);
985 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000986 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000987 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000988 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000989
Guido van Rossum374a9221991-04-04 10:40:29 +0000990 case BINARY_SUBSCR:
991 w = POP();
992 v = POP();
Guido van Rossum46add982001-08-30 16:06:23 +0000993 if (v->ob_type == &PyList_Type && ISSTRICTINT(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000994 /* INLINE: list[int] */
995 long i = PyInt_AsLong(w);
996 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +0000997 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +0000998 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +0000999 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001000 PyErr_SetString(PyExc_IndexError,
1001 "list index out of range");
1002 x = NULL;
1003 }
1004 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +00001005 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001006 Py_INCREF(x);
1007 }
1008 }
1009 else
1010 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001011 Py_DECREF(v);
1012 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001013 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001014 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001015 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001016
Guido van Rossum7928cd71991-10-24 14:59:31 +00001017 case BINARY_LSHIFT:
1018 w = POP();
1019 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001020 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001021 Py_DECREF(v);
1022 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001023 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001024 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001025 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001026
Guido van Rossum7928cd71991-10-24 14:59:31 +00001027 case BINARY_RSHIFT:
1028 w = POP();
1029 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001030 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001031 Py_DECREF(v);
1032 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001033 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001034 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001035 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001036
Guido van Rossum7928cd71991-10-24 14:59:31 +00001037 case BINARY_AND:
1038 w = POP();
1039 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001040 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001041 Py_DECREF(v);
1042 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001043 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001044 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001045 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001046
Guido van Rossum7928cd71991-10-24 14:59:31 +00001047 case BINARY_XOR:
1048 w = POP();
1049 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001050 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001051 Py_DECREF(v);
1052 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001053 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001054 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001055 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001056
Guido van Rossum7928cd71991-10-24 14:59:31 +00001057 case BINARY_OR:
1058 w = POP();
1059 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001060 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001061 Py_DECREF(v);
1062 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001063 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001064 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001065 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001066
1067 case INPLACE_POWER:
1068 w = POP();
1069 v = POP();
1070 x = PyNumber_InPlacePower(v, w, Py_None);
1071 Py_DECREF(v);
1072 Py_DECREF(w);
1073 PUSH(x);
1074 if (x != NULL) continue;
1075 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001076
Thomas Wouters434d0822000-08-24 20:11:32 +00001077 case INPLACE_MULTIPLY:
1078 w = POP();
1079 v = POP();
1080 x = PyNumber_InPlaceMultiply(v, w);
1081 Py_DECREF(v);
1082 Py_DECREF(w);
1083 PUSH(x);
1084 if (x != NULL) continue;
1085 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001086
Thomas Wouters434d0822000-08-24 20:11:32 +00001087 case INPLACE_DIVIDE:
1088 w = POP();
1089 v = POP();
1090 x = PyNumber_InPlaceDivide(v, w);
1091 Py_DECREF(v);
1092 Py_DECREF(w);
1093 PUSH(x);
1094 if (x != NULL) continue;
1095 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001096
Guido van Rossum4668b002001-08-08 05:00:18 +00001097 case INPLACE_FLOOR_DIVIDE:
1098 w = POP();
1099 v = POP();
1100 x = PyNumber_InPlaceFloorDivide(v, w);
1101 Py_DECREF(v);
1102 Py_DECREF(w);
1103 PUSH(x);
1104 if (x != NULL) continue;
1105 break;
1106
1107 case INPLACE_TRUE_DIVIDE:
1108 w = POP();
1109 v = POP();
1110 x = PyNumber_InPlaceTrueDivide(v, w);
1111 Py_DECREF(v);
1112 Py_DECREF(w);
1113 PUSH(x);
1114 if (x != NULL) continue;
1115 break;
1116
Thomas Wouters434d0822000-08-24 20:11:32 +00001117 case INPLACE_MODULO:
1118 w = POP();
1119 v = POP();
1120 x = PyNumber_InPlaceRemainder(v, w);
1121 Py_DECREF(v);
1122 Py_DECREF(w);
1123 PUSH(x);
1124 if (x != NULL) continue;
1125 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001126
Thomas Wouters434d0822000-08-24 20:11:32 +00001127 case INPLACE_ADD:
1128 w = POP();
1129 v = POP();
Guido van Rossum46add982001-08-30 16:06:23 +00001130 if (ISSTRICTINT(v) && ISSTRICTINT(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001131 /* INLINE: int + int */
1132 register long a, b, i;
1133 a = PyInt_AS_LONG(v);
1134 b = PyInt_AS_LONG(w);
1135 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001136 if ((i^a) < 0 && (i^b) < 0)
1137 goto slow_iadd;
1138 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001139 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001140 else {
1141 slow_iadd:
Thomas Wouters434d0822000-08-24 20:11:32 +00001142 x = PyNumber_InPlaceAdd(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001143 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001144 Py_DECREF(v);
1145 Py_DECREF(w);
1146 PUSH(x);
1147 if (x != NULL) continue;
1148 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001149
Thomas Wouters434d0822000-08-24 20:11:32 +00001150 case INPLACE_SUBTRACT:
1151 w = POP();
1152 v = POP();
Guido van Rossum46add982001-08-30 16:06:23 +00001153 if (ISSTRICTINT(v) && ISSTRICTINT(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001154 /* INLINE: int - int */
1155 register long a, b, i;
1156 a = PyInt_AS_LONG(v);
1157 b = PyInt_AS_LONG(w);
1158 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001159 if ((i^a) < 0 && (i^~b) < 0)
1160 goto slow_isub;
1161 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001162 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001163 else {
1164 slow_isub:
Thomas Wouters434d0822000-08-24 20:11:32 +00001165 x = PyNumber_InPlaceSubtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001166 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001167 Py_DECREF(v);
1168 Py_DECREF(w);
1169 PUSH(x);
1170 if (x != NULL) continue;
1171 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001172
Thomas Wouters434d0822000-08-24 20:11:32 +00001173 case INPLACE_LSHIFT:
1174 w = POP();
1175 v = POP();
1176 x = PyNumber_InPlaceLshift(v, w);
1177 Py_DECREF(v);
1178 Py_DECREF(w);
1179 PUSH(x);
1180 if (x != NULL) continue;
1181 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001182
Thomas Wouters434d0822000-08-24 20:11:32 +00001183 case INPLACE_RSHIFT:
1184 w = POP();
1185 v = POP();
1186 x = PyNumber_InPlaceRshift(v, w);
1187 Py_DECREF(v);
1188 Py_DECREF(w);
1189 PUSH(x);
1190 if (x != NULL) continue;
1191 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001192
Thomas Wouters434d0822000-08-24 20:11:32 +00001193 case INPLACE_AND:
1194 w = POP();
1195 v = POP();
1196 x = PyNumber_InPlaceAnd(v, w);
1197 Py_DECREF(v);
1198 Py_DECREF(w);
1199 PUSH(x);
1200 if (x != NULL) continue;
1201 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001202
Thomas Wouters434d0822000-08-24 20:11:32 +00001203 case INPLACE_XOR:
1204 w = POP();
1205 v = POP();
1206 x = PyNumber_InPlaceXor(v, w);
1207 Py_DECREF(v);
1208 Py_DECREF(w);
1209 PUSH(x);
1210 if (x != NULL) continue;
1211 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001212
Thomas Wouters434d0822000-08-24 20:11:32 +00001213 case INPLACE_OR:
1214 w = POP();
1215 v = POP();
1216 x = PyNumber_InPlaceOr(v, w);
1217 Py_DECREF(v);
1218 Py_DECREF(w);
1219 PUSH(x);
1220 if (x != NULL) continue;
1221 break;
1222
Guido van Rossum374a9221991-04-04 10:40:29 +00001223 case SLICE+0:
1224 case SLICE+1:
1225 case SLICE+2:
1226 case SLICE+3:
1227 if ((opcode-SLICE) & 2)
1228 w = POP();
1229 else
1230 w = NULL;
1231 if ((opcode-SLICE) & 1)
1232 v = POP();
1233 else
1234 v = NULL;
1235 u = POP();
1236 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001237 Py_DECREF(u);
1238 Py_XDECREF(v);
1239 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001240 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001241 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001242 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001243
Guido van Rossum374a9221991-04-04 10:40:29 +00001244 case STORE_SLICE+0:
1245 case STORE_SLICE+1:
1246 case STORE_SLICE+2:
1247 case STORE_SLICE+3:
1248 if ((opcode-STORE_SLICE) & 2)
1249 w = POP();
1250 else
1251 w = NULL;
1252 if ((opcode-STORE_SLICE) & 1)
1253 v = POP();
1254 else
1255 v = NULL;
1256 u = POP();
1257 t = POP();
1258 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001259 Py_DECREF(t);
1260 Py_DECREF(u);
1261 Py_XDECREF(v);
1262 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001263 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001264 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001265
Guido van Rossum374a9221991-04-04 10:40:29 +00001266 case DELETE_SLICE+0:
1267 case DELETE_SLICE+1:
1268 case DELETE_SLICE+2:
1269 case DELETE_SLICE+3:
1270 if ((opcode-DELETE_SLICE) & 2)
1271 w = POP();
1272 else
1273 w = NULL;
1274 if ((opcode-DELETE_SLICE) & 1)
1275 v = POP();
1276 else
1277 v = NULL;
1278 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001279 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001280 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001281 Py_DECREF(u);
1282 Py_XDECREF(v);
1283 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001284 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001285 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001286
Guido van Rossum374a9221991-04-04 10:40:29 +00001287 case STORE_SUBSCR:
1288 w = POP();
1289 v = POP();
1290 u = POP();
1291 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001292 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001293 Py_DECREF(u);
1294 Py_DECREF(v);
1295 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001296 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001297 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001298
Guido van Rossum374a9221991-04-04 10:40:29 +00001299 case DELETE_SUBSCR:
1300 w = POP();
1301 v = POP();
1302 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001303 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001304 Py_DECREF(v);
1305 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001306 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001307 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001308
Guido van Rossum374a9221991-04-04 10:40:29 +00001309 case PRINT_EXPR:
1310 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001311 w = PySys_GetObject("displayhook");
1312 if (w == NULL) {
1313 PyErr_SetString(PyExc_RuntimeError,
1314 "lost sys.displayhook");
1315 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001316 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001317 }
1318 if (err == 0) {
1319 x = Py_BuildValue("(O)", v);
1320 if (x == NULL)
1321 err = -1;
1322 }
1323 if (err == 0) {
1324 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001325 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001326 if (w == NULL)
1327 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001328 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001329 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001330 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001331 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001332
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001333 case PRINT_ITEM_TO:
1334 w = stream = POP();
1335 /* fall through to PRINT_ITEM */
1336
Guido van Rossum374a9221991-04-04 10:40:29 +00001337 case PRINT_ITEM:
1338 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001339 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001340 w = PySys_GetObject("stdout");
1341 if (w == NULL) {
1342 PyErr_SetString(PyExc_RuntimeError,
1343 "lost sys.stdout");
1344 err = -1;
1345 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001346 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001347 if (w != NULL && PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001348 err = PyFile_WriteString(" ", w);
1349 if (err == 0)
1350 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001351 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001352 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001353 char *s = PyString_AsString(v);
1354 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001355 if (len > 0 &&
1356 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001357 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001358 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001359 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001360 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001361 Py_XDECREF(stream);
1362 stream = NULL;
1363 if (err == 0)
1364 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001365 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001366
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001367 case PRINT_NEWLINE_TO:
1368 w = stream = POP();
1369 /* fall through to PRINT_NEWLINE */
1370
Guido van Rossum374a9221991-04-04 10:40:29 +00001371 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001372 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001373 w = PySys_GetObject("stdout");
1374 if (w == NULL)
1375 PyErr_SetString(PyExc_RuntimeError,
1376 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001377 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001378 if (w != NULL) {
1379 err = PyFile_WriteString("\n", w);
1380 if (err == 0)
1381 PyFile_SoftSpace(w, 0);
1382 }
1383 Py_XDECREF(stream);
1384 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001385 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001386
Thomas Wouters434d0822000-08-24 20:11:32 +00001387
1388#ifdef CASE_TOO_BIG
1389 default: switch (opcode) {
1390#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001391 case BREAK_LOOP:
1392 why = WHY_BREAK;
1393 break;
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00001394
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001395 case CONTINUE_LOOP:
1396 retval = PyInt_FromLong(oparg);
1397 why = WHY_CONTINUE;
1398 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001399
Guido van Rossumf10570b1995-07-07 22:53:21 +00001400 case RAISE_VARARGS:
1401 u = v = w = NULL;
1402 switch (oparg) {
1403 case 3:
1404 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001405 /* Fallthrough */
1406 case 2:
1407 v = POP(); /* value */
1408 /* Fallthrough */
1409 case 1:
1410 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001411 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001412 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001413 break;
1414 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001415 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001416 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001417 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001418 break;
1419 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001420 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001421
Guido van Rossum374a9221991-04-04 10:40:29 +00001422 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001423 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001424 PyErr_SetString(PyExc_SystemError,
1425 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001426 break;
1427 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001428 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001429 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001430 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001431
Guido van Rossum374a9221991-04-04 10:40:29 +00001432 case RETURN_VALUE:
1433 retval = POP();
1434 why = WHY_RETURN;
1435 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001436
Tim Peters5ca576e2001-06-18 22:08:13 +00001437 case YIELD_VALUE:
1438 retval = POP();
Tim Peters8c963692001-06-23 05:26:56 +00001439 f->f_stacktop = stack_pointer;
Tim Peters5ca576e2001-06-18 22:08:13 +00001440 f->f_lasti = INSTR_OFFSET();
1441 why = WHY_YIELD;
1442 break;
1443
1444
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001445 case EXEC_STMT:
1446 w = POP();
1447 v = POP();
1448 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001449 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001450 Py_DECREF(u);
1451 Py_DECREF(v);
1452 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001453 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001454
Guido van Rossum374a9221991-04-04 10:40:29 +00001455 case POP_BLOCK:
1456 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001457 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001458 while (STACK_LEVEL() > b->b_level) {
1459 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001460 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001461 }
1462 }
1463 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001464
Guido van Rossum374a9221991-04-04 10:40:29 +00001465 case END_FINALLY:
1466 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001467 if (PyInt_Check(v)) {
1468 why = (enum why_code) PyInt_AsLong(v);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001469 if (why == WHY_RETURN ||
Tim Peters5ca576e2001-06-18 22:08:13 +00001470 why == WHY_YIELD ||
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001471 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00001472 retval = POP();
1473 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001474 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001475 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001476 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001477 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001478 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001479 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001480 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001481 else if (v != Py_None) {
1482 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001483 "'finally' pops bad exception");
1484 why = WHY_EXCEPTION;
1485 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001486 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001487 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001488
Guido van Rossum374a9221991-04-04 10:40:29 +00001489 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001490 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001491 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001492 w = POP();
1493 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001494 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001495 Py_DECREF(u);
1496 Py_DECREF(v);
1497 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001498 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001499
Guido van Rossum374a9221991-04-04 10:40:29 +00001500 case STORE_NAME:
1501 w = GETNAMEV(oparg);
1502 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001503 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001504 PyErr_Format(PyExc_SystemError,
1505 "no locals found when storing %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001506 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001507 break;
1508 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001509 err = PyDict_SetItem(x, w, v);
1510 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001511 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001512
Guido van Rossum374a9221991-04-04 10:40:29 +00001513 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001514 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001515 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001516 PyErr_Format(PyExc_SystemError,
1517 "no locals when deleting %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001518 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001519 break;
1520 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001521 if ((err = PyDict_DelItem(x, w)) != 0)
Guido van Rossumac7be682001-01-17 15:42:30 +00001522 format_exc_check_arg(PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001523 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001524 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001525
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001526 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001527 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001528 if (PyTuple_Check(v)) {
1529 if (PyTuple_Size(v) != oparg) {
1530 PyErr_SetString(PyExc_ValueError,
1531 "unpack tuple of wrong size");
1532 why = WHY_EXCEPTION;
1533 }
1534 else {
1535 for (; --oparg >= 0; ) {
1536 w = PyTuple_GET_ITEM(v, oparg);
1537 Py_INCREF(w);
1538 PUSH(w);
1539 }
1540 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001541 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001542 else if (PyList_Check(v)) {
1543 if (PyList_Size(v) != oparg) {
1544 PyErr_SetString(PyExc_ValueError,
1545 "unpack list of wrong size");
1546 why = WHY_EXCEPTION;
1547 }
1548 else {
1549 for (; --oparg >= 0; ) {
1550 w = PyList_GET_ITEM(v, oparg);
1551 Py_INCREF(w);
1552 PUSH(w);
1553 }
1554 }
1555 }
Tim Petersd6d010b2001-06-21 02:49:55 +00001556 else if (unpack_iterable(v, oparg,
1557 stack_pointer + oparg))
1558 stack_pointer += oparg;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001559 else {
1560 if (PyErr_ExceptionMatches(PyExc_TypeError))
1561 PyErr_SetString(PyExc_TypeError,
1562 "unpack non-sequence");
Barry Warsawe42b18f1997-08-25 22:13:04 +00001563 why = WHY_EXCEPTION;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001564 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001565 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001566 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001567
Guido van Rossum374a9221991-04-04 10:40:29 +00001568 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001569 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001570 v = POP();
1571 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001572 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1573 Py_DECREF(v);
1574 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001575 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001576
Guido van Rossum374a9221991-04-04 10:40:29 +00001577 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001578 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001579 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001580 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1581 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001582 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001583 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001584
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001585 case STORE_GLOBAL:
1586 w = GETNAMEV(oparg);
1587 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001588 err = PyDict_SetItem(f->f_globals, w, v);
1589 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001590 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001591
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001592 case DELETE_GLOBAL:
1593 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001594 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001595 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001596 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001597 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001598
Guido van Rossum374a9221991-04-04 10:40:29 +00001599 case LOAD_CONST:
1600 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001601 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001602 PUSH(x);
1603 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001604
Guido van Rossum374a9221991-04-04 10:40:29 +00001605 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001606 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001607 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001608 PyErr_Format(PyExc_SystemError,
1609 "no locals when loading %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001610 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001611 break;
1612 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001613 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001614 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001615 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001616 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001617 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001618 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001619 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001620 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001621 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001622 break;
1623 }
1624 }
1625 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001626 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001627 PUSH(x);
1628 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001629
Guido van Rossum374a9221991-04-04 10:40:29 +00001630 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001631 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001632 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001633 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001634 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001635 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001636 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001637 PyExc_NameError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001638 GLOBAL_NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001639 break;
1640 }
1641 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001642 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001643 PUSH(x);
1644 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001645
Guido van Rossum9bfef441993-03-29 10:43:31 +00001646 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001647 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001648 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001649 format_exc_check_arg(
1650 PyExc_UnboundLocalError,
1651 UNBOUNDLOCAL_ERROR_MSG,
1652 PyTuple_GetItem(co->co_varnames, oparg)
1653 );
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001654 break;
1655 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001656 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001657 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001658 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001659 break;
1660
1661 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001662 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001663 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001664 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001665
1666 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001667 x = GETLOCAL(oparg);
1668 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001669 format_exc_check_arg(
1670 PyExc_UnboundLocalError,
1671 UNBOUNDLOCAL_ERROR_MSG,
1672 PyTuple_GetItem(co->co_varnames, oparg)
1673 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001674 break;
1675 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001676 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001677 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001678
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001679 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001680 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001681 Py_INCREF(x);
1682 PUSH(x);
1683 break;
1684
1685 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001686 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001687 w = PyCell_Get(x);
Jeremy Hylton2524d692001-02-05 17:23:16 +00001688 if (w == NULL) {
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001689 if (oparg < f->f_ncells) {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001690 v = PyTuple_GetItem(co->co_cellvars,
1691 oparg);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001692 format_exc_check_arg(
1693 PyExc_UnboundLocalError,
1694 UNBOUNDLOCAL_ERROR_MSG,
1695 v);
1696 } else {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001697 v = PyTuple_GetItem(
1698 co->co_freevars,
1699 oparg - f->f_ncells);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001700 format_exc_check_arg(
1701 PyExc_NameError,
1702 UNBOUNDFREE_ERROR_MSG,
1703 v);
1704 }
Jeremy Hylton2524d692001-02-05 17:23:16 +00001705 err = -1;
1706 break;
1707 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001708 PUSH(w);
1709 break;
1710
1711 case STORE_DEREF:
1712 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001713 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001714 PyCell_Set(x, w);
Jeremy Hylton30c9f392001-03-13 01:58:22 +00001715 Py_DECREF(w);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001716 continue;
1717
Guido van Rossum374a9221991-04-04 10:40:29 +00001718 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001719 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001720 if (x != NULL) {
1721 for (; --oparg >= 0;) {
1722 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001723 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001724 }
1725 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001726 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001727 }
1728 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001729
Guido van Rossum374a9221991-04-04 10:40:29 +00001730 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001731 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001732 if (x != NULL) {
1733 for (; --oparg >= 0;) {
1734 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001735 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001736 }
1737 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001738 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001739 }
1740 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001741
Guido van Rossum374a9221991-04-04 10:40:29 +00001742 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001743 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001744 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001745 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001746 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001747
Guido van Rossum374a9221991-04-04 10:40:29 +00001748 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001749 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001750 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001751 x = PyObject_GetAttr(v, w);
1752 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001753 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001754 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001755 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001756
Guido van Rossum374a9221991-04-04 10:40:29 +00001757 case COMPARE_OP:
1758 w = POP();
1759 v = POP();
Guido van Rossum46add982001-08-30 16:06:23 +00001760 if (ISSTRICTINT(v) && ISSTRICTINT(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001761 /* INLINE: cmp(int, int) */
1762 register long a, b;
1763 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001764 a = PyInt_AS_LONG(v);
1765 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001766 switch (oparg) {
1767 case LT: res = a < b; break;
1768 case LE: res = a <= b; break;
1769 case EQ: res = a == b; break;
1770 case NE: res = a != b; break;
1771 case GT: res = a > b; break;
1772 case GE: res = a >= b; break;
1773 case IS: res = v == w; break;
1774 case IS_NOT: res = v != w; break;
1775 default: goto slow_compare;
1776 }
1777 x = res ? Py_True : Py_False;
1778 Py_INCREF(x);
1779 }
1780 else {
1781 slow_compare:
1782 x = cmp_outcome(oparg, v, w);
1783 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001784 Py_DECREF(v);
1785 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001786 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001787 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001788 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001789
Guido van Rossum374a9221991-04-04 10:40:29 +00001790 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001791 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001792 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001793 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001794 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001795 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001796 break;
1797 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001798 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001799 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001800 w,
1801 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001802 f->f_locals == NULL ?
1803 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001804 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001805 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001806 if (w == NULL) {
1807 x = NULL;
1808 break;
1809 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001810 x = PyEval_CallObject(x, w);
1811 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001812 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001813 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001814 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001815
Thomas Wouters52152252000-08-17 22:55:00 +00001816 case IMPORT_STAR:
1817 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001818 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001819 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001820 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001821 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001822 break;
1823 }
Thomas Wouters52152252000-08-17 22:55:00 +00001824 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001825 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001826 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001827 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001828 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001829
Thomas Wouters52152252000-08-17 22:55:00 +00001830 case IMPORT_FROM:
1831 w = GETNAMEV(oparg);
1832 v = TOP();
1833 x = import_from(v, w);
1834 PUSH(x);
1835 if (x != NULL) continue;
1836 break;
1837
Guido van Rossum374a9221991-04-04 10:40:29 +00001838 case JUMP_FORWARD:
1839 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001840 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001841
Guido van Rossum374a9221991-04-04 10:40:29 +00001842 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001843 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001844 if (err > 0)
1845 err = 0;
1846 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001847 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001848 else
1849 break;
1850 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001851
Guido van Rossum374a9221991-04-04 10:40:29 +00001852 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001853 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001854 if (err > 0) {
1855 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001856 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001857 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001858 else if (err == 0)
1859 ;
1860 else
1861 break;
1862 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001863
Guido van Rossum374a9221991-04-04 10:40:29 +00001864 case JUMP_ABSOLUTE:
1865 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001866 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001867
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001868 case GET_ITER:
1869 /* before: [obj]; after [getiter(obj)] */
1870 v = POP();
1871 x = PyObject_GetIter(v);
1872 Py_DECREF(v);
1873 if (x != NULL) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00001874 PUSH(x);
1875 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001876 }
1877 break;
1878
1879 case FOR_ITER:
1880 /* before: [iter]; after: [iter, iter()] *or* [] */
1881 v = TOP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001882 x = PyIter_Next(v);
1883 if (x != NULL) {
1884 PUSH(x);
1885 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001886 }
Tim Petersf4848da2001-05-05 00:14:56 +00001887 if (!PyErr_Occurred()) {
1888 /* iterator ended normally */
1889 x = v = POP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001890 Py_DECREF(v);
1891 JUMPBY(oparg);
1892 continue;
1893 }
1894 break;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001895
Guido van Rossum374a9221991-04-04 10:40:29 +00001896 case FOR_LOOP:
1897 /* for v in s: ...
1898 On entry: stack contains s, i.
1899 On exit: stack contains s, i+1, s[i];
1900 but if loop exhausted:
1901 s, i are popped, and we jump */
1902 w = POP(); /* Loop index */
1903 v = POP(); /* Sequence object */
1904 u = loop_subscript(v, w);
1905 if (u != NULL) {
1906 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001907 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001908 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001909 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001910 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001911 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001912 }
1913 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001914 Py_DECREF(v);
1915 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001916 /* A NULL can mean "s exhausted"
1917 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001918 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001919 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001920 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001921 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001922 continue;
1923 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001924 }
1925 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001926
Guido van Rossum374a9221991-04-04 10:40:29 +00001927 case SETUP_LOOP:
1928 case SETUP_EXCEPT:
1929 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001930 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001931 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001932 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001933
Guido van Rossum374a9221991-04-04 10:40:29 +00001934 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001935#ifdef LLTRACE
1936 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001937 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001938#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001939 f->f_lineno = oparg;
Fred Drake5755ce62001-06-27 19:19:46 +00001940 if (tstate->c_tracefunc == NULL || tstate->tracing)
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001941 continue;
1942 /* Trace each line of code reached */
1943 f->f_lasti = INSTR_OFFSET();
Fred Drake5755ce62001-06-27 19:19:46 +00001944 /* Inline call_trace() for performance: */
1945 tstate->tracing++;
Fred Drake9e3ad782001-07-03 23:39:52 +00001946 tstate->use_tracing = 0;
Fred Drake5755ce62001-06-27 19:19:46 +00001947 err = (tstate->c_tracefunc)(tstate->c_traceobj, f,
1948 PyTrace_LINE, Py_None);
Fred Drake9e3ad782001-07-03 23:39:52 +00001949 tstate->use_tracing = (tstate->c_tracefunc
1950 || tstate->c_profilefunc);
Fred Drake5755ce62001-06-27 19:19:46 +00001951 tstate->tracing--;
Guido van Rossum374a9221991-04-04 10:40:29 +00001952 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001953
1954 case CALL_FUNCTION:
Jeremy Hylton52820442001-01-03 23:52:36 +00001955 {
1956 int na = oparg & 0xff;
1957 int nk = (oparg>>8) & 0xff;
1958 int n = na + 2 * nk;
1959 PyObject **pfunc = stack_pointer - n - 1;
1960 PyObject *func = *pfunc;
1961 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1962
1963 /* Always dispatch PyCFunction first, because
1964 these are presumed to be the most frequent
1965 callable object.
1966 */
1967 if (PyCFunction_Check(func)) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001968 int flags = PyCFunction_GET_FLAGS(func);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001969 if (nk != 0 || (flags & METH_KEYWORDS))
Jeremy Hylton4c9dace2001-05-29 16:23:26 +00001970 x = do_call(func, &stack_pointer,
1971 na, nk);
1972 else if (flags == METH_VARARGS) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001973 PyObject *callargs;
1974 callargs = load_args(&stack_pointer, na);
Jeremy Hylton910d7d42001-08-12 21:52:24 +00001975 x = PyCFunction_Call(func, callargs, NULL);
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001976 Py_XDECREF(callargs);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001977 } else
1978 x = fast_cfunction(func,
1979 &stack_pointer, na);
Jeremy Hylton52820442001-01-03 23:52:36 +00001980 } else {
Guido van Rossumac7be682001-01-17 15:42:30 +00001981 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001982 && PyMethod_GET_SELF(func) != NULL) {
1983 /* optimize access to bound methods */
1984 PyObject *self = PyMethod_GET_SELF(func);
1985 Py_INCREF(self);
1986 func = PyMethod_GET_FUNCTION(func);
1987 Py_INCREF(func);
1988 Py_DECREF(*pfunc);
1989 *pfunc = self;
1990 na++;
1991 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00001992 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00001993 Py_INCREF(func);
1994 if (PyFunction_Check(func)) {
1995 x = fast_function(func, &stack_pointer,
Guido van Rossumac7be682001-01-17 15:42:30 +00001996 n, na, nk);
Jeremy Hylton52820442001-01-03 23:52:36 +00001997 } else {
1998 x = do_call(func, &stack_pointer,
1999 na, nk);
2000 }
2001 Py_DECREF(func);
2002 }
2003
2004 while (stack_pointer > pfunc) {
2005 w = POP();
2006 Py_DECREF(w);
2007 }
2008 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002009 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002010 continue;
2011 break;
2012 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002013
Jeremy Hylton76901512000-03-28 23:49:17 +00002014 case CALL_FUNCTION_VAR:
2015 case CALL_FUNCTION_KW:
2016 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00002017 {
Jeremy Hylton76901512000-03-28 23:49:17 +00002018 int na = oparg & 0xff;
2019 int nk = (oparg>>8) & 0xff;
2020 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00002021 int n = na + 2 * nk;
2022 PyObject **pfunc, *func;
2023 if (flags & CALL_FLAG_VAR)
2024 n++;
2025 if (flags & CALL_FLAG_KW)
2026 n++;
2027 pfunc = stack_pointer - n - 1;
2028 func = *pfunc;
Jeremy Hylton76901512000-03-28 23:49:17 +00002029 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Jeremy Hylton52820442001-01-03 23:52:36 +00002030
Guido van Rossumac7be682001-01-17 15:42:30 +00002031 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00002032 && PyMethod_GET_SELF(func) != NULL) {
2033 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002034 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00002035 func = PyMethod_GET_FUNCTION(func);
2036 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002037 Py_DECREF(*pfunc);
2038 *pfunc = self;
2039 na++;
2040 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00002041 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00002042 Py_INCREF(func);
2043 x = ext_do_call(func, &stack_pointer, flags, na, nk);
Jeremy Hylton76901512000-03-28 23:49:17 +00002044 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002045
Jeremy Hylton76901512000-03-28 23:49:17 +00002046 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00002047 w = POP();
2048 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00002049 }
2050 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002051 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002052 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00002053 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002054 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002055
Guido van Rossum681d79a1995-07-18 14:51:37 +00002056 case MAKE_FUNCTION:
2057 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00002058 x = PyFunction_New(v, f->f_globals);
2059 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002060 /* XXX Maybe this should be a separate opcode? */
2061 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002062 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002063 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002064 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002065 x = NULL;
2066 break;
2067 }
2068 while (--oparg >= 0) {
2069 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002070 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002071 }
2072 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00002073 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002074 }
2075 PUSH(x);
2076 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002077
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002078 case MAKE_CLOSURE:
2079 {
2080 int nfree;
2081 v = POP(); /* code object */
2082 x = PyFunction_New(v, f->f_globals);
2083 nfree = PyTuple_GET_SIZE(((PyCodeObject *)v)->co_freevars);
2084 Py_DECREF(v);
2085 /* XXX Maybe this should be a separate opcode? */
2086 if (x != NULL && nfree > 0) {
2087 v = PyTuple_New(nfree);
2088 if (v == NULL) {
2089 Py_DECREF(x);
2090 x = NULL;
2091 break;
2092 }
2093 while (--nfree >= 0) {
2094 w = POP();
2095 PyTuple_SET_ITEM(v, nfree, w);
2096 }
2097 err = PyFunction_SetClosure(x, v);
2098 Py_DECREF(v);
2099 }
2100 if (x != NULL && oparg > 0) {
2101 v = PyTuple_New(oparg);
2102 if (v == NULL) {
2103 Py_DECREF(x);
2104 x = NULL;
2105 break;
2106 }
2107 while (--oparg >= 0) {
2108 w = POP();
2109 PyTuple_SET_ITEM(v, oparg, w);
2110 }
2111 err = PyFunction_SetDefaults(x, v);
2112 Py_DECREF(v);
2113 }
2114 PUSH(x);
2115 break;
2116 }
2117
Guido van Rossum8861b741996-07-30 16:49:37 +00002118 case BUILD_SLICE:
2119 if (oparg == 3)
2120 w = POP();
2121 else
2122 w = NULL;
2123 v = POP();
2124 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002125 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002126 Py_DECREF(u);
2127 Py_DECREF(v);
2128 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00002129 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002130 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002131 break;
2132
Fred Drakeef8ace32000-08-24 00:32:09 +00002133 case EXTENDED_ARG:
2134 opcode = NEXTOP();
2135 oparg = oparg<<16 | NEXTARG();
2136 goto dispatch_opcode;
Guido van Rossum8861b741996-07-30 16:49:37 +00002137
Guido van Rossum374a9221991-04-04 10:40:29 +00002138 default:
2139 fprintf(stderr,
2140 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00002141 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002142 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002143 why = WHY_EXCEPTION;
2144 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002145
2146#ifdef CASE_TOO_BIG
2147 }
2148#endif
2149
Guido van Rossum374a9221991-04-04 10:40:29 +00002150 } /* switch */
2151
2152 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002153
Guido van Rossum374a9221991-04-04 10:40:29 +00002154 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002155
Guido van Rossum374a9221991-04-04 10:40:29 +00002156 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002157 if (err == 0 && x != NULL) {
2158#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002159 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002160 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002161 fprintf(stderr,
2162 "XXX undetected error\n");
2163 else
2164#endif
2165 continue; /* Normal, fast path */
2166 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002167 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002168 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002169 err = 0;
2170 }
2171
Guido van Rossum374a9221991-04-04 10:40:29 +00002172 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002173
Guido van Rossum374a9221991-04-04 10:40:29 +00002174 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002175 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002176 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002177 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002178 why = WHY_EXCEPTION;
2179 }
2180 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002181#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002182 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002183 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002184 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002185 fprintf(stderr,
2186 "XXX undetected error (why=%d)\n",
2187 why);
2188 why = WHY_EXCEPTION;
2189 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002190 }
2191#endif
2192
2193 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002194
Guido van Rossum374a9221991-04-04 10:40:29 +00002195 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002196 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00002197 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00002198 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00002199 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002200
Fred Drake9e3ad782001-07-03 23:39:52 +00002201 if (tstate->use_tracing) {
2202 if (tstate->c_tracefunc)
2203 call_exc_trace(tstate->c_tracefunc,
2204 tstate->c_traceobj, f);
2205 if (tstate->c_profilefunc)
2206 call_exc_trace(tstate->c_profilefunc,
2207 tstate->c_profileobj,f);
2208 }
Guido van Rossum014518f1998-11-23 21:09:51 +00002209 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002210
Guido van Rossum374a9221991-04-04 10:40:29 +00002211 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002212
Guido van Rossum374a9221991-04-04 10:40:29 +00002213 if (why == WHY_RERAISE)
2214 why = WHY_EXCEPTION;
2215
2216 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002217
Tim Peters5ca576e2001-06-18 22:08:13 +00002218 while (why != WHY_NOT && why != WHY_YIELD && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002219 PyTryBlock *b = PyFrame_BlockPop(f);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002220
2221 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2222 /* For a continue inside a try block,
2223 don't pop the block for the loop. */
Thomas Wouters1ee64222001-09-24 19:32:01 +00002224 PyFrame_BlockSetup(f, b->b_type, b->b_handler,
2225 b->b_level);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002226 why = WHY_NOT;
2227 JUMPTO(PyInt_AS_LONG(retval));
2228 Py_DECREF(retval);
2229 break;
2230 }
2231
Guido van Rossum374a9221991-04-04 10:40:29 +00002232 while (STACK_LEVEL() > b->b_level) {
2233 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002234 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002235 }
2236 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2237 why = WHY_NOT;
2238 JUMPTO(b->b_handler);
2239 break;
2240 }
2241 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002242 (b->b_type == SETUP_EXCEPT &&
2243 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002244 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002245 PyObject *exc, *val, *tb;
2246 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002247 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002248 val = Py_None;
2249 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002250 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002251 /* Make the raw exception data
2252 available to the handler,
2253 so a program can emulate the
2254 Python main loop. Don't do
2255 this for 'finally'. */
2256 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002257 PyErr_NormalizeException(
2258 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002259 set_exc_info(tstate,
2260 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002261 }
Jeremy Hyltonc6314892001-09-26 19:24:45 +00002262 if (tb == NULL) {
2263 Py_INCREF(Py_None);
2264 PUSH(Py_None);
2265 } else
2266 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002267 PUSH(val);
2268 PUSH(exc);
2269 }
2270 else {
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002271 if (why == WHY_RETURN ||
2272 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00002273 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002274 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002275 PUSH(v);
2276 }
2277 why = WHY_NOT;
2278 JUMPTO(b->b_handler);
2279 break;
2280 }
2281 } /* unwind stack */
2282
2283 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002284
Guido van Rossum374a9221991-04-04 10:40:29 +00002285 if (why != WHY_NOT)
2286 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002287
Guido van Rossum374a9221991-04-04 10:40:29 +00002288 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002289
Tim Peters5ca576e2001-06-18 22:08:13 +00002290 if (why != WHY_RETURN && why != WHY_YIELD)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002291 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002292
Fred Drake9e3ad782001-07-03 23:39:52 +00002293 if (tstate->use_tracing) {
2294 if (tstate->c_tracefunc
2295 && (why == WHY_RETURN || why == WHY_YIELD)) {
2296 if (call_trace(tstate->c_tracefunc,
2297 tstate->c_traceobj, f,
2298 PyTrace_RETURN, retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002299 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002300 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002301 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002302 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002303 }
Fred Drake9e3ad782001-07-03 23:39:52 +00002304 if (tstate->c_profilefunc
2305 && (why == WHY_RETURN || why == WHY_YIELD)) {
2306 if (call_trace(tstate->c_profilefunc,
2307 tstate->c_profileobj, f,
2308 PyTrace_RETURN, retval)) {
2309 Py_XDECREF(retval);
2310 retval = NULL;
2311 why = WHY_EXCEPTION;
2312 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002313 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002314 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002315
Guido van Rossuma027efa1997-05-05 20:56:21 +00002316 reset_exc_info(tstate);
2317
Tim Peters5ca576e2001-06-18 22:08:13 +00002318 /* pop frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002319 --tstate->recursion_depth;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002320 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00002321
Guido van Rossum96a42c81992-01-12 02:29:51 +00002322 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002323}
2324
Tim Peters6d6c1a32001-08-02 04:15:00 +00002325PyObject *
2326PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals,
Tim Peters5ca576e2001-06-18 22:08:13 +00002327 PyObject **args, int argcount, PyObject **kws, int kwcount,
2328 PyObject **defs, int defcount, PyObject *closure)
2329{
2330 register PyFrameObject *f;
2331 register PyObject *retval = NULL;
2332 register PyObject **fastlocals, **freevars;
2333 PyThreadState *tstate = PyThreadState_GET();
2334 PyObject *x, *u;
2335
2336 if (globals == NULL) {
Jeremy Hylton910d7d42001-08-12 21:52:24 +00002337 PyErr_SetString(PyExc_SystemError,
2338 "PyEval_EvalCodeEx: NULL globals");
Tim Peters5ca576e2001-06-18 22:08:13 +00002339 return NULL;
2340 }
2341
2342 f = PyFrame_New(tstate, /*back*/
2343 co, /*code*/
2344 globals, locals);
2345 if (f == NULL)
2346 return NULL;
2347
2348 fastlocals = f->f_localsplus;
2349 freevars = f->f_localsplus + f->f_nlocals;
2350
2351 if (co->co_argcount > 0 ||
2352 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
2353 int i;
2354 int n = argcount;
2355 PyObject *kwdict = NULL;
2356 if (co->co_flags & CO_VARKEYWORDS) {
2357 kwdict = PyDict_New();
2358 if (kwdict == NULL)
2359 goto fail;
2360 i = co->co_argcount;
2361 if (co->co_flags & CO_VARARGS)
2362 i++;
2363 SETLOCAL(i, kwdict);
2364 }
2365 if (argcount > co->co_argcount) {
2366 if (!(co->co_flags & CO_VARARGS)) {
2367 PyErr_Format(PyExc_TypeError,
2368 "%.200s() takes %s %d "
2369 "%sargument%s (%d given)",
2370 PyString_AsString(co->co_name),
2371 defcount ? "at most" : "exactly",
2372 co->co_argcount,
2373 kwcount ? "non-keyword " : "",
2374 co->co_argcount == 1 ? "" : "s",
2375 argcount);
2376 goto fail;
2377 }
2378 n = co->co_argcount;
2379 }
2380 for (i = 0; i < n; i++) {
2381 x = args[i];
2382 Py_INCREF(x);
2383 SETLOCAL(i, x);
2384 }
2385 if (co->co_flags & CO_VARARGS) {
2386 u = PyTuple_New(argcount - n);
2387 if (u == NULL)
2388 goto fail;
2389 SETLOCAL(co->co_argcount, u);
2390 for (i = n; i < argcount; i++) {
2391 x = args[i];
2392 Py_INCREF(x);
2393 PyTuple_SET_ITEM(u, i-n, x);
2394 }
2395 }
2396 for (i = 0; i < kwcount; i++) {
2397 PyObject *keyword = kws[2*i];
2398 PyObject *value = kws[2*i + 1];
2399 int j;
2400 if (keyword == NULL || !PyString_Check(keyword)) {
2401 PyErr_Format(PyExc_TypeError,
2402 "%.200s() keywords must be strings",
2403 PyString_AsString(co->co_name));
2404 goto fail;
2405 }
2406 /* XXX slow -- speed up using dictionary? */
2407 for (j = 0; j < co->co_argcount; j++) {
2408 PyObject *nm = PyTuple_GET_ITEM(
2409 co->co_varnames, j);
2410 int cmp = PyObject_RichCompareBool(
2411 keyword, nm, Py_EQ);
2412 if (cmp > 0)
2413 break;
2414 else if (cmp < 0)
2415 goto fail;
2416 }
2417 /* Check errors from Compare */
2418 if (PyErr_Occurred())
2419 goto fail;
2420 if (j >= co->co_argcount) {
2421 if (kwdict == NULL) {
2422 PyErr_Format(PyExc_TypeError,
2423 "%.200s() got an unexpected "
2424 "keyword argument '%.400s'",
2425 PyString_AsString(co->co_name),
2426 PyString_AsString(keyword));
2427 goto fail;
2428 }
2429 PyDict_SetItem(kwdict, keyword, value);
2430 }
2431 else {
2432 if (GETLOCAL(j) != NULL) {
2433 PyErr_Format(PyExc_TypeError,
2434 "%.200s() got multiple "
2435 "values for keyword "
2436 "argument '%.400s'",
2437 PyString_AsString(co->co_name),
2438 PyString_AsString(keyword));
2439 goto fail;
2440 }
2441 Py_INCREF(value);
2442 SETLOCAL(j, value);
2443 }
2444 }
2445 if (argcount < co->co_argcount) {
2446 int m = co->co_argcount - defcount;
2447 for (i = argcount; i < m; i++) {
2448 if (GETLOCAL(i) == NULL) {
2449 PyErr_Format(PyExc_TypeError,
2450 "%.200s() takes %s %d "
2451 "%sargument%s (%d given)",
2452 PyString_AsString(co->co_name),
2453 ((co->co_flags & CO_VARARGS) ||
2454 defcount) ? "at least"
2455 : "exactly",
2456 m, kwcount ? "non-keyword " : "",
2457 m == 1 ? "" : "s", i);
2458 goto fail;
2459 }
2460 }
2461 if (n > m)
2462 i = n - m;
2463 else
2464 i = 0;
2465 for (; i < defcount; i++) {
2466 if (GETLOCAL(m+i) == NULL) {
2467 PyObject *def = defs[i];
2468 Py_INCREF(def);
2469 SETLOCAL(m+i, def);
2470 }
2471 }
2472 }
2473 }
2474 else {
2475 if (argcount > 0 || kwcount > 0) {
2476 PyErr_Format(PyExc_TypeError,
2477 "%.200s() takes no arguments (%d given)",
2478 PyString_AsString(co->co_name),
2479 argcount + kwcount);
2480 goto fail;
2481 }
2482 }
2483 /* Allocate and initialize storage for cell vars, and copy free
2484 vars into frame. This isn't too efficient right now. */
2485 if (f->f_ncells) {
2486 int i = 0, j = 0, nargs, found;
2487 char *cellname, *argname;
2488 PyObject *c;
2489
2490 nargs = co->co_argcount;
2491 if (co->co_flags & CO_VARARGS)
2492 nargs++;
2493 if (co->co_flags & CO_VARKEYWORDS)
2494 nargs++;
2495
2496 /* Check for cells that shadow args */
2497 for (i = 0; i < f->f_ncells && j < nargs; ++i) {
2498 cellname = PyString_AS_STRING(
2499 PyTuple_GET_ITEM(co->co_cellvars, i));
2500 found = 0;
2501 while (j < nargs) {
2502 argname = PyString_AS_STRING(
2503 PyTuple_GET_ITEM(co->co_varnames, j));
2504 if (strcmp(cellname, argname) == 0) {
2505 c = PyCell_New(GETLOCAL(j));
2506 if (c == NULL)
2507 goto fail;
2508 GETLOCAL(f->f_nlocals + i) = c;
2509 found = 1;
2510 break;
2511 }
2512 j++;
2513 }
2514 if (found == 0) {
2515 c = PyCell_New(NULL);
2516 if (c == NULL)
2517 goto fail;
2518 SETLOCAL(f->f_nlocals + i, c);
2519 }
2520 }
2521 /* Initialize any that are left */
2522 while (i < f->f_ncells) {
2523 c = PyCell_New(NULL);
2524 if (c == NULL)
2525 goto fail;
2526 SETLOCAL(f->f_nlocals + i, c);
2527 i++;
2528 }
2529 }
2530 if (f->f_nfreevars) {
2531 int i;
2532 for (i = 0; i < f->f_nfreevars; ++i) {
2533 PyObject *o = PyTuple_GET_ITEM(closure, i);
2534 Py_INCREF(o);
2535 freevars[f->f_ncells + i] = o;
2536 }
2537 }
2538
Tim Peters5ca576e2001-06-18 22:08:13 +00002539 if (co->co_flags & CO_GENERATOR) {
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002540 /* Don't need to keep the reference to f_back, it will be set
2541 * when the generator is resumed. */
Tim Peters5ba58662001-07-16 02:29:45 +00002542 Py_XDECREF(f->f_back);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002543 f->f_back = NULL;
2544
2545 /* Create a new generator that owns the ready to run frame
2546 * and return that as the value. */
Tim Peters5ca576e2001-06-18 22:08:13 +00002547 return gen_new(f);
2548 }
2549
2550 retval = eval_frame(f);
2551
2552 fail: /* Jump here from prelude on failure */
2553
2554 Py_DECREF(f);
2555 return retval;
2556}
2557
2558
Guido van Rossuma027efa1997-05-05 20:56:21 +00002559static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002560set_exc_info(PyThreadState *tstate,
2561 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002562{
2563 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002564 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002565
Guido van Rossuma027efa1997-05-05 20:56:21 +00002566 frame = tstate->frame;
2567 if (frame->f_exc_type == NULL) {
2568 /* This frame didn't catch an exception before */
2569 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002570 if (tstate->exc_type == NULL) {
2571 Py_INCREF(Py_None);
2572 tstate->exc_type = Py_None;
2573 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002574 tmp_type = frame->f_exc_type;
2575 tmp_value = frame->f_exc_value;
2576 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002577 Py_XINCREF(tstate->exc_type);
2578 Py_XINCREF(tstate->exc_value);
2579 Py_XINCREF(tstate->exc_traceback);
2580 frame->f_exc_type = tstate->exc_type;
2581 frame->f_exc_value = tstate->exc_value;
2582 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002583 Py_XDECREF(tmp_type);
2584 Py_XDECREF(tmp_value);
2585 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002586 }
2587 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002588 tmp_type = tstate->exc_type;
2589 tmp_value = tstate->exc_value;
2590 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002591 Py_XINCREF(type);
2592 Py_XINCREF(value);
2593 Py_XINCREF(tb);
2594 tstate->exc_type = type;
2595 tstate->exc_value = value;
2596 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002597 Py_XDECREF(tmp_type);
2598 Py_XDECREF(tmp_value);
2599 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002600 /* For b/w compatibility */
2601 PySys_SetObject("exc_type", type);
2602 PySys_SetObject("exc_value", value);
2603 PySys_SetObject("exc_traceback", tb);
2604}
2605
2606static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002607reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002608{
2609 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002610 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002611 frame = tstate->frame;
2612 if (frame->f_exc_type != NULL) {
2613 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002614 tmp_type = tstate->exc_type;
2615 tmp_value = tstate->exc_value;
2616 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002617 Py_XINCREF(frame->f_exc_type);
2618 Py_XINCREF(frame->f_exc_value);
2619 Py_XINCREF(frame->f_exc_traceback);
2620 tstate->exc_type = frame->f_exc_type;
2621 tstate->exc_value = frame->f_exc_value;
2622 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002623 Py_XDECREF(tmp_type);
2624 Py_XDECREF(tmp_value);
2625 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002626 /* For b/w compatibility */
2627 PySys_SetObject("exc_type", frame->f_exc_type);
2628 PySys_SetObject("exc_value", frame->f_exc_value);
2629 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2630 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002631 tmp_type = frame->f_exc_type;
2632 tmp_value = frame->f_exc_value;
2633 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002634 frame->f_exc_type = NULL;
2635 frame->f_exc_value = NULL;
2636 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002637 Py_XDECREF(tmp_type);
2638 Py_XDECREF(tmp_value);
2639 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002640}
2641
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002642/* Logic for the raise statement (too complicated for inlining).
2643 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002644static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002645do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002646{
Guido van Rossumd295f121998-04-09 21:39:57 +00002647 if (type == NULL) {
2648 /* Reraise */
2649 PyThreadState *tstate = PyThreadState_Get();
2650 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2651 value = tstate->exc_value;
2652 tb = tstate->exc_traceback;
2653 Py_XINCREF(type);
2654 Py_XINCREF(value);
2655 Py_XINCREF(tb);
2656 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002657
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002658 /* We support the following forms of raise:
2659 raise <class>, <classinstance>
2660 raise <class>, <argument tuple>
2661 raise <class>, None
2662 raise <class>, <argument>
2663 raise <classinstance>, None
2664 raise <string>, <object>
2665 raise <string>, None
2666
2667 An omitted second argument is the same as None.
2668
2669 In addition, raise <tuple>, <anything> is the same as
2670 raising the tuple's first item (and it better have one!);
2671 this rule is applied recursively.
2672
2673 Finally, an optional third argument can be supplied, which
2674 gives the traceback to be substituted (useful when
2675 re-raising an exception after examining it). */
2676
2677 /* First, check the traceback argument, replacing None with
2678 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002679 if (tb == Py_None) {
2680 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002681 tb = NULL;
2682 }
2683 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002684 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002685 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002686 goto raise_error;
2687 }
2688
2689 /* Next, replace a missing value with None */
2690 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002691 value = Py_None;
2692 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002693 }
2694
2695 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002696 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2697 PyObject *tmp = type;
2698 type = PyTuple_GET_ITEM(type, 0);
2699 Py_INCREF(type);
2700 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002701 }
2702
Barry Warsaw4249f541997-08-22 21:26:19 +00002703 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002704 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002705
2706 else if (PyClass_Check(type))
2707 PyErr_NormalizeException(&type, &value, &tb);
2708
Guido van Rossumb209a111997-04-29 18:18:01 +00002709 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002710 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002711 if (value != Py_None) {
2712 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002713 "instance exception may not have a separate value");
2714 goto raise_error;
2715 }
2716 else {
2717 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002718 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002719 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002720 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2721 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002722 }
2723 }
2724 else {
2725 /* Not something you can raise. You get an exception
2726 anyway, just not what you specified :-) */
Jeremy Hylton960d9482001-04-27 02:25:33 +00002727 PyErr_Format(PyExc_TypeError,
2728 "exceptions must be strings, classes, or "
2729 "instances, not %s", type->ob_type->tp_name);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002730 goto raise_error;
2731 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002732 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002733 if (tb == NULL)
2734 return WHY_EXCEPTION;
2735 else
2736 return WHY_RERAISE;
2737 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002738 Py_XDECREF(value);
2739 Py_XDECREF(type);
2740 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002741 return WHY_EXCEPTION;
2742}
2743
Tim Petersd6d010b2001-06-21 02:49:55 +00002744/* Iterate v argcnt times and store the results on the stack (via decreasing
2745 sp). Return 1 for success, 0 if error. */
2746
Barry Warsawe42b18f1997-08-25 22:13:04 +00002747static int
Tim Petersd6d010b2001-06-21 02:49:55 +00002748unpack_iterable(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002749{
Tim Petersd6d010b2001-06-21 02:49:55 +00002750 int i = 0;
2751 PyObject *it; /* iter(v) */
Barry Warsawe42b18f1997-08-25 22:13:04 +00002752 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00002753
Tim Petersd6d010b2001-06-21 02:49:55 +00002754 assert(v != NULL);
2755
2756 it = PyObject_GetIter(v);
2757 if (it == NULL)
2758 goto Error;
2759
2760 for (; i < argcnt; i++) {
2761 w = PyIter_Next(it);
2762 if (w == NULL) {
2763 /* Iterator done, via error or exhaustion. */
2764 if (!PyErr_Occurred()) {
2765 PyErr_Format(PyExc_ValueError,
2766 "need more than %d value%s to unpack",
2767 i, i == 1 ? "" : "s");
2768 }
2769 goto Error;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002770 }
2771 *--sp = w;
2772 }
Tim Petersd6d010b2001-06-21 02:49:55 +00002773
2774 /* We better have exhausted the iterator now. */
2775 w = PyIter_Next(it);
2776 if (w == NULL) {
2777 if (PyErr_Occurred())
2778 goto Error;
2779 Py_DECREF(it);
2780 return 1;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002781 }
Tim Petersd6d010b2001-06-21 02:49:55 +00002782 PyErr_SetString(PyExc_ValueError, "too many values to unpack");
Barry Warsawe42b18f1997-08-25 22:13:04 +00002783 /* fall through */
Tim Petersd6d010b2001-06-21 02:49:55 +00002784Error:
Barry Warsaw91010551997-08-25 22:30:51 +00002785 for (; i > 0; i--, sp++)
2786 Py_DECREF(*sp);
Tim Petersd6d010b2001-06-21 02:49:55 +00002787 Py_XDECREF(it);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002788 return 0;
2789}
2790
2791
Guido van Rossum96a42c81992-01-12 02:29:51 +00002792#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002793static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002794prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002795{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002796 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002797 if (PyObject_Print(v, stdout, 0) != 0)
2798 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002799 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002800 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002801}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002802#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002803
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002804static void
Fred Drake5755ce62001-06-27 19:19:46 +00002805call_exc_trace(Py_tracefunc func, PyObject *self, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002806{
Guido van Rossumb209a111997-04-29 18:18:01 +00002807 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002808 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002809 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002810 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002811 value = Py_None;
2812 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002813 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002814 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002815 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002816 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002817 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002818 }
Fred Drake5755ce62001-06-27 19:19:46 +00002819 err = call_trace(func, self, f, PyTrace_EXCEPTION, arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002820 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002821 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002822 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002823 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002824 Py_XDECREF(type);
2825 Py_XDECREF(value);
2826 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002827 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002828}
2829
2830static int
Fred Drake5755ce62001-06-27 19:19:46 +00002831call_trace(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
2832 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002833{
Fred Drake5755ce62001-06-27 19:19:46 +00002834 register PyThreadState *tstate = frame->f_tstate;
2835 int result;
2836 if (tstate->tracing)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002837 return 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002838 tstate->tracing++;
Fred Drake9e3ad782001-07-03 23:39:52 +00002839 tstate->use_tracing = 0;
Fred Drake5755ce62001-06-27 19:19:46 +00002840 result = func(obj, frame, what, arg);
Fred Drake9e3ad782001-07-03 23:39:52 +00002841 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
2842 || (tstate->c_profilefunc != NULL));
Guido van Rossuma027efa1997-05-05 20:56:21 +00002843 tstate->tracing--;
Fred Drake5755ce62001-06-27 19:19:46 +00002844 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002845}
2846
Fred Drake5755ce62001-06-27 19:19:46 +00002847void
2848PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00002849{
Fred Drake5755ce62001-06-27 19:19:46 +00002850 PyThreadState *tstate = PyThreadState_Get();
2851 PyObject *temp = tstate->c_profileobj;
2852 Py_XINCREF(arg);
2853 tstate->c_profilefunc = NULL;
2854 tstate->c_profileobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00002855 tstate->use_tracing = tstate->c_tracefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00002856 Py_XDECREF(temp);
2857 tstate->c_profilefunc = func;
2858 tstate->c_profileobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00002859 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
Fred Drake5755ce62001-06-27 19:19:46 +00002860}
2861
2862void
2863PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
2864{
2865 PyThreadState *tstate = PyThreadState_Get();
2866 PyObject *temp = tstate->c_traceobj;
2867 Py_XINCREF(arg);
2868 tstate->c_tracefunc = NULL;
2869 tstate->c_traceobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00002870 tstate->use_tracing = tstate->c_profilefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00002871 Py_XDECREF(temp);
2872 tstate->c_tracefunc = func;
2873 tstate->c_traceobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00002874 tstate->use_tracing = ((func != NULL)
2875 || (tstate->c_profilefunc != NULL));
Fred Draked0838392001-06-16 21:02:31 +00002876}
2877
Guido van Rossumb209a111997-04-29 18:18:01 +00002878PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002879PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002880{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002881 PyThreadState *tstate = PyThreadState_Get();
2882 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002883 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002884 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002885 else
2886 return current_frame->f_builtins;
2887}
2888
Guido van Rossumb209a111997-04-29 18:18:01 +00002889PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002890PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002891{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002892 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002893 if (current_frame == NULL)
2894 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002895 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002896 return current_frame->f_locals;
2897}
2898
Guido van Rossumb209a111997-04-29 18:18:01 +00002899PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002900PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002901{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002902 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002903 if (current_frame == NULL)
2904 return NULL;
2905 else
2906 return current_frame->f_globals;
2907}
2908
Guido van Rossumb209a111997-04-29 18:18:01 +00002909PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002910PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002911{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002912 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002913 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002914}
2915
Guido van Rossum6135a871995-01-09 17:53:26 +00002916int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002917PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002918{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002919 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002920 return current_frame == NULL ? 0 : current_frame->f_restricted;
2921}
2922
Guido van Rossumbe270261997-05-22 22:26:18 +00002923int
Tim Peters5ba58662001-07-16 02:29:45 +00002924PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
Jeremy Hylton061d1062001-03-22 02:32:48 +00002925{
2926 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Tim Peters5ba58662001-07-16 02:29:45 +00002927 int result = 0;
2928
2929 if (current_frame != NULL) {
2930 const int codeflags = current_frame->f_code->co_flags;
Tim Peterse2c18e92001-08-17 20:47:47 +00002931 const int compilerflags = codeflags & PyCF_MASK;
2932 if (compilerflags) {
Tim Peters5ba58662001-07-16 02:29:45 +00002933 result = 1;
Tim Peterse2c18e92001-08-17 20:47:47 +00002934 cf->cf_flags |= compilerflags;
Tim Peters5ba58662001-07-16 02:29:45 +00002935 }
2936 }
2937 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00002938}
2939
2940int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002941Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002942{
Guido van Rossumb209a111997-04-29 18:18:01 +00002943 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002944 if (f == NULL)
2945 return 0;
2946 if (!PyFile_SoftSpace(f, 0))
2947 return 0;
2948 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002949}
2950
Guido van Rossum3f5da241990-12-20 15:06:42 +00002951
Guido van Rossum681d79a1995-07-18 14:51:37 +00002952/* External interface to call any callable object.
2953 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002954
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002955#undef PyEval_CallObject
2956/* for backward compatibility: export this interface */
2957
Guido van Rossumb209a111997-04-29 18:18:01 +00002958PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002959PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002960{
Guido van Rossumb209a111997-04-29 18:18:01 +00002961 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002962}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002963#define PyEval_CallObject(func,arg) \
2964 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002965
Guido van Rossumb209a111997-04-29 18:18:01 +00002966PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002967PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002968{
Jeremy Hylton52820442001-01-03 23:52:36 +00002969 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002970
2971 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002972 arg = PyTuple_New(0);
2973 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002974 PyErr_SetString(PyExc_TypeError,
2975 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002976 return NULL;
2977 }
2978 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002979 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002980
Guido van Rossumb209a111997-04-29 18:18:01 +00002981 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002982 PyErr_SetString(PyExc_TypeError,
2983 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00002984 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002985 return NULL;
2986 }
2987
Tim Peters6d6c1a32001-08-02 04:15:00 +00002988 result = PyObject_Call(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002989 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00002990 return result;
2991}
2992
Tim Peters6d6c1a32001-08-02 04:15:00 +00002993char *
2994PyEval_GetFuncName(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00002995{
2996 if (PyMethod_Check(func))
Tim Peters6d6c1a32001-08-02 04:15:00 +00002997 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00002998 else if (PyFunction_Check(func))
2999 return PyString_AsString(((PyFunctionObject*)func)->func_name);
3000 else if (PyCFunction_Check(func))
3001 return ((PyCFunctionObject*)func)->m_ml->ml_name;
3002 else if (PyClass_Check(func))
3003 return PyString_AsString(((PyClassObject*)func)->cl_name);
3004 else if (PyInstance_Check(func)) {
3005 return PyString_AsString(
3006 ((PyInstanceObject*)func)->in_class->cl_name);
3007 } else {
3008 return func->ob_type->tp_name;
3009 }
3010}
3011
Tim Peters6d6c1a32001-08-02 04:15:00 +00003012char *
3013PyEval_GetFuncDesc(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003014{
3015 if (PyMethod_Check(func))
3016 return "()";
3017 else if (PyFunction_Check(func))
3018 return "()";
3019 else if (PyCFunction_Check(func))
3020 return "()";
3021 else if (PyClass_Check(func))
3022 return " constructor";
3023 else if (PyInstance_Check(func)) {
3024 return " instance";
3025 } else {
3026 return " object";
3027 }
3028}
3029
Jeremy Hylton52820442001-01-03 23:52:36 +00003030#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
3031
3032/* The two fast_xxx() functions optimize calls for which no argument
3033 tuple is necessary; the objects are passed directly from the stack.
3034 fast_cfunction() is called for METH_OLDARGS functions.
3035 fast_function() is for functions with no special argument handling.
3036*/
3037
3038static PyObject *
3039fast_cfunction(PyObject *func, PyObject ***pp_stack, int na)
3040{
3041 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3042 PyObject *self = PyCFunction_GET_SELF(func);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003043 int flags = PyCFunction_GET_FLAGS(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003044
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003045 switch (flags) {
3046 case METH_OLDARGS:
3047 if (na == 0)
3048 return (*meth)(self, NULL);
3049 else if (na == 1) {
3050 PyObject *arg = EXT_POP(*pp_stack);
3051 PyObject *result = (*meth)(self, arg);
3052 Py_DECREF(arg);
3053 return result;
3054 } else {
3055 PyObject *args = load_args(pp_stack, na);
3056 PyObject *result = (*meth)(self, args);
3057 Py_DECREF(args);
3058 return result;
3059 }
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003060 case METH_NOARGS:
3061 if (na == 0)
3062 return (*meth)(self, NULL);
3063 PyErr_Format(PyExc_TypeError,
3064 "%.200s() takes no arguments (%d given)",
3065 ((PyCFunctionObject*)func)->m_ml->ml_name, na);
3066 return NULL;
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003067 case METH_O:
3068 if (na == 1) {
3069 PyObject *arg = EXT_POP(*pp_stack);
3070 PyObject *result = (*meth)(self, arg);
3071 Py_DECREF(arg);
3072 return result;
3073 }
3074 PyErr_Format(PyExc_TypeError,
3075 "%.200s() takes exactly one argument (%d given)",
3076 ((PyCFunctionObject*)func)->m_ml->ml_name, na);
3077 return NULL;
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003078 default:
3079 fprintf(stderr, "%.200s() flags = %d\n",
3080 ((PyCFunctionObject*)func)->m_ml->ml_name, flags);
3081 PyErr_BadInternalCall();
3082 return NULL;
3083 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003084}
3085
3086static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00003087fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00003088{
3089 PyObject *co = PyFunction_GET_CODE(func);
3090 PyObject *globals = PyFunction_GET_GLOBALS(func);
3091 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003092 PyObject *closure = PyFunction_GET_CLOSURE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003093 PyObject **d = NULL;
3094 int nd = 0;
3095
3096 if (argdefs != NULL) {
3097 d = &PyTuple_GET_ITEM(argdefs, 0);
3098 nd = ((PyTupleObject *)argdefs)->ob_size;
3099 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003100 return PyEval_EvalCodeEx((PyCodeObject *)co, globals,
Jeremy Hylton52820442001-01-03 23:52:36 +00003101 (PyObject *)NULL, (*pp_stack)-n, na,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003102 (*pp_stack)-2*nk, nk, d, nd,
3103 closure);
Jeremy Hylton52820442001-01-03 23:52:36 +00003104}
3105
3106static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00003107update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
3108 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00003109{
3110 PyObject *kwdict = NULL;
3111 if (orig_kwdict == NULL)
3112 kwdict = PyDict_New();
3113 else {
3114 kwdict = PyDict_Copy(orig_kwdict);
3115 Py_DECREF(orig_kwdict);
3116 }
3117 if (kwdict == NULL)
3118 return NULL;
3119 while (--nk >= 0) {
3120 int err;
3121 PyObject *value = EXT_POP(*pp_stack);
3122 PyObject *key = EXT_POP(*pp_stack);
3123 if (PyDict_GetItem(kwdict, key) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +00003124 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00003125 "%.200s%s got multiple values "
Jeremy Hylton512a2372001-04-11 13:52:29 +00003126 "for keyword argument '%.200s'",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003127 PyEval_GetFuncName(func),
3128 PyEval_GetFuncDesc(func),
Jeremy Hylton512a2372001-04-11 13:52:29 +00003129 PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00003130 Py_DECREF(key);
3131 Py_DECREF(value);
3132 Py_DECREF(kwdict);
3133 return NULL;
3134 }
3135 err = PyDict_SetItem(kwdict, key, value);
3136 Py_DECREF(key);
3137 Py_DECREF(value);
3138 if (err) {
3139 Py_DECREF(kwdict);
3140 return NULL;
3141 }
3142 }
3143 return kwdict;
3144}
3145
3146static PyObject *
3147update_star_args(int nstack, int nstar, PyObject *stararg,
3148 PyObject ***pp_stack)
3149{
3150 PyObject *callargs, *w;
3151
3152 callargs = PyTuple_New(nstack + nstar);
3153 if (callargs == NULL) {
3154 return NULL;
3155 }
3156 if (nstar) {
3157 int i;
3158 for (i = 0; i < nstar; i++) {
3159 PyObject *a = PyTuple_GET_ITEM(stararg, i);
3160 Py_INCREF(a);
3161 PyTuple_SET_ITEM(callargs, nstack + i, a);
3162 }
3163 }
3164 while (--nstack >= 0) {
3165 w = EXT_POP(*pp_stack);
3166 PyTuple_SET_ITEM(callargs, nstack, w);
3167 }
3168 return callargs;
3169}
3170
3171static PyObject *
3172load_args(PyObject ***pp_stack, int na)
3173{
3174 PyObject *args = PyTuple_New(na);
3175 PyObject *w;
3176
3177 if (args == NULL)
3178 return NULL;
3179 while (--na >= 0) {
3180 w = EXT_POP(*pp_stack);
3181 PyTuple_SET_ITEM(args, na, w);
3182 }
3183 return args;
3184}
3185
3186static PyObject *
3187do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
3188{
3189 PyObject *callargs = NULL;
3190 PyObject *kwdict = NULL;
3191 PyObject *result = NULL;
3192
3193 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003194 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003195 if (kwdict == NULL)
3196 goto call_fail;
3197 }
3198 callargs = load_args(pp_stack, na);
3199 if (callargs == NULL)
3200 goto call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003201 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003202 call_fail:
3203 Py_XDECREF(callargs);
3204 Py_XDECREF(kwdict);
3205 return result;
3206}
3207
3208static PyObject *
3209ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3210{
3211 int nstar = 0;
3212 PyObject *callargs = NULL;
3213 PyObject *stararg = NULL;
3214 PyObject *kwdict = NULL;
3215 PyObject *result = NULL;
3216
3217 if (flags & CALL_FLAG_KW) {
3218 kwdict = EXT_POP(*pp_stack);
3219 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003220 PyErr_Format(PyExc_TypeError,
Jeremy Hylton512a2372001-04-11 13:52:29 +00003221 "%s%s argument after ** "
3222 "must be a dictionary",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003223 PyEval_GetFuncName(func),
3224 PyEval_GetFuncDesc(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00003225 goto ext_call_fail;
3226 }
3227 }
3228 if (flags & CALL_FLAG_VAR) {
3229 stararg = EXT_POP(*pp_stack);
3230 if (!PyTuple_Check(stararg)) {
3231 PyObject *t = NULL;
3232 t = PySequence_Tuple(stararg);
3233 if (t == NULL) {
Jeremy Hylton512a2372001-04-11 13:52:29 +00003234 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
3235 PyErr_Format(PyExc_TypeError,
3236 "%s%s argument after * "
3237 "must be a sequence",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003238 PyEval_GetFuncName(func),
3239 PyEval_GetFuncDesc(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003240 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003241 goto ext_call_fail;
3242 }
3243 Py_DECREF(stararg);
3244 stararg = t;
3245 }
3246 nstar = PyTuple_GET_SIZE(stararg);
3247 }
3248 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003249 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003250 if (kwdict == NULL)
3251 goto ext_call_fail;
3252 }
3253 callargs = update_star_args(na, nstar, stararg, pp_stack);
3254 if (callargs == NULL)
3255 goto ext_call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003256 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003257 ext_call_fail:
3258 Py_XDECREF(callargs);
3259 Py_XDECREF(kwdict);
3260 Py_XDECREF(stararg);
3261 return result;
3262}
3263
Guido van Rossum3b9c6671996-07-30 18:40:29 +00003264#define SLICE_ERROR_MSG \
3265 "standard sequence type does not support step size other than one"
3266
Guido van Rossumb209a111997-04-29 18:18:01 +00003267static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003268loop_subscript(PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003269{
Guido van Rossumb209a111997-04-29 18:18:01 +00003270 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00003271 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003272 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003273 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003274 return NULL;
3275 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003276 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00003277 v = (*sq->sq_item)(v, i);
3278 if (v)
3279 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00003280 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00003281 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00003282 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003283}
3284
Guido van Rossum20c6add2000-05-08 14:06:50 +00003285/* Extract a slice index from a PyInt or PyLong, the index is bound to
3286 the range [-INT_MAX+1, INTMAX]. Returns 0 and an exception if there is
3287 and error. Returns 1 on success.*/
3288
3289int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003290_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003291{
3292 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003293 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003294 if (PyInt_Check(v)) {
3295 x = PyInt_AsLong(v);
3296 } else if (PyLong_Check(v)) {
3297 x = PyLong_AsLong(v);
3298 if (x==-1 && PyErr_Occurred()) {
3299 PyObject *long_zero;
Guido van Rossumac7be682001-01-17 15:42:30 +00003300 int cmp;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003301
Guido van Rossumac7be682001-01-17 15:42:30 +00003302 if (!PyErr_ExceptionMatches(
3303 PyExc_OverflowError)) {
3304 /* It's not an overflow error, so just
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003305 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00003306 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003307 }
3308
Guido van Rossumac7be682001-01-17 15:42:30 +00003309 /* Clear the OverflowError */
3310 PyErr_Clear();
3311
3312 /* It's an overflow error, so we need to
3313 check the sign of the long integer,
3314 set the value to INT_MAX or 0, and clear
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003315 the error. */
3316
3317 /* Create a long integer with a value of 0 */
Guido van Rossumac7be682001-01-17 15:42:30 +00003318 long_zero = PyLong_FromLong(0L);
Guido van Rossum20c6add2000-05-08 14:06:50 +00003319 if (long_zero == NULL) return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003320
3321 /* Check sign */
Guido van Rossumac7be682001-01-17 15:42:30 +00003322 cmp = PyObject_RichCompareBool(v, long_zero,
3323 Py_GT);
3324 Py_DECREF(long_zero);
3325 if (cmp < 0)
3326 return 0;
3327 else if (cmp > 0)
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003328 x = INT_MAX;
3329 else
3330 x = 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003331 }
3332 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003333 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003334 "slice indices must be integers");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003335 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003336 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003337 /* Truncate -- very long indices are truncated anyway */
3338 if (x > INT_MAX)
3339 x = INT_MAX;
3340 else if (x < -INT_MAX)
3341 x = 0;
3342 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003343 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003344 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003345}
3346
Guido van Rossum50d756e2001-08-18 17:43:36 +00003347#undef ISINT
3348#define ISINT(x) ((x) == NULL || PyInt_Check(x) || PyLong_Check(x))
3349
Guido van Rossumb209a111997-04-29 18:18:01 +00003350static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003351apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003352{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003353 PyTypeObject *tp = u->ob_type;
3354 PySequenceMethods *sq = tp->tp_as_sequence;
3355
3356 if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) {
3357 int ilow = 0, ihigh = INT_MAX;
3358 if (!_PyEval_SliceIndex(v, &ilow))
3359 return NULL;
3360 if (!_PyEval_SliceIndex(w, &ihigh))
3361 return NULL;
3362 return PySequence_GetSlice(u, ilow, ihigh);
3363 }
3364 else {
3365 PyObject *slice = PySlice_New(v, w, NULL);
3366 if (slice != NULL)
3367 return PyObject_GetItem(u, slice);
3368 else
3369 return NULL;
3370 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003371}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003372
3373static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003374assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3375 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003376{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003377 PyTypeObject *tp = u->ob_type;
3378 PySequenceMethods *sq = tp->tp_as_sequence;
3379
3380 if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) {
3381 int ilow = 0, ihigh = INT_MAX;
3382 if (!_PyEval_SliceIndex(v, &ilow))
3383 return -1;
3384 if (!_PyEval_SliceIndex(w, &ihigh))
3385 return -1;
3386 if (x == NULL)
3387 return PySequence_DelSlice(u, ilow, ihigh);
3388 else
3389 return PySequence_SetSlice(u, ilow, ihigh, x);
3390 }
3391 else {
3392 PyObject *slice = PySlice_New(v, w, NULL);
3393 if (slice != NULL) {
3394 if (x != NULL)
3395 return PyObject_SetItem(u, slice, x);
3396 else
3397 return PyObject_DelItem(u, slice);
3398 }
3399 else
3400 return -1;
3401 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003402}
3403
Guido van Rossumb209a111997-04-29 18:18:01 +00003404static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003405cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003406{
Guido van Rossumac7be682001-01-17 15:42:30 +00003407 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003408 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00003409 case IS:
3410 case IS_NOT:
3411 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00003412 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003413 res = !res;
3414 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003415 case IN:
3416 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003417 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003418 if (res < 0)
3419 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00003420 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003421 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003422 break;
3423 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00003424 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003425 break;
3426 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003427 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003428 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003429 v = res ? Py_True : Py_False;
3430 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003431 return v;
3432}
3433
Thomas Wouters52152252000-08-17 22:55:00 +00003434static PyObject *
3435import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003436{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003437 PyObject *x;
3438
3439 x = PyObject_GetAttr(v, name);
3440 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00003441 PyErr_Format(PyExc_ImportError,
3442 "cannot import name %.230s",
3443 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003444 }
Thomas Wouters52152252000-08-17 22:55:00 +00003445 return x;
3446}
Guido van Rossumac7be682001-01-17 15:42:30 +00003447
Thomas Wouters52152252000-08-17 22:55:00 +00003448static int
3449import_all_from(PyObject *locals, PyObject *v)
3450{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003451 PyObject *all = PyObject_GetAttrString(v, "__all__");
3452 PyObject *dict, *name, *value;
3453 int skip_leading_underscores = 0;
3454 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003455
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003456 if (all == NULL) {
3457 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3458 return -1; /* Unexpected error */
3459 PyErr_Clear();
3460 dict = PyObject_GetAttrString(v, "__dict__");
3461 if (dict == NULL) {
3462 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3463 return -1;
3464 PyErr_SetString(PyExc_ImportError,
3465 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003466 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003467 }
3468 all = PyMapping_Keys(dict);
3469 Py_DECREF(dict);
3470 if (all == NULL)
3471 return -1;
3472 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003473 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003474
3475 for (pos = 0, err = 0; ; pos++) {
3476 name = PySequence_GetItem(all, pos);
3477 if (name == NULL) {
3478 if (!PyErr_ExceptionMatches(PyExc_IndexError))
3479 err = -1;
3480 else
3481 PyErr_Clear();
3482 break;
3483 }
3484 if (skip_leading_underscores &&
3485 PyString_Check(name) &&
3486 PyString_AS_STRING(name)[0] == '_')
3487 {
3488 Py_DECREF(name);
3489 continue;
3490 }
3491 value = PyObject_GetAttr(v, name);
3492 if (value == NULL)
3493 err = -1;
3494 else
3495 err = PyDict_SetItem(locals, name, value);
3496 Py_DECREF(name);
3497 Py_XDECREF(value);
3498 if (err != 0)
3499 break;
3500 }
3501 Py_DECREF(all);
3502 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003503}
3504
Guido van Rossumb209a111997-04-29 18:18:01 +00003505static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003506build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003507{
Guido van Rossum7851eea2001-09-12 19:19:18 +00003508 PyObject *metaclass = NULL, *result, *base;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003509
3510 if (PyDict_Check(methods))
3511 metaclass = PyDict_GetItemString(methods, "__metaclass__");
Guido van Rossum7851eea2001-09-12 19:19:18 +00003512 if (metaclass != NULL)
3513 Py_INCREF(methods);
3514 else if (PyTuple_Check(bases) && PyTuple_GET_SIZE(bases) > 0) {
3515 base = PyTuple_GET_ITEM(bases, 0);
3516 metaclass = PyObject_GetAttrString(base, "__class__");
3517 if (metaclass == NULL) {
3518 PyErr_Clear();
3519 metaclass = (PyObject *)base->ob_type;
3520 Py_INCREF(metaclass);
Guido van Rossum25831651993-05-19 14:50:45 +00003521 }
3522 }
Guido van Rossum7851eea2001-09-12 19:19:18 +00003523 else {
3524 PyObject *g = PyEval_GetGlobals();
3525 if (g != NULL && PyDict_Check(g))
3526 metaclass = PyDict_GetItemString(g, "__metaclass__");
3527 if (metaclass == NULL)
3528 metaclass = (PyObject *) &PyClass_Type;
3529 Py_INCREF(metaclass);
3530 }
3531 result = PyObject_CallFunction(metaclass, "OOO", name, bases, methods);
3532 Py_DECREF(metaclass);
3533 return result;
Guido van Rossum25831651993-05-19 14:50:45 +00003534}
3535
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003536static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003537exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3538 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003539{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003540 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003541 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003542 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003543
Guido van Rossumb209a111997-04-29 18:18:01 +00003544 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3545 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003546 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003547 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003548 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003549 locals = PyTuple_GetItem(prog, 2);
3550 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003551 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003552 if (globals == Py_None) {
3553 globals = PyEval_GetGlobals();
3554 if (locals == Py_None) {
3555 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003556 plain = 1;
3557 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003558 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003559 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003560 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003561 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003562 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003563 !PyCode_Check(prog) &&
3564 !PyFile_Check(prog)) {
3565 PyErr_SetString(PyExc_TypeError,
Guido van Rossumac7be682001-01-17 15:42:30 +00003566 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003567 return -1;
3568 }
Fred Drake661ea262000-10-24 19:57:45 +00003569 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003570 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003571 "exec: arg 2 must be a dictionary or None");
3572 return -1;
3573 }
3574 if (!PyDict_Check(locals)) {
3575 PyErr_SetString(PyExc_TypeError,
3576 "exec: arg 3 must be a dictionary or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003577 return -1;
3578 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003579 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003580 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003581 if (PyCode_Check(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003582 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003583 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003584 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003585 FILE *fp = PyFile_AsFile(prog);
3586 char *name = PyString_AsString(PyFile_Name(prog));
Tim Peters5ba58662001-07-16 02:29:45 +00003587 PyCompilerFlags cf;
3588 cf.cf_flags = 0;
3589 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003590 v = PyRun_FileFlags(fp, name, Py_file_input, globals,
3591 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003592 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003593 v = PyRun_File(fp, name, Py_file_input, globals,
3594 locals);
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003595 }
3596 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003597 char *str;
Tim Peters5ba58662001-07-16 02:29:45 +00003598 PyCompilerFlags cf;
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003599 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003600 return -1;
Tim Peters5ba58662001-07-16 02:29:45 +00003601 cf.cf_flags = 0;
3602 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003603 v = PyRun_StringFlags(str, Py_file_input, globals,
3604 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003605 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003606 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003607 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003608 if (plain)
3609 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003610 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003611 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003612 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003613 return 0;
3614}
Guido van Rossum24c13741995-02-14 09:42:43 +00003615
Guido van Rossumac7be682001-01-17 15:42:30 +00003616static void
Paul Prescode68140d2000-08-30 20:25:01 +00003617format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3618{
3619 char *obj_str;
3620
3621 if (!obj)
3622 return;
3623
3624 obj_str = PyString_AsString(obj);
3625 if (!obj_str)
3626 return;
3627
3628 PyErr_Format(exc, format_str, obj_str);
3629}
Guido van Rossum950361c1997-01-24 13:49:28 +00003630
3631#ifdef DYNAMIC_EXECUTION_PROFILE
3632
3633PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003634getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003635{
3636 int i;
3637 PyObject *l = PyList_New(256);
3638 if (l == NULL) return NULL;
3639 for (i = 0; i < 256; i++) {
3640 PyObject *x = PyInt_FromLong(a[i]);
3641 if (x == NULL) {
3642 Py_DECREF(l);
3643 return NULL;
3644 }
3645 PyList_SetItem(l, i, x);
3646 }
3647 for (i = 0; i < 256; i++)
3648 a[i] = 0;
3649 return l;
3650}
3651
3652PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003653_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003654{
3655#ifndef DXPAIRS
3656 return getarray(dxp);
3657#else
3658 int i;
3659 PyObject *l = PyList_New(257);
3660 if (l == NULL) return NULL;
3661 for (i = 0; i < 257; i++) {
3662 PyObject *x = getarray(dxpairs[i]);
3663 if (x == NULL) {
3664 Py_DECREF(l);
3665 return NULL;
3666 }
3667 PyList_SetItem(l, i, x);
3668 }
3669 return l;
3670#endif
3671}
3672
3673#endif