blob: c7b5696d042ad2f4d120b399893f14c08b339c68 [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
Jeremy Hylton64949cb2001-01-25 20:06:59 +000036#define REPR(ob) PyString_AS_STRING(PyObject_Repr(ob))
37
Guido van Rossum374a9221991-04-04 10:40:29 +000038/* Forward declarations */
Guido van Rossum374a9221991-04-04 10:40:29 +000039
Tim Petersdbd9ba62000-07-09 03:09:57 +000040static PyObject *eval_code2(PyCodeObject *,
41 PyObject *, PyObject *,
42 PyObject **, int,
43 PyObject **, int,
Jeremy Hylton64949cb2001-01-25 20:06:59 +000044 PyObject **, int,
45 PyObject *);
Jeremy Hylton52820442001-01-03 23:52:36 +000046
47static PyObject *call_object(PyObject *, PyObject *, PyObject *);
48static PyObject *call_cfunction(PyObject *, PyObject *, PyObject *);
49static PyObject *call_instance(PyObject *, PyObject *, PyObject *);
50static PyObject *call_method(PyObject *, PyObject *, PyObject *);
51static PyObject *call_eval_code2(PyObject *, PyObject *, PyObject *);
52static PyObject *fast_function(PyObject *, PyObject ***, int, int, int);
53static PyObject *fast_cfunction(PyObject *, PyObject ***, int);
54static PyObject *do_call(PyObject *, PyObject ***, int, int);
55static PyObject *ext_do_call(PyObject *, PyObject ***, int, int, int);
Guido van Rossumac7be682001-01-17 15:42:30 +000056static PyObject *update_keyword_args(PyObject *, int, PyObject ***,PyObject *);
Ka-Ping Yee20579702001-01-15 22:14:16 +000057static PyObject *update_star_args(int, int, PyObject *, PyObject ***);
Jeremy Hylton52820442001-01-03 23:52:36 +000058static PyObject *load_args(PyObject ***, int);
59#define CALL_FLAG_VAR 1
60#define CALL_FLAG_KW 2
61
Guido van Rossum0a066c01992-03-27 17:29:15 +000062#ifdef LLTRACE
Tim Petersdbd9ba62000-07-09 03:09:57 +000063static int prtrace(PyObject *, char *);
Guido van Rossum0a066c01992-03-27 17:29:15 +000064#endif
Tim Petersdbd9ba62000-07-09 03:09:57 +000065static void call_exc_trace(PyObject **, PyObject**, PyFrameObject *);
66static int call_trace(PyObject **, PyObject **,
67 PyFrameObject *, char *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000068static PyObject *loop_subscript(PyObject *, PyObject *);
69static PyObject *apply_slice(PyObject *, PyObject *, PyObject *);
70static int assign_slice(PyObject *, PyObject *,
71 PyObject *, PyObject *);
72static PyObject *cmp_outcome(int, PyObject *, PyObject *);
Thomas Wouters52152252000-08-17 22:55:00 +000073static PyObject *import_from(PyObject *, PyObject *);
74static int import_all_from(PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000075static PyObject *build_class(PyObject *, PyObject *, PyObject *);
76static int exec_statement(PyFrameObject *,
77 PyObject *, PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000078static void set_exc_info(PyThreadState *, PyObject *, PyObject *, PyObject *);
79static void reset_exc_info(PyThreadState *);
Paul Prescode68140d2000-08-30 20:25:01 +000080static void format_exc_check_arg(PyObject *, char *, PyObject *);
Guido van Rossum374a9221991-04-04 10:40:29 +000081
Paul Prescode68140d2000-08-30 20:25:01 +000082#define NAME_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000083 "name '%.200s' is not defined"
Jeremy Hylton64949cb2001-01-25 20:06:59 +000084#define GLOBAL_NAME_ERROR_MSG \
85 "global name '%.200s' is not defined"
Paul Prescode68140d2000-08-30 20:25:01 +000086#define UNBOUNDLOCAL_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000087 "local variable '%.200s' referenced before assignment"
Guido van Rossum374a9221991-04-04 10:40:29 +000088
Guido van Rossum950361c1997-01-24 13:49:28 +000089/* Dynamic execution profile */
90#ifdef DYNAMIC_EXECUTION_PROFILE
91#ifdef DXPAIRS
92static long dxpairs[257][256];
93#define dxp dxpairs[256]
94#else
95static long dxp[256];
96#endif
97#endif
98
Guido van Rossume59214e1994-08-30 08:01:59 +000099#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000100
Guido van Rossum2571cc81999-04-07 16:07:23 +0000101#ifndef DONT_HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000102#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +0000103#endif
Guido van Rossum49b56061998-10-01 20:42:43 +0000104#include "pythread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000105
Guido van Rossuma027efa1997-05-05 20:56:21 +0000106extern int _PyThread_Started; /* Flag for Py_Exit */
107
Guido van Rossum65d5b571998-12-21 19:32:43 +0000108static PyThread_type_lock interpreter_lock = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000109static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000110
111void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000112PyEval_InitThreads(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000113{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000114 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000115 return;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000116 _PyThread_Started = 1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000117 interpreter_lock = PyThread_allocate_lock();
118 PyThread_acquire_lock(interpreter_lock, 1);
119 main_thread = PyThread_get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000120}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000121
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000122void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000123PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000124{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000125 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000126}
127
128void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000129PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000130{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000131 PyThread_release_lock(interpreter_lock);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000132}
133
134void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000135PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000136{
137 if (tstate == NULL)
138 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000139 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000140 if (PyThreadState_Swap(tstate) != NULL)
141 Py_FatalError(
142 "PyEval_AcquireThread: non-NULL old thread state");
143}
144
145void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000146PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000147{
148 if (tstate == NULL)
149 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
150 if (PyThreadState_Swap(NULL) != tstate)
151 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000152 PyThread_release_lock(interpreter_lock);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000153}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000154
155/* This function is called from PyOS_AfterFork to ensure that newly
156 created child processes don't hold locks referring to threads which
157 are not running in the child process. (This could also be done using
158 pthread_atfork mechanism, at least for the pthreads implementation.) */
159
160void
161PyEval_ReInitThreads(void)
162{
163 if (!interpreter_lock)
164 return;
165 /*XXX Can't use PyThread_free_lock here because it does too
166 much error-checking. Doing this cleanly would require
167 adding a new function to each thread_*.h. Instead, just
168 create a new lock and waste a little bit of memory */
169 interpreter_lock = PyThread_allocate_lock();
170 PyThread_acquire_lock(interpreter_lock, 1);
171 main_thread = PyThread_get_thread_ident();
172}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000173#endif
174
Guido van Rossumff4949e1992-08-05 19:58:53 +0000175/* Functions save_thread and restore_thread are always defined so
176 dynamically loaded modules needn't be compiled separately for use
177 with and without threads: */
178
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000179PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000180PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000181{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000182 PyThreadState *tstate = PyThreadState_Swap(NULL);
183 if (tstate == NULL)
184 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000185#ifdef WITH_THREAD
Guido van Rossumb74eca91997-09-30 22:03:16 +0000186 if (interpreter_lock)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000187 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000188#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000189 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000190}
191
192void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000193PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000194{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000195 if (tstate == NULL)
196 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000197#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000198 if (interpreter_lock) {
Guido van Rossumb74eca91997-09-30 22:03:16 +0000199 int err = errno;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000200 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000201 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000202 }
203#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000204 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000205}
206
207
Guido van Rossuma9672091994-09-14 13:31:22 +0000208/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
209 signal handlers or Mac I/O completion routines) can schedule calls
210 to a function to be called synchronously.
211 The synchronous function is called with one void* argument.
212 It should return 0 for success or -1 for failure -- failure should
213 be accompanied by an exception.
214
215 If registry succeeds, the registry function returns 0; if it fails
216 (e.g. due to too many pending calls) it returns -1 (without setting
217 an exception condition).
218
219 Note that because registry may occur from within signal handlers,
220 or other asynchronous events, calling malloc() is unsafe!
221
222#ifdef WITH_THREAD
223 Any thread can schedule pending calls, but only the main thread
224 will execute them.
225#endif
226
227 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
228 There are two possible race conditions:
229 (1) nested asynchronous registry calls;
230 (2) registry calls made while pending calls are being processed.
231 While (1) is very unlikely, (2) is a real possibility.
232 The current code is safe against (2), but not against (1).
233 The safety against (2) is derived from the fact that only one
234 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000235
Guido van Rossuma027efa1997-05-05 20:56:21 +0000236 XXX Darn! With the advent of thread state, we should have an array
237 of pending calls per thread in the thread state! Later...
238*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000239
Guido van Rossuma9672091994-09-14 13:31:22 +0000240#define NPENDINGCALLS 32
241static struct {
Thomas Wouters334fb892000-07-25 12:56:38 +0000242 int (*func)(void *);
243 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000244} pendingcalls[NPENDINGCALLS];
245static volatile int pendingfirst = 0;
246static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000247static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000248
249int
Thomas Wouters334fb892000-07-25 12:56:38 +0000250Py_AddPendingCall(int (*func)(void *), void *arg)
Guido van Rossuma9672091994-09-14 13:31:22 +0000251{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000252 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000253 int i, j;
254 /* XXX Begin critical section */
255 /* XXX If you want this to be safe against nested
256 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000257 if (busy)
258 return -1;
259 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000260 i = pendinglast;
261 j = (i + 1) % NPENDINGCALLS;
262 if (j == pendingfirst)
263 return -1; /* Queue full */
264 pendingcalls[i].func = func;
265 pendingcalls[i].arg = arg;
266 pendinglast = j;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000267 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000268 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000269 /* XXX End critical section */
270 return 0;
271}
272
Guido van Rossum180d7b41994-09-29 09:45:57 +0000273int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000274Py_MakePendingCalls(void)
Guido van Rossuma9672091994-09-14 13:31:22 +0000275{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000276 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000277#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000278 if (main_thread && PyThread_get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000279 return 0;
280#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000281 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000282 return 0;
283 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000284 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000285 for (;;) {
286 int i;
Thomas Wouters334fb892000-07-25 12:56:38 +0000287 int (*func)(void *);
288 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000289 i = pendingfirst;
290 if (i == pendinglast)
291 break; /* Queue empty */
292 func = pendingcalls[i].func;
293 arg = pendingcalls[i].arg;
294 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000295 if (func(arg) < 0) {
296 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000297 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000298 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000299 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000300 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000301 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000302 return 0;
303}
304
305
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000306/* The interpreter's recursion limit */
307
Guido van Rossum349ff6f2000-09-01 01:52:08 +0000308static int recursion_limit = 1000;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000309
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000310int
311Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000312{
313 return recursion_limit;
314}
315
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000316void
317Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000318{
319 recursion_limit = new_limit;
320}
321
Guido van Rossum374a9221991-04-04 10:40:29 +0000322/* Status code for main loop (reason for stack unwind) */
323
324enum why_code {
325 WHY_NOT, /* No error */
326 WHY_EXCEPTION, /* Exception occurred */
327 WHY_RERAISE, /* Exception re-raised by 'finally' */
328 WHY_RETURN, /* 'return' statement */
329 WHY_BREAK /* 'break' statement */
330};
331
Tim Petersdbd9ba62000-07-09 03:09:57 +0000332static enum why_code do_raise(PyObject *, PyObject *, PyObject *);
333static int unpack_sequence(PyObject *, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000334
Guido van Rossum374a9221991-04-04 10:40:29 +0000335
Guido van Rossumb209a111997-04-29 18:18:01 +0000336PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000337PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000338{
339 return eval_code2(co,
340 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000341 (PyObject **)NULL, 0,
342 (PyObject **)NULL, 0,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000343 (PyObject **)NULL, 0,
344 NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000345}
346
347
348/* Interpreter main loop */
349
Guido van Rossumb209a111997-04-29 18:18:01 +0000350static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000351eval_code2(PyCodeObject *co, PyObject *globals, PyObject *locals,
352 PyObject **args, int argcount, PyObject **kws, int kwcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000353 PyObject **defs, int defcount, PyObject *closure)
Guido van Rossum374a9221991-04-04 10:40:29 +0000354{
Guido van Rossum950361c1997-01-24 13:49:28 +0000355#ifdef DXPAIRS
356 int lastopcode = 0;
357#endif
Jeremy Hylton52820442001-01-03 23:52:36 +0000358 PyObject **stack_pointer;
Guido van Rossum374a9221991-04-04 10:40:29 +0000359 register unsigned char *next_instr;
Moshe Zadkaaa39a7e2000-08-07 06:34:45 +0000360 register int opcode=0; /* Current opcode */
361 register int oparg=0; /* Current opcode argument, if any */
Guido van Rossum374a9221991-04-04 10:40:29 +0000362 register enum why_code why; /* Reason for block stack unwind */
363 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000364 register PyObject *x; /* Result object -- NULL if error */
365 register PyObject *v; /* Temporary objects popped off stack */
366 register PyObject *w;
367 register PyObject *u;
368 register PyObject *t;
Barry Warsaw23c9ec82000-08-21 15:44:01 +0000369 register PyObject *stream = NULL; /* for PRINT opcodes */
Guido van Rossumb209a111997-04-29 18:18:01 +0000370 register PyFrameObject *f; /* Current frame */
Guido van Rossum50cd3481998-11-17 17:02:51 +0000371 register PyObject **fastlocals;
Guido van Rossum014518f1998-11-23 21:09:51 +0000372 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000373 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossumd076c731998-10-07 19:42:25 +0000374 unsigned char *first_instr;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000375#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000376 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000377#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000378#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000379 /* Make it easier to find out where we are with a debugger */
Guido van Rossumb209a111997-04-29 18:18:01 +0000380 char *filename = PyString_AsString(co->co_filename);
Guido van Rossum99bec951992-09-03 20:29:45 +0000381#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000382
383/* Code access macros */
384
385#define GETCONST(i) Getconst(f, i)
386#define GETNAME(i) Getname(f, i)
387#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumd076c731998-10-07 19:42:25 +0000388#define INSTR_OFFSET() (next_instr - first_instr)
Guido van Rossum374a9221991-04-04 10:40:29 +0000389#define NEXTOP() (*next_instr++)
390#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossumd076c731998-10-07 19:42:25 +0000391#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000392#define JUMPBY(x) (next_instr += (x))
393
394/* Stack manipulation macros */
395
396#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
397#define EMPTY() (STACK_LEVEL() == 0)
398#define TOP() (stack_pointer[-1])
399#define BASIC_PUSH(v) (*stack_pointer++ = (v))
400#define BASIC_POP() (*--stack_pointer)
401
Guido van Rossum96a42c81992-01-12 02:29:51 +0000402#ifdef LLTRACE
403#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
404#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000405#else
406#define PUSH(v) BASIC_PUSH(v)
407#define POP() BASIC_POP()
408#endif
409
Guido van Rossum681d79a1995-07-18 14:51:37 +0000410/* Local variable macros */
411
412#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumb209a111997-04-29 18:18:01 +0000413#define SETLOCAL(i, value) do { Py_XDECREF(GETLOCAL(i)); \
Guido van Rossum681d79a1995-07-18 14:51:37 +0000414 GETLOCAL(i) = value; } while (0)
415
Guido van Rossuma027efa1997-05-05 20:56:21 +0000416/* Start of code */
417
Guido van Rossum8861b741996-07-30 16:49:37 +0000418#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000419 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000420 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000421 return NULL;
422 }
423#endif
424
Guido van Rossum681d79a1995-07-18 14:51:37 +0000425 if (globals == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000426 PyErr_SetString(PyExc_SystemError, "eval_code2: NULL globals");
Guido van Rossum6135a871995-01-09 17:53:26 +0000427 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000428 }
429
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000430#ifdef LLTRACE
Guido van Rossumb209a111997-04-29 18:18:01 +0000431 lltrace = PyDict_GetItemString(globals, "__lltrace__") != NULL;
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000432#endif
433
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000434 f = PyFrame_New(tstate, /*back*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000435 co, /*code*/
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000436 globals, locals, closure);
Guido van Rossum374a9221991-04-04 10:40:29 +0000437 if (f == NULL)
438 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000439
Guido van Rossuma027efa1997-05-05 20:56:21 +0000440 tstate->frame = f;
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000441 fastlocals = f->f_localsplus;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000442
443 if (co->co_argcount > 0 ||
444 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
445 int i;
446 int n = argcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000447 PyObject *kwdict = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000448 if (co->co_flags & CO_VARKEYWORDS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000449 kwdict = PyDict_New();
Guido van Rossum681d79a1995-07-18 14:51:37 +0000450 if (kwdict == NULL)
451 goto fail;
Guido van Rossum8c5df061997-01-24 04:19:24 +0000452 i = co->co_argcount;
453 if (co->co_flags & CO_VARARGS)
454 i++;
455 SETLOCAL(i, kwdict);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000456 }
457 if (argcount > co->co_argcount) {
458 if (!(co->co_flags & CO_VARARGS)) {
Guido van Rossumdf9db1e1997-11-19 16:05:40 +0000459 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +0000460 "%.200s() takes %s %d "
461 "%sargument%s (%d given)",
Fred Drake661ea262000-10-24 19:57:45 +0000462 PyString_AsString(co->co_name),
Ka-Ping Yee20579702001-01-15 22:14:16 +0000463 defcount ? "at most" : "exactly",
464 co->co_argcount,
465 kwcount ? "non-keyword " : "",
466 co->co_argcount == 1 ? "" : "s",
467 argcount);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000468 goto fail;
469 }
470 n = co->co_argcount;
471 }
472 for (i = 0; i < n; i++) {
473 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000474 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000475 SETLOCAL(i, x);
476 }
477 if (co->co_flags & CO_VARARGS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000478 u = PyTuple_New(argcount - n);
Guido van Rossum8c5df061997-01-24 04:19:24 +0000479 if (u == NULL)
480 goto fail;
481 SETLOCAL(co->co_argcount, u);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000482 for (i = n; i < argcount; i++) {
483 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000484 Py_INCREF(x);
485 PyTuple_SET_ITEM(u, i-n, x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000486 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000487 }
488 for (i = 0; i < kwcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000489 PyObject *keyword = kws[2*i];
490 PyObject *value = kws[2*i + 1];
Guido van Rossum681d79a1995-07-18 14:51:37 +0000491 int j;
Guido van Rossum25da5be1999-10-26 00:12:20 +0000492 if (keyword == NULL || !PyString_Check(keyword)) {
Ka-Ping Yee20579702001-01-15 22:14:16 +0000493 PyErr_Format(PyExc_TypeError,
494 "%.200s() keywords must be strings",
495 PyString_AsString(co->co_name));
Guido van Rossum25da5be1999-10-26 00:12:20 +0000496 goto fail;
497 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000498 /* XXX slow -- speed up using dictionary? */
499 for (j = 0; j < co->co_argcount; j++) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000500 PyObject *nm = PyTuple_GET_ITEM(
501 co->co_varnames, j);
Guido van Rossumac7be682001-01-17 15:42:30 +0000502 int cmp = PyObject_RichCompareBool(
503 keyword, nm, Py_EQ);
504 if (cmp > 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000505 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000506 else if (cmp < 0)
507 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000508 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000509 /* Check errors from Compare */
510 if (PyErr_Occurred())
511 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000512 if (j >= co->co_argcount) {
513 if (kwdict == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000514 PyErr_Format(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +0000515 "%.200s() got an unexpected "
516 "keyword argument '%.400s'",
517 PyString_AsString(co->co_name),
Jeremy Hylton76901512000-03-28 23:49:17 +0000518 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000519 goto fail;
520 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000521 PyDict_SetItem(kwdict, keyword, value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000522 }
523 else {
524 if (GETLOCAL(j) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000525 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +0000526 "%.200s() got multiple "
527 "values for keyword "
528 "argument '%.400s'",
529 PyString_AsString(co->co_name),
530 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000531 goto fail;
532 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000533 Py_INCREF(value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000534 SETLOCAL(j, value);
535 }
536 }
537 if (argcount < co->co_argcount) {
538 int m = co->co_argcount - defcount;
539 for (i = argcount; i < m; i++) {
540 if (GETLOCAL(i) == NULL) {
Guido van Rossumdf9db1e1997-11-19 16:05:40 +0000541 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +0000542 "%.200s() takes %s %d "
543 "%sargument%s (%d given)",
Fred Drake661ea262000-10-24 19:57:45 +0000544 PyString_AsString(co->co_name),
Ka-Ping Yee20579702001-01-15 22:14:16 +0000545 ((co->co_flags & CO_VARARGS) ||
546 defcount) ? "at least"
547 : "exactly",
548 m, kwcount ? "non-keyword " : "",
549 m == 1 ? "" : "s", i);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000550 goto fail;
551 }
552 }
553 if (n > m)
554 i = n - m;
555 else
556 i = 0;
557 for (; i < defcount; i++) {
558 if (GETLOCAL(m+i) == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000559 PyObject *def = defs[i];
560 Py_INCREF(def);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000561 SETLOCAL(m+i, def);
562 }
563 }
564 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000565 }
566 else {
567 if (argcount > 0 || kwcount > 0) {
Fred Drake661ea262000-10-24 19:57:45 +0000568 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +0000569 "%.200s() takes no arguments (%d given)",
570 PyString_AsString(co->co_name),
571 argcount + kwcount);
Guido van Rossum8c5df061997-01-24 04:19:24 +0000572 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000573 }
574 }
575
Guido van Rossuma027efa1997-05-05 20:56:21 +0000576 if (tstate->sys_tracefunc != NULL) {
577 /* tstate->sys_tracefunc, if defined, is a function that
578 will be called on *every* entry to a code block.
Guido van Rossum96a42c81992-01-12 02:29:51 +0000579 Its return value, if not None, is a function that
580 will be called at the start of each executed line
581 of code. (Actually, the function must return
582 itself in order to continue tracing.)
583 The trace functions are called with three arguments:
584 a pointer to the current frame, a string indicating
585 why the function is called, and an argument which
586 depends on the situation. The global trace function
587 (sys.trace) is also called whenever an exception
588 is detected. */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000589 if (call_trace(&tstate->sys_tracefunc,
590 &f->f_trace, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000591 Py_None/*XXX how to compute arguments now?*/)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000592 /* Trace function raised an error */
Guido van Rossum8c5df061997-01-24 04:19:24 +0000593 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000594 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000595 }
596
Guido van Rossuma027efa1997-05-05 20:56:21 +0000597 if (tstate->sys_profilefunc != NULL) {
598 /* Similar for sys_profilefunc, except it needn't return
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000599 itself and isn't called for "line" events */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000600 if (call_trace(&tstate->sys_profilefunc,
601 (PyObject**)0, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000602 Py_None/*XXX*/)) {
Guido van Rossum8c5df061997-01-24 04:19:24 +0000603 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000604 }
605 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000606
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000607 if (++tstate->recursion_depth > recursion_limit) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000608 --tstate->recursion_depth;
609 PyErr_SetString(PyExc_RuntimeError,
Fred Drake661ea262000-10-24 19:57:45 +0000610 "maximum recursion depth exceeded");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000611 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +0000612 Py_DECREF(f);
Guido van Rossum8861b741996-07-30 16:49:37 +0000613 return NULL;
614 }
615
Guido van Rossumd076c731998-10-07 19:42:25 +0000616 _PyCode_GETCODEPTR(co, &first_instr);
617 next_instr = first_instr;
Guido van Rossum374a9221991-04-04 10:40:29 +0000618 stack_pointer = f->f_valuestack;
Guido van Rossumac7be682001-01-17 15:42:30 +0000619
Guido van Rossum374a9221991-04-04 10:40:29 +0000620 why = WHY_NOT;
621 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000622 x = Py_None; /* Not a reference, just anything non-NULL */
Fred Drake48fba732000-10-11 13:54:07 +0000623 w = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +0000624
Guido van Rossum374a9221991-04-04 10:40:29 +0000625 for (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000626 /* Do periodic things. Doing this every time through
627 the loop would add too much overhead, so we do it
628 only every Nth instruction. We also do it if
629 ``things_to_do'' is set, i.e. when an asynchronous
630 event needs attention (e.g. a signal handler or
631 async I/O handler); see Py_AddPendingCall() and
632 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +0000633
Guido van Rossuma027efa1997-05-05 20:56:21 +0000634 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000635 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000636 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000637 if (Py_MakePendingCalls() < 0) {
638 why = WHY_EXCEPTION;
639 goto on_error;
640 }
641 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000642#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000643 /* If we have true signals, the signal handler
644 will call Py_AddPendingCall() so we don't
645 have to call sigcheck(). On the Mac and
646 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000647 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000648 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000649 goto on_error;
650 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000651#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000652
Guido van Rossume59214e1994-08-30 08:01:59 +0000653#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000654 if (interpreter_lock) {
655 /* Give another thread a chance */
656
Guido van Rossum25ce5661997-08-02 03:10:38 +0000657 if (PyThreadState_Swap(NULL) != tstate)
658 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000659 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000660
661 /* Other threads may run now */
662
Guido van Rossum65d5b571998-12-21 19:32:43 +0000663 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000664 if (PyThreadState_Swap(tstate) != NULL)
665 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000666 }
667#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000668 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000669
Guido van Rossum374a9221991-04-04 10:40:29 +0000670 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000671
Guido van Rossum408027e1996-12-30 16:17:54 +0000672#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000673 f->f_lasti = INSTR_OFFSET();
674#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000675
Guido van Rossum374a9221991-04-04 10:40:29 +0000676 opcode = NEXTOP();
677 if (HAS_ARG(opcode))
678 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000679 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000680#ifdef DYNAMIC_EXECUTION_PROFILE
681#ifdef DXPAIRS
682 dxpairs[lastopcode][opcode]++;
683 lastopcode = opcode;
684#endif
685 dxp[opcode]++;
686#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000687
Guido van Rossum96a42c81992-01-12 02:29:51 +0000688#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000689 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +0000690
Guido van Rossum96a42c81992-01-12 02:29:51 +0000691 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000692 if (HAS_ARG(opcode)) {
693 printf("%d: %d, %d\n",
694 (int) (INSTR_OFFSET() - 3),
695 opcode, oparg);
696 }
697 else {
698 printf("%d: %d\n",
699 (int) (INSTR_OFFSET() - 1), opcode);
700 }
701 }
702#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000703 /* Main switch on opcode */
Jeremy Hylton52820442001-01-03 23:52:36 +0000704
Guido van Rossum374a9221991-04-04 10:40:29 +0000705 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000706
Guido van Rossum374a9221991-04-04 10:40:29 +0000707 /* BEWARE!
708 It is essential that any operation that fails sets either
709 x to NULL, err to nonzero, or why to anything but WHY_NOT,
710 and that no operation that succeeds does this! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000711
Guido van Rossum374a9221991-04-04 10:40:29 +0000712 /* case STOP_CODE: this is an error! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000713
Guido van Rossum374a9221991-04-04 10:40:29 +0000714 case POP_TOP:
715 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000716 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000717 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000718
Guido van Rossum374a9221991-04-04 10:40:29 +0000719 case ROT_TWO:
720 v = POP();
721 w = POP();
722 PUSH(v);
723 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000724 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000725
Guido van Rossum374a9221991-04-04 10:40:29 +0000726 case ROT_THREE:
727 v = POP();
728 w = POP();
729 x = POP();
730 PUSH(v);
731 PUSH(x);
732 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000733 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000734
Thomas Wouters434d0822000-08-24 20:11:32 +0000735 case ROT_FOUR:
736 u = POP();
737 v = POP();
738 w = POP();
739 x = POP();
740 PUSH(u);
741 PUSH(x);
742 PUSH(w);
743 PUSH(v);
744 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000745
Guido van Rossum374a9221991-04-04 10:40:29 +0000746 case DUP_TOP:
747 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000748 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000749 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000750 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000751
Thomas Wouters434d0822000-08-24 20:11:32 +0000752 case DUP_TOPX:
753 switch (oparg) {
Thomas Wouters434d0822000-08-24 20:11:32 +0000754 case 1:
Tim Peters35ba6892000-10-11 07:04:49 +0000755 x = TOP();
756 Py_INCREF(x);
757 PUSH(x);
758 continue;
759 case 2:
Thomas Wouters434d0822000-08-24 20:11:32 +0000760 x = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000761 Py_INCREF(x);
762 w = TOP();
763 Py_INCREF(w);
764 PUSH(x);
765 PUSH(w);
766 PUSH(x);
767 continue;
768 case 3:
769 x = POP();
770 Py_INCREF(x);
Thomas Wouters434d0822000-08-24 20:11:32 +0000771 w = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000772 Py_INCREF(w);
773 v = TOP();
774 Py_INCREF(v);
775 PUSH(w);
776 PUSH(x);
777 PUSH(v);
778 PUSH(w);
779 PUSH(x);
780 continue;
781 case 4:
782 x = POP();
783 Py_INCREF(x);
784 w = POP();
785 Py_INCREF(w);
Thomas Wouters434d0822000-08-24 20:11:32 +0000786 v = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000787 Py_INCREF(v);
788 u = TOP();
789 Py_INCREF(u);
790 PUSH(v);
791 PUSH(w);
792 PUSH(x);
793 PUSH(u);
794 PUSH(v);
795 PUSH(w);
796 PUSH(x);
797 continue;
798 case 5:
799 x = POP();
800 Py_INCREF(x);
801 w = POP();
802 Py_INCREF(w);
803 v = POP();
804 Py_INCREF(v);
Thomas Wouters434d0822000-08-24 20:11:32 +0000805 u = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000806 Py_INCREF(u);
807 t = TOP();
808 Py_INCREF(t);
809 PUSH(u);
810 PUSH(v);
811 PUSH(w);
812 PUSH(x);
813 PUSH(t);
814 PUSH(u);
815 PUSH(v);
816 PUSH(w);
817 PUSH(x);
818 continue;
Thomas Wouters434d0822000-08-24 20:11:32 +0000819 default:
Thomas Wouters0be483f2000-10-11 23:26:11 +0000820 Py_FatalError("invalid argument to DUP_TOPX"
821 " (bytecode corruption?)");
Thomas Wouters434d0822000-08-24 20:11:32 +0000822 }
Tim Peters35ba6892000-10-11 07:04:49 +0000823 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000824
Guido van Rossum374a9221991-04-04 10:40:29 +0000825 case UNARY_POSITIVE:
826 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000827 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000828 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000829 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000830 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000831 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000832
Guido van Rossum374a9221991-04-04 10:40:29 +0000833 case UNARY_NEGATIVE:
834 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000835 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000836 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000837 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000838 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000839 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000840
Guido van Rossum374a9221991-04-04 10:40:29 +0000841 case UNARY_NOT:
842 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000843 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000844 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000845 if (err == 0) {
846 Py_INCREF(Py_True);
847 PUSH(Py_True);
848 continue;
849 }
850 else if (err > 0) {
851 Py_INCREF(Py_False);
852 PUSH(Py_False);
853 err = 0;
854 continue;
855 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000856 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000857
Guido van Rossum374a9221991-04-04 10:40:29 +0000858 case UNARY_CONVERT:
859 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000860 x = PyObject_Repr(v);
861 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000862 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000863 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000864 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000865
Guido van Rossum7928cd71991-10-24 14:59:31 +0000866 case UNARY_INVERT:
867 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000868 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000869 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000870 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000871 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000872 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000873
Guido van Rossum50564e81996-01-12 01:13:16 +0000874 case BINARY_POWER:
875 w = POP();
876 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000877 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000878 Py_DECREF(v);
879 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000880 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000881 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000882 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000883
Guido van Rossum374a9221991-04-04 10:40:29 +0000884 case BINARY_MULTIPLY:
885 w = POP();
886 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000887 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000888 Py_DECREF(v);
889 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000890 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000891 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000892 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000893
Guido van Rossum374a9221991-04-04 10:40:29 +0000894 case BINARY_DIVIDE:
895 w = POP();
896 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000897 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000898 Py_DECREF(v);
899 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000900 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000901 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000902 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000903
Guido van Rossum374a9221991-04-04 10:40:29 +0000904 case BINARY_MODULO:
905 w = POP();
906 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000907 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000908 Py_DECREF(v);
909 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000910 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000911 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000912 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000913
Guido van Rossum374a9221991-04-04 10:40:29 +0000914 case BINARY_ADD:
915 w = POP();
916 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000917 if (PyInt_Check(v) && PyInt_Check(w)) {
918 /* INLINE: int + int */
919 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000920 a = PyInt_AS_LONG(v);
921 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000922 i = a + b;
923 if ((i^a) < 0 && (i^b) < 0) {
924 PyErr_SetString(PyExc_OverflowError,
925 "integer addition");
926 x = NULL;
927 }
928 else
929 x = PyInt_FromLong(i);
930 }
931 else
932 x = PyNumber_Add(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000933 Py_DECREF(v);
934 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000935 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000936 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000937 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000938
Guido van Rossum374a9221991-04-04 10:40:29 +0000939 case BINARY_SUBTRACT:
940 w = POP();
941 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000942 if (PyInt_Check(v) && PyInt_Check(w)) {
943 /* INLINE: int - int */
944 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000945 a = PyInt_AS_LONG(v);
946 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000947 i = a - b;
948 if ((i^a) < 0 && (i^~b) < 0) {
949 PyErr_SetString(PyExc_OverflowError,
950 "integer subtraction");
951 x = NULL;
952 }
953 else
954 x = PyInt_FromLong(i);
955 }
956 else
957 x = PyNumber_Subtract(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000958 Py_DECREF(v);
959 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000960 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000961 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000962 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000963
Guido van Rossum374a9221991-04-04 10:40:29 +0000964 case BINARY_SUBSCR:
965 w = POP();
966 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000967 if (PyList_Check(v) && PyInt_Check(w)) {
968 /* INLINE: list[int] */
969 long i = PyInt_AsLong(w);
970 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +0000971 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +0000972 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +0000973 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000974 PyErr_SetString(PyExc_IndexError,
975 "list index out of range");
976 x = NULL;
977 }
978 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +0000979 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000980 Py_INCREF(x);
981 }
982 }
983 else
984 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000985 Py_DECREF(v);
986 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000987 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000988 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000989 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000990
Guido van Rossum7928cd71991-10-24 14:59:31 +0000991 case BINARY_LSHIFT:
992 w = POP();
993 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000994 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000995 Py_DECREF(v);
996 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000997 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000998 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000999 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001000
Guido van Rossum7928cd71991-10-24 14:59:31 +00001001 case BINARY_RSHIFT:
1002 w = POP();
1003 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001004 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001005 Py_DECREF(v);
1006 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001007 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001008 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001009 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001010
Guido van Rossum7928cd71991-10-24 14:59:31 +00001011 case BINARY_AND:
1012 w = POP();
1013 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001014 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001015 Py_DECREF(v);
1016 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001017 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001018 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001019 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001020
Guido van Rossum7928cd71991-10-24 14:59:31 +00001021 case BINARY_XOR:
1022 w = POP();
1023 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001024 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001025 Py_DECREF(v);
1026 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001027 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001028 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001029 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001030
Guido van Rossum7928cd71991-10-24 14:59:31 +00001031 case BINARY_OR:
1032 w = POP();
1033 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001034 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001035 Py_DECREF(v);
1036 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001037 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001038 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001039 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001040
1041 case INPLACE_POWER:
1042 w = POP();
1043 v = POP();
1044 x = PyNumber_InPlacePower(v, w, Py_None);
1045 Py_DECREF(v);
1046 Py_DECREF(w);
1047 PUSH(x);
1048 if (x != NULL) continue;
1049 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001050
Thomas Wouters434d0822000-08-24 20:11:32 +00001051 case INPLACE_MULTIPLY:
1052 w = POP();
1053 v = POP();
1054 x = PyNumber_InPlaceMultiply(v, w);
1055 Py_DECREF(v);
1056 Py_DECREF(w);
1057 PUSH(x);
1058 if (x != NULL) continue;
1059 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001060
Thomas Wouters434d0822000-08-24 20:11:32 +00001061 case INPLACE_DIVIDE:
1062 w = POP();
1063 v = POP();
1064 x = PyNumber_InPlaceDivide(v, w);
1065 Py_DECREF(v);
1066 Py_DECREF(w);
1067 PUSH(x);
1068 if (x != NULL) continue;
1069 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001070
Thomas Wouters434d0822000-08-24 20:11:32 +00001071 case INPLACE_MODULO:
1072 w = POP();
1073 v = POP();
1074 x = PyNumber_InPlaceRemainder(v, w);
1075 Py_DECREF(v);
1076 Py_DECREF(w);
1077 PUSH(x);
1078 if (x != NULL) continue;
1079 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001080
Thomas Wouters434d0822000-08-24 20:11:32 +00001081 case INPLACE_ADD:
1082 w = POP();
1083 v = POP();
1084 if (PyInt_Check(v) && PyInt_Check(w)) {
1085 /* INLINE: int + int */
1086 register long a, b, i;
1087 a = PyInt_AS_LONG(v);
1088 b = PyInt_AS_LONG(w);
1089 i = a + b;
1090 if ((i^a) < 0 && (i^b) < 0) {
1091 PyErr_SetString(PyExc_OverflowError,
1092 "integer addition");
1093 x = NULL;
1094 }
1095 else
1096 x = PyInt_FromLong(i);
1097 }
1098 else
1099 x = PyNumber_InPlaceAdd(v, w);
1100 Py_DECREF(v);
1101 Py_DECREF(w);
1102 PUSH(x);
1103 if (x != NULL) continue;
1104 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001105
Thomas Wouters434d0822000-08-24 20:11:32 +00001106 case INPLACE_SUBTRACT:
1107 w = POP();
1108 v = POP();
1109 if (PyInt_Check(v) && PyInt_Check(w)) {
1110 /* INLINE: int - int */
1111 register long a, b, i;
1112 a = PyInt_AS_LONG(v);
1113 b = PyInt_AS_LONG(w);
1114 i = a - b;
1115 if ((i^a) < 0 && (i^~b) < 0) {
1116 PyErr_SetString(PyExc_OverflowError,
1117 "integer subtraction");
1118 x = NULL;
1119 }
1120 else
1121 x = PyInt_FromLong(i);
1122 }
1123 else
1124 x = PyNumber_InPlaceSubtract(v, w);
1125 Py_DECREF(v);
1126 Py_DECREF(w);
1127 PUSH(x);
1128 if (x != NULL) continue;
1129 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001130
Thomas Wouters434d0822000-08-24 20:11:32 +00001131 case INPLACE_LSHIFT:
1132 w = POP();
1133 v = POP();
1134 x = PyNumber_InPlaceLshift(v, w);
1135 Py_DECREF(v);
1136 Py_DECREF(w);
1137 PUSH(x);
1138 if (x != NULL) continue;
1139 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001140
Thomas Wouters434d0822000-08-24 20:11:32 +00001141 case INPLACE_RSHIFT:
1142 w = POP();
1143 v = POP();
1144 x = PyNumber_InPlaceRshift(v, w);
1145 Py_DECREF(v);
1146 Py_DECREF(w);
1147 PUSH(x);
1148 if (x != NULL) continue;
1149 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001150
Thomas Wouters434d0822000-08-24 20:11:32 +00001151 case INPLACE_AND:
1152 w = POP();
1153 v = POP();
1154 x = PyNumber_InPlaceAnd(v, w);
1155 Py_DECREF(v);
1156 Py_DECREF(w);
1157 PUSH(x);
1158 if (x != NULL) continue;
1159 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001160
Thomas Wouters434d0822000-08-24 20:11:32 +00001161 case INPLACE_XOR:
1162 w = POP();
1163 v = POP();
1164 x = PyNumber_InPlaceXor(v, w);
1165 Py_DECREF(v);
1166 Py_DECREF(w);
1167 PUSH(x);
1168 if (x != NULL) continue;
1169 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001170
Thomas Wouters434d0822000-08-24 20:11:32 +00001171 case INPLACE_OR:
1172 w = POP();
1173 v = POP();
1174 x = PyNumber_InPlaceOr(v, w);
1175 Py_DECREF(v);
1176 Py_DECREF(w);
1177 PUSH(x);
1178 if (x != NULL) continue;
1179 break;
1180
Guido van Rossum374a9221991-04-04 10:40:29 +00001181 case SLICE+0:
1182 case SLICE+1:
1183 case SLICE+2:
1184 case SLICE+3:
1185 if ((opcode-SLICE) & 2)
1186 w = POP();
1187 else
1188 w = NULL;
1189 if ((opcode-SLICE) & 1)
1190 v = POP();
1191 else
1192 v = NULL;
1193 u = POP();
1194 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001195 Py_DECREF(u);
1196 Py_XDECREF(v);
1197 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001198 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001199 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001200 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001201
Guido van Rossum374a9221991-04-04 10:40:29 +00001202 case STORE_SLICE+0:
1203 case STORE_SLICE+1:
1204 case STORE_SLICE+2:
1205 case STORE_SLICE+3:
1206 if ((opcode-STORE_SLICE) & 2)
1207 w = POP();
1208 else
1209 w = NULL;
1210 if ((opcode-STORE_SLICE) & 1)
1211 v = POP();
1212 else
1213 v = NULL;
1214 u = POP();
1215 t = POP();
1216 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001217 Py_DECREF(t);
1218 Py_DECREF(u);
1219 Py_XDECREF(v);
1220 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001221 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001222 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001223
Guido van Rossum374a9221991-04-04 10:40:29 +00001224 case DELETE_SLICE+0:
1225 case DELETE_SLICE+1:
1226 case DELETE_SLICE+2:
1227 case DELETE_SLICE+3:
1228 if ((opcode-DELETE_SLICE) & 2)
1229 w = POP();
1230 else
1231 w = NULL;
1232 if ((opcode-DELETE_SLICE) & 1)
1233 v = POP();
1234 else
1235 v = NULL;
1236 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001237 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001238 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001239 Py_DECREF(u);
1240 Py_XDECREF(v);
1241 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001242 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001243 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001244
Guido van Rossum374a9221991-04-04 10:40:29 +00001245 case STORE_SUBSCR:
1246 w = POP();
1247 v = POP();
1248 u = POP();
1249 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001250 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001251 Py_DECREF(u);
1252 Py_DECREF(v);
1253 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001254 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001255 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001256
Guido van Rossum374a9221991-04-04 10:40:29 +00001257 case DELETE_SUBSCR:
1258 w = POP();
1259 v = POP();
1260 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001261 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001262 Py_DECREF(v);
1263 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001264 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001265 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001266
Guido van Rossum374a9221991-04-04 10:40:29 +00001267 case PRINT_EXPR:
1268 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001269 w = PySys_GetObject("displayhook");
1270 if (w == NULL) {
1271 PyErr_SetString(PyExc_RuntimeError,
1272 "lost sys.displayhook");
1273 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001274 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001275 }
1276 if (err == 0) {
1277 x = Py_BuildValue("(O)", v);
1278 if (x == NULL)
1279 err = -1;
1280 }
1281 if (err == 0) {
1282 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001283 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001284 if (w == NULL)
1285 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001286 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001287 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001288 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001289 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001290
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001291 case PRINT_ITEM_TO:
1292 w = stream = POP();
1293 /* fall through to PRINT_ITEM */
1294
Guido van Rossum374a9221991-04-04 10:40:29 +00001295 case PRINT_ITEM:
1296 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001297 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001298 w = PySys_GetObject("stdout");
1299 if (w == NULL) {
1300 PyErr_SetString(PyExc_RuntimeError,
1301 "lost sys.stdout");
1302 err = -1;
1303 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001304 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001305 if (w != NULL && PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001306 err = PyFile_WriteString(" ", w);
1307 if (err == 0)
1308 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001309 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001310 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001311 char *s = PyString_AsString(v);
1312 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001313 if (len > 0 &&
1314 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001315 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001316 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001317 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001318 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001319 Py_XDECREF(stream);
1320 stream = NULL;
1321 if (err == 0)
1322 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001323 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001324
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001325 case PRINT_NEWLINE_TO:
1326 w = stream = POP();
1327 /* fall through to PRINT_NEWLINE */
1328
Guido van Rossum374a9221991-04-04 10:40:29 +00001329 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001330 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001331 w = PySys_GetObject("stdout");
1332 if (w == NULL)
1333 PyErr_SetString(PyExc_RuntimeError,
1334 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001335 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001336 if (w != NULL) {
1337 err = PyFile_WriteString("\n", w);
1338 if (err == 0)
1339 PyFile_SoftSpace(w, 0);
1340 }
1341 Py_XDECREF(stream);
1342 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001343 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001344
Thomas Wouters434d0822000-08-24 20:11:32 +00001345
1346#ifdef CASE_TOO_BIG
1347 default: switch (opcode) {
1348#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001349 case BREAK_LOOP:
1350 why = WHY_BREAK;
1351 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001352
Guido van Rossumf10570b1995-07-07 22:53:21 +00001353 case RAISE_VARARGS:
1354 u = v = w = NULL;
1355 switch (oparg) {
1356 case 3:
1357 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001358 /* Fallthrough */
1359 case 2:
1360 v = POP(); /* value */
1361 /* Fallthrough */
1362 case 1:
1363 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001364 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001365 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001366 break;
1367 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001368 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001369 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001370 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001371 break;
1372 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001373 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001374
Guido van Rossum374a9221991-04-04 10:40:29 +00001375 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001376 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001377 PyErr_SetString(PyExc_SystemError,
1378 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001379 break;
1380 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001381 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001382 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001383 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001384
Guido van Rossum374a9221991-04-04 10:40:29 +00001385 case RETURN_VALUE:
1386 retval = POP();
1387 why = WHY_RETURN;
1388 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001389
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001390 case EXEC_STMT:
1391 w = POP();
1392 v = POP();
1393 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001394 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001395 Py_DECREF(u);
1396 Py_DECREF(v);
1397 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001398 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001399
Guido van Rossum374a9221991-04-04 10:40:29 +00001400 case POP_BLOCK:
1401 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001402 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001403 while (STACK_LEVEL() > b->b_level) {
1404 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001405 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001406 }
1407 }
1408 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001409
Guido van Rossum374a9221991-04-04 10:40:29 +00001410 case END_FINALLY:
1411 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001412 if (PyInt_Check(v)) {
1413 why = (enum why_code) PyInt_AsLong(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001414 if (why == WHY_RETURN)
1415 retval = POP();
1416 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001417 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001418 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001419 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001420 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001421 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001422 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001423 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001424 else if (v != Py_None) {
1425 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001426 "'finally' pops bad exception");
1427 why = WHY_EXCEPTION;
1428 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001429 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001430 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001431
Guido van Rossum374a9221991-04-04 10:40:29 +00001432 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001433 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001434 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001435 w = POP();
1436 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001437 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001438 Py_DECREF(u);
1439 Py_DECREF(v);
1440 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001441 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001442
Guido van Rossum374a9221991-04-04 10:40:29 +00001443 case STORE_NAME:
1444 w = GETNAMEV(oparg);
1445 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001446 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001447 PyErr_Format(PyExc_SystemError,
1448 "no locals found when storing %s",
1449 REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001450 break;
1451 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001452 err = PyDict_SetItem(x, w, v);
1453 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001454 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001455
Guido van Rossum374a9221991-04-04 10:40:29 +00001456 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001457 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001458 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001459 PyErr_Format(PyExc_SystemError,
1460 "no locals when deleting %s",
1461 REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001462 break;
1463 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001464 if ((err = PyDict_DelItem(x, w)) != 0)
Guido van Rossumac7be682001-01-17 15:42:30 +00001465 format_exc_check_arg(PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001466 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001467 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001468
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001469 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001470 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001471 if (PyTuple_Check(v)) {
1472 if (PyTuple_Size(v) != oparg) {
1473 PyErr_SetString(PyExc_ValueError,
1474 "unpack tuple of wrong size");
1475 why = WHY_EXCEPTION;
1476 }
1477 else {
1478 for (; --oparg >= 0; ) {
1479 w = PyTuple_GET_ITEM(v, oparg);
1480 Py_INCREF(w);
1481 PUSH(w);
1482 }
1483 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001484 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001485 else if (PyList_Check(v)) {
1486 if (PyList_Size(v) != oparg) {
1487 PyErr_SetString(PyExc_ValueError,
1488 "unpack list of wrong size");
1489 why = WHY_EXCEPTION;
1490 }
1491 else {
1492 for (; --oparg >= 0; ) {
1493 w = PyList_GET_ITEM(v, oparg);
1494 Py_INCREF(w);
1495 PUSH(w);
1496 }
1497 }
1498 }
1499 else if (PySequence_Check(v)) {
1500 if (unpack_sequence(v, oparg,
1501 stack_pointer + oparg))
1502 stack_pointer += oparg;
1503 else
1504 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001505 }
1506 else {
Barry Warsawe42b18f1997-08-25 22:13:04 +00001507 PyErr_SetString(PyExc_TypeError,
1508 "unpack non-sequence");
1509 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001510 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001511 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001512 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001513
Guido van Rossum374a9221991-04-04 10:40:29 +00001514 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001515 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001516 v = POP();
1517 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001518 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1519 Py_DECREF(v);
1520 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001521 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001522
Guido van Rossum374a9221991-04-04 10:40:29 +00001523 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001524 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001525 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001526 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1527 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001528 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001529 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001530
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001531 case STORE_GLOBAL:
1532 w = GETNAMEV(oparg);
1533 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001534 err = PyDict_SetItem(f->f_globals, w, v);
1535 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001536 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001537
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001538 case DELETE_GLOBAL:
1539 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001540 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001541 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001542 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001543 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001544
Guido van Rossum374a9221991-04-04 10:40:29 +00001545 case LOAD_CONST:
1546 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001547 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001548 PUSH(x);
1549 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001550
Guido van Rossum374a9221991-04-04 10:40:29 +00001551 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001552 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001553 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001554 PyErr_Format(PyExc_SystemError,
1555 "no locals when loading %s",
1556 REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001557 break;
1558 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001559 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001560 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001561 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001562 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001563 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001564 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001565 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001566 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001567 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001568 break;
1569 }
1570 }
1571 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001572 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001573 PUSH(x);
1574 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001575
Guido van Rossum374a9221991-04-04 10:40:29 +00001576 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001577 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001578 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001579 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001580 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001581 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001582 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001583 PyExc_NameError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001584 GLOBAL_NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001585 break;
1586 }
1587 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001588 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001589 PUSH(x);
1590 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001591
Guido van Rossum9bfef441993-03-29 10:43:31 +00001592 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001593 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001594 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001595 format_exc_check_arg(
1596 PyExc_UnboundLocalError,
1597 UNBOUNDLOCAL_ERROR_MSG,
1598 PyTuple_GetItem(co->co_varnames, oparg)
1599 );
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001600 break;
1601 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001602 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001603 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001604 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001605 break;
1606
1607 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001608 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001609 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001610 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001611
1612 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001613 x = GETLOCAL(oparg);
1614 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001615 format_exc_check_arg(
1616 PyExc_UnboundLocalError,
1617 UNBOUNDLOCAL_ERROR_MSG,
1618 PyTuple_GetItem(co->co_varnames, oparg)
1619 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001620 break;
1621 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001622 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001623 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001624
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001625 case LOAD_CLOSURE:
1626 x = PyTuple_GET_ITEM(f->f_closure, oparg);
1627 Py_INCREF(x);
1628 PUSH(x);
1629 break;
1630
1631 case LOAD_DEREF:
1632 x = PyTuple_GET_ITEM(f->f_closure, oparg);
1633 w = PyCell_Get(x);
1634 Py_INCREF(w);
1635 PUSH(w);
1636 break;
1637
1638 case STORE_DEREF:
1639 w = POP();
1640 x = PyTuple_GET_ITEM(f->f_closure, oparg);
1641 PyCell_Set(x, w);
1642 continue;
1643
Guido van Rossum374a9221991-04-04 10:40:29 +00001644 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001645 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001646 if (x != NULL) {
1647 for (; --oparg >= 0;) {
1648 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001649 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001650 }
1651 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001652 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001653 }
1654 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001655
Guido van Rossum374a9221991-04-04 10:40:29 +00001656 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001657 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001658 if (x != NULL) {
1659 for (; --oparg >= 0;) {
1660 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001661 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001662 }
1663 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001664 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001665 }
1666 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001667
Guido van Rossum374a9221991-04-04 10:40:29 +00001668 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001669 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001670 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001671 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001672 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001673
Guido van Rossum374a9221991-04-04 10:40:29 +00001674 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001675 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001676 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001677 x = PyObject_GetAttr(v, w);
1678 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001679 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001680 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001681 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001682
Guido van Rossum374a9221991-04-04 10:40:29 +00001683 case COMPARE_OP:
1684 w = POP();
1685 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001686 if (PyInt_Check(v) && PyInt_Check(w)) {
1687 /* INLINE: cmp(int, int) */
1688 register long a, b;
1689 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001690 a = PyInt_AS_LONG(v);
1691 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001692 switch (oparg) {
1693 case LT: res = a < b; break;
1694 case LE: res = a <= b; break;
1695 case EQ: res = a == b; break;
1696 case NE: res = a != b; break;
1697 case GT: res = a > b; break;
1698 case GE: res = a >= b; break;
1699 case IS: res = v == w; break;
1700 case IS_NOT: res = v != w; break;
1701 default: goto slow_compare;
1702 }
1703 x = res ? Py_True : Py_False;
1704 Py_INCREF(x);
1705 }
1706 else {
1707 slow_compare:
1708 x = cmp_outcome(oparg, v, w);
1709 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001710 Py_DECREF(v);
1711 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001712 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001713 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001714 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001715
Guido van Rossum374a9221991-04-04 10:40:29 +00001716 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001717 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001718 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001719 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001720 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001721 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001722 break;
1723 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001724 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001725 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001726 w,
1727 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001728 f->f_locals == NULL ?
1729 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001730 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001731 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001732 if (w == NULL) {
1733 x = NULL;
1734 break;
1735 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001736 x = PyEval_CallObject(x, w);
1737 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001738 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001739 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001740 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001741
Thomas Wouters52152252000-08-17 22:55:00 +00001742 case IMPORT_STAR:
1743 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001744 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001745 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001746 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001747 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001748 break;
1749 }
Thomas Wouters52152252000-08-17 22:55:00 +00001750 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001751 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001752 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001753 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001754 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001755
Thomas Wouters52152252000-08-17 22:55:00 +00001756 case IMPORT_FROM:
1757 w = GETNAMEV(oparg);
1758 v = TOP();
1759 x = import_from(v, w);
1760 PUSH(x);
1761 if (x != NULL) continue;
1762 break;
1763
Guido van Rossum374a9221991-04-04 10:40:29 +00001764 case JUMP_FORWARD:
1765 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001766 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001767
Guido van Rossum374a9221991-04-04 10:40:29 +00001768 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001769 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001770 if (err > 0)
1771 err = 0;
1772 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001773 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001774 else
1775 break;
1776 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001777
Guido van Rossum374a9221991-04-04 10:40:29 +00001778 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001779 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001780 if (err > 0) {
1781 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001782 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001783 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001784 else if (err == 0)
1785 ;
1786 else
1787 break;
1788 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001789
Guido van Rossum374a9221991-04-04 10:40:29 +00001790 case JUMP_ABSOLUTE:
1791 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001792 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001793
Guido van Rossum374a9221991-04-04 10:40:29 +00001794 case FOR_LOOP:
1795 /* for v in s: ...
1796 On entry: stack contains s, i.
1797 On exit: stack contains s, i+1, s[i];
1798 but if loop exhausted:
1799 s, i are popped, and we jump */
1800 w = POP(); /* Loop index */
1801 v = POP(); /* Sequence object */
1802 u = loop_subscript(v, w);
1803 if (u != NULL) {
1804 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001805 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001806 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001807 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001808 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001809 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001810 }
1811 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001812 Py_DECREF(v);
1813 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001814 /* A NULL can mean "s exhausted"
1815 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001816 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001817 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001818 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001819 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001820 continue;
1821 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001822 }
1823 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001824
Guido van Rossum374a9221991-04-04 10:40:29 +00001825 case SETUP_LOOP:
1826 case SETUP_EXCEPT:
1827 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001828 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Guido van Rossum374a9221991-04-04 10:40:29 +00001829 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001830 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001831
Guido van Rossum374a9221991-04-04 10:40:29 +00001832 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001833#ifdef LLTRACE
1834 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001835 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001836#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001837 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001838 if (f->f_trace == NULL)
1839 continue;
1840 /* Trace each line of code reached */
1841 f->f_lasti = INSTR_OFFSET();
1842 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossumb209a111997-04-29 18:18:01 +00001843 f, "line", Py_None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001844 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001845
1846 case CALL_FUNCTION:
Jeremy Hylton52820442001-01-03 23:52:36 +00001847 {
1848 int na = oparg & 0xff;
1849 int nk = (oparg>>8) & 0xff;
1850 int n = na + 2 * nk;
1851 PyObject **pfunc = stack_pointer - n - 1;
1852 PyObject *func = *pfunc;
1853 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1854
1855 /* Always dispatch PyCFunction first, because
1856 these are presumed to be the most frequent
1857 callable object.
1858 */
1859 if (PyCFunction_Check(func)) {
1860 if (PyCFunction_GET_FLAGS(func) == 0) {
1861 x = fast_cfunction(func,
Guido van Rossumac7be682001-01-17 15:42:30 +00001862 &stack_pointer, na);
Jeremy Hylton52820442001-01-03 23:52:36 +00001863 } else {
1864 x = do_call(func, &stack_pointer,
1865 na, nk);
1866 }
1867 } else {
Guido van Rossumac7be682001-01-17 15:42:30 +00001868 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001869 && PyMethod_GET_SELF(func) != NULL) {
1870 /* optimize access to bound methods */
1871 PyObject *self = PyMethod_GET_SELF(func);
1872 Py_INCREF(self);
1873 func = PyMethod_GET_FUNCTION(func);
1874 Py_INCREF(func);
1875 Py_DECREF(*pfunc);
1876 *pfunc = self;
1877 na++;
1878 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00001879 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00001880 Py_INCREF(func);
1881 if (PyFunction_Check(func)) {
1882 x = fast_function(func, &stack_pointer,
Guido van Rossumac7be682001-01-17 15:42:30 +00001883 n, na, nk);
Jeremy Hylton52820442001-01-03 23:52:36 +00001884 } else {
1885 x = do_call(func, &stack_pointer,
1886 na, nk);
1887 }
1888 Py_DECREF(func);
1889 }
1890
1891 while (stack_pointer > pfunc) {
1892 w = POP();
1893 Py_DECREF(w);
1894 }
1895 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00001896 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00001897 continue;
1898 break;
1899 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001900
Jeremy Hylton76901512000-03-28 23:49:17 +00001901 case CALL_FUNCTION_VAR:
1902 case CALL_FUNCTION_KW:
1903 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001904 {
Jeremy Hylton76901512000-03-28 23:49:17 +00001905 int na = oparg & 0xff;
1906 int nk = (oparg>>8) & 0xff;
1907 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00001908 int n = na + 2 * nk;
1909 PyObject **pfunc, *func;
1910 if (flags & CALL_FLAG_VAR)
1911 n++;
1912 if (flags & CALL_FLAG_KW)
1913 n++;
1914 pfunc = stack_pointer - n - 1;
1915 func = *pfunc;
Jeremy Hylton76901512000-03-28 23:49:17 +00001916 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Jeremy Hylton52820442001-01-03 23:52:36 +00001917
Guido van Rossumac7be682001-01-17 15:42:30 +00001918 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001919 && PyMethod_GET_SELF(func) != NULL) {
1920 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00001921 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00001922 func = PyMethod_GET_FUNCTION(func);
1923 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00001924 Py_DECREF(*pfunc);
1925 *pfunc = self;
1926 na++;
1927 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00001928 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00001929 Py_INCREF(func);
1930 x = ext_do_call(func, &stack_pointer, flags, na, nk);
Jeremy Hylton76901512000-03-28 23:49:17 +00001931 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00001932
Jeremy Hylton76901512000-03-28 23:49:17 +00001933 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00001934 w = POP();
1935 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00001936 }
1937 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00001938 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00001939 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00001940 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001941 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001942
Guido van Rossum681d79a1995-07-18 14:51:37 +00001943 case MAKE_FUNCTION:
1944 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00001945 x = PyFunction_New(v, f->f_globals);
1946 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001947 /* XXX Maybe this should be a separate opcode? */
1948 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001949 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001950 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001951 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001952 x = NULL;
1953 break;
1954 }
1955 while (--oparg >= 0) {
1956 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001957 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001958 }
1959 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001960 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001961 }
1962 PUSH(x);
1963 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001964
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001965 case MAKE_CLOSURE:
1966 {
1967 int nfree;
1968 v = POP(); /* code object */
1969 x = PyFunction_New(v, f->f_globals);
1970 nfree = PyTuple_GET_SIZE(((PyCodeObject *)v)->co_freevars);
1971 Py_DECREF(v);
1972 /* XXX Maybe this should be a separate opcode? */
1973 if (x != NULL && nfree > 0) {
1974 v = PyTuple_New(nfree);
1975 if (v == NULL) {
1976 Py_DECREF(x);
1977 x = NULL;
1978 break;
1979 }
1980 while (--nfree >= 0) {
1981 w = POP();
1982 PyTuple_SET_ITEM(v, nfree, w);
1983 }
1984 err = PyFunction_SetClosure(x, v);
1985 Py_DECREF(v);
1986 }
1987 if (x != NULL && oparg > 0) {
1988 v = PyTuple_New(oparg);
1989 if (v == NULL) {
1990 Py_DECREF(x);
1991 x = NULL;
1992 break;
1993 }
1994 while (--oparg >= 0) {
1995 w = POP();
1996 PyTuple_SET_ITEM(v, oparg, w);
1997 }
1998 err = PyFunction_SetDefaults(x, v);
1999 Py_DECREF(v);
2000 }
2001 PUSH(x);
2002 break;
2003 }
2004
Guido van Rossum8861b741996-07-30 16:49:37 +00002005 case BUILD_SLICE:
2006 if (oparg == 3)
2007 w = POP();
2008 else
2009 w = NULL;
2010 v = POP();
2011 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002012 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002013 Py_DECREF(u);
2014 Py_DECREF(v);
2015 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00002016 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002017 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002018 break;
2019
Fred Drakeef8ace32000-08-24 00:32:09 +00002020 case EXTENDED_ARG:
2021 opcode = NEXTOP();
2022 oparg = oparg<<16 | NEXTARG();
2023 goto dispatch_opcode;
2024 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002025
Guido van Rossum374a9221991-04-04 10:40:29 +00002026 default:
2027 fprintf(stderr,
2028 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00002029 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002030 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002031 why = WHY_EXCEPTION;
2032 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002033
2034#ifdef CASE_TOO_BIG
2035 }
2036#endif
2037
Guido van Rossum374a9221991-04-04 10:40:29 +00002038 } /* switch */
2039
2040 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002041
Guido van Rossum374a9221991-04-04 10:40:29 +00002042 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002043
Guido van Rossum374a9221991-04-04 10:40:29 +00002044 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002045 if (err == 0 && x != NULL) {
2046#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002047 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002048 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002049 fprintf(stderr,
2050 "XXX undetected error\n");
2051 else
2052#endif
2053 continue; /* Normal, fast path */
2054 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002055 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002056 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002057 err = 0;
2058 }
2059
Guido van Rossum374a9221991-04-04 10:40:29 +00002060 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002061
Guido van Rossum374a9221991-04-04 10:40:29 +00002062 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002063 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002064 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002065 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002066 why = WHY_EXCEPTION;
2067 }
2068 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002069#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002070 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002071 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002072 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002073 fprintf(stderr,
2074 "XXX undetected error (why=%d)\n",
2075 why);
2076 why = WHY_EXCEPTION;
2077 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002078 }
2079#endif
2080
2081 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002082
Guido van Rossum374a9221991-04-04 10:40:29 +00002083 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002084 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00002085 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00002086 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00002087 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002088
Guido van Rossume59214e1994-08-30 08:01:59 +00002089 if (f->f_trace)
2090 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002091 if (tstate->sys_profilefunc)
2092 call_exc_trace(&tstate->sys_profilefunc,
2093 (PyObject**)0, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002094 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002095
Guido van Rossum374a9221991-04-04 10:40:29 +00002096 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002097
Guido van Rossum374a9221991-04-04 10:40:29 +00002098 if (why == WHY_RERAISE)
2099 why = WHY_EXCEPTION;
2100
2101 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002102
Guido van Rossum374a9221991-04-04 10:40:29 +00002103 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002104 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00002105 while (STACK_LEVEL() > b->b_level) {
2106 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002107 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002108 }
2109 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2110 why = WHY_NOT;
2111 JUMPTO(b->b_handler);
2112 break;
2113 }
2114 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002115 (b->b_type == SETUP_EXCEPT &&
2116 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002117 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002118 PyObject *exc, *val, *tb;
2119 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002120 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002121 val = Py_None;
2122 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002123 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002124 /* Make the raw exception data
2125 available to the handler,
2126 so a program can emulate the
2127 Python main loop. Don't do
2128 this for 'finally'. */
2129 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002130 PyErr_NormalizeException(
2131 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002132 set_exc_info(tstate,
2133 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002134 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002135 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002136 PUSH(val);
2137 PUSH(exc);
2138 }
2139 else {
2140 if (why == WHY_RETURN)
2141 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002142 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002143 PUSH(v);
2144 }
2145 why = WHY_NOT;
2146 JUMPTO(b->b_handler);
2147 break;
2148 }
2149 } /* unwind stack */
2150
2151 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002152
Guido van Rossum374a9221991-04-04 10:40:29 +00002153 if (why != WHY_NOT)
2154 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002155
Guido van Rossum374a9221991-04-04 10:40:29 +00002156 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002157
Guido van Rossum374a9221991-04-04 10:40:29 +00002158 /* Pop remaining stack entries */
Guido van Rossumac7be682001-01-17 15:42:30 +00002159
Guido van Rossum374a9221991-04-04 10:40:29 +00002160 while (!EMPTY()) {
2161 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002162 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002163 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002164
Guido van Rossum96a42c81992-01-12 02:29:51 +00002165 if (why != WHY_RETURN)
2166 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002167
Guido van Rossume59214e1994-08-30 08:01:59 +00002168 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002169 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00002170 if (call_trace(&f->f_trace, &f->f_trace, f,
2171 "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002172 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002173 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002174 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002175 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002176 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002177 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002178
Guido van Rossuma027efa1997-05-05 20:56:21 +00002179 if (tstate->sys_profilefunc && why == WHY_RETURN) {
2180 if (call_trace(&tstate->sys_profilefunc, (PyObject**)0,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002181 f, "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002182 Py_XDECREF(retval);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002183 retval = NULL;
2184 why = WHY_EXCEPTION;
2185 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002186 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002187
Guido van Rossuma027efa1997-05-05 20:56:21 +00002188 reset_exc_info(tstate);
2189
2190 --tstate->recursion_depth;
Guido van Rossum8c5df061997-01-24 04:19:24 +00002191
2192 fail: /* Jump here from prelude on failure */
Guido van Rossumac7be682001-01-17 15:42:30 +00002193
Guido van Rossum374a9221991-04-04 10:40:29 +00002194 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00002195
Guido van Rossuma027efa1997-05-05 20:56:21 +00002196 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +00002197 Py_DECREF(f);
Guido van Rossumac7be682001-01-17 15:42:30 +00002198
Guido van Rossum96a42c81992-01-12 02:29:51 +00002199 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002200}
2201
Guido van Rossuma027efa1997-05-05 20:56:21 +00002202static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002203set_exc_info(PyThreadState *tstate,
2204 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002205{
2206 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002207 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002208
Guido van Rossuma027efa1997-05-05 20:56:21 +00002209 frame = tstate->frame;
2210 if (frame->f_exc_type == NULL) {
2211 /* This frame didn't catch an exception before */
2212 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002213 if (tstate->exc_type == NULL) {
2214 Py_INCREF(Py_None);
2215 tstate->exc_type = Py_None;
2216 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002217 tmp_type = frame->f_exc_type;
2218 tmp_value = frame->f_exc_value;
2219 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002220 Py_XINCREF(tstate->exc_type);
2221 Py_XINCREF(tstate->exc_value);
2222 Py_XINCREF(tstate->exc_traceback);
2223 frame->f_exc_type = tstate->exc_type;
2224 frame->f_exc_value = tstate->exc_value;
2225 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002226 Py_XDECREF(tmp_type);
2227 Py_XDECREF(tmp_value);
2228 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002229 }
2230 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002231 tmp_type = tstate->exc_type;
2232 tmp_value = tstate->exc_value;
2233 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002234 Py_XINCREF(type);
2235 Py_XINCREF(value);
2236 Py_XINCREF(tb);
2237 tstate->exc_type = type;
2238 tstate->exc_value = value;
2239 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002240 Py_XDECREF(tmp_type);
2241 Py_XDECREF(tmp_value);
2242 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002243 /* For b/w compatibility */
2244 PySys_SetObject("exc_type", type);
2245 PySys_SetObject("exc_value", value);
2246 PySys_SetObject("exc_traceback", tb);
2247}
2248
2249static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002250reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002251{
2252 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002253 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002254 frame = tstate->frame;
2255 if (frame->f_exc_type != NULL) {
2256 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002257 tmp_type = tstate->exc_type;
2258 tmp_value = tstate->exc_value;
2259 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002260 Py_XINCREF(frame->f_exc_type);
2261 Py_XINCREF(frame->f_exc_value);
2262 Py_XINCREF(frame->f_exc_traceback);
2263 tstate->exc_type = frame->f_exc_type;
2264 tstate->exc_value = frame->f_exc_value;
2265 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002266 Py_XDECREF(tmp_type);
2267 Py_XDECREF(tmp_value);
2268 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002269 /* For b/w compatibility */
2270 PySys_SetObject("exc_type", frame->f_exc_type);
2271 PySys_SetObject("exc_value", frame->f_exc_value);
2272 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2273 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002274 tmp_type = frame->f_exc_type;
2275 tmp_value = frame->f_exc_value;
2276 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002277 frame->f_exc_type = NULL;
2278 frame->f_exc_value = NULL;
2279 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002280 Py_XDECREF(tmp_type);
2281 Py_XDECREF(tmp_value);
2282 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002283}
2284
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002285/* Logic for the raise statement (too complicated for inlining).
2286 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002287static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002288do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002289{
Guido van Rossumd295f121998-04-09 21:39:57 +00002290 if (type == NULL) {
2291 /* Reraise */
2292 PyThreadState *tstate = PyThreadState_Get();
2293 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2294 value = tstate->exc_value;
2295 tb = tstate->exc_traceback;
2296 Py_XINCREF(type);
2297 Py_XINCREF(value);
2298 Py_XINCREF(tb);
2299 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002300
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002301 /* We support the following forms of raise:
2302 raise <class>, <classinstance>
2303 raise <class>, <argument tuple>
2304 raise <class>, None
2305 raise <class>, <argument>
2306 raise <classinstance>, None
2307 raise <string>, <object>
2308 raise <string>, None
2309
2310 An omitted second argument is the same as None.
2311
2312 In addition, raise <tuple>, <anything> is the same as
2313 raising the tuple's first item (and it better have one!);
2314 this rule is applied recursively.
2315
2316 Finally, an optional third argument can be supplied, which
2317 gives the traceback to be substituted (useful when
2318 re-raising an exception after examining it). */
2319
2320 /* First, check the traceback argument, replacing None with
2321 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002322 if (tb == Py_None) {
2323 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002324 tb = NULL;
2325 }
2326 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002327 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002328 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002329 goto raise_error;
2330 }
2331
2332 /* Next, replace a missing value with None */
2333 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002334 value = Py_None;
2335 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002336 }
2337
2338 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002339 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2340 PyObject *tmp = type;
2341 type = PyTuple_GET_ITEM(type, 0);
2342 Py_INCREF(type);
2343 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002344 }
2345
Barry Warsaw4249f541997-08-22 21:26:19 +00002346 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002347 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002348
2349 else if (PyClass_Check(type))
2350 PyErr_NormalizeException(&type, &value, &tb);
2351
Guido van Rossumb209a111997-04-29 18:18:01 +00002352 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002353 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002354 if (value != Py_None) {
2355 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002356 "instance exception may not have a separate value");
2357 goto raise_error;
2358 }
2359 else {
2360 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002361 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002362 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002363 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2364 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002365 }
2366 }
2367 else {
2368 /* Not something you can raise. You get an exception
2369 anyway, just not what you specified :-) */
Guido van Rossumb209a111997-04-29 18:18:01 +00002370 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002371 "exceptions must be strings, classes, or instances");
2372 goto raise_error;
2373 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002374 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002375 if (tb == NULL)
2376 return WHY_EXCEPTION;
2377 else
2378 return WHY_RERAISE;
2379 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002380 Py_XDECREF(value);
2381 Py_XDECREF(type);
2382 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002383 return WHY_EXCEPTION;
2384}
2385
Barry Warsawe42b18f1997-08-25 22:13:04 +00002386static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002387unpack_sequence(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002388{
2389 int i;
2390 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00002391
Barry Warsawe42b18f1997-08-25 22:13:04 +00002392 for (i = 0; i < argcnt; i++) {
2393 if (! (w = PySequence_GetItem(v, i))) {
2394 if (PyErr_ExceptionMatches(PyExc_IndexError))
2395 PyErr_SetString(PyExc_ValueError,
2396 "unpack sequence of wrong size");
2397 goto finally;
2398 }
2399 *--sp = w;
2400 }
2401 /* we better get an IndexError now */
2402 if (PySequence_GetItem(v, i) == NULL) {
2403 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2404 PyErr_Clear();
2405 return 1;
2406 }
2407 /* some other exception occurred. fall through to finally */
2408 }
2409 else
2410 PyErr_SetString(PyExc_ValueError,
2411 "unpack sequence of wrong size");
2412 /* fall through */
2413finally:
Barry Warsaw91010551997-08-25 22:30:51 +00002414 for (; i > 0; i--, sp++)
2415 Py_DECREF(*sp);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002416
2417 return 0;
2418}
2419
2420
Guido van Rossum96a42c81992-01-12 02:29:51 +00002421#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002422static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002423prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002424{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002425 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002426 if (PyObject_Print(v, stdout, 0) != 0)
2427 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002428 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002429 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002430}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002431#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002432
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002433static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002434call_exc_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002435{
Guido van Rossumb209a111997-04-29 18:18:01 +00002436 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002437 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002438 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002439 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002440 value = Py_None;
2441 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002442 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002443 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002444 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002445 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002446 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002447 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002448 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002449 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002450 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002451 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002452 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002453 Py_XDECREF(type);
2454 Py_XDECREF(value);
2455 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002456 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002457}
2458
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002459/* PyObject **p_trace: in/out; may not be NULL;
2460 may not point to NULL variable initially
2461 PyObject **p_newtrace: in/out; may be NULL;
2462 may point to NULL variable;
2463 may be same variable as p_newtrace */
2464
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002465static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002466call_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f,
2467 char *msg, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002468{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002469 PyThreadState *tstate = f->f_tstate;
Guido van Rossumb209a111997-04-29 18:18:01 +00002470 PyObject *args, *what;
2471 PyObject *res = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002472
Guido van Rossuma027efa1997-05-05 20:56:21 +00002473 if (tstate->tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002474 /* Don't do recursive traces */
2475 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002476 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002477 *p_newtrace = NULL;
2478 }
2479 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002480 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002481
Guido van Rossumb209a111997-04-29 18:18:01 +00002482 args = PyTuple_New(3);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002483 if (args == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002484 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002485 what = PyString_FromString(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002486 if (what == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002487 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002488 Py_INCREF(f);
2489 PyTuple_SET_ITEM(args, 0, (PyObject *)f);
2490 PyTuple_SET_ITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002491 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002492 arg = Py_None;
2493 Py_INCREF(arg);
2494 PyTuple_SET_ITEM(args, 2, arg);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002495 tstate->tracing++;
Guido van Rossumb209a111997-04-29 18:18:01 +00002496 PyFrame_FastToLocals(f);
2497 res = PyEval_CallObject(*p_trace, args); /* May clear *p_trace! */
2498 PyFrame_LocalsToFast(f, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002499 tstate->tracing--;
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002500 cleanup:
Guido van Rossumb209a111997-04-29 18:18:01 +00002501 Py_XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002502 if (res == NULL) {
2503 /* The trace proc raised an exception */
Guido van Rossumb209a111997-04-29 18:18:01 +00002504 PyTraceBack_Here(f);
2505 Py_XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002506 *p_trace = NULL;
2507 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002508 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002509 *p_newtrace = NULL;
2510 }
Barry Warsawf6202631999-09-08 16:26:33 +00002511 /* to be extra double plus sure we don't get recursive
2512 * calls inf either tracefunc or profilefunc gets an
2513 * exception, zap the global variables.
2514 */
2515 Py_XDECREF(tstate->sys_tracefunc);
2516 tstate->sys_tracefunc = NULL;
2517 Py_XDECREF(tstate->sys_profilefunc);
2518 tstate->sys_profilefunc = NULL;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002519 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002520 }
2521 else {
2522 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002523 Py_XDECREF(*p_newtrace);
2524 if (res == Py_None)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002525 *p_newtrace = NULL;
2526 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002527 Py_INCREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002528 *p_newtrace = res;
2529 }
2530 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002531 Py_DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002532 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002533 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002534}
2535
Guido van Rossumb209a111997-04-29 18:18:01 +00002536PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002537PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002538{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002539 PyThreadState *tstate = PyThreadState_Get();
2540 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002541 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002542 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002543 else
2544 return current_frame->f_builtins;
2545}
2546
Guido van Rossumb209a111997-04-29 18:18:01 +00002547PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002548PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002549{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002550 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002551 if (current_frame == NULL)
2552 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002553 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002554 return current_frame->f_locals;
2555}
2556
Guido van Rossumb209a111997-04-29 18:18:01 +00002557PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002558PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002559{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002560 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002561 if (current_frame == NULL)
2562 return NULL;
2563 else
2564 return current_frame->f_globals;
2565}
2566
Guido van Rossumb209a111997-04-29 18:18:01 +00002567PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002568PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002569{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002570 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002571 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002572}
2573
Guido van Rossum6135a871995-01-09 17:53:26 +00002574int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002575PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002576{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002577 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002578 return current_frame == NULL ? 0 : current_frame->f_restricted;
2579}
2580
Guido van Rossumbe270261997-05-22 22:26:18 +00002581int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002582Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002583{
Guido van Rossumb209a111997-04-29 18:18:01 +00002584 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002585 if (f == NULL)
2586 return 0;
2587 if (!PyFile_SoftSpace(f, 0))
2588 return 0;
2589 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002590}
2591
Guido van Rossum3f5da241990-12-20 15:06:42 +00002592
Guido van Rossum681d79a1995-07-18 14:51:37 +00002593/* External interface to call any callable object.
2594 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002595
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002596#undef PyEval_CallObject
2597/* for backward compatibility: export this interface */
2598
Guido van Rossumb209a111997-04-29 18:18:01 +00002599PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002600PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002601{
Guido van Rossumb209a111997-04-29 18:18:01 +00002602 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002603}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002604#define PyEval_CallObject(func,arg) \
2605 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002606
Guido van Rossumb209a111997-04-29 18:18:01 +00002607PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002608PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002609{
Jeremy Hylton52820442001-01-03 23:52:36 +00002610 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002611
2612 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002613 arg = PyTuple_New(0);
2614 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002615 PyErr_SetString(PyExc_TypeError,
2616 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002617 return NULL;
2618 }
2619 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002620 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002621
Guido van Rossumb209a111997-04-29 18:18:01 +00002622 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002623 PyErr_SetString(PyExc_TypeError,
2624 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00002625 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002626 return NULL;
2627 }
2628
Jeremy Hylton52820442001-01-03 23:52:36 +00002629 result = call_object(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002630 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00002631 return result;
2632}
2633
2634/* How often is each kind of object called? The answer depends on the
2635 program. An instrumented call_object() was used to run the Python
2636 regression test suite. The results were:
2637 4200000 PyCFunctions
2638 390000 fast_function() calls
2639 94000 other functions
2640 480000 all functions (sum of prev two)
2641 150000 methods
2642 100000 classes
2643
2644 Tests on other bodies of code show that PyCFunctions are still
2645 most common, but not by such a large margin.
2646*/
2647
2648static PyObject *
2649call_object(PyObject *func, PyObject *arg, PyObject *kw)
2650{
2651 ternaryfunc call;
2652 PyObject *result;
2653
2654 if (PyMethod_Check(func))
2655 result = call_method(func, arg, kw);
2656 else if (PyFunction_Check(func))
2657 result = call_eval_code2(func, arg, kw);
2658 else if (PyCFunction_Check(func))
2659 result = call_cfunction(func, arg, kw);
2660 else if (PyClass_Check(func))
2661 result = PyInstance_New(func, arg, kw);
2662 else if (PyInstance_Check(func))
2663 result = call_instance(func, arg, kw);
2664 else if ((call = func->ob_type->tp_call) != NULL)
2665 result = (*call)(func, arg, kw);
2666 else {
2667 PyErr_Format(PyExc_TypeError, "object is not callable: %s",
2668 PyString_AS_STRING(PyObject_Repr(func)));
2669 return NULL;
2670 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002671 if (result == NULL && !PyErr_Occurred())
2672 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002673 "NULL result without error in call_object");
Guido van Rossumac7be682001-01-17 15:42:30 +00002674
Guido van Rossume59214e1994-08-30 08:01:59 +00002675 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002676}
2677
Guido van Rossumb209a111997-04-29 18:18:01 +00002678static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00002679call_cfunction(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002680{
Jeremy Hylton52820442001-01-03 23:52:36 +00002681 PyCFunctionObject* f = (PyCFunctionObject*)func;
2682 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
2683 PyObject *self = PyCFunction_GET_SELF(func);
2684 int flags = PyCFunction_GET_FLAGS(func);
2685
Jeremy Hylton52820442001-01-03 23:52:36 +00002686 if (flags & METH_KEYWORDS) {
Fred Drake1a7aab72001-01-04 22:33:02 +00002687 if (kw == NULL) {
2688 static PyObject *dict = NULL;
2689 if (dict == NULL) {
2690 dict = PyDict_New();
2691 if (dict == NULL)
2692 return NULL;
2693 }
2694 kw = dict;
2695 Py_INCREF(dict);
2696 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002697 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002698 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002699 if (kw != NULL && PyDict_Size(kw) != 0) {
2700 PyErr_Format(PyExc_TypeError,
2701 "%.200s() takes no keyword arguments",
2702 f->m_ml->ml_name);
2703 return NULL;
2704 }
Fred Drake1a7aab72001-01-04 22:33:02 +00002705 if (flags & METH_VARARGS) {
2706 return (*meth)(self, arg);
2707 }
2708 if (!(flags & METH_VARARGS)) {
2709 /* the really old style */
2710 int size = PyTuple_GET_SIZE(arg);
2711 if (size == 1)
2712 arg = PyTuple_GET_ITEM(arg, 0);
2713 else if (size == 0)
2714 arg = NULL;
2715 return (*meth)(self, arg);
2716 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002717 /* should never get here ??? */
2718 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002719 return NULL;
2720}
2721
Guido van Rossumb209a111997-04-29 18:18:01 +00002722static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00002723call_instance(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002724{
Jeremy Hylton52820442001-01-03 23:52:36 +00002725 PyObject *res, *call = PyObject_GetAttrString(func, "__call__");
2726 if (call == NULL) {
2727 PyInstanceObject *inst = (PyInstanceObject*) func;
2728 PyErr_Clear();
2729 PyErr_Format(PyExc_AttributeError,
2730 "%.200s instance has no __call__ method",
2731 PyString_AsString(inst->in_class->cl_name));
Guido van Rossum681d79a1995-07-18 14:51:37 +00002732 return NULL;
2733 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002734 res = call_object(call, arg, kw);
2735 Py_DECREF(call);
2736 return res;
2737}
2738
2739static PyObject *
2740call_method(PyObject *func, PyObject *arg, PyObject *kw)
2741{
2742 PyObject *self = PyMethod_GET_SELF(func);
2743 PyObject *class = PyMethod_GET_CLASS(func);
2744 PyObject *result;
2745
2746 func = PyMethod_GET_FUNCTION(func);
2747 if (self == NULL) {
2748 /* Unbound methods must be called with an instance of
2749 the class (or a derived class) as first argument */
2750 if (PyTuple_Size(arg) >= 1)
2751 self = PyTuple_GET_ITEM(arg, 0);
2752 if (!(self != NULL && PyInstance_Check(self)
2753 && PyClass_IsSubclass((PyObject *)
2754 (((PyInstanceObject *)self)->in_class),
2755 class))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00002756 PyObject* fn = ((PyFunctionObject*) func)->func_name;
2757 PyErr_Format(PyExc_TypeError,
2758 "unbound method %s%smust be "
2759 "called with instance as first argument",
2760 fn ? PyString_AsString(fn) : "",
2761 fn ? "() " : "");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002762 return NULL;
2763 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002764 Py_INCREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00002765 } else {
2766 int argcount = PyTuple_Size(arg);
2767 PyObject *newarg = PyTuple_New(argcount + 1);
2768 int i;
2769 if (newarg == NULL)
2770 return NULL;
2771 Py_INCREF(self);
2772 PyTuple_SET_ITEM(newarg, 0, self);
2773 for (i = 0; i < argcount; i++) {
2774 PyObject *v = PyTuple_GET_ITEM(arg, i);
2775 Py_XINCREF(v);
2776 PyTuple_SET_ITEM(newarg, i+1, v);
2777 }
2778 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002779 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002780 result = call_object(func, arg, kw);
2781 Py_DECREF(arg);
2782 return result;
2783}
2784
2785static PyObject *
2786call_eval_code2(PyObject *func, PyObject *arg, PyObject *kw)
2787{
2788 PyObject *result;
2789 PyObject *argdefs;
2790 PyObject **d, **k;
2791 int nk, nd;
2792
2793 argdefs = PyFunction_GET_DEFAULTS(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00002794 if (argdefs != NULL && PyTuple_Check(argdefs)) {
2795 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
2796 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002797 }
2798 else {
2799 d = NULL;
2800 nd = 0;
2801 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002802
Guido van Rossum681d79a1995-07-18 14:51:37 +00002803 if (kw != NULL) {
2804 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002805 nk = PyDict_Size(kw);
2806 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002807 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002808 PyErr_NoMemory();
2809 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002810 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002811 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002812 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002813 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002814 i += 2;
2815 nk = i/2;
2816 /* XXX This is broken if the caller deletes dict items! */
2817 }
2818 else {
2819 k = NULL;
2820 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002821 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002822
Guido van Rossum681d79a1995-07-18 14:51:37 +00002823 result = eval_code2(
Jeremy Hylton52820442001-01-03 23:52:36 +00002824 (PyCodeObject *)PyFunction_GET_CODE(func),
2825 PyFunction_GET_GLOBALS(func), (PyObject *)NULL,
Guido van Rossumb209a111997-04-29 18:18:01 +00002826 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002827 k, nk, d, nd,
2828 PyFunction_GET_CLOSURE(func));
Guido van Rossumac7be682001-01-17 15:42:30 +00002829
Guido van Rossumb18618d2000-05-03 23:44:39 +00002830 if (k != NULL)
2831 PyMem_DEL(k);
Guido van Rossumac7be682001-01-17 15:42:30 +00002832
Guido van Rossum681d79a1995-07-18 14:51:37 +00002833 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002834}
2835
Jeremy Hylton52820442001-01-03 23:52:36 +00002836#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
2837
2838/* The two fast_xxx() functions optimize calls for which no argument
2839 tuple is necessary; the objects are passed directly from the stack.
2840 fast_cfunction() is called for METH_OLDARGS functions.
2841 fast_function() is for functions with no special argument handling.
2842*/
2843
2844static PyObject *
2845fast_cfunction(PyObject *func, PyObject ***pp_stack, int na)
2846{
2847 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
2848 PyObject *self = PyCFunction_GET_SELF(func);
2849
2850 if (na == 0)
2851 return (*meth)(self, NULL);
Charles G. Waldmaneec72a72001-01-10 22:11:59 +00002852 else if (na == 1) {
2853 PyObject *arg = EXT_POP(*pp_stack);
Guido van Rossumac7be682001-01-17 15:42:30 +00002854 PyObject *result = (*meth)(self, arg);
Charles G. Waldmaneec72a72001-01-10 22:11:59 +00002855 Py_DECREF(arg);
2856 return result;
2857 } else {
Jeremy Hylton52820442001-01-03 23:52:36 +00002858 PyObject *args = load_args(pp_stack, na);
2859 PyObject *result = (*meth)(self, args);
2860 Py_DECREF(args);
2861 return result;
2862 }
2863}
2864
2865static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00002866fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00002867{
2868 PyObject *co = PyFunction_GET_CODE(func);
2869 PyObject *globals = PyFunction_GET_GLOBALS(func);
2870 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002871 PyObject *closure = PyFunction_GET_CLOSURE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002872 PyObject **d = NULL;
2873 int nd = 0;
2874
2875 if (argdefs != NULL) {
2876 d = &PyTuple_GET_ITEM(argdefs, 0);
2877 nd = ((PyTupleObject *)argdefs)->ob_size;
2878 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002879 return eval_code2((PyCodeObject *)co, globals,
Jeremy Hylton52820442001-01-03 23:52:36 +00002880 (PyObject *)NULL, (*pp_stack)-n, na,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002881 (*pp_stack)-2*nk, nk, d, nd,
2882 closure);
Jeremy Hylton52820442001-01-03 23:52:36 +00002883}
2884
2885static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00002886update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
2887 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00002888{
2889 PyObject *kwdict = NULL;
2890 if (orig_kwdict == NULL)
2891 kwdict = PyDict_New();
2892 else {
2893 kwdict = PyDict_Copy(orig_kwdict);
2894 Py_DECREF(orig_kwdict);
2895 }
2896 if (kwdict == NULL)
2897 return NULL;
2898 while (--nk >= 0) {
2899 int err;
2900 PyObject *value = EXT_POP(*pp_stack);
2901 PyObject *key = EXT_POP(*pp_stack);
2902 if (PyDict_GetItem(kwdict, key) != NULL) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00002903 PyObject* fn = ((PyFunctionObject*) func)->func_name;
Guido van Rossumac7be682001-01-17 15:42:30 +00002904 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00002905 "%.200s%s got multiple values "
2906 "for keyword argument '%.400s'",
2907 fn ? PyString_AsString(fn) : "function",
2908 fn ? "()" : "", PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00002909 Py_DECREF(key);
2910 Py_DECREF(value);
2911 Py_DECREF(kwdict);
2912 return NULL;
2913 }
2914 err = PyDict_SetItem(kwdict, key, value);
2915 Py_DECREF(key);
2916 Py_DECREF(value);
2917 if (err) {
2918 Py_DECREF(kwdict);
2919 return NULL;
2920 }
2921 }
2922 return kwdict;
2923}
2924
2925static PyObject *
2926update_star_args(int nstack, int nstar, PyObject *stararg,
2927 PyObject ***pp_stack)
2928{
2929 PyObject *callargs, *w;
2930
2931 callargs = PyTuple_New(nstack + nstar);
2932 if (callargs == NULL) {
2933 return NULL;
2934 }
2935 if (nstar) {
2936 int i;
2937 for (i = 0; i < nstar; i++) {
2938 PyObject *a = PyTuple_GET_ITEM(stararg, i);
2939 Py_INCREF(a);
2940 PyTuple_SET_ITEM(callargs, nstack + i, a);
2941 }
2942 }
2943 while (--nstack >= 0) {
2944 w = EXT_POP(*pp_stack);
2945 PyTuple_SET_ITEM(callargs, nstack, w);
2946 }
2947 return callargs;
2948}
2949
2950static PyObject *
2951load_args(PyObject ***pp_stack, int na)
2952{
2953 PyObject *args = PyTuple_New(na);
2954 PyObject *w;
2955
2956 if (args == NULL)
2957 return NULL;
2958 while (--na >= 0) {
2959 w = EXT_POP(*pp_stack);
2960 PyTuple_SET_ITEM(args, na, w);
2961 }
2962 return args;
2963}
2964
2965static PyObject *
2966do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
2967{
2968 PyObject *callargs = NULL;
2969 PyObject *kwdict = NULL;
2970 PyObject *result = NULL;
2971
2972 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00002973 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002974 if (kwdict == NULL)
2975 goto call_fail;
2976 }
2977 callargs = load_args(pp_stack, na);
2978 if (callargs == NULL)
2979 goto call_fail;
2980 result = call_object(func, callargs, kwdict);
2981 call_fail:
2982 Py_XDECREF(callargs);
2983 Py_XDECREF(kwdict);
2984 return result;
2985}
2986
2987static PyObject *
2988ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
2989{
2990 int nstar = 0;
2991 PyObject *callargs = NULL;
2992 PyObject *stararg = NULL;
2993 PyObject *kwdict = NULL;
2994 PyObject *result = NULL;
2995
2996 if (flags & CALL_FLAG_KW) {
2997 kwdict = EXT_POP(*pp_stack);
2998 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00002999 PyObject* fn = ((PyFunctionObject*) func)->func_name;
3000 PyErr_Format(PyExc_TypeError,
3001 "%s%s argument after ** must be a dictionary",
3002 fn ? PyString_AsString(fn) : "function",
3003 fn ? "()" : "");
Jeremy Hylton52820442001-01-03 23:52:36 +00003004 goto ext_call_fail;
3005 }
3006 }
3007 if (flags & CALL_FLAG_VAR) {
3008 stararg = EXT_POP(*pp_stack);
3009 if (!PyTuple_Check(stararg)) {
3010 PyObject *t = NULL;
3011 t = PySequence_Tuple(stararg);
3012 if (t == NULL) {
3013 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003014 PyObject* fn =
3015 ((PyFunctionObject*) func)->func_name;
3016 PyErr_Format(PyExc_TypeError,
3017 "%s%s argument after * must be a sequence",
3018 fn ? PyString_AsString(fn) : "function",
3019 fn ? "()" : "");
Jeremy Hylton52820442001-01-03 23:52:36 +00003020 }
3021 goto ext_call_fail;
3022 }
3023 Py_DECREF(stararg);
3024 stararg = t;
3025 }
3026 nstar = PyTuple_GET_SIZE(stararg);
3027 }
3028 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003029 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003030 if (kwdict == NULL)
3031 goto ext_call_fail;
3032 }
3033 callargs = update_star_args(na, nstar, stararg, pp_stack);
3034 if (callargs == NULL)
3035 goto ext_call_fail;
3036 result = call_object(func, callargs, kwdict);
3037 ext_call_fail:
3038 Py_XDECREF(callargs);
3039 Py_XDECREF(kwdict);
3040 Py_XDECREF(stararg);
3041 return result;
3042}
3043
Guido van Rossum3b9c6671996-07-30 18:40:29 +00003044#define SLICE_ERROR_MSG \
3045 "standard sequence type does not support step size other than one"
3046
Guido van Rossumb209a111997-04-29 18:18:01 +00003047static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003048loop_subscript(PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003049{
Guido van Rossumb209a111997-04-29 18:18:01 +00003050 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00003051 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003052 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003053 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003054 return NULL;
3055 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003056 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00003057 v = (*sq->sq_item)(v, i);
3058 if (v)
3059 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00003060 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00003061 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00003062 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003063}
3064
Guido van Rossum20c6add2000-05-08 14:06:50 +00003065/* Extract a slice index from a PyInt or PyLong, the index is bound to
3066 the range [-INT_MAX+1, INTMAX]. Returns 0 and an exception if there is
3067 and error. Returns 1 on success.*/
3068
3069int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003070_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003071{
3072 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003073 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003074 if (PyInt_Check(v)) {
3075 x = PyInt_AsLong(v);
3076 } else if (PyLong_Check(v)) {
3077 x = PyLong_AsLong(v);
3078 if (x==-1 && PyErr_Occurred()) {
3079 PyObject *long_zero;
Guido van Rossumac7be682001-01-17 15:42:30 +00003080 int cmp;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003081
Guido van Rossumac7be682001-01-17 15:42:30 +00003082 if (!PyErr_ExceptionMatches(
3083 PyExc_OverflowError)) {
3084 /* It's not an overflow error, so just
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003085 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00003086 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003087 }
3088
Guido van Rossumac7be682001-01-17 15:42:30 +00003089 /* Clear the OverflowError */
3090 PyErr_Clear();
3091
3092 /* It's an overflow error, so we need to
3093 check the sign of the long integer,
3094 set the value to INT_MAX or 0, and clear
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003095 the error. */
3096
3097 /* Create a long integer with a value of 0 */
Guido van Rossumac7be682001-01-17 15:42:30 +00003098 long_zero = PyLong_FromLong(0L);
Guido van Rossum20c6add2000-05-08 14:06:50 +00003099 if (long_zero == NULL) return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003100
3101 /* Check sign */
Guido van Rossumac7be682001-01-17 15:42:30 +00003102 cmp = PyObject_RichCompareBool(v, long_zero,
3103 Py_GT);
3104 Py_DECREF(long_zero);
3105 if (cmp < 0)
3106 return 0;
3107 else if (cmp > 0)
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003108 x = INT_MAX;
3109 else
3110 x = 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003111 }
3112 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003113 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003114 "slice indices must be integers");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003115 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003116 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003117 /* Truncate -- very long indices are truncated anyway */
3118 if (x > INT_MAX)
3119 x = INT_MAX;
3120 else if (x < -INT_MAX)
3121 x = 0;
3122 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003123 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003124 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003125}
3126
Guido van Rossumb209a111997-04-29 18:18:01 +00003127static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003128apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003129{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003130 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003131 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003132 return NULL;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003133 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum04691fc1992-08-12 15:35:34 +00003134 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003135 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003136}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003137
3138static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003139assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3140 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003141{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003142 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003143 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum3f5da241990-12-20 15:06:42 +00003144 return -1;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003145 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum3f5da241990-12-20 15:06:42 +00003146 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003147 if (x == NULL)
3148 return PySequence_DelSlice(u, ilow, ihigh);
3149 else
3150 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003151}
3152
Guido van Rossumb209a111997-04-29 18:18:01 +00003153static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003154cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003155{
Guido van Rossumac7be682001-01-17 15:42:30 +00003156 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003157 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00003158 case IS:
3159 case IS_NOT:
3160 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00003161 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003162 res = !res;
3163 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003164 case IN:
3165 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003166 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003167 if (res < 0)
3168 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00003169 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003170 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003171 break;
3172 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00003173 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003174 break;
3175 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003176 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003177 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003178 v = res ? Py_True : Py_False;
3179 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003180 return v;
3181}
3182
Thomas Wouters52152252000-08-17 22:55:00 +00003183static PyObject *
3184import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003185{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003186 PyObject *x;
3187
3188 x = PyObject_GetAttr(v, name);
3189 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00003190 PyErr_Format(PyExc_ImportError,
3191 "cannot import name %.230s",
3192 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003193 }
Thomas Wouters52152252000-08-17 22:55:00 +00003194 return x;
3195}
Guido van Rossumac7be682001-01-17 15:42:30 +00003196
Thomas Wouters52152252000-08-17 22:55:00 +00003197static int
3198import_all_from(PyObject *locals, PyObject *v)
3199{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003200 PyObject *all = PyObject_GetAttrString(v, "__all__");
3201 PyObject *dict, *name, *value;
3202 int skip_leading_underscores = 0;
3203 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003204
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003205 if (all == NULL) {
3206 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3207 return -1; /* Unexpected error */
3208 PyErr_Clear();
3209 dict = PyObject_GetAttrString(v, "__dict__");
3210 if (dict == NULL) {
3211 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3212 return -1;
3213 PyErr_SetString(PyExc_ImportError,
3214 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003215 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003216 }
3217 all = PyMapping_Keys(dict);
3218 Py_DECREF(dict);
3219 if (all == NULL)
3220 return -1;
3221 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003222 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003223
3224 for (pos = 0, err = 0; ; pos++) {
3225 name = PySequence_GetItem(all, pos);
3226 if (name == NULL) {
3227 if (!PyErr_ExceptionMatches(PyExc_IndexError))
3228 err = -1;
3229 else
3230 PyErr_Clear();
3231 break;
3232 }
3233 if (skip_leading_underscores &&
3234 PyString_Check(name) &&
3235 PyString_AS_STRING(name)[0] == '_')
3236 {
3237 Py_DECREF(name);
3238 continue;
3239 }
3240 value = PyObject_GetAttr(v, name);
3241 if (value == NULL)
3242 err = -1;
3243 else
3244 err = PyDict_SetItem(locals, name, value);
3245 Py_DECREF(name);
3246 Py_XDECREF(value);
3247 if (err != 0)
3248 break;
3249 }
3250 Py_DECREF(all);
3251 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003252}
3253
Guido van Rossumb209a111997-04-29 18:18:01 +00003254static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003255build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003256{
Guido van Rossumcd649651997-08-22 16:56:16 +00003257 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003258 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003259 PyErr_SetString(PyExc_SystemError,
3260 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00003261 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003262 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003263 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003264 PyErr_SetString(PyExc_SystemError,
3265 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00003266 return NULL;
3267 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003268 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003269 PyErr_SetString(PyExc_SystemError,
Guido van Rossum7a5b7962000-03-31 13:52:29 +00003270 "build_class with non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00003271 return NULL;
3272 }
Guido van Rossumcd649651997-08-22 16:56:16 +00003273 n = PyTuple_Size(bases);
3274 for (i = 0; i < n; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003275 PyObject *base = PyTuple_GET_ITEM(bases, i);
3276 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00003277 /* Call the base's *type*, if it is callable.
3278 This code is a hook for Donald Beaudry's
3279 and Jim Fulton's type extensions. In
Thomas Wouters7e474022000-07-16 12:04:32 +00003280 unextended Python it will never be triggered
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003281 since its types are not callable.
3282 Ditto: call the bases's *class*, if it has
3283 one. This makes the same thing possible
3284 without writing C code. A true meta-object
3285 protocol! */
3286 PyObject *basetype = (PyObject *)base->ob_type;
3287 PyObject *callable = NULL;
3288 if (PyCallable_Check(basetype))
3289 callable = basetype;
3290 else
3291 callable = PyObject_GetAttrString(
3292 base, "__class__");
3293 if (callable) {
3294 PyObject *args;
3295 PyObject *newclass = NULL;
3296 args = Py_BuildValue(
3297 "(OOO)", name, bases, methods);
3298 if (args != NULL) {
3299 newclass = PyEval_CallObject(
3300 callable, args);
3301 Py_DECREF(args);
3302 }
Guido van Rossum730806d1998-04-10 22:27:42 +00003303 if (callable != basetype) {
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003304 Py_DECREF(callable);
Guido van Rossum730806d1998-04-10 22:27:42 +00003305 }
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003306 return newclass;
Guido van Rossum150b2df1996-12-05 23:17:11 +00003307 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003308 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00003309 "base is not a class object");
3310 return NULL;
3311 }
3312 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003313 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00003314}
3315
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003316static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003317exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3318 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003319{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003320 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003321 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003322 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003323
Guido van Rossumb209a111997-04-29 18:18:01 +00003324 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3325 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003326 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003327 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003328 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003329 locals = PyTuple_GetItem(prog, 2);
3330 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003331 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003332 if (globals == Py_None) {
3333 globals = PyEval_GetGlobals();
3334 if (locals == Py_None) {
3335 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003336 plain = 1;
3337 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003338 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003339 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003340 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003341 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003342 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003343 !PyCode_Check(prog) &&
3344 !PyFile_Check(prog)) {
3345 PyErr_SetString(PyExc_TypeError,
Guido van Rossumac7be682001-01-17 15:42:30 +00003346 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003347 return -1;
3348 }
Fred Drake661ea262000-10-24 19:57:45 +00003349 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003350 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003351 "exec: arg 2 must be a dictionary or None");
3352 return -1;
3353 }
3354 if (!PyDict_Check(locals)) {
3355 PyErr_SetString(PyExc_TypeError,
3356 "exec: arg 3 must be a dictionary or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003357 return -1;
3358 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003359 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003360 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003361 if (PyCode_Check(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003362 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003363 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003364 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003365 FILE *fp = PyFile_AsFile(prog);
3366 char *name = PyString_AsString(PyFile_Name(prog));
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003367 v = PyRun_File(fp, name, Py_file_input, globals, locals);
3368 }
3369 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003370 char *str;
3371 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003372 return -1;
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003373 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003374 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003375 if (plain)
3376 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003377 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003378 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003379 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003380 return 0;
3381}
Guido van Rossum24c13741995-02-14 09:42:43 +00003382
Guido van Rossumac7be682001-01-17 15:42:30 +00003383static void
Paul Prescode68140d2000-08-30 20:25:01 +00003384format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3385{
3386 char *obj_str;
3387
3388 if (!obj)
3389 return;
3390
3391 obj_str = PyString_AsString(obj);
3392 if (!obj_str)
3393 return;
3394
3395 PyErr_Format(exc, format_str, obj_str);
3396}
Guido van Rossum950361c1997-01-24 13:49:28 +00003397
3398#ifdef DYNAMIC_EXECUTION_PROFILE
3399
3400PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003401getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003402{
3403 int i;
3404 PyObject *l = PyList_New(256);
3405 if (l == NULL) return NULL;
3406 for (i = 0; i < 256; i++) {
3407 PyObject *x = PyInt_FromLong(a[i]);
3408 if (x == NULL) {
3409 Py_DECREF(l);
3410 return NULL;
3411 }
3412 PyList_SetItem(l, i, x);
3413 }
3414 for (i = 0; i < 256; i++)
3415 a[i] = 0;
3416 return l;
3417}
3418
3419PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003420_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003421{
3422#ifndef DXPAIRS
3423 return getarray(dxp);
3424#else
3425 int i;
3426 PyObject *l = PyList_New(257);
3427 if (l == NULL) return NULL;
3428 for (i = 0; i < 257; i++) {
3429 PyObject *x = getarray(dxpairs[i]);
3430 if (x == NULL) {
3431 Py_DECREF(l);
3432 return NULL;
3433 }
3434 PyList_SetItem(l, i, x);
3435 }
3436 return l;
3437#endif
3438}
3439
3440#endif