blob: 030afe60e2cf11500bac6da40d06318a0b9305ad [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
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000591 if (tstate->use_tracing) {
592 if (tstate->c_tracefunc != NULL) {
593 /* tstate->c_tracefunc, if defined, is a
594 function that will be called on *every* entry
595 to a code block. Its return value, if not
596 None, is a function that will be called at
597 the start of each executed line of code.
598 (Actually, the function must return itself
599 in order to continue tracing.) The trace
600 functions are called with three arguments:
601 a pointer to the current frame, a string
602 indicating why the function is called, and
603 an argument which depends on the situation.
604 The global trace function is also called
605 whenever an exception is detected. */
606 if (call_trace(tstate->c_tracefunc, tstate->c_traceobj,
607 f, PyTrace_CALL, Py_None)) {
608 /* XXX Need way to compute arguments?? */
609 /* Trace function raised an error */
610 return NULL;
611 }
612 }
613 if (tstate->c_profilefunc != NULL) {
614 /* Similar for c_profilefunc, except it needn't
615 return itself and isn't called for "line" events */
616 if (call_trace(tstate->c_profilefunc,
617 tstate->c_profileobj,
618 f, PyTrace_CALL, Py_None)) {
619 /* XXX Need way to compute arguments?? */
620 /* Profile function raised an error */
621 return NULL;
622 }
623 }
624 }
625
Tim Peters5ca576e2001-06-18 22:08:13 +0000626#ifdef LLTRACE
627 lltrace = PyDict_GetItemString(f->f_globals,"__lltrace__") != NULL;
628#endif
629#if defined(Py_DEBUG) || defined(LLTRACE)
630 filename = PyString_AsString(co->co_filename);
631#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000632
Guido van Rossum374a9221991-04-04 10:40:29 +0000633 why = WHY_NOT;
634 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000635 x = Py_None; /* Not a reference, just anything non-NULL */
Fred Drake48fba732000-10-11 13:54:07 +0000636 w = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +0000637
Guido van Rossum374a9221991-04-04 10:40:29 +0000638 for (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000639 /* Do periodic things. Doing this every time through
640 the loop would add too much overhead, so we do it
641 only every Nth instruction. We also do it if
642 ``things_to_do'' is set, i.e. when an asynchronous
643 event needs attention (e.g. a signal handler or
644 async I/O handler); see Py_AddPendingCall() and
645 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +0000646
Guido van Rossuma027efa1997-05-05 20:56:21 +0000647 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000648 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000649 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000650 if (Py_MakePendingCalls() < 0) {
651 why = WHY_EXCEPTION;
652 goto on_error;
653 }
654 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000655#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000656 /* If we have true signals, the signal handler
657 will call Py_AddPendingCall() so we don't
658 have to call sigcheck(). On the Mac and
659 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000660 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000661 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000662 goto on_error;
663 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000664#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000665
Guido van Rossume59214e1994-08-30 08:01:59 +0000666#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000667 if (interpreter_lock) {
668 /* Give another thread a chance */
669
Guido van Rossum25ce5661997-08-02 03:10:38 +0000670 if (PyThreadState_Swap(NULL) != tstate)
671 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000672 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000673
674 /* Other threads may run now */
675
Guido van Rossum65d5b571998-12-21 19:32:43 +0000676 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000677 if (PyThreadState_Swap(tstate) != NULL)
678 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000679 }
680#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000681 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000682
Guido van Rossum374a9221991-04-04 10:40:29 +0000683 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000684
Guido van Rossum408027e1996-12-30 16:17:54 +0000685#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000686 f->f_lasti = INSTR_OFFSET();
687#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000688
Guido van Rossum374a9221991-04-04 10:40:29 +0000689 opcode = NEXTOP();
690 if (HAS_ARG(opcode))
691 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000692 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000693#ifdef DYNAMIC_EXECUTION_PROFILE
694#ifdef DXPAIRS
695 dxpairs[lastopcode][opcode]++;
696 lastopcode = opcode;
697#endif
698 dxp[opcode]++;
699#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000700
Guido van Rossum96a42c81992-01-12 02:29:51 +0000701#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000702 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +0000703
Guido van Rossum96a42c81992-01-12 02:29:51 +0000704 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000705 if (HAS_ARG(opcode)) {
706 printf("%d: %d, %d\n",
707 (int) (INSTR_OFFSET() - 3),
708 opcode, oparg);
709 }
710 else {
711 printf("%d: %d\n",
712 (int) (INSTR_OFFSET() - 1), opcode);
713 }
714 }
715#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000716 /* Main switch on opcode */
Jeremy Hylton52820442001-01-03 23:52:36 +0000717
Guido van Rossum374a9221991-04-04 10:40:29 +0000718 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000719
Guido van Rossum374a9221991-04-04 10:40:29 +0000720 /* BEWARE!
721 It is essential that any operation that fails sets either
722 x to NULL, err to nonzero, or why to anything but WHY_NOT,
723 and that no operation that succeeds does this! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000724
Guido van Rossum374a9221991-04-04 10:40:29 +0000725 /* case STOP_CODE: this is an error! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000726
Guido van Rossum374a9221991-04-04 10:40:29 +0000727 case POP_TOP:
728 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000729 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000730 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000731
Guido van Rossum374a9221991-04-04 10:40:29 +0000732 case ROT_TWO:
733 v = POP();
734 w = POP();
735 PUSH(v);
736 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000737 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000738
Guido van Rossum374a9221991-04-04 10:40:29 +0000739 case ROT_THREE:
740 v = POP();
741 w = POP();
742 x = POP();
743 PUSH(v);
744 PUSH(x);
745 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000746 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000747
Thomas Wouters434d0822000-08-24 20:11:32 +0000748 case ROT_FOUR:
749 u = POP();
750 v = POP();
751 w = POP();
752 x = POP();
753 PUSH(u);
754 PUSH(x);
755 PUSH(w);
756 PUSH(v);
757 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000758
Guido van Rossum374a9221991-04-04 10:40:29 +0000759 case DUP_TOP:
760 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000761 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000762 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000763 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000764
Thomas Wouters434d0822000-08-24 20:11:32 +0000765 case DUP_TOPX:
766 switch (oparg) {
Thomas Wouters434d0822000-08-24 20:11:32 +0000767 case 1:
Tim Peters35ba6892000-10-11 07:04:49 +0000768 x = TOP();
769 Py_INCREF(x);
770 PUSH(x);
771 continue;
772 case 2:
Thomas Wouters434d0822000-08-24 20:11:32 +0000773 x = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000774 Py_INCREF(x);
775 w = TOP();
776 Py_INCREF(w);
777 PUSH(x);
778 PUSH(w);
779 PUSH(x);
780 continue;
781 case 3:
782 x = POP();
783 Py_INCREF(x);
Thomas Wouters434d0822000-08-24 20:11:32 +0000784 w = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000785 Py_INCREF(w);
786 v = TOP();
787 Py_INCREF(v);
788 PUSH(w);
789 PUSH(x);
790 PUSH(v);
791 PUSH(w);
792 PUSH(x);
793 continue;
794 case 4:
795 x = POP();
796 Py_INCREF(x);
797 w = POP();
798 Py_INCREF(w);
Thomas Wouters434d0822000-08-24 20:11:32 +0000799 v = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000800 Py_INCREF(v);
801 u = TOP();
802 Py_INCREF(u);
803 PUSH(v);
804 PUSH(w);
805 PUSH(x);
806 PUSH(u);
807 PUSH(v);
808 PUSH(w);
809 PUSH(x);
810 continue;
811 case 5:
812 x = POP();
813 Py_INCREF(x);
814 w = POP();
815 Py_INCREF(w);
816 v = POP();
817 Py_INCREF(v);
Thomas Wouters434d0822000-08-24 20:11:32 +0000818 u = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000819 Py_INCREF(u);
820 t = TOP();
821 Py_INCREF(t);
822 PUSH(u);
823 PUSH(v);
824 PUSH(w);
825 PUSH(x);
826 PUSH(t);
827 PUSH(u);
828 PUSH(v);
829 PUSH(w);
830 PUSH(x);
831 continue;
Thomas Wouters434d0822000-08-24 20:11:32 +0000832 default:
Thomas Wouters0be483f2000-10-11 23:26:11 +0000833 Py_FatalError("invalid argument to DUP_TOPX"
834 " (bytecode corruption?)");
Thomas Wouters434d0822000-08-24 20:11:32 +0000835 }
Tim Peters35ba6892000-10-11 07:04:49 +0000836 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000837
Guido van Rossum374a9221991-04-04 10:40:29 +0000838 case UNARY_POSITIVE:
839 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000840 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000841 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000842 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000843 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000844 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000845
Guido van Rossum374a9221991-04-04 10:40:29 +0000846 case UNARY_NEGATIVE:
847 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000848 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000849 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000850 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000851 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000852 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000853
Guido van Rossum374a9221991-04-04 10:40:29 +0000854 case UNARY_NOT:
855 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000856 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000857 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000858 if (err == 0) {
859 Py_INCREF(Py_True);
860 PUSH(Py_True);
861 continue;
862 }
863 else if (err > 0) {
864 Py_INCREF(Py_False);
865 PUSH(Py_False);
866 err = 0;
867 continue;
868 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000869 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000870
Guido van Rossum374a9221991-04-04 10:40:29 +0000871 case UNARY_CONVERT:
872 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000873 x = PyObject_Repr(v);
874 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000875 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000876 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000877 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000878
Guido van Rossum7928cd71991-10-24 14:59:31 +0000879 case UNARY_INVERT:
880 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000881 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000882 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000883 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000884 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000885 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000886
Guido van Rossum50564e81996-01-12 01:13:16 +0000887 case BINARY_POWER:
888 w = POP();
889 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000890 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000891 Py_DECREF(v);
892 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000893 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000894 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000895 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000896
Guido van Rossum374a9221991-04-04 10:40:29 +0000897 case BINARY_MULTIPLY:
898 w = POP();
899 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000900 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000901 Py_DECREF(v);
902 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000903 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000904 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000905 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000906
Guido van Rossum374a9221991-04-04 10:40:29 +0000907 case BINARY_DIVIDE:
908 w = POP();
909 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000910 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000911 Py_DECREF(v);
912 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000913 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000914 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000915 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000916
Guido van Rossum4668b002001-08-08 05:00:18 +0000917 case BINARY_FLOOR_DIVIDE:
918 w = POP();
919 v = POP();
920 x = PyNumber_FloorDivide(v, w);
921 Py_DECREF(v);
922 Py_DECREF(w);
923 PUSH(x);
924 if (x != NULL) continue;
925 break;
926
927 case BINARY_TRUE_DIVIDE:
928 w = POP();
929 v = POP();
930 x = PyNumber_TrueDivide(v, w);
931 Py_DECREF(v);
932 Py_DECREF(w);
933 PUSH(x);
934 if (x != NULL) continue;
935 break;
936
Guido van Rossum374a9221991-04-04 10:40:29 +0000937 case BINARY_MODULO:
938 w = POP();
939 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000940 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000941 Py_DECREF(v);
942 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000943 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000944 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000945 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000946
Guido van Rossum374a9221991-04-04 10:40:29 +0000947 case BINARY_ADD:
948 w = POP();
949 v = POP();
Guido van Rossum46add982001-08-30 16:06:23 +0000950 if (ISSTRICTINT(v) && ISSTRICTINT(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000951 /* INLINE: int + int */
952 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000953 a = PyInt_AS_LONG(v);
954 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000955 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +0000956 if ((i^a) < 0 && (i^b) < 0)
957 goto slow_add;
958 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000959 }
Guido van Rossum87780df2001-08-23 02:58:07 +0000960 else {
961 slow_add:
Guido van Rossumc12da691997-07-17 23:12:42 +0000962 x = PyNumber_Add(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +0000963 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000964 Py_DECREF(v);
965 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000966 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000967 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000968 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000969
Guido van Rossum374a9221991-04-04 10:40:29 +0000970 case BINARY_SUBTRACT:
971 w = POP();
972 v = POP();
Guido van Rossum46add982001-08-30 16:06:23 +0000973 if (ISSTRICTINT(v) && ISSTRICTINT(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000974 /* INLINE: int - int */
975 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000976 a = PyInt_AS_LONG(v);
977 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000978 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +0000979 if ((i^a) < 0 && (i^~b) < 0)
980 goto slow_sub;
981 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000982 }
Guido van Rossum87780df2001-08-23 02:58:07 +0000983 else {
984 slow_sub:
Guido van Rossumc12da691997-07-17 23:12:42 +0000985 x = PyNumber_Subtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +0000986 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000987 Py_DECREF(v);
988 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000989 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000990 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000991 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000992
Guido van Rossum374a9221991-04-04 10:40:29 +0000993 case BINARY_SUBSCR:
994 w = POP();
995 v = POP();
Guido van Rossum46add982001-08-30 16:06:23 +0000996 if (v->ob_type == &PyList_Type && ISSTRICTINT(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000997 /* INLINE: list[int] */
998 long i = PyInt_AsLong(w);
999 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +00001000 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +00001001 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +00001002 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001003 PyErr_SetString(PyExc_IndexError,
1004 "list index out of range");
1005 x = NULL;
1006 }
1007 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +00001008 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001009 Py_INCREF(x);
1010 }
1011 }
1012 else
1013 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001014 Py_DECREF(v);
1015 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001016 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001017 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001018 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001019
Guido van Rossum7928cd71991-10-24 14:59:31 +00001020 case BINARY_LSHIFT:
1021 w = POP();
1022 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001023 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001024 Py_DECREF(v);
1025 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001026 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001027 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001028 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001029
Guido van Rossum7928cd71991-10-24 14:59:31 +00001030 case BINARY_RSHIFT:
1031 w = POP();
1032 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001033 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001034 Py_DECREF(v);
1035 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001036 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001037 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001038 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001039
Guido van Rossum7928cd71991-10-24 14:59:31 +00001040 case BINARY_AND:
1041 w = POP();
1042 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001043 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001044 Py_DECREF(v);
1045 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001046 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001047 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001048 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001049
Guido van Rossum7928cd71991-10-24 14:59:31 +00001050 case BINARY_XOR:
1051 w = POP();
1052 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001053 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001054 Py_DECREF(v);
1055 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001056 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001057 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001058 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001059
Guido van Rossum7928cd71991-10-24 14:59:31 +00001060 case BINARY_OR:
1061 w = POP();
1062 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001063 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001064 Py_DECREF(v);
1065 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001066 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001067 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001068 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001069
1070 case INPLACE_POWER:
1071 w = POP();
1072 v = POP();
1073 x = PyNumber_InPlacePower(v, w, Py_None);
1074 Py_DECREF(v);
1075 Py_DECREF(w);
1076 PUSH(x);
1077 if (x != NULL) continue;
1078 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001079
Thomas Wouters434d0822000-08-24 20:11:32 +00001080 case INPLACE_MULTIPLY:
1081 w = POP();
1082 v = POP();
1083 x = PyNumber_InPlaceMultiply(v, w);
1084 Py_DECREF(v);
1085 Py_DECREF(w);
1086 PUSH(x);
1087 if (x != NULL) continue;
1088 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001089
Thomas Wouters434d0822000-08-24 20:11:32 +00001090 case INPLACE_DIVIDE:
1091 w = POP();
1092 v = POP();
1093 x = PyNumber_InPlaceDivide(v, w);
1094 Py_DECREF(v);
1095 Py_DECREF(w);
1096 PUSH(x);
1097 if (x != NULL) continue;
1098 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001099
Guido van Rossum4668b002001-08-08 05:00:18 +00001100 case INPLACE_FLOOR_DIVIDE:
1101 w = POP();
1102 v = POP();
1103 x = PyNumber_InPlaceFloorDivide(v, w);
1104 Py_DECREF(v);
1105 Py_DECREF(w);
1106 PUSH(x);
1107 if (x != NULL) continue;
1108 break;
1109
1110 case INPLACE_TRUE_DIVIDE:
1111 w = POP();
1112 v = POP();
1113 x = PyNumber_InPlaceTrueDivide(v, w);
1114 Py_DECREF(v);
1115 Py_DECREF(w);
1116 PUSH(x);
1117 if (x != NULL) continue;
1118 break;
1119
Thomas Wouters434d0822000-08-24 20:11:32 +00001120 case INPLACE_MODULO:
1121 w = POP();
1122 v = POP();
1123 x = PyNumber_InPlaceRemainder(v, w);
1124 Py_DECREF(v);
1125 Py_DECREF(w);
1126 PUSH(x);
1127 if (x != NULL) continue;
1128 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001129
Thomas Wouters434d0822000-08-24 20:11:32 +00001130 case INPLACE_ADD:
1131 w = POP();
1132 v = POP();
Guido van Rossum46add982001-08-30 16:06:23 +00001133 if (ISSTRICTINT(v) && ISSTRICTINT(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001134 /* INLINE: int + int */
1135 register long a, b, i;
1136 a = PyInt_AS_LONG(v);
1137 b = PyInt_AS_LONG(w);
1138 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001139 if ((i^a) < 0 && (i^b) < 0)
1140 goto slow_iadd;
1141 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001142 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001143 else {
1144 slow_iadd:
Thomas Wouters434d0822000-08-24 20:11:32 +00001145 x = PyNumber_InPlaceAdd(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001146 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001147 Py_DECREF(v);
1148 Py_DECREF(w);
1149 PUSH(x);
1150 if (x != NULL) continue;
1151 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001152
Thomas Wouters434d0822000-08-24 20:11:32 +00001153 case INPLACE_SUBTRACT:
1154 w = POP();
1155 v = POP();
Guido van Rossum46add982001-08-30 16:06:23 +00001156 if (ISSTRICTINT(v) && ISSTRICTINT(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001157 /* INLINE: int - int */
1158 register long a, b, i;
1159 a = PyInt_AS_LONG(v);
1160 b = PyInt_AS_LONG(w);
1161 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001162 if ((i^a) < 0 && (i^~b) < 0)
1163 goto slow_isub;
1164 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001165 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001166 else {
1167 slow_isub:
Thomas Wouters434d0822000-08-24 20:11:32 +00001168 x = PyNumber_InPlaceSubtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001169 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001170 Py_DECREF(v);
1171 Py_DECREF(w);
1172 PUSH(x);
1173 if (x != NULL) continue;
1174 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001175
Thomas Wouters434d0822000-08-24 20:11:32 +00001176 case INPLACE_LSHIFT:
1177 w = POP();
1178 v = POP();
1179 x = PyNumber_InPlaceLshift(v, w);
1180 Py_DECREF(v);
1181 Py_DECREF(w);
1182 PUSH(x);
1183 if (x != NULL) continue;
1184 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001185
Thomas Wouters434d0822000-08-24 20:11:32 +00001186 case INPLACE_RSHIFT:
1187 w = POP();
1188 v = POP();
1189 x = PyNumber_InPlaceRshift(v, w);
1190 Py_DECREF(v);
1191 Py_DECREF(w);
1192 PUSH(x);
1193 if (x != NULL) continue;
1194 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001195
Thomas Wouters434d0822000-08-24 20:11:32 +00001196 case INPLACE_AND:
1197 w = POP();
1198 v = POP();
1199 x = PyNumber_InPlaceAnd(v, w);
1200 Py_DECREF(v);
1201 Py_DECREF(w);
1202 PUSH(x);
1203 if (x != NULL) continue;
1204 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001205
Thomas Wouters434d0822000-08-24 20:11:32 +00001206 case INPLACE_XOR:
1207 w = POP();
1208 v = POP();
1209 x = PyNumber_InPlaceXor(v, w);
1210 Py_DECREF(v);
1211 Py_DECREF(w);
1212 PUSH(x);
1213 if (x != NULL) continue;
1214 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001215
Thomas Wouters434d0822000-08-24 20:11:32 +00001216 case INPLACE_OR:
1217 w = POP();
1218 v = POP();
1219 x = PyNumber_InPlaceOr(v, w);
1220 Py_DECREF(v);
1221 Py_DECREF(w);
1222 PUSH(x);
1223 if (x != NULL) continue;
1224 break;
1225
Guido van Rossum374a9221991-04-04 10:40:29 +00001226 case SLICE+0:
1227 case SLICE+1:
1228 case SLICE+2:
1229 case SLICE+3:
1230 if ((opcode-SLICE) & 2)
1231 w = POP();
1232 else
1233 w = NULL;
1234 if ((opcode-SLICE) & 1)
1235 v = POP();
1236 else
1237 v = NULL;
1238 u = POP();
1239 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001240 Py_DECREF(u);
1241 Py_XDECREF(v);
1242 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001243 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001244 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001245 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001246
Guido van Rossum374a9221991-04-04 10:40:29 +00001247 case STORE_SLICE+0:
1248 case STORE_SLICE+1:
1249 case STORE_SLICE+2:
1250 case STORE_SLICE+3:
1251 if ((opcode-STORE_SLICE) & 2)
1252 w = POP();
1253 else
1254 w = NULL;
1255 if ((opcode-STORE_SLICE) & 1)
1256 v = POP();
1257 else
1258 v = NULL;
1259 u = POP();
1260 t = POP();
1261 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001262 Py_DECREF(t);
1263 Py_DECREF(u);
1264 Py_XDECREF(v);
1265 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001266 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001267 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001268
Guido van Rossum374a9221991-04-04 10:40:29 +00001269 case DELETE_SLICE+0:
1270 case DELETE_SLICE+1:
1271 case DELETE_SLICE+2:
1272 case DELETE_SLICE+3:
1273 if ((opcode-DELETE_SLICE) & 2)
1274 w = POP();
1275 else
1276 w = NULL;
1277 if ((opcode-DELETE_SLICE) & 1)
1278 v = POP();
1279 else
1280 v = NULL;
1281 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001282 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001283 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001284 Py_DECREF(u);
1285 Py_XDECREF(v);
1286 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001287 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001288 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001289
Guido van Rossum374a9221991-04-04 10:40:29 +00001290 case STORE_SUBSCR:
1291 w = POP();
1292 v = POP();
1293 u = POP();
1294 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001295 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001296 Py_DECREF(u);
1297 Py_DECREF(v);
1298 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001299 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001300 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001301
Guido van Rossum374a9221991-04-04 10:40:29 +00001302 case DELETE_SUBSCR:
1303 w = POP();
1304 v = POP();
1305 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001306 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001307 Py_DECREF(v);
1308 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001309 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001310 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001311
Guido van Rossum374a9221991-04-04 10:40:29 +00001312 case PRINT_EXPR:
1313 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001314 w = PySys_GetObject("displayhook");
1315 if (w == NULL) {
1316 PyErr_SetString(PyExc_RuntimeError,
1317 "lost sys.displayhook");
1318 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001319 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001320 }
1321 if (err == 0) {
1322 x = Py_BuildValue("(O)", v);
1323 if (x == NULL)
1324 err = -1;
1325 }
1326 if (err == 0) {
1327 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001328 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001329 if (w == NULL)
1330 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001331 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001332 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001333 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001334 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001335
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001336 case PRINT_ITEM_TO:
1337 w = stream = POP();
1338 /* fall through to PRINT_ITEM */
1339
Guido van Rossum374a9221991-04-04 10:40:29 +00001340 case PRINT_ITEM:
1341 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001342 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001343 w = PySys_GetObject("stdout");
1344 if (w == NULL) {
1345 PyErr_SetString(PyExc_RuntimeError,
1346 "lost sys.stdout");
1347 err = -1;
1348 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001349 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001350 if (w != NULL && PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001351 err = PyFile_WriteString(" ", w);
1352 if (err == 0)
1353 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001354 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001355 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001356 char *s = PyString_AsString(v);
1357 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001358 if (len > 0 &&
1359 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001360 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001361 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001362 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001363 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001364 Py_XDECREF(stream);
1365 stream = NULL;
1366 if (err == 0)
1367 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001368 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001369
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001370 case PRINT_NEWLINE_TO:
1371 w = stream = POP();
1372 /* fall through to PRINT_NEWLINE */
1373
Guido van Rossum374a9221991-04-04 10:40:29 +00001374 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001375 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001376 w = PySys_GetObject("stdout");
1377 if (w == NULL)
1378 PyErr_SetString(PyExc_RuntimeError,
1379 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001380 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001381 if (w != NULL) {
1382 err = PyFile_WriteString("\n", w);
1383 if (err == 0)
1384 PyFile_SoftSpace(w, 0);
1385 }
1386 Py_XDECREF(stream);
1387 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001388 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001389
Thomas Wouters434d0822000-08-24 20:11:32 +00001390
1391#ifdef CASE_TOO_BIG
1392 default: switch (opcode) {
1393#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001394 case BREAK_LOOP:
1395 why = WHY_BREAK;
1396 break;
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00001397
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001398 case CONTINUE_LOOP:
1399 retval = PyInt_FromLong(oparg);
1400 why = WHY_CONTINUE;
1401 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001402
Guido van Rossumf10570b1995-07-07 22:53:21 +00001403 case RAISE_VARARGS:
1404 u = v = w = NULL;
1405 switch (oparg) {
1406 case 3:
1407 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001408 /* Fallthrough */
1409 case 2:
1410 v = POP(); /* value */
1411 /* Fallthrough */
1412 case 1:
1413 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001414 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001415 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001416 break;
1417 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001418 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001419 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001420 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001421 break;
1422 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001423 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001424
Guido van Rossum374a9221991-04-04 10:40:29 +00001425 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001426 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001427 PyErr_SetString(PyExc_SystemError,
1428 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001429 break;
1430 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001431 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001432 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001433 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001434
Guido van Rossum374a9221991-04-04 10:40:29 +00001435 case RETURN_VALUE:
1436 retval = POP();
1437 why = WHY_RETURN;
1438 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001439
Tim Peters5ca576e2001-06-18 22:08:13 +00001440 case YIELD_VALUE:
1441 retval = POP();
Tim Peters8c963692001-06-23 05:26:56 +00001442 f->f_stacktop = stack_pointer;
Tim Peters5ca576e2001-06-18 22:08:13 +00001443 f->f_lasti = INSTR_OFFSET();
1444 why = WHY_YIELD;
1445 break;
1446
1447
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001448 case EXEC_STMT:
1449 w = POP();
1450 v = POP();
1451 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001452 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001453 Py_DECREF(u);
1454 Py_DECREF(v);
1455 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001456 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001457
Guido van Rossum374a9221991-04-04 10:40:29 +00001458 case POP_BLOCK:
1459 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001460 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001461 while (STACK_LEVEL() > b->b_level) {
1462 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001463 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001464 }
1465 }
1466 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001467
Guido van Rossum374a9221991-04-04 10:40:29 +00001468 case END_FINALLY:
1469 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001470 if (PyInt_Check(v)) {
1471 why = (enum why_code) PyInt_AsLong(v);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001472 if (why == WHY_RETURN ||
Tim Peters5ca576e2001-06-18 22:08:13 +00001473 why == WHY_YIELD ||
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001474 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00001475 retval = POP();
1476 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001477 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001478 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001479 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001480 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001481 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001482 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001483 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001484 else if (v != Py_None) {
1485 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001486 "'finally' pops bad exception");
1487 why = WHY_EXCEPTION;
1488 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001489 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001490 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001491
Guido van Rossum374a9221991-04-04 10:40:29 +00001492 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001493 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001494 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001495 w = POP();
1496 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001497 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001498 Py_DECREF(u);
1499 Py_DECREF(v);
1500 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001501 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001502
Guido van Rossum374a9221991-04-04 10:40:29 +00001503 case STORE_NAME:
1504 w = GETNAMEV(oparg);
1505 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001506 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001507 PyErr_Format(PyExc_SystemError,
1508 "no locals found when storing %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001509 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001510 break;
1511 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001512 err = PyDict_SetItem(x, w, v);
1513 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001514 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001515
Guido van Rossum374a9221991-04-04 10:40:29 +00001516 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001517 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001518 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001519 PyErr_Format(PyExc_SystemError,
1520 "no locals when deleting %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001521 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001522 break;
1523 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001524 if ((err = PyDict_DelItem(x, w)) != 0)
Guido van Rossumac7be682001-01-17 15:42:30 +00001525 format_exc_check_arg(PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001526 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001527 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001528
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001529 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001530 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001531 if (PyTuple_Check(v)) {
1532 if (PyTuple_Size(v) != oparg) {
1533 PyErr_SetString(PyExc_ValueError,
1534 "unpack tuple of wrong size");
1535 why = WHY_EXCEPTION;
1536 }
1537 else {
1538 for (; --oparg >= 0; ) {
1539 w = PyTuple_GET_ITEM(v, oparg);
1540 Py_INCREF(w);
1541 PUSH(w);
1542 }
1543 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001544 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001545 else if (PyList_Check(v)) {
1546 if (PyList_Size(v) != oparg) {
1547 PyErr_SetString(PyExc_ValueError,
1548 "unpack list of wrong size");
1549 why = WHY_EXCEPTION;
1550 }
1551 else {
1552 for (; --oparg >= 0; ) {
1553 w = PyList_GET_ITEM(v, oparg);
1554 Py_INCREF(w);
1555 PUSH(w);
1556 }
1557 }
1558 }
Tim Petersd6d010b2001-06-21 02:49:55 +00001559 else if (unpack_iterable(v, oparg,
1560 stack_pointer + oparg))
1561 stack_pointer += oparg;
1562 else
Barry Warsawe42b18f1997-08-25 22:13:04 +00001563 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00001564 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001565 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001566
Guido van Rossum374a9221991-04-04 10:40:29 +00001567 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001568 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001569 v = POP();
1570 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001571 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1572 Py_DECREF(v);
1573 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001574 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001575
Guido van Rossum374a9221991-04-04 10:40:29 +00001576 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001577 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001578 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001579 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1580 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001581 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001582 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001583
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001584 case STORE_GLOBAL:
1585 w = GETNAMEV(oparg);
1586 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001587 err = PyDict_SetItem(f->f_globals, w, v);
1588 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001589 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001590
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001591 case DELETE_GLOBAL:
1592 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001593 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001594 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001595 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001596 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001597
Guido van Rossum374a9221991-04-04 10:40:29 +00001598 case LOAD_CONST:
1599 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001600 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001601 PUSH(x);
1602 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001603
Guido van Rossum374a9221991-04-04 10:40:29 +00001604 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001605 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001606 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001607 PyErr_Format(PyExc_SystemError,
1608 "no locals when loading %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001609 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001610 break;
1611 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001612 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001613 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001614 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001615 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001616 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001617 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001618 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001619 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001620 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001621 break;
1622 }
1623 }
1624 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001625 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001626 PUSH(x);
1627 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001628
Guido van Rossum374a9221991-04-04 10:40:29 +00001629 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001630 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001631 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001632 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001633 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001634 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001635 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001636 PyExc_NameError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001637 GLOBAL_NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001638 break;
1639 }
1640 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001641 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001642 PUSH(x);
1643 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001644
Guido van Rossum9bfef441993-03-29 10:43:31 +00001645 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001646 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001647 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001648 format_exc_check_arg(
1649 PyExc_UnboundLocalError,
1650 UNBOUNDLOCAL_ERROR_MSG,
1651 PyTuple_GetItem(co->co_varnames, oparg)
1652 );
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001653 break;
1654 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001655 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001656 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001657 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001658 break;
1659
1660 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001661 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001662 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001663 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001664
1665 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001666 x = GETLOCAL(oparg);
1667 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001668 format_exc_check_arg(
1669 PyExc_UnboundLocalError,
1670 UNBOUNDLOCAL_ERROR_MSG,
1671 PyTuple_GetItem(co->co_varnames, oparg)
1672 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001673 break;
1674 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001675 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001676 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001677
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001678 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001679 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001680 Py_INCREF(x);
1681 PUSH(x);
1682 break;
1683
1684 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001685 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001686 w = PyCell_Get(x);
Jeremy Hylton2524d692001-02-05 17:23:16 +00001687 if (w == NULL) {
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001688 if (oparg < f->f_ncells) {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001689 v = PyTuple_GetItem(co->co_cellvars,
1690 oparg);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001691 format_exc_check_arg(
1692 PyExc_UnboundLocalError,
1693 UNBOUNDLOCAL_ERROR_MSG,
1694 v);
1695 } else {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001696 v = PyTuple_GetItem(
1697 co->co_freevars,
1698 oparg - f->f_ncells);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001699 format_exc_check_arg(
1700 PyExc_NameError,
1701 UNBOUNDFREE_ERROR_MSG,
1702 v);
1703 }
Jeremy Hylton2524d692001-02-05 17:23:16 +00001704 err = -1;
1705 break;
1706 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001707 PUSH(w);
1708 break;
1709
1710 case STORE_DEREF:
1711 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001712 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001713 PyCell_Set(x, w);
Jeremy Hylton30c9f392001-03-13 01:58:22 +00001714 Py_DECREF(w);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001715 continue;
1716
Guido van Rossum374a9221991-04-04 10:40:29 +00001717 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001718 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001719 if (x != NULL) {
1720 for (; --oparg >= 0;) {
1721 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001722 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001723 }
1724 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001725 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001726 }
1727 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001728
Guido van Rossum374a9221991-04-04 10:40:29 +00001729 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001730 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001731 if (x != NULL) {
1732 for (; --oparg >= 0;) {
1733 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001734 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001735 }
1736 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001737 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001738 }
1739 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001740
Guido van Rossum374a9221991-04-04 10:40:29 +00001741 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001742 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001743 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001744 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001745 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001746
Guido van Rossum374a9221991-04-04 10:40:29 +00001747 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001748 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001749 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001750 x = PyObject_GetAttr(v, w);
1751 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001752 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001753 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001754 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001755
Guido van Rossum374a9221991-04-04 10:40:29 +00001756 case COMPARE_OP:
1757 w = POP();
1758 v = POP();
Guido van Rossum46add982001-08-30 16:06:23 +00001759 if (ISSTRICTINT(v) && ISSTRICTINT(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001760 /* INLINE: cmp(int, int) */
1761 register long a, b;
1762 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001763 a = PyInt_AS_LONG(v);
1764 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001765 switch (oparg) {
1766 case LT: res = a < b; break;
1767 case LE: res = a <= b; break;
1768 case EQ: res = a == b; break;
1769 case NE: res = a != b; break;
1770 case GT: res = a > b; break;
1771 case GE: res = a >= b; break;
1772 case IS: res = v == w; break;
1773 case IS_NOT: res = v != w; break;
1774 default: goto slow_compare;
1775 }
1776 x = res ? Py_True : Py_False;
1777 Py_INCREF(x);
1778 }
1779 else {
1780 slow_compare:
1781 x = cmp_outcome(oparg, v, w);
1782 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001783 Py_DECREF(v);
1784 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001785 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001786 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001787 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001788
Guido van Rossum374a9221991-04-04 10:40:29 +00001789 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001790 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001791 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001792 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001793 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001794 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001795 break;
1796 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001797 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001798 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001799 w,
1800 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001801 f->f_locals == NULL ?
1802 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001803 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001804 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001805 if (w == NULL) {
1806 x = NULL;
1807 break;
1808 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001809 x = PyEval_CallObject(x, w);
1810 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001811 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001812 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001813 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001814
Thomas Wouters52152252000-08-17 22:55:00 +00001815 case IMPORT_STAR:
1816 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001817 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001818 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001819 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001820 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001821 break;
1822 }
Thomas Wouters52152252000-08-17 22:55:00 +00001823 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001824 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001825 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001826 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001827 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001828
Thomas Wouters52152252000-08-17 22:55:00 +00001829 case IMPORT_FROM:
1830 w = GETNAMEV(oparg);
1831 v = TOP();
1832 x = import_from(v, w);
1833 PUSH(x);
1834 if (x != NULL) continue;
1835 break;
1836
Guido van Rossum374a9221991-04-04 10:40:29 +00001837 case JUMP_FORWARD:
1838 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001839 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001840
Guido van Rossum374a9221991-04-04 10:40:29 +00001841 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001842 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001843 if (err > 0)
1844 err = 0;
1845 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001846 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001847 else
1848 break;
1849 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001850
Guido van Rossum374a9221991-04-04 10:40:29 +00001851 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001852 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001853 if (err > 0) {
1854 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001855 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001856 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001857 else if (err == 0)
1858 ;
1859 else
1860 break;
1861 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001862
Guido van Rossum374a9221991-04-04 10:40:29 +00001863 case JUMP_ABSOLUTE:
1864 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001865 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001866
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001867 case GET_ITER:
1868 /* before: [obj]; after [getiter(obj)] */
1869 v = POP();
1870 x = PyObject_GetIter(v);
1871 Py_DECREF(v);
1872 if (x != NULL) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00001873 PUSH(x);
1874 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001875 }
1876 break;
1877
1878 case FOR_ITER:
1879 /* before: [iter]; after: [iter, iter()] *or* [] */
1880 v = TOP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001881 x = PyIter_Next(v);
1882 if (x != NULL) {
1883 PUSH(x);
1884 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001885 }
Tim Petersf4848da2001-05-05 00:14:56 +00001886 if (!PyErr_Occurred()) {
1887 /* iterator ended normally */
1888 x = v = POP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001889 Py_DECREF(v);
1890 JUMPBY(oparg);
1891 continue;
1892 }
1893 break;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001894
Guido van Rossum374a9221991-04-04 10:40:29 +00001895 case FOR_LOOP:
1896 /* for v in s: ...
1897 On entry: stack contains s, i.
1898 On exit: stack contains s, i+1, s[i];
1899 but if loop exhausted:
1900 s, i are popped, and we jump */
1901 w = POP(); /* Loop index */
1902 v = POP(); /* Sequence object */
1903 u = loop_subscript(v, w);
1904 if (u != NULL) {
1905 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001906 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001907 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001908 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001909 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001910 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001911 }
1912 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001913 Py_DECREF(v);
1914 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001915 /* A NULL can mean "s exhausted"
1916 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001917 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001918 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001919 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001920 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001921 continue;
1922 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001923 }
1924 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001925
Guido van Rossum374a9221991-04-04 10:40:29 +00001926 case SETUP_LOOP:
1927 case SETUP_EXCEPT:
1928 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001929 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001930 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001931 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001932
Guido van Rossum374a9221991-04-04 10:40:29 +00001933 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001934#ifdef LLTRACE
1935 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001936 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001937#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001938 f->f_lineno = oparg;
Fred Drake5755ce62001-06-27 19:19:46 +00001939 if (tstate->c_tracefunc == NULL || tstate->tracing)
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001940 continue;
1941 /* Trace each line of code reached */
1942 f->f_lasti = INSTR_OFFSET();
Fred Drake5755ce62001-06-27 19:19:46 +00001943 /* Inline call_trace() for performance: */
1944 tstate->tracing++;
Fred Drake9e3ad782001-07-03 23:39:52 +00001945 tstate->use_tracing = 0;
Fred Drake5755ce62001-06-27 19:19:46 +00001946 err = (tstate->c_tracefunc)(tstate->c_traceobj, f,
1947 PyTrace_LINE, Py_None);
Fred Drake9e3ad782001-07-03 23:39:52 +00001948 tstate->use_tracing = (tstate->c_tracefunc
1949 || tstate->c_profilefunc);
Fred Drake5755ce62001-06-27 19:19:46 +00001950 tstate->tracing--;
Guido van Rossum374a9221991-04-04 10:40:29 +00001951 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001952
1953 case CALL_FUNCTION:
Jeremy Hylton52820442001-01-03 23:52:36 +00001954 {
1955 int na = oparg & 0xff;
1956 int nk = (oparg>>8) & 0xff;
1957 int n = na + 2 * nk;
1958 PyObject **pfunc = stack_pointer - n - 1;
1959 PyObject *func = *pfunc;
1960 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1961
1962 /* Always dispatch PyCFunction first, because
1963 these are presumed to be the most frequent
1964 callable object.
1965 */
1966 if (PyCFunction_Check(func)) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001967 int flags = PyCFunction_GET_FLAGS(func);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001968 if (nk != 0 || (flags & METH_KEYWORDS))
Jeremy Hylton4c9dace2001-05-29 16:23:26 +00001969 x = do_call(func, &stack_pointer,
1970 na, nk);
1971 else if (flags == METH_VARARGS) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001972 PyObject *callargs;
1973 callargs = load_args(&stack_pointer, na);
Jeremy Hylton910d7d42001-08-12 21:52:24 +00001974 x = PyCFunction_Call(func, callargs, NULL);
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001975 Py_XDECREF(callargs);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001976 } else
1977 x = fast_cfunction(func,
1978 &stack_pointer, na);
Jeremy Hylton52820442001-01-03 23:52:36 +00001979 } else {
Guido van Rossumac7be682001-01-17 15:42:30 +00001980 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001981 && PyMethod_GET_SELF(func) != NULL) {
1982 /* optimize access to bound methods */
1983 PyObject *self = PyMethod_GET_SELF(func);
1984 Py_INCREF(self);
1985 func = PyMethod_GET_FUNCTION(func);
1986 Py_INCREF(func);
1987 Py_DECREF(*pfunc);
1988 *pfunc = self;
1989 na++;
1990 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00001991 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00001992 Py_INCREF(func);
1993 if (PyFunction_Check(func)) {
1994 x = fast_function(func, &stack_pointer,
Guido van Rossumac7be682001-01-17 15:42:30 +00001995 n, na, nk);
Jeremy Hylton52820442001-01-03 23:52:36 +00001996 } else {
1997 x = do_call(func, &stack_pointer,
1998 na, nk);
1999 }
2000 Py_DECREF(func);
2001 }
2002
2003 while (stack_pointer > pfunc) {
2004 w = POP();
2005 Py_DECREF(w);
2006 }
2007 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002008 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002009 continue;
2010 break;
2011 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002012
Jeremy Hylton76901512000-03-28 23:49:17 +00002013 case CALL_FUNCTION_VAR:
2014 case CALL_FUNCTION_KW:
2015 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00002016 {
Jeremy Hylton76901512000-03-28 23:49:17 +00002017 int na = oparg & 0xff;
2018 int nk = (oparg>>8) & 0xff;
2019 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00002020 int n = na + 2 * nk;
2021 PyObject **pfunc, *func;
2022 if (flags & CALL_FLAG_VAR)
2023 n++;
2024 if (flags & CALL_FLAG_KW)
2025 n++;
2026 pfunc = stack_pointer - n - 1;
2027 func = *pfunc;
Jeremy Hylton76901512000-03-28 23:49:17 +00002028 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Jeremy Hylton52820442001-01-03 23:52:36 +00002029
Guido van Rossumac7be682001-01-17 15:42:30 +00002030 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00002031 && PyMethod_GET_SELF(func) != NULL) {
2032 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002033 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00002034 func = PyMethod_GET_FUNCTION(func);
2035 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002036 Py_DECREF(*pfunc);
2037 *pfunc = self;
2038 na++;
2039 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00002040 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00002041 Py_INCREF(func);
2042 x = ext_do_call(func, &stack_pointer, flags, na, nk);
Jeremy Hylton76901512000-03-28 23:49:17 +00002043 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002044
Jeremy Hylton76901512000-03-28 23:49:17 +00002045 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00002046 w = POP();
2047 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00002048 }
2049 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002050 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002051 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00002052 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002053 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002054
Guido van Rossum681d79a1995-07-18 14:51:37 +00002055 case MAKE_FUNCTION:
2056 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00002057 x = PyFunction_New(v, f->f_globals);
2058 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002059 /* XXX Maybe this should be a separate opcode? */
2060 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002061 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002062 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002063 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002064 x = NULL;
2065 break;
2066 }
2067 while (--oparg >= 0) {
2068 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002069 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002070 }
2071 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00002072 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002073 }
2074 PUSH(x);
2075 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002076
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002077 case MAKE_CLOSURE:
2078 {
2079 int nfree;
2080 v = POP(); /* code object */
2081 x = PyFunction_New(v, f->f_globals);
2082 nfree = PyTuple_GET_SIZE(((PyCodeObject *)v)->co_freevars);
2083 Py_DECREF(v);
2084 /* XXX Maybe this should be a separate opcode? */
2085 if (x != NULL && nfree > 0) {
2086 v = PyTuple_New(nfree);
2087 if (v == NULL) {
2088 Py_DECREF(x);
2089 x = NULL;
2090 break;
2091 }
2092 while (--nfree >= 0) {
2093 w = POP();
2094 PyTuple_SET_ITEM(v, nfree, w);
2095 }
2096 err = PyFunction_SetClosure(x, v);
2097 Py_DECREF(v);
2098 }
2099 if (x != NULL && oparg > 0) {
2100 v = PyTuple_New(oparg);
2101 if (v == NULL) {
2102 Py_DECREF(x);
2103 x = NULL;
2104 break;
2105 }
2106 while (--oparg >= 0) {
2107 w = POP();
2108 PyTuple_SET_ITEM(v, oparg, w);
2109 }
2110 err = PyFunction_SetDefaults(x, v);
2111 Py_DECREF(v);
2112 }
2113 PUSH(x);
2114 break;
2115 }
2116
Guido van Rossum8861b741996-07-30 16:49:37 +00002117 case BUILD_SLICE:
2118 if (oparg == 3)
2119 w = POP();
2120 else
2121 w = NULL;
2122 v = POP();
2123 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002124 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002125 Py_DECREF(u);
2126 Py_DECREF(v);
2127 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00002128 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002129 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002130 break;
2131
Fred Drakeef8ace32000-08-24 00:32:09 +00002132 case EXTENDED_ARG:
2133 opcode = NEXTOP();
2134 oparg = oparg<<16 | NEXTARG();
2135 goto dispatch_opcode;
Guido van Rossum8861b741996-07-30 16:49:37 +00002136
Guido van Rossum374a9221991-04-04 10:40:29 +00002137 default:
2138 fprintf(stderr,
2139 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00002140 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002141 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002142 why = WHY_EXCEPTION;
2143 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002144
2145#ifdef CASE_TOO_BIG
2146 }
2147#endif
2148
Guido van Rossum374a9221991-04-04 10:40:29 +00002149 } /* switch */
2150
2151 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002152
Guido van Rossum374a9221991-04-04 10:40:29 +00002153 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002154
Guido van Rossum374a9221991-04-04 10:40:29 +00002155 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002156 if (err == 0 && x != NULL) {
2157#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002158 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002159 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002160 fprintf(stderr,
2161 "XXX undetected error\n");
2162 else
2163#endif
2164 continue; /* Normal, fast path */
2165 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002166 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002167 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002168 err = 0;
2169 }
2170
Guido van Rossum374a9221991-04-04 10:40:29 +00002171 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002172
Guido van Rossum374a9221991-04-04 10:40:29 +00002173 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002174 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002175 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002176 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002177 why = WHY_EXCEPTION;
2178 }
2179 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002180#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002181 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002182 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002183 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002184 fprintf(stderr,
2185 "XXX undetected error (why=%d)\n",
2186 why);
2187 why = WHY_EXCEPTION;
2188 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002189 }
2190#endif
2191
2192 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002193
Guido van Rossum374a9221991-04-04 10:40:29 +00002194 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002195 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00002196 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00002197 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00002198 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002199
Fred Drake9e3ad782001-07-03 23:39:52 +00002200 if (tstate->use_tracing) {
2201 if (tstate->c_tracefunc)
2202 call_exc_trace(tstate->c_tracefunc,
2203 tstate->c_traceobj, f);
2204 if (tstate->c_profilefunc)
2205 call_exc_trace(tstate->c_profilefunc,
2206 tstate->c_profileobj,f);
2207 }
Guido van Rossum014518f1998-11-23 21:09:51 +00002208 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002209
Guido van Rossum374a9221991-04-04 10:40:29 +00002210 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002211
Guido van Rossum374a9221991-04-04 10:40:29 +00002212 if (why == WHY_RERAISE)
2213 why = WHY_EXCEPTION;
2214
2215 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002216
Tim Peters5ca576e2001-06-18 22:08:13 +00002217 while (why != WHY_NOT && why != WHY_YIELD && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002218 PyTryBlock *b = PyFrame_BlockPop(f);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002219
2220 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2221 /* For a continue inside a try block,
2222 don't pop the block for the loop. */
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00002223 PyFrame_BlockSetup(f, b->b_type, b->b_level,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002224 b->b_handler);
2225 why = WHY_NOT;
2226 JUMPTO(PyInt_AS_LONG(retval));
2227 Py_DECREF(retval);
2228 break;
2229 }
2230
Guido van Rossum374a9221991-04-04 10:40:29 +00002231 while (STACK_LEVEL() > b->b_level) {
2232 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002233 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002234 }
2235 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2236 why = WHY_NOT;
2237 JUMPTO(b->b_handler);
2238 break;
2239 }
2240 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002241 (b->b_type == SETUP_EXCEPT &&
2242 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002243 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002244 PyObject *exc, *val, *tb;
2245 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002246 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002247 val = Py_None;
2248 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002249 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002250 /* Make the raw exception data
2251 available to the handler,
2252 so a program can emulate the
2253 Python main loop. Don't do
2254 this for 'finally'. */
2255 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002256 PyErr_NormalizeException(
2257 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002258 set_exc_info(tstate,
2259 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002260 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002261 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002262 PUSH(val);
2263 PUSH(exc);
2264 }
2265 else {
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002266 if (why == WHY_RETURN ||
2267 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00002268 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002269 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002270 PUSH(v);
2271 }
2272 why = WHY_NOT;
2273 JUMPTO(b->b_handler);
2274 break;
2275 }
2276 } /* unwind stack */
2277
2278 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002279
Guido van Rossum374a9221991-04-04 10:40:29 +00002280 if (why != WHY_NOT)
2281 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002282
Guido van Rossum374a9221991-04-04 10:40:29 +00002283 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002284
Tim Peters5ca576e2001-06-18 22:08:13 +00002285 if (why != WHY_RETURN && why != WHY_YIELD)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002286 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002287
Fred Drake9e3ad782001-07-03 23:39:52 +00002288 if (tstate->use_tracing) {
2289 if (tstate->c_tracefunc
2290 && (why == WHY_RETURN || why == WHY_YIELD)) {
2291 if (call_trace(tstate->c_tracefunc,
2292 tstate->c_traceobj, f,
2293 PyTrace_RETURN, retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002294 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002295 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002296 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002297 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002298 }
Fred Drake9e3ad782001-07-03 23:39:52 +00002299 if (tstate->c_profilefunc
2300 && (why == WHY_RETURN || why == WHY_YIELD)) {
2301 if (call_trace(tstate->c_profilefunc,
2302 tstate->c_profileobj, f,
2303 PyTrace_RETURN, retval)) {
2304 Py_XDECREF(retval);
2305 retval = NULL;
2306 why = WHY_EXCEPTION;
2307 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002308 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002309 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002310
Guido van Rossuma027efa1997-05-05 20:56:21 +00002311 reset_exc_info(tstate);
2312
Tim Peters5ca576e2001-06-18 22:08:13 +00002313 /* pop frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002314 --tstate->recursion_depth;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002315 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00002316
Guido van Rossum96a42c81992-01-12 02:29:51 +00002317 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002318}
2319
Tim Peters6d6c1a32001-08-02 04:15:00 +00002320PyObject *
2321PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals,
Tim Peters5ca576e2001-06-18 22:08:13 +00002322 PyObject **args, int argcount, PyObject **kws, int kwcount,
2323 PyObject **defs, int defcount, PyObject *closure)
2324{
2325 register PyFrameObject *f;
2326 register PyObject *retval = NULL;
2327 register PyObject **fastlocals, **freevars;
2328 PyThreadState *tstate = PyThreadState_GET();
2329 PyObject *x, *u;
2330
2331 if (globals == NULL) {
Jeremy Hylton910d7d42001-08-12 21:52:24 +00002332 PyErr_SetString(PyExc_SystemError,
2333 "PyEval_EvalCodeEx: NULL globals");
Tim Peters5ca576e2001-06-18 22:08:13 +00002334 return NULL;
2335 }
2336
2337 f = PyFrame_New(tstate, /*back*/
2338 co, /*code*/
2339 globals, locals);
2340 if (f == NULL)
2341 return NULL;
2342
2343 fastlocals = f->f_localsplus;
2344 freevars = f->f_localsplus + f->f_nlocals;
2345
2346 if (co->co_argcount > 0 ||
2347 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
2348 int i;
2349 int n = argcount;
2350 PyObject *kwdict = NULL;
2351 if (co->co_flags & CO_VARKEYWORDS) {
2352 kwdict = PyDict_New();
2353 if (kwdict == NULL)
2354 goto fail;
2355 i = co->co_argcount;
2356 if (co->co_flags & CO_VARARGS)
2357 i++;
2358 SETLOCAL(i, kwdict);
2359 }
2360 if (argcount > co->co_argcount) {
2361 if (!(co->co_flags & CO_VARARGS)) {
2362 PyErr_Format(PyExc_TypeError,
2363 "%.200s() takes %s %d "
2364 "%sargument%s (%d given)",
2365 PyString_AsString(co->co_name),
2366 defcount ? "at most" : "exactly",
2367 co->co_argcount,
2368 kwcount ? "non-keyword " : "",
2369 co->co_argcount == 1 ? "" : "s",
2370 argcount);
2371 goto fail;
2372 }
2373 n = co->co_argcount;
2374 }
2375 for (i = 0; i < n; i++) {
2376 x = args[i];
2377 Py_INCREF(x);
2378 SETLOCAL(i, x);
2379 }
2380 if (co->co_flags & CO_VARARGS) {
2381 u = PyTuple_New(argcount - n);
2382 if (u == NULL)
2383 goto fail;
2384 SETLOCAL(co->co_argcount, u);
2385 for (i = n; i < argcount; i++) {
2386 x = args[i];
2387 Py_INCREF(x);
2388 PyTuple_SET_ITEM(u, i-n, x);
2389 }
2390 }
2391 for (i = 0; i < kwcount; i++) {
2392 PyObject *keyword = kws[2*i];
2393 PyObject *value = kws[2*i + 1];
2394 int j;
2395 if (keyword == NULL || !PyString_Check(keyword)) {
2396 PyErr_Format(PyExc_TypeError,
2397 "%.200s() keywords must be strings",
2398 PyString_AsString(co->co_name));
2399 goto fail;
2400 }
2401 /* XXX slow -- speed up using dictionary? */
2402 for (j = 0; j < co->co_argcount; j++) {
2403 PyObject *nm = PyTuple_GET_ITEM(
2404 co->co_varnames, j);
2405 int cmp = PyObject_RichCompareBool(
2406 keyword, nm, Py_EQ);
2407 if (cmp > 0)
2408 break;
2409 else if (cmp < 0)
2410 goto fail;
2411 }
2412 /* Check errors from Compare */
2413 if (PyErr_Occurred())
2414 goto fail;
2415 if (j >= co->co_argcount) {
2416 if (kwdict == NULL) {
2417 PyErr_Format(PyExc_TypeError,
2418 "%.200s() got an unexpected "
2419 "keyword argument '%.400s'",
2420 PyString_AsString(co->co_name),
2421 PyString_AsString(keyword));
2422 goto fail;
2423 }
2424 PyDict_SetItem(kwdict, keyword, value);
2425 }
2426 else {
2427 if (GETLOCAL(j) != NULL) {
2428 PyErr_Format(PyExc_TypeError,
2429 "%.200s() got multiple "
2430 "values for keyword "
2431 "argument '%.400s'",
2432 PyString_AsString(co->co_name),
2433 PyString_AsString(keyword));
2434 goto fail;
2435 }
2436 Py_INCREF(value);
2437 SETLOCAL(j, value);
2438 }
2439 }
2440 if (argcount < co->co_argcount) {
2441 int m = co->co_argcount - defcount;
2442 for (i = argcount; i < m; i++) {
2443 if (GETLOCAL(i) == NULL) {
2444 PyErr_Format(PyExc_TypeError,
2445 "%.200s() takes %s %d "
2446 "%sargument%s (%d given)",
2447 PyString_AsString(co->co_name),
2448 ((co->co_flags & CO_VARARGS) ||
2449 defcount) ? "at least"
2450 : "exactly",
2451 m, kwcount ? "non-keyword " : "",
2452 m == 1 ? "" : "s", i);
2453 goto fail;
2454 }
2455 }
2456 if (n > m)
2457 i = n - m;
2458 else
2459 i = 0;
2460 for (; i < defcount; i++) {
2461 if (GETLOCAL(m+i) == NULL) {
2462 PyObject *def = defs[i];
2463 Py_INCREF(def);
2464 SETLOCAL(m+i, def);
2465 }
2466 }
2467 }
2468 }
2469 else {
2470 if (argcount > 0 || kwcount > 0) {
2471 PyErr_Format(PyExc_TypeError,
2472 "%.200s() takes no arguments (%d given)",
2473 PyString_AsString(co->co_name),
2474 argcount + kwcount);
2475 goto fail;
2476 }
2477 }
2478 /* Allocate and initialize storage for cell vars, and copy free
2479 vars into frame. This isn't too efficient right now. */
2480 if (f->f_ncells) {
2481 int i = 0, j = 0, nargs, found;
2482 char *cellname, *argname;
2483 PyObject *c;
2484
2485 nargs = co->co_argcount;
2486 if (co->co_flags & CO_VARARGS)
2487 nargs++;
2488 if (co->co_flags & CO_VARKEYWORDS)
2489 nargs++;
2490
2491 /* Check for cells that shadow args */
2492 for (i = 0; i < f->f_ncells && j < nargs; ++i) {
2493 cellname = PyString_AS_STRING(
2494 PyTuple_GET_ITEM(co->co_cellvars, i));
2495 found = 0;
2496 while (j < nargs) {
2497 argname = PyString_AS_STRING(
2498 PyTuple_GET_ITEM(co->co_varnames, j));
2499 if (strcmp(cellname, argname) == 0) {
2500 c = PyCell_New(GETLOCAL(j));
2501 if (c == NULL)
2502 goto fail;
2503 GETLOCAL(f->f_nlocals + i) = c;
2504 found = 1;
2505 break;
2506 }
2507 j++;
2508 }
2509 if (found == 0) {
2510 c = PyCell_New(NULL);
2511 if (c == NULL)
2512 goto fail;
2513 SETLOCAL(f->f_nlocals + i, c);
2514 }
2515 }
2516 /* Initialize any that are left */
2517 while (i < f->f_ncells) {
2518 c = PyCell_New(NULL);
2519 if (c == NULL)
2520 goto fail;
2521 SETLOCAL(f->f_nlocals + i, c);
2522 i++;
2523 }
2524 }
2525 if (f->f_nfreevars) {
2526 int i;
2527 for (i = 0; i < f->f_nfreevars; ++i) {
2528 PyObject *o = PyTuple_GET_ITEM(closure, i);
2529 Py_INCREF(o);
2530 freevars[f->f_ncells + i] = o;
2531 }
2532 }
2533
Tim Peters5ca576e2001-06-18 22:08:13 +00002534 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