blob: 6eebf948e45b4837ae8fde2ab917e2fd90a5f7a6 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum3f5da241990-12-20 15:06:42 +00002/* Execute compiled code */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003
Guido van Rossum681d79a1995-07-18 14:51:37 +00004/* XXX TO DO:
Fred Drake5755ce62001-06-27 19:19:46 +00005 XXX how to pass arguments to profile and trace functions?
Guido van Rossum681d79a1995-07-18 14:51:37 +00006 XXX speed up searching for keywords by using a dictionary
Guido van Rossum681d79a1995-07-18 14:51:37 +00007 XXX document it!
8 */
9
Guido van Rossumb209a111997-04-29 18:18:01 +000010#include "Python.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000011
Guido van Rossum10dc2e81990-11-18 17:27:39 +000012#include "compile.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000013#include "frameobject.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000014#include "eval.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000015#include "opcode.h"
Tim Peters6d6c1a32001-08-02 04:15:00 +000016#include "structmember.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000017
Jack Jansencbf630f2000-07-11 21:59:16 +000018#ifdef macintosh
19#include "macglue.h"
20#endif
21
Guido van Rossumc6004111993-11-05 10:22:19 +000022#include <ctype.h>
23
Guido van Rossum04691fc1992-08-12 15:35:34 +000024/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000025/* #define CASE_TOO_BIG 1 */
Guido van Rossum04691fc1992-08-12 15:35:34 +000026
Guido van Rossum408027e1996-12-30 16:17:54 +000027#ifdef Py_DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000028/* For debugging the interpreter: */
29#define LLTRACE 1 /* Low-level trace feature */
30#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000031#endif
32
Jeremy Hylton52820442001-01-03 23:52:36 +000033typedef PyObject *(*callproc)(PyObject *, PyObject *, PyObject *);
Guido van Rossum5b722181993-03-30 17:46:03 +000034
Guido van Rossum374a9221991-04-04 10:40:29 +000035/* Forward declarations */
Tim Peters5ca576e2001-06-18 22:08:13 +000036static PyObject *eval_frame(PyFrameObject *);
Jeremy Hylton52820442001-01-03 23:52:36 +000037static PyObject *fast_function(PyObject *, PyObject ***, int, int, int);
38static PyObject *fast_cfunction(PyObject *, PyObject ***, int);
39static PyObject *do_call(PyObject *, PyObject ***, int, int);
40static PyObject *ext_do_call(PyObject *, PyObject ***, int, int, int);
Guido van Rossumac7be682001-01-17 15:42:30 +000041static PyObject *update_keyword_args(PyObject *, int, PyObject ***,PyObject *);
Ka-Ping Yee20579702001-01-15 22:14:16 +000042static PyObject *update_star_args(int, int, PyObject *, PyObject ***);
Jeremy Hylton52820442001-01-03 23:52:36 +000043static PyObject *load_args(PyObject ***, int);
44#define CALL_FLAG_VAR 1
45#define CALL_FLAG_KW 2
46
Guido van Rossum0a066c01992-03-27 17:29:15 +000047#ifdef LLTRACE
Tim Petersdbd9ba62000-07-09 03:09:57 +000048static int prtrace(PyObject *, char *);
Guido van Rossum0a066c01992-03-27 17:29:15 +000049#endif
Fred Drake5755ce62001-06-27 19:19:46 +000050static int call_trace(Py_tracefunc, PyObject *, PyFrameObject *,
51 int, PyObject *);
52static void call_exc_trace(Py_tracefunc, PyObject *, PyFrameObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000053static PyObject *loop_subscript(PyObject *, PyObject *);
54static PyObject *apply_slice(PyObject *, PyObject *, PyObject *);
55static int assign_slice(PyObject *, PyObject *,
56 PyObject *, PyObject *);
57static PyObject *cmp_outcome(int, PyObject *, PyObject *);
Thomas Wouters52152252000-08-17 22:55:00 +000058static PyObject *import_from(PyObject *, PyObject *);
59static int import_all_from(PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000060static PyObject *build_class(PyObject *, PyObject *, PyObject *);
61static int exec_statement(PyFrameObject *,
62 PyObject *, PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000063static void set_exc_info(PyThreadState *, PyObject *, PyObject *, PyObject *);
64static void reset_exc_info(PyThreadState *);
Paul Prescode68140d2000-08-30 20:25:01 +000065static void format_exc_check_arg(PyObject *, char *, PyObject *);
Guido van Rossum374a9221991-04-04 10:40:29 +000066
Paul Prescode68140d2000-08-30 20:25:01 +000067#define NAME_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000068 "name '%.200s' is not defined"
Jeremy Hylton64949cb2001-01-25 20:06:59 +000069#define GLOBAL_NAME_ERROR_MSG \
70 "global name '%.200s' is not defined"
Paul Prescode68140d2000-08-30 20:25:01 +000071#define UNBOUNDLOCAL_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000072 "local variable '%.200s' referenced before assignment"
Jeremy Hyltonc76770c2001-04-13 16:51:46 +000073#define UNBOUNDFREE_ERROR_MSG \
74 "free variable '%.200s' referenced before assignment" \
75 " in enclosing scope"
Guido van Rossum374a9221991-04-04 10:40:29 +000076
Guido van Rossum950361c1997-01-24 13:49:28 +000077/* Dynamic execution profile */
78#ifdef DYNAMIC_EXECUTION_PROFILE
79#ifdef DXPAIRS
80static long dxpairs[257][256];
81#define dxp dxpairs[256]
82#else
83static long dxp[256];
84#endif
85#endif
86
Tim Peters5ca576e2001-06-18 22:08:13 +000087staticforward PyTypeObject gentype;
88
89typedef struct {
90 PyObject_HEAD
Tim Petersd8e1c9e2001-06-26 20:58:58 +000091 /* The gi_ prefix is intended to remind of generator-iterator. */
92
93 PyFrameObject *gi_frame;
94
Tim Peterse77f2e22001-06-26 22:24:51 +000095 /* True if generator is being executed. */
96 int gi_running;
Tim Peters5ca576e2001-06-18 22:08:13 +000097} genobject;
98
99static PyObject *
100gen_new(PyFrameObject *f)
101{
102 genobject *gen = PyObject_New(genobject, &gentype);
103 if (gen == NULL) {
104 Py_DECREF(f);
105 return NULL;
106 }
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000107 gen->gi_frame = f;
108 gen->gi_running = 0;
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000109 PyObject_GC_Init(gen);
Tim Peters5ca576e2001-06-18 22:08:13 +0000110 return (PyObject *)gen;
111}
112
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000113static int
114gen_traverse(genobject *gen, visitproc visit, void *arg)
115{
116 return visit((PyObject *)gen->gi_frame, arg);
117}
118
Tim Peters5ca576e2001-06-18 22:08:13 +0000119static void
120gen_dealloc(genobject *gen)
121{
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000122 PyObject_GC_Fini(gen);
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000123 Py_DECREF(gen->gi_frame);
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000124 PyObject_Del(gen);
Tim Peters5ca576e2001-06-18 22:08:13 +0000125}
126
127static PyObject *
128gen_iternext(genobject *gen)
129{
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000130 PyThreadState *tstate = PyThreadState_GET();
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000131 PyFrameObject *f = gen->gi_frame;
Tim Peters5ca576e2001-06-18 22:08:13 +0000132 PyObject *result;
133
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000134 if (gen->gi_running) {
Tim Peters5ca576e2001-06-18 22:08:13 +0000135 PyErr_SetString(PyExc_ValueError,
136 "generator already executing");
137 return NULL;
138 }
Tim Peters8c963692001-06-23 05:26:56 +0000139 if (f->f_stacktop == NULL)
Tim Peters5ca576e2001-06-18 22:08:13 +0000140 return NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000141
142 /* Generators always return to their most recent caller, not
143 * necessarily their creator. */
Tim Peters5eb4b872001-06-23 05:47:56 +0000144 Py_XINCREF(tstate->frame);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000145 assert(f->f_back == NULL);
146 f->f_back = tstate->frame;
147
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000148 gen->gi_running = 1;
Tim Peters5ca576e2001-06-18 22:08:13 +0000149 result = eval_frame(f);
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000150 gen->gi_running = 0;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000151
152 /* Don't keep the reference to f_back any longer than necessary. It
153 * may keep a chain of frames alive or it could create a reference
154 * cycle. */
Tim Peters5eb4b872001-06-23 05:47:56 +0000155 Py_XDECREF(f->f_back);
Tim Peters6302ec62001-06-20 06:57:32 +0000156 f->f_back = NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000157
Tim Petersad1a18b2001-06-23 06:19:16 +0000158 /* If the generator just returned (as opposed to yielding), signal
159 * that the generator is exhausted. */
160 if (result == Py_None && f->f_stacktop == NULL) {
161 Py_DECREF(result);
162 result = NULL;
163 }
164
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000165 return result;
Tim Peters5ca576e2001-06-18 22:08:13 +0000166}
167
168static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000169gen_next(genobject *gen)
Tim Peters5ca576e2001-06-18 22:08:13 +0000170{
171 PyObject *result;
172
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000173 result = gen_iternext(gen);
Tim Peters5ca576e2001-06-18 22:08:13 +0000174
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000175 if (result == NULL && !PyErr_Occurred()) {
Tim Peters5ca576e2001-06-18 22:08:13 +0000176 PyErr_SetObject(PyExc_StopIteration, Py_None);
177 return NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000178 }
Tim Peters5ca576e2001-06-18 22:08:13 +0000179
180 return result;
181}
182
183static PyObject *
184gen_getiter(PyObject *gen)
185{
186 Py_INCREF(gen);
187 return gen;
188}
189
190static struct PyMethodDef gen_methods[] = {
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000191 {"next", (PyCFunction)gen_next, METH_NOARGS,
Tim Peterse77f2e22001-06-26 22:24:51 +0000192 "next() -- get the next value, or raise StopIteration"},
Tim Peters5ca576e2001-06-18 22:08:13 +0000193 {NULL, NULL} /* Sentinel */
194};
195
Tim Peters6d6c1a32001-08-02 04:15:00 +0000196static struct memberlist gen_memberlist[] = {
197 {"gi_frame", T_OBJECT, offsetof(genobject, gi_frame), RO},
198 {"gi_running", T_INT, offsetof(genobject, gi_running), RO},
199 {NULL} /* Sentinel */
200};
Tim Peters5ca576e2001-06-18 22:08:13 +0000201
202statichere PyTypeObject gentype = {
203 PyObject_HEAD_INIT(&PyType_Type)
204 0, /* ob_size */
205 "generator", /* tp_name */
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000206 sizeof(genobject) + PyGC_HEAD_SIZE, /* tp_basicsize */
Tim Peters5ca576e2001-06-18 22:08:13 +0000207 0, /* tp_itemsize */
208 /* methods */
209 (destructor)gen_dealloc, /* tp_dealloc */
210 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000211 0, /* tp_getattr */
Tim Peters5ca576e2001-06-18 22:08:13 +0000212 0, /* tp_setattr */
213 0, /* tp_compare */
214 0, /* tp_repr */
215 0, /* tp_as_number */
216 0, /* tp_as_sequence */
217 0, /* tp_as_mapping */
218 0, /* tp_hash */
219 0, /* tp_call */
220 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000221 PyObject_GenericGetAttr, /* tp_getattro */
Tim Peters5ca576e2001-06-18 22:08:13 +0000222 0, /* tp_setattro */
223 0, /* tp_as_buffer */
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000224 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /* tp_flags */
Tim Peters5ca576e2001-06-18 22:08:13 +0000225 0, /* tp_doc */
Neil Schemenauerf8c7c202001-07-12 13:27:49 +0000226 (traverseproc)gen_traverse, /* tp_traverse */
Tim Peters5ca576e2001-06-18 22:08:13 +0000227 0, /* tp_clear */
228 0, /* tp_richcompare */
229 0, /* tp_weaklistoffset */
230 (getiterfunc)gen_getiter, /* tp_iter */
231 (iternextfunc)gen_iternext, /* tp_iternext */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000232 gen_methods, /* tp_methods */
233 gen_memberlist, /* tp_members */
234 0, /* tp_getset */
235 0, /* tp_base */
236 0, /* tp_dict */
Tim Peters5ca576e2001-06-18 22:08:13 +0000237};
238
239
Guido van Rossume59214e1994-08-30 08:01:59 +0000240#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000241
Guido van Rossum2571cc81999-04-07 16:07:23 +0000242#ifndef DONT_HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000243#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +0000244#endif
Guido van Rossum49b56061998-10-01 20:42:43 +0000245#include "pythread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000246
Guido van Rossuma027efa1997-05-05 20:56:21 +0000247extern int _PyThread_Started; /* Flag for Py_Exit */
248
Guido van Rossum65d5b571998-12-21 19:32:43 +0000249static PyThread_type_lock interpreter_lock = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000250static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000251
252void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000253PyEval_InitThreads(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000254{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000255 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000256 return;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000257 _PyThread_Started = 1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000258 interpreter_lock = PyThread_allocate_lock();
259 PyThread_acquire_lock(interpreter_lock, 1);
260 main_thread = PyThread_get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000261}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000262
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000263void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000264PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000265{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000266 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000267}
268
269void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000270PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000271{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000272 PyThread_release_lock(interpreter_lock);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000273}
274
275void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000276PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000277{
278 if (tstate == NULL)
279 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000280 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000281 if (PyThreadState_Swap(tstate) != NULL)
282 Py_FatalError(
283 "PyEval_AcquireThread: non-NULL old thread state");
284}
285
286void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000287PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000288{
289 if (tstate == NULL)
290 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
291 if (PyThreadState_Swap(NULL) != tstate)
292 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000293 PyThread_release_lock(interpreter_lock);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000294}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000295
296/* This function is called from PyOS_AfterFork to ensure that newly
297 created child processes don't hold locks referring to threads which
298 are not running in the child process. (This could also be done using
299 pthread_atfork mechanism, at least for the pthreads implementation.) */
300
301void
302PyEval_ReInitThreads(void)
303{
304 if (!interpreter_lock)
305 return;
306 /*XXX Can't use PyThread_free_lock here because it does too
307 much error-checking. Doing this cleanly would require
308 adding a new function to each thread_*.h. Instead, just
309 create a new lock and waste a little bit of memory */
310 interpreter_lock = PyThread_allocate_lock();
311 PyThread_acquire_lock(interpreter_lock, 1);
312 main_thread = PyThread_get_thread_ident();
313}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000314#endif
315
Guido van Rossumff4949e1992-08-05 19:58:53 +0000316/* Functions save_thread and restore_thread are always defined so
317 dynamically loaded modules needn't be compiled separately for use
318 with and without threads: */
319
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000320PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000321PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000322{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000323 PyThreadState *tstate = PyThreadState_Swap(NULL);
324 if (tstate == NULL)
325 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000326#ifdef WITH_THREAD
Guido van Rossumb74eca91997-09-30 22:03:16 +0000327 if (interpreter_lock)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000328 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000329#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000330 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000331}
332
333void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000334PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000335{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000336 if (tstate == NULL)
337 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000338#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000339 if (interpreter_lock) {
Guido van Rossumb74eca91997-09-30 22:03:16 +0000340 int err = errno;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000341 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000342 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000343 }
344#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000345 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000346}
347
348
Guido van Rossuma9672091994-09-14 13:31:22 +0000349/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
350 signal handlers or Mac I/O completion routines) can schedule calls
351 to a function to be called synchronously.
352 The synchronous function is called with one void* argument.
353 It should return 0 for success or -1 for failure -- failure should
354 be accompanied by an exception.
355
356 If registry succeeds, the registry function returns 0; if it fails
357 (e.g. due to too many pending calls) it returns -1 (without setting
358 an exception condition).
359
360 Note that because registry may occur from within signal handlers,
361 or other asynchronous events, calling malloc() is unsafe!
362
363#ifdef WITH_THREAD
364 Any thread can schedule pending calls, but only the main thread
365 will execute them.
366#endif
367
368 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
369 There are two possible race conditions:
370 (1) nested asynchronous registry calls;
371 (2) registry calls made while pending calls are being processed.
372 While (1) is very unlikely, (2) is a real possibility.
373 The current code is safe against (2), but not against (1).
374 The safety against (2) is derived from the fact that only one
375 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000376
Guido van Rossuma027efa1997-05-05 20:56:21 +0000377 XXX Darn! With the advent of thread state, we should have an array
378 of pending calls per thread in the thread state! Later...
379*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000380
Guido van Rossuma9672091994-09-14 13:31:22 +0000381#define NPENDINGCALLS 32
382static struct {
Thomas Wouters334fb892000-07-25 12:56:38 +0000383 int (*func)(void *);
384 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000385} pendingcalls[NPENDINGCALLS];
386static volatile int pendingfirst = 0;
387static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000388static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000389
390int
Thomas Wouters334fb892000-07-25 12:56:38 +0000391Py_AddPendingCall(int (*func)(void *), void *arg)
Guido van Rossuma9672091994-09-14 13:31:22 +0000392{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000393 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000394 int i, j;
395 /* XXX Begin critical section */
396 /* XXX If you want this to be safe against nested
397 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000398 if (busy)
399 return -1;
400 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000401 i = pendinglast;
402 j = (i + 1) % NPENDINGCALLS;
403 if (j == pendingfirst)
404 return -1; /* Queue full */
405 pendingcalls[i].func = func;
406 pendingcalls[i].arg = arg;
407 pendinglast = j;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000408 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000409 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000410 /* XXX End critical section */
411 return 0;
412}
413
Guido van Rossum180d7b41994-09-29 09:45:57 +0000414int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000415Py_MakePendingCalls(void)
Guido van Rossuma9672091994-09-14 13:31:22 +0000416{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000417 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000418#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000419 if (main_thread && PyThread_get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000420 return 0;
421#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000422 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000423 return 0;
424 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000425 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000426 for (;;) {
427 int i;
Thomas Wouters334fb892000-07-25 12:56:38 +0000428 int (*func)(void *);
429 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000430 i = pendingfirst;
431 if (i == pendinglast)
432 break; /* Queue empty */
433 func = pendingcalls[i].func;
434 arg = pendingcalls[i].arg;
435 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000436 if (func(arg) < 0) {
437 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000438 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000439 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000440 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000441 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000442 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000443 return 0;
444}
445
446
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000447/* The interpreter's recursion limit */
448
Guido van Rossum349ff6f2000-09-01 01:52:08 +0000449static int recursion_limit = 1000;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000450
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000451int
452Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000453{
454 return recursion_limit;
455}
456
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000457void
458Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000459{
460 recursion_limit = new_limit;
461}
462
Guido van Rossum374a9221991-04-04 10:40:29 +0000463/* Status code for main loop (reason for stack unwind) */
464
465enum why_code {
466 WHY_NOT, /* No error */
467 WHY_EXCEPTION, /* Exception occurred */
468 WHY_RERAISE, /* Exception re-raised by 'finally' */
469 WHY_RETURN, /* 'return' statement */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +0000470 WHY_BREAK, /* 'break' statement */
Tim Peters5ca576e2001-06-18 22:08:13 +0000471 WHY_CONTINUE, /* 'continue' statement */
472 WHY_YIELD, /* 'yield' operator */
Guido van Rossum374a9221991-04-04 10:40:29 +0000473};
474
Tim Petersdbd9ba62000-07-09 03:09:57 +0000475static enum why_code do_raise(PyObject *, PyObject *, PyObject *);
Tim Petersd6d010b2001-06-21 02:49:55 +0000476static int unpack_iterable(PyObject *, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000477
Guido van Rossum374a9221991-04-04 10:40:29 +0000478
Guido van Rossumb209a111997-04-29 18:18:01 +0000479PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000480PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000481{
Tim Peters6d6c1a32001-08-02 04:15:00 +0000482 return PyEval_EvalCodeEx(co,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000483 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000484 (PyObject **)NULL, 0,
485 (PyObject **)NULL, 0,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000486 (PyObject **)NULL, 0,
487 NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000488}
489
490
491/* Interpreter main loop */
492
Tim Peters6d6c1a32001-08-02 04:15:00 +0000493static PyObject *
Tim Peters5ca576e2001-06-18 22:08:13 +0000494eval_frame(PyFrameObject *f)
Guido van Rossum374a9221991-04-04 10:40:29 +0000495{
Guido van Rossum950361c1997-01-24 13:49:28 +0000496#ifdef DXPAIRS
497 int lastopcode = 0;
498#endif
Jeremy Hylton52820442001-01-03 23:52:36 +0000499 PyObject **stack_pointer;
Guido van Rossum374a9221991-04-04 10:40:29 +0000500 register unsigned char *next_instr;
Moshe Zadkaaa39a7e2000-08-07 06:34:45 +0000501 register int opcode=0; /* Current opcode */
502 register int oparg=0; /* Current opcode argument, if any */
Guido van Rossum374a9221991-04-04 10:40:29 +0000503 register enum why_code why; /* Reason for block stack unwind */
504 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000505 register PyObject *x; /* Result object -- NULL if error */
506 register PyObject *v; /* Temporary objects popped off stack */
507 register PyObject *w;
508 register PyObject *u;
509 register PyObject *t;
Barry Warsaw23c9ec82000-08-21 15:44:01 +0000510 register PyObject *stream = NULL; /* for PRINT opcodes */
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000511 register PyObject **fastlocals, **freevars;
Guido van Rossum014518f1998-11-23 21:09:51 +0000512 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000513 PyThreadState *tstate = PyThreadState_GET();
Tim Peters5ca576e2001-06-18 22:08:13 +0000514 PyCodeObject *co;
Guido van Rossumd076c731998-10-07 19:42:25 +0000515 unsigned char *first_instr;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000516#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000517 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000518#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000519#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000520 /* Make it easier to find out where we are with a debugger */
Tim Peters5ca576e2001-06-18 22:08:13 +0000521 char *filename;
Guido van Rossum99bec951992-09-03 20:29:45 +0000522#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000523
524/* Code access macros */
525
526#define GETCONST(i) Getconst(f, i)
527#define GETNAME(i) Getname(f, i)
528#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumd076c731998-10-07 19:42:25 +0000529#define INSTR_OFFSET() (next_instr - first_instr)
Guido van Rossum374a9221991-04-04 10:40:29 +0000530#define NEXTOP() (*next_instr++)
531#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossumd076c731998-10-07 19:42:25 +0000532#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000533#define JUMPBY(x) (next_instr += (x))
534
535/* Stack manipulation macros */
536
537#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
538#define EMPTY() (STACK_LEVEL() == 0)
539#define TOP() (stack_pointer[-1])
540#define BASIC_PUSH(v) (*stack_pointer++ = (v))
541#define BASIC_POP() (*--stack_pointer)
542
Guido van Rossum96a42c81992-01-12 02:29:51 +0000543#ifdef LLTRACE
544#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
545#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000546#else
547#define PUSH(v) BASIC_PUSH(v)
548#define POP() BASIC_POP()
549#endif
550
Guido van Rossum46add982001-08-30 16:06:23 +0000551/* Strict int check macros */
552#define ISSTRICTINT(v) ((v)->ob_type == &PyInt_Type)
553
Guido van Rossum681d79a1995-07-18 14:51:37 +0000554/* Local variable macros */
555
556#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumb209a111997-04-29 18:18:01 +0000557#define SETLOCAL(i, value) do { Py_XDECREF(GETLOCAL(i)); \
Guido van Rossum681d79a1995-07-18 14:51:37 +0000558 GETLOCAL(i) = value; } while (0)
559
Guido van Rossuma027efa1997-05-05 20:56:21 +0000560/* Start of code */
561
Tim Peters5ca576e2001-06-18 22:08:13 +0000562 if (f == NULL)
563 return NULL;
564
Guido van Rossum8861b741996-07-30 16:49:37 +0000565#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000566 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000567 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000568 return NULL;
569 }
570#endif
571
Tim Peters5ca576e2001-06-18 22:08:13 +0000572 /* push frame */
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000573 if (++tstate->recursion_depth > recursion_limit) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000574 --tstate->recursion_depth;
575 PyErr_SetString(PyExc_RuntimeError,
Fred Drake661ea262000-10-24 19:57:45 +0000576 "maximum recursion depth exceeded");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000577 tstate->frame = f->f_back;
Guido van Rossum8861b741996-07-30 16:49:37 +0000578 return NULL;
579 }
580
Tim Peters5ca576e2001-06-18 22:08:13 +0000581 tstate->frame = f;
Tim Peters5ca576e2001-06-18 22:08:13 +0000582 co = f->f_code;
583 fastlocals = f->f_localsplus;
584 freevars = f->f_localsplus + f->f_nlocals;
Guido van Rossumd076c731998-10-07 19:42:25 +0000585 _PyCode_GETCODEPTR(co, &first_instr);
Tim Peters5ca576e2001-06-18 22:08:13 +0000586 next_instr = first_instr + f->f_lasti;
Tim Peters8c963692001-06-23 05:26:56 +0000587 stack_pointer = f->f_stacktop;
588 assert(stack_pointer != NULL);
589 f->f_stacktop = NULL;
Tim Peters5ca576e2001-06-18 22:08:13 +0000590
591#ifdef LLTRACE
592 lltrace = PyDict_GetItemString(f->f_globals,"__lltrace__") != NULL;
593#endif
594#if defined(Py_DEBUG) || defined(LLTRACE)
595 filename = PyString_AsString(co->co_filename);
596#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000597
Guido van Rossum374a9221991-04-04 10:40:29 +0000598 why = WHY_NOT;
599 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000600 x = Py_None; /* Not a reference, just anything non-NULL */
Fred Drake48fba732000-10-11 13:54:07 +0000601 w = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +0000602
Guido van Rossum374a9221991-04-04 10:40:29 +0000603 for (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000604 /* Do periodic things. Doing this every time through
605 the loop would add too much overhead, so we do it
606 only every Nth instruction. We also do it if
607 ``things_to_do'' is set, i.e. when an asynchronous
608 event needs attention (e.g. a signal handler or
609 async I/O handler); see Py_AddPendingCall() and
610 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +0000611
Guido van Rossuma027efa1997-05-05 20:56:21 +0000612 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000613 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000614 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000615 if (Py_MakePendingCalls() < 0) {
616 why = WHY_EXCEPTION;
617 goto on_error;
618 }
619 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000620#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000621 /* If we have true signals, the signal handler
622 will call Py_AddPendingCall() so we don't
623 have to call sigcheck(). On the Mac and
624 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000625 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000626 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000627 goto on_error;
628 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000629#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000630
Guido van Rossume59214e1994-08-30 08:01:59 +0000631#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000632 if (interpreter_lock) {
633 /* Give another thread a chance */
634
Guido van Rossum25ce5661997-08-02 03:10:38 +0000635 if (PyThreadState_Swap(NULL) != tstate)
636 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000637 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000638
639 /* Other threads may run now */
640
Guido van Rossum65d5b571998-12-21 19:32:43 +0000641 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000642 if (PyThreadState_Swap(tstate) != NULL)
643 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000644 }
645#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000646 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000647
Guido van Rossum374a9221991-04-04 10:40:29 +0000648 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000649
Guido van Rossum408027e1996-12-30 16:17:54 +0000650#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000651 f->f_lasti = INSTR_OFFSET();
652#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000653
Guido van Rossum374a9221991-04-04 10:40:29 +0000654 opcode = NEXTOP();
655 if (HAS_ARG(opcode))
656 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000657 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000658#ifdef DYNAMIC_EXECUTION_PROFILE
659#ifdef DXPAIRS
660 dxpairs[lastopcode][opcode]++;
661 lastopcode = opcode;
662#endif
663 dxp[opcode]++;
664#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000665
Guido van Rossum96a42c81992-01-12 02:29:51 +0000666#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000667 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +0000668
Guido van Rossum96a42c81992-01-12 02:29:51 +0000669 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000670 if (HAS_ARG(opcode)) {
671 printf("%d: %d, %d\n",
672 (int) (INSTR_OFFSET() - 3),
673 opcode, oparg);
674 }
675 else {
676 printf("%d: %d\n",
677 (int) (INSTR_OFFSET() - 1), opcode);
678 }
679 }
680#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000681 /* Main switch on opcode */
Jeremy Hylton52820442001-01-03 23:52:36 +0000682
Guido van Rossum374a9221991-04-04 10:40:29 +0000683 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000684
Guido van Rossum374a9221991-04-04 10:40:29 +0000685 /* BEWARE!
686 It is essential that any operation that fails sets either
687 x to NULL, err to nonzero, or why to anything but WHY_NOT,
688 and that no operation that succeeds does this! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000689
Guido van Rossum374a9221991-04-04 10:40:29 +0000690 /* case STOP_CODE: this is an error! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000691
Guido van Rossum374a9221991-04-04 10:40:29 +0000692 case POP_TOP:
693 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000694 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000695 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000696
Guido van Rossum374a9221991-04-04 10:40:29 +0000697 case ROT_TWO:
698 v = POP();
699 w = POP();
700 PUSH(v);
701 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000702 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000703
Guido van Rossum374a9221991-04-04 10:40:29 +0000704 case ROT_THREE:
705 v = POP();
706 w = POP();
707 x = POP();
708 PUSH(v);
709 PUSH(x);
710 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000711 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000712
Thomas Wouters434d0822000-08-24 20:11:32 +0000713 case ROT_FOUR:
714 u = POP();
715 v = POP();
716 w = POP();
717 x = POP();
718 PUSH(u);
719 PUSH(x);
720 PUSH(w);
721 PUSH(v);
722 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000723
Guido van Rossum374a9221991-04-04 10:40:29 +0000724 case DUP_TOP:
725 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000726 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000727 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000728 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000729
Thomas Wouters434d0822000-08-24 20:11:32 +0000730 case DUP_TOPX:
731 switch (oparg) {
Thomas Wouters434d0822000-08-24 20:11:32 +0000732 case 1:
Tim Peters35ba6892000-10-11 07:04:49 +0000733 x = TOP();
734 Py_INCREF(x);
735 PUSH(x);
736 continue;
737 case 2:
Thomas Wouters434d0822000-08-24 20:11:32 +0000738 x = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000739 Py_INCREF(x);
740 w = TOP();
741 Py_INCREF(w);
742 PUSH(x);
743 PUSH(w);
744 PUSH(x);
745 continue;
746 case 3:
747 x = POP();
748 Py_INCREF(x);
Thomas Wouters434d0822000-08-24 20:11:32 +0000749 w = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000750 Py_INCREF(w);
751 v = TOP();
752 Py_INCREF(v);
753 PUSH(w);
754 PUSH(x);
755 PUSH(v);
756 PUSH(w);
757 PUSH(x);
758 continue;
759 case 4:
760 x = POP();
761 Py_INCREF(x);
762 w = POP();
763 Py_INCREF(w);
Thomas Wouters434d0822000-08-24 20:11:32 +0000764 v = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000765 Py_INCREF(v);
766 u = TOP();
767 Py_INCREF(u);
768 PUSH(v);
769 PUSH(w);
770 PUSH(x);
771 PUSH(u);
772 PUSH(v);
773 PUSH(w);
774 PUSH(x);
775 continue;
776 case 5:
777 x = POP();
778 Py_INCREF(x);
779 w = POP();
780 Py_INCREF(w);
781 v = POP();
782 Py_INCREF(v);
Thomas Wouters434d0822000-08-24 20:11:32 +0000783 u = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000784 Py_INCREF(u);
785 t = TOP();
786 Py_INCREF(t);
787 PUSH(u);
788 PUSH(v);
789 PUSH(w);
790 PUSH(x);
791 PUSH(t);
792 PUSH(u);
793 PUSH(v);
794 PUSH(w);
795 PUSH(x);
796 continue;
Thomas Wouters434d0822000-08-24 20:11:32 +0000797 default:
Thomas Wouters0be483f2000-10-11 23:26:11 +0000798 Py_FatalError("invalid argument to DUP_TOPX"
799 " (bytecode corruption?)");
Thomas Wouters434d0822000-08-24 20:11:32 +0000800 }
Tim Peters35ba6892000-10-11 07:04:49 +0000801 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000802
Guido van Rossum374a9221991-04-04 10:40:29 +0000803 case UNARY_POSITIVE:
804 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000805 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000806 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000807 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000808 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000809 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000810
Guido van Rossum374a9221991-04-04 10:40:29 +0000811 case UNARY_NEGATIVE:
812 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000813 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000814 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000815 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000816 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000817 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000818
Guido van Rossum374a9221991-04-04 10:40:29 +0000819 case UNARY_NOT:
820 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000821 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000822 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000823 if (err == 0) {
824 Py_INCREF(Py_True);
825 PUSH(Py_True);
826 continue;
827 }
828 else if (err > 0) {
829 Py_INCREF(Py_False);
830 PUSH(Py_False);
831 err = 0;
832 continue;
833 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000834 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000835
Guido van Rossum374a9221991-04-04 10:40:29 +0000836 case UNARY_CONVERT:
837 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000838 x = PyObject_Repr(v);
839 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000840 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000841 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000842 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000843
Guido van Rossum7928cd71991-10-24 14:59:31 +0000844 case UNARY_INVERT:
845 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000846 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000847 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000848 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000849 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000850 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000851
Guido van Rossum50564e81996-01-12 01:13:16 +0000852 case BINARY_POWER:
853 w = POP();
854 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000855 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000856 Py_DECREF(v);
857 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000858 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000859 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000860 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000861
Guido van Rossum374a9221991-04-04 10:40:29 +0000862 case BINARY_MULTIPLY:
863 w = POP();
864 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000865 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000866 Py_DECREF(v);
867 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000868 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000869 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000870 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000871
Guido van Rossum374a9221991-04-04 10:40:29 +0000872 case BINARY_DIVIDE:
873 w = POP();
874 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000875 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000876 Py_DECREF(v);
877 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000878 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000879 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000880 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000881
Guido van Rossum4668b002001-08-08 05:00:18 +0000882 case BINARY_FLOOR_DIVIDE:
883 w = POP();
884 v = POP();
885 x = PyNumber_FloorDivide(v, w);
886 Py_DECREF(v);
887 Py_DECREF(w);
888 PUSH(x);
889 if (x != NULL) continue;
890 break;
891
892 case BINARY_TRUE_DIVIDE:
893 w = POP();
894 v = POP();
895 x = PyNumber_TrueDivide(v, w);
896 Py_DECREF(v);
897 Py_DECREF(w);
898 PUSH(x);
899 if (x != NULL) continue;
900 break;
901
Guido van Rossum374a9221991-04-04 10:40:29 +0000902 case BINARY_MODULO:
903 w = POP();
904 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000905 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000906 Py_DECREF(v);
907 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000908 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000909 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000910 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000911
Guido van Rossum374a9221991-04-04 10:40:29 +0000912 case BINARY_ADD:
913 w = POP();
914 v = POP();
Guido van Rossum46add982001-08-30 16:06:23 +0000915 if (ISSTRICTINT(v) && ISSTRICTINT(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000916 /* INLINE: int + int */
917 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000918 a = PyInt_AS_LONG(v);
919 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000920 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +0000921 if ((i^a) < 0 && (i^b) < 0)
922 goto slow_add;
923 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000924 }
Guido van Rossum87780df2001-08-23 02:58:07 +0000925 else {
926 slow_add:
Guido van Rossumc12da691997-07-17 23:12:42 +0000927 x = PyNumber_Add(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +0000928 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000929 Py_DECREF(v);
930 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000931 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000932 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000933 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000934
Guido van Rossum374a9221991-04-04 10:40:29 +0000935 case BINARY_SUBTRACT:
936 w = POP();
937 v = POP();
Guido van Rossum46add982001-08-30 16:06:23 +0000938 if (ISSTRICTINT(v) && ISSTRICTINT(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000939 /* INLINE: int - int */
940 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000941 a = PyInt_AS_LONG(v);
942 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000943 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +0000944 if ((i^a) < 0 && (i^~b) < 0)
945 goto slow_sub;
946 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000947 }
Guido van Rossum87780df2001-08-23 02:58:07 +0000948 else {
949 slow_sub:
Guido van Rossumc12da691997-07-17 23:12:42 +0000950 x = PyNumber_Subtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +0000951 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000952 Py_DECREF(v);
953 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000954 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000955 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000956 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000957
Guido van Rossum374a9221991-04-04 10:40:29 +0000958 case BINARY_SUBSCR:
959 w = POP();
960 v = POP();
Guido van Rossum46add982001-08-30 16:06:23 +0000961 if (v->ob_type == &PyList_Type && ISSTRICTINT(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000962 /* INLINE: list[int] */
963 long i = PyInt_AsLong(w);
964 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +0000965 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +0000966 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +0000967 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000968 PyErr_SetString(PyExc_IndexError,
969 "list index out of range");
970 x = NULL;
971 }
972 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +0000973 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000974 Py_INCREF(x);
975 }
976 }
977 else
978 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000979 Py_DECREF(v);
980 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000981 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000982 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000983 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000984
Guido van Rossum7928cd71991-10-24 14:59:31 +0000985 case BINARY_LSHIFT:
986 w = POP();
987 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000988 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000989 Py_DECREF(v);
990 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000991 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000992 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000993 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000994
Guido van Rossum7928cd71991-10-24 14:59:31 +0000995 case BINARY_RSHIFT:
996 w = POP();
997 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000998 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000999 Py_DECREF(v);
1000 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001001 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001002 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001003 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001004
Guido van Rossum7928cd71991-10-24 14:59:31 +00001005 case BINARY_AND:
1006 w = POP();
1007 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001008 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001009 Py_DECREF(v);
1010 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001011 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001012 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001013 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001014
Guido van Rossum7928cd71991-10-24 14:59:31 +00001015 case BINARY_XOR:
1016 w = POP();
1017 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001018 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001019 Py_DECREF(v);
1020 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001021 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001022 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001023 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001024
Guido van Rossum7928cd71991-10-24 14:59:31 +00001025 case BINARY_OR:
1026 w = POP();
1027 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001028 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001029 Py_DECREF(v);
1030 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001031 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001032 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001033 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001034
1035 case INPLACE_POWER:
1036 w = POP();
1037 v = POP();
1038 x = PyNumber_InPlacePower(v, w, Py_None);
1039 Py_DECREF(v);
1040 Py_DECREF(w);
1041 PUSH(x);
1042 if (x != NULL) continue;
1043 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001044
Thomas Wouters434d0822000-08-24 20:11:32 +00001045 case INPLACE_MULTIPLY:
1046 w = POP();
1047 v = POP();
1048 x = PyNumber_InPlaceMultiply(v, w);
1049 Py_DECREF(v);
1050 Py_DECREF(w);
1051 PUSH(x);
1052 if (x != NULL) continue;
1053 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001054
Thomas Wouters434d0822000-08-24 20:11:32 +00001055 case INPLACE_DIVIDE:
1056 w = POP();
1057 v = POP();
1058 x = PyNumber_InPlaceDivide(v, w);
1059 Py_DECREF(v);
1060 Py_DECREF(w);
1061 PUSH(x);
1062 if (x != NULL) continue;
1063 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001064
Guido van Rossum4668b002001-08-08 05:00:18 +00001065 case INPLACE_FLOOR_DIVIDE:
1066 w = POP();
1067 v = POP();
1068 x = PyNumber_InPlaceFloorDivide(v, w);
1069 Py_DECREF(v);
1070 Py_DECREF(w);
1071 PUSH(x);
1072 if (x != NULL) continue;
1073 break;
1074
1075 case INPLACE_TRUE_DIVIDE:
1076 w = POP();
1077 v = POP();
1078 x = PyNumber_InPlaceTrueDivide(v, w);
1079 Py_DECREF(v);
1080 Py_DECREF(w);
1081 PUSH(x);
1082 if (x != NULL) continue;
1083 break;
1084
Thomas Wouters434d0822000-08-24 20:11:32 +00001085 case INPLACE_MODULO:
1086 w = POP();
1087 v = POP();
1088 x = PyNumber_InPlaceRemainder(v, w);
1089 Py_DECREF(v);
1090 Py_DECREF(w);
1091 PUSH(x);
1092 if (x != NULL) continue;
1093 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001094
Thomas Wouters434d0822000-08-24 20:11:32 +00001095 case INPLACE_ADD:
1096 w = POP();
1097 v = POP();
Guido van Rossum46add982001-08-30 16:06:23 +00001098 if (ISSTRICTINT(v) && ISSTRICTINT(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001099 /* INLINE: int + int */
1100 register long a, b, i;
1101 a = PyInt_AS_LONG(v);
1102 b = PyInt_AS_LONG(w);
1103 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001104 if ((i^a) < 0 && (i^b) < 0)
1105 goto slow_iadd;
1106 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001107 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001108 else {
1109 slow_iadd:
Thomas Wouters434d0822000-08-24 20:11:32 +00001110 x = PyNumber_InPlaceAdd(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001111 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001112 Py_DECREF(v);
1113 Py_DECREF(w);
1114 PUSH(x);
1115 if (x != NULL) continue;
1116 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001117
Thomas Wouters434d0822000-08-24 20:11:32 +00001118 case INPLACE_SUBTRACT:
1119 w = POP();
1120 v = POP();
Guido van Rossum46add982001-08-30 16:06:23 +00001121 if (ISSTRICTINT(v) && ISSTRICTINT(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001122 /* INLINE: int - int */
1123 register long a, b, i;
1124 a = PyInt_AS_LONG(v);
1125 b = PyInt_AS_LONG(w);
1126 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001127 if ((i^a) < 0 && (i^~b) < 0)
1128 goto slow_isub;
1129 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001130 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001131 else {
1132 slow_isub:
Thomas Wouters434d0822000-08-24 20:11:32 +00001133 x = PyNumber_InPlaceSubtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001134 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001135 Py_DECREF(v);
1136 Py_DECREF(w);
1137 PUSH(x);
1138 if (x != NULL) continue;
1139 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001140
Thomas Wouters434d0822000-08-24 20:11:32 +00001141 case INPLACE_LSHIFT:
1142 w = POP();
1143 v = POP();
1144 x = PyNumber_InPlaceLshift(v, w);
1145 Py_DECREF(v);
1146 Py_DECREF(w);
1147 PUSH(x);
1148 if (x != NULL) continue;
1149 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001150
Thomas Wouters434d0822000-08-24 20:11:32 +00001151 case INPLACE_RSHIFT:
1152 w = POP();
1153 v = POP();
1154 x = PyNumber_InPlaceRshift(v, w);
1155 Py_DECREF(v);
1156 Py_DECREF(w);
1157 PUSH(x);
1158 if (x != NULL) continue;
1159 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001160
Thomas Wouters434d0822000-08-24 20:11:32 +00001161 case INPLACE_AND:
1162 w = POP();
1163 v = POP();
1164 x = PyNumber_InPlaceAnd(v, w);
1165 Py_DECREF(v);
1166 Py_DECREF(w);
1167 PUSH(x);
1168 if (x != NULL) continue;
1169 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001170
Thomas Wouters434d0822000-08-24 20:11:32 +00001171 case INPLACE_XOR:
1172 w = POP();
1173 v = POP();
1174 x = PyNumber_InPlaceXor(v, w);
1175 Py_DECREF(v);
1176 Py_DECREF(w);
1177 PUSH(x);
1178 if (x != NULL) continue;
1179 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001180
Thomas Wouters434d0822000-08-24 20:11:32 +00001181 case INPLACE_OR:
1182 w = POP();
1183 v = POP();
1184 x = PyNumber_InPlaceOr(v, w);
1185 Py_DECREF(v);
1186 Py_DECREF(w);
1187 PUSH(x);
1188 if (x != NULL) continue;
1189 break;
1190
Guido van Rossum374a9221991-04-04 10:40:29 +00001191 case SLICE+0:
1192 case SLICE+1:
1193 case SLICE+2:
1194 case SLICE+3:
1195 if ((opcode-SLICE) & 2)
1196 w = POP();
1197 else
1198 w = NULL;
1199 if ((opcode-SLICE) & 1)
1200 v = POP();
1201 else
1202 v = NULL;
1203 u = POP();
1204 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001205 Py_DECREF(u);
1206 Py_XDECREF(v);
1207 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001208 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001209 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001210 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001211
Guido van Rossum374a9221991-04-04 10:40:29 +00001212 case STORE_SLICE+0:
1213 case STORE_SLICE+1:
1214 case STORE_SLICE+2:
1215 case STORE_SLICE+3:
1216 if ((opcode-STORE_SLICE) & 2)
1217 w = POP();
1218 else
1219 w = NULL;
1220 if ((opcode-STORE_SLICE) & 1)
1221 v = POP();
1222 else
1223 v = NULL;
1224 u = POP();
1225 t = POP();
1226 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001227 Py_DECREF(t);
1228 Py_DECREF(u);
1229 Py_XDECREF(v);
1230 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001231 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001232 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001233
Guido van Rossum374a9221991-04-04 10:40:29 +00001234 case DELETE_SLICE+0:
1235 case DELETE_SLICE+1:
1236 case DELETE_SLICE+2:
1237 case DELETE_SLICE+3:
1238 if ((opcode-DELETE_SLICE) & 2)
1239 w = POP();
1240 else
1241 w = NULL;
1242 if ((opcode-DELETE_SLICE) & 1)
1243 v = POP();
1244 else
1245 v = NULL;
1246 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001247 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001248 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001249 Py_DECREF(u);
1250 Py_XDECREF(v);
1251 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001252 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001253 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001254
Guido van Rossum374a9221991-04-04 10:40:29 +00001255 case STORE_SUBSCR:
1256 w = POP();
1257 v = POP();
1258 u = POP();
1259 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001260 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001261 Py_DECREF(u);
1262 Py_DECREF(v);
1263 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001264 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001265 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001266
Guido van Rossum374a9221991-04-04 10:40:29 +00001267 case DELETE_SUBSCR:
1268 w = POP();
1269 v = POP();
1270 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001271 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001272 Py_DECREF(v);
1273 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001274 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001275 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001276
Guido van Rossum374a9221991-04-04 10:40:29 +00001277 case PRINT_EXPR:
1278 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001279 w = PySys_GetObject("displayhook");
1280 if (w == NULL) {
1281 PyErr_SetString(PyExc_RuntimeError,
1282 "lost sys.displayhook");
1283 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001284 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001285 }
1286 if (err == 0) {
1287 x = Py_BuildValue("(O)", v);
1288 if (x == NULL)
1289 err = -1;
1290 }
1291 if (err == 0) {
1292 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001293 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001294 if (w == NULL)
1295 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001296 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001297 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001298 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001299 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001300
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001301 case PRINT_ITEM_TO:
1302 w = stream = POP();
1303 /* fall through to PRINT_ITEM */
1304
Guido van Rossum374a9221991-04-04 10:40:29 +00001305 case PRINT_ITEM:
1306 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001307 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001308 w = PySys_GetObject("stdout");
1309 if (w == NULL) {
1310 PyErr_SetString(PyExc_RuntimeError,
1311 "lost sys.stdout");
1312 err = -1;
1313 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001314 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001315 if (w != NULL && PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001316 err = PyFile_WriteString(" ", w);
1317 if (err == 0)
1318 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001319 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001320 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001321 char *s = PyString_AsString(v);
1322 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001323 if (len > 0 &&
1324 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001325 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001326 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001327 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001328 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001329 Py_XDECREF(stream);
1330 stream = NULL;
1331 if (err == 0)
1332 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001333 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001334
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001335 case PRINT_NEWLINE_TO:
1336 w = stream = POP();
1337 /* fall through to PRINT_NEWLINE */
1338
Guido van Rossum374a9221991-04-04 10:40:29 +00001339 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001340 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001341 w = PySys_GetObject("stdout");
1342 if (w == NULL)
1343 PyErr_SetString(PyExc_RuntimeError,
1344 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001345 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001346 if (w != NULL) {
1347 err = PyFile_WriteString("\n", w);
1348 if (err == 0)
1349 PyFile_SoftSpace(w, 0);
1350 }
1351 Py_XDECREF(stream);
1352 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001353 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001354
Thomas Wouters434d0822000-08-24 20:11:32 +00001355
1356#ifdef CASE_TOO_BIG
1357 default: switch (opcode) {
1358#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001359 case BREAK_LOOP:
1360 why = WHY_BREAK;
1361 break;
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00001362
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001363 case CONTINUE_LOOP:
1364 retval = PyInt_FromLong(oparg);
1365 why = WHY_CONTINUE;
1366 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001367
Guido van Rossumf10570b1995-07-07 22:53:21 +00001368 case RAISE_VARARGS:
1369 u = v = w = NULL;
1370 switch (oparg) {
1371 case 3:
1372 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001373 /* Fallthrough */
1374 case 2:
1375 v = POP(); /* value */
1376 /* Fallthrough */
1377 case 1:
1378 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001379 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001380 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001381 break;
1382 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001383 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001384 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001385 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001386 break;
1387 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001388 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001389
Guido van Rossum374a9221991-04-04 10:40:29 +00001390 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001391 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001392 PyErr_SetString(PyExc_SystemError,
1393 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001394 break;
1395 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001396 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001397 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001398 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001399
Guido van Rossum374a9221991-04-04 10:40:29 +00001400 case RETURN_VALUE:
1401 retval = POP();
1402 why = WHY_RETURN;
1403 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001404
Tim Peters5ca576e2001-06-18 22:08:13 +00001405 case YIELD_VALUE:
1406 retval = POP();
Tim Peters8c963692001-06-23 05:26:56 +00001407 f->f_stacktop = stack_pointer;
Tim Peters5ca576e2001-06-18 22:08:13 +00001408 f->f_lasti = INSTR_OFFSET();
1409 why = WHY_YIELD;
1410 break;
1411
1412
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001413 case EXEC_STMT:
1414 w = POP();
1415 v = POP();
1416 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001417 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001418 Py_DECREF(u);
1419 Py_DECREF(v);
1420 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001421 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001422
Guido van Rossum374a9221991-04-04 10:40:29 +00001423 case POP_BLOCK:
1424 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001425 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001426 while (STACK_LEVEL() > b->b_level) {
1427 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001428 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001429 }
1430 }
1431 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001432
Guido van Rossum374a9221991-04-04 10:40:29 +00001433 case END_FINALLY:
1434 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001435 if (PyInt_Check(v)) {
1436 why = (enum why_code) PyInt_AsLong(v);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001437 if (why == WHY_RETURN ||
Tim Peters5ca576e2001-06-18 22:08:13 +00001438 why == WHY_YIELD ||
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001439 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00001440 retval = POP();
1441 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001442 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001443 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001444 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001445 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001446 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001447 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001448 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001449 else if (v != Py_None) {
1450 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001451 "'finally' pops bad exception");
1452 why = WHY_EXCEPTION;
1453 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001454 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001455 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001456
Guido van Rossum374a9221991-04-04 10:40:29 +00001457 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001458 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001459 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001460 w = POP();
1461 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001462 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001463 Py_DECREF(u);
1464 Py_DECREF(v);
1465 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001466 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001467
Guido van Rossum374a9221991-04-04 10:40:29 +00001468 case STORE_NAME:
1469 w = GETNAMEV(oparg);
1470 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001471 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001472 PyErr_Format(PyExc_SystemError,
1473 "no locals found when storing %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001474 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001475 break;
1476 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001477 err = PyDict_SetItem(x, w, v);
1478 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001479 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001480
Guido van Rossum374a9221991-04-04 10:40:29 +00001481 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001482 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001483 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001484 PyErr_Format(PyExc_SystemError,
1485 "no locals when deleting %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001486 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001487 break;
1488 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001489 if ((err = PyDict_DelItem(x, w)) != 0)
Guido van Rossumac7be682001-01-17 15:42:30 +00001490 format_exc_check_arg(PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001491 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001492 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001493
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001494 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001495 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001496 if (PyTuple_Check(v)) {
1497 if (PyTuple_Size(v) != oparg) {
1498 PyErr_SetString(PyExc_ValueError,
1499 "unpack tuple of wrong size");
1500 why = WHY_EXCEPTION;
1501 }
1502 else {
1503 for (; --oparg >= 0; ) {
1504 w = PyTuple_GET_ITEM(v, oparg);
1505 Py_INCREF(w);
1506 PUSH(w);
1507 }
1508 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001509 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001510 else if (PyList_Check(v)) {
1511 if (PyList_Size(v) != oparg) {
1512 PyErr_SetString(PyExc_ValueError,
1513 "unpack list of wrong size");
1514 why = WHY_EXCEPTION;
1515 }
1516 else {
1517 for (; --oparg >= 0; ) {
1518 w = PyList_GET_ITEM(v, oparg);
1519 Py_INCREF(w);
1520 PUSH(w);
1521 }
1522 }
1523 }
Tim Petersd6d010b2001-06-21 02:49:55 +00001524 else if (unpack_iterable(v, oparg,
1525 stack_pointer + oparg))
1526 stack_pointer += oparg;
1527 else
Barry Warsawe42b18f1997-08-25 22:13:04 +00001528 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00001529 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001530 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001531
Guido van Rossum374a9221991-04-04 10:40:29 +00001532 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001533 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001534 v = POP();
1535 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001536 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1537 Py_DECREF(v);
1538 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001539 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001540
Guido van Rossum374a9221991-04-04 10:40:29 +00001541 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001542 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001543 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001544 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1545 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001546 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001547 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001548
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001549 case STORE_GLOBAL:
1550 w = GETNAMEV(oparg);
1551 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001552 err = PyDict_SetItem(f->f_globals, w, v);
1553 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001554 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001555
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001556 case DELETE_GLOBAL:
1557 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001558 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001559 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001560 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001561 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001562
Guido van Rossum374a9221991-04-04 10:40:29 +00001563 case LOAD_CONST:
1564 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001565 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001566 PUSH(x);
1567 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001568
Guido van Rossum374a9221991-04-04 10:40:29 +00001569 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001570 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001571 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001572 PyErr_Format(PyExc_SystemError,
1573 "no locals when loading %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001574 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001575 break;
1576 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001577 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001578 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001579 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001580 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001581 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001582 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001583 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001584 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001585 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001586 break;
1587 }
1588 }
1589 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001590 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001591 PUSH(x);
1592 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001593
Guido van Rossum374a9221991-04-04 10:40:29 +00001594 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001595 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001596 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001597 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001598 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001599 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001600 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001601 PyExc_NameError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001602 GLOBAL_NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001603 break;
1604 }
1605 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001606 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001607 PUSH(x);
1608 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001609
Guido van Rossum9bfef441993-03-29 10:43:31 +00001610 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001611 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001612 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001613 format_exc_check_arg(
1614 PyExc_UnboundLocalError,
1615 UNBOUNDLOCAL_ERROR_MSG,
1616 PyTuple_GetItem(co->co_varnames, oparg)
1617 );
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001618 break;
1619 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001620 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001621 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001622 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001623 break;
1624
1625 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001626 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001627 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001628 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001629
1630 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001631 x = GETLOCAL(oparg);
1632 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001633 format_exc_check_arg(
1634 PyExc_UnboundLocalError,
1635 UNBOUNDLOCAL_ERROR_MSG,
1636 PyTuple_GetItem(co->co_varnames, oparg)
1637 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001638 break;
1639 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001640 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001641 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001642
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001643 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001644 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001645 Py_INCREF(x);
1646 PUSH(x);
1647 break;
1648
1649 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001650 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001651 w = PyCell_Get(x);
Jeremy Hylton2524d692001-02-05 17:23:16 +00001652 if (w == NULL) {
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001653 if (oparg < f->f_ncells) {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001654 v = PyTuple_GetItem(co->co_cellvars,
1655 oparg);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001656 format_exc_check_arg(
1657 PyExc_UnboundLocalError,
1658 UNBOUNDLOCAL_ERROR_MSG,
1659 v);
1660 } else {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001661 v = PyTuple_GetItem(
1662 co->co_freevars,
1663 oparg - f->f_ncells);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001664 format_exc_check_arg(
1665 PyExc_NameError,
1666 UNBOUNDFREE_ERROR_MSG,
1667 v);
1668 }
Jeremy Hylton2524d692001-02-05 17:23:16 +00001669 err = -1;
1670 break;
1671 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001672 PUSH(w);
1673 break;
1674
1675 case STORE_DEREF:
1676 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001677 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001678 PyCell_Set(x, w);
Jeremy Hylton30c9f392001-03-13 01:58:22 +00001679 Py_DECREF(w);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001680 continue;
1681
Guido van Rossum374a9221991-04-04 10:40:29 +00001682 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001683 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001684 if (x != NULL) {
1685 for (; --oparg >= 0;) {
1686 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001687 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001688 }
1689 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001690 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001691 }
1692 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001693
Guido van Rossum374a9221991-04-04 10:40:29 +00001694 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001695 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001696 if (x != NULL) {
1697 for (; --oparg >= 0;) {
1698 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001699 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001700 }
1701 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001702 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001703 }
1704 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001705
Guido van Rossum374a9221991-04-04 10:40:29 +00001706 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001707 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001708 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001709 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001710 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001711
Guido van Rossum374a9221991-04-04 10:40:29 +00001712 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001713 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001714 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001715 x = PyObject_GetAttr(v, w);
1716 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001717 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001718 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001719 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001720
Guido van Rossum374a9221991-04-04 10:40:29 +00001721 case COMPARE_OP:
1722 w = POP();
1723 v = POP();
Guido van Rossum46add982001-08-30 16:06:23 +00001724 if (ISSTRICTINT(v) && ISSTRICTINT(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001725 /* INLINE: cmp(int, int) */
1726 register long a, b;
1727 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001728 a = PyInt_AS_LONG(v);
1729 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001730 switch (oparg) {
1731 case LT: res = a < b; break;
1732 case LE: res = a <= b; break;
1733 case EQ: res = a == b; break;
1734 case NE: res = a != b; break;
1735 case GT: res = a > b; break;
1736 case GE: res = a >= b; break;
1737 case IS: res = v == w; break;
1738 case IS_NOT: res = v != w; break;
1739 default: goto slow_compare;
1740 }
1741 x = res ? Py_True : Py_False;
1742 Py_INCREF(x);
1743 }
1744 else {
1745 slow_compare:
1746 x = cmp_outcome(oparg, v, w);
1747 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001748 Py_DECREF(v);
1749 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001750 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001751 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001752 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001753
Guido van Rossum374a9221991-04-04 10:40:29 +00001754 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001755 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001756 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001757 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001758 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001759 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001760 break;
1761 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001762 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001763 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001764 w,
1765 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001766 f->f_locals == NULL ?
1767 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001768 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001769 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001770 if (w == NULL) {
1771 x = NULL;
1772 break;
1773 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001774 x = PyEval_CallObject(x, w);
1775 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001776 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001777 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001778 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001779
Thomas Wouters52152252000-08-17 22:55:00 +00001780 case IMPORT_STAR:
1781 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001782 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001783 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001784 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001785 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001786 break;
1787 }
Thomas Wouters52152252000-08-17 22:55:00 +00001788 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001789 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001790 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001791 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001792 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001793
Thomas Wouters52152252000-08-17 22:55:00 +00001794 case IMPORT_FROM:
1795 w = GETNAMEV(oparg);
1796 v = TOP();
1797 x = import_from(v, w);
1798 PUSH(x);
1799 if (x != NULL) continue;
1800 break;
1801
Guido van Rossum374a9221991-04-04 10:40:29 +00001802 case JUMP_FORWARD:
1803 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001804 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001805
Guido van Rossum374a9221991-04-04 10:40:29 +00001806 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001807 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001808 if (err > 0)
1809 err = 0;
1810 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001811 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001812 else
1813 break;
1814 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001815
Guido van Rossum374a9221991-04-04 10:40:29 +00001816 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001817 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001818 if (err > 0) {
1819 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001820 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001821 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001822 else if (err == 0)
1823 ;
1824 else
1825 break;
1826 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001827
Guido van Rossum374a9221991-04-04 10:40:29 +00001828 case JUMP_ABSOLUTE:
1829 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001830 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001831
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001832 case GET_ITER:
1833 /* before: [obj]; after [getiter(obj)] */
1834 v = POP();
1835 x = PyObject_GetIter(v);
1836 Py_DECREF(v);
1837 if (x != NULL) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00001838 PUSH(x);
1839 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001840 }
1841 break;
1842
1843 case FOR_ITER:
1844 /* before: [iter]; after: [iter, iter()] *or* [] */
1845 v = TOP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001846 x = PyIter_Next(v);
1847 if (x != NULL) {
1848 PUSH(x);
1849 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001850 }
Tim Petersf4848da2001-05-05 00:14:56 +00001851 if (!PyErr_Occurred()) {
1852 /* iterator ended normally */
1853 x = v = POP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001854 Py_DECREF(v);
1855 JUMPBY(oparg);
1856 continue;
1857 }
1858 break;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001859
Guido van Rossum374a9221991-04-04 10:40:29 +00001860 case FOR_LOOP:
1861 /* for v in s: ...
1862 On entry: stack contains s, i.
1863 On exit: stack contains s, i+1, s[i];
1864 but if loop exhausted:
1865 s, i are popped, and we jump */
1866 w = POP(); /* Loop index */
1867 v = POP(); /* Sequence object */
1868 u = loop_subscript(v, w);
1869 if (u != NULL) {
1870 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001871 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001872 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001873 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001874 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001875 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001876 }
1877 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001878 Py_DECREF(v);
1879 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001880 /* A NULL can mean "s exhausted"
1881 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001882 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001883 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001884 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001885 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001886 continue;
1887 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001888 }
1889 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001890
Guido van Rossum374a9221991-04-04 10:40:29 +00001891 case SETUP_LOOP:
1892 case SETUP_EXCEPT:
1893 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001894 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001895 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001896 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001897
Guido van Rossum374a9221991-04-04 10:40:29 +00001898 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001899#ifdef LLTRACE
1900 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001901 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001902#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001903 f->f_lineno = oparg;
Fred Drake5755ce62001-06-27 19:19:46 +00001904 if (tstate->c_tracefunc == NULL || tstate->tracing)
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001905 continue;
1906 /* Trace each line of code reached */
1907 f->f_lasti = INSTR_OFFSET();
Fred Drake5755ce62001-06-27 19:19:46 +00001908 /* Inline call_trace() for performance: */
1909 tstate->tracing++;
Fred Drake9e3ad782001-07-03 23:39:52 +00001910 tstate->use_tracing = 0;
Fred Drake5755ce62001-06-27 19:19:46 +00001911 err = (tstate->c_tracefunc)(tstate->c_traceobj, f,
1912 PyTrace_LINE, Py_None);
Fred Drake9e3ad782001-07-03 23:39:52 +00001913 tstate->use_tracing = (tstate->c_tracefunc
1914 || tstate->c_profilefunc);
Fred Drake5755ce62001-06-27 19:19:46 +00001915 tstate->tracing--;
Guido van Rossum374a9221991-04-04 10:40:29 +00001916 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001917
1918 case CALL_FUNCTION:
Jeremy Hylton52820442001-01-03 23:52:36 +00001919 {
1920 int na = oparg & 0xff;
1921 int nk = (oparg>>8) & 0xff;
1922 int n = na + 2 * nk;
1923 PyObject **pfunc = stack_pointer - n - 1;
1924 PyObject *func = *pfunc;
1925 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1926
1927 /* Always dispatch PyCFunction first, because
1928 these are presumed to be the most frequent
1929 callable object.
1930 */
1931 if (PyCFunction_Check(func)) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001932 int flags = PyCFunction_GET_FLAGS(func);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001933 if (nk != 0 || (flags & METH_KEYWORDS))
Jeremy Hylton4c9dace2001-05-29 16:23:26 +00001934 x = do_call(func, &stack_pointer,
1935 na, nk);
1936 else if (flags == METH_VARARGS) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001937 PyObject *callargs;
1938 callargs = load_args(&stack_pointer, na);
Jeremy Hylton910d7d42001-08-12 21:52:24 +00001939 x = PyCFunction_Call(func, callargs, NULL);
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001940 Py_XDECREF(callargs);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001941 } else
1942 x = fast_cfunction(func,
1943 &stack_pointer, na);
Jeremy Hylton52820442001-01-03 23:52:36 +00001944 } else {
Guido van Rossumac7be682001-01-17 15:42:30 +00001945 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001946 && PyMethod_GET_SELF(func) != NULL) {
1947 /* optimize access to bound methods */
1948 PyObject *self = PyMethod_GET_SELF(func);
1949 Py_INCREF(self);
1950 func = PyMethod_GET_FUNCTION(func);
1951 Py_INCREF(func);
1952 Py_DECREF(*pfunc);
1953 *pfunc = self;
1954 na++;
1955 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00001956 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00001957 Py_INCREF(func);
1958 if (PyFunction_Check(func)) {
1959 x = fast_function(func, &stack_pointer,
Guido van Rossumac7be682001-01-17 15:42:30 +00001960 n, na, nk);
Jeremy Hylton52820442001-01-03 23:52:36 +00001961 } else {
1962 x = do_call(func, &stack_pointer,
1963 na, nk);
1964 }
1965 Py_DECREF(func);
1966 }
1967
1968 while (stack_pointer > pfunc) {
1969 w = POP();
1970 Py_DECREF(w);
1971 }
1972 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00001973 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00001974 continue;
1975 break;
1976 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001977
Jeremy Hylton76901512000-03-28 23:49:17 +00001978 case CALL_FUNCTION_VAR:
1979 case CALL_FUNCTION_KW:
1980 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001981 {
Jeremy Hylton76901512000-03-28 23:49:17 +00001982 int na = oparg & 0xff;
1983 int nk = (oparg>>8) & 0xff;
1984 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00001985 int n = na + 2 * nk;
1986 PyObject **pfunc, *func;
1987 if (flags & CALL_FLAG_VAR)
1988 n++;
1989 if (flags & CALL_FLAG_KW)
1990 n++;
1991 pfunc = stack_pointer - n - 1;
1992 func = *pfunc;
Jeremy Hylton76901512000-03-28 23:49:17 +00001993 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Jeremy Hylton52820442001-01-03 23:52:36 +00001994
Guido van Rossumac7be682001-01-17 15:42:30 +00001995 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001996 && PyMethod_GET_SELF(func) != NULL) {
1997 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00001998 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00001999 func = PyMethod_GET_FUNCTION(func);
2000 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002001 Py_DECREF(*pfunc);
2002 *pfunc = self;
2003 na++;
2004 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00002005 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00002006 Py_INCREF(func);
2007 x = ext_do_call(func, &stack_pointer, flags, na, nk);
Jeremy Hylton76901512000-03-28 23:49:17 +00002008 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002009
Jeremy Hylton76901512000-03-28 23:49:17 +00002010 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00002011 w = POP();
2012 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00002013 }
2014 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002015 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002016 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00002017 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002018 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002019
Guido van Rossum681d79a1995-07-18 14:51:37 +00002020 case MAKE_FUNCTION:
2021 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00002022 x = PyFunction_New(v, f->f_globals);
2023 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002024 /* XXX Maybe this should be a separate opcode? */
2025 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002026 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002027 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002028 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002029 x = NULL;
2030 break;
2031 }
2032 while (--oparg >= 0) {
2033 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002034 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002035 }
2036 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00002037 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002038 }
2039 PUSH(x);
2040 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002041
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002042 case MAKE_CLOSURE:
2043 {
2044 int nfree;
2045 v = POP(); /* code object */
2046 x = PyFunction_New(v, f->f_globals);
2047 nfree = PyTuple_GET_SIZE(((PyCodeObject *)v)->co_freevars);
2048 Py_DECREF(v);
2049 /* XXX Maybe this should be a separate opcode? */
2050 if (x != NULL && nfree > 0) {
2051 v = PyTuple_New(nfree);
2052 if (v == NULL) {
2053 Py_DECREF(x);
2054 x = NULL;
2055 break;
2056 }
2057 while (--nfree >= 0) {
2058 w = POP();
2059 PyTuple_SET_ITEM(v, nfree, w);
2060 }
2061 err = PyFunction_SetClosure(x, v);
2062 Py_DECREF(v);
2063 }
2064 if (x != NULL && oparg > 0) {
2065 v = PyTuple_New(oparg);
2066 if (v == NULL) {
2067 Py_DECREF(x);
2068 x = NULL;
2069 break;
2070 }
2071 while (--oparg >= 0) {
2072 w = POP();
2073 PyTuple_SET_ITEM(v, oparg, w);
2074 }
2075 err = PyFunction_SetDefaults(x, v);
2076 Py_DECREF(v);
2077 }
2078 PUSH(x);
2079 break;
2080 }
2081
Guido van Rossum8861b741996-07-30 16:49:37 +00002082 case BUILD_SLICE:
2083 if (oparg == 3)
2084 w = POP();
2085 else
2086 w = NULL;
2087 v = POP();
2088 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002089 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002090 Py_DECREF(u);
2091 Py_DECREF(v);
2092 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00002093 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002094 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002095 break;
2096
Fred Drakeef8ace32000-08-24 00:32:09 +00002097 case EXTENDED_ARG:
2098 opcode = NEXTOP();
2099 oparg = oparg<<16 | NEXTARG();
2100 goto dispatch_opcode;
Guido van Rossum8861b741996-07-30 16:49:37 +00002101
Guido van Rossum374a9221991-04-04 10:40:29 +00002102 default:
2103 fprintf(stderr,
2104 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00002105 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002106 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002107 why = WHY_EXCEPTION;
2108 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002109
2110#ifdef CASE_TOO_BIG
2111 }
2112#endif
2113
Guido van Rossum374a9221991-04-04 10:40:29 +00002114 } /* switch */
2115
2116 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002117
Guido van Rossum374a9221991-04-04 10:40:29 +00002118 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002119
Guido van Rossum374a9221991-04-04 10:40:29 +00002120 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002121 if (err == 0 && x != NULL) {
2122#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002123 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002124 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002125 fprintf(stderr,
2126 "XXX undetected error\n");
2127 else
2128#endif
2129 continue; /* Normal, fast path */
2130 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002131 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002132 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002133 err = 0;
2134 }
2135
Guido van Rossum374a9221991-04-04 10:40:29 +00002136 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002137
Guido van Rossum374a9221991-04-04 10:40:29 +00002138 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002139 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002140 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002141 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002142 why = WHY_EXCEPTION;
2143 }
2144 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002145#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002146 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002147 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002148 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002149 fprintf(stderr,
2150 "XXX undetected error (why=%d)\n",
2151 why);
2152 why = WHY_EXCEPTION;
2153 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002154 }
2155#endif
2156
2157 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002158
Guido van Rossum374a9221991-04-04 10:40:29 +00002159 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002160 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00002161 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00002162 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00002163 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002164
Fred Drake9e3ad782001-07-03 23:39:52 +00002165 if (tstate->use_tracing) {
2166 if (tstate->c_tracefunc)
2167 call_exc_trace(tstate->c_tracefunc,
2168 tstate->c_traceobj, f);
2169 if (tstate->c_profilefunc)
2170 call_exc_trace(tstate->c_profilefunc,
2171 tstate->c_profileobj,f);
2172 }
Guido van Rossum014518f1998-11-23 21:09:51 +00002173 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002174
Guido van Rossum374a9221991-04-04 10:40:29 +00002175 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002176
Guido van Rossum374a9221991-04-04 10:40:29 +00002177 if (why == WHY_RERAISE)
2178 why = WHY_EXCEPTION;
2179
2180 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002181
Tim Peters5ca576e2001-06-18 22:08:13 +00002182 while (why != WHY_NOT && why != WHY_YIELD && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002183 PyTryBlock *b = PyFrame_BlockPop(f);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002184
2185 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2186 /* For a continue inside a try block,
2187 don't pop the block for the loop. */
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00002188 PyFrame_BlockSetup(f, b->b_type, b->b_level,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002189 b->b_handler);
2190 why = WHY_NOT;
2191 JUMPTO(PyInt_AS_LONG(retval));
2192 Py_DECREF(retval);
2193 break;
2194 }
2195
Guido van Rossum374a9221991-04-04 10:40:29 +00002196 while (STACK_LEVEL() > b->b_level) {
2197 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002198 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002199 }
2200 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2201 why = WHY_NOT;
2202 JUMPTO(b->b_handler);
2203 break;
2204 }
2205 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002206 (b->b_type == SETUP_EXCEPT &&
2207 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002208 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002209 PyObject *exc, *val, *tb;
2210 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002211 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002212 val = Py_None;
2213 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002214 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002215 /* Make the raw exception data
2216 available to the handler,
2217 so a program can emulate the
2218 Python main loop. Don't do
2219 this for 'finally'. */
2220 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002221 PyErr_NormalizeException(
2222 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002223 set_exc_info(tstate,
2224 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002225 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002226 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002227 PUSH(val);
2228 PUSH(exc);
2229 }
2230 else {
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002231 if (why == WHY_RETURN ||
2232 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00002233 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002234 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002235 PUSH(v);
2236 }
2237 why = WHY_NOT;
2238 JUMPTO(b->b_handler);
2239 break;
2240 }
2241 } /* unwind stack */
2242
2243 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002244
Guido van Rossum374a9221991-04-04 10:40:29 +00002245 if (why != WHY_NOT)
2246 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002247
Guido van Rossum374a9221991-04-04 10:40:29 +00002248 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002249
Tim Peters5ca576e2001-06-18 22:08:13 +00002250 if (why != WHY_RETURN && why != WHY_YIELD)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002251 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002252
Fred Drake9e3ad782001-07-03 23:39:52 +00002253 if (tstate->use_tracing) {
2254 if (tstate->c_tracefunc
2255 && (why == WHY_RETURN || why == WHY_YIELD)) {
2256 if (call_trace(tstate->c_tracefunc,
2257 tstate->c_traceobj, f,
2258 PyTrace_RETURN, retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002259 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002260 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002261 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002262 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002263 }
Fred Drake9e3ad782001-07-03 23:39:52 +00002264 if (tstate->c_profilefunc
2265 && (why == WHY_RETURN || why == WHY_YIELD)) {
2266 if (call_trace(tstate->c_profilefunc,
2267 tstate->c_profileobj, f,
2268 PyTrace_RETURN, retval)) {
2269 Py_XDECREF(retval);
2270 retval = NULL;
2271 why = WHY_EXCEPTION;
2272 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002273 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002274 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002275
Guido van Rossuma027efa1997-05-05 20:56:21 +00002276 reset_exc_info(tstate);
2277
Tim Peters5ca576e2001-06-18 22:08:13 +00002278 /* pop frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002279 --tstate->recursion_depth;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002280 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00002281
Guido van Rossum96a42c81992-01-12 02:29:51 +00002282 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002283}
2284
Tim Peters6d6c1a32001-08-02 04:15:00 +00002285PyObject *
2286PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals,
Tim Peters5ca576e2001-06-18 22:08:13 +00002287 PyObject **args, int argcount, PyObject **kws, int kwcount,
2288 PyObject **defs, int defcount, PyObject *closure)
2289{
2290 register PyFrameObject *f;
2291 register PyObject *retval = NULL;
2292 register PyObject **fastlocals, **freevars;
2293 PyThreadState *tstate = PyThreadState_GET();
2294 PyObject *x, *u;
2295
2296 if (globals == NULL) {
Jeremy Hylton910d7d42001-08-12 21:52:24 +00002297 PyErr_SetString(PyExc_SystemError,
2298 "PyEval_EvalCodeEx: NULL globals");
Tim Peters5ca576e2001-06-18 22:08:13 +00002299 return NULL;
2300 }
2301
2302 f = PyFrame_New(tstate, /*back*/
2303 co, /*code*/
2304 globals, locals);
2305 if (f == NULL)
2306 return NULL;
2307
2308 fastlocals = f->f_localsplus;
2309 freevars = f->f_localsplus + f->f_nlocals;
2310
2311 if (co->co_argcount > 0 ||
2312 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
2313 int i;
2314 int n = argcount;
2315 PyObject *kwdict = NULL;
2316 if (co->co_flags & CO_VARKEYWORDS) {
2317 kwdict = PyDict_New();
2318 if (kwdict == NULL)
2319 goto fail;
2320 i = co->co_argcount;
2321 if (co->co_flags & CO_VARARGS)
2322 i++;
2323 SETLOCAL(i, kwdict);
2324 }
2325 if (argcount > co->co_argcount) {
2326 if (!(co->co_flags & CO_VARARGS)) {
2327 PyErr_Format(PyExc_TypeError,
2328 "%.200s() takes %s %d "
2329 "%sargument%s (%d given)",
2330 PyString_AsString(co->co_name),
2331 defcount ? "at most" : "exactly",
2332 co->co_argcount,
2333 kwcount ? "non-keyword " : "",
2334 co->co_argcount == 1 ? "" : "s",
2335 argcount);
2336 goto fail;
2337 }
2338 n = co->co_argcount;
2339 }
2340 for (i = 0; i < n; i++) {
2341 x = args[i];
2342 Py_INCREF(x);
2343 SETLOCAL(i, x);
2344 }
2345 if (co->co_flags & CO_VARARGS) {
2346 u = PyTuple_New(argcount - n);
2347 if (u == NULL)
2348 goto fail;
2349 SETLOCAL(co->co_argcount, u);
2350 for (i = n; i < argcount; i++) {
2351 x = args[i];
2352 Py_INCREF(x);
2353 PyTuple_SET_ITEM(u, i-n, x);
2354 }
2355 }
2356 for (i = 0; i < kwcount; i++) {
2357 PyObject *keyword = kws[2*i];
2358 PyObject *value = kws[2*i + 1];
2359 int j;
2360 if (keyword == NULL || !PyString_Check(keyword)) {
2361 PyErr_Format(PyExc_TypeError,
2362 "%.200s() keywords must be strings",
2363 PyString_AsString(co->co_name));
2364 goto fail;
2365 }
2366 /* XXX slow -- speed up using dictionary? */
2367 for (j = 0; j < co->co_argcount; j++) {
2368 PyObject *nm = PyTuple_GET_ITEM(
2369 co->co_varnames, j);
2370 int cmp = PyObject_RichCompareBool(
2371 keyword, nm, Py_EQ);
2372 if (cmp > 0)
2373 break;
2374 else if (cmp < 0)
2375 goto fail;
2376 }
2377 /* Check errors from Compare */
2378 if (PyErr_Occurred())
2379 goto fail;
2380 if (j >= co->co_argcount) {
2381 if (kwdict == NULL) {
2382 PyErr_Format(PyExc_TypeError,
2383 "%.200s() got an unexpected "
2384 "keyword argument '%.400s'",
2385 PyString_AsString(co->co_name),
2386 PyString_AsString(keyword));
2387 goto fail;
2388 }
2389 PyDict_SetItem(kwdict, keyword, value);
2390 }
2391 else {
2392 if (GETLOCAL(j) != NULL) {
2393 PyErr_Format(PyExc_TypeError,
2394 "%.200s() got multiple "
2395 "values for keyword "
2396 "argument '%.400s'",
2397 PyString_AsString(co->co_name),
2398 PyString_AsString(keyword));
2399 goto fail;
2400 }
2401 Py_INCREF(value);
2402 SETLOCAL(j, value);
2403 }
2404 }
2405 if (argcount < co->co_argcount) {
2406 int m = co->co_argcount - defcount;
2407 for (i = argcount; i < m; i++) {
2408 if (GETLOCAL(i) == NULL) {
2409 PyErr_Format(PyExc_TypeError,
2410 "%.200s() takes %s %d "
2411 "%sargument%s (%d given)",
2412 PyString_AsString(co->co_name),
2413 ((co->co_flags & CO_VARARGS) ||
2414 defcount) ? "at least"
2415 : "exactly",
2416 m, kwcount ? "non-keyword " : "",
2417 m == 1 ? "" : "s", i);
2418 goto fail;
2419 }
2420 }
2421 if (n > m)
2422 i = n - m;
2423 else
2424 i = 0;
2425 for (; i < defcount; i++) {
2426 if (GETLOCAL(m+i) == NULL) {
2427 PyObject *def = defs[i];
2428 Py_INCREF(def);
2429 SETLOCAL(m+i, def);
2430 }
2431 }
2432 }
2433 }
2434 else {
2435 if (argcount > 0 || kwcount > 0) {
2436 PyErr_Format(PyExc_TypeError,
2437 "%.200s() takes no arguments (%d given)",
2438 PyString_AsString(co->co_name),
2439 argcount + kwcount);
2440 goto fail;
2441 }
2442 }
2443 /* Allocate and initialize storage for cell vars, and copy free
2444 vars into frame. This isn't too efficient right now. */
2445 if (f->f_ncells) {
2446 int i = 0, j = 0, nargs, found;
2447 char *cellname, *argname;
2448 PyObject *c;
2449
2450 nargs = co->co_argcount;
2451 if (co->co_flags & CO_VARARGS)
2452 nargs++;
2453 if (co->co_flags & CO_VARKEYWORDS)
2454 nargs++;
2455
2456 /* Check for cells that shadow args */
2457 for (i = 0; i < f->f_ncells && j < nargs; ++i) {
2458 cellname = PyString_AS_STRING(
2459 PyTuple_GET_ITEM(co->co_cellvars, i));
2460 found = 0;
2461 while (j < nargs) {
2462 argname = PyString_AS_STRING(
2463 PyTuple_GET_ITEM(co->co_varnames, j));
2464 if (strcmp(cellname, argname) == 0) {
2465 c = PyCell_New(GETLOCAL(j));
2466 if (c == NULL)
2467 goto fail;
2468 GETLOCAL(f->f_nlocals + i) = c;
2469 found = 1;
2470 break;
2471 }
2472 j++;
2473 }
2474 if (found == 0) {
2475 c = PyCell_New(NULL);
2476 if (c == NULL)
2477 goto fail;
2478 SETLOCAL(f->f_nlocals + i, c);
2479 }
2480 }
2481 /* Initialize any that are left */
2482 while (i < f->f_ncells) {
2483 c = PyCell_New(NULL);
2484 if (c == NULL)
2485 goto fail;
2486 SETLOCAL(f->f_nlocals + i, c);
2487 i++;
2488 }
2489 }
2490 if (f->f_nfreevars) {
2491 int i;
2492 for (i = 0; i < f->f_nfreevars; ++i) {
2493 PyObject *o = PyTuple_GET_ITEM(closure, i);
2494 Py_INCREF(o);
2495 freevars[f->f_ncells + i] = o;
2496 }
2497 }
2498
Fred Drake9e3ad782001-07-03 23:39:52 +00002499 if (tstate->use_tracing) {
2500 if (tstate->c_tracefunc != NULL) {
2501 /* tstate->c_tracefunc, if defined, is a
2502 function that will be called on *every* entry
2503 to a code block. Its return value, if not
2504 None, is a function that will be called at
2505 the start of each executed line of code.
2506 (Actually, the function must return itself
2507 in order to continue tracing.) The trace
2508 functions are called with three arguments:
2509 a pointer to the current frame, a string
2510 indicating why the function is called, and
2511 an argument which depends on the situation.
2512 The global trace function is also called
2513 whenever an exception is detected. */
2514 if (call_trace(tstate->c_tracefunc, tstate->c_traceobj,
2515 f, PyTrace_CALL, Py_None)) {
2516 /* XXX Need way to compute arguments?? */
2517 /* Trace function raised an error */
2518 goto fail;
2519 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002520 }
Fred Drake9e3ad782001-07-03 23:39:52 +00002521 if (tstate->c_profilefunc != NULL) {
2522 /* Similar for c_profilefunc, except it needn't
2523 return itself and isn't called for "line" events */
2524 if (call_trace(tstate->c_profilefunc,
2525 tstate->c_profileobj,
2526 f, PyTrace_CALL, Py_None)) {
2527 /* XXX Need way to compute arguments?? */
2528 /* Profile function raised an error */
2529 goto fail;
2530 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002531 }
2532 }
2533
2534 if (co->co_flags & CO_GENERATOR) {
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002535 /* Don't need to keep the reference to f_back, it will be set
2536 * when the generator is resumed. */
Tim Peters5ba58662001-07-16 02:29:45 +00002537 Py_XDECREF(f->f_back);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002538 f->f_back = NULL;
2539
2540 /* Create a new generator that owns the ready to run frame
2541 * and return that as the value. */
Tim Peters5ca576e2001-06-18 22:08:13 +00002542 return gen_new(f);
2543 }
2544
2545 retval = eval_frame(f);
2546
2547 fail: /* Jump here from prelude on failure */
2548
2549 Py_DECREF(f);
2550 return retval;
2551}
2552
2553
Guido van Rossuma027efa1997-05-05 20:56:21 +00002554static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002555set_exc_info(PyThreadState *tstate,
2556 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002557{
2558 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002559 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002560
Guido van Rossuma027efa1997-05-05 20:56:21 +00002561 frame = tstate->frame;
2562 if (frame->f_exc_type == NULL) {
2563 /* This frame didn't catch an exception before */
2564 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002565 if (tstate->exc_type == NULL) {
2566 Py_INCREF(Py_None);
2567 tstate->exc_type = Py_None;
2568 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002569 tmp_type = frame->f_exc_type;
2570 tmp_value = frame->f_exc_value;
2571 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002572 Py_XINCREF(tstate->exc_type);
2573 Py_XINCREF(tstate->exc_value);
2574 Py_XINCREF(tstate->exc_traceback);
2575 frame->f_exc_type = tstate->exc_type;
2576 frame->f_exc_value = tstate->exc_value;
2577 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002578 Py_XDECREF(tmp_type);
2579 Py_XDECREF(tmp_value);
2580 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002581 }
2582 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002583 tmp_type = tstate->exc_type;
2584 tmp_value = tstate->exc_value;
2585 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002586 Py_XINCREF(type);
2587 Py_XINCREF(value);
2588 Py_XINCREF(tb);
2589 tstate->exc_type = type;
2590 tstate->exc_value = value;
2591 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002592 Py_XDECREF(tmp_type);
2593 Py_XDECREF(tmp_value);
2594 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002595 /* For b/w compatibility */
2596 PySys_SetObject("exc_type", type);
2597 PySys_SetObject("exc_value", value);
2598 PySys_SetObject("exc_traceback", tb);
2599}
2600
2601static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002602reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002603{
2604 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002605 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002606 frame = tstate->frame;
2607 if (frame->f_exc_type != NULL) {
2608 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002609 tmp_type = tstate->exc_type;
2610 tmp_value = tstate->exc_value;
2611 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002612 Py_XINCREF(frame->f_exc_type);
2613 Py_XINCREF(frame->f_exc_value);
2614 Py_XINCREF(frame->f_exc_traceback);
2615 tstate->exc_type = frame->f_exc_type;
2616 tstate->exc_value = frame->f_exc_value;
2617 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002618 Py_XDECREF(tmp_type);
2619 Py_XDECREF(tmp_value);
2620 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002621 /* For b/w compatibility */
2622 PySys_SetObject("exc_type", frame->f_exc_type);
2623 PySys_SetObject("exc_value", frame->f_exc_value);
2624 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2625 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002626 tmp_type = frame->f_exc_type;
2627 tmp_value = frame->f_exc_value;
2628 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002629 frame->f_exc_type = NULL;
2630 frame->f_exc_value = NULL;
2631 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002632 Py_XDECREF(tmp_type);
2633 Py_XDECREF(tmp_value);
2634 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002635}
2636
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002637/* Logic for the raise statement (too complicated for inlining).
2638 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002639static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002640do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002641{
Guido van Rossumd295f121998-04-09 21:39:57 +00002642 if (type == NULL) {
2643 /* Reraise */
2644 PyThreadState *tstate = PyThreadState_Get();
2645 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2646 value = tstate->exc_value;
2647 tb = tstate->exc_traceback;
2648 Py_XINCREF(type);
2649 Py_XINCREF(value);
2650 Py_XINCREF(tb);
2651 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002652
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002653 /* We support the following forms of raise:
2654 raise <class>, <classinstance>
2655 raise <class>, <argument tuple>
2656 raise <class>, None
2657 raise <class>, <argument>
2658 raise <classinstance>, None
2659 raise <string>, <object>
2660 raise <string>, None
2661
2662 An omitted second argument is the same as None.
2663
2664 In addition, raise <tuple>, <anything> is the same as
2665 raising the tuple's first item (and it better have one!);
2666 this rule is applied recursively.
2667
2668 Finally, an optional third argument can be supplied, which
2669 gives the traceback to be substituted (useful when
2670 re-raising an exception after examining it). */
2671
2672 /* First, check the traceback argument, replacing None with
2673 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002674 if (tb == Py_None) {
2675 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002676 tb = NULL;
2677 }
2678 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002679 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002680 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002681 goto raise_error;
2682 }
2683
2684 /* Next, replace a missing value with None */
2685 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002686 value = Py_None;
2687 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002688 }
2689
2690 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002691 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2692 PyObject *tmp = type;
2693 type = PyTuple_GET_ITEM(type, 0);
2694 Py_INCREF(type);
2695 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002696 }
2697
Barry Warsaw4249f541997-08-22 21:26:19 +00002698 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002699 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002700
2701 else if (PyClass_Check(type))
2702 PyErr_NormalizeException(&type, &value, &tb);
2703
Guido van Rossumb209a111997-04-29 18:18:01 +00002704 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002705 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002706 if (value != Py_None) {
2707 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002708 "instance exception may not have a separate value");
2709 goto raise_error;
2710 }
2711 else {
2712 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002713 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002714 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002715 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2716 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002717 }
2718 }
2719 else {
2720 /* Not something you can raise. You get an exception
2721 anyway, just not what you specified :-) */
Jeremy Hylton960d9482001-04-27 02:25:33 +00002722 PyErr_Format(PyExc_TypeError,
2723 "exceptions must be strings, classes, or "
2724 "instances, not %s", type->ob_type->tp_name);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002725 goto raise_error;
2726 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002727 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002728 if (tb == NULL)
2729 return WHY_EXCEPTION;
2730 else
2731 return WHY_RERAISE;
2732 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002733 Py_XDECREF(value);
2734 Py_XDECREF(type);
2735 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002736 return WHY_EXCEPTION;
2737}
2738
Tim Petersd6d010b2001-06-21 02:49:55 +00002739/* Iterate v argcnt times and store the results on the stack (via decreasing
2740 sp). Return 1 for success, 0 if error. */
2741
Barry Warsawe42b18f1997-08-25 22:13:04 +00002742static int
Tim Petersd6d010b2001-06-21 02:49:55 +00002743unpack_iterable(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002744{
Tim Petersd6d010b2001-06-21 02:49:55 +00002745 int i = 0;
2746 PyObject *it; /* iter(v) */
Barry Warsawe42b18f1997-08-25 22:13:04 +00002747 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00002748
Tim Petersd6d010b2001-06-21 02:49:55 +00002749 assert(v != NULL);
2750
2751 it = PyObject_GetIter(v);
2752 if (it == NULL)
2753 goto Error;
2754
2755 for (; i < argcnt; i++) {
2756 w = PyIter_Next(it);
2757 if (w == NULL) {
2758 /* Iterator done, via error or exhaustion. */
2759 if (!PyErr_Occurred()) {
2760 PyErr_Format(PyExc_ValueError,
2761 "need more than %d value%s to unpack",
2762 i, i == 1 ? "" : "s");
2763 }
2764 goto Error;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002765 }
2766 *--sp = w;
2767 }
Tim Petersd6d010b2001-06-21 02:49:55 +00002768
2769 /* We better have exhausted the iterator now. */
2770 w = PyIter_Next(it);
2771 if (w == NULL) {
2772 if (PyErr_Occurred())
2773 goto Error;
2774 Py_DECREF(it);
2775 return 1;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002776 }
Tim Petersd6d010b2001-06-21 02:49:55 +00002777 PyErr_SetString(PyExc_ValueError, "too many values to unpack");
Barry Warsawe42b18f1997-08-25 22:13:04 +00002778 /* fall through */
Tim Petersd6d010b2001-06-21 02:49:55 +00002779Error:
Barry Warsaw91010551997-08-25 22:30:51 +00002780 for (; i > 0; i--, sp++)
2781 Py_DECREF(*sp);
Tim Petersd6d010b2001-06-21 02:49:55 +00002782 Py_XDECREF(it);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002783 return 0;
2784}
2785
2786
Guido van Rossum96a42c81992-01-12 02:29:51 +00002787#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002788static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002789prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002790{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002791 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002792 if (PyObject_Print(v, stdout, 0) != 0)
2793 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002794 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002795 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002796}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002797#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002798
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002799static void
Fred Drake5755ce62001-06-27 19:19:46 +00002800call_exc_trace(Py_tracefunc func, PyObject *self, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002801{
Guido van Rossumb209a111997-04-29 18:18:01 +00002802 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002803 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002804 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002805 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002806 value = Py_None;
2807 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002808 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002809 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002810 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002811 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002812 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002813 }
Fred Drake5755ce62001-06-27 19:19:46 +00002814 err = call_trace(func, self, f, PyTrace_EXCEPTION, arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002815 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002816 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002817 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002818 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002819 Py_XDECREF(type);
2820 Py_XDECREF(value);
2821 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002822 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002823}
2824
2825static int
Fred Drake5755ce62001-06-27 19:19:46 +00002826call_trace(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
2827 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002828{
Fred Drake5755ce62001-06-27 19:19:46 +00002829 register PyThreadState *tstate = frame->f_tstate;
2830 int result;
2831 if (tstate->tracing)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002832 return 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002833 tstate->tracing++;
Fred Drake9e3ad782001-07-03 23:39:52 +00002834 tstate->use_tracing = 0;
Fred Drake5755ce62001-06-27 19:19:46 +00002835 result = func(obj, frame, what, arg);
Fred Drake9e3ad782001-07-03 23:39:52 +00002836 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
2837 || (tstate->c_profilefunc != NULL));
Guido van Rossuma027efa1997-05-05 20:56:21 +00002838 tstate->tracing--;
Fred Drake5755ce62001-06-27 19:19:46 +00002839 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002840}
2841
Fred Drake5755ce62001-06-27 19:19:46 +00002842void
2843PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00002844{
Fred Drake5755ce62001-06-27 19:19:46 +00002845 PyThreadState *tstate = PyThreadState_Get();
2846 PyObject *temp = tstate->c_profileobj;
2847 Py_XINCREF(arg);
2848 tstate->c_profilefunc = NULL;
2849 tstate->c_profileobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00002850 tstate->use_tracing = tstate->c_tracefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00002851 Py_XDECREF(temp);
2852 tstate->c_profilefunc = func;
2853 tstate->c_profileobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00002854 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
Fred Drake5755ce62001-06-27 19:19:46 +00002855}
2856
2857void
2858PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
2859{
2860 PyThreadState *tstate = PyThreadState_Get();
2861 PyObject *temp = tstate->c_traceobj;
2862 Py_XINCREF(arg);
2863 tstate->c_tracefunc = NULL;
2864 tstate->c_traceobj = NULL;
Fred Drake9e3ad782001-07-03 23:39:52 +00002865 tstate->use_tracing = tstate->c_profilefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00002866 Py_XDECREF(temp);
2867 tstate->c_tracefunc = func;
2868 tstate->c_traceobj = arg;
Fred Drake9e3ad782001-07-03 23:39:52 +00002869 tstate->use_tracing = ((func != NULL)
2870 || (tstate->c_profilefunc != NULL));
Fred Draked0838392001-06-16 21:02:31 +00002871}
2872
Guido van Rossumb209a111997-04-29 18:18:01 +00002873PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002874PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002875{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002876 PyThreadState *tstate = PyThreadState_Get();
2877 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002878 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002879 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002880 else
2881 return current_frame->f_builtins;
2882}
2883
Guido van Rossumb209a111997-04-29 18:18:01 +00002884PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002885PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002886{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002887 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002888 if (current_frame == NULL)
2889 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002890 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002891 return current_frame->f_locals;
2892}
2893
Guido van Rossumb209a111997-04-29 18:18:01 +00002894PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002895PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002896{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002897 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002898 if (current_frame == NULL)
2899 return NULL;
2900 else
2901 return current_frame->f_globals;
2902}
2903
Guido van Rossumb209a111997-04-29 18:18:01 +00002904PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002905PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002906{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002907 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002908 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002909}
2910
Guido van Rossum6135a871995-01-09 17:53:26 +00002911int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002912PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002913{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002914 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002915 return current_frame == NULL ? 0 : current_frame->f_restricted;
2916}
2917
Guido van Rossumbe270261997-05-22 22:26:18 +00002918int
Tim Peters5ba58662001-07-16 02:29:45 +00002919PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
Jeremy Hylton061d1062001-03-22 02:32:48 +00002920{
2921 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Tim Peters5ba58662001-07-16 02:29:45 +00002922 int result = 0;
2923
2924 if (current_frame != NULL) {
2925 const int codeflags = current_frame->f_code->co_flags;
Tim Peterse2c18e92001-08-17 20:47:47 +00002926 const int compilerflags = codeflags & PyCF_MASK;
2927 if (compilerflags) {
Tim Peters5ba58662001-07-16 02:29:45 +00002928 result = 1;
Tim Peterse2c18e92001-08-17 20:47:47 +00002929 cf->cf_flags |= compilerflags;
Tim Peters5ba58662001-07-16 02:29:45 +00002930 }
2931 }
2932 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00002933}
2934
2935int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002936Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002937{
Guido van Rossumb209a111997-04-29 18:18:01 +00002938 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002939 if (f == NULL)
2940 return 0;
2941 if (!PyFile_SoftSpace(f, 0))
2942 return 0;
2943 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002944}
2945
Guido van Rossum3f5da241990-12-20 15:06:42 +00002946
Guido van Rossum681d79a1995-07-18 14:51:37 +00002947/* External interface to call any callable object.
2948 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002949
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002950#undef PyEval_CallObject
2951/* for backward compatibility: export this interface */
2952
Guido van Rossumb209a111997-04-29 18:18:01 +00002953PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002954PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002955{
Guido van Rossumb209a111997-04-29 18:18:01 +00002956 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002957}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002958#define PyEval_CallObject(func,arg) \
2959 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002960
Guido van Rossumb209a111997-04-29 18:18:01 +00002961PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002962PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002963{
Jeremy Hylton52820442001-01-03 23:52:36 +00002964 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002965
2966 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002967 arg = PyTuple_New(0);
2968 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002969 PyErr_SetString(PyExc_TypeError,
2970 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002971 return NULL;
2972 }
2973 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002974 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002975
Guido van Rossumb209a111997-04-29 18:18:01 +00002976 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002977 PyErr_SetString(PyExc_TypeError,
2978 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00002979 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002980 return NULL;
2981 }
2982
Tim Peters6d6c1a32001-08-02 04:15:00 +00002983 result = PyObject_Call(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002984 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00002985 return result;
2986}
2987
Tim Peters6d6c1a32001-08-02 04:15:00 +00002988char *
2989PyEval_GetFuncName(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00002990{
2991 if (PyMethod_Check(func))
Tim Peters6d6c1a32001-08-02 04:15:00 +00002992 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00002993 else if (PyFunction_Check(func))
2994 return PyString_AsString(((PyFunctionObject*)func)->func_name);
2995 else if (PyCFunction_Check(func))
2996 return ((PyCFunctionObject*)func)->m_ml->ml_name;
2997 else if (PyClass_Check(func))
2998 return PyString_AsString(((PyClassObject*)func)->cl_name);
2999 else if (PyInstance_Check(func)) {
3000 return PyString_AsString(
3001 ((PyInstanceObject*)func)->in_class->cl_name);
3002 } else {
3003 return func->ob_type->tp_name;
3004 }
3005}
3006
Tim Peters6d6c1a32001-08-02 04:15:00 +00003007char *
3008PyEval_GetFuncDesc(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003009{
3010 if (PyMethod_Check(func))
3011 return "()";
3012 else if (PyFunction_Check(func))
3013 return "()";
3014 else if (PyCFunction_Check(func))
3015 return "()";
3016 else if (PyClass_Check(func))
3017 return " constructor";
3018 else if (PyInstance_Check(func)) {
3019 return " instance";
3020 } else {
3021 return " object";
3022 }
3023}
3024
Jeremy Hylton52820442001-01-03 23:52:36 +00003025#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
3026
3027/* The two fast_xxx() functions optimize calls for which no argument
3028 tuple is necessary; the objects are passed directly from the stack.
3029 fast_cfunction() is called for METH_OLDARGS functions.
3030 fast_function() is for functions with no special argument handling.
3031*/
3032
3033static PyObject *
3034fast_cfunction(PyObject *func, PyObject ***pp_stack, int na)
3035{
3036 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3037 PyObject *self = PyCFunction_GET_SELF(func);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003038 int flags = PyCFunction_GET_FLAGS(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003039
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003040 switch (flags) {
3041 case METH_OLDARGS:
3042 if (na == 0)
3043 return (*meth)(self, NULL);
3044 else if (na == 1) {
3045 PyObject *arg = EXT_POP(*pp_stack);
3046 PyObject *result = (*meth)(self, arg);
3047 Py_DECREF(arg);
3048 return result;
3049 } else {
3050 PyObject *args = load_args(pp_stack, na);
3051 PyObject *result = (*meth)(self, args);
3052 Py_DECREF(args);
3053 return result;
3054 }
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003055 case METH_NOARGS:
3056 if (na == 0)
3057 return (*meth)(self, NULL);
3058 PyErr_Format(PyExc_TypeError,
3059 "%.200s() takes no arguments (%d given)",
3060 ((PyCFunctionObject*)func)->m_ml->ml_name, na);
3061 return NULL;
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003062 case METH_O:
3063 if (na == 1) {
3064 PyObject *arg = EXT_POP(*pp_stack);
3065 PyObject *result = (*meth)(self, arg);
3066 Py_DECREF(arg);
3067 return result;
3068 }
3069 PyErr_Format(PyExc_TypeError,
3070 "%.200s() takes exactly one argument (%d given)",
3071 ((PyCFunctionObject*)func)->m_ml->ml_name, na);
3072 return NULL;
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00003073 default:
3074 fprintf(stderr, "%.200s() flags = %d\n",
3075 ((PyCFunctionObject*)func)->m_ml->ml_name, flags);
3076 PyErr_BadInternalCall();
3077 return NULL;
3078 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003079}
3080
3081static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00003082fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00003083{
3084 PyObject *co = PyFunction_GET_CODE(func);
3085 PyObject *globals = PyFunction_GET_GLOBALS(func);
3086 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003087 PyObject *closure = PyFunction_GET_CLOSURE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003088 PyObject **d = NULL;
3089 int nd = 0;
3090
3091 if (argdefs != NULL) {
3092 d = &PyTuple_GET_ITEM(argdefs, 0);
3093 nd = ((PyTupleObject *)argdefs)->ob_size;
3094 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003095 return PyEval_EvalCodeEx((PyCodeObject *)co, globals,
Jeremy Hylton52820442001-01-03 23:52:36 +00003096 (PyObject *)NULL, (*pp_stack)-n, na,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003097 (*pp_stack)-2*nk, nk, d, nd,
3098 closure);
Jeremy Hylton52820442001-01-03 23:52:36 +00003099}
3100
3101static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00003102update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
3103 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00003104{
3105 PyObject *kwdict = NULL;
3106 if (orig_kwdict == NULL)
3107 kwdict = PyDict_New();
3108 else {
3109 kwdict = PyDict_Copy(orig_kwdict);
3110 Py_DECREF(orig_kwdict);
3111 }
3112 if (kwdict == NULL)
3113 return NULL;
3114 while (--nk >= 0) {
3115 int err;
3116 PyObject *value = EXT_POP(*pp_stack);
3117 PyObject *key = EXT_POP(*pp_stack);
3118 if (PyDict_GetItem(kwdict, key) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +00003119 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00003120 "%.200s%s got multiple values "
Jeremy Hylton512a2372001-04-11 13:52:29 +00003121 "for keyword argument '%.200s'",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003122 PyEval_GetFuncName(func),
3123 PyEval_GetFuncDesc(func),
Jeremy Hylton512a2372001-04-11 13:52:29 +00003124 PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00003125 Py_DECREF(key);
3126 Py_DECREF(value);
3127 Py_DECREF(kwdict);
3128 return NULL;
3129 }
3130 err = PyDict_SetItem(kwdict, key, value);
3131 Py_DECREF(key);
3132 Py_DECREF(value);
3133 if (err) {
3134 Py_DECREF(kwdict);
3135 return NULL;
3136 }
3137 }
3138 return kwdict;
3139}
3140
3141static PyObject *
3142update_star_args(int nstack, int nstar, PyObject *stararg,
3143 PyObject ***pp_stack)
3144{
3145 PyObject *callargs, *w;
3146
3147 callargs = PyTuple_New(nstack + nstar);
3148 if (callargs == NULL) {
3149 return NULL;
3150 }
3151 if (nstar) {
3152 int i;
3153 for (i = 0; i < nstar; i++) {
3154 PyObject *a = PyTuple_GET_ITEM(stararg, i);
3155 Py_INCREF(a);
3156 PyTuple_SET_ITEM(callargs, nstack + i, a);
3157 }
3158 }
3159 while (--nstack >= 0) {
3160 w = EXT_POP(*pp_stack);
3161 PyTuple_SET_ITEM(callargs, nstack, w);
3162 }
3163 return callargs;
3164}
3165
3166static PyObject *
3167load_args(PyObject ***pp_stack, int na)
3168{
3169 PyObject *args = PyTuple_New(na);
3170 PyObject *w;
3171
3172 if (args == NULL)
3173 return NULL;
3174 while (--na >= 0) {
3175 w = EXT_POP(*pp_stack);
3176 PyTuple_SET_ITEM(args, na, w);
3177 }
3178 return args;
3179}
3180
3181static PyObject *
3182do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
3183{
3184 PyObject *callargs = NULL;
3185 PyObject *kwdict = NULL;
3186 PyObject *result = NULL;
3187
3188 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003189 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003190 if (kwdict == NULL)
3191 goto call_fail;
3192 }
3193 callargs = load_args(pp_stack, na);
3194 if (callargs == NULL)
3195 goto call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003196 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003197 call_fail:
3198 Py_XDECREF(callargs);
3199 Py_XDECREF(kwdict);
3200 return result;
3201}
3202
3203static PyObject *
3204ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3205{
3206 int nstar = 0;
3207 PyObject *callargs = NULL;
3208 PyObject *stararg = NULL;
3209 PyObject *kwdict = NULL;
3210 PyObject *result = NULL;
3211
3212 if (flags & CALL_FLAG_KW) {
3213 kwdict = EXT_POP(*pp_stack);
3214 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003215 PyErr_Format(PyExc_TypeError,
Jeremy Hylton512a2372001-04-11 13:52:29 +00003216 "%s%s argument after ** "
3217 "must be a dictionary",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003218 PyEval_GetFuncName(func),
3219 PyEval_GetFuncDesc(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00003220 goto ext_call_fail;
3221 }
3222 }
3223 if (flags & CALL_FLAG_VAR) {
3224 stararg = EXT_POP(*pp_stack);
3225 if (!PyTuple_Check(stararg)) {
3226 PyObject *t = NULL;
3227 t = PySequence_Tuple(stararg);
3228 if (t == NULL) {
Jeremy Hylton512a2372001-04-11 13:52:29 +00003229 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
3230 PyErr_Format(PyExc_TypeError,
3231 "%s%s argument after * "
3232 "must be a sequence",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003233 PyEval_GetFuncName(func),
3234 PyEval_GetFuncDesc(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003235 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003236 goto ext_call_fail;
3237 }
3238 Py_DECREF(stararg);
3239 stararg = t;
3240 }
3241 nstar = PyTuple_GET_SIZE(stararg);
3242 }
3243 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003244 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003245 if (kwdict == NULL)
3246 goto ext_call_fail;
3247 }
3248 callargs = update_star_args(na, nstar, stararg, pp_stack);
3249 if (callargs == NULL)
3250 goto ext_call_fail;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003251 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003252 ext_call_fail:
3253 Py_XDECREF(callargs);
3254 Py_XDECREF(kwdict);
3255 Py_XDECREF(stararg);
3256 return result;
3257}
3258
Guido van Rossum3b9c6671996-07-30 18:40:29 +00003259#define SLICE_ERROR_MSG \
3260 "standard sequence type does not support step size other than one"
3261
Guido van Rossumb209a111997-04-29 18:18:01 +00003262static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003263loop_subscript(PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003264{
Guido van Rossumb209a111997-04-29 18:18:01 +00003265 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00003266 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003267 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003268 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003269 return NULL;
3270 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003271 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00003272 v = (*sq->sq_item)(v, i);
3273 if (v)
3274 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00003275 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00003276 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00003277 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003278}
3279
Guido van Rossum20c6add2000-05-08 14:06:50 +00003280/* Extract a slice index from a PyInt or PyLong, the index is bound to
3281 the range [-INT_MAX+1, INTMAX]. Returns 0 and an exception if there is
3282 and error. Returns 1 on success.*/
3283
3284int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003285_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003286{
3287 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003288 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003289 if (PyInt_Check(v)) {
3290 x = PyInt_AsLong(v);
3291 } else if (PyLong_Check(v)) {
3292 x = PyLong_AsLong(v);
3293 if (x==-1 && PyErr_Occurred()) {
3294 PyObject *long_zero;
Guido van Rossumac7be682001-01-17 15:42:30 +00003295 int cmp;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003296
Guido van Rossumac7be682001-01-17 15:42:30 +00003297 if (!PyErr_ExceptionMatches(
3298 PyExc_OverflowError)) {
3299 /* It's not an overflow error, so just
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003300 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00003301 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003302 }
3303
Guido van Rossumac7be682001-01-17 15:42:30 +00003304 /* Clear the OverflowError */
3305 PyErr_Clear();
3306
3307 /* It's an overflow error, so we need to
3308 check the sign of the long integer,
3309 set the value to INT_MAX or 0, and clear
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003310 the error. */
3311
3312 /* Create a long integer with a value of 0 */
Guido van Rossumac7be682001-01-17 15:42:30 +00003313 long_zero = PyLong_FromLong(0L);
Guido van Rossum20c6add2000-05-08 14:06:50 +00003314 if (long_zero == NULL) return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003315
3316 /* Check sign */
Guido van Rossumac7be682001-01-17 15:42:30 +00003317 cmp = PyObject_RichCompareBool(v, long_zero,
3318 Py_GT);
3319 Py_DECREF(long_zero);
3320 if (cmp < 0)
3321 return 0;
3322 else if (cmp > 0)
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003323 x = INT_MAX;
3324 else
3325 x = 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003326 }
3327 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003328 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003329 "slice indices must be integers");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003330 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003331 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003332 /* Truncate -- very long indices are truncated anyway */
3333 if (x > INT_MAX)
3334 x = INT_MAX;
3335 else if (x < -INT_MAX)
3336 x = 0;
3337 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003338 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003339 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003340}
3341
Guido van Rossum50d756e2001-08-18 17:43:36 +00003342#undef ISINT
3343#define ISINT(x) ((x) == NULL || PyInt_Check(x) || PyLong_Check(x))
3344
Guido van Rossumb209a111997-04-29 18:18:01 +00003345static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003346apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003347{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003348 PyTypeObject *tp = u->ob_type;
3349 PySequenceMethods *sq = tp->tp_as_sequence;
3350
3351 if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) {
3352 int ilow = 0, ihigh = INT_MAX;
3353 if (!_PyEval_SliceIndex(v, &ilow))
3354 return NULL;
3355 if (!_PyEval_SliceIndex(w, &ihigh))
3356 return NULL;
3357 return PySequence_GetSlice(u, ilow, ihigh);
3358 }
3359 else {
3360 PyObject *slice = PySlice_New(v, w, NULL);
3361 if (slice != NULL)
3362 return PyObject_GetItem(u, slice);
3363 else
3364 return NULL;
3365 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003366}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003367
3368static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003369assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3370 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003371{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003372 PyTypeObject *tp = u->ob_type;
3373 PySequenceMethods *sq = tp->tp_as_sequence;
3374
3375 if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) {
3376 int ilow = 0, ihigh = INT_MAX;
3377 if (!_PyEval_SliceIndex(v, &ilow))
3378 return -1;
3379 if (!_PyEval_SliceIndex(w, &ihigh))
3380 return -1;
3381 if (x == NULL)
3382 return PySequence_DelSlice(u, ilow, ihigh);
3383 else
3384 return PySequence_SetSlice(u, ilow, ihigh, x);
3385 }
3386 else {
3387 PyObject *slice = PySlice_New(v, w, NULL);
3388 if (slice != NULL) {
3389 if (x != NULL)
3390 return PyObject_SetItem(u, slice, x);
3391 else
3392 return PyObject_DelItem(u, slice);
3393 }
3394 else
3395 return -1;
3396 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003397}
3398
Guido van Rossumb209a111997-04-29 18:18:01 +00003399static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003400cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003401{
Guido van Rossumac7be682001-01-17 15:42:30 +00003402 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003403 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00003404 case IS:
3405 case IS_NOT:
3406 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00003407 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003408 res = !res;
3409 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003410 case IN:
3411 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003412 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003413 if (res < 0)
3414 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00003415 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003416 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003417 break;
3418 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00003419 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003420 break;
3421 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003422 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003423 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003424 v = res ? Py_True : Py_False;
3425 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003426 return v;
3427}
3428
Thomas Wouters52152252000-08-17 22:55:00 +00003429static PyObject *
3430import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003431{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003432 PyObject *x;
3433
3434 x = PyObject_GetAttr(v, name);
3435 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00003436 PyErr_Format(PyExc_ImportError,
3437 "cannot import name %.230s",
3438 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003439 }
Thomas Wouters52152252000-08-17 22:55:00 +00003440 return x;
3441}
Guido van Rossumac7be682001-01-17 15:42:30 +00003442
Thomas Wouters52152252000-08-17 22:55:00 +00003443static int
3444import_all_from(PyObject *locals, PyObject *v)
3445{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003446 PyObject *all = PyObject_GetAttrString(v, "__all__");
3447 PyObject *dict, *name, *value;
3448 int skip_leading_underscores = 0;
3449 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003450
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003451 if (all == NULL) {
3452 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3453 return -1; /* Unexpected error */
3454 PyErr_Clear();
3455 dict = PyObject_GetAttrString(v, "__dict__");
3456 if (dict == NULL) {
3457 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3458 return -1;
3459 PyErr_SetString(PyExc_ImportError,
3460 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003461 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003462 }
3463 all = PyMapping_Keys(dict);
3464 Py_DECREF(dict);
3465 if (all == NULL)
3466 return -1;
3467 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003468 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003469
3470 for (pos = 0, err = 0; ; pos++) {
3471 name = PySequence_GetItem(all, pos);
3472 if (name == NULL) {
3473 if (!PyErr_ExceptionMatches(PyExc_IndexError))
3474 err = -1;
3475 else
3476 PyErr_Clear();
3477 break;
3478 }
3479 if (skip_leading_underscores &&
3480 PyString_Check(name) &&
3481 PyString_AS_STRING(name)[0] == '_')
3482 {
3483 Py_DECREF(name);
3484 continue;
3485 }
3486 value = PyObject_GetAttr(v, name);
3487 if (value == NULL)
3488 err = -1;
3489 else
3490 err = PyDict_SetItem(locals, name, value);
3491 Py_DECREF(name);
3492 Py_XDECREF(value);
3493 if (err != 0)
3494 break;
3495 }
3496 Py_DECREF(all);
3497 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003498}
3499
Guido van Rossumb209a111997-04-29 18:18:01 +00003500static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003501build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003502{
Tim Peters6d6c1a32001-08-02 04:15:00 +00003503 PyObject *metaclass = NULL;
3504
3505 if (PyDict_Check(methods))
3506 metaclass = PyDict_GetItemString(methods, "__metaclass__");
3507
3508 if (metaclass == NULL) {
3509 if (PyTuple_Check(bases) && PyTuple_GET_SIZE(bases) > 0)
3510 metaclass = (PyObject *)
3511 PyTuple_GET_ITEM(bases, 0)->ob_type;
3512 else {
3513 PyObject *g = PyEval_GetGlobals();
3514 if (g != NULL && PyDict_Check(g))
3515 metaclass = PyDict_GetItemString(
3516 g, "__metaclass__");
3517 if (metaclass == NULL)
3518 metaclass = (PyObject *) &PyClass_Type;
Guido van Rossum25831651993-05-19 14:50:45 +00003519 }
3520 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003521 return PyObject_CallFunction(metaclass, "OOO", name, bases, methods);
Guido van Rossum25831651993-05-19 14:50:45 +00003522}
3523
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003524static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003525exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3526 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003527{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003528 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003529 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003530 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003531
Guido van Rossumb209a111997-04-29 18:18:01 +00003532 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3533 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003534 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003535 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003536 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003537 locals = PyTuple_GetItem(prog, 2);
3538 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003539 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003540 if (globals == Py_None) {
3541 globals = PyEval_GetGlobals();
3542 if (locals == Py_None) {
3543 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003544 plain = 1;
3545 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003546 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003547 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003548 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003549 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003550 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003551 !PyCode_Check(prog) &&
3552 !PyFile_Check(prog)) {
3553 PyErr_SetString(PyExc_TypeError,
Guido van Rossumac7be682001-01-17 15:42:30 +00003554 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003555 return -1;
3556 }
Fred Drake661ea262000-10-24 19:57:45 +00003557 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003558 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003559 "exec: arg 2 must be a dictionary or None");
3560 return -1;
3561 }
3562 if (!PyDict_Check(locals)) {
3563 PyErr_SetString(PyExc_TypeError,
3564 "exec: arg 3 must be a dictionary or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003565 return -1;
3566 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003567 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003568 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003569 if (PyCode_Check(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003570 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003571 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003572 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003573 FILE *fp = PyFile_AsFile(prog);
3574 char *name = PyString_AsString(PyFile_Name(prog));
Tim Peters5ba58662001-07-16 02:29:45 +00003575 PyCompilerFlags cf;
3576 cf.cf_flags = 0;
3577 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003578 v = PyRun_FileFlags(fp, name, Py_file_input, globals,
3579 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003580 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003581 v = PyRun_File(fp, name, Py_file_input, globals,
3582 locals);
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003583 }
3584 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003585 char *str;
Tim Peters5ba58662001-07-16 02:29:45 +00003586 PyCompilerFlags cf;
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003587 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003588 return -1;
Tim Peters5ba58662001-07-16 02:29:45 +00003589 cf.cf_flags = 0;
3590 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003591 v = PyRun_StringFlags(str, Py_file_input, globals,
3592 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00003593 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003594 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003595 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003596 if (plain)
3597 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003598 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003599 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003600 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003601 return 0;
3602}
Guido van Rossum24c13741995-02-14 09:42:43 +00003603
Guido van Rossumac7be682001-01-17 15:42:30 +00003604static void
Paul Prescode68140d2000-08-30 20:25:01 +00003605format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3606{
3607 char *obj_str;
3608
3609 if (!obj)
3610 return;
3611
3612 obj_str = PyString_AsString(obj);
3613 if (!obj_str)
3614 return;
3615
3616 PyErr_Format(exc, format_str, obj_str);
3617}
Guido van Rossum950361c1997-01-24 13:49:28 +00003618
3619#ifdef DYNAMIC_EXECUTION_PROFILE
3620
3621PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003622getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003623{
3624 int i;
3625 PyObject *l = PyList_New(256);
3626 if (l == NULL) return NULL;
3627 for (i = 0; i < 256; i++) {
3628 PyObject *x = PyInt_FromLong(a[i]);
3629 if (x == NULL) {
3630 Py_DECREF(l);
3631 return NULL;
3632 }
3633 PyList_SetItem(l, i, x);
3634 }
3635 for (i = 0; i < 256; i++)
3636 a[i] = 0;
3637 return l;
3638}
3639
3640PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003641_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003642{
3643#ifndef DXPAIRS
3644 return getarray(dxp);
3645#else
3646 int i;
3647 PyObject *l = PyList_New(257);
3648 if (l == NULL) return NULL;
3649 for (i = 0; i < 257; i++) {
3650 PyObject *x = getarray(dxpairs[i]);
3651 if (x == NULL) {
3652 Py_DECREF(l);
3653 return NULL;
3654 }
3655 PyList_SetItem(l, i, x);
3656 }
3657 return l;
3658#endif
3659}
3660
3661#endif