blob: 199272c4f57c699965aaa395a5b7684ab11d3a9b [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
Jeremy Hyltonc862cf42001-01-19 03:25:05 +000023#define REPR(O) PyString_AS_STRING(PyObject_Repr(O))
24
Guido van Rossum04691fc1992-08-12 15:35:34 +000025/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000026/* #define CASE_TOO_BIG 1 */
Guido van Rossum04691fc1992-08-12 15:35:34 +000027
Guido van Rossum408027e1996-12-30 16:17:54 +000028#ifdef Py_DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000029/* For debugging the interpreter: */
30#define LLTRACE 1 /* Low-level trace feature */
31#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000032#endif
33
Jeremy Hylton52820442001-01-03 23:52:36 +000034typedef PyObject *(*callproc)(PyObject *, PyObject *, PyObject *);
Guido van Rossum5b722181993-03-30 17:46:03 +000035
Guido van Rossum374a9221991-04-04 10:40:29 +000036/* Forward declarations */
Guido van Rossum374a9221991-04-04 10:40:29 +000037
Tim Petersdbd9ba62000-07-09 03:09:57 +000038static PyObject *eval_code2(PyCodeObject *,
39 PyObject *, PyObject *,
40 PyObject **, int,
41 PyObject **, int,
Jeremy Hylton52820442001-01-03 23:52:36 +000042 PyObject **, int);
43
44static PyObject *call_object(PyObject *, PyObject *, PyObject *);
45static PyObject *call_cfunction(PyObject *, PyObject *, PyObject *);
46static PyObject *call_instance(PyObject *, PyObject *, PyObject *);
47static PyObject *call_method(PyObject *, PyObject *, PyObject *);
48static PyObject *call_eval_code2(PyObject *, PyObject *, PyObject *);
49static PyObject *fast_function(PyObject *, PyObject ***, int, int, int);
50static PyObject *fast_cfunction(PyObject *, PyObject ***, int);
51static PyObject *do_call(PyObject *, PyObject ***, int, int);
52static PyObject *ext_do_call(PyObject *, PyObject ***, int, int, int);
Guido van Rossumac7be682001-01-17 15:42:30 +000053static PyObject *update_keyword_args(PyObject *, int, PyObject ***,PyObject *);
Ka-Ping Yee20579702001-01-15 22:14:16 +000054static PyObject *update_star_args(int, int, PyObject *, PyObject ***);
Jeremy Hylton52820442001-01-03 23:52:36 +000055static PyObject *load_args(PyObject ***, int);
56#define CALL_FLAG_VAR 1
57#define CALL_FLAG_KW 2
58
Guido van Rossum0a066c01992-03-27 17:29:15 +000059#ifdef LLTRACE
Tim Petersdbd9ba62000-07-09 03:09:57 +000060static int prtrace(PyObject *, char *);
Guido van Rossum0a066c01992-03-27 17:29:15 +000061#endif
Tim Petersdbd9ba62000-07-09 03:09:57 +000062static void call_exc_trace(PyObject **, PyObject**, PyFrameObject *);
63static int call_trace(PyObject **, PyObject **,
64 PyFrameObject *, char *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000065static PyObject *loop_subscript(PyObject *, PyObject *);
66static PyObject *apply_slice(PyObject *, PyObject *, PyObject *);
67static int assign_slice(PyObject *, PyObject *,
68 PyObject *, PyObject *);
69static PyObject *cmp_outcome(int, PyObject *, PyObject *);
Thomas Wouters52152252000-08-17 22:55:00 +000070static PyObject *import_from(PyObject *, PyObject *);
71static int import_all_from(PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000072static PyObject *build_class(PyObject *, PyObject *, PyObject *);
73static int exec_statement(PyFrameObject *,
74 PyObject *, PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000075static void set_exc_info(PyThreadState *, PyObject *, PyObject *, PyObject *);
76static void reset_exc_info(PyThreadState *);
Paul Prescode68140d2000-08-30 20:25:01 +000077static void format_exc_check_arg(PyObject *, char *, PyObject *);
Guido van Rossum374a9221991-04-04 10:40:29 +000078
Paul Prescode68140d2000-08-30 20:25:01 +000079#define NAME_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000080 "name '%.200s' is not defined"
Paul Prescode68140d2000-08-30 20:25:01 +000081#define UNBOUNDLOCAL_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000082 "local variable '%.200s' referenced before assignment"
Guido van Rossum374a9221991-04-04 10:40:29 +000083
Guido van Rossum950361c1997-01-24 13:49:28 +000084/* Dynamic execution profile */
85#ifdef DYNAMIC_EXECUTION_PROFILE
86#ifdef DXPAIRS
87static long dxpairs[257][256];
88#define dxp dxpairs[256]
89#else
90static long dxp[256];
91#endif
92#endif
93
Guido van Rossume59214e1994-08-30 08:01:59 +000094#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +000095
Guido van Rossum2571cc81999-04-07 16:07:23 +000096#ifndef DONT_HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +000097#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +000098#endif
Guido van Rossum49b56061998-10-01 20:42:43 +000099#include "pythread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000100
Guido van Rossuma027efa1997-05-05 20:56:21 +0000101extern int _PyThread_Started; /* Flag for Py_Exit */
102
Guido van Rossum65d5b571998-12-21 19:32:43 +0000103static PyThread_type_lock interpreter_lock = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000104static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000105
106void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000107PyEval_InitThreads(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000108{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000109 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000110 return;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000111 _PyThread_Started = 1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000112 interpreter_lock = PyThread_allocate_lock();
113 PyThread_acquire_lock(interpreter_lock, 1);
114 main_thread = PyThread_get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000115}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000116
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000117void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000118PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000119{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000120 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000121}
122
123void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000124PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000125{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000126 PyThread_release_lock(interpreter_lock);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000127}
128
129void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000130PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000131{
132 if (tstate == NULL)
133 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000134 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000135 if (PyThreadState_Swap(tstate) != NULL)
136 Py_FatalError(
137 "PyEval_AcquireThread: non-NULL old thread state");
138}
139
140void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000141PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000142{
143 if (tstate == NULL)
144 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
145 if (PyThreadState_Swap(NULL) != tstate)
146 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000147 PyThread_release_lock(interpreter_lock);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000148}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000149
150/* This function is called from PyOS_AfterFork to ensure that newly
151 created child processes don't hold locks referring to threads which
152 are not running in the child process. (This could also be done using
153 pthread_atfork mechanism, at least for the pthreads implementation.) */
154
155void
156PyEval_ReInitThreads(void)
157{
158 if (!interpreter_lock)
159 return;
160 /*XXX Can't use PyThread_free_lock here because it does too
161 much error-checking. Doing this cleanly would require
162 adding a new function to each thread_*.h. Instead, just
163 create a new lock and waste a little bit of memory */
164 interpreter_lock = PyThread_allocate_lock();
165 PyThread_acquire_lock(interpreter_lock, 1);
166 main_thread = PyThread_get_thread_ident();
167}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000168#endif
169
Guido van Rossumff4949e1992-08-05 19:58:53 +0000170/* Functions save_thread and restore_thread are always defined so
171 dynamically loaded modules needn't be compiled separately for use
172 with and without threads: */
173
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000174PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000175PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000176{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000177 PyThreadState *tstate = PyThreadState_Swap(NULL);
178 if (tstate == NULL)
179 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000180#ifdef WITH_THREAD
Guido van Rossumb74eca91997-09-30 22:03:16 +0000181 if (interpreter_lock)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000182 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000183#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000184 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000185}
186
187void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000188PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000189{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000190 if (tstate == NULL)
191 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000192#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000193 if (interpreter_lock) {
Guido van Rossumb74eca91997-09-30 22:03:16 +0000194 int err = errno;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000195 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000196 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000197 }
198#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000199 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000200}
201
202
Guido van Rossuma9672091994-09-14 13:31:22 +0000203/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
204 signal handlers or Mac I/O completion routines) can schedule calls
205 to a function to be called synchronously.
206 The synchronous function is called with one void* argument.
207 It should return 0 for success or -1 for failure -- failure should
208 be accompanied by an exception.
209
210 If registry succeeds, the registry function returns 0; if it fails
211 (e.g. due to too many pending calls) it returns -1 (without setting
212 an exception condition).
213
214 Note that because registry may occur from within signal handlers,
215 or other asynchronous events, calling malloc() is unsafe!
216
217#ifdef WITH_THREAD
218 Any thread can schedule pending calls, but only the main thread
219 will execute them.
220#endif
221
222 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
223 There are two possible race conditions:
224 (1) nested asynchronous registry calls;
225 (2) registry calls made while pending calls are being processed.
226 While (1) is very unlikely, (2) is a real possibility.
227 The current code is safe against (2), but not against (1).
228 The safety against (2) is derived from the fact that only one
229 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000230
Guido van Rossuma027efa1997-05-05 20:56:21 +0000231 XXX Darn! With the advent of thread state, we should have an array
232 of pending calls per thread in the thread state! Later...
233*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000234
Guido van Rossuma9672091994-09-14 13:31:22 +0000235#define NPENDINGCALLS 32
236static struct {
Thomas Wouters334fb892000-07-25 12:56:38 +0000237 int (*func)(void *);
238 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000239} pendingcalls[NPENDINGCALLS];
240static volatile int pendingfirst = 0;
241static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000242static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000243
244int
Thomas Wouters334fb892000-07-25 12:56:38 +0000245Py_AddPendingCall(int (*func)(void *), void *arg)
Guido van Rossuma9672091994-09-14 13:31:22 +0000246{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000247 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000248 int i, j;
249 /* XXX Begin critical section */
250 /* XXX If you want this to be safe against nested
251 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000252 if (busy)
253 return -1;
254 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000255 i = pendinglast;
256 j = (i + 1) % NPENDINGCALLS;
257 if (j == pendingfirst)
258 return -1; /* Queue full */
259 pendingcalls[i].func = func;
260 pendingcalls[i].arg = arg;
261 pendinglast = j;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000262 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000263 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000264 /* XXX End critical section */
265 return 0;
266}
267
Guido van Rossum180d7b41994-09-29 09:45:57 +0000268int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000269Py_MakePendingCalls(void)
Guido van Rossuma9672091994-09-14 13:31:22 +0000270{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000271 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000272#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000273 if (main_thread && PyThread_get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000274 return 0;
275#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000276 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000277 return 0;
278 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000279 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000280 for (;;) {
281 int i;
Thomas Wouters334fb892000-07-25 12:56:38 +0000282 int (*func)(void *);
283 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000284 i = pendingfirst;
285 if (i == pendinglast)
286 break; /* Queue empty */
287 func = pendingcalls[i].func;
288 arg = pendingcalls[i].arg;
289 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000290 if (func(arg) < 0) {
291 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000292 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000293 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000294 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000295 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000296 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000297 return 0;
298}
299
300
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000301/* The interpreter's recursion limit */
302
Guido van Rossum349ff6f2000-09-01 01:52:08 +0000303static int recursion_limit = 1000;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000304
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000305int
306Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000307{
308 return recursion_limit;
309}
310
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000311void
312Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000313{
314 recursion_limit = new_limit;
315}
316
Guido van Rossum374a9221991-04-04 10:40:29 +0000317/* Status code for main loop (reason for stack unwind) */
318
319enum why_code {
320 WHY_NOT, /* No error */
321 WHY_EXCEPTION, /* Exception occurred */
322 WHY_RERAISE, /* Exception re-raised by 'finally' */
323 WHY_RETURN, /* 'return' statement */
324 WHY_BREAK /* 'break' statement */
325};
326
Tim Petersdbd9ba62000-07-09 03:09:57 +0000327static enum why_code do_raise(PyObject *, PyObject *, PyObject *);
328static int unpack_sequence(PyObject *, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000329
Guido van Rossum374a9221991-04-04 10:40:29 +0000330
Guido van Rossumb209a111997-04-29 18:18:01 +0000331PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000332PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000333{
334 return eval_code2(co,
335 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000336 (PyObject **)NULL, 0,
337 (PyObject **)NULL, 0,
Jeremy Hylton52820442001-01-03 23:52:36 +0000338 (PyObject **)NULL, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000339}
340
341
342/* Interpreter main loop */
343
Guido van Rossumb209a111997-04-29 18:18:01 +0000344static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000345eval_code2(PyCodeObject *co, PyObject *globals, PyObject *locals,
346 PyObject **args, int argcount, PyObject **kws, int kwcount,
Jeremy Hylton52820442001-01-03 23:52:36 +0000347 PyObject **defs, int defcount)
Guido van Rossum374a9221991-04-04 10:40:29 +0000348{
Guido van Rossum950361c1997-01-24 13:49:28 +0000349#ifdef DXPAIRS
350 int lastopcode = 0;
351#endif
Jeremy Hylton52820442001-01-03 23:52:36 +0000352 PyObject **stack_pointer;
Guido van Rossum374a9221991-04-04 10:40:29 +0000353 register unsigned char *next_instr;
Moshe Zadkaaa39a7e2000-08-07 06:34:45 +0000354 register int opcode=0; /* Current opcode */
355 register int oparg=0; /* Current opcode argument, if any */
Guido van Rossum374a9221991-04-04 10:40:29 +0000356 register enum why_code why; /* Reason for block stack unwind */
357 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000358 register PyObject *x; /* Result object -- NULL if error */
359 register PyObject *v; /* Temporary objects popped off stack */
360 register PyObject *w;
361 register PyObject *u;
362 register PyObject *t;
Barry Warsaw23c9ec82000-08-21 15:44:01 +0000363 register PyObject *stream = NULL; /* for PRINT opcodes */
Guido van Rossumb209a111997-04-29 18:18:01 +0000364 register PyFrameObject *f; /* Current frame */
Guido van Rossum50cd3481998-11-17 17:02:51 +0000365 register PyObject **fastlocals;
Guido van Rossum014518f1998-11-23 21:09:51 +0000366 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000367 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossumd076c731998-10-07 19:42:25 +0000368 unsigned char *first_instr;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000369#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000370 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000371#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000372#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000373 /* Make it easier to find out where we are with a debugger */
Guido van Rossumb209a111997-04-29 18:18:01 +0000374 char *filename = PyString_AsString(co->co_filename);
Guido van Rossum99bec951992-09-03 20:29:45 +0000375#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000376
377/* Code access macros */
378
379#define GETCONST(i) Getconst(f, i)
380#define GETNAME(i) Getname(f, i)
381#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumd076c731998-10-07 19:42:25 +0000382#define INSTR_OFFSET() (next_instr - first_instr)
Guido van Rossum374a9221991-04-04 10:40:29 +0000383#define NEXTOP() (*next_instr++)
384#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossumd076c731998-10-07 19:42:25 +0000385#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000386#define JUMPBY(x) (next_instr += (x))
387
388/* Stack manipulation macros */
389
390#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
391#define EMPTY() (STACK_LEVEL() == 0)
392#define TOP() (stack_pointer[-1])
393#define BASIC_PUSH(v) (*stack_pointer++ = (v))
394#define BASIC_POP() (*--stack_pointer)
395
Guido van Rossum96a42c81992-01-12 02:29:51 +0000396#ifdef LLTRACE
397#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
398#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000399#else
400#define PUSH(v) BASIC_PUSH(v)
401#define POP() BASIC_POP()
402#endif
403
Guido van Rossum681d79a1995-07-18 14:51:37 +0000404/* Local variable macros */
405
406#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumb209a111997-04-29 18:18:01 +0000407#define SETLOCAL(i, value) do { Py_XDECREF(GETLOCAL(i)); \
Guido van Rossum681d79a1995-07-18 14:51:37 +0000408 GETLOCAL(i) = value; } while (0)
409
Guido van Rossuma027efa1997-05-05 20:56:21 +0000410/* Start of code */
411
Guido van Rossum8861b741996-07-30 16:49:37 +0000412#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000413 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000414 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000415 return NULL;
416 }
417#endif
418
Guido van Rossum681d79a1995-07-18 14:51:37 +0000419 if (globals == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000420 PyErr_SetString(PyExc_SystemError, "eval_code2: NULL globals");
Guido van Rossum6135a871995-01-09 17:53:26 +0000421 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000422 }
423
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000424#ifdef LLTRACE
Guido van Rossumb209a111997-04-29 18:18:01 +0000425 lltrace = PyDict_GetItemString(globals, "__lltrace__") != NULL;
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000426#endif
427
Guido van Rossumb209a111997-04-29 18:18:01 +0000428 f = PyFrame_New(
Guido van Rossuma027efa1997-05-05 20:56:21 +0000429 tstate, /*back*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000430 co, /*code*/
431 globals, /*globals*/
Guido van Rossum76836021997-01-20 04:26:20 +0000432 locals); /*locals*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000433 if (f == NULL)
434 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000435
Guido van Rossuma027efa1997-05-05 20:56:21 +0000436 tstate->frame = f;
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000437 fastlocals = f->f_localsplus;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000438
439 if (co->co_argcount > 0 ||
440 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
441 int i;
442 int n = argcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000443 PyObject *kwdict = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000444 if (co->co_flags & CO_VARKEYWORDS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000445 kwdict = PyDict_New();
Guido van Rossum681d79a1995-07-18 14:51:37 +0000446 if (kwdict == NULL)
447 goto fail;
Guido van Rossum8c5df061997-01-24 04:19:24 +0000448 i = co->co_argcount;
449 if (co->co_flags & CO_VARARGS)
450 i++;
451 SETLOCAL(i, kwdict);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000452 }
453 if (argcount > co->co_argcount) {
454 if (!(co->co_flags & CO_VARARGS)) {
Guido van Rossumdf9db1e1997-11-19 16:05:40 +0000455 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +0000456 "%.200s() takes %s %d "
457 "%sargument%s (%d given)",
Fred Drake661ea262000-10-24 19:57:45 +0000458 PyString_AsString(co->co_name),
Ka-Ping Yee20579702001-01-15 22:14:16 +0000459 defcount ? "at most" : "exactly",
460 co->co_argcount,
461 kwcount ? "non-keyword " : "",
462 co->co_argcount == 1 ? "" : "s",
463 argcount);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000464 goto fail;
465 }
466 n = co->co_argcount;
467 }
468 for (i = 0; i < n; i++) {
469 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000470 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000471 SETLOCAL(i, x);
472 }
473 if (co->co_flags & CO_VARARGS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000474 u = PyTuple_New(argcount - n);
Guido van Rossum8c5df061997-01-24 04:19:24 +0000475 if (u == NULL)
476 goto fail;
477 SETLOCAL(co->co_argcount, u);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000478 for (i = n; i < argcount; i++) {
479 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000480 Py_INCREF(x);
481 PyTuple_SET_ITEM(u, i-n, x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000482 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000483 }
484 for (i = 0; i < kwcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000485 PyObject *keyword = kws[2*i];
486 PyObject *value = kws[2*i + 1];
Guido van Rossum681d79a1995-07-18 14:51:37 +0000487 int j;
Guido van Rossum25da5be1999-10-26 00:12:20 +0000488 if (keyword == NULL || !PyString_Check(keyword)) {
Ka-Ping Yee20579702001-01-15 22:14:16 +0000489 PyErr_Format(PyExc_TypeError,
490 "%.200s() keywords must be strings",
491 PyString_AsString(co->co_name));
Guido van Rossum25da5be1999-10-26 00:12:20 +0000492 goto fail;
493 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000494 /* XXX slow -- speed up using dictionary? */
495 for (j = 0; j < co->co_argcount; j++) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000496 PyObject *nm = PyTuple_GET_ITEM(
497 co->co_varnames, j);
Guido van Rossumac7be682001-01-17 15:42:30 +0000498 int cmp = PyObject_RichCompareBool(
499 keyword, nm, Py_EQ);
500 if (cmp > 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000501 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000502 else if (cmp < 0)
503 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000504 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000505 /* Check errors from Compare */
506 if (PyErr_Occurred())
507 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000508 if (j >= co->co_argcount) {
509 if (kwdict == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000510 PyErr_Format(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +0000511 "%.200s() got an unexpected "
512 "keyword argument '%.400s'",
513 PyString_AsString(co->co_name),
Jeremy Hylton76901512000-03-28 23:49:17 +0000514 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000515 goto fail;
516 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000517 PyDict_SetItem(kwdict, keyword, value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000518 }
519 else {
520 if (GETLOCAL(j) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000521 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +0000522 "%.200s() got multiple "
523 "values for keyword "
524 "argument '%.400s'",
525 PyString_AsString(co->co_name),
526 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000527 goto fail;
528 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000529 Py_INCREF(value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000530 SETLOCAL(j, value);
531 }
532 }
533 if (argcount < co->co_argcount) {
534 int m = co->co_argcount - defcount;
535 for (i = argcount; i < m; i++) {
536 if (GETLOCAL(i) == NULL) {
Guido van Rossumdf9db1e1997-11-19 16:05:40 +0000537 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +0000538 "%.200s() takes %s %d "
539 "%sargument%s (%d given)",
Fred Drake661ea262000-10-24 19:57:45 +0000540 PyString_AsString(co->co_name),
Ka-Ping Yee20579702001-01-15 22:14:16 +0000541 ((co->co_flags & CO_VARARGS) ||
542 defcount) ? "at least"
543 : "exactly",
544 m, kwcount ? "non-keyword " : "",
545 m == 1 ? "" : "s", i);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000546 goto fail;
547 }
548 }
549 if (n > m)
550 i = n - m;
551 else
552 i = 0;
553 for (; i < defcount; i++) {
554 if (GETLOCAL(m+i) == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000555 PyObject *def = defs[i];
556 Py_INCREF(def);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000557 SETLOCAL(m+i, def);
558 }
559 }
560 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000561 }
562 else {
563 if (argcount > 0 || kwcount > 0) {
Fred Drake661ea262000-10-24 19:57:45 +0000564 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +0000565 "%.200s() takes no arguments (%d given)",
566 PyString_AsString(co->co_name),
567 argcount + kwcount);
Guido van Rossum8c5df061997-01-24 04:19:24 +0000568 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000569 }
570 }
571
Guido van Rossuma027efa1997-05-05 20:56:21 +0000572 if (tstate->sys_tracefunc != NULL) {
573 /* tstate->sys_tracefunc, if defined, is a function that
574 will be called on *every* entry to a code block.
Guido van Rossum96a42c81992-01-12 02:29:51 +0000575 Its return value, if not None, is a function that
576 will be called at the start of each executed line
577 of code. (Actually, the function must return
578 itself in order to continue tracing.)
579 The trace functions are called with three arguments:
580 a pointer to the current frame, a string indicating
581 why the function is called, and an argument which
582 depends on the situation. The global trace function
583 (sys.trace) is also called whenever an exception
584 is detected. */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000585 if (call_trace(&tstate->sys_tracefunc,
586 &f->f_trace, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000587 Py_None/*XXX how to compute arguments now?*/)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000588 /* Trace function raised an error */
Guido van Rossum8c5df061997-01-24 04:19:24 +0000589 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000590 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000591 }
592
Guido van Rossuma027efa1997-05-05 20:56:21 +0000593 if (tstate->sys_profilefunc != NULL) {
594 /* Similar for sys_profilefunc, except it needn't return
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000595 itself and isn't called for "line" events */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000596 if (call_trace(&tstate->sys_profilefunc,
597 (PyObject**)0, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000598 Py_None/*XXX*/)) {
Guido van Rossum8c5df061997-01-24 04:19:24 +0000599 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000600 }
601 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000602
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000603 if (++tstate->recursion_depth > recursion_limit) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000604 --tstate->recursion_depth;
605 PyErr_SetString(PyExc_RuntimeError,
Fred Drake661ea262000-10-24 19:57:45 +0000606 "maximum recursion depth exceeded");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000607 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +0000608 Py_DECREF(f);
Guido van Rossum8861b741996-07-30 16:49:37 +0000609 return NULL;
610 }
611
Guido van Rossumd076c731998-10-07 19:42:25 +0000612 _PyCode_GETCODEPTR(co, &first_instr);
613 next_instr = first_instr;
Guido van Rossum374a9221991-04-04 10:40:29 +0000614 stack_pointer = f->f_valuestack;
Guido van Rossumac7be682001-01-17 15:42:30 +0000615
Guido van Rossum374a9221991-04-04 10:40:29 +0000616 why = WHY_NOT;
617 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000618 x = Py_None; /* Not a reference, just anything non-NULL */
Fred Drake48fba732000-10-11 13:54:07 +0000619 w = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +0000620
Guido van Rossum374a9221991-04-04 10:40:29 +0000621 for (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000622 /* Do periodic things. Doing this every time through
623 the loop would add too much overhead, so we do it
624 only every Nth instruction. We also do it if
625 ``things_to_do'' is set, i.e. when an asynchronous
626 event needs attention (e.g. a signal handler or
627 async I/O handler); see Py_AddPendingCall() and
628 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +0000629
Guido van Rossuma027efa1997-05-05 20:56:21 +0000630 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000631 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000632 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000633 if (Py_MakePendingCalls() < 0) {
634 why = WHY_EXCEPTION;
635 goto on_error;
636 }
637 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000638#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000639 /* If we have true signals, the signal handler
640 will call Py_AddPendingCall() so we don't
641 have to call sigcheck(). On the Mac and
642 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000643 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000644 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000645 goto on_error;
646 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000647#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000648
Guido van Rossume59214e1994-08-30 08:01:59 +0000649#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000650 if (interpreter_lock) {
651 /* Give another thread a chance */
652
Guido van Rossum25ce5661997-08-02 03:10:38 +0000653 if (PyThreadState_Swap(NULL) != tstate)
654 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000655 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000656
657 /* Other threads may run now */
658
Guido van Rossum65d5b571998-12-21 19:32:43 +0000659 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000660 if (PyThreadState_Swap(tstate) != NULL)
661 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000662 }
663#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000664 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000665
Guido van Rossum374a9221991-04-04 10:40:29 +0000666 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000667
Guido van Rossum408027e1996-12-30 16:17:54 +0000668#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000669 f->f_lasti = INSTR_OFFSET();
670#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000671
Guido van Rossum374a9221991-04-04 10:40:29 +0000672 opcode = NEXTOP();
673 if (HAS_ARG(opcode))
674 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000675 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000676#ifdef DYNAMIC_EXECUTION_PROFILE
677#ifdef DXPAIRS
678 dxpairs[lastopcode][opcode]++;
679 lastopcode = opcode;
680#endif
681 dxp[opcode]++;
682#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000683
Guido van Rossum96a42c81992-01-12 02:29:51 +0000684#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000685 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +0000686
Guido van Rossum96a42c81992-01-12 02:29:51 +0000687 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000688 if (HAS_ARG(opcode)) {
689 printf("%d: %d, %d\n",
690 (int) (INSTR_OFFSET() - 3),
691 opcode, oparg);
692 }
693 else {
694 printf("%d: %d\n",
695 (int) (INSTR_OFFSET() - 1), opcode);
696 }
697 }
698#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000699 /* Main switch on opcode */
Jeremy Hylton52820442001-01-03 23:52:36 +0000700
Guido van Rossum374a9221991-04-04 10:40:29 +0000701 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000702
Guido van Rossum374a9221991-04-04 10:40:29 +0000703 /* BEWARE!
704 It is essential that any operation that fails sets either
705 x to NULL, err to nonzero, or why to anything but WHY_NOT,
706 and that no operation that succeeds does this! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000707
Guido van Rossum374a9221991-04-04 10:40:29 +0000708 /* case STOP_CODE: this is an error! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000709
Guido van Rossum374a9221991-04-04 10:40:29 +0000710 case POP_TOP:
711 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000712 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000713 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000714
Guido van Rossum374a9221991-04-04 10:40:29 +0000715 case ROT_TWO:
716 v = POP();
717 w = POP();
718 PUSH(v);
719 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000720 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000721
Guido van Rossum374a9221991-04-04 10:40:29 +0000722 case ROT_THREE:
723 v = POP();
724 w = POP();
725 x = POP();
726 PUSH(v);
727 PUSH(x);
728 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000729 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000730
Thomas Wouters434d0822000-08-24 20:11:32 +0000731 case ROT_FOUR:
732 u = POP();
733 v = POP();
734 w = POP();
735 x = POP();
736 PUSH(u);
737 PUSH(x);
738 PUSH(w);
739 PUSH(v);
740 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000741
Guido van Rossum374a9221991-04-04 10:40:29 +0000742 case DUP_TOP:
743 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000744 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000745 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000746 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000747
Thomas Wouters434d0822000-08-24 20:11:32 +0000748 case DUP_TOPX:
749 switch (oparg) {
Thomas Wouters434d0822000-08-24 20:11:32 +0000750 case 1:
Tim Peters35ba6892000-10-11 07:04:49 +0000751 x = TOP();
752 Py_INCREF(x);
753 PUSH(x);
754 continue;
755 case 2:
Thomas Wouters434d0822000-08-24 20:11:32 +0000756 x = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000757 Py_INCREF(x);
758 w = TOP();
759 Py_INCREF(w);
760 PUSH(x);
761 PUSH(w);
762 PUSH(x);
763 continue;
764 case 3:
765 x = POP();
766 Py_INCREF(x);
Thomas Wouters434d0822000-08-24 20:11:32 +0000767 w = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000768 Py_INCREF(w);
769 v = TOP();
770 Py_INCREF(v);
771 PUSH(w);
772 PUSH(x);
773 PUSH(v);
774 PUSH(w);
775 PUSH(x);
776 continue;
777 case 4:
778 x = POP();
779 Py_INCREF(x);
780 w = POP();
781 Py_INCREF(w);
Thomas Wouters434d0822000-08-24 20:11:32 +0000782 v = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000783 Py_INCREF(v);
784 u = TOP();
785 Py_INCREF(u);
786 PUSH(v);
787 PUSH(w);
788 PUSH(x);
789 PUSH(u);
790 PUSH(v);
791 PUSH(w);
792 PUSH(x);
793 continue;
794 case 5:
795 x = POP();
796 Py_INCREF(x);
797 w = POP();
798 Py_INCREF(w);
799 v = POP();
800 Py_INCREF(v);
Thomas Wouters434d0822000-08-24 20:11:32 +0000801 u = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000802 Py_INCREF(u);
803 t = TOP();
804 Py_INCREF(t);
805 PUSH(u);
806 PUSH(v);
807 PUSH(w);
808 PUSH(x);
809 PUSH(t);
810 PUSH(u);
811 PUSH(v);
812 PUSH(w);
813 PUSH(x);
814 continue;
Thomas Wouters434d0822000-08-24 20:11:32 +0000815 default:
Thomas Wouters0be483f2000-10-11 23:26:11 +0000816 Py_FatalError("invalid argument to DUP_TOPX"
817 " (bytecode corruption?)");
Thomas Wouters434d0822000-08-24 20:11:32 +0000818 }
Tim Peters35ba6892000-10-11 07:04:49 +0000819 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000820
Guido van Rossum374a9221991-04-04 10:40:29 +0000821 case UNARY_POSITIVE:
822 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000823 x = PyNumber_Positive(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_NEGATIVE:
830 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000831 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000832 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000833 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000834 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000835 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000836
Guido van Rossum374a9221991-04-04 10:40:29 +0000837 case UNARY_NOT:
838 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000839 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000840 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000841 if (err == 0) {
842 Py_INCREF(Py_True);
843 PUSH(Py_True);
844 continue;
845 }
846 else if (err > 0) {
847 Py_INCREF(Py_False);
848 PUSH(Py_False);
849 err = 0;
850 continue;
851 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000852 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000853
Guido van Rossum374a9221991-04-04 10:40:29 +0000854 case UNARY_CONVERT:
855 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000856 x = PyObject_Repr(v);
857 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000858 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000859 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000860 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000861
Guido van Rossum7928cd71991-10-24 14:59:31 +0000862 case UNARY_INVERT:
863 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000864 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000865 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000866 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000867 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000868 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000869
Guido van Rossum50564e81996-01-12 01:13:16 +0000870 case BINARY_POWER:
871 w = POP();
872 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000873 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000874 Py_DECREF(v);
875 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000876 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000877 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000878 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000879
Guido van Rossum374a9221991-04-04 10:40:29 +0000880 case BINARY_MULTIPLY:
881 w = POP();
882 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000883 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000884 Py_DECREF(v);
885 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000886 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000887 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000888 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000889
Guido van Rossum374a9221991-04-04 10:40:29 +0000890 case BINARY_DIVIDE:
891 w = POP();
892 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000893 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000894 Py_DECREF(v);
895 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000896 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000897 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000898 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000899
Guido van Rossum374a9221991-04-04 10:40:29 +0000900 case BINARY_MODULO:
901 w = POP();
902 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000903 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000904 Py_DECREF(v);
905 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000906 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000907 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000908 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000909
Guido van Rossum374a9221991-04-04 10:40:29 +0000910 case BINARY_ADD:
911 w = POP();
912 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000913 if (PyInt_Check(v) && PyInt_Check(w)) {
914 /* INLINE: int + int */
915 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000916 a = PyInt_AS_LONG(v);
917 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000918 i = a + b;
919 if ((i^a) < 0 && (i^b) < 0) {
920 PyErr_SetString(PyExc_OverflowError,
921 "integer addition");
922 x = NULL;
923 }
924 else
925 x = PyInt_FromLong(i);
926 }
927 else
928 x = PyNumber_Add(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000929 Py_DECREF(v);
930 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000931 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000932 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000933 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000934
Guido van Rossum374a9221991-04-04 10:40:29 +0000935 case BINARY_SUBTRACT:
936 w = POP();
937 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000938 if (PyInt_Check(v) && PyInt_Check(w)) {
939 /* INLINE: int - int */
940 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000941 a = PyInt_AS_LONG(v);
942 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000943 i = a - b;
944 if ((i^a) < 0 && (i^~b) < 0) {
945 PyErr_SetString(PyExc_OverflowError,
946 "integer subtraction");
947 x = NULL;
948 }
949 else
950 x = PyInt_FromLong(i);
951 }
952 else
953 x = PyNumber_Subtract(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000954 Py_DECREF(v);
955 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000956 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000957 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000958 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000959
Guido van Rossum374a9221991-04-04 10:40:29 +0000960 case BINARY_SUBSCR:
961 w = POP();
962 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000963 if (PyList_Check(v) && PyInt_Check(w)) {
964 /* INLINE: list[int] */
965 long i = PyInt_AsLong(w);
966 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +0000967 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +0000968 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +0000969 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000970 PyErr_SetString(PyExc_IndexError,
971 "list index out of range");
972 x = NULL;
973 }
974 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +0000975 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000976 Py_INCREF(x);
977 }
978 }
979 else
980 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000981 Py_DECREF(v);
982 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000983 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000984 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000985 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000986
Guido van Rossum7928cd71991-10-24 14:59:31 +0000987 case BINARY_LSHIFT:
988 w = POP();
989 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000990 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000991 Py_DECREF(v);
992 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000993 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000994 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000995 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000996
Guido van Rossum7928cd71991-10-24 14:59:31 +0000997 case BINARY_RSHIFT:
998 w = POP();
999 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001000 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001001 Py_DECREF(v);
1002 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001003 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001004 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001005 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001006
Guido van Rossum7928cd71991-10-24 14:59:31 +00001007 case BINARY_AND:
1008 w = POP();
1009 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001010 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001011 Py_DECREF(v);
1012 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001013 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001014 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001015 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001016
Guido van Rossum7928cd71991-10-24 14:59:31 +00001017 case BINARY_XOR:
1018 w = POP();
1019 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001020 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001021 Py_DECREF(v);
1022 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001023 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001024 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001025 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001026
Guido van Rossum7928cd71991-10-24 14:59:31 +00001027 case BINARY_OR:
1028 w = POP();
1029 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001030 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001031 Py_DECREF(v);
1032 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001033 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001034 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001035 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001036
1037 case INPLACE_POWER:
1038 w = POP();
1039 v = POP();
1040 x = PyNumber_InPlacePower(v, w, Py_None);
1041 Py_DECREF(v);
1042 Py_DECREF(w);
1043 PUSH(x);
1044 if (x != NULL) continue;
1045 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001046
Thomas Wouters434d0822000-08-24 20:11:32 +00001047 case INPLACE_MULTIPLY:
1048 w = POP();
1049 v = POP();
1050 x = PyNumber_InPlaceMultiply(v, w);
1051 Py_DECREF(v);
1052 Py_DECREF(w);
1053 PUSH(x);
1054 if (x != NULL) continue;
1055 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001056
Thomas Wouters434d0822000-08-24 20:11:32 +00001057 case INPLACE_DIVIDE:
1058 w = POP();
1059 v = POP();
1060 x = PyNumber_InPlaceDivide(v, w);
1061 Py_DECREF(v);
1062 Py_DECREF(w);
1063 PUSH(x);
1064 if (x != NULL) continue;
1065 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001066
Thomas Wouters434d0822000-08-24 20:11:32 +00001067 case INPLACE_MODULO:
1068 w = POP();
1069 v = POP();
1070 x = PyNumber_InPlaceRemainder(v, w);
1071 Py_DECREF(v);
1072 Py_DECREF(w);
1073 PUSH(x);
1074 if (x != NULL) continue;
1075 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001076
Thomas Wouters434d0822000-08-24 20:11:32 +00001077 case INPLACE_ADD:
1078 w = POP();
1079 v = POP();
1080 if (PyInt_Check(v) && PyInt_Check(w)) {
1081 /* INLINE: int + int */
1082 register long a, b, i;
1083 a = PyInt_AS_LONG(v);
1084 b = PyInt_AS_LONG(w);
1085 i = a + b;
1086 if ((i^a) < 0 && (i^b) < 0) {
1087 PyErr_SetString(PyExc_OverflowError,
1088 "integer addition");
1089 x = NULL;
1090 }
1091 else
1092 x = PyInt_FromLong(i);
1093 }
1094 else
1095 x = PyNumber_InPlaceAdd(v, w);
1096 Py_DECREF(v);
1097 Py_DECREF(w);
1098 PUSH(x);
1099 if (x != NULL) continue;
1100 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001101
Thomas Wouters434d0822000-08-24 20:11:32 +00001102 case INPLACE_SUBTRACT:
1103 w = POP();
1104 v = POP();
1105 if (PyInt_Check(v) && PyInt_Check(w)) {
1106 /* INLINE: int - int */
1107 register long a, b, i;
1108 a = PyInt_AS_LONG(v);
1109 b = PyInt_AS_LONG(w);
1110 i = a - b;
1111 if ((i^a) < 0 && (i^~b) < 0) {
1112 PyErr_SetString(PyExc_OverflowError,
1113 "integer subtraction");
1114 x = NULL;
1115 }
1116 else
1117 x = PyInt_FromLong(i);
1118 }
1119 else
1120 x = PyNumber_InPlaceSubtract(v, w);
1121 Py_DECREF(v);
1122 Py_DECREF(w);
1123 PUSH(x);
1124 if (x != NULL) continue;
1125 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001126
Thomas Wouters434d0822000-08-24 20:11:32 +00001127 case INPLACE_LSHIFT:
1128 w = POP();
1129 v = POP();
1130 x = PyNumber_InPlaceLshift(v, w);
1131 Py_DECREF(v);
1132 Py_DECREF(w);
1133 PUSH(x);
1134 if (x != NULL) continue;
1135 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001136
Thomas Wouters434d0822000-08-24 20:11:32 +00001137 case INPLACE_RSHIFT:
1138 w = POP();
1139 v = POP();
1140 x = PyNumber_InPlaceRshift(v, w);
1141 Py_DECREF(v);
1142 Py_DECREF(w);
1143 PUSH(x);
1144 if (x != NULL) continue;
1145 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001146
Thomas Wouters434d0822000-08-24 20:11:32 +00001147 case INPLACE_AND:
1148 w = POP();
1149 v = POP();
1150 x = PyNumber_InPlaceAnd(v, w);
1151 Py_DECREF(v);
1152 Py_DECREF(w);
1153 PUSH(x);
1154 if (x != NULL) continue;
1155 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001156
Thomas Wouters434d0822000-08-24 20:11:32 +00001157 case INPLACE_XOR:
1158 w = POP();
1159 v = POP();
1160 x = PyNumber_InPlaceXor(v, w);
1161 Py_DECREF(v);
1162 Py_DECREF(w);
1163 PUSH(x);
1164 if (x != NULL) continue;
1165 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001166
Thomas Wouters434d0822000-08-24 20:11:32 +00001167 case INPLACE_OR:
1168 w = POP();
1169 v = POP();
1170 x = PyNumber_InPlaceOr(v, w);
1171 Py_DECREF(v);
1172 Py_DECREF(w);
1173 PUSH(x);
1174 if (x != NULL) continue;
1175 break;
1176
Guido van Rossum374a9221991-04-04 10:40:29 +00001177 case SLICE+0:
1178 case SLICE+1:
1179 case SLICE+2:
1180 case SLICE+3:
1181 if ((opcode-SLICE) & 2)
1182 w = POP();
1183 else
1184 w = NULL;
1185 if ((opcode-SLICE) & 1)
1186 v = POP();
1187 else
1188 v = NULL;
1189 u = POP();
1190 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001191 Py_DECREF(u);
1192 Py_XDECREF(v);
1193 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001194 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001195 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001196 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001197
Guido van Rossum374a9221991-04-04 10:40:29 +00001198 case STORE_SLICE+0:
1199 case STORE_SLICE+1:
1200 case STORE_SLICE+2:
1201 case STORE_SLICE+3:
1202 if ((opcode-STORE_SLICE) & 2)
1203 w = POP();
1204 else
1205 w = NULL;
1206 if ((opcode-STORE_SLICE) & 1)
1207 v = POP();
1208 else
1209 v = NULL;
1210 u = POP();
1211 t = POP();
1212 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001213 Py_DECREF(t);
1214 Py_DECREF(u);
1215 Py_XDECREF(v);
1216 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001217 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001218 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001219
Guido van Rossum374a9221991-04-04 10:40:29 +00001220 case DELETE_SLICE+0:
1221 case DELETE_SLICE+1:
1222 case DELETE_SLICE+2:
1223 case DELETE_SLICE+3:
1224 if ((opcode-DELETE_SLICE) & 2)
1225 w = POP();
1226 else
1227 w = NULL;
1228 if ((opcode-DELETE_SLICE) & 1)
1229 v = POP();
1230 else
1231 v = NULL;
1232 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001233 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001234 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001235 Py_DECREF(u);
1236 Py_XDECREF(v);
1237 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001238 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001239 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001240
Guido van Rossum374a9221991-04-04 10:40:29 +00001241 case STORE_SUBSCR:
1242 w = POP();
1243 v = POP();
1244 u = POP();
1245 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001246 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001247 Py_DECREF(u);
1248 Py_DECREF(v);
1249 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001250 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001251 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001252
Guido van Rossum374a9221991-04-04 10:40:29 +00001253 case DELETE_SUBSCR:
1254 w = POP();
1255 v = POP();
1256 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001257 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001258 Py_DECREF(v);
1259 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001260 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001261 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001262
Guido van Rossum374a9221991-04-04 10:40:29 +00001263 case PRINT_EXPR:
1264 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001265 w = PySys_GetObject("displayhook");
1266 if (w == NULL) {
1267 PyErr_SetString(PyExc_RuntimeError,
1268 "lost sys.displayhook");
1269 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001270 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001271 }
1272 if (err == 0) {
1273 x = Py_BuildValue("(O)", v);
1274 if (x == NULL)
1275 err = -1;
1276 }
1277 if (err == 0) {
1278 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001279 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001280 if (w == NULL)
1281 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001282 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001283 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001284 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001285 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001286
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001287 case PRINT_ITEM_TO:
1288 w = stream = POP();
1289 /* fall through to PRINT_ITEM */
1290
Guido van Rossum374a9221991-04-04 10:40:29 +00001291 case PRINT_ITEM:
1292 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001293 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001294 w = PySys_GetObject("stdout");
1295 if (w == NULL) {
1296 PyErr_SetString(PyExc_RuntimeError,
1297 "lost sys.stdout");
1298 err = -1;
1299 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001300 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001301 if (w != NULL && PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001302 err = PyFile_WriteString(" ", w);
1303 if (err == 0)
1304 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001305 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001306 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001307 char *s = PyString_AsString(v);
1308 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001309 if (len > 0 &&
1310 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001311 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001312 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001313 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001314 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001315 Py_XDECREF(stream);
1316 stream = NULL;
1317 if (err == 0)
1318 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001319 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001320
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001321 case PRINT_NEWLINE_TO:
1322 w = stream = POP();
1323 /* fall through to PRINT_NEWLINE */
1324
Guido van Rossum374a9221991-04-04 10:40:29 +00001325 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001326 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001327 w = PySys_GetObject("stdout");
1328 if (w == NULL)
1329 PyErr_SetString(PyExc_RuntimeError,
1330 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001331 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001332 if (w != NULL) {
1333 err = PyFile_WriteString("\n", w);
1334 if (err == 0)
1335 PyFile_SoftSpace(w, 0);
1336 }
1337 Py_XDECREF(stream);
1338 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001339 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001340
Thomas Wouters434d0822000-08-24 20:11:32 +00001341
1342#ifdef CASE_TOO_BIG
1343 default: switch (opcode) {
1344#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001345 case BREAK_LOOP:
1346 why = WHY_BREAK;
1347 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001348
Guido van Rossumf10570b1995-07-07 22:53:21 +00001349 case RAISE_VARARGS:
1350 u = v = w = NULL;
1351 switch (oparg) {
1352 case 3:
1353 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001354 /* Fallthrough */
1355 case 2:
1356 v = POP(); /* value */
1357 /* Fallthrough */
1358 case 1:
1359 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001360 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001361 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001362 break;
1363 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001364 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001365 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001366 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001367 break;
1368 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001369 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001370
Guido van Rossum374a9221991-04-04 10:40:29 +00001371 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001372 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001373 PyErr_SetString(PyExc_SystemError,
1374 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001375 break;
1376 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001377 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001378 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001379 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001380
Guido van Rossum374a9221991-04-04 10:40:29 +00001381 case RETURN_VALUE:
1382 retval = POP();
1383 why = WHY_RETURN;
1384 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001385
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001386 case EXEC_STMT:
1387 w = POP();
1388 v = POP();
1389 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001390 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001391 Py_DECREF(u);
1392 Py_DECREF(v);
1393 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001394 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001395
Guido van Rossum374a9221991-04-04 10:40:29 +00001396 case POP_BLOCK:
1397 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001398 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001399 while (STACK_LEVEL() > b->b_level) {
1400 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001401 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001402 }
1403 }
1404 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001405
Guido van Rossum374a9221991-04-04 10:40:29 +00001406 case END_FINALLY:
1407 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001408 if (PyInt_Check(v)) {
1409 why = (enum why_code) PyInt_AsLong(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001410 if (why == WHY_RETURN)
1411 retval = POP();
1412 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001413 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001414 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001415 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001416 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001417 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001418 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001419 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001420 else if (v != Py_None) {
1421 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001422 "'finally' pops bad exception");
1423 why = WHY_EXCEPTION;
1424 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001425 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001426 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001427
Guido van Rossum374a9221991-04-04 10:40:29 +00001428 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001429 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001430 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001431 w = POP();
1432 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001433 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001434 Py_DECREF(u);
1435 Py_DECREF(v);
1436 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001437 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001438
Guido van Rossum374a9221991-04-04 10:40:29 +00001439 case STORE_NAME:
1440 w = GETNAMEV(oparg);
1441 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001442 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001443 PyErr_Format(PyExc_SystemError,
1444 "no locals found when storing %s",
1445 REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001446 break;
1447 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001448 err = PyDict_SetItem(x, w, v);
1449 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001450 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001451
Guido van Rossum374a9221991-04-04 10:40:29 +00001452 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001453 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001454 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001455 PyErr_Format(PyExc_SystemError,
1456 "no locals when deleting %s",
1457 REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001458 break;
1459 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001460 if ((err = PyDict_DelItem(x, w)) != 0)
Guido van Rossumac7be682001-01-17 15:42:30 +00001461 format_exc_check_arg(PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001462 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001463 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001464
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001465 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001466 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001467 if (PyTuple_Check(v)) {
1468 if (PyTuple_Size(v) != oparg) {
1469 PyErr_SetString(PyExc_ValueError,
1470 "unpack tuple of wrong size");
1471 why = WHY_EXCEPTION;
1472 }
1473 else {
1474 for (; --oparg >= 0; ) {
1475 w = PyTuple_GET_ITEM(v, oparg);
1476 Py_INCREF(w);
1477 PUSH(w);
1478 }
1479 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001480 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001481 else if (PyList_Check(v)) {
1482 if (PyList_Size(v) != oparg) {
1483 PyErr_SetString(PyExc_ValueError,
1484 "unpack list of wrong size");
1485 why = WHY_EXCEPTION;
1486 }
1487 else {
1488 for (; --oparg >= 0; ) {
1489 w = PyList_GET_ITEM(v, oparg);
1490 Py_INCREF(w);
1491 PUSH(w);
1492 }
1493 }
1494 }
1495 else if (PySequence_Check(v)) {
1496 if (unpack_sequence(v, oparg,
1497 stack_pointer + oparg))
1498 stack_pointer += oparg;
1499 else
1500 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001501 }
1502 else {
Barry Warsawe42b18f1997-08-25 22:13:04 +00001503 PyErr_SetString(PyExc_TypeError,
1504 "unpack non-sequence");
1505 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001506 }
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(
1538 PyExc_NameError, 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",
1552 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,
Paul Prescode68140d2000-08-30 20:25:01 +00001580 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
Guido van Rossum374a9221991-04-04 10:40:29 +00001621 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001622 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001623 if (x != NULL) {
1624 for (; --oparg >= 0;) {
1625 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001626 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001627 }
1628 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001629 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001630 }
1631 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001632
Guido van Rossum374a9221991-04-04 10:40:29 +00001633 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001634 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001635 if (x != NULL) {
1636 for (; --oparg >= 0;) {
1637 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001638 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001639 }
1640 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001641 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001642 }
1643 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001644
Guido van Rossum374a9221991-04-04 10:40:29 +00001645 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001646 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001647 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001648 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001649 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001650
Guido van Rossum374a9221991-04-04 10:40:29 +00001651 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001652 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001653 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001654 x = PyObject_GetAttr(v, w);
1655 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001656 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001657 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001658 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001659
Guido van Rossum374a9221991-04-04 10:40:29 +00001660 case COMPARE_OP:
1661 w = POP();
1662 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001663 if (PyInt_Check(v) && PyInt_Check(w)) {
1664 /* INLINE: cmp(int, int) */
1665 register long a, b;
1666 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001667 a = PyInt_AS_LONG(v);
1668 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001669 switch (oparg) {
1670 case LT: res = a < b; break;
1671 case LE: res = a <= b; break;
1672 case EQ: res = a == b; break;
1673 case NE: res = a != b; break;
1674 case GT: res = a > b; break;
1675 case GE: res = a >= b; break;
1676 case IS: res = v == w; break;
1677 case IS_NOT: res = v != w; break;
1678 default: goto slow_compare;
1679 }
1680 x = res ? Py_True : Py_False;
1681 Py_INCREF(x);
1682 }
1683 else {
1684 slow_compare:
1685 x = cmp_outcome(oparg, v, w);
1686 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001687 Py_DECREF(v);
1688 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001689 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001690 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001691 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001692
Guido van Rossum374a9221991-04-04 10:40:29 +00001693 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001694 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001695 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001696 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001697 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001698 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001699 break;
1700 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001701 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001702 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001703 w,
1704 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001705 f->f_locals == NULL ?
1706 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001707 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001708 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001709 if (w == NULL) {
1710 x = NULL;
1711 break;
1712 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001713 x = PyEval_CallObject(x, w);
1714 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001715 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001716 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001717 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001718
Thomas Wouters52152252000-08-17 22:55:00 +00001719 case IMPORT_STAR:
1720 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001721 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001722 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001723 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001724 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001725 break;
1726 }
Thomas Wouters52152252000-08-17 22:55:00 +00001727 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001728 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001729 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001730 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001731 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001732
Thomas Wouters52152252000-08-17 22:55:00 +00001733 case IMPORT_FROM:
1734 w = GETNAMEV(oparg);
1735 v = TOP();
1736 x = import_from(v, w);
1737 PUSH(x);
1738 if (x != NULL) continue;
1739 break;
1740
Guido van Rossum374a9221991-04-04 10:40:29 +00001741 case JUMP_FORWARD:
1742 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001743 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001744
Guido van Rossum374a9221991-04-04 10:40:29 +00001745 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001746 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001747 if (err > 0)
1748 err = 0;
1749 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001750 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001751 else
1752 break;
1753 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001754
Guido van Rossum374a9221991-04-04 10:40:29 +00001755 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001756 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001757 if (err > 0) {
1758 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001759 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001760 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001761 else if (err == 0)
1762 ;
1763 else
1764 break;
1765 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001766
Guido van Rossum374a9221991-04-04 10:40:29 +00001767 case JUMP_ABSOLUTE:
1768 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001769 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001770
Guido van Rossum374a9221991-04-04 10:40:29 +00001771 case FOR_LOOP:
1772 /* for v in s: ...
1773 On entry: stack contains s, i.
1774 On exit: stack contains s, i+1, s[i];
1775 but if loop exhausted:
1776 s, i are popped, and we jump */
1777 w = POP(); /* Loop index */
1778 v = POP(); /* Sequence object */
1779 u = loop_subscript(v, w);
1780 if (u != NULL) {
1781 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001782 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001783 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001784 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001785 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001786 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001787 }
1788 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001789 Py_DECREF(v);
1790 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001791 /* A NULL can mean "s exhausted"
1792 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001793 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001794 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001795 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001796 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001797 continue;
1798 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001799 }
1800 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001801
Guido van Rossum374a9221991-04-04 10:40:29 +00001802 case SETUP_LOOP:
1803 case SETUP_EXCEPT:
1804 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001805 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Guido van Rossum374a9221991-04-04 10:40:29 +00001806 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001807 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001808
Guido van Rossum374a9221991-04-04 10:40:29 +00001809 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001810#ifdef LLTRACE
1811 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001812 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001813#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001814 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001815 if (f->f_trace == NULL)
1816 continue;
1817 /* Trace each line of code reached */
1818 f->f_lasti = INSTR_OFFSET();
1819 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossumb209a111997-04-29 18:18:01 +00001820 f, "line", Py_None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001821 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001822
1823 case CALL_FUNCTION:
Jeremy Hylton52820442001-01-03 23:52:36 +00001824 {
1825 int na = oparg & 0xff;
1826 int nk = (oparg>>8) & 0xff;
1827 int n = na + 2 * nk;
1828 PyObject **pfunc = stack_pointer - n - 1;
1829 PyObject *func = *pfunc;
1830 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1831
1832 /* Always dispatch PyCFunction first, because
1833 these are presumed to be the most frequent
1834 callable object.
1835 */
1836 if (PyCFunction_Check(func)) {
1837 if (PyCFunction_GET_FLAGS(func) == 0) {
1838 x = fast_cfunction(func,
Guido van Rossumac7be682001-01-17 15:42:30 +00001839 &stack_pointer, na);
Jeremy Hylton52820442001-01-03 23:52:36 +00001840 } else {
1841 x = do_call(func, &stack_pointer,
1842 na, nk);
1843 }
1844 } else {
Guido van Rossumac7be682001-01-17 15:42:30 +00001845 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001846 && PyMethod_GET_SELF(func) != NULL) {
1847 /* optimize access to bound methods */
1848 PyObject *self = PyMethod_GET_SELF(func);
1849 Py_INCREF(self);
1850 func = PyMethod_GET_FUNCTION(func);
1851 Py_INCREF(func);
1852 Py_DECREF(*pfunc);
1853 *pfunc = self;
1854 na++;
1855 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00001856 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00001857 Py_INCREF(func);
1858 if (PyFunction_Check(func)) {
1859 x = fast_function(func, &stack_pointer,
Guido van Rossumac7be682001-01-17 15:42:30 +00001860 n, na, nk);
Jeremy Hylton52820442001-01-03 23:52:36 +00001861 } else {
1862 x = do_call(func, &stack_pointer,
1863 na, nk);
1864 }
1865 Py_DECREF(func);
1866 }
1867
1868 while (stack_pointer > pfunc) {
1869 w = POP();
1870 Py_DECREF(w);
1871 }
1872 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00001873 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00001874 continue;
1875 break;
1876 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001877
Jeremy Hylton76901512000-03-28 23:49:17 +00001878 case CALL_FUNCTION_VAR:
1879 case CALL_FUNCTION_KW:
1880 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001881 {
Jeremy Hylton76901512000-03-28 23:49:17 +00001882 int na = oparg & 0xff;
1883 int nk = (oparg>>8) & 0xff;
1884 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00001885 int n = na + 2 * nk;
1886 PyObject **pfunc, *func;
1887 if (flags & CALL_FLAG_VAR)
1888 n++;
1889 if (flags & CALL_FLAG_KW)
1890 n++;
1891 pfunc = stack_pointer - n - 1;
1892 func = *pfunc;
Jeremy Hylton76901512000-03-28 23:49:17 +00001893 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Jeremy Hylton52820442001-01-03 23:52:36 +00001894
Guido van Rossumac7be682001-01-17 15:42:30 +00001895 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001896 && PyMethod_GET_SELF(func) != NULL) {
1897 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00001898 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00001899 func = PyMethod_GET_FUNCTION(func);
1900 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00001901 Py_DECREF(*pfunc);
1902 *pfunc = self;
1903 na++;
1904 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00001905 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00001906 Py_INCREF(func);
1907 x = ext_do_call(func, &stack_pointer, flags, na, nk);
Jeremy Hylton76901512000-03-28 23:49:17 +00001908 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00001909
Jeremy Hylton76901512000-03-28 23:49:17 +00001910 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00001911 w = POP();
1912 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00001913 }
1914 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00001915 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00001916 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00001917 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001918 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001919
Guido van Rossum681d79a1995-07-18 14:51:37 +00001920 case MAKE_FUNCTION:
1921 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00001922 x = PyFunction_New(v, f->f_globals);
1923 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001924 /* XXX Maybe this should be a separate opcode? */
1925 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001926 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001927 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001928 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001929 x = NULL;
1930 break;
1931 }
1932 while (--oparg >= 0) {
1933 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001934 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001935 }
1936 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001937 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001938 }
1939 PUSH(x);
1940 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001941
1942 case BUILD_SLICE:
1943 if (oparg == 3)
1944 w = POP();
1945 else
1946 w = NULL;
1947 v = POP();
1948 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00001949 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001950 Py_DECREF(u);
1951 Py_DECREF(v);
1952 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00001953 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001954 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00001955 break;
1956
Fred Drakeef8ace32000-08-24 00:32:09 +00001957 case EXTENDED_ARG:
1958 opcode = NEXTOP();
1959 oparg = oparg<<16 | NEXTARG();
1960 goto dispatch_opcode;
1961 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001962
Guido van Rossum374a9221991-04-04 10:40:29 +00001963 default:
1964 fprintf(stderr,
1965 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001966 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00001967 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00001968 why = WHY_EXCEPTION;
1969 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001970
1971#ifdef CASE_TOO_BIG
1972 }
1973#endif
1974
Guido van Rossum374a9221991-04-04 10:40:29 +00001975 } /* switch */
1976
1977 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00001978
Guido van Rossum374a9221991-04-04 10:40:29 +00001979 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00001980
Guido van Rossum374a9221991-04-04 10:40:29 +00001981 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001982 if (err == 0 && x != NULL) {
1983#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00001984 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00001985 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00001986 fprintf(stderr,
1987 "XXX undetected error\n");
1988 else
1989#endif
1990 continue; /* Normal, fast path */
1991 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001992 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00001993 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00001994 err = 0;
1995 }
1996
Guido van Rossum374a9221991-04-04 10:40:29 +00001997 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00001998
Guido van Rossum374a9221991-04-04 10:40:29 +00001999 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002000 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002001 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002002 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002003 why = WHY_EXCEPTION;
2004 }
2005 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002006#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002007 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002008 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002009 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002010 fprintf(stderr,
2011 "XXX undetected error (why=%d)\n",
2012 why);
2013 why = WHY_EXCEPTION;
2014 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002015 }
2016#endif
2017
2018 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002019
Guido van Rossum374a9221991-04-04 10:40:29 +00002020 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002021 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00002022 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00002023 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00002024 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002025
Guido van Rossume59214e1994-08-30 08:01:59 +00002026 if (f->f_trace)
2027 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002028 if (tstate->sys_profilefunc)
2029 call_exc_trace(&tstate->sys_profilefunc,
2030 (PyObject**)0, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002031 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002032
Guido van Rossum374a9221991-04-04 10:40:29 +00002033 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002034
Guido van Rossum374a9221991-04-04 10:40:29 +00002035 if (why == WHY_RERAISE)
2036 why = WHY_EXCEPTION;
2037
2038 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002039
Guido van Rossum374a9221991-04-04 10:40:29 +00002040 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002041 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00002042 while (STACK_LEVEL() > b->b_level) {
2043 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002044 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002045 }
2046 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2047 why = WHY_NOT;
2048 JUMPTO(b->b_handler);
2049 break;
2050 }
2051 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002052 (b->b_type == SETUP_EXCEPT &&
2053 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002054 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002055 PyObject *exc, *val, *tb;
2056 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002057 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002058 val = Py_None;
2059 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002060 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002061 /* Make the raw exception data
2062 available to the handler,
2063 so a program can emulate the
2064 Python main loop. Don't do
2065 this for 'finally'. */
2066 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002067 PyErr_NormalizeException(
2068 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002069 set_exc_info(tstate,
2070 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002071 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002072 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002073 PUSH(val);
2074 PUSH(exc);
2075 }
2076 else {
2077 if (why == WHY_RETURN)
2078 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002079 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002080 PUSH(v);
2081 }
2082 why = WHY_NOT;
2083 JUMPTO(b->b_handler);
2084 break;
2085 }
2086 } /* unwind stack */
2087
2088 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002089
Guido van Rossum374a9221991-04-04 10:40:29 +00002090 if (why != WHY_NOT)
2091 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002092
Guido van Rossum374a9221991-04-04 10:40:29 +00002093 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002094
Guido van Rossum374a9221991-04-04 10:40:29 +00002095 /* Pop remaining stack entries */
Guido van Rossumac7be682001-01-17 15:42:30 +00002096
Guido van Rossum374a9221991-04-04 10:40:29 +00002097 while (!EMPTY()) {
2098 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002099 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002100 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002101
Guido van Rossum96a42c81992-01-12 02:29:51 +00002102 if (why != WHY_RETURN)
2103 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002104
Guido van Rossume59214e1994-08-30 08:01:59 +00002105 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002106 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00002107 if (call_trace(&f->f_trace, &f->f_trace, f,
2108 "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002109 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002110 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002111 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002112 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002113 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002114 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002115
Guido van Rossuma027efa1997-05-05 20:56:21 +00002116 if (tstate->sys_profilefunc && why == WHY_RETURN) {
2117 if (call_trace(&tstate->sys_profilefunc, (PyObject**)0,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002118 f, "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002119 Py_XDECREF(retval);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002120 retval = NULL;
2121 why = WHY_EXCEPTION;
2122 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002123 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002124
Guido van Rossuma027efa1997-05-05 20:56:21 +00002125 reset_exc_info(tstate);
2126
2127 --tstate->recursion_depth;
Guido van Rossum8c5df061997-01-24 04:19:24 +00002128
2129 fail: /* Jump here from prelude on failure */
Guido van Rossumac7be682001-01-17 15:42:30 +00002130
Guido van Rossum374a9221991-04-04 10:40:29 +00002131 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00002132
Guido van Rossuma027efa1997-05-05 20:56:21 +00002133 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +00002134 Py_DECREF(f);
Guido van Rossumac7be682001-01-17 15:42:30 +00002135
Guido van Rossum96a42c81992-01-12 02:29:51 +00002136 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002137}
2138
Guido van Rossuma027efa1997-05-05 20:56:21 +00002139static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002140set_exc_info(PyThreadState *tstate,
2141 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002142{
2143 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002144 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002145
Guido van Rossuma027efa1997-05-05 20:56:21 +00002146 frame = tstate->frame;
2147 if (frame->f_exc_type == NULL) {
2148 /* This frame didn't catch an exception before */
2149 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002150 if (tstate->exc_type == NULL) {
2151 Py_INCREF(Py_None);
2152 tstate->exc_type = Py_None;
2153 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002154 tmp_type = frame->f_exc_type;
2155 tmp_value = frame->f_exc_value;
2156 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002157 Py_XINCREF(tstate->exc_type);
2158 Py_XINCREF(tstate->exc_value);
2159 Py_XINCREF(tstate->exc_traceback);
2160 frame->f_exc_type = tstate->exc_type;
2161 frame->f_exc_value = tstate->exc_value;
2162 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002163 Py_XDECREF(tmp_type);
2164 Py_XDECREF(tmp_value);
2165 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002166 }
2167 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002168 tmp_type = tstate->exc_type;
2169 tmp_value = tstate->exc_value;
2170 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002171 Py_XINCREF(type);
2172 Py_XINCREF(value);
2173 Py_XINCREF(tb);
2174 tstate->exc_type = type;
2175 tstate->exc_value = value;
2176 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002177 Py_XDECREF(tmp_type);
2178 Py_XDECREF(tmp_value);
2179 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002180 /* For b/w compatibility */
2181 PySys_SetObject("exc_type", type);
2182 PySys_SetObject("exc_value", value);
2183 PySys_SetObject("exc_traceback", tb);
2184}
2185
2186static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002187reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002188{
2189 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002190 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002191 frame = tstate->frame;
2192 if (frame->f_exc_type != NULL) {
2193 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002194 tmp_type = tstate->exc_type;
2195 tmp_value = tstate->exc_value;
2196 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002197 Py_XINCREF(frame->f_exc_type);
2198 Py_XINCREF(frame->f_exc_value);
2199 Py_XINCREF(frame->f_exc_traceback);
2200 tstate->exc_type = frame->f_exc_type;
2201 tstate->exc_value = frame->f_exc_value;
2202 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002203 Py_XDECREF(tmp_type);
2204 Py_XDECREF(tmp_value);
2205 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002206 /* For b/w compatibility */
2207 PySys_SetObject("exc_type", frame->f_exc_type);
2208 PySys_SetObject("exc_value", frame->f_exc_value);
2209 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2210 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002211 tmp_type = frame->f_exc_type;
2212 tmp_value = frame->f_exc_value;
2213 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002214 frame->f_exc_type = NULL;
2215 frame->f_exc_value = NULL;
2216 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002217 Py_XDECREF(tmp_type);
2218 Py_XDECREF(tmp_value);
2219 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002220}
2221
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002222/* Logic for the raise statement (too complicated for inlining).
2223 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002224static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002225do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002226{
Guido van Rossumd295f121998-04-09 21:39:57 +00002227 if (type == NULL) {
2228 /* Reraise */
2229 PyThreadState *tstate = PyThreadState_Get();
2230 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2231 value = tstate->exc_value;
2232 tb = tstate->exc_traceback;
2233 Py_XINCREF(type);
2234 Py_XINCREF(value);
2235 Py_XINCREF(tb);
2236 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002237
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002238 /* We support the following forms of raise:
2239 raise <class>, <classinstance>
2240 raise <class>, <argument tuple>
2241 raise <class>, None
2242 raise <class>, <argument>
2243 raise <classinstance>, None
2244 raise <string>, <object>
2245 raise <string>, None
2246
2247 An omitted second argument is the same as None.
2248
2249 In addition, raise <tuple>, <anything> is the same as
2250 raising the tuple's first item (and it better have one!);
2251 this rule is applied recursively.
2252
2253 Finally, an optional third argument can be supplied, which
2254 gives the traceback to be substituted (useful when
2255 re-raising an exception after examining it). */
2256
2257 /* First, check the traceback argument, replacing None with
2258 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002259 if (tb == Py_None) {
2260 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002261 tb = NULL;
2262 }
2263 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002264 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002265 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002266 goto raise_error;
2267 }
2268
2269 /* Next, replace a missing value with None */
2270 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002271 value = Py_None;
2272 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002273 }
2274
2275 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002276 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2277 PyObject *tmp = type;
2278 type = PyTuple_GET_ITEM(type, 0);
2279 Py_INCREF(type);
2280 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002281 }
2282
Barry Warsaw4249f541997-08-22 21:26:19 +00002283 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002284 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002285
2286 else if (PyClass_Check(type))
2287 PyErr_NormalizeException(&type, &value, &tb);
2288
Guido van Rossumb209a111997-04-29 18:18:01 +00002289 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002290 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002291 if (value != Py_None) {
2292 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002293 "instance exception may not have a separate value");
2294 goto raise_error;
2295 }
2296 else {
2297 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002298 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002299 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002300 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2301 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002302 }
2303 }
2304 else {
2305 /* Not something you can raise. You get an exception
2306 anyway, just not what you specified :-) */
Guido van Rossumb209a111997-04-29 18:18:01 +00002307 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002308 "exceptions must be strings, classes, or instances");
2309 goto raise_error;
2310 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002311 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002312 if (tb == NULL)
2313 return WHY_EXCEPTION;
2314 else
2315 return WHY_RERAISE;
2316 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002317 Py_XDECREF(value);
2318 Py_XDECREF(type);
2319 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002320 return WHY_EXCEPTION;
2321}
2322
Barry Warsawe42b18f1997-08-25 22:13:04 +00002323static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002324unpack_sequence(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002325{
2326 int i;
2327 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00002328
Barry Warsawe42b18f1997-08-25 22:13:04 +00002329 for (i = 0; i < argcnt; i++) {
2330 if (! (w = PySequence_GetItem(v, i))) {
2331 if (PyErr_ExceptionMatches(PyExc_IndexError))
2332 PyErr_SetString(PyExc_ValueError,
2333 "unpack sequence of wrong size");
2334 goto finally;
2335 }
2336 *--sp = w;
2337 }
2338 /* we better get an IndexError now */
2339 if (PySequence_GetItem(v, i) == NULL) {
2340 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2341 PyErr_Clear();
2342 return 1;
2343 }
2344 /* some other exception occurred. fall through to finally */
2345 }
2346 else
2347 PyErr_SetString(PyExc_ValueError,
2348 "unpack sequence of wrong size");
2349 /* fall through */
2350finally:
Barry Warsaw91010551997-08-25 22:30:51 +00002351 for (; i > 0; i--, sp++)
2352 Py_DECREF(*sp);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002353
2354 return 0;
2355}
2356
2357
Guido van Rossum96a42c81992-01-12 02:29:51 +00002358#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002359static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002360prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002361{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002362 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002363 if (PyObject_Print(v, stdout, 0) != 0)
2364 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002365 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002366 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002367}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002368#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002369
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002370static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002371call_exc_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002372{
Guido van Rossumb209a111997-04-29 18:18:01 +00002373 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002374 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002375 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002376 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002377 value = Py_None;
2378 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002379 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002380 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002381 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002382 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002383 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002384 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002385 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002386 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002387 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002388 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002389 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002390 Py_XDECREF(type);
2391 Py_XDECREF(value);
2392 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002393 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002394}
2395
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002396/* PyObject **p_trace: in/out; may not be NULL;
2397 may not point to NULL variable initially
2398 PyObject **p_newtrace: in/out; may be NULL;
2399 may point to NULL variable;
2400 may be same variable as p_newtrace */
2401
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002402static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002403call_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f,
2404 char *msg, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002405{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002406 PyThreadState *tstate = f->f_tstate;
Guido van Rossumb209a111997-04-29 18:18:01 +00002407 PyObject *args, *what;
2408 PyObject *res = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002409
Guido van Rossuma027efa1997-05-05 20:56:21 +00002410 if (tstate->tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002411 /* Don't do recursive traces */
2412 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002413 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002414 *p_newtrace = NULL;
2415 }
2416 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002417 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002418
Guido van Rossumb209a111997-04-29 18:18:01 +00002419 args = PyTuple_New(3);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002420 if (args == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002421 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002422 what = PyString_FromString(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002423 if (what == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002424 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002425 Py_INCREF(f);
2426 PyTuple_SET_ITEM(args, 0, (PyObject *)f);
2427 PyTuple_SET_ITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002428 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002429 arg = Py_None;
2430 Py_INCREF(arg);
2431 PyTuple_SET_ITEM(args, 2, arg);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002432 tstate->tracing++;
Guido van Rossumb209a111997-04-29 18:18:01 +00002433 PyFrame_FastToLocals(f);
2434 res = PyEval_CallObject(*p_trace, args); /* May clear *p_trace! */
2435 PyFrame_LocalsToFast(f, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002436 tstate->tracing--;
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002437 cleanup:
Guido van Rossumb209a111997-04-29 18:18:01 +00002438 Py_XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002439 if (res == NULL) {
2440 /* The trace proc raised an exception */
Guido van Rossumb209a111997-04-29 18:18:01 +00002441 PyTraceBack_Here(f);
2442 Py_XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002443 *p_trace = NULL;
2444 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002445 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002446 *p_newtrace = NULL;
2447 }
Barry Warsawf6202631999-09-08 16:26:33 +00002448 /* to be extra double plus sure we don't get recursive
2449 * calls inf either tracefunc or profilefunc gets an
2450 * exception, zap the global variables.
2451 */
2452 Py_XDECREF(tstate->sys_tracefunc);
2453 tstate->sys_tracefunc = NULL;
2454 Py_XDECREF(tstate->sys_profilefunc);
2455 tstate->sys_profilefunc = NULL;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002456 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002457 }
2458 else {
2459 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002460 Py_XDECREF(*p_newtrace);
2461 if (res == Py_None)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002462 *p_newtrace = NULL;
2463 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002464 Py_INCREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002465 *p_newtrace = res;
2466 }
2467 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002468 Py_DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002469 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002470 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002471}
2472
Guido van Rossumb209a111997-04-29 18:18:01 +00002473PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002474PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002475{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002476 PyThreadState *tstate = PyThreadState_Get();
2477 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002478 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002479 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002480 else
2481 return current_frame->f_builtins;
2482}
2483
Guido van Rossumb209a111997-04-29 18:18:01 +00002484PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002485PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002486{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002487 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002488 if (current_frame == NULL)
2489 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002490 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002491 return current_frame->f_locals;
2492}
2493
Guido van Rossumb209a111997-04-29 18:18:01 +00002494PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002495PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002496{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002497 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002498 if (current_frame == NULL)
2499 return NULL;
2500 else
2501 return current_frame->f_globals;
2502}
2503
Guido van Rossumb209a111997-04-29 18:18:01 +00002504PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002505PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002506{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002507 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002508 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002509}
2510
Guido van Rossum6135a871995-01-09 17:53:26 +00002511int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002512PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002513{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002514 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002515 return current_frame == NULL ? 0 : current_frame->f_restricted;
2516}
2517
Guido van Rossumbe270261997-05-22 22:26:18 +00002518int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002519Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002520{
Guido van Rossumb209a111997-04-29 18:18:01 +00002521 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002522 if (f == NULL)
2523 return 0;
2524 if (!PyFile_SoftSpace(f, 0))
2525 return 0;
2526 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002527}
2528
Guido van Rossum3f5da241990-12-20 15:06:42 +00002529
Guido van Rossum681d79a1995-07-18 14:51:37 +00002530/* External interface to call any callable object.
2531 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002532
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002533#undef PyEval_CallObject
2534/* for backward compatibility: export this interface */
2535
Guido van Rossumb209a111997-04-29 18:18:01 +00002536PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002537PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002538{
Guido van Rossumb209a111997-04-29 18:18:01 +00002539 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002540}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002541#define PyEval_CallObject(func,arg) \
2542 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002543
Guido van Rossumb209a111997-04-29 18:18:01 +00002544PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002545PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002546{
Jeremy Hylton52820442001-01-03 23:52:36 +00002547 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002548
2549 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002550 arg = PyTuple_New(0);
2551 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002552 PyErr_SetString(PyExc_TypeError,
2553 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002554 return NULL;
2555 }
2556 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002557 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002558
Guido van Rossumb209a111997-04-29 18:18:01 +00002559 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002560 PyErr_SetString(PyExc_TypeError,
2561 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00002562 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002563 return NULL;
2564 }
2565
Jeremy Hylton52820442001-01-03 23:52:36 +00002566 result = call_object(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002567 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00002568 return result;
2569}
2570
2571/* How often is each kind of object called? The answer depends on the
2572 program. An instrumented call_object() was used to run the Python
2573 regression test suite. The results were:
2574 4200000 PyCFunctions
2575 390000 fast_function() calls
2576 94000 other functions
2577 480000 all functions (sum of prev two)
2578 150000 methods
2579 100000 classes
2580
2581 Tests on other bodies of code show that PyCFunctions are still
2582 most common, but not by such a large margin.
2583*/
2584
2585static PyObject *
2586call_object(PyObject *func, PyObject *arg, PyObject *kw)
2587{
2588 ternaryfunc call;
2589 PyObject *result;
2590
2591 if (PyMethod_Check(func))
2592 result = call_method(func, arg, kw);
2593 else if (PyFunction_Check(func))
2594 result = call_eval_code2(func, arg, kw);
2595 else if (PyCFunction_Check(func))
2596 result = call_cfunction(func, arg, kw);
2597 else if (PyClass_Check(func))
2598 result = PyInstance_New(func, arg, kw);
2599 else if (PyInstance_Check(func))
2600 result = call_instance(func, arg, kw);
2601 else if ((call = func->ob_type->tp_call) != NULL)
2602 result = (*call)(func, arg, kw);
2603 else {
2604 PyErr_Format(PyExc_TypeError, "object is not callable: %s",
2605 PyString_AS_STRING(PyObject_Repr(func)));
2606 return NULL;
2607 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002608 if (result == NULL && !PyErr_Occurred())
2609 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002610 "NULL result without error in call_object");
Guido van Rossumac7be682001-01-17 15:42:30 +00002611
Guido van Rossume59214e1994-08-30 08:01:59 +00002612 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002613}
2614
Guido van Rossumb209a111997-04-29 18:18:01 +00002615static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00002616call_cfunction(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002617{
Jeremy Hylton52820442001-01-03 23:52:36 +00002618 PyCFunctionObject* f = (PyCFunctionObject*)func;
2619 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
2620 PyObject *self = PyCFunction_GET_SELF(func);
2621 int flags = PyCFunction_GET_FLAGS(func);
2622
Jeremy Hylton52820442001-01-03 23:52:36 +00002623 if (flags & METH_KEYWORDS) {
Fred Drake1a7aab72001-01-04 22:33:02 +00002624 if (kw == NULL) {
2625 static PyObject *dict = NULL;
2626 if (dict == NULL) {
2627 dict = PyDict_New();
2628 if (dict == NULL)
2629 return NULL;
2630 }
2631 kw = dict;
2632 Py_INCREF(dict);
2633 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002634 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002635 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002636 if (kw != NULL && PyDict_Size(kw) != 0) {
2637 PyErr_Format(PyExc_TypeError,
2638 "%.200s() takes no keyword arguments",
2639 f->m_ml->ml_name);
2640 return NULL;
2641 }
Fred Drake1a7aab72001-01-04 22:33:02 +00002642 if (flags & METH_VARARGS) {
2643 return (*meth)(self, arg);
2644 }
2645 if (!(flags & METH_VARARGS)) {
2646 /* the really old style */
2647 int size = PyTuple_GET_SIZE(arg);
2648 if (size == 1)
2649 arg = PyTuple_GET_ITEM(arg, 0);
2650 else if (size == 0)
2651 arg = NULL;
2652 return (*meth)(self, arg);
2653 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002654 /* should never get here ??? */
2655 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002656 return NULL;
2657}
2658
Guido van Rossumb209a111997-04-29 18:18:01 +00002659static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00002660call_instance(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002661{
Jeremy Hylton52820442001-01-03 23:52:36 +00002662 PyObject *res, *call = PyObject_GetAttrString(func, "__call__");
2663 if (call == NULL) {
2664 PyInstanceObject *inst = (PyInstanceObject*) func;
2665 PyErr_Clear();
2666 PyErr_Format(PyExc_AttributeError,
2667 "%.200s instance has no __call__ method",
2668 PyString_AsString(inst->in_class->cl_name));
Guido van Rossum681d79a1995-07-18 14:51:37 +00002669 return NULL;
2670 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002671 res = call_object(call, arg, kw);
2672 Py_DECREF(call);
2673 return res;
2674}
2675
2676static PyObject *
2677call_method(PyObject *func, PyObject *arg, PyObject *kw)
2678{
2679 PyObject *self = PyMethod_GET_SELF(func);
2680 PyObject *class = PyMethod_GET_CLASS(func);
2681 PyObject *result;
2682
2683 func = PyMethod_GET_FUNCTION(func);
2684 if (self == NULL) {
2685 /* Unbound methods must be called with an instance of
2686 the class (or a derived class) as first argument */
2687 if (PyTuple_Size(arg) >= 1)
2688 self = PyTuple_GET_ITEM(arg, 0);
2689 if (!(self != NULL && PyInstance_Check(self)
2690 && PyClass_IsSubclass((PyObject *)
2691 (((PyInstanceObject *)self)->in_class),
2692 class))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00002693 PyObject* fn = ((PyFunctionObject*) func)->func_name;
2694 PyErr_Format(PyExc_TypeError,
2695 "unbound method %s%smust be "
2696 "called with instance as first argument",
2697 fn ? PyString_AsString(fn) : "",
2698 fn ? "() " : "");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002699 return NULL;
2700 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002701 Py_INCREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00002702 } else {
2703 int argcount = PyTuple_Size(arg);
2704 PyObject *newarg = PyTuple_New(argcount + 1);
2705 int i;
2706 if (newarg == NULL)
2707 return NULL;
2708 Py_INCREF(self);
2709 PyTuple_SET_ITEM(newarg, 0, self);
2710 for (i = 0; i < argcount; i++) {
2711 PyObject *v = PyTuple_GET_ITEM(arg, i);
2712 Py_XINCREF(v);
2713 PyTuple_SET_ITEM(newarg, i+1, v);
2714 }
2715 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002716 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002717 result = call_object(func, arg, kw);
2718 Py_DECREF(arg);
2719 return result;
2720}
2721
2722static PyObject *
2723call_eval_code2(PyObject *func, PyObject *arg, PyObject *kw)
2724{
2725 PyObject *result;
2726 PyObject *argdefs;
2727 PyObject **d, **k;
2728 int nk, nd;
2729
2730 argdefs = PyFunction_GET_DEFAULTS(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00002731 if (argdefs != NULL && PyTuple_Check(argdefs)) {
2732 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
2733 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002734 }
2735 else {
2736 d = NULL;
2737 nd = 0;
2738 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002739
Guido van Rossum681d79a1995-07-18 14:51:37 +00002740 if (kw != NULL) {
2741 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002742 nk = PyDict_Size(kw);
2743 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002744 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002745 PyErr_NoMemory();
2746 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002747 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002748 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002749 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002750 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002751 i += 2;
2752 nk = i/2;
2753 /* XXX This is broken if the caller deletes dict items! */
2754 }
2755 else {
2756 k = NULL;
2757 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002758 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002759
Guido van Rossum681d79a1995-07-18 14:51:37 +00002760 result = eval_code2(
Jeremy Hylton52820442001-01-03 23:52:36 +00002761 (PyCodeObject *)PyFunction_GET_CODE(func),
2762 PyFunction_GET_GLOBALS(func), (PyObject *)NULL,
Guido van Rossumb209a111997-04-29 18:18:01 +00002763 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Guido van Rossum681d79a1995-07-18 14:51:37 +00002764 k, nk,
Jeremy Hylton52820442001-01-03 23:52:36 +00002765 d, nd);
Guido van Rossumac7be682001-01-17 15:42:30 +00002766
Guido van Rossumb18618d2000-05-03 23:44:39 +00002767 if (k != NULL)
2768 PyMem_DEL(k);
Guido van Rossumac7be682001-01-17 15:42:30 +00002769
Guido van Rossum681d79a1995-07-18 14:51:37 +00002770 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002771}
2772
Jeremy Hylton52820442001-01-03 23:52:36 +00002773#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
2774
2775/* The two fast_xxx() functions optimize calls for which no argument
2776 tuple is necessary; the objects are passed directly from the stack.
2777 fast_cfunction() is called for METH_OLDARGS functions.
2778 fast_function() is for functions with no special argument handling.
2779*/
2780
2781static PyObject *
2782fast_cfunction(PyObject *func, PyObject ***pp_stack, int na)
2783{
2784 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
2785 PyObject *self = PyCFunction_GET_SELF(func);
2786
2787 if (na == 0)
2788 return (*meth)(self, NULL);
Charles G. Waldmaneec72a72001-01-10 22:11:59 +00002789 else if (na == 1) {
2790 PyObject *arg = EXT_POP(*pp_stack);
Guido van Rossumac7be682001-01-17 15:42:30 +00002791 PyObject *result = (*meth)(self, arg);
Charles G. Waldmaneec72a72001-01-10 22:11:59 +00002792 Py_DECREF(arg);
2793 return result;
2794 } else {
Jeremy Hylton52820442001-01-03 23:52:36 +00002795 PyObject *args = load_args(pp_stack, na);
2796 PyObject *result = (*meth)(self, args);
2797 Py_DECREF(args);
2798 return result;
2799 }
2800}
2801
2802static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00002803fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00002804{
2805 PyObject *co = PyFunction_GET_CODE(func);
2806 PyObject *globals = PyFunction_GET_GLOBALS(func);
2807 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
2808 PyObject **d = NULL;
2809 int nd = 0;
2810
2811 if (argdefs != NULL) {
2812 d = &PyTuple_GET_ITEM(argdefs, 0);
2813 nd = ((PyTupleObject *)argdefs)->ob_size;
2814 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002815 return eval_code2((PyCodeObject *)co, globals,
Jeremy Hylton52820442001-01-03 23:52:36 +00002816 (PyObject *)NULL, (*pp_stack)-n, na,
2817 (*pp_stack)-2*nk, nk, d, nd);
2818}
2819
2820static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00002821update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
2822 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00002823{
2824 PyObject *kwdict = NULL;
2825 if (orig_kwdict == NULL)
2826 kwdict = PyDict_New();
2827 else {
2828 kwdict = PyDict_Copy(orig_kwdict);
2829 Py_DECREF(orig_kwdict);
2830 }
2831 if (kwdict == NULL)
2832 return NULL;
2833 while (--nk >= 0) {
2834 int err;
2835 PyObject *value = EXT_POP(*pp_stack);
2836 PyObject *key = EXT_POP(*pp_stack);
2837 if (PyDict_GetItem(kwdict, key) != NULL) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00002838 PyObject* fn = ((PyFunctionObject*) func)->func_name;
Guido van Rossumac7be682001-01-17 15:42:30 +00002839 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00002840 "%.200s%s got multiple values "
2841 "for keyword argument '%.400s'",
2842 fn ? PyString_AsString(fn) : "function",
2843 fn ? "()" : "", PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00002844 Py_DECREF(key);
2845 Py_DECREF(value);
2846 Py_DECREF(kwdict);
2847 return NULL;
2848 }
2849 err = PyDict_SetItem(kwdict, key, value);
2850 Py_DECREF(key);
2851 Py_DECREF(value);
2852 if (err) {
2853 Py_DECREF(kwdict);
2854 return NULL;
2855 }
2856 }
2857 return kwdict;
2858}
2859
2860static PyObject *
2861update_star_args(int nstack, int nstar, PyObject *stararg,
2862 PyObject ***pp_stack)
2863{
2864 PyObject *callargs, *w;
2865
2866 callargs = PyTuple_New(nstack + nstar);
2867 if (callargs == NULL) {
2868 return NULL;
2869 }
2870 if (nstar) {
2871 int i;
2872 for (i = 0; i < nstar; i++) {
2873 PyObject *a = PyTuple_GET_ITEM(stararg, i);
2874 Py_INCREF(a);
2875 PyTuple_SET_ITEM(callargs, nstack + i, a);
2876 }
2877 }
2878 while (--nstack >= 0) {
2879 w = EXT_POP(*pp_stack);
2880 PyTuple_SET_ITEM(callargs, nstack, w);
2881 }
2882 return callargs;
2883}
2884
2885static PyObject *
2886load_args(PyObject ***pp_stack, int na)
2887{
2888 PyObject *args = PyTuple_New(na);
2889 PyObject *w;
2890
2891 if (args == NULL)
2892 return NULL;
2893 while (--na >= 0) {
2894 w = EXT_POP(*pp_stack);
2895 PyTuple_SET_ITEM(args, na, w);
2896 }
2897 return args;
2898}
2899
2900static PyObject *
2901do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
2902{
2903 PyObject *callargs = NULL;
2904 PyObject *kwdict = NULL;
2905 PyObject *result = NULL;
2906
2907 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00002908 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002909 if (kwdict == NULL)
2910 goto call_fail;
2911 }
2912 callargs = load_args(pp_stack, na);
2913 if (callargs == NULL)
2914 goto call_fail;
2915 result = call_object(func, callargs, kwdict);
2916 call_fail:
2917 Py_XDECREF(callargs);
2918 Py_XDECREF(kwdict);
2919 return result;
2920}
2921
2922static PyObject *
2923ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
2924{
2925 int nstar = 0;
2926 PyObject *callargs = NULL;
2927 PyObject *stararg = NULL;
2928 PyObject *kwdict = NULL;
2929 PyObject *result = NULL;
2930
2931 if (flags & CALL_FLAG_KW) {
2932 kwdict = EXT_POP(*pp_stack);
2933 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00002934 PyObject* fn = ((PyFunctionObject*) func)->func_name;
2935 PyErr_Format(PyExc_TypeError,
2936 "%s%s argument after ** must be a dictionary",
2937 fn ? PyString_AsString(fn) : "function",
2938 fn ? "()" : "");
Jeremy Hylton52820442001-01-03 23:52:36 +00002939 goto ext_call_fail;
2940 }
2941 }
2942 if (flags & CALL_FLAG_VAR) {
2943 stararg = EXT_POP(*pp_stack);
2944 if (!PyTuple_Check(stararg)) {
2945 PyObject *t = NULL;
2946 t = PySequence_Tuple(stararg);
2947 if (t == NULL) {
2948 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00002949 PyObject* fn =
2950 ((PyFunctionObject*) func)->func_name;
2951 PyErr_Format(PyExc_TypeError,
2952 "%s%s argument after * must be a sequence",
2953 fn ? PyString_AsString(fn) : "function",
2954 fn ? "()" : "");
Jeremy Hylton52820442001-01-03 23:52:36 +00002955 }
2956 goto ext_call_fail;
2957 }
2958 Py_DECREF(stararg);
2959 stararg = t;
2960 }
2961 nstar = PyTuple_GET_SIZE(stararg);
2962 }
2963 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00002964 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002965 if (kwdict == NULL)
2966 goto ext_call_fail;
2967 }
2968 callargs = update_star_args(na, nstar, stararg, pp_stack);
2969 if (callargs == NULL)
2970 goto ext_call_fail;
2971 result = call_object(func, callargs, kwdict);
2972 ext_call_fail:
2973 Py_XDECREF(callargs);
2974 Py_XDECREF(kwdict);
2975 Py_XDECREF(stararg);
2976 return result;
2977}
2978
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002979#define SLICE_ERROR_MSG \
2980 "standard sequence type does not support step size other than one"
2981
Guido van Rossumb209a111997-04-29 18:18:01 +00002982static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002983loop_subscript(PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002984{
Guido van Rossumb209a111997-04-29 18:18:01 +00002985 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002986 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00002987 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002988 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002989 return NULL;
2990 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002991 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002992 v = (*sq->sq_item)(v, i);
2993 if (v)
2994 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00002995 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00002996 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00002997 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002998}
2999
Guido van Rossum20c6add2000-05-08 14:06:50 +00003000/* Extract a slice index from a PyInt or PyLong, the index is bound to
3001 the range [-INT_MAX+1, INTMAX]. Returns 0 and an exception if there is
3002 and error. Returns 1 on success.*/
3003
3004int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003005_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003006{
3007 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003008 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003009 if (PyInt_Check(v)) {
3010 x = PyInt_AsLong(v);
3011 } else if (PyLong_Check(v)) {
3012 x = PyLong_AsLong(v);
3013 if (x==-1 && PyErr_Occurred()) {
3014 PyObject *long_zero;
Guido van Rossumac7be682001-01-17 15:42:30 +00003015 int cmp;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003016
Guido van Rossumac7be682001-01-17 15:42:30 +00003017 if (!PyErr_ExceptionMatches(
3018 PyExc_OverflowError)) {
3019 /* It's not an overflow error, so just
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003020 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00003021 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003022 }
3023
Guido van Rossumac7be682001-01-17 15:42:30 +00003024 /* Clear the OverflowError */
3025 PyErr_Clear();
3026
3027 /* It's an overflow error, so we need to
3028 check the sign of the long integer,
3029 set the value to INT_MAX or 0, and clear
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003030 the error. */
3031
3032 /* Create a long integer with a value of 0 */
Guido van Rossumac7be682001-01-17 15:42:30 +00003033 long_zero = PyLong_FromLong(0L);
Guido van Rossum20c6add2000-05-08 14:06:50 +00003034 if (long_zero == NULL) return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003035
3036 /* Check sign */
Guido van Rossumac7be682001-01-17 15:42:30 +00003037 cmp = PyObject_RichCompareBool(v, long_zero,
3038 Py_GT);
3039 Py_DECREF(long_zero);
3040 if (cmp < 0)
3041 return 0;
3042 else if (cmp > 0)
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003043 x = INT_MAX;
3044 else
3045 x = 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003046 }
3047 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003048 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003049 "slice indices must be integers");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003050 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003051 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003052 /* Truncate -- very long indices are truncated anyway */
3053 if (x > INT_MAX)
3054 x = INT_MAX;
3055 else if (x < -INT_MAX)
3056 x = 0;
3057 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003058 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003059 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003060}
3061
Guido van Rossumb209a111997-04-29 18:18:01 +00003062static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003063apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003064{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003065 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003066 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003067 return NULL;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003068 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum04691fc1992-08-12 15:35:34 +00003069 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003070 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003071}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003072
3073static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003074assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3075 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003076{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003077 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003078 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum3f5da241990-12-20 15:06:42 +00003079 return -1;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003080 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum3f5da241990-12-20 15:06:42 +00003081 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003082 if (x == NULL)
3083 return PySequence_DelSlice(u, ilow, ihigh);
3084 else
3085 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003086}
3087
Guido van Rossumb209a111997-04-29 18:18:01 +00003088static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003089cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003090{
Guido van Rossumac7be682001-01-17 15:42:30 +00003091 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003092 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00003093 case IS:
3094 case IS_NOT:
3095 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00003096 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003097 res = !res;
3098 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003099 case IN:
3100 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003101 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003102 if (res < 0)
3103 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00003104 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003105 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003106 break;
3107 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00003108 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003109 break;
3110 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003111 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003112 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003113 v = res ? Py_True : Py_False;
3114 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003115 return v;
3116}
3117
Thomas Wouters52152252000-08-17 22:55:00 +00003118static PyObject *
3119import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003120{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003121 PyObject *x;
3122
3123 x = PyObject_GetAttr(v, name);
3124 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00003125 PyErr_Format(PyExc_ImportError,
3126 "cannot import name %.230s",
3127 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003128 }
Thomas Wouters52152252000-08-17 22:55:00 +00003129 return x;
3130}
Guido van Rossumac7be682001-01-17 15:42:30 +00003131
Thomas Wouters52152252000-08-17 22:55:00 +00003132static int
3133import_all_from(PyObject *locals, PyObject *v)
3134{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003135 PyObject *all = PyObject_GetAttrString(v, "__all__");
3136 PyObject *dict, *name, *value;
3137 int skip_leading_underscores = 0;
3138 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003139
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003140 if (all == NULL) {
3141 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3142 return -1; /* Unexpected error */
3143 PyErr_Clear();
3144 dict = PyObject_GetAttrString(v, "__dict__");
3145 if (dict == NULL) {
3146 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3147 return -1;
3148 PyErr_SetString(PyExc_ImportError,
3149 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003150 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003151 }
3152 all = PyMapping_Keys(dict);
3153 Py_DECREF(dict);
3154 if (all == NULL)
3155 return -1;
3156 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003157 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003158
3159 for (pos = 0, err = 0; ; pos++) {
3160 name = PySequence_GetItem(all, pos);
3161 if (name == NULL) {
3162 if (!PyErr_ExceptionMatches(PyExc_IndexError))
3163 err = -1;
3164 else
3165 PyErr_Clear();
3166 break;
3167 }
3168 if (skip_leading_underscores &&
3169 PyString_Check(name) &&
3170 PyString_AS_STRING(name)[0] == '_')
3171 {
3172 Py_DECREF(name);
3173 continue;
3174 }
3175 value = PyObject_GetAttr(v, name);
3176 if (value == NULL)
3177 err = -1;
3178 else
3179 err = PyDict_SetItem(locals, name, value);
3180 Py_DECREF(name);
3181 Py_XDECREF(value);
3182 if (err != 0)
3183 break;
3184 }
3185 Py_DECREF(all);
3186 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003187}
3188
Guido van Rossumb209a111997-04-29 18:18:01 +00003189static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003190build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003191{
Guido van Rossumcd649651997-08-22 16:56:16 +00003192 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003193 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003194 PyErr_SetString(PyExc_SystemError,
3195 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00003196 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003197 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003198 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003199 PyErr_SetString(PyExc_SystemError,
3200 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00003201 return NULL;
3202 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003203 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003204 PyErr_SetString(PyExc_SystemError,
Guido van Rossum7a5b7962000-03-31 13:52:29 +00003205 "build_class with non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00003206 return NULL;
3207 }
Guido van Rossumcd649651997-08-22 16:56:16 +00003208 n = PyTuple_Size(bases);
3209 for (i = 0; i < n; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003210 PyObject *base = PyTuple_GET_ITEM(bases, i);
3211 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00003212 /* Call the base's *type*, if it is callable.
3213 This code is a hook for Donald Beaudry's
3214 and Jim Fulton's type extensions. In
Thomas Wouters7e474022000-07-16 12:04:32 +00003215 unextended Python it will never be triggered
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003216 since its types are not callable.
3217 Ditto: call the bases's *class*, if it has
3218 one. This makes the same thing possible
3219 without writing C code. A true meta-object
3220 protocol! */
3221 PyObject *basetype = (PyObject *)base->ob_type;
3222 PyObject *callable = NULL;
3223 if (PyCallable_Check(basetype))
3224 callable = basetype;
3225 else
3226 callable = PyObject_GetAttrString(
3227 base, "__class__");
3228 if (callable) {
3229 PyObject *args;
3230 PyObject *newclass = NULL;
3231 args = Py_BuildValue(
3232 "(OOO)", name, bases, methods);
3233 if (args != NULL) {
3234 newclass = PyEval_CallObject(
3235 callable, args);
3236 Py_DECREF(args);
3237 }
Guido van Rossum730806d1998-04-10 22:27:42 +00003238 if (callable != basetype) {
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003239 Py_DECREF(callable);
Guido van Rossum730806d1998-04-10 22:27:42 +00003240 }
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003241 return newclass;
Guido van Rossum150b2df1996-12-05 23:17:11 +00003242 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003243 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00003244 "base is not a class object");
3245 return NULL;
3246 }
3247 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003248 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00003249}
3250
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003251static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003252exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3253 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003254{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003255 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003256 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003257 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003258
Guido van Rossumb209a111997-04-29 18:18:01 +00003259 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3260 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003261 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003262 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003263 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003264 locals = PyTuple_GetItem(prog, 2);
3265 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003266 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003267 if (globals == Py_None) {
3268 globals = PyEval_GetGlobals();
3269 if (locals == Py_None) {
3270 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003271 plain = 1;
3272 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003273 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003274 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003275 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003276 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003277 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003278 !PyCode_Check(prog) &&
3279 !PyFile_Check(prog)) {
3280 PyErr_SetString(PyExc_TypeError,
Guido van Rossumac7be682001-01-17 15:42:30 +00003281 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003282 return -1;
3283 }
Fred Drake661ea262000-10-24 19:57:45 +00003284 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003285 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003286 "exec: arg 2 must be a dictionary or None");
3287 return -1;
3288 }
3289 if (!PyDict_Check(locals)) {
3290 PyErr_SetString(PyExc_TypeError,
3291 "exec: arg 3 must be a dictionary or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003292 return -1;
3293 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003294 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003295 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003296 if (PyCode_Check(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003297 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003298 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003299 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003300 FILE *fp = PyFile_AsFile(prog);
3301 char *name = PyString_AsString(PyFile_Name(prog));
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003302 v = PyRun_File(fp, name, Py_file_input, globals, locals);
3303 }
3304 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003305 char *str;
3306 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003307 return -1;
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003308 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003309 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003310 if (plain)
3311 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003312 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003313 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003314 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003315 return 0;
3316}
Guido van Rossum24c13741995-02-14 09:42:43 +00003317
Guido van Rossumac7be682001-01-17 15:42:30 +00003318static void
Paul Prescode68140d2000-08-30 20:25:01 +00003319format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3320{
3321 char *obj_str;
3322
3323 if (!obj)
3324 return;
3325
3326 obj_str = PyString_AsString(obj);
3327 if (!obj_str)
3328 return;
3329
3330 PyErr_Format(exc, format_str, obj_str);
3331}
Guido van Rossum950361c1997-01-24 13:49:28 +00003332
3333#ifdef DYNAMIC_EXECUTION_PROFILE
3334
3335PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003336getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003337{
3338 int i;
3339 PyObject *l = PyList_New(256);
3340 if (l == NULL) return NULL;
3341 for (i = 0; i < 256; i++) {
3342 PyObject *x = PyInt_FromLong(a[i]);
3343 if (x == NULL) {
3344 Py_DECREF(l);
3345 return NULL;
3346 }
3347 PyList_SetItem(l, i, x);
3348 }
3349 for (i = 0; i < 256; i++)
3350 a[i] = 0;
3351 return l;
3352}
3353
3354PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003355_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003356{
3357#ifndef DXPAIRS
3358 return getarray(dxp);
3359#else
3360 int i;
3361 PyObject *l = PyList_New(257);
3362 if (l == NULL) return NULL;
3363 for (i = 0; i < 257; i++) {
3364 PyObject *x = getarray(dxpairs[i]);
3365 if (x == NULL) {
3366 Py_DECREF(l);
3367 return NULL;
3368 }
3369 PyList_SetItem(l, i, x);
3370 }
3371 return l;
3372#endif
3373}
3374
3375#endif