blob: e4620ab6c4e3b5a289dc3bd0742cc4586b23a475 [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:
5 XXX how to pass arguments to call_trace?
Guido van Rossum681d79a1995-07-18 14:51:37 +00006 XXX speed up searching for keywords by using a dictionary
Guido van Rossum681d79a1995-07-18 14:51:37 +00007 XXX document it!
8 */
9
Guido van Rossumb209a111997-04-29 18:18:01 +000010#include "Python.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000011
Guido van Rossum10dc2e81990-11-18 17:27:39 +000012#include "compile.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000013#include "frameobject.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000014#include "eval.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000015#include "opcode.h"
16
Jack Jansencbf630f2000-07-11 21:59:16 +000017#ifdef macintosh
18#include "macglue.h"
19#endif
20
Guido van Rossumc6004111993-11-05 10:22:19 +000021#include <ctype.h>
22
Guido van Rossum04691fc1992-08-12 15:35:34 +000023/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000024/* #define CASE_TOO_BIG 1 */
Guido van Rossum04691fc1992-08-12 15:35:34 +000025
Guido van Rossum408027e1996-12-30 16:17:54 +000026#ifdef Py_DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000027/* For debugging the interpreter: */
28#define LLTRACE 1 /* Low-level trace feature */
29#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000030#endif
31
Jeremy Hylton52820442001-01-03 23:52:36 +000032typedef PyObject *(*callproc)(PyObject *, PyObject *, PyObject *);
Guido van Rossum5b722181993-03-30 17:46:03 +000033
Guido van Rossum374a9221991-04-04 10:40:29 +000034/* Forward declarations */
Guido van Rossum374a9221991-04-04 10:40:29 +000035
Tim Petersdbd9ba62000-07-09 03:09:57 +000036static PyObject *eval_code2(PyCodeObject *,
37 PyObject *, PyObject *,
38 PyObject **, int,
39 PyObject **, int,
Jeremy Hylton64949cb2001-01-25 20:06:59 +000040 PyObject **, int,
41 PyObject *);
Jeremy Hylton52820442001-01-03 23:52:36 +000042
Tim Peters5ca576e2001-06-18 22:08:13 +000043static PyObject *eval_frame(PyFrameObject *);
Jeremy Hylton512a2372001-04-11 13:52:29 +000044static char *get_func_name(PyObject *);
45static char *get_func_desc(PyObject *);
Jeremy Hylton52820442001-01-03 23:52:36 +000046static PyObject *call_object(PyObject *, PyObject *, PyObject *);
47static PyObject *call_cfunction(PyObject *, PyObject *, PyObject *);
48static PyObject *call_instance(PyObject *, PyObject *, PyObject *);
49static PyObject *call_method(PyObject *, PyObject *, PyObject *);
50static PyObject *call_eval_code2(PyObject *, PyObject *, PyObject *);
51static PyObject *fast_function(PyObject *, PyObject ***, int, int, int);
52static PyObject *fast_cfunction(PyObject *, PyObject ***, int);
53static PyObject *do_call(PyObject *, PyObject ***, int, int);
54static PyObject *ext_do_call(PyObject *, PyObject ***, int, int, int);
Guido van Rossumac7be682001-01-17 15:42:30 +000055static PyObject *update_keyword_args(PyObject *, int, PyObject ***,PyObject *);
Ka-Ping Yee20579702001-01-15 22:14:16 +000056static PyObject *update_star_args(int, int, PyObject *, PyObject ***);
Jeremy Hylton52820442001-01-03 23:52:36 +000057static PyObject *load_args(PyObject ***, int);
58#define CALL_FLAG_VAR 1
59#define CALL_FLAG_KW 2
60
Guido van Rossum0a066c01992-03-27 17:29:15 +000061#ifdef LLTRACE
Tim Petersdbd9ba62000-07-09 03:09:57 +000062static int prtrace(PyObject *, char *);
Guido van Rossum0a066c01992-03-27 17:29:15 +000063#endif
Tim Petersdbd9ba62000-07-09 03:09:57 +000064static void call_exc_trace(PyObject **, PyObject**, PyFrameObject *);
65static int call_trace(PyObject **, PyObject **,
Fred Draked0838392001-06-16 21:02:31 +000066 PyFrameObject *, PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000067static PyObject *loop_subscript(PyObject *, PyObject *);
68static PyObject *apply_slice(PyObject *, PyObject *, PyObject *);
69static int assign_slice(PyObject *, PyObject *,
70 PyObject *, PyObject *);
71static PyObject *cmp_outcome(int, PyObject *, PyObject *);
Thomas Wouters52152252000-08-17 22:55:00 +000072static PyObject *import_from(PyObject *, PyObject *);
73static int import_all_from(PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000074static PyObject *build_class(PyObject *, PyObject *, PyObject *);
75static int exec_statement(PyFrameObject *,
76 PyObject *, PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000077static void set_exc_info(PyThreadState *, PyObject *, PyObject *, PyObject *);
78static void reset_exc_info(PyThreadState *);
Paul Prescode68140d2000-08-30 20:25:01 +000079static void format_exc_check_arg(PyObject *, char *, PyObject *);
Guido van Rossum374a9221991-04-04 10:40:29 +000080
Paul Prescode68140d2000-08-30 20:25:01 +000081#define NAME_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000082 "name '%.200s' is not defined"
Jeremy Hylton64949cb2001-01-25 20:06:59 +000083#define GLOBAL_NAME_ERROR_MSG \
84 "global name '%.200s' is not defined"
Paul Prescode68140d2000-08-30 20:25:01 +000085#define UNBOUNDLOCAL_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000086 "local variable '%.200s' referenced before assignment"
Jeremy Hyltonc76770c2001-04-13 16:51:46 +000087#define UNBOUNDFREE_ERROR_MSG \
88 "free variable '%.200s' referenced before assignment" \
89 " in enclosing scope"
Guido van Rossum374a9221991-04-04 10:40:29 +000090
Guido van Rossum950361c1997-01-24 13:49:28 +000091/* Dynamic execution profile */
92#ifdef DYNAMIC_EXECUTION_PROFILE
93#ifdef DXPAIRS
94static long dxpairs[257][256];
95#define dxp dxpairs[256]
96#else
97static long dxp[256];
98#endif
99#endif
100
Fred Drake904aa7b2001-06-08 04:33:09 +0000101/* Cached interned string objects used for calling the profile and
102 * trace functions.
103 */
104static PyObject *str_call = NULL;
105static PyObject *str_exception = NULL;
106static PyObject *str_line = NULL;
107static PyObject *str_return = NULL;
108
109
Tim Peters5ca576e2001-06-18 22:08:13 +0000110staticforward PyTypeObject gentype;
111
112typedef struct {
113 PyObject_HEAD
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000114 /* The gi_ prefix is intended to remind of generator-iterator. */
115
116 PyFrameObject *gi_frame;
117
118 /* True if generator is being executed. */
119 int gi_running;
Tim Peters5ca576e2001-06-18 22:08:13 +0000120} genobject;
121
122static PyObject *
123gen_new(PyFrameObject *f)
124{
125 genobject *gen = PyObject_New(genobject, &gentype);
126 if (gen == NULL) {
127 Py_DECREF(f);
128 return NULL;
129 }
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000130 gen->gi_frame = f;
131 gen->gi_running = 0;
Tim Peters5ca576e2001-06-18 22:08:13 +0000132 return (PyObject *)gen;
133}
134
135static void
136gen_dealloc(genobject *gen)
137{
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000138 Py_DECREF(gen->gi_frame);
Tim Peters5ca576e2001-06-18 22:08:13 +0000139 PyObject_DEL(gen);
140}
141
142static PyObject *
143gen_iternext(genobject *gen)
144{
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000145 PyThreadState *tstate = PyThreadState_GET();
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000146 PyFrameObject *f = gen->gi_frame;
Tim Peters5ca576e2001-06-18 22:08:13 +0000147 PyObject *result;
148
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000149 if (gen->gi_running) {
Tim Peters5ca576e2001-06-18 22:08:13 +0000150 PyErr_SetString(PyExc_ValueError,
151 "generator already executing");
152 return NULL;
153 }
Tim Peters8c963692001-06-23 05:26:56 +0000154 if (f->f_stacktop == NULL)
Tim Peters5ca576e2001-06-18 22:08:13 +0000155 return NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000156
157 /* Generators always return to their most recent caller, not
158 * necessarily their creator. */
Tim Peters5eb4b872001-06-23 05:47:56 +0000159 Py_XINCREF(tstate->frame);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000160 assert(f->f_back == NULL);
161 f->f_back = tstate->frame;
162
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000163 gen->gi_running = 1;
Tim Peters5ca576e2001-06-18 22:08:13 +0000164 result = eval_frame(f);
Tim Petersd8e1c9e2001-06-26 20:58:58 +0000165 gen->gi_running = 0;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000166
167 /* Don't keep the reference to f_back any longer than necessary. It
168 * may keep a chain of frames alive or it could create a reference
169 * cycle. */
Tim Peters5eb4b872001-06-23 05:47:56 +0000170 Py_XDECREF(f->f_back);
Tim Peters6302ec62001-06-20 06:57:32 +0000171 f->f_back = NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000172
Tim Petersad1a18b2001-06-23 06:19:16 +0000173 /* If the generator just returned (as opposed to yielding), signal
174 * that the generator is exhausted. */
175 if (result == Py_None && f->f_stacktop == NULL) {
176 Py_DECREF(result);
177 result = NULL;
178 }
179
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000180 return result;
Tim Peters5ca576e2001-06-18 22:08:13 +0000181}
182
183static PyObject *
184gen_next(genobject *gen, PyObject *args)
185{
186 PyObject *result;
187
188 if (!PyArg_ParseTuple(args, ":next"))
189 return NULL;
190
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000191 result = gen_iternext(gen);
Tim Peters5ca576e2001-06-18 22:08:13 +0000192
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000193 if (result == NULL && !PyErr_Occurred()) {
Tim Peters5ca576e2001-06-18 22:08:13 +0000194 PyErr_SetObject(PyExc_StopIteration, Py_None);
195 return NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000196 }
Tim Peters5ca576e2001-06-18 22:08:13 +0000197
198 return result;
199}
200
201static PyObject *
202gen_getiter(PyObject *gen)
203{
204 Py_INCREF(gen);
205 return gen;
206}
207
208static struct PyMethodDef gen_methods[] = {
209 {"next", (PyCFunction)gen_next, METH_VARARGS,
210 "next() -- get the next value, or raise StopIteration"},
211 {NULL, NULL} /* Sentinel */
212};
213
214static PyObject *
215gen_getattr(genobject *gen, char *name)
216{
217 return Py_FindMethod(gen_methods, (PyObject *)gen, name);
218}
219
220statichere PyTypeObject gentype = {
221 PyObject_HEAD_INIT(&PyType_Type)
222 0, /* ob_size */
223 "generator", /* tp_name */
224 sizeof(genobject), /* tp_basicsize */
225 0, /* tp_itemsize */
226 /* methods */
227 (destructor)gen_dealloc, /* tp_dealloc */
228 0, /* tp_print */
229 (getattrfunc)gen_getattr, /* tp_getattr */
230 0, /* tp_setattr */
231 0, /* tp_compare */
232 0, /* tp_repr */
233 0, /* tp_as_number */
234 0, /* tp_as_sequence */
235 0, /* tp_as_mapping */
236 0, /* tp_hash */
237 0, /* tp_call */
238 0, /* tp_str */
239 0, /* tp_getattro */
240 0, /* tp_setattro */
241 0, /* tp_as_buffer */
242 Py_TPFLAGS_DEFAULT, /* tp_flags */
243 0, /* tp_doc */
244 0, /* tp_traverse */
245 0, /* tp_clear */
246 0, /* tp_richcompare */
247 0, /* tp_weaklistoffset */
248 (getiterfunc)gen_getiter, /* tp_iter */
249 (iternextfunc)gen_iternext, /* tp_iternext */
250};
251
252
Guido van Rossume59214e1994-08-30 08:01:59 +0000253#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000254
Guido van Rossum2571cc81999-04-07 16:07:23 +0000255#ifndef DONT_HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000256#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +0000257#endif
Guido van Rossum49b56061998-10-01 20:42:43 +0000258#include "pythread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000259
Guido van Rossuma027efa1997-05-05 20:56:21 +0000260extern int _PyThread_Started; /* Flag for Py_Exit */
261
Guido van Rossum65d5b571998-12-21 19:32:43 +0000262static PyThread_type_lock interpreter_lock = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000263static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000264
265void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000266PyEval_InitThreads(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000267{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000268 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000269 return;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000270 _PyThread_Started = 1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000271 interpreter_lock = PyThread_allocate_lock();
272 PyThread_acquire_lock(interpreter_lock, 1);
273 main_thread = PyThread_get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000274}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000275
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000276void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000277PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000278{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000279 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000280}
281
282void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000283PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000284{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000285 PyThread_release_lock(interpreter_lock);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000286}
287
288void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000289PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000290{
291 if (tstate == NULL)
292 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000293 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000294 if (PyThreadState_Swap(tstate) != NULL)
295 Py_FatalError(
296 "PyEval_AcquireThread: non-NULL old thread state");
297}
298
299void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000300PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000301{
302 if (tstate == NULL)
303 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
304 if (PyThreadState_Swap(NULL) != tstate)
305 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000306 PyThread_release_lock(interpreter_lock);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000307}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000308
309/* This function is called from PyOS_AfterFork to ensure that newly
310 created child processes don't hold locks referring to threads which
311 are not running in the child process. (This could also be done using
312 pthread_atfork mechanism, at least for the pthreads implementation.) */
313
314void
315PyEval_ReInitThreads(void)
316{
317 if (!interpreter_lock)
318 return;
319 /*XXX Can't use PyThread_free_lock here because it does too
320 much error-checking. Doing this cleanly would require
321 adding a new function to each thread_*.h. Instead, just
322 create a new lock and waste a little bit of memory */
323 interpreter_lock = PyThread_allocate_lock();
324 PyThread_acquire_lock(interpreter_lock, 1);
325 main_thread = PyThread_get_thread_ident();
326}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000327#endif
328
Guido van Rossumff4949e1992-08-05 19:58:53 +0000329/* Functions save_thread and restore_thread are always defined so
330 dynamically loaded modules needn't be compiled separately for use
331 with and without threads: */
332
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000333PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000334PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000335{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000336 PyThreadState *tstate = PyThreadState_Swap(NULL);
337 if (tstate == NULL)
338 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000339#ifdef WITH_THREAD
Guido van Rossumb74eca91997-09-30 22:03:16 +0000340 if (interpreter_lock)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000341 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000342#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000343 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000344}
345
346void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000347PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000348{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000349 if (tstate == NULL)
350 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000351#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000352 if (interpreter_lock) {
Guido van Rossumb74eca91997-09-30 22:03:16 +0000353 int err = errno;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000354 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000355 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000356 }
357#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000358 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000359}
360
361
Guido van Rossuma9672091994-09-14 13:31:22 +0000362/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
363 signal handlers or Mac I/O completion routines) can schedule calls
364 to a function to be called synchronously.
365 The synchronous function is called with one void* argument.
366 It should return 0 for success or -1 for failure -- failure should
367 be accompanied by an exception.
368
369 If registry succeeds, the registry function returns 0; if it fails
370 (e.g. due to too many pending calls) it returns -1 (without setting
371 an exception condition).
372
373 Note that because registry may occur from within signal handlers,
374 or other asynchronous events, calling malloc() is unsafe!
375
376#ifdef WITH_THREAD
377 Any thread can schedule pending calls, but only the main thread
378 will execute them.
379#endif
380
381 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
382 There are two possible race conditions:
383 (1) nested asynchronous registry calls;
384 (2) registry calls made while pending calls are being processed.
385 While (1) is very unlikely, (2) is a real possibility.
386 The current code is safe against (2), but not against (1).
387 The safety against (2) is derived from the fact that only one
388 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000389
Guido van Rossuma027efa1997-05-05 20:56:21 +0000390 XXX Darn! With the advent of thread state, we should have an array
391 of pending calls per thread in the thread state! Later...
392*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000393
Guido van Rossuma9672091994-09-14 13:31:22 +0000394#define NPENDINGCALLS 32
395static struct {
Thomas Wouters334fb892000-07-25 12:56:38 +0000396 int (*func)(void *);
397 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000398} pendingcalls[NPENDINGCALLS];
399static volatile int pendingfirst = 0;
400static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000401static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000402
403int
Thomas Wouters334fb892000-07-25 12:56:38 +0000404Py_AddPendingCall(int (*func)(void *), void *arg)
Guido van Rossuma9672091994-09-14 13:31:22 +0000405{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000406 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000407 int i, j;
408 /* XXX Begin critical section */
409 /* XXX If you want this to be safe against nested
410 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000411 if (busy)
412 return -1;
413 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000414 i = pendinglast;
415 j = (i + 1) % NPENDINGCALLS;
416 if (j == pendingfirst)
417 return -1; /* Queue full */
418 pendingcalls[i].func = func;
419 pendingcalls[i].arg = arg;
420 pendinglast = j;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000421 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000422 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000423 /* XXX End critical section */
424 return 0;
425}
426
Guido van Rossum180d7b41994-09-29 09:45:57 +0000427int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000428Py_MakePendingCalls(void)
Guido van Rossuma9672091994-09-14 13:31:22 +0000429{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000430 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000431#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000432 if (main_thread && PyThread_get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000433 return 0;
434#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000435 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000436 return 0;
437 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000438 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000439 for (;;) {
440 int i;
Thomas Wouters334fb892000-07-25 12:56:38 +0000441 int (*func)(void *);
442 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000443 i = pendingfirst;
444 if (i == pendinglast)
445 break; /* Queue empty */
446 func = pendingcalls[i].func;
447 arg = pendingcalls[i].arg;
448 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000449 if (func(arg) < 0) {
450 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000451 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000452 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000453 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000454 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000455 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000456 return 0;
457}
458
459
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000460/* The interpreter's recursion limit */
461
Guido van Rossum349ff6f2000-09-01 01:52:08 +0000462static int recursion_limit = 1000;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000463
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000464int
465Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000466{
467 return recursion_limit;
468}
469
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000470void
471Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000472{
473 recursion_limit = new_limit;
474}
475
Guido van Rossum374a9221991-04-04 10:40:29 +0000476/* Status code for main loop (reason for stack unwind) */
477
478enum why_code {
479 WHY_NOT, /* No error */
480 WHY_EXCEPTION, /* Exception occurred */
481 WHY_RERAISE, /* Exception re-raised by 'finally' */
482 WHY_RETURN, /* 'return' statement */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +0000483 WHY_BREAK, /* 'break' statement */
Tim Peters5ca576e2001-06-18 22:08:13 +0000484 WHY_CONTINUE, /* 'continue' statement */
485 WHY_YIELD, /* 'yield' operator */
Guido van Rossum374a9221991-04-04 10:40:29 +0000486};
487
Tim Petersdbd9ba62000-07-09 03:09:57 +0000488static enum why_code do_raise(PyObject *, PyObject *, PyObject *);
Tim Petersd6d010b2001-06-21 02:49:55 +0000489static int unpack_iterable(PyObject *, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000490
Guido van Rossum374a9221991-04-04 10:40:29 +0000491
Guido van Rossumb209a111997-04-29 18:18:01 +0000492PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000493PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000494{
495 return eval_code2(co,
496 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000497 (PyObject **)NULL, 0,
498 (PyObject **)NULL, 0,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000499 (PyObject **)NULL, 0,
500 NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000501}
502
503
504/* Interpreter main loop */
505
Tim Peters5ca576e2001-06-18 22:08:13 +0000506PyObject *
507eval_frame(PyFrameObject *f)
Guido van Rossum374a9221991-04-04 10:40:29 +0000508{
Guido van Rossum950361c1997-01-24 13:49:28 +0000509#ifdef DXPAIRS
510 int lastopcode = 0;
511#endif
Jeremy Hylton52820442001-01-03 23:52:36 +0000512 PyObject **stack_pointer;
Guido van Rossum374a9221991-04-04 10:40:29 +0000513 register unsigned char *next_instr;
Moshe Zadkaaa39a7e2000-08-07 06:34:45 +0000514 register int opcode=0; /* Current opcode */
515 register int oparg=0; /* Current opcode argument, if any */
Guido van Rossum374a9221991-04-04 10:40:29 +0000516 register enum why_code why; /* Reason for block stack unwind */
517 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000518 register PyObject *x; /* Result object -- NULL if error */
519 register PyObject *v; /* Temporary objects popped off stack */
520 register PyObject *w;
521 register PyObject *u;
522 register PyObject *t;
Barry Warsaw23c9ec82000-08-21 15:44:01 +0000523 register PyObject *stream = NULL; /* for PRINT opcodes */
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000524 register PyObject **fastlocals, **freevars;
Guido van Rossum014518f1998-11-23 21:09:51 +0000525 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000526 PyThreadState *tstate = PyThreadState_GET();
Tim Peters5ca576e2001-06-18 22:08:13 +0000527 PyCodeObject *co;
Guido van Rossumd076c731998-10-07 19:42:25 +0000528 unsigned char *first_instr;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000529#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000530 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000531#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000532#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000533 /* Make it easier to find out where we are with a debugger */
Tim Peters5ca576e2001-06-18 22:08:13 +0000534 char *filename;
Guido van Rossum99bec951992-09-03 20:29:45 +0000535#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000536
537/* Code access macros */
538
539#define GETCONST(i) Getconst(f, i)
540#define GETNAME(i) Getname(f, i)
541#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumd076c731998-10-07 19:42:25 +0000542#define INSTR_OFFSET() (next_instr - first_instr)
Guido van Rossum374a9221991-04-04 10:40:29 +0000543#define NEXTOP() (*next_instr++)
544#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossumd076c731998-10-07 19:42:25 +0000545#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000546#define JUMPBY(x) (next_instr += (x))
547
548/* Stack manipulation macros */
549
550#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
551#define EMPTY() (STACK_LEVEL() == 0)
552#define TOP() (stack_pointer[-1])
553#define BASIC_PUSH(v) (*stack_pointer++ = (v))
554#define BASIC_POP() (*--stack_pointer)
555
Guido van Rossum96a42c81992-01-12 02:29:51 +0000556#ifdef LLTRACE
557#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
558#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000559#else
560#define PUSH(v) BASIC_PUSH(v)
561#define POP() BASIC_POP()
562#endif
563
Guido van Rossum681d79a1995-07-18 14:51:37 +0000564/* Local variable macros */
565
566#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumb209a111997-04-29 18:18:01 +0000567#define SETLOCAL(i, value) do { Py_XDECREF(GETLOCAL(i)); \
Guido van Rossum681d79a1995-07-18 14:51:37 +0000568 GETLOCAL(i) = value; } while (0)
569
Guido van Rossuma027efa1997-05-05 20:56:21 +0000570/* Start of code */
571
Tim Peters5ca576e2001-06-18 22:08:13 +0000572 if (f == NULL)
573 return NULL;
574
Guido van Rossum8861b741996-07-30 16:49:37 +0000575#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000576 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000577 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000578 return NULL;
579 }
580#endif
581
Tim Peters5ca576e2001-06-18 22:08:13 +0000582 /* push frame */
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000583 if (++tstate->recursion_depth > recursion_limit) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000584 --tstate->recursion_depth;
585 PyErr_SetString(PyExc_RuntimeError,
Fred Drake661ea262000-10-24 19:57:45 +0000586 "maximum recursion depth exceeded");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000587 tstate->frame = f->f_back;
Guido van Rossum8861b741996-07-30 16:49:37 +0000588 return NULL;
589 }
590
Tim Peters5ca576e2001-06-18 22:08:13 +0000591 tstate->frame = f;
Tim Peters5ca576e2001-06-18 22:08:13 +0000592 co = f->f_code;
593 fastlocals = f->f_localsplus;
594 freevars = f->f_localsplus + f->f_nlocals;
Guido van Rossumd076c731998-10-07 19:42:25 +0000595 _PyCode_GETCODEPTR(co, &first_instr);
Tim Peters5ca576e2001-06-18 22:08:13 +0000596 next_instr = first_instr + f->f_lasti;
Tim Peters8c963692001-06-23 05:26:56 +0000597 stack_pointer = f->f_stacktop;
598 assert(stack_pointer != NULL);
599 f->f_stacktop = NULL;
Tim Peters5ca576e2001-06-18 22:08:13 +0000600
601#ifdef LLTRACE
602 lltrace = PyDict_GetItemString(f->f_globals,"__lltrace__") != NULL;
603#endif
604#if defined(Py_DEBUG) || defined(LLTRACE)
605 filename = PyString_AsString(co->co_filename);
606#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000607
Guido van Rossum374a9221991-04-04 10:40:29 +0000608 why = WHY_NOT;
609 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000610 x = Py_None; /* Not a reference, just anything non-NULL */
Fred Drake48fba732000-10-11 13:54:07 +0000611 w = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +0000612
Guido van Rossum374a9221991-04-04 10:40:29 +0000613 for (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000614 /* Do periodic things. Doing this every time through
615 the loop would add too much overhead, so we do it
616 only every Nth instruction. We also do it if
617 ``things_to_do'' is set, i.e. when an asynchronous
618 event needs attention (e.g. a signal handler or
619 async I/O handler); see Py_AddPendingCall() and
620 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +0000621
Guido van Rossuma027efa1997-05-05 20:56:21 +0000622 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000623 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000624 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000625 if (Py_MakePendingCalls() < 0) {
626 why = WHY_EXCEPTION;
627 goto on_error;
628 }
629 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000630#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000631 /* If we have true signals, the signal handler
632 will call Py_AddPendingCall() so we don't
633 have to call sigcheck(). On the Mac and
634 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000635 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000636 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000637 goto on_error;
638 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000639#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000640
Guido van Rossume59214e1994-08-30 08:01:59 +0000641#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000642 if (interpreter_lock) {
643 /* Give another thread a chance */
644
Guido van Rossum25ce5661997-08-02 03:10:38 +0000645 if (PyThreadState_Swap(NULL) != tstate)
646 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000647 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000648
649 /* Other threads may run now */
650
Guido van Rossum65d5b571998-12-21 19:32:43 +0000651 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000652 if (PyThreadState_Swap(tstate) != NULL)
653 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000654 }
655#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000656 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000657
Guido van Rossum374a9221991-04-04 10:40:29 +0000658 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000659
Guido van Rossum408027e1996-12-30 16:17:54 +0000660#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000661 f->f_lasti = INSTR_OFFSET();
662#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000663
Guido van Rossum374a9221991-04-04 10:40:29 +0000664 opcode = NEXTOP();
665 if (HAS_ARG(opcode))
666 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000667 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000668#ifdef DYNAMIC_EXECUTION_PROFILE
669#ifdef DXPAIRS
670 dxpairs[lastopcode][opcode]++;
671 lastopcode = opcode;
672#endif
673 dxp[opcode]++;
674#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000675
Guido van Rossum96a42c81992-01-12 02:29:51 +0000676#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000677 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +0000678
Guido van Rossum96a42c81992-01-12 02:29:51 +0000679 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000680 if (HAS_ARG(opcode)) {
681 printf("%d: %d, %d\n",
682 (int) (INSTR_OFFSET() - 3),
683 opcode, oparg);
684 }
685 else {
686 printf("%d: %d\n",
687 (int) (INSTR_OFFSET() - 1), opcode);
688 }
689 }
690#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000691 /* Main switch on opcode */
Jeremy Hylton52820442001-01-03 23:52:36 +0000692
Guido van Rossum374a9221991-04-04 10:40:29 +0000693 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000694
Guido van Rossum374a9221991-04-04 10:40:29 +0000695 /* BEWARE!
696 It is essential that any operation that fails sets either
697 x to NULL, err to nonzero, or why to anything but WHY_NOT,
698 and that no operation that succeeds does this! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000699
Guido van Rossum374a9221991-04-04 10:40:29 +0000700 /* case STOP_CODE: this is an error! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000701
Guido van Rossum374a9221991-04-04 10:40:29 +0000702 case POP_TOP:
703 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000704 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000705 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000706
Guido van Rossum374a9221991-04-04 10:40:29 +0000707 case ROT_TWO:
708 v = POP();
709 w = POP();
710 PUSH(v);
711 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000712 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000713
Guido van Rossum374a9221991-04-04 10:40:29 +0000714 case ROT_THREE:
715 v = POP();
716 w = POP();
717 x = POP();
718 PUSH(v);
719 PUSH(x);
720 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000721 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000722
Thomas Wouters434d0822000-08-24 20:11:32 +0000723 case ROT_FOUR:
724 u = POP();
725 v = POP();
726 w = POP();
727 x = POP();
728 PUSH(u);
729 PUSH(x);
730 PUSH(w);
731 PUSH(v);
732 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000733
Guido van Rossum374a9221991-04-04 10:40:29 +0000734 case DUP_TOP:
735 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000736 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000737 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000738 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000739
Thomas Wouters434d0822000-08-24 20:11:32 +0000740 case DUP_TOPX:
741 switch (oparg) {
Thomas Wouters434d0822000-08-24 20:11:32 +0000742 case 1:
Tim Peters35ba6892000-10-11 07:04:49 +0000743 x = TOP();
744 Py_INCREF(x);
745 PUSH(x);
746 continue;
747 case 2:
Thomas Wouters434d0822000-08-24 20:11:32 +0000748 x = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000749 Py_INCREF(x);
750 w = TOP();
751 Py_INCREF(w);
752 PUSH(x);
753 PUSH(w);
754 PUSH(x);
755 continue;
756 case 3:
757 x = POP();
758 Py_INCREF(x);
Thomas Wouters434d0822000-08-24 20:11:32 +0000759 w = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000760 Py_INCREF(w);
761 v = TOP();
762 Py_INCREF(v);
763 PUSH(w);
764 PUSH(x);
765 PUSH(v);
766 PUSH(w);
767 PUSH(x);
768 continue;
769 case 4:
770 x = POP();
771 Py_INCREF(x);
772 w = POP();
773 Py_INCREF(w);
Thomas Wouters434d0822000-08-24 20:11:32 +0000774 v = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000775 Py_INCREF(v);
776 u = TOP();
777 Py_INCREF(u);
778 PUSH(v);
779 PUSH(w);
780 PUSH(x);
781 PUSH(u);
782 PUSH(v);
783 PUSH(w);
784 PUSH(x);
785 continue;
786 case 5:
787 x = POP();
788 Py_INCREF(x);
789 w = POP();
790 Py_INCREF(w);
791 v = POP();
792 Py_INCREF(v);
Thomas Wouters434d0822000-08-24 20:11:32 +0000793 u = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000794 Py_INCREF(u);
795 t = TOP();
796 Py_INCREF(t);
797 PUSH(u);
798 PUSH(v);
799 PUSH(w);
800 PUSH(x);
801 PUSH(t);
802 PUSH(u);
803 PUSH(v);
804 PUSH(w);
805 PUSH(x);
806 continue;
Thomas Wouters434d0822000-08-24 20:11:32 +0000807 default:
Thomas Wouters0be483f2000-10-11 23:26:11 +0000808 Py_FatalError("invalid argument to DUP_TOPX"
809 " (bytecode corruption?)");
Thomas Wouters434d0822000-08-24 20:11:32 +0000810 }
Tim Peters35ba6892000-10-11 07:04:49 +0000811 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000812
Guido van Rossum374a9221991-04-04 10:40:29 +0000813 case UNARY_POSITIVE:
814 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000815 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000816 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000817 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000818 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000819 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000820
Guido van Rossum374a9221991-04-04 10:40:29 +0000821 case UNARY_NEGATIVE:
822 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000823 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000824 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000825 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000826 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000827 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000828
Guido van Rossum374a9221991-04-04 10:40:29 +0000829 case UNARY_NOT:
830 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000831 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000832 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000833 if (err == 0) {
834 Py_INCREF(Py_True);
835 PUSH(Py_True);
836 continue;
837 }
838 else if (err > 0) {
839 Py_INCREF(Py_False);
840 PUSH(Py_False);
841 err = 0;
842 continue;
843 }
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_CONVERT:
847 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000848 x = PyObject_Repr(v);
849 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 Rossum7928cd71991-10-24 14:59:31 +0000854 case UNARY_INVERT:
855 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000856 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000857 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000858 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000859 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000860 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000861
Guido van Rossum50564e81996-01-12 01:13:16 +0000862 case BINARY_POWER:
863 w = POP();
864 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000865 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000866 Py_DECREF(v);
867 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000868 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000869 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000870 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000871
Guido van Rossum374a9221991-04-04 10:40:29 +0000872 case BINARY_MULTIPLY:
873 w = POP();
874 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000875 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000876 Py_DECREF(v);
877 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000878 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000879 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000880 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000881
Guido van Rossum374a9221991-04-04 10:40:29 +0000882 case BINARY_DIVIDE:
883 w = POP();
884 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000885 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000886 Py_DECREF(v);
887 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000888 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000889 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000890 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000891
Guido van Rossum374a9221991-04-04 10:40:29 +0000892 case BINARY_MODULO:
893 w = POP();
894 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000895 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000896 Py_DECREF(v);
897 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000898 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000899 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000900 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000901
Guido van Rossum374a9221991-04-04 10:40:29 +0000902 case BINARY_ADD:
903 w = POP();
904 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000905 if (PyInt_Check(v) && PyInt_Check(w)) {
906 /* INLINE: int + int */
907 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000908 a = PyInt_AS_LONG(v);
909 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000910 i = a + b;
911 if ((i^a) < 0 && (i^b) < 0) {
912 PyErr_SetString(PyExc_OverflowError,
913 "integer addition");
914 x = NULL;
915 }
916 else
917 x = PyInt_FromLong(i);
918 }
919 else
920 x = PyNumber_Add(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000921 Py_DECREF(v);
922 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000923 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000924 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000925 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000926
Guido van Rossum374a9221991-04-04 10:40:29 +0000927 case BINARY_SUBTRACT:
928 w = POP();
929 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000930 if (PyInt_Check(v) && PyInt_Check(w)) {
931 /* INLINE: int - int */
932 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000933 a = PyInt_AS_LONG(v);
934 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000935 i = a - b;
936 if ((i^a) < 0 && (i^~b) < 0) {
937 PyErr_SetString(PyExc_OverflowError,
938 "integer subtraction");
939 x = NULL;
940 }
941 else
942 x = PyInt_FromLong(i);
943 }
944 else
945 x = PyNumber_Subtract(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000946 Py_DECREF(v);
947 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000948 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000949 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000950 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000951
Guido van Rossum374a9221991-04-04 10:40:29 +0000952 case BINARY_SUBSCR:
953 w = POP();
954 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000955 if (PyList_Check(v) && PyInt_Check(w)) {
956 /* INLINE: list[int] */
957 long i = PyInt_AsLong(w);
958 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +0000959 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +0000960 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +0000961 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000962 PyErr_SetString(PyExc_IndexError,
963 "list index out of range");
964 x = NULL;
965 }
966 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +0000967 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000968 Py_INCREF(x);
969 }
970 }
971 else
972 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000973 Py_DECREF(v);
974 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000975 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000976 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000977 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000978
Guido van Rossum7928cd71991-10-24 14:59:31 +0000979 case BINARY_LSHIFT:
980 w = POP();
981 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000982 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000983 Py_DECREF(v);
984 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000985 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000986 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000987 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000988
Guido van Rossum7928cd71991-10-24 14:59:31 +0000989 case BINARY_RSHIFT:
990 w = POP();
991 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000992 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000993 Py_DECREF(v);
994 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000995 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000996 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000997 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000998
Guido van Rossum7928cd71991-10-24 14:59:31 +0000999 case BINARY_AND:
1000 w = POP();
1001 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001002 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001003 Py_DECREF(v);
1004 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001005 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001006 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001007 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001008
Guido van Rossum7928cd71991-10-24 14:59:31 +00001009 case BINARY_XOR:
1010 w = POP();
1011 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001012 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001013 Py_DECREF(v);
1014 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001015 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001016 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001017 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001018
Guido van Rossum7928cd71991-10-24 14:59:31 +00001019 case BINARY_OR:
1020 w = POP();
1021 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001022 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001023 Py_DECREF(v);
1024 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001025 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001026 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001027 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001028
1029 case INPLACE_POWER:
1030 w = POP();
1031 v = POP();
1032 x = PyNumber_InPlacePower(v, w, Py_None);
1033 Py_DECREF(v);
1034 Py_DECREF(w);
1035 PUSH(x);
1036 if (x != NULL) continue;
1037 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001038
Thomas Wouters434d0822000-08-24 20:11:32 +00001039 case INPLACE_MULTIPLY:
1040 w = POP();
1041 v = POP();
1042 x = PyNumber_InPlaceMultiply(v, w);
1043 Py_DECREF(v);
1044 Py_DECREF(w);
1045 PUSH(x);
1046 if (x != NULL) continue;
1047 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001048
Thomas Wouters434d0822000-08-24 20:11:32 +00001049 case INPLACE_DIVIDE:
1050 w = POP();
1051 v = POP();
1052 x = PyNumber_InPlaceDivide(v, w);
1053 Py_DECREF(v);
1054 Py_DECREF(w);
1055 PUSH(x);
1056 if (x != NULL) continue;
1057 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001058
Thomas Wouters434d0822000-08-24 20:11:32 +00001059 case INPLACE_MODULO:
1060 w = POP();
1061 v = POP();
1062 x = PyNumber_InPlaceRemainder(v, w);
1063 Py_DECREF(v);
1064 Py_DECREF(w);
1065 PUSH(x);
1066 if (x != NULL) continue;
1067 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001068
Thomas Wouters434d0822000-08-24 20:11:32 +00001069 case INPLACE_ADD:
1070 w = POP();
1071 v = POP();
1072 if (PyInt_Check(v) && PyInt_Check(w)) {
1073 /* INLINE: int + int */
1074 register long a, b, i;
1075 a = PyInt_AS_LONG(v);
1076 b = PyInt_AS_LONG(w);
1077 i = a + b;
1078 if ((i^a) < 0 && (i^b) < 0) {
1079 PyErr_SetString(PyExc_OverflowError,
1080 "integer addition");
1081 x = NULL;
1082 }
1083 else
1084 x = PyInt_FromLong(i);
1085 }
1086 else
1087 x = PyNumber_InPlaceAdd(v, w);
1088 Py_DECREF(v);
1089 Py_DECREF(w);
1090 PUSH(x);
1091 if (x != NULL) continue;
1092 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001093
Thomas Wouters434d0822000-08-24 20:11:32 +00001094 case INPLACE_SUBTRACT:
1095 w = POP();
1096 v = POP();
1097 if (PyInt_Check(v) && PyInt_Check(w)) {
1098 /* INLINE: int - int */
1099 register long a, b, i;
1100 a = PyInt_AS_LONG(v);
1101 b = PyInt_AS_LONG(w);
1102 i = a - b;
1103 if ((i^a) < 0 && (i^~b) < 0) {
1104 PyErr_SetString(PyExc_OverflowError,
1105 "integer subtraction");
1106 x = NULL;
1107 }
1108 else
1109 x = PyInt_FromLong(i);
1110 }
1111 else
1112 x = PyNumber_InPlaceSubtract(v, w);
1113 Py_DECREF(v);
1114 Py_DECREF(w);
1115 PUSH(x);
1116 if (x != NULL) continue;
1117 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001118
Thomas Wouters434d0822000-08-24 20:11:32 +00001119 case INPLACE_LSHIFT:
1120 w = POP();
1121 v = POP();
1122 x = PyNumber_InPlaceLshift(v, w);
1123 Py_DECREF(v);
1124 Py_DECREF(w);
1125 PUSH(x);
1126 if (x != NULL) continue;
1127 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001128
Thomas Wouters434d0822000-08-24 20:11:32 +00001129 case INPLACE_RSHIFT:
1130 w = POP();
1131 v = POP();
1132 x = PyNumber_InPlaceRshift(v, w);
1133 Py_DECREF(v);
1134 Py_DECREF(w);
1135 PUSH(x);
1136 if (x != NULL) continue;
1137 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001138
Thomas Wouters434d0822000-08-24 20:11:32 +00001139 case INPLACE_AND:
1140 w = POP();
1141 v = POP();
1142 x = PyNumber_InPlaceAnd(v, w);
1143 Py_DECREF(v);
1144 Py_DECREF(w);
1145 PUSH(x);
1146 if (x != NULL) continue;
1147 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001148
Thomas Wouters434d0822000-08-24 20:11:32 +00001149 case INPLACE_XOR:
1150 w = POP();
1151 v = POP();
1152 x = PyNumber_InPlaceXor(v, w);
1153 Py_DECREF(v);
1154 Py_DECREF(w);
1155 PUSH(x);
1156 if (x != NULL) continue;
1157 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001158
Thomas Wouters434d0822000-08-24 20:11:32 +00001159 case INPLACE_OR:
1160 w = POP();
1161 v = POP();
1162 x = PyNumber_InPlaceOr(v, w);
1163 Py_DECREF(v);
1164 Py_DECREF(w);
1165 PUSH(x);
1166 if (x != NULL) continue;
1167 break;
1168
Guido van Rossum374a9221991-04-04 10:40:29 +00001169 case SLICE+0:
1170 case SLICE+1:
1171 case SLICE+2:
1172 case SLICE+3:
1173 if ((opcode-SLICE) & 2)
1174 w = POP();
1175 else
1176 w = NULL;
1177 if ((opcode-SLICE) & 1)
1178 v = POP();
1179 else
1180 v = NULL;
1181 u = POP();
1182 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001183 Py_DECREF(u);
1184 Py_XDECREF(v);
1185 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001186 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001187 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001188 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001189
Guido van Rossum374a9221991-04-04 10:40:29 +00001190 case STORE_SLICE+0:
1191 case STORE_SLICE+1:
1192 case STORE_SLICE+2:
1193 case STORE_SLICE+3:
1194 if ((opcode-STORE_SLICE) & 2)
1195 w = POP();
1196 else
1197 w = NULL;
1198 if ((opcode-STORE_SLICE) & 1)
1199 v = POP();
1200 else
1201 v = NULL;
1202 u = POP();
1203 t = POP();
1204 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001205 Py_DECREF(t);
1206 Py_DECREF(u);
1207 Py_XDECREF(v);
1208 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001209 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001210 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001211
Guido van Rossum374a9221991-04-04 10:40:29 +00001212 case DELETE_SLICE+0:
1213 case DELETE_SLICE+1:
1214 case DELETE_SLICE+2:
1215 case DELETE_SLICE+3:
1216 if ((opcode-DELETE_SLICE) & 2)
1217 w = POP();
1218 else
1219 w = NULL;
1220 if ((opcode-DELETE_SLICE) & 1)
1221 v = POP();
1222 else
1223 v = NULL;
1224 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001225 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001226 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001227 Py_DECREF(u);
1228 Py_XDECREF(v);
1229 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001230 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001231 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001232
Guido van Rossum374a9221991-04-04 10:40:29 +00001233 case STORE_SUBSCR:
1234 w = POP();
1235 v = POP();
1236 u = POP();
1237 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001238 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001239 Py_DECREF(u);
1240 Py_DECREF(v);
1241 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001242 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001243 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001244
Guido van Rossum374a9221991-04-04 10:40:29 +00001245 case DELETE_SUBSCR:
1246 w = POP();
1247 v = POP();
1248 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001249 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001250 Py_DECREF(v);
1251 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001252 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001253 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001254
Guido van Rossum374a9221991-04-04 10:40:29 +00001255 case PRINT_EXPR:
1256 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001257 w = PySys_GetObject("displayhook");
1258 if (w == NULL) {
1259 PyErr_SetString(PyExc_RuntimeError,
1260 "lost sys.displayhook");
1261 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001262 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001263 }
1264 if (err == 0) {
1265 x = Py_BuildValue("(O)", v);
1266 if (x == NULL)
1267 err = -1;
1268 }
1269 if (err == 0) {
1270 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001271 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001272 if (w == NULL)
1273 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001274 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001275 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001276 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001277 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001278
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001279 case PRINT_ITEM_TO:
1280 w = stream = POP();
1281 /* fall through to PRINT_ITEM */
1282
Guido van Rossum374a9221991-04-04 10:40:29 +00001283 case PRINT_ITEM:
1284 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001285 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001286 w = PySys_GetObject("stdout");
1287 if (w == NULL) {
1288 PyErr_SetString(PyExc_RuntimeError,
1289 "lost sys.stdout");
1290 err = -1;
1291 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001292 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001293 if (w != NULL && PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001294 err = PyFile_WriteString(" ", w);
1295 if (err == 0)
1296 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001297 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001298 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001299 char *s = PyString_AsString(v);
1300 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001301 if (len > 0 &&
1302 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001303 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001304 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001305 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001306 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001307 Py_XDECREF(stream);
1308 stream = NULL;
1309 if (err == 0)
1310 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001311 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001312
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001313 case PRINT_NEWLINE_TO:
1314 w = stream = POP();
1315 /* fall through to PRINT_NEWLINE */
1316
Guido van Rossum374a9221991-04-04 10:40:29 +00001317 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001318 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001319 w = PySys_GetObject("stdout");
1320 if (w == NULL)
1321 PyErr_SetString(PyExc_RuntimeError,
1322 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001323 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001324 if (w != NULL) {
1325 err = PyFile_WriteString("\n", w);
1326 if (err == 0)
1327 PyFile_SoftSpace(w, 0);
1328 }
1329 Py_XDECREF(stream);
1330 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001331 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001332
Thomas Wouters434d0822000-08-24 20:11:32 +00001333
1334#ifdef CASE_TOO_BIG
1335 default: switch (opcode) {
1336#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001337 case BREAK_LOOP:
1338 why = WHY_BREAK;
1339 break;
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00001340
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001341 case CONTINUE_LOOP:
1342 retval = PyInt_FromLong(oparg);
1343 why = WHY_CONTINUE;
1344 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001345
Guido van Rossumf10570b1995-07-07 22:53:21 +00001346 case RAISE_VARARGS:
1347 u = v = w = NULL;
1348 switch (oparg) {
1349 case 3:
1350 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001351 /* Fallthrough */
1352 case 2:
1353 v = POP(); /* value */
1354 /* Fallthrough */
1355 case 1:
1356 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001357 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001358 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001359 break;
1360 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001361 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001362 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001363 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001364 break;
1365 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001366 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001367
Guido van Rossum374a9221991-04-04 10:40:29 +00001368 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001369 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001370 PyErr_SetString(PyExc_SystemError,
1371 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001372 break;
1373 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001374 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001375 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001376 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001377
Guido van Rossum374a9221991-04-04 10:40:29 +00001378 case RETURN_VALUE:
1379 retval = POP();
1380 why = WHY_RETURN;
1381 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001382
Tim Peters5ca576e2001-06-18 22:08:13 +00001383 case YIELD_VALUE:
1384 retval = POP();
Tim Peters8c963692001-06-23 05:26:56 +00001385 f->f_stacktop = stack_pointer;
Tim Peters5ca576e2001-06-18 22:08:13 +00001386 f->f_lasti = INSTR_OFFSET();
1387 why = WHY_YIELD;
1388 break;
1389
1390
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001391 case EXEC_STMT:
1392 w = POP();
1393 v = POP();
1394 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001395 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001396 Py_DECREF(u);
1397 Py_DECREF(v);
1398 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001399 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001400
Guido van Rossum374a9221991-04-04 10:40:29 +00001401 case POP_BLOCK:
1402 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001403 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001404 while (STACK_LEVEL() > b->b_level) {
1405 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001406 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001407 }
1408 }
1409 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001410
Guido van Rossum374a9221991-04-04 10:40:29 +00001411 case END_FINALLY:
1412 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001413 if (PyInt_Check(v)) {
1414 why = (enum why_code) PyInt_AsLong(v);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001415 if (why == WHY_RETURN ||
Tim Peters5ca576e2001-06-18 22:08:13 +00001416 why == WHY_YIELD ||
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001417 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00001418 retval = POP();
1419 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001420 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001421 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001422 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001423 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001424 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001425 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001426 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001427 else if (v != Py_None) {
1428 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001429 "'finally' pops bad exception");
1430 why = WHY_EXCEPTION;
1431 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001432 Py_DECREF(v);
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 BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001436 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001437 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001438 w = POP();
1439 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001440 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001441 Py_DECREF(u);
1442 Py_DECREF(v);
1443 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001444 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001445
Guido van Rossum374a9221991-04-04 10:40:29 +00001446 case STORE_NAME:
1447 w = GETNAMEV(oparg);
1448 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001449 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001450 PyErr_Format(PyExc_SystemError,
1451 "no locals found when storing %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001452 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001453 break;
1454 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001455 err = PyDict_SetItem(x, w, v);
1456 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001457 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001458
Guido van Rossum374a9221991-04-04 10:40:29 +00001459 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001460 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001461 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001462 PyErr_Format(PyExc_SystemError,
1463 "no locals when deleting %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001464 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001465 break;
1466 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001467 if ((err = PyDict_DelItem(x, w)) != 0)
Guido van Rossumac7be682001-01-17 15:42:30 +00001468 format_exc_check_arg(PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001469 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001470 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001471
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001472 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001473 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001474 if (PyTuple_Check(v)) {
1475 if (PyTuple_Size(v) != oparg) {
1476 PyErr_SetString(PyExc_ValueError,
1477 "unpack tuple of wrong size");
1478 why = WHY_EXCEPTION;
1479 }
1480 else {
1481 for (; --oparg >= 0; ) {
1482 w = PyTuple_GET_ITEM(v, oparg);
1483 Py_INCREF(w);
1484 PUSH(w);
1485 }
1486 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001487 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001488 else if (PyList_Check(v)) {
1489 if (PyList_Size(v) != oparg) {
1490 PyErr_SetString(PyExc_ValueError,
1491 "unpack list of wrong size");
1492 why = WHY_EXCEPTION;
1493 }
1494 else {
1495 for (; --oparg >= 0; ) {
1496 w = PyList_GET_ITEM(v, oparg);
1497 Py_INCREF(w);
1498 PUSH(w);
1499 }
1500 }
1501 }
Tim Petersd6d010b2001-06-21 02:49:55 +00001502 else if (unpack_iterable(v, oparg,
1503 stack_pointer + oparg))
1504 stack_pointer += oparg;
1505 else
Barry Warsawe42b18f1997-08-25 22:13:04 +00001506 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00001507 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001508 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001509
Guido van Rossum374a9221991-04-04 10:40:29 +00001510 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001511 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001512 v = POP();
1513 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001514 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1515 Py_DECREF(v);
1516 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001517 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001518
Guido van Rossum374a9221991-04-04 10:40:29 +00001519 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001520 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001521 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001522 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1523 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001524 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001525 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001526
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001527 case STORE_GLOBAL:
1528 w = GETNAMEV(oparg);
1529 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001530 err = PyDict_SetItem(f->f_globals, w, v);
1531 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001532 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001533
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001534 case DELETE_GLOBAL:
1535 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001536 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001537 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001538 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001539 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001540
Guido van Rossum374a9221991-04-04 10:40:29 +00001541 case LOAD_CONST:
1542 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001543 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001544 PUSH(x);
1545 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001546
Guido van Rossum374a9221991-04-04 10:40:29 +00001547 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001548 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001549 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001550 PyErr_Format(PyExc_SystemError,
1551 "no locals when loading %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001552 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001553 break;
1554 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001555 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001556 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001557 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001558 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001559 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001560 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001561 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001562 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001563 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001564 break;
1565 }
1566 }
1567 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001568 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001569 PUSH(x);
1570 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001571
Guido van Rossum374a9221991-04-04 10:40:29 +00001572 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001573 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001574 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001575 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001576 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001577 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001578 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001579 PyExc_NameError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001580 GLOBAL_NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001581 break;
1582 }
1583 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001584 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001585 PUSH(x);
1586 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001587
Guido van Rossum9bfef441993-03-29 10:43:31 +00001588 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001589 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001590 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001591 format_exc_check_arg(
1592 PyExc_UnboundLocalError,
1593 UNBOUNDLOCAL_ERROR_MSG,
1594 PyTuple_GetItem(co->co_varnames, oparg)
1595 );
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001596 break;
1597 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001598 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001599 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001600 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001601 break;
1602
1603 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001604 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001605 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001606 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001607
1608 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001609 x = GETLOCAL(oparg);
1610 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001611 format_exc_check_arg(
1612 PyExc_UnboundLocalError,
1613 UNBOUNDLOCAL_ERROR_MSG,
1614 PyTuple_GetItem(co->co_varnames, oparg)
1615 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001616 break;
1617 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001618 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001619 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001620
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001621 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001622 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001623 Py_INCREF(x);
1624 PUSH(x);
1625 break;
1626
1627 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001628 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001629 w = PyCell_Get(x);
Jeremy Hylton2524d692001-02-05 17:23:16 +00001630 if (w == NULL) {
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001631 if (oparg < f->f_ncells) {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001632 v = PyTuple_GetItem(co->co_cellvars,
1633 oparg);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001634 format_exc_check_arg(
1635 PyExc_UnboundLocalError,
1636 UNBOUNDLOCAL_ERROR_MSG,
1637 v);
1638 } else {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001639 v = PyTuple_GetItem(
1640 co->co_freevars,
1641 oparg - f->f_ncells);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001642 format_exc_check_arg(
1643 PyExc_NameError,
1644 UNBOUNDFREE_ERROR_MSG,
1645 v);
1646 }
Jeremy Hylton2524d692001-02-05 17:23:16 +00001647 err = -1;
1648 break;
1649 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001650 PUSH(w);
1651 break;
1652
1653 case STORE_DEREF:
1654 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001655 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001656 PyCell_Set(x, w);
Jeremy Hylton30c9f392001-03-13 01:58:22 +00001657 Py_DECREF(w);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001658 continue;
1659
Guido van Rossum374a9221991-04-04 10:40:29 +00001660 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001661 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001662 if (x != NULL) {
1663 for (; --oparg >= 0;) {
1664 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001665 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001666 }
1667 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001668 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001669 }
1670 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001671
Guido van Rossum374a9221991-04-04 10:40:29 +00001672 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001673 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001674 if (x != NULL) {
1675 for (; --oparg >= 0;) {
1676 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001677 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001678 }
1679 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001680 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001681 }
1682 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001683
Guido van Rossum374a9221991-04-04 10:40:29 +00001684 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001685 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001686 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001687 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001688 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001689
Guido van Rossum374a9221991-04-04 10:40:29 +00001690 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001691 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001692 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001693 x = PyObject_GetAttr(v, w);
1694 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001695 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001696 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001697 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001698
Guido van Rossum374a9221991-04-04 10:40:29 +00001699 case COMPARE_OP:
1700 w = POP();
1701 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001702 if (PyInt_Check(v) && PyInt_Check(w)) {
1703 /* INLINE: cmp(int, int) */
1704 register long a, b;
1705 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001706 a = PyInt_AS_LONG(v);
1707 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001708 switch (oparg) {
1709 case LT: res = a < b; break;
1710 case LE: res = a <= b; break;
1711 case EQ: res = a == b; break;
1712 case NE: res = a != b; break;
1713 case GT: res = a > b; break;
1714 case GE: res = a >= b; break;
1715 case IS: res = v == w; break;
1716 case IS_NOT: res = v != w; break;
1717 default: goto slow_compare;
1718 }
1719 x = res ? Py_True : Py_False;
1720 Py_INCREF(x);
1721 }
1722 else {
1723 slow_compare:
1724 x = cmp_outcome(oparg, v, w);
1725 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001726 Py_DECREF(v);
1727 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001728 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001729 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001730 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001731
Guido van Rossum374a9221991-04-04 10:40:29 +00001732 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001733 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001734 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001735 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001736 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001737 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001738 break;
1739 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001740 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001741 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001742 w,
1743 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001744 f->f_locals == NULL ?
1745 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001746 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001747 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001748 if (w == NULL) {
1749 x = NULL;
1750 break;
1751 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001752 x = PyEval_CallObject(x, w);
1753 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001754 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001755 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001756 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001757
Thomas Wouters52152252000-08-17 22:55:00 +00001758 case IMPORT_STAR:
1759 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001760 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001761 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001762 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001763 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001764 break;
1765 }
Thomas Wouters52152252000-08-17 22:55:00 +00001766 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001767 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001768 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001769 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001770 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001771
Thomas Wouters52152252000-08-17 22:55:00 +00001772 case IMPORT_FROM:
1773 w = GETNAMEV(oparg);
1774 v = TOP();
1775 x = import_from(v, w);
1776 PUSH(x);
1777 if (x != NULL) continue;
1778 break;
1779
Guido van Rossum374a9221991-04-04 10:40:29 +00001780 case JUMP_FORWARD:
1781 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001782 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001783
Guido van Rossum374a9221991-04-04 10:40:29 +00001784 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001785 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001786 if (err > 0)
1787 err = 0;
1788 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001789 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001790 else
1791 break;
1792 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001793
Guido van Rossum374a9221991-04-04 10:40:29 +00001794 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001795 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001796 if (err > 0) {
1797 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001798 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001799 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001800 else if (err == 0)
1801 ;
1802 else
1803 break;
1804 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001805
Guido van Rossum374a9221991-04-04 10:40:29 +00001806 case JUMP_ABSOLUTE:
1807 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001808 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001809
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001810 case GET_ITER:
1811 /* before: [obj]; after [getiter(obj)] */
1812 v = POP();
1813 x = PyObject_GetIter(v);
1814 Py_DECREF(v);
1815 if (x != NULL) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00001816 PUSH(x);
1817 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001818 }
1819 break;
1820
1821 case FOR_ITER:
1822 /* before: [iter]; after: [iter, iter()] *or* [] */
1823 v = TOP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001824 x = PyIter_Next(v);
1825 if (x != NULL) {
1826 PUSH(x);
1827 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001828 }
Tim Petersf4848da2001-05-05 00:14:56 +00001829 if (!PyErr_Occurred()) {
1830 /* iterator ended normally */
1831 x = v = POP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001832 Py_DECREF(v);
1833 JUMPBY(oparg);
1834 continue;
1835 }
1836 break;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001837
Guido van Rossum374a9221991-04-04 10:40:29 +00001838 case FOR_LOOP:
1839 /* for v in s: ...
1840 On entry: stack contains s, i.
1841 On exit: stack contains s, i+1, s[i];
1842 but if loop exhausted:
1843 s, i are popped, and we jump */
1844 w = POP(); /* Loop index */
1845 v = POP(); /* Sequence object */
1846 u = loop_subscript(v, w);
1847 if (u != NULL) {
1848 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001849 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001850 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001851 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001852 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001853 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001854 }
1855 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001856 Py_DECREF(v);
1857 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001858 /* A NULL can mean "s exhausted"
1859 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001860 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001861 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001862 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001863 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001864 continue;
1865 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001866 }
1867 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001868
Guido van Rossum374a9221991-04-04 10:40:29 +00001869 case SETUP_LOOP:
1870 case SETUP_EXCEPT:
1871 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001872 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001873 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001874 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001875
Guido van Rossum374a9221991-04-04 10:40:29 +00001876 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001877#ifdef LLTRACE
1878 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001879 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001880#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001881 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001882 if (f->f_trace == NULL)
1883 continue;
1884 /* Trace each line of code reached */
1885 f->f_lasti = INSTR_OFFSET();
1886 err = call_trace(&f->f_trace, &f->f_trace,
Fred Draked0838392001-06-16 21:02:31 +00001887 f, str_line, Py_None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001888 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001889
1890 case CALL_FUNCTION:
Jeremy Hylton52820442001-01-03 23:52:36 +00001891 {
1892 int na = oparg & 0xff;
1893 int nk = (oparg>>8) & 0xff;
1894 int n = na + 2 * nk;
1895 PyObject **pfunc = stack_pointer - n - 1;
1896 PyObject *func = *pfunc;
1897 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1898
1899 /* Always dispatch PyCFunction first, because
1900 these are presumed to be the most frequent
1901 callable object.
1902 */
1903 if (PyCFunction_Check(func)) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001904 int flags = PyCFunction_GET_FLAGS(func);
Jeremy Hylton4c9dace2001-05-29 16:23:26 +00001905 if (flags > 1 || nk != 0)
1906 x = do_call(func, &stack_pointer,
1907 na, nk);
1908 else if (flags == METH_VARARGS) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001909 PyObject *callargs;
1910 callargs = load_args(&stack_pointer, na);
1911 x = call_cfunction(func, callargs, NULL);
1912 Py_XDECREF(callargs);
Jeremy Hylton4c9dace2001-05-29 16:23:26 +00001913 } else if (flags == 0)
Jeremy Hylton52820442001-01-03 23:52:36 +00001914 x = fast_cfunction(func,
Guido van Rossumac7be682001-01-17 15:42:30 +00001915 &stack_pointer, na);
Jeremy Hylton52820442001-01-03 23:52:36 +00001916 } else {
Guido van Rossumac7be682001-01-17 15:42:30 +00001917 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001918 && PyMethod_GET_SELF(func) != NULL) {
1919 /* optimize access to bound methods */
1920 PyObject *self = PyMethod_GET_SELF(func);
1921 Py_INCREF(self);
1922 func = PyMethod_GET_FUNCTION(func);
1923 Py_INCREF(func);
1924 Py_DECREF(*pfunc);
1925 *pfunc = self;
1926 na++;
1927 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00001928 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00001929 Py_INCREF(func);
1930 if (PyFunction_Check(func)) {
1931 x = fast_function(func, &stack_pointer,
Guido van Rossumac7be682001-01-17 15:42:30 +00001932 n, na, nk);
Jeremy Hylton52820442001-01-03 23:52:36 +00001933 } else {
1934 x = do_call(func, &stack_pointer,
1935 na, nk);
1936 }
1937 Py_DECREF(func);
1938 }
1939
1940 while (stack_pointer > pfunc) {
1941 w = POP();
1942 Py_DECREF(w);
1943 }
1944 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00001945 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00001946 continue;
1947 break;
1948 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001949
Jeremy Hylton76901512000-03-28 23:49:17 +00001950 case CALL_FUNCTION_VAR:
1951 case CALL_FUNCTION_KW:
1952 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001953 {
Jeremy Hylton76901512000-03-28 23:49:17 +00001954 int na = oparg & 0xff;
1955 int nk = (oparg>>8) & 0xff;
1956 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00001957 int n = na + 2 * nk;
1958 PyObject **pfunc, *func;
1959 if (flags & CALL_FLAG_VAR)
1960 n++;
1961 if (flags & CALL_FLAG_KW)
1962 n++;
1963 pfunc = stack_pointer - n - 1;
1964 func = *pfunc;
Jeremy Hylton76901512000-03-28 23:49:17 +00001965 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Jeremy Hylton52820442001-01-03 23:52:36 +00001966
Guido van Rossumac7be682001-01-17 15:42:30 +00001967 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001968 && PyMethod_GET_SELF(func) != NULL) {
1969 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00001970 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00001971 func = PyMethod_GET_FUNCTION(func);
1972 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00001973 Py_DECREF(*pfunc);
1974 *pfunc = self;
1975 na++;
1976 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00001977 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00001978 Py_INCREF(func);
1979 x = ext_do_call(func, &stack_pointer, flags, na, nk);
Jeremy Hylton76901512000-03-28 23:49:17 +00001980 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00001981
Jeremy Hylton76901512000-03-28 23:49:17 +00001982 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00001983 w = POP();
1984 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00001985 }
1986 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00001987 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00001988 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00001989 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001990 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001991
Guido van Rossum681d79a1995-07-18 14:51:37 +00001992 case MAKE_FUNCTION:
1993 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00001994 x = PyFunction_New(v, f->f_globals);
1995 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001996 /* XXX Maybe this should be a separate opcode? */
1997 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001998 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001999 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002000 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002001 x = NULL;
2002 break;
2003 }
2004 while (--oparg >= 0) {
2005 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002006 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002007 }
2008 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00002009 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002010 }
2011 PUSH(x);
2012 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002013
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002014 case MAKE_CLOSURE:
2015 {
2016 int nfree;
2017 v = POP(); /* code object */
2018 x = PyFunction_New(v, f->f_globals);
2019 nfree = PyTuple_GET_SIZE(((PyCodeObject *)v)->co_freevars);
2020 Py_DECREF(v);
2021 /* XXX Maybe this should be a separate opcode? */
2022 if (x != NULL && nfree > 0) {
2023 v = PyTuple_New(nfree);
2024 if (v == NULL) {
2025 Py_DECREF(x);
2026 x = NULL;
2027 break;
2028 }
2029 while (--nfree >= 0) {
2030 w = POP();
2031 PyTuple_SET_ITEM(v, nfree, w);
2032 }
2033 err = PyFunction_SetClosure(x, v);
2034 Py_DECREF(v);
2035 }
2036 if (x != NULL && oparg > 0) {
2037 v = PyTuple_New(oparg);
2038 if (v == NULL) {
2039 Py_DECREF(x);
2040 x = NULL;
2041 break;
2042 }
2043 while (--oparg >= 0) {
2044 w = POP();
2045 PyTuple_SET_ITEM(v, oparg, w);
2046 }
2047 err = PyFunction_SetDefaults(x, v);
2048 Py_DECREF(v);
2049 }
2050 PUSH(x);
2051 break;
2052 }
2053
Guido van Rossum8861b741996-07-30 16:49:37 +00002054 case BUILD_SLICE:
2055 if (oparg == 3)
2056 w = POP();
2057 else
2058 w = NULL;
2059 v = POP();
2060 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002061 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002062 Py_DECREF(u);
2063 Py_DECREF(v);
2064 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00002065 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002066 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002067 break;
2068
Fred Drakeef8ace32000-08-24 00:32:09 +00002069 case EXTENDED_ARG:
2070 opcode = NEXTOP();
2071 oparg = oparg<<16 | NEXTARG();
2072 goto dispatch_opcode;
Guido van Rossum8861b741996-07-30 16:49:37 +00002073
Guido van Rossum374a9221991-04-04 10:40:29 +00002074 default:
2075 fprintf(stderr,
2076 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00002077 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002078 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002079 why = WHY_EXCEPTION;
2080 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002081
2082#ifdef CASE_TOO_BIG
2083 }
2084#endif
2085
Guido van Rossum374a9221991-04-04 10:40:29 +00002086 } /* switch */
2087
2088 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002089
Guido van Rossum374a9221991-04-04 10:40:29 +00002090 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002091
Guido van Rossum374a9221991-04-04 10:40:29 +00002092 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002093 if (err == 0 && x != NULL) {
2094#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002095 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002096 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002097 fprintf(stderr,
2098 "XXX undetected error\n");
2099 else
2100#endif
2101 continue; /* Normal, fast path */
2102 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002103 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002104 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002105 err = 0;
2106 }
2107
Guido van Rossum374a9221991-04-04 10:40:29 +00002108 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002109
Guido van Rossum374a9221991-04-04 10:40:29 +00002110 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002111 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002112 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002113 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002114 why = WHY_EXCEPTION;
2115 }
2116 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002117#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002118 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002119 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002120 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002121 fprintf(stderr,
2122 "XXX undetected error (why=%d)\n",
2123 why);
2124 why = WHY_EXCEPTION;
2125 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002126 }
2127#endif
2128
2129 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002130
Guido van Rossum374a9221991-04-04 10:40:29 +00002131 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002132 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00002133 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00002134 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00002135 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002136
Guido van Rossume59214e1994-08-30 08:01:59 +00002137 if (f->f_trace)
2138 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002139 if (tstate->sys_profilefunc)
2140 call_exc_trace(&tstate->sys_profilefunc,
2141 (PyObject**)0, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002142 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002143
Guido van Rossum374a9221991-04-04 10:40:29 +00002144 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002145
Guido van Rossum374a9221991-04-04 10:40:29 +00002146 if (why == WHY_RERAISE)
2147 why = WHY_EXCEPTION;
2148
2149 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002150
Tim Peters5ca576e2001-06-18 22:08:13 +00002151 while (why != WHY_NOT && why != WHY_YIELD && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002152 PyTryBlock *b = PyFrame_BlockPop(f);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002153
2154 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2155 /* For a continue inside a try block,
2156 don't pop the block for the loop. */
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00002157 PyFrame_BlockSetup(f, b->b_type, b->b_level,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002158 b->b_handler);
2159 why = WHY_NOT;
2160 JUMPTO(PyInt_AS_LONG(retval));
2161 Py_DECREF(retval);
2162 break;
2163 }
2164
Guido van Rossum374a9221991-04-04 10:40:29 +00002165 while (STACK_LEVEL() > b->b_level) {
2166 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002167 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002168 }
2169 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2170 why = WHY_NOT;
2171 JUMPTO(b->b_handler);
2172 break;
2173 }
2174 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002175 (b->b_type == SETUP_EXCEPT &&
2176 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002177 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002178 PyObject *exc, *val, *tb;
2179 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002180 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002181 val = Py_None;
2182 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002183 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002184 /* Make the raw exception data
2185 available to the handler,
2186 so a program can emulate the
2187 Python main loop. Don't do
2188 this for 'finally'. */
2189 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002190 PyErr_NormalizeException(
2191 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002192 set_exc_info(tstate,
2193 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002194 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002195 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002196 PUSH(val);
2197 PUSH(exc);
2198 }
2199 else {
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002200 if (why == WHY_RETURN ||
2201 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00002202 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002203 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002204 PUSH(v);
2205 }
2206 why = WHY_NOT;
2207 JUMPTO(b->b_handler);
2208 break;
2209 }
2210 } /* unwind stack */
2211
2212 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002213
Guido van Rossum374a9221991-04-04 10:40:29 +00002214 if (why != WHY_NOT)
2215 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002216
Guido van Rossum374a9221991-04-04 10:40:29 +00002217 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002218
Tim Peters5ca576e2001-06-18 22:08:13 +00002219 if (why != WHY_RETURN && why != WHY_YIELD)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002220 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002221
Guido van Rossume59214e1994-08-30 08:01:59 +00002222 if (f->f_trace) {
Tim Peters5ca576e2001-06-18 22:08:13 +00002223 if (why == WHY_RETURN || why == WHY_YIELD) {
Guido van Rossume59214e1994-08-30 08:01:59 +00002224 if (call_trace(&f->f_trace, &f->f_trace, f,
Fred Draked0838392001-06-16 21:02:31 +00002225 str_return, retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002226 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002227 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002228 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002229 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002230 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002231 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002232
Tim Peters5ca576e2001-06-18 22:08:13 +00002233 if (tstate->sys_profilefunc &&
2234 (why == WHY_RETURN || why == WHY_YIELD)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002235 if (call_trace(&tstate->sys_profilefunc, (PyObject**)0,
Fred Draked0838392001-06-16 21:02:31 +00002236 f, str_return, retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002237 Py_XDECREF(retval);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002238 retval = NULL;
2239 why = WHY_EXCEPTION;
2240 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002241 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002242
Guido van Rossuma027efa1997-05-05 20:56:21 +00002243 reset_exc_info(tstate);
2244
Tim Peters5ca576e2001-06-18 22:08:13 +00002245 /* pop frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002246 --tstate->recursion_depth;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002247 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00002248
Guido van Rossum96a42c81992-01-12 02:29:51 +00002249 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002250}
2251
Tim Peters5ca576e2001-06-18 22:08:13 +00002252static PyObject *
2253eval_code2(PyCodeObject *co, PyObject *globals, PyObject *locals,
2254 PyObject **args, int argcount, PyObject **kws, int kwcount,
2255 PyObject **defs, int defcount, PyObject *closure)
2256{
2257 register PyFrameObject *f;
2258 register PyObject *retval = NULL;
2259 register PyObject **fastlocals, **freevars;
2260 PyThreadState *tstate = PyThreadState_GET();
2261 PyObject *x, *u;
2262
2263 if (globals == NULL) {
2264 PyErr_SetString(PyExc_SystemError, "eval_code2: NULL globals");
2265 return NULL;
2266 }
2267
2268 f = PyFrame_New(tstate, /*back*/
2269 co, /*code*/
2270 globals, locals);
2271 if (f == NULL)
2272 return NULL;
2273
2274 fastlocals = f->f_localsplus;
2275 freevars = f->f_localsplus + f->f_nlocals;
2276
2277 if (co->co_argcount > 0 ||
2278 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
2279 int i;
2280 int n = argcount;
2281 PyObject *kwdict = NULL;
2282 if (co->co_flags & CO_VARKEYWORDS) {
2283 kwdict = PyDict_New();
2284 if (kwdict == NULL)
2285 goto fail;
2286 i = co->co_argcount;
2287 if (co->co_flags & CO_VARARGS)
2288 i++;
2289 SETLOCAL(i, kwdict);
2290 }
2291 if (argcount > co->co_argcount) {
2292 if (!(co->co_flags & CO_VARARGS)) {
2293 PyErr_Format(PyExc_TypeError,
2294 "%.200s() takes %s %d "
2295 "%sargument%s (%d given)",
2296 PyString_AsString(co->co_name),
2297 defcount ? "at most" : "exactly",
2298 co->co_argcount,
2299 kwcount ? "non-keyword " : "",
2300 co->co_argcount == 1 ? "" : "s",
2301 argcount);
2302 goto fail;
2303 }
2304 n = co->co_argcount;
2305 }
2306 for (i = 0; i < n; i++) {
2307 x = args[i];
2308 Py_INCREF(x);
2309 SETLOCAL(i, x);
2310 }
2311 if (co->co_flags & CO_VARARGS) {
2312 u = PyTuple_New(argcount - n);
2313 if (u == NULL)
2314 goto fail;
2315 SETLOCAL(co->co_argcount, u);
2316 for (i = n; i < argcount; i++) {
2317 x = args[i];
2318 Py_INCREF(x);
2319 PyTuple_SET_ITEM(u, i-n, x);
2320 }
2321 }
2322 for (i = 0; i < kwcount; i++) {
2323 PyObject *keyword = kws[2*i];
2324 PyObject *value = kws[2*i + 1];
2325 int j;
2326 if (keyword == NULL || !PyString_Check(keyword)) {
2327 PyErr_Format(PyExc_TypeError,
2328 "%.200s() keywords must be strings",
2329 PyString_AsString(co->co_name));
2330 goto fail;
2331 }
2332 /* XXX slow -- speed up using dictionary? */
2333 for (j = 0; j < co->co_argcount; j++) {
2334 PyObject *nm = PyTuple_GET_ITEM(
2335 co->co_varnames, j);
2336 int cmp = PyObject_RichCompareBool(
2337 keyword, nm, Py_EQ);
2338 if (cmp > 0)
2339 break;
2340 else if (cmp < 0)
2341 goto fail;
2342 }
2343 /* Check errors from Compare */
2344 if (PyErr_Occurred())
2345 goto fail;
2346 if (j >= co->co_argcount) {
2347 if (kwdict == NULL) {
2348 PyErr_Format(PyExc_TypeError,
2349 "%.200s() got an unexpected "
2350 "keyword argument '%.400s'",
2351 PyString_AsString(co->co_name),
2352 PyString_AsString(keyword));
2353 goto fail;
2354 }
2355 PyDict_SetItem(kwdict, keyword, value);
2356 }
2357 else {
2358 if (GETLOCAL(j) != NULL) {
2359 PyErr_Format(PyExc_TypeError,
2360 "%.200s() got multiple "
2361 "values for keyword "
2362 "argument '%.400s'",
2363 PyString_AsString(co->co_name),
2364 PyString_AsString(keyword));
2365 goto fail;
2366 }
2367 Py_INCREF(value);
2368 SETLOCAL(j, value);
2369 }
2370 }
2371 if (argcount < co->co_argcount) {
2372 int m = co->co_argcount - defcount;
2373 for (i = argcount; i < m; i++) {
2374 if (GETLOCAL(i) == NULL) {
2375 PyErr_Format(PyExc_TypeError,
2376 "%.200s() takes %s %d "
2377 "%sargument%s (%d given)",
2378 PyString_AsString(co->co_name),
2379 ((co->co_flags & CO_VARARGS) ||
2380 defcount) ? "at least"
2381 : "exactly",
2382 m, kwcount ? "non-keyword " : "",
2383 m == 1 ? "" : "s", i);
2384 goto fail;
2385 }
2386 }
2387 if (n > m)
2388 i = n - m;
2389 else
2390 i = 0;
2391 for (; i < defcount; i++) {
2392 if (GETLOCAL(m+i) == NULL) {
2393 PyObject *def = defs[i];
2394 Py_INCREF(def);
2395 SETLOCAL(m+i, def);
2396 }
2397 }
2398 }
2399 }
2400 else {
2401 if (argcount > 0 || kwcount > 0) {
2402 PyErr_Format(PyExc_TypeError,
2403 "%.200s() takes no arguments (%d given)",
2404 PyString_AsString(co->co_name),
2405 argcount + kwcount);
2406 goto fail;
2407 }
2408 }
2409 /* Allocate and initialize storage for cell vars, and copy free
2410 vars into frame. This isn't too efficient right now. */
2411 if (f->f_ncells) {
2412 int i = 0, j = 0, nargs, found;
2413 char *cellname, *argname;
2414 PyObject *c;
2415
2416 nargs = co->co_argcount;
2417 if (co->co_flags & CO_VARARGS)
2418 nargs++;
2419 if (co->co_flags & CO_VARKEYWORDS)
2420 nargs++;
2421
2422 /* Check for cells that shadow args */
2423 for (i = 0; i < f->f_ncells && j < nargs; ++i) {
2424 cellname = PyString_AS_STRING(
2425 PyTuple_GET_ITEM(co->co_cellvars, i));
2426 found = 0;
2427 while (j < nargs) {
2428 argname = PyString_AS_STRING(
2429 PyTuple_GET_ITEM(co->co_varnames, j));
2430 if (strcmp(cellname, argname) == 0) {
2431 c = PyCell_New(GETLOCAL(j));
2432 if (c == NULL)
2433 goto fail;
2434 GETLOCAL(f->f_nlocals + i) = c;
2435 found = 1;
2436 break;
2437 }
2438 j++;
2439 }
2440 if (found == 0) {
2441 c = PyCell_New(NULL);
2442 if (c == NULL)
2443 goto fail;
2444 SETLOCAL(f->f_nlocals + i, c);
2445 }
2446 }
2447 /* Initialize any that are left */
2448 while (i < f->f_ncells) {
2449 c = PyCell_New(NULL);
2450 if (c == NULL)
2451 goto fail;
2452 SETLOCAL(f->f_nlocals + i, c);
2453 i++;
2454 }
2455 }
2456 if (f->f_nfreevars) {
2457 int i;
2458 for (i = 0; i < f->f_nfreevars; ++i) {
2459 PyObject *o = PyTuple_GET_ITEM(closure, i);
2460 Py_INCREF(o);
2461 freevars[f->f_ncells + i] = o;
2462 }
2463 }
2464
2465 if (tstate->sys_tracefunc != NULL) {
2466 /* tstate->sys_tracefunc, if defined, is a function that
2467 will be called on *every* entry to a code block.
2468 Its return value, if not None, is a function that
2469 will be called at the start of each executed line
2470 of code. (Actually, the function must return
2471 itself in order to continue tracing.)
2472 The trace functions are called with three arguments:
2473 a pointer to the current frame, a string indicating
2474 why the function is called, and an argument which
2475 depends on the situation. The global trace function
2476 (sys.trace) is also called whenever an exception
2477 is detected. */
2478 if (call_trace(&tstate->sys_tracefunc,
2479 &f->f_trace, f, str_call,
2480 Py_None/*XXX how to compute arguments now?*/)) {
2481 /* Trace function raised an error */
2482 goto fail;
2483 }
2484 }
2485
2486 if (tstate->sys_profilefunc != NULL) {
2487 /* Similar for sys_profilefunc, except it needn't return
2488 itself and isn't called for "line" events */
2489 if (call_trace(&tstate->sys_profilefunc,
2490 (PyObject**)0, f, str_call,
2491 Py_None/*XXX*/)) {
2492 goto fail;
2493 }
2494 }
2495
2496 if (co->co_flags & CO_GENERATOR) {
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002497 /* Don't need to keep the reference to f_back, it will be set
2498 * when the generator is resumed. */
2499 Py_DECREF(f->f_back);
2500 f->f_back = NULL;
2501
2502 /* Create a new generator that owns the ready to run frame
2503 * and return that as the value. */
Tim Peters5ca576e2001-06-18 22:08:13 +00002504 return gen_new(f);
2505 }
2506
2507 retval = eval_frame(f);
2508
2509 fail: /* Jump here from prelude on failure */
2510
2511 Py_DECREF(f);
2512 return retval;
2513}
2514
2515
Guido van Rossuma027efa1997-05-05 20:56:21 +00002516static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002517set_exc_info(PyThreadState *tstate,
2518 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002519{
2520 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002521 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002522
Guido van Rossuma027efa1997-05-05 20:56:21 +00002523 frame = tstate->frame;
2524 if (frame->f_exc_type == NULL) {
2525 /* This frame didn't catch an exception before */
2526 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002527 if (tstate->exc_type == NULL) {
2528 Py_INCREF(Py_None);
2529 tstate->exc_type = Py_None;
2530 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002531 tmp_type = frame->f_exc_type;
2532 tmp_value = frame->f_exc_value;
2533 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002534 Py_XINCREF(tstate->exc_type);
2535 Py_XINCREF(tstate->exc_value);
2536 Py_XINCREF(tstate->exc_traceback);
2537 frame->f_exc_type = tstate->exc_type;
2538 frame->f_exc_value = tstate->exc_value;
2539 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002540 Py_XDECREF(tmp_type);
2541 Py_XDECREF(tmp_value);
2542 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002543 }
2544 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002545 tmp_type = tstate->exc_type;
2546 tmp_value = tstate->exc_value;
2547 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002548 Py_XINCREF(type);
2549 Py_XINCREF(value);
2550 Py_XINCREF(tb);
2551 tstate->exc_type = type;
2552 tstate->exc_value = value;
2553 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002554 Py_XDECREF(tmp_type);
2555 Py_XDECREF(tmp_value);
2556 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002557 /* For b/w compatibility */
2558 PySys_SetObject("exc_type", type);
2559 PySys_SetObject("exc_value", value);
2560 PySys_SetObject("exc_traceback", tb);
2561}
2562
2563static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002564reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002565{
2566 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002567 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002568 frame = tstate->frame;
2569 if (frame->f_exc_type != NULL) {
2570 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002571 tmp_type = tstate->exc_type;
2572 tmp_value = tstate->exc_value;
2573 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002574 Py_XINCREF(frame->f_exc_type);
2575 Py_XINCREF(frame->f_exc_value);
2576 Py_XINCREF(frame->f_exc_traceback);
2577 tstate->exc_type = frame->f_exc_type;
2578 tstate->exc_value = frame->f_exc_value;
2579 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002580 Py_XDECREF(tmp_type);
2581 Py_XDECREF(tmp_value);
2582 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002583 /* For b/w compatibility */
2584 PySys_SetObject("exc_type", frame->f_exc_type);
2585 PySys_SetObject("exc_value", frame->f_exc_value);
2586 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2587 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002588 tmp_type = frame->f_exc_type;
2589 tmp_value = frame->f_exc_value;
2590 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002591 frame->f_exc_type = NULL;
2592 frame->f_exc_value = NULL;
2593 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002594 Py_XDECREF(tmp_type);
2595 Py_XDECREF(tmp_value);
2596 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002597}
2598
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002599/* Logic for the raise statement (too complicated for inlining).
2600 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002601static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002602do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002603{
Guido van Rossumd295f121998-04-09 21:39:57 +00002604 if (type == NULL) {
2605 /* Reraise */
2606 PyThreadState *tstate = PyThreadState_Get();
2607 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2608 value = tstate->exc_value;
2609 tb = tstate->exc_traceback;
2610 Py_XINCREF(type);
2611 Py_XINCREF(value);
2612 Py_XINCREF(tb);
2613 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002614
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002615 /* We support the following forms of raise:
2616 raise <class>, <classinstance>
2617 raise <class>, <argument tuple>
2618 raise <class>, None
2619 raise <class>, <argument>
2620 raise <classinstance>, None
2621 raise <string>, <object>
2622 raise <string>, None
2623
2624 An omitted second argument is the same as None.
2625
2626 In addition, raise <tuple>, <anything> is the same as
2627 raising the tuple's first item (and it better have one!);
2628 this rule is applied recursively.
2629
2630 Finally, an optional third argument can be supplied, which
2631 gives the traceback to be substituted (useful when
2632 re-raising an exception after examining it). */
2633
2634 /* First, check the traceback argument, replacing None with
2635 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002636 if (tb == Py_None) {
2637 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002638 tb = NULL;
2639 }
2640 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002641 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002642 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002643 goto raise_error;
2644 }
2645
2646 /* Next, replace a missing value with None */
2647 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002648 value = Py_None;
2649 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002650 }
2651
2652 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002653 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2654 PyObject *tmp = type;
2655 type = PyTuple_GET_ITEM(type, 0);
2656 Py_INCREF(type);
2657 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002658 }
2659
Barry Warsaw4249f541997-08-22 21:26:19 +00002660 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002661 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002662
2663 else if (PyClass_Check(type))
2664 PyErr_NormalizeException(&type, &value, &tb);
2665
Guido van Rossumb209a111997-04-29 18:18:01 +00002666 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002667 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002668 if (value != Py_None) {
2669 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002670 "instance exception may not have a separate value");
2671 goto raise_error;
2672 }
2673 else {
2674 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002675 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002676 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002677 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2678 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002679 }
2680 }
2681 else {
2682 /* Not something you can raise. You get an exception
2683 anyway, just not what you specified :-) */
Jeremy Hylton960d9482001-04-27 02:25:33 +00002684 PyErr_Format(PyExc_TypeError,
2685 "exceptions must be strings, classes, or "
2686 "instances, not %s", type->ob_type->tp_name);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002687 goto raise_error;
2688 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002689 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002690 if (tb == NULL)
2691 return WHY_EXCEPTION;
2692 else
2693 return WHY_RERAISE;
2694 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002695 Py_XDECREF(value);
2696 Py_XDECREF(type);
2697 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002698 return WHY_EXCEPTION;
2699}
2700
Tim Petersd6d010b2001-06-21 02:49:55 +00002701/* Iterate v argcnt times and store the results on the stack (via decreasing
2702 sp). Return 1 for success, 0 if error. */
2703
Barry Warsawe42b18f1997-08-25 22:13:04 +00002704static int
Tim Petersd6d010b2001-06-21 02:49:55 +00002705unpack_iterable(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002706{
Tim Petersd6d010b2001-06-21 02:49:55 +00002707 int i = 0;
2708 PyObject *it; /* iter(v) */
Barry Warsawe42b18f1997-08-25 22:13:04 +00002709 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00002710
Tim Petersd6d010b2001-06-21 02:49:55 +00002711 assert(v != NULL);
2712
2713 it = PyObject_GetIter(v);
2714 if (it == NULL)
2715 goto Error;
2716
2717 for (; i < argcnt; i++) {
2718 w = PyIter_Next(it);
2719 if (w == NULL) {
2720 /* Iterator done, via error or exhaustion. */
2721 if (!PyErr_Occurred()) {
2722 PyErr_Format(PyExc_ValueError,
2723 "need more than %d value%s to unpack",
2724 i, i == 1 ? "" : "s");
2725 }
2726 goto Error;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002727 }
2728 *--sp = w;
2729 }
Tim Petersd6d010b2001-06-21 02:49:55 +00002730
2731 /* We better have exhausted the iterator now. */
2732 w = PyIter_Next(it);
2733 if (w == NULL) {
2734 if (PyErr_Occurred())
2735 goto Error;
2736 Py_DECREF(it);
2737 return 1;
Barry Warsawe42b18f1997-08-25 22:13:04 +00002738 }
Tim Petersd6d010b2001-06-21 02:49:55 +00002739 PyErr_SetString(PyExc_ValueError, "too many values to unpack");
Barry Warsawe42b18f1997-08-25 22:13:04 +00002740 /* fall through */
Tim Petersd6d010b2001-06-21 02:49:55 +00002741Error:
Barry Warsaw91010551997-08-25 22:30:51 +00002742 for (; i > 0; i--, sp++)
2743 Py_DECREF(*sp);
Tim Petersd6d010b2001-06-21 02:49:55 +00002744 Py_XDECREF(it);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002745 return 0;
2746}
2747
2748
Guido van Rossum96a42c81992-01-12 02:29:51 +00002749#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002750static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002751prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002752{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002753 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002754 if (PyObject_Print(v, stdout, 0) != 0)
2755 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002756 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002757 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002758}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002759#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002760
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002761static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002762call_exc_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002763{
Guido van Rossumb209a111997-04-29 18:18:01 +00002764 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002765 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002766 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002767 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002768 value = Py_None;
2769 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002770 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002771 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002772 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002773 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002774 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002775 }
Fred Draked0838392001-06-16 21:02:31 +00002776 err = call_trace(p_trace, p_newtrace, f, str_exception, arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002777 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002778 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002779 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002780 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002781 Py_XDECREF(type);
2782 Py_XDECREF(value);
2783 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002784 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002785}
2786
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002787/* PyObject **p_trace: in/out; may not be NULL;
2788 may not point to NULL variable initially
Fred Drake904aa7b2001-06-08 04:33:09 +00002789 PyObject **p_newtrace: in/out; may be NULL;
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002790 may point to NULL variable;
Fred Drake904aa7b2001-06-08 04:33:09 +00002791 may be same variable as p_newtrace
Fred Draked0838392001-06-16 21:02:31 +00002792 PyObject *msg: in; must not be NULL
Fred Drake904aa7b2001-06-08 04:33:09 +00002793*/
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002794
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002795static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002796call_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f,
Fred Draked0838392001-06-16 21:02:31 +00002797 PyObject *msg, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002798{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002799 PyThreadState *tstate = f->f_tstate;
Fred Draked0838392001-06-16 21:02:31 +00002800 PyObject *args;
Guido van Rossumb209a111997-04-29 18:18:01 +00002801 PyObject *res = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002802
Guido van Rossuma027efa1997-05-05 20:56:21 +00002803 if (tstate->tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002804 /* Don't do recursive traces */
2805 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002806 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002807 *p_newtrace = NULL;
2808 }
2809 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002810 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002811
Guido van Rossumb209a111997-04-29 18:18:01 +00002812 args = PyTuple_New(3);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002813 if (args == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002814 goto cleanup;
Fred Draked0838392001-06-16 21:02:31 +00002815 Py_INCREF(msg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002816 Py_INCREF(f);
2817 PyTuple_SET_ITEM(args, 0, (PyObject *)f);
Fred Draked0838392001-06-16 21:02:31 +00002818 PyTuple_SET_ITEM(args, 1, msg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002819 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002820 arg = Py_None;
2821 Py_INCREF(arg);
2822 PyTuple_SET_ITEM(args, 2, arg);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002823 tstate->tracing++;
Guido van Rossumb209a111997-04-29 18:18:01 +00002824 PyFrame_FastToLocals(f);
2825 res = PyEval_CallObject(*p_trace, args); /* May clear *p_trace! */
2826 PyFrame_LocalsToFast(f, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002827 tstate->tracing--;
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002828 cleanup:
Guido van Rossumb209a111997-04-29 18:18:01 +00002829 Py_XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002830 if (res == NULL) {
2831 /* The trace proc raised an exception */
Guido van Rossumb209a111997-04-29 18:18:01 +00002832 PyTraceBack_Here(f);
2833 Py_XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002834 *p_trace = NULL;
2835 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002836 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002837 *p_newtrace = NULL;
2838 }
Barry Warsawf6202631999-09-08 16:26:33 +00002839 /* to be extra double plus sure we don't get recursive
2840 * calls inf either tracefunc or profilefunc gets an
2841 * exception, zap the global variables.
2842 */
2843 Py_XDECREF(tstate->sys_tracefunc);
2844 tstate->sys_tracefunc = NULL;
2845 Py_XDECREF(tstate->sys_profilefunc);
2846 tstate->sys_profilefunc = NULL;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002847 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002848 }
2849 else {
2850 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002851 Py_XDECREF(*p_newtrace);
2852 if (res == Py_None)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002853 *p_newtrace = NULL;
2854 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002855 Py_INCREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002856 *p_newtrace = res;
2857 }
2858 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002859 Py_DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002860 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002861 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002862}
2863
Fred Draked0838392001-06-16 21:02:31 +00002864/* Initialize the strings that get passed to the profile and trace functions;
2865 * this avoids doing this while we're actually profiling/tracing.
2866 */
2867int
2868_PyTrace_Init(void)
2869{
2870 if (str_call == NULL) {
2871 str_call = PyString_InternFromString("call");
2872 if (str_call == NULL)
2873 return -1;
2874 }
2875 if (str_exception == NULL) {
2876 str_exception = PyString_InternFromString("exception");
2877 if (str_exception == NULL)
2878 return -1;
2879 }
2880 if (str_line == NULL) {
2881 str_line = PyString_InternFromString("line");
2882 if (str_line == NULL)
2883 return -1;
2884 }
2885 if (str_return == NULL) {
2886 str_return = PyString_InternFromString("return");
2887 if (str_return == NULL)
2888 return -1;
2889 }
2890 return 0;
2891}
2892
Guido van Rossumb209a111997-04-29 18:18:01 +00002893PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002894PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002895{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002896 PyThreadState *tstate = PyThreadState_Get();
2897 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002898 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002899 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002900 else
2901 return current_frame->f_builtins;
2902}
2903
Guido van Rossumb209a111997-04-29 18:18:01 +00002904PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002905PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002906{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002907 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002908 if (current_frame == NULL)
2909 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002910 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002911 return current_frame->f_locals;
2912}
2913
Guido van Rossumb209a111997-04-29 18:18:01 +00002914PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002915PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002916{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002917 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002918 if (current_frame == NULL)
2919 return NULL;
2920 else
2921 return current_frame->f_globals;
2922}
2923
Guido van Rossumb209a111997-04-29 18:18:01 +00002924PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002925PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002926{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002927 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002928 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002929}
2930
Guido van Rossum6135a871995-01-09 17:53:26 +00002931int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002932PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002933{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002934 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002935 return current_frame == NULL ? 0 : current_frame->f_restricted;
2936}
2937
Guido van Rossumbe270261997-05-22 22:26:18 +00002938int
Jeremy Hylton061d1062001-03-22 02:32:48 +00002939PyEval_GetNestedScopes(void)
2940{
2941 PyFrameObject *current_frame = PyThreadState_Get()->frame;
2942 return current_frame == NULL ? 0 :
2943 current_frame->f_code->co_flags & CO_NESTED;
2944}
2945
2946int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002947Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002948{
Guido van Rossumb209a111997-04-29 18:18:01 +00002949 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002950 if (f == NULL)
2951 return 0;
2952 if (!PyFile_SoftSpace(f, 0))
2953 return 0;
2954 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002955}
2956
Guido van Rossum3f5da241990-12-20 15:06:42 +00002957
Guido van Rossum681d79a1995-07-18 14:51:37 +00002958/* External interface to call any callable object.
2959 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002960
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002961#undef PyEval_CallObject
2962/* for backward compatibility: export this interface */
2963
Guido van Rossumb209a111997-04-29 18:18:01 +00002964PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002965PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002966{
Guido van Rossumb209a111997-04-29 18:18:01 +00002967 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002968}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002969#define PyEval_CallObject(func,arg) \
2970 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002971
Guido van Rossumb209a111997-04-29 18:18:01 +00002972PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002973PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002974{
Jeremy Hylton52820442001-01-03 23:52:36 +00002975 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002976
2977 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002978 arg = PyTuple_New(0);
2979 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002980 PyErr_SetString(PyExc_TypeError,
2981 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002982 return NULL;
2983 }
2984 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002985 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002986
Guido van Rossumb209a111997-04-29 18:18:01 +00002987 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002988 PyErr_SetString(PyExc_TypeError,
2989 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00002990 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002991 return NULL;
2992 }
2993
Jeremy Hylton52820442001-01-03 23:52:36 +00002994 result = call_object(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002995 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00002996 return result;
2997}
2998
2999/* How often is each kind of object called? The answer depends on the
3000 program. An instrumented call_object() was used to run the Python
3001 regression test suite. The results were:
3002 4200000 PyCFunctions
3003 390000 fast_function() calls
3004 94000 other functions
3005 480000 all functions (sum of prev two)
3006 150000 methods
3007 100000 classes
3008
3009 Tests on other bodies of code show that PyCFunctions are still
3010 most common, but not by such a large margin.
3011*/
3012
Jeremy Hylton512a2372001-04-11 13:52:29 +00003013static char *
3014get_func_name(PyObject *func)
3015{
3016 if (PyMethod_Check(func))
3017 return get_func_name(PyMethod_GET_FUNCTION(func));
3018 else if (PyFunction_Check(func))
3019 return PyString_AsString(((PyFunctionObject*)func)->func_name);
3020 else if (PyCFunction_Check(func))
3021 return ((PyCFunctionObject*)func)->m_ml->ml_name;
3022 else if (PyClass_Check(func))
3023 return PyString_AsString(((PyClassObject*)func)->cl_name);
3024 else if (PyInstance_Check(func)) {
3025 return PyString_AsString(
3026 ((PyInstanceObject*)func)->in_class->cl_name);
3027 } else {
3028 return func->ob_type->tp_name;
3029 }
3030}
3031
3032static char *
3033get_func_desc(PyObject *func)
3034{
3035 if (PyMethod_Check(func))
3036 return "()";
3037 else if (PyFunction_Check(func))
3038 return "()";
3039 else if (PyCFunction_Check(func))
3040 return "()";
3041 else if (PyClass_Check(func))
3042 return " constructor";
3043 else if (PyInstance_Check(func)) {
3044 return " instance";
3045 } else {
3046 return " object";
3047 }
3048}
3049
Jeremy Hylton52820442001-01-03 23:52:36 +00003050static PyObject *
3051call_object(PyObject *func, PyObject *arg, PyObject *kw)
3052{
3053 ternaryfunc call;
3054 PyObject *result;
3055
3056 if (PyMethod_Check(func))
3057 result = call_method(func, arg, kw);
3058 else if (PyFunction_Check(func))
3059 result = call_eval_code2(func, arg, kw);
3060 else if (PyCFunction_Check(func))
3061 result = call_cfunction(func, arg, kw);
3062 else if (PyClass_Check(func))
3063 result = PyInstance_New(func, arg, kw);
3064 else if (PyInstance_Check(func))
3065 result = call_instance(func, arg, kw);
3066 else if ((call = func->ob_type->tp_call) != NULL)
3067 result = (*call)(func, arg, kw);
3068 else {
Tim Peters239508c2001-06-16 00:09:28 +00003069 PyErr_Format(PyExc_TypeError,
3070 "object of type '%.100s' is not callable",
3071 func->ob_type->tp_name);
Jeremy Hylton52820442001-01-03 23:52:36 +00003072 return NULL;
3073 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003074 if (result == NULL && !PyErr_Occurred())
3075 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003076 "NULL result without error in call_object");
Guido van Rossumac7be682001-01-17 15:42:30 +00003077
Guido van Rossume59214e1994-08-30 08:01:59 +00003078 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003079}
3080
Guido van Rossumb209a111997-04-29 18:18:01 +00003081static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00003082call_cfunction(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003083{
Jeremy Hylton52820442001-01-03 23:52:36 +00003084 PyCFunctionObject* f = (PyCFunctionObject*)func;
3085 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3086 PyObject *self = PyCFunction_GET_SELF(func);
3087 int flags = PyCFunction_GET_FLAGS(func);
3088
Jeremy Hylton52820442001-01-03 23:52:36 +00003089 if (flags & METH_KEYWORDS) {
3090 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003091 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003092 if (kw != NULL && PyDict_Size(kw) != 0) {
3093 PyErr_Format(PyExc_TypeError,
3094 "%.200s() takes no keyword arguments",
3095 f->m_ml->ml_name);
3096 return NULL;
3097 }
Fred Drake1a7aab72001-01-04 22:33:02 +00003098 if (flags & METH_VARARGS) {
3099 return (*meth)(self, arg);
3100 }
3101 if (!(flags & METH_VARARGS)) {
3102 /* the really old style */
3103 int size = PyTuple_GET_SIZE(arg);
3104 if (size == 1)
3105 arg = PyTuple_GET_ITEM(arg, 0);
3106 else if (size == 0)
3107 arg = NULL;
3108 return (*meth)(self, arg);
3109 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003110 /* should never get here ??? */
3111 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003112 return NULL;
3113}
3114
Guido van Rossumb209a111997-04-29 18:18:01 +00003115static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00003116call_instance(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003117{
Jeremy Hylton52820442001-01-03 23:52:36 +00003118 PyObject *res, *call = PyObject_GetAttrString(func, "__call__");
3119 if (call == NULL) {
3120 PyInstanceObject *inst = (PyInstanceObject*) func;
3121 PyErr_Clear();
3122 PyErr_Format(PyExc_AttributeError,
3123 "%.200s instance has no __call__ method",
3124 PyString_AsString(inst->in_class->cl_name));
Guido van Rossum681d79a1995-07-18 14:51:37 +00003125 return NULL;
3126 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003127 res = call_object(call, arg, kw);
3128 Py_DECREF(call);
3129 return res;
3130}
3131
3132static PyObject *
3133call_method(PyObject *func, PyObject *arg, PyObject *kw)
3134{
3135 PyObject *self = PyMethod_GET_SELF(func);
3136 PyObject *class = PyMethod_GET_CLASS(func);
3137 PyObject *result;
3138
3139 func = PyMethod_GET_FUNCTION(func);
3140 if (self == NULL) {
3141 /* Unbound methods must be called with an instance of
3142 the class (or a derived class) as first argument */
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00003143 int ok;
Jeremy Hylton52820442001-01-03 23:52:36 +00003144 if (PyTuple_Size(arg) >= 1)
3145 self = PyTuple_GET_ITEM(arg, 0);
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00003146 if (self == NULL)
3147 ok = 0;
3148 else {
3149 ok = PyObject_IsInstance(self, class);
3150 if (ok < 0)
3151 return NULL;
3152 }
3153 if (!ok) {
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00003154 PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00003155 "unbound method %s%s must be "
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00003156 "called with instance as first argument",
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00003157 get_func_name(func), get_func_desc(func));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003158 return NULL;
3159 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003160 Py_INCREF(arg);
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00003161 }
3162 else {
Jeremy Hylton52820442001-01-03 23:52:36 +00003163 int argcount = PyTuple_Size(arg);
3164 PyObject *newarg = PyTuple_New(argcount + 1);
3165 int i;
3166 if (newarg == NULL)
3167 return NULL;
3168 Py_INCREF(self);
3169 PyTuple_SET_ITEM(newarg, 0, self);
3170 for (i = 0; i < argcount; i++) {
3171 PyObject *v = PyTuple_GET_ITEM(arg, i);
3172 Py_XINCREF(v);
3173 PyTuple_SET_ITEM(newarg, i+1, v);
3174 }
3175 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003176 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003177 result = call_object(func, arg, kw);
3178 Py_DECREF(arg);
3179 return result;
3180}
3181
3182static PyObject *
3183call_eval_code2(PyObject *func, PyObject *arg, PyObject *kw)
3184{
3185 PyObject *result;
3186 PyObject *argdefs;
3187 PyObject **d, **k;
3188 int nk, nd;
3189
3190 argdefs = PyFunction_GET_DEFAULTS(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00003191 if (argdefs != NULL && PyTuple_Check(argdefs)) {
3192 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
3193 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003194 }
3195 else {
3196 d = NULL;
3197 nd = 0;
3198 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003199
Guido van Rossum681d79a1995-07-18 14:51:37 +00003200 if (kw != NULL) {
3201 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00003202 nk = PyDict_Size(kw);
3203 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003204 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003205 PyErr_NoMemory();
3206 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003207 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00003208 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003209 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00003210 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00003211 i += 2;
3212 nk = i/2;
3213 /* XXX This is broken if the caller deletes dict items! */
3214 }
3215 else {
3216 k = NULL;
3217 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00003218 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003219
Guido van Rossum681d79a1995-07-18 14:51:37 +00003220 result = eval_code2(
Jeremy Hylton52820442001-01-03 23:52:36 +00003221 (PyCodeObject *)PyFunction_GET_CODE(func),
3222 PyFunction_GET_GLOBALS(func), (PyObject *)NULL,
Guido van Rossumb209a111997-04-29 18:18:01 +00003223 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003224 k, nk, d, nd,
3225 PyFunction_GET_CLOSURE(func));
Guido van Rossumac7be682001-01-17 15:42:30 +00003226
Guido van Rossumb18618d2000-05-03 23:44:39 +00003227 if (k != NULL)
3228 PyMem_DEL(k);
Guido van Rossumac7be682001-01-17 15:42:30 +00003229
Guido van Rossum681d79a1995-07-18 14:51:37 +00003230 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003231}
3232
Jeremy Hylton52820442001-01-03 23:52:36 +00003233#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
3234
3235/* The two fast_xxx() functions optimize calls for which no argument
3236 tuple is necessary; the objects are passed directly from the stack.
3237 fast_cfunction() is called for METH_OLDARGS functions.
3238 fast_function() is for functions with no special argument handling.
3239*/
3240
3241static PyObject *
3242fast_cfunction(PyObject *func, PyObject ***pp_stack, int na)
3243{
3244 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3245 PyObject *self = PyCFunction_GET_SELF(func);
3246
3247 if (na == 0)
3248 return (*meth)(self, NULL);
Charles G. Waldmaneec72a72001-01-10 22:11:59 +00003249 else if (na == 1) {
3250 PyObject *arg = EXT_POP(*pp_stack);
Guido van Rossumac7be682001-01-17 15:42:30 +00003251 PyObject *result = (*meth)(self, arg);
Charles G. Waldmaneec72a72001-01-10 22:11:59 +00003252 Py_DECREF(arg);
3253 return result;
3254 } else {
Jeremy Hylton52820442001-01-03 23:52:36 +00003255 PyObject *args = load_args(pp_stack, na);
3256 PyObject *result = (*meth)(self, args);
3257 Py_DECREF(args);
3258 return result;
3259 }
3260}
3261
3262static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00003263fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00003264{
3265 PyObject *co = PyFunction_GET_CODE(func);
3266 PyObject *globals = PyFunction_GET_GLOBALS(func);
3267 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003268 PyObject *closure = PyFunction_GET_CLOSURE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003269 PyObject **d = NULL;
3270 int nd = 0;
3271
3272 if (argdefs != NULL) {
3273 d = &PyTuple_GET_ITEM(argdefs, 0);
3274 nd = ((PyTupleObject *)argdefs)->ob_size;
3275 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003276 return eval_code2((PyCodeObject *)co, globals,
Jeremy Hylton52820442001-01-03 23:52:36 +00003277 (PyObject *)NULL, (*pp_stack)-n, na,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003278 (*pp_stack)-2*nk, nk, d, nd,
3279 closure);
Jeremy Hylton52820442001-01-03 23:52:36 +00003280}
3281
3282static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00003283update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
3284 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00003285{
3286 PyObject *kwdict = NULL;
3287 if (orig_kwdict == NULL)
3288 kwdict = PyDict_New();
3289 else {
3290 kwdict = PyDict_Copy(orig_kwdict);
3291 Py_DECREF(orig_kwdict);
3292 }
3293 if (kwdict == NULL)
3294 return NULL;
3295 while (--nk >= 0) {
3296 int err;
3297 PyObject *value = EXT_POP(*pp_stack);
3298 PyObject *key = EXT_POP(*pp_stack);
3299 if (PyDict_GetItem(kwdict, key) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +00003300 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00003301 "%.200s%s got multiple values "
Jeremy Hylton512a2372001-04-11 13:52:29 +00003302 "for keyword argument '%.200s'",
3303 get_func_name(func),
3304 get_func_desc(func),
3305 PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00003306 Py_DECREF(key);
3307 Py_DECREF(value);
3308 Py_DECREF(kwdict);
3309 return NULL;
3310 }
3311 err = PyDict_SetItem(kwdict, key, value);
3312 Py_DECREF(key);
3313 Py_DECREF(value);
3314 if (err) {
3315 Py_DECREF(kwdict);
3316 return NULL;
3317 }
3318 }
3319 return kwdict;
3320}
3321
3322static PyObject *
3323update_star_args(int nstack, int nstar, PyObject *stararg,
3324 PyObject ***pp_stack)
3325{
3326 PyObject *callargs, *w;
3327
3328 callargs = PyTuple_New(nstack + nstar);
3329 if (callargs == NULL) {
3330 return NULL;
3331 }
3332 if (nstar) {
3333 int i;
3334 for (i = 0; i < nstar; i++) {
3335 PyObject *a = PyTuple_GET_ITEM(stararg, i);
3336 Py_INCREF(a);
3337 PyTuple_SET_ITEM(callargs, nstack + i, a);
3338 }
3339 }
3340 while (--nstack >= 0) {
3341 w = EXT_POP(*pp_stack);
3342 PyTuple_SET_ITEM(callargs, nstack, w);
3343 }
3344 return callargs;
3345}
3346
3347static PyObject *
3348load_args(PyObject ***pp_stack, int na)
3349{
3350 PyObject *args = PyTuple_New(na);
3351 PyObject *w;
3352
3353 if (args == NULL)
3354 return NULL;
3355 while (--na >= 0) {
3356 w = EXT_POP(*pp_stack);
3357 PyTuple_SET_ITEM(args, na, w);
3358 }
3359 return args;
3360}
3361
3362static PyObject *
3363do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
3364{
3365 PyObject *callargs = NULL;
3366 PyObject *kwdict = NULL;
3367 PyObject *result = NULL;
3368
3369 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003370 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003371 if (kwdict == NULL)
3372 goto call_fail;
3373 }
3374 callargs = load_args(pp_stack, na);
3375 if (callargs == NULL)
3376 goto call_fail;
3377 result = call_object(func, callargs, kwdict);
3378 call_fail:
3379 Py_XDECREF(callargs);
3380 Py_XDECREF(kwdict);
3381 return result;
3382}
3383
3384static PyObject *
3385ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3386{
3387 int nstar = 0;
3388 PyObject *callargs = NULL;
3389 PyObject *stararg = NULL;
3390 PyObject *kwdict = NULL;
3391 PyObject *result = NULL;
3392
3393 if (flags & CALL_FLAG_KW) {
3394 kwdict = EXT_POP(*pp_stack);
3395 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003396 PyErr_Format(PyExc_TypeError,
Jeremy Hylton512a2372001-04-11 13:52:29 +00003397 "%s%s argument after ** "
3398 "must be a dictionary",
3399 get_func_name(func),
3400 get_func_desc(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00003401 goto ext_call_fail;
3402 }
3403 }
3404 if (flags & CALL_FLAG_VAR) {
3405 stararg = EXT_POP(*pp_stack);
3406 if (!PyTuple_Check(stararg)) {
3407 PyObject *t = NULL;
3408 t = PySequence_Tuple(stararg);
3409 if (t == NULL) {
Jeremy Hylton512a2372001-04-11 13:52:29 +00003410 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
3411 PyErr_Format(PyExc_TypeError,
3412 "%s%s argument after * "
3413 "must be a sequence",
3414 get_func_name(func),
3415 get_func_desc(func));
3416 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003417 goto ext_call_fail;
3418 }
3419 Py_DECREF(stararg);
3420 stararg = t;
3421 }
3422 nstar = PyTuple_GET_SIZE(stararg);
3423 }
3424 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003425 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003426 if (kwdict == NULL)
3427 goto ext_call_fail;
3428 }
3429 callargs = update_star_args(na, nstar, stararg, pp_stack);
3430 if (callargs == NULL)
3431 goto ext_call_fail;
3432 result = call_object(func, callargs, kwdict);
3433 ext_call_fail:
3434 Py_XDECREF(callargs);
3435 Py_XDECREF(kwdict);
3436 Py_XDECREF(stararg);
3437 return result;
3438}
3439
Guido van Rossum3b9c6671996-07-30 18:40:29 +00003440#define SLICE_ERROR_MSG \
3441 "standard sequence type does not support step size other than one"
3442
Guido van Rossumb209a111997-04-29 18:18:01 +00003443static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003444loop_subscript(PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003445{
Guido van Rossumb209a111997-04-29 18:18:01 +00003446 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00003447 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003448 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003449 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003450 return NULL;
3451 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003452 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00003453 v = (*sq->sq_item)(v, i);
3454 if (v)
3455 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00003456 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00003457 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00003458 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003459}
3460
Guido van Rossum20c6add2000-05-08 14:06:50 +00003461/* Extract a slice index from a PyInt or PyLong, the index is bound to
3462 the range [-INT_MAX+1, INTMAX]. Returns 0 and an exception if there is
3463 and error. Returns 1 on success.*/
3464
3465int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003466_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003467{
3468 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003469 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003470 if (PyInt_Check(v)) {
3471 x = PyInt_AsLong(v);
3472 } else if (PyLong_Check(v)) {
3473 x = PyLong_AsLong(v);
3474 if (x==-1 && PyErr_Occurred()) {
3475 PyObject *long_zero;
Guido van Rossumac7be682001-01-17 15:42:30 +00003476 int cmp;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003477
Guido van Rossumac7be682001-01-17 15:42:30 +00003478 if (!PyErr_ExceptionMatches(
3479 PyExc_OverflowError)) {
3480 /* It's not an overflow error, so just
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003481 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00003482 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003483 }
3484
Guido van Rossumac7be682001-01-17 15:42:30 +00003485 /* Clear the OverflowError */
3486 PyErr_Clear();
3487
3488 /* It's an overflow error, so we need to
3489 check the sign of the long integer,
3490 set the value to INT_MAX or 0, and clear
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003491 the error. */
3492
3493 /* Create a long integer with a value of 0 */
Guido van Rossumac7be682001-01-17 15:42:30 +00003494 long_zero = PyLong_FromLong(0L);
Guido van Rossum20c6add2000-05-08 14:06:50 +00003495 if (long_zero == NULL) return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003496
3497 /* Check sign */
Guido van Rossumac7be682001-01-17 15:42:30 +00003498 cmp = PyObject_RichCompareBool(v, long_zero,
3499 Py_GT);
3500 Py_DECREF(long_zero);
3501 if (cmp < 0)
3502 return 0;
3503 else if (cmp > 0)
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003504 x = INT_MAX;
3505 else
3506 x = 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003507 }
3508 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003509 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003510 "slice indices must be integers");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003511 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003512 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003513 /* Truncate -- very long indices are truncated anyway */
3514 if (x > INT_MAX)
3515 x = INT_MAX;
3516 else if (x < -INT_MAX)
3517 x = 0;
3518 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003519 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003520 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003521}
3522
Guido van Rossumb209a111997-04-29 18:18:01 +00003523static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003524apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003525{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003526 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003527 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003528 return NULL;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003529 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum04691fc1992-08-12 15:35:34 +00003530 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003531 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003532}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003533
3534static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003535assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3536 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003537{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003538 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003539 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum3f5da241990-12-20 15:06:42 +00003540 return -1;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003541 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum3f5da241990-12-20 15:06:42 +00003542 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003543 if (x == NULL)
3544 return PySequence_DelSlice(u, ilow, ihigh);
3545 else
3546 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003547}
3548
Guido van Rossumb209a111997-04-29 18:18:01 +00003549static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003550cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003551{
Guido van Rossumac7be682001-01-17 15:42:30 +00003552 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003553 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00003554 case IS:
3555 case IS_NOT:
3556 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00003557 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003558 res = !res;
3559 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003560 case IN:
3561 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003562 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003563 if (res < 0)
3564 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00003565 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003566 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003567 break;
3568 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00003569 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003570 break;
3571 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003572 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003573 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003574 v = res ? Py_True : Py_False;
3575 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003576 return v;
3577}
3578
Thomas Wouters52152252000-08-17 22:55:00 +00003579static PyObject *
3580import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003581{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003582 PyObject *x;
3583
3584 x = PyObject_GetAttr(v, name);
3585 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00003586 PyErr_Format(PyExc_ImportError,
3587 "cannot import name %.230s",
3588 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003589 }
Thomas Wouters52152252000-08-17 22:55:00 +00003590 return x;
3591}
Guido van Rossumac7be682001-01-17 15:42:30 +00003592
Thomas Wouters52152252000-08-17 22:55:00 +00003593static int
3594import_all_from(PyObject *locals, PyObject *v)
3595{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003596 PyObject *all = PyObject_GetAttrString(v, "__all__");
3597 PyObject *dict, *name, *value;
3598 int skip_leading_underscores = 0;
3599 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003600
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003601 if (all == NULL) {
3602 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3603 return -1; /* Unexpected error */
3604 PyErr_Clear();
3605 dict = PyObject_GetAttrString(v, "__dict__");
3606 if (dict == NULL) {
3607 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3608 return -1;
3609 PyErr_SetString(PyExc_ImportError,
3610 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003611 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003612 }
3613 all = PyMapping_Keys(dict);
3614 Py_DECREF(dict);
3615 if (all == NULL)
3616 return -1;
3617 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003618 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003619
3620 for (pos = 0, err = 0; ; pos++) {
3621 name = PySequence_GetItem(all, pos);
3622 if (name == NULL) {
3623 if (!PyErr_ExceptionMatches(PyExc_IndexError))
3624 err = -1;
3625 else
3626 PyErr_Clear();
3627 break;
3628 }
3629 if (skip_leading_underscores &&
3630 PyString_Check(name) &&
3631 PyString_AS_STRING(name)[0] == '_')
3632 {
3633 Py_DECREF(name);
3634 continue;
3635 }
3636 value = PyObject_GetAttr(v, name);
3637 if (value == NULL)
3638 err = -1;
3639 else
3640 err = PyDict_SetItem(locals, name, value);
3641 Py_DECREF(name);
3642 Py_XDECREF(value);
3643 if (err != 0)
3644 break;
3645 }
3646 Py_DECREF(all);
3647 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003648}
3649
Guido van Rossumb209a111997-04-29 18:18:01 +00003650static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003651build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003652{
Guido van Rossumcd649651997-08-22 16:56:16 +00003653 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003654 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003655 PyErr_SetString(PyExc_SystemError,
3656 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00003657 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003658 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003659 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003660 PyErr_SetString(PyExc_SystemError,
3661 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00003662 return NULL;
3663 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003664 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003665 PyErr_SetString(PyExc_SystemError,
Guido van Rossum7a5b7962000-03-31 13:52:29 +00003666 "build_class with non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00003667 return NULL;
3668 }
Guido van Rossumcd649651997-08-22 16:56:16 +00003669 n = PyTuple_Size(bases);
3670 for (i = 0; i < n; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003671 PyObject *base = PyTuple_GET_ITEM(bases, i);
3672 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00003673 /* Call the base's *type*, if it is callable.
3674 This code is a hook for Donald Beaudry's
3675 and Jim Fulton's type extensions. In
Thomas Wouters7e474022000-07-16 12:04:32 +00003676 unextended Python it will never be triggered
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003677 since its types are not callable.
3678 Ditto: call the bases's *class*, if it has
3679 one. This makes the same thing possible
3680 without writing C code. A true meta-object
3681 protocol! */
3682 PyObject *basetype = (PyObject *)base->ob_type;
3683 PyObject *callable = NULL;
3684 if (PyCallable_Check(basetype))
3685 callable = basetype;
3686 else
3687 callable = PyObject_GetAttrString(
3688 base, "__class__");
3689 if (callable) {
3690 PyObject *args;
3691 PyObject *newclass = NULL;
3692 args = Py_BuildValue(
3693 "(OOO)", name, bases, methods);
3694 if (args != NULL) {
3695 newclass = PyEval_CallObject(
3696 callable, args);
3697 Py_DECREF(args);
3698 }
Guido van Rossum730806d1998-04-10 22:27:42 +00003699 if (callable != basetype) {
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003700 Py_DECREF(callable);
Guido van Rossum730806d1998-04-10 22:27:42 +00003701 }
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003702 return newclass;
Guido van Rossum150b2df1996-12-05 23:17:11 +00003703 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003704 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00003705 "base is not a class object");
3706 return NULL;
3707 }
3708 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003709 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00003710}
3711
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003712static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003713exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3714 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003715{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003716 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003717 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003718 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003719
Guido van Rossumb209a111997-04-29 18:18:01 +00003720 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3721 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003722 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003723 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003724 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003725 locals = PyTuple_GetItem(prog, 2);
3726 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003727 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003728 if (globals == Py_None) {
3729 globals = PyEval_GetGlobals();
3730 if (locals == Py_None) {
3731 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003732 plain = 1;
3733 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003734 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003735 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003736 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003737 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003738 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003739 !PyCode_Check(prog) &&
3740 !PyFile_Check(prog)) {
3741 PyErr_SetString(PyExc_TypeError,
Guido van Rossumac7be682001-01-17 15:42:30 +00003742 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003743 return -1;
3744 }
Fred Drake661ea262000-10-24 19:57:45 +00003745 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003746 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003747 "exec: arg 2 must be a dictionary or None");
3748 return -1;
3749 }
3750 if (!PyDict_Check(locals)) {
3751 PyErr_SetString(PyExc_TypeError,
3752 "exec: arg 3 must be a dictionary or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003753 return -1;
3754 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003755 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003756 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003757 if (PyCode_Check(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003758 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003759 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003760 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003761 FILE *fp = PyFile_AsFile(prog);
3762 char *name = PyString_AsString(PyFile_Name(prog));
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003763 if (PyEval_GetNestedScopes()) {
3764 PyCompilerFlags cf;
3765 cf.cf_nested_scopes = 1;
3766 v = PyRun_FileFlags(fp, name, Py_file_input, globals,
3767 locals, &cf);
3768 } else {
3769 v = PyRun_File(fp, name, Py_file_input, globals,
3770 locals);
3771 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003772 }
3773 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003774 char *str;
3775 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003776 return -1;
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003777 if (PyEval_GetNestedScopes()) {
3778 PyCompilerFlags cf;
3779 cf.cf_nested_scopes = 1;
3780 v = PyRun_StringFlags(str, Py_file_input, globals,
3781 locals, &cf);
3782 } else
3783 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003784 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003785 if (plain)
3786 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003787 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003788 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003789 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003790 return 0;
3791}
Guido van Rossum24c13741995-02-14 09:42:43 +00003792
Guido van Rossumac7be682001-01-17 15:42:30 +00003793static void
Paul Prescode68140d2000-08-30 20:25:01 +00003794format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3795{
3796 char *obj_str;
3797
3798 if (!obj)
3799 return;
3800
3801 obj_str = PyString_AsString(obj);
3802 if (!obj_str)
3803 return;
3804
3805 PyErr_Format(exc, format_str, obj_str);
3806}
Guido van Rossum950361c1997-01-24 13:49:28 +00003807
3808#ifdef DYNAMIC_EXECUTION_PROFILE
3809
3810PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003811getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003812{
3813 int i;
3814 PyObject *l = PyList_New(256);
3815 if (l == NULL) return NULL;
3816 for (i = 0; i < 256; i++) {
3817 PyObject *x = PyInt_FromLong(a[i]);
3818 if (x == NULL) {
3819 Py_DECREF(l);
3820 return NULL;
3821 }
3822 PyList_SetItem(l, i, x);
3823 }
3824 for (i = 0; i < 256; i++)
3825 a[i] = 0;
3826 return l;
3827}
3828
3829PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003830_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003831{
3832#ifndef DXPAIRS
3833 return getarray(dxp);
3834#else
3835 int i;
3836 PyObject *l = PyList_New(257);
3837 if (l == NULL) return NULL;
3838 for (i = 0; i < 257; i++) {
3839 PyObject *x = getarray(dxpairs[i]);
3840 if (x == NULL) {
3841 Py_DECREF(l);
3842 return NULL;
3843 }
3844 PyList_SetItem(l, i, x);
3845 }
3846 return l;
3847#endif
3848}
3849
3850#endif