blob: 5d593f28b26e455add70265bc3011ffe30bbcb64 [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 */
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000371 register PyObject **fastlocals, **freevars;
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;
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000442 freevars = f->f_localsplus + f->f_nlocals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000443
444 if (co->co_argcount > 0 ||
445 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
446 int i;
447 int n = argcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000448 PyObject *kwdict = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000449 if (co->co_flags & CO_VARKEYWORDS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000450 kwdict = PyDict_New();
Guido van Rossum681d79a1995-07-18 14:51:37 +0000451 if (kwdict == NULL)
452 goto fail;
Guido van Rossum8c5df061997-01-24 04:19:24 +0000453 i = co->co_argcount;
454 if (co->co_flags & CO_VARARGS)
455 i++;
456 SETLOCAL(i, kwdict);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000457 }
458 if (argcount > co->co_argcount) {
459 if (!(co->co_flags & CO_VARARGS)) {
Guido van Rossumdf9db1e1997-11-19 16:05:40 +0000460 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +0000461 "%.200s() takes %s %d "
462 "%sargument%s (%d given)",
Fred Drake661ea262000-10-24 19:57:45 +0000463 PyString_AsString(co->co_name),
Ka-Ping Yee20579702001-01-15 22:14:16 +0000464 defcount ? "at most" : "exactly",
465 co->co_argcount,
466 kwcount ? "non-keyword " : "",
467 co->co_argcount == 1 ? "" : "s",
468 argcount);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000469 goto fail;
470 }
471 n = co->co_argcount;
472 }
473 for (i = 0; i < n; i++) {
474 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000475 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000476 SETLOCAL(i, x);
477 }
478 if (co->co_flags & CO_VARARGS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000479 u = PyTuple_New(argcount - n);
Guido van Rossum8c5df061997-01-24 04:19:24 +0000480 if (u == NULL)
481 goto fail;
482 SETLOCAL(co->co_argcount, u);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000483 for (i = n; i < argcount; i++) {
484 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000485 Py_INCREF(x);
486 PyTuple_SET_ITEM(u, i-n, x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000487 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000488 }
489 for (i = 0; i < kwcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000490 PyObject *keyword = kws[2*i];
491 PyObject *value = kws[2*i + 1];
Guido van Rossum681d79a1995-07-18 14:51:37 +0000492 int j;
Guido van Rossum25da5be1999-10-26 00:12:20 +0000493 if (keyword == NULL || !PyString_Check(keyword)) {
Ka-Ping Yee20579702001-01-15 22:14:16 +0000494 PyErr_Format(PyExc_TypeError,
495 "%.200s() keywords must be strings",
496 PyString_AsString(co->co_name));
Guido van Rossum25da5be1999-10-26 00:12:20 +0000497 goto fail;
498 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000499 /* XXX slow -- speed up using dictionary? */
500 for (j = 0; j < co->co_argcount; j++) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000501 PyObject *nm = PyTuple_GET_ITEM(
502 co->co_varnames, j);
Guido van Rossumac7be682001-01-17 15:42:30 +0000503 int cmp = PyObject_RichCompareBool(
504 keyword, nm, Py_EQ);
505 if (cmp > 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000506 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000507 else if (cmp < 0)
508 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000509 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000510 /* Check errors from Compare */
511 if (PyErr_Occurred())
512 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000513 if (j >= co->co_argcount) {
514 if (kwdict == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000515 PyErr_Format(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +0000516 "%.200s() got an unexpected "
517 "keyword argument '%.400s'",
518 PyString_AsString(co->co_name),
Jeremy Hylton76901512000-03-28 23:49:17 +0000519 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000520 goto fail;
521 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000522 PyDict_SetItem(kwdict, keyword, value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000523 }
524 else {
525 if (GETLOCAL(j) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000526 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +0000527 "%.200s() got multiple "
528 "values for keyword "
529 "argument '%.400s'",
530 PyString_AsString(co->co_name),
531 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000532 goto fail;
533 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000534 Py_INCREF(value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000535 SETLOCAL(j, value);
536 }
537 }
538 if (argcount < co->co_argcount) {
539 int m = co->co_argcount - defcount;
540 for (i = argcount; i < m; i++) {
541 if (GETLOCAL(i) == NULL) {
Guido van Rossumdf9db1e1997-11-19 16:05:40 +0000542 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +0000543 "%.200s() takes %s %d "
544 "%sargument%s (%d given)",
Fred Drake661ea262000-10-24 19:57:45 +0000545 PyString_AsString(co->co_name),
Ka-Ping Yee20579702001-01-15 22:14:16 +0000546 ((co->co_flags & CO_VARARGS) ||
547 defcount) ? "at least"
548 : "exactly",
549 m, kwcount ? "non-keyword " : "",
550 m == 1 ? "" : "s", i);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000551 goto fail;
552 }
553 }
554 if (n > m)
555 i = n - m;
556 else
557 i = 0;
558 for (; i < defcount; i++) {
559 if (GETLOCAL(m+i) == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000560 PyObject *def = defs[i];
561 Py_INCREF(def);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000562 SETLOCAL(m+i, def);
563 }
564 }
565 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000566 }
567 else {
568 if (argcount > 0 || kwcount > 0) {
Fred Drake661ea262000-10-24 19:57:45 +0000569 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +0000570 "%.200s() takes no arguments (%d given)",
571 PyString_AsString(co->co_name),
572 argcount + kwcount);
Guido van Rossum8c5df061997-01-24 04:19:24 +0000573 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000574 }
575 }
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000576 /* Allocate storage for cell vars and copy free vars into frame */
577 if (f->f_ncells) {
578 int i;
579 for (i = 0; i < f->f_ncells; ++i)
580 freevars[i] = PyCell_New(NULL);
581 }
582 if (f->f_nfreevars) {
583 int i;
584 for (i = 0; i < f->f_nfreevars; ++i)
585 freevars[f->f_ncells + i] = PyTuple_GET_ITEM(closure, i);
586 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000587
Guido van Rossuma027efa1997-05-05 20:56:21 +0000588 if (tstate->sys_tracefunc != NULL) {
589 /* tstate->sys_tracefunc, if defined, is a function that
590 will be called on *every* entry to a code block.
Guido van Rossum96a42c81992-01-12 02:29:51 +0000591 Its return value, if not None, is a function that
592 will be called at the start of each executed line
593 of code. (Actually, the function must return
594 itself in order to continue tracing.)
595 The trace functions are called with three arguments:
596 a pointer to the current frame, a string indicating
597 why the function is called, and an argument which
598 depends on the situation. The global trace function
599 (sys.trace) is also called whenever an exception
600 is detected. */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000601 if (call_trace(&tstate->sys_tracefunc,
602 &f->f_trace, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000603 Py_None/*XXX how to compute arguments now?*/)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000604 /* Trace function raised an error */
Guido van Rossum8c5df061997-01-24 04:19:24 +0000605 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000606 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000607 }
608
Guido van Rossuma027efa1997-05-05 20:56:21 +0000609 if (tstate->sys_profilefunc != NULL) {
610 /* Similar for sys_profilefunc, except it needn't return
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000611 itself and isn't called for "line" events */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000612 if (call_trace(&tstate->sys_profilefunc,
613 (PyObject**)0, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000614 Py_None/*XXX*/)) {
Guido van Rossum8c5df061997-01-24 04:19:24 +0000615 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000616 }
617 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000618
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000619 if (++tstate->recursion_depth > recursion_limit) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000620 --tstate->recursion_depth;
621 PyErr_SetString(PyExc_RuntimeError,
Fred Drake661ea262000-10-24 19:57:45 +0000622 "maximum recursion depth exceeded");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000623 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +0000624 Py_DECREF(f);
Guido van Rossum8861b741996-07-30 16:49:37 +0000625 return NULL;
626 }
627
Guido van Rossumd076c731998-10-07 19:42:25 +0000628 _PyCode_GETCODEPTR(co, &first_instr);
629 next_instr = first_instr;
Guido van Rossum374a9221991-04-04 10:40:29 +0000630 stack_pointer = f->f_valuestack;
Guido van Rossumac7be682001-01-17 15:42:30 +0000631
Guido van Rossum374a9221991-04-04 10:40:29 +0000632 why = WHY_NOT;
633 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000634 x = Py_None; /* Not a reference, just anything non-NULL */
Fred Drake48fba732000-10-11 13:54:07 +0000635 w = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +0000636
Guido van Rossum374a9221991-04-04 10:40:29 +0000637 for (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000638 /* Do periodic things. Doing this every time through
639 the loop would add too much overhead, so we do it
640 only every Nth instruction. We also do it if
641 ``things_to_do'' is set, i.e. when an asynchronous
642 event needs attention (e.g. a signal handler or
643 async I/O handler); see Py_AddPendingCall() and
644 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +0000645
Guido van Rossuma027efa1997-05-05 20:56:21 +0000646 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000647 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000648 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000649 if (Py_MakePendingCalls() < 0) {
650 why = WHY_EXCEPTION;
651 goto on_error;
652 }
653 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000654#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000655 /* If we have true signals, the signal handler
656 will call Py_AddPendingCall() so we don't
657 have to call sigcheck(). On the Mac and
658 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000659 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000660 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000661 goto on_error;
662 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000663#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000664
Guido van Rossume59214e1994-08-30 08:01:59 +0000665#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000666 if (interpreter_lock) {
667 /* Give another thread a chance */
668
Guido van Rossum25ce5661997-08-02 03:10:38 +0000669 if (PyThreadState_Swap(NULL) != tstate)
670 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000671 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000672
673 /* Other threads may run now */
674
Guido van Rossum65d5b571998-12-21 19:32:43 +0000675 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000676 if (PyThreadState_Swap(tstate) != NULL)
677 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000678 }
679#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000680 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000681
Guido van Rossum374a9221991-04-04 10:40:29 +0000682 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000683
Guido van Rossum408027e1996-12-30 16:17:54 +0000684#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000685 f->f_lasti = INSTR_OFFSET();
686#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000687
Guido van Rossum374a9221991-04-04 10:40:29 +0000688 opcode = NEXTOP();
689 if (HAS_ARG(opcode))
690 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000691 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000692#ifdef DYNAMIC_EXECUTION_PROFILE
693#ifdef DXPAIRS
694 dxpairs[lastopcode][opcode]++;
695 lastopcode = opcode;
696#endif
697 dxp[opcode]++;
698#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000699
Guido van Rossum96a42c81992-01-12 02:29:51 +0000700#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000701 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +0000702
Guido van Rossum96a42c81992-01-12 02:29:51 +0000703 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000704 if (HAS_ARG(opcode)) {
705 printf("%d: %d, %d\n",
706 (int) (INSTR_OFFSET() - 3),
707 opcode, oparg);
708 }
709 else {
710 printf("%d: %d\n",
711 (int) (INSTR_OFFSET() - 1), opcode);
712 }
713 }
714#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000715 /* Main switch on opcode */
Jeremy Hylton52820442001-01-03 23:52:36 +0000716
Guido van Rossum374a9221991-04-04 10:40:29 +0000717 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000718
Guido van Rossum374a9221991-04-04 10:40:29 +0000719 /* BEWARE!
720 It is essential that any operation that fails sets either
721 x to NULL, err to nonzero, or why to anything but WHY_NOT,
722 and that no operation that succeeds does this! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000723
Guido van Rossum374a9221991-04-04 10:40:29 +0000724 /* case STOP_CODE: this is an error! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000725
Guido van Rossum374a9221991-04-04 10:40:29 +0000726 case POP_TOP:
727 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000728 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000729 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000730
Guido van Rossum374a9221991-04-04 10:40:29 +0000731 case ROT_TWO:
732 v = POP();
733 w = POP();
734 PUSH(v);
735 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000736 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000737
Guido van Rossum374a9221991-04-04 10:40:29 +0000738 case ROT_THREE:
739 v = POP();
740 w = POP();
741 x = POP();
742 PUSH(v);
743 PUSH(x);
744 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000745 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000746
Thomas Wouters434d0822000-08-24 20:11:32 +0000747 case ROT_FOUR:
748 u = POP();
749 v = POP();
750 w = POP();
751 x = POP();
752 PUSH(u);
753 PUSH(x);
754 PUSH(w);
755 PUSH(v);
756 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000757
Guido van Rossum374a9221991-04-04 10:40:29 +0000758 case DUP_TOP:
759 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000760 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000761 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000762 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000763
Thomas Wouters434d0822000-08-24 20:11:32 +0000764 case DUP_TOPX:
765 switch (oparg) {
Thomas Wouters434d0822000-08-24 20:11:32 +0000766 case 1:
Tim Peters35ba6892000-10-11 07:04:49 +0000767 x = TOP();
768 Py_INCREF(x);
769 PUSH(x);
770 continue;
771 case 2:
Thomas Wouters434d0822000-08-24 20:11:32 +0000772 x = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000773 Py_INCREF(x);
774 w = TOP();
775 Py_INCREF(w);
776 PUSH(x);
777 PUSH(w);
778 PUSH(x);
779 continue;
780 case 3:
781 x = POP();
782 Py_INCREF(x);
Thomas Wouters434d0822000-08-24 20:11:32 +0000783 w = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000784 Py_INCREF(w);
785 v = TOP();
786 Py_INCREF(v);
787 PUSH(w);
788 PUSH(x);
789 PUSH(v);
790 PUSH(w);
791 PUSH(x);
792 continue;
793 case 4:
794 x = POP();
795 Py_INCREF(x);
796 w = POP();
797 Py_INCREF(w);
Thomas Wouters434d0822000-08-24 20:11:32 +0000798 v = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000799 Py_INCREF(v);
800 u = TOP();
801 Py_INCREF(u);
802 PUSH(v);
803 PUSH(w);
804 PUSH(x);
805 PUSH(u);
806 PUSH(v);
807 PUSH(w);
808 PUSH(x);
809 continue;
810 case 5:
811 x = POP();
812 Py_INCREF(x);
813 w = POP();
814 Py_INCREF(w);
815 v = POP();
816 Py_INCREF(v);
Thomas Wouters434d0822000-08-24 20:11:32 +0000817 u = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000818 Py_INCREF(u);
819 t = TOP();
820 Py_INCREF(t);
821 PUSH(u);
822 PUSH(v);
823 PUSH(w);
824 PUSH(x);
825 PUSH(t);
826 PUSH(u);
827 PUSH(v);
828 PUSH(w);
829 PUSH(x);
830 continue;
Thomas Wouters434d0822000-08-24 20:11:32 +0000831 default:
Thomas Wouters0be483f2000-10-11 23:26:11 +0000832 Py_FatalError("invalid argument to DUP_TOPX"
833 " (bytecode corruption?)");
Thomas Wouters434d0822000-08-24 20:11:32 +0000834 }
Tim Peters35ba6892000-10-11 07:04:49 +0000835 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000836
Guido van Rossum374a9221991-04-04 10:40:29 +0000837 case UNARY_POSITIVE:
838 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000839 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000840 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000841 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000842 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000843 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000844
Guido van Rossum374a9221991-04-04 10:40:29 +0000845 case UNARY_NEGATIVE:
846 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000847 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000848 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000849 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000850 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000851 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000852
Guido van Rossum374a9221991-04-04 10:40:29 +0000853 case UNARY_NOT:
854 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000855 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000856 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000857 if (err == 0) {
858 Py_INCREF(Py_True);
859 PUSH(Py_True);
860 continue;
861 }
862 else if (err > 0) {
863 Py_INCREF(Py_False);
864 PUSH(Py_False);
865 err = 0;
866 continue;
867 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000868 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000869
Guido van Rossum374a9221991-04-04 10:40:29 +0000870 case UNARY_CONVERT:
871 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000872 x = PyObject_Repr(v);
873 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000874 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000875 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000876 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000877
Guido van Rossum7928cd71991-10-24 14:59:31 +0000878 case UNARY_INVERT:
879 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000880 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000881 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000882 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000883 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000884 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000885
Guido van Rossum50564e81996-01-12 01:13:16 +0000886 case BINARY_POWER:
887 w = POP();
888 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000889 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000890 Py_DECREF(v);
891 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000892 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000893 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000894 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000895
Guido van Rossum374a9221991-04-04 10:40:29 +0000896 case BINARY_MULTIPLY:
897 w = POP();
898 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000899 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000900 Py_DECREF(v);
901 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000902 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000903 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000904 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000905
Guido van Rossum374a9221991-04-04 10:40:29 +0000906 case BINARY_DIVIDE:
907 w = POP();
908 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000909 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000910 Py_DECREF(v);
911 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000912 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000913 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000914 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000915
Guido van Rossum374a9221991-04-04 10:40:29 +0000916 case BINARY_MODULO:
917 w = POP();
918 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000919 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000920 Py_DECREF(v);
921 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000922 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000923 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000924 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000925
Guido van Rossum374a9221991-04-04 10:40:29 +0000926 case BINARY_ADD:
927 w = POP();
928 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000929 if (PyInt_Check(v) && PyInt_Check(w)) {
930 /* INLINE: int + int */
931 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000932 a = PyInt_AS_LONG(v);
933 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000934 i = a + b;
935 if ((i^a) < 0 && (i^b) < 0) {
936 PyErr_SetString(PyExc_OverflowError,
937 "integer addition");
938 x = NULL;
939 }
940 else
941 x = PyInt_FromLong(i);
942 }
943 else
944 x = PyNumber_Add(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000945 Py_DECREF(v);
946 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000947 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000948 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000949 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000950
Guido van Rossum374a9221991-04-04 10:40:29 +0000951 case BINARY_SUBTRACT:
952 w = POP();
953 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000954 if (PyInt_Check(v) && PyInt_Check(w)) {
955 /* INLINE: int - int */
956 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000957 a = PyInt_AS_LONG(v);
958 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000959 i = a - b;
960 if ((i^a) < 0 && (i^~b) < 0) {
961 PyErr_SetString(PyExc_OverflowError,
962 "integer subtraction");
963 x = NULL;
964 }
965 else
966 x = PyInt_FromLong(i);
967 }
968 else
969 x = PyNumber_Subtract(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000970 Py_DECREF(v);
971 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000972 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000973 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000974 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000975
Guido van Rossum374a9221991-04-04 10:40:29 +0000976 case BINARY_SUBSCR:
977 w = POP();
978 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000979 if (PyList_Check(v) && PyInt_Check(w)) {
980 /* INLINE: list[int] */
981 long i = PyInt_AsLong(w);
982 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +0000983 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +0000984 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +0000985 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000986 PyErr_SetString(PyExc_IndexError,
987 "list index out of range");
988 x = NULL;
989 }
990 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +0000991 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000992 Py_INCREF(x);
993 }
994 }
995 else
996 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000997 Py_DECREF(v);
998 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000999 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001000 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001001 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001002
Guido van Rossum7928cd71991-10-24 14:59:31 +00001003 case BINARY_LSHIFT:
1004 w = POP();
1005 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001006 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001007 Py_DECREF(v);
1008 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001009 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001010 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001011 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001012
Guido van Rossum7928cd71991-10-24 14:59:31 +00001013 case BINARY_RSHIFT:
1014 w = POP();
1015 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001016 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001017 Py_DECREF(v);
1018 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001019 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001020 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001021 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001022
Guido van Rossum7928cd71991-10-24 14:59:31 +00001023 case BINARY_AND:
1024 w = POP();
1025 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001026 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001027 Py_DECREF(v);
1028 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001029 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001030 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001031 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001032
Guido van Rossum7928cd71991-10-24 14:59:31 +00001033 case BINARY_XOR:
1034 w = POP();
1035 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001036 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001037 Py_DECREF(v);
1038 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001039 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001040 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001041 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001042
Guido van Rossum7928cd71991-10-24 14:59:31 +00001043 case BINARY_OR:
1044 w = POP();
1045 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001046 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001047 Py_DECREF(v);
1048 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001049 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001050 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001051 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001052
1053 case INPLACE_POWER:
1054 w = POP();
1055 v = POP();
1056 x = PyNumber_InPlacePower(v, w, Py_None);
1057 Py_DECREF(v);
1058 Py_DECREF(w);
1059 PUSH(x);
1060 if (x != NULL) continue;
1061 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001062
Thomas Wouters434d0822000-08-24 20:11:32 +00001063 case INPLACE_MULTIPLY:
1064 w = POP();
1065 v = POP();
1066 x = PyNumber_InPlaceMultiply(v, w);
1067 Py_DECREF(v);
1068 Py_DECREF(w);
1069 PUSH(x);
1070 if (x != NULL) continue;
1071 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001072
Thomas Wouters434d0822000-08-24 20:11:32 +00001073 case INPLACE_DIVIDE:
1074 w = POP();
1075 v = POP();
1076 x = PyNumber_InPlaceDivide(v, w);
1077 Py_DECREF(v);
1078 Py_DECREF(w);
1079 PUSH(x);
1080 if (x != NULL) continue;
1081 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001082
Thomas Wouters434d0822000-08-24 20:11:32 +00001083 case INPLACE_MODULO:
1084 w = POP();
1085 v = POP();
1086 x = PyNumber_InPlaceRemainder(v, w);
1087 Py_DECREF(v);
1088 Py_DECREF(w);
1089 PUSH(x);
1090 if (x != NULL) continue;
1091 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001092
Thomas Wouters434d0822000-08-24 20:11:32 +00001093 case INPLACE_ADD:
1094 w = POP();
1095 v = POP();
1096 if (PyInt_Check(v) && PyInt_Check(w)) {
1097 /* INLINE: int + int */
1098 register long a, b, i;
1099 a = PyInt_AS_LONG(v);
1100 b = PyInt_AS_LONG(w);
1101 i = a + b;
1102 if ((i^a) < 0 && (i^b) < 0) {
1103 PyErr_SetString(PyExc_OverflowError,
1104 "integer addition");
1105 x = NULL;
1106 }
1107 else
1108 x = PyInt_FromLong(i);
1109 }
1110 else
1111 x = PyNumber_InPlaceAdd(v, w);
1112 Py_DECREF(v);
1113 Py_DECREF(w);
1114 PUSH(x);
1115 if (x != NULL) continue;
1116 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001117
Thomas Wouters434d0822000-08-24 20:11:32 +00001118 case INPLACE_SUBTRACT:
1119 w = POP();
1120 v = POP();
1121 if (PyInt_Check(v) && PyInt_Check(w)) {
1122 /* INLINE: int - int */
1123 register long a, b, i;
1124 a = PyInt_AS_LONG(v);
1125 b = PyInt_AS_LONG(w);
1126 i = a - b;
1127 if ((i^a) < 0 && (i^~b) < 0) {
1128 PyErr_SetString(PyExc_OverflowError,
1129 "integer subtraction");
1130 x = NULL;
1131 }
1132 else
1133 x = PyInt_FromLong(i);
1134 }
1135 else
1136 x = PyNumber_InPlaceSubtract(v, w);
1137 Py_DECREF(v);
1138 Py_DECREF(w);
1139 PUSH(x);
1140 if (x != NULL) continue;
1141 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001142
Thomas Wouters434d0822000-08-24 20:11:32 +00001143 case INPLACE_LSHIFT:
1144 w = POP();
1145 v = POP();
1146 x = PyNumber_InPlaceLshift(v, w);
1147 Py_DECREF(v);
1148 Py_DECREF(w);
1149 PUSH(x);
1150 if (x != NULL) continue;
1151 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001152
Thomas Wouters434d0822000-08-24 20:11:32 +00001153 case INPLACE_RSHIFT:
1154 w = POP();
1155 v = POP();
1156 x = PyNumber_InPlaceRshift(v, w);
1157 Py_DECREF(v);
1158 Py_DECREF(w);
1159 PUSH(x);
1160 if (x != NULL) continue;
1161 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001162
Thomas Wouters434d0822000-08-24 20:11:32 +00001163 case INPLACE_AND:
1164 w = POP();
1165 v = POP();
1166 x = PyNumber_InPlaceAnd(v, w);
1167 Py_DECREF(v);
1168 Py_DECREF(w);
1169 PUSH(x);
1170 if (x != NULL) continue;
1171 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001172
Thomas Wouters434d0822000-08-24 20:11:32 +00001173 case INPLACE_XOR:
1174 w = POP();
1175 v = POP();
1176 x = PyNumber_InPlaceXor(v, w);
1177 Py_DECREF(v);
1178 Py_DECREF(w);
1179 PUSH(x);
1180 if (x != NULL) continue;
1181 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001182
Thomas Wouters434d0822000-08-24 20:11:32 +00001183 case INPLACE_OR:
1184 w = POP();
1185 v = POP();
1186 x = PyNumber_InPlaceOr(v, w);
1187 Py_DECREF(v);
1188 Py_DECREF(w);
1189 PUSH(x);
1190 if (x != NULL) continue;
1191 break;
1192
Guido van Rossum374a9221991-04-04 10:40:29 +00001193 case SLICE+0:
1194 case SLICE+1:
1195 case SLICE+2:
1196 case SLICE+3:
1197 if ((opcode-SLICE) & 2)
1198 w = POP();
1199 else
1200 w = NULL;
1201 if ((opcode-SLICE) & 1)
1202 v = POP();
1203 else
1204 v = NULL;
1205 u = POP();
1206 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001207 Py_DECREF(u);
1208 Py_XDECREF(v);
1209 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001210 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001211 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001212 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001213
Guido van Rossum374a9221991-04-04 10:40:29 +00001214 case STORE_SLICE+0:
1215 case STORE_SLICE+1:
1216 case STORE_SLICE+2:
1217 case STORE_SLICE+3:
1218 if ((opcode-STORE_SLICE) & 2)
1219 w = POP();
1220 else
1221 w = NULL;
1222 if ((opcode-STORE_SLICE) & 1)
1223 v = POP();
1224 else
1225 v = NULL;
1226 u = POP();
1227 t = POP();
1228 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001229 Py_DECREF(t);
1230 Py_DECREF(u);
1231 Py_XDECREF(v);
1232 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001233 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001234 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001235
Guido van Rossum374a9221991-04-04 10:40:29 +00001236 case DELETE_SLICE+0:
1237 case DELETE_SLICE+1:
1238 case DELETE_SLICE+2:
1239 case DELETE_SLICE+3:
1240 if ((opcode-DELETE_SLICE) & 2)
1241 w = POP();
1242 else
1243 w = NULL;
1244 if ((opcode-DELETE_SLICE) & 1)
1245 v = POP();
1246 else
1247 v = NULL;
1248 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001249 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001250 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001251 Py_DECREF(u);
1252 Py_XDECREF(v);
1253 Py_XDECREF(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 STORE_SUBSCR:
1258 w = POP();
1259 v = POP();
1260 u = POP();
1261 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001262 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001263 Py_DECREF(u);
1264 Py_DECREF(v);
1265 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001266 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001267 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001268
Guido van Rossum374a9221991-04-04 10:40:29 +00001269 case DELETE_SUBSCR:
1270 w = POP();
1271 v = POP();
1272 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001273 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001274 Py_DECREF(v);
1275 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001276 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001277 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001278
Guido van Rossum374a9221991-04-04 10:40:29 +00001279 case PRINT_EXPR:
1280 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001281 w = PySys_GetObject("displayhook");
1282 if (w == NULL) {
1283 PyErr_SetString(PyExc_RuntimeError,
1284 "lost sys.displayhook");
1285 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001286 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001287 }
1288 if (err == 0) {
1289 x = Py_BuildValue("(O)", v);
1290 if (x == NULL)
1291 err = -1;
1292 }
1293 if (err == 0) {
1294 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001295 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001296 if (w == NULL)
1297 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001298 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001299 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001300 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001301 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001302
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001303 case PRINT_ITEM_TO:
1304 w = stream = POP();
1305 /* fall through to PRINT_ITEM */
1306
Guido van Rossum374a9221991-04-04 10:40:29 +00001307 case PRINT_ITEM:
1308 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001309 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001310 w = PySys_GetObject("stdout");
1311 if (w == NULL) {
1312 PyErr_SetString(PyExc_RuntimeError,
1313 "lost sys.stdout");
1314 err = -1;
1315 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001316 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001317 if (w != NULL && PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001318 err = PyFile_WriteString(" ", w);
1319 if (err == 0)
1320 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001321 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001322 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001323 char *s = PyString_AsString(v);
1324 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001325 if (len > 0 &&
1326 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001327 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001328 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001329 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001330 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001331 Py_XDECREF(stream);
1332 stream = NULL;
1333 if (err == 0)
1334 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001335 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001336
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001337 case PRINT_NEWLINE_TO:
1338 w = stream = POP();
1339 /* fall through to PRINT_NEWLINE */
1340
Guido van Rossum374a9221991-04-04 10:40:29 +00001341 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001342 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001343 w = PySys_GetObject("stdout");
1344 if (w == NULL)
1345 PyErr_SetString(PyExc_RuntimeError,
1346 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001347 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001348 if (w != NULL) {
1349 err = PyFile_WriteString("\n", w);
1350 if (err == 0)
1351 PyFile_SoftSpace(w, 0);
1352 }
1353 Py_XDECREF(stream);
1354 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001355 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001356
Thomas Wouters434d0822000-08-24 20:11:32 +00001357
1358#ifdef CASE_TOO_BIG
1359 default: switch (opcode) {
1360#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001361 case BREAK_LOOP:
1362 why = WHY_BREAK;
1363 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001364
Guido van Rossumf10570b1995-07-07 22:53:21 +00001365 case RAISE_VARARGS:
1366 u = v = w = NULL;
1367 switch (oparg) {
1368 case 3:
1369 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001370 /* Fallthrough */
1371 case 2:
1372 v = POP(); /* value */
1373 /* Fallthrough */
1374 case 1:
1375 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001376 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001377 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001378 break;
1379 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001380 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001381 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001382 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001383 break;
1384 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001385 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001386
Guido van Rossum374a9221991-04-04 10:40:29 +00001387 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001388 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001389 PyErr_SetString(PyExc_SystemError,
1390 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001391 break;
1392 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001393 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001394 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001395 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001396
Guido van Rossum374a9221991-04-04 10:40:29 +00001397 case RETURN_VALUE:
1398 retval = POP();
1399 why = WHY_RETURN;
1400 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001401
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001402 case EXEC_STMT:
1403 w = POP();
1404 v = POP();
1405 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001406 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001407 Py_DECREF(u);
1408 Py_DECREF(v);
1409 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001410 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001411
Guido van Rossum374a9221991-04-04 10:40:29 +00001412 case POP_BLOCK:
1413 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001414 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001415 while (STACK_LEVEL() > b->b_level) {
1416 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001417 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001418 }
1419 }
1420 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001421
Guido van Rossum374a9221991-04-04 10:40:29 +00001422 case END_FINALLY:
1423 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001424 if (PyInt_Check(v)) {
1425 why = (enum why_code) PyInt_AsLong(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001426 if (why == WHY_RETURN)
1427 retval = POP();
1428 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001429 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001430 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001431 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001432 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001433 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001434 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001435 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001436 else if (v != Py_None) {
1437 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001438 "'finally' pops bad exception");
1439 why = WHY_EXCEPTION;
1440 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001441 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001442 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001443
Guido van Rossum374a9221991-04-04 10:40:29 +00001444 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001445 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001446 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001447 w = POP();
1448 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001449 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001450 Py_DECREF(u);
1451 Py_DECREF(v);
1452 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001453 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001454
Guido van Rossum374a9221991-04-04 10:40:29 +00001455 case STORE_NAME:
1456 w = GETNAMEV(oparg);
1457 v = POP();
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 found when storing %s",
1461 REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001462 break;
1463 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001464 err = PyDict_SetItem(x, w, v);
1465 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001466 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001467
Guido van Rossum374a9221991-04-04 10:40:29 +00001468 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001469 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001470 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001471 PyErr_Format(PyExc_SystemError,
1472 "no locals when deleting %s",
1473 REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001474 break;
1475 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001476 if ((err = PyDict_DelItem(x, w)) != 0)
Guido van Rossumac7be682001-01-17 15:42:30 +00001477 format_exc_check_arg(PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001478 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001479 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001480
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001481 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001482 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001483 if (PyTuple_Check(v)) {
1484 if (PyTuple_Size(v) != oparg) {
1485 PyErr_SetString(PyExc_ValueError,
1486 "unpack tuple of wrong size");
1487 why = WHY_EXCEPTION;
1488 }
1489 else {
1490 for (; --oparg >= 0; ) {
1491 w = PyTuple_GET_ITEM(v, oparg);
1492 Py_INCREF(w);
1493 PUSH(w);
1494 }
1495 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001496 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001497 else if (PyList_Check(v)) {
1498 if (PyList_Size(v) != oparg) {
1499 PyErr_SetString(PyExc_ValueError,
1500 "unpack list of wrong size");
1501 why = WHY_EXCEPTION;
1502 }
1503 else {
1504 for (; --oparg >= 0; ) {
1505 w = PyList_GET_ITEM(v, oparg);
1506 Py_INCREF(w);
1507 PUSH(w);
1508 }
1509 }
1510 }
1511 else if (PySequence_Check(v)) {
1512 if (unpack_sequence(v, oparg,
1513 stack_pointer + oparg))
1514 stack_pointer += oparg;
1515 else
1516 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001517 }
1518 else {
Barry Warsawe42b18f1997-08-25 22:13:04 +00001519 PyErr_SetString(PyExc_TypeError,
1520 "unpack non-sequence");
1521 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001522 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001523 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001524 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001525
Guido van Rossum374a9221991-04-04 10:40:29 +00001526 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001527 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001528 v = POP();
1529 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001530 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1531 Py_DECREF(v);
1532 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001533 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001534
Guido van Rossum374a9221991-04-04 10:40:29 +00001535 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001536 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001537 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001538 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1539 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001540 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001541 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001542
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001543 case STORE_GLOBAL:
1544 w = GETNAMEV(oparg);
1545 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001546 err = PyDict_SetItem(f->f_globals, w, v);
1547 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001548 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001549
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001550 case DELETE_GLOBAL:
1551 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001552 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001553 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001554 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001555 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001556
Guido van Rossum374a9221991-04-04 10:40:29 +00001557 case LOAD_CONST:
1558 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001559 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001560 PUSH(x);
1561 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001562
Guido van Rossum374a9221991-04-04 10:40:29 +00001563 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001564 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001565 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001566 PyErr_Format(PyExc_SystemError,
1567 "no locals when loading %s",
1568 REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001569 break;
1570 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001571 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001572 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001573 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001574 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001575 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001576 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001577 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001578 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001579 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001580 break;
1581 }
1582 }
1583 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001584 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001585 PUSH(x);
1586 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001587
Guido van Rossum374a9221991-04-04 10:40:29 +00001588 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001589 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001590 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001591 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001592 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001593 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001594 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001595 PyExc_NameError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001596 GLOBAL_NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001597 break;
1598 }
1599 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001600 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001601 PUSH(x);
1602 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001603
Guido van Rossum9bfef441993-03-29 10:43:31 +00001604 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001605 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001606 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001607 format_exc_check_arg(
1608 PyExc_UnboundLocalError,
1609 UNBOUNDLOCAL_ERROR_MSG,
1610 PyTuple_GetItem(co->co_varnames, oparg)
1611 );
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001612 break;
1613 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001614 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001615 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001616 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001617 break;
1618
1619 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001620 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001621 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001622 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001623
1624 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001625 x = GETLOCAL(oparg);
1626 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001627 format_exc_check_arg(
1628 PyExc_UnboundLocalError,
1629 UNBOUNDLOCAL_ERROR_MSG,
1630 PyTuple_GetItem(co->co_varnames, oparg)
1631 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001632 break;
1633 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001634 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001635 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001636
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001637 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001638 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001639 Py_INCREF(x);
1640 PUSH(x);
1641 break;
1642
1643 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001644 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001645 w = PyCell_Get(x);
1646 Py_INCREF(w);
1647 PUSH(w);
1648 break;
1649
1650 case STORE_DEREF:
1651 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001652 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001653 PyCell_Set(x, w);
1654 continue;
1655
Guido van Rossum374a9221991-04-04 10:40:29 +00001656 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001657 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001658 if (x != NULL) {
1659 for (; --oparg >= 0;) {
1660 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001661 PyTuple_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_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001669 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001670 if (x != NULL) {
1671 for (; --oparg >= 0;) {
1672 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001673 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001674 }
1675 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001676 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001677 }
1678 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001679
Guido van Rossum374a9221991-04-04 10:40:29 +00001680 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001681 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001682 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001683 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001684 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001685
Guido van Rossum374a9221991-04-04 10:40:29 +00001686 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001687 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001688 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001689 x = PyObject_GetAttr(v, w);
1690 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001691 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001692 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001693 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001694
Guido van Rossum374a9221991-04-04 10:40:29 +00001695 case COMPARE_OP:
1696 w = POP();
1697 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001698 if (PyInt_Check(v) && PyInt_Check(w)) {
1699 /* INLINE: cmp(int, int) */
1700 register long a, b;
1701 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001702 a = PyInt_AS_LONG(v);
1703 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001704 switch (oparg) {
1705 case LT: res = a < b; break;
1706 case LE: res = a <= b; break;
1707 case EQ: res = a == b; break;
1708 case NE: res = a != b; break;
1709 case GT: res = a > b; break;
1710 case GE: res = a >= b; break;
1711 case IS: res = v == w; break;
1712 case IS_NOT: res = v != w; break;
1713 default: goto slow_compare;
1714 }
1715 x = res ? Py_True : Py_False;
1716 Py_INCREF(x);
1717 }
1718 else {
1719 slow_compare:
1720 x = cmp_outcome(oparg, v, w);
1721 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001722 Py_DECREF(v);
1723 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001724 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001725 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001726 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001727
Guido van Rossum374a9221991-04-04 10:40:29 +00001728 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001729 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001730 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001731 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001732 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001733 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001734 break;
1735 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001736 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001737 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001738 w,
1739 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001740 f->f_locals == NULL ?
1741 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001742 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001743 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001744 if (w == NULL) {
1745 x = NULL;
1746 break;
1747 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001748 x = PyEval_CallObject(x, w);
1749 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001750 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001751 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001752 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001753
Thomas Wouters52152252000-08-17 22:55:00 +00001754 case IMPORT_STAR:
1755 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001756 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001757 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001758 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001759 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001760 break;
1761 }
Thomas Wouters52152252000-08-17 22:55:00 +00001762 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001763 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001764 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001765 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001766 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001767
Thomas Wouters52152252000-08-17 22:55:00 +00001768 case IMPORT_FROM:
1769 w = GETNAMEV(oparg);
1770 v = TOP();
1771 x = import_from(v, w);
1772 PUSH(x);
1773 if (x != NULL) continue;
1774 break;
1775
Guido van Rossum374a9221991-04-04 10:40:29 +00001776 case JUMP_FORWARD:
1777 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001778 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001779
Guido van Rossum374a9221991-04-04 10:40:29 +00001780 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001781 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001782 if (err > 0)
1783 err = 0;
1784 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001785 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001786 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_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001791 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001792 if (err > 0) {
1793 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001794 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001795 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001796 else if (err == 0)
1797 ;
1798 else
1799 break;
1800 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001801
Guido van Rossum374a9221991-04-04 10:40:29 +00001802 case JUMP_ABSOLUTE:
1803 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001804 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001805
Guido van Rossum374a9221991-04-04 10:40:29 +00001806 case FOR_LOOP:
1807 /* for v in s: ...
1808 On entry: stack contains s, i.
1809 On exit: stack contains s, i+1, s[i];
1810 but if loop exhausted:
1811 s, i are popped, and we jump */
1812 w = POP(); /* Loop index */
1813 v = POP(); /* Sequence object */
1814 u = loop_subscript(v, w);
1815 if (u != NULL) {
1816 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001817 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001818 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001819 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001820 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001821 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001822 }
1823 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001824 Py_DECREF(v);
1825 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001826 /* A NULL can mean "s exhausted"
1827 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001828 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001829 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001830 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001831 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001832 continue;
1833 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001834 }
1835 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001836
Guido van Rossum374a9221991-04-04 10:40:29 +00001837 case SETUP_LOOP:
1838 case SETUP_EXCEPT:
1839 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001840 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Guido van Rossum374a9221991-04-04 10:40:29 +00001841 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001842 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001843
Guido van Rossum374a9221991-04-04 10:40:29 +00001844 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001845#ifdef LLTRACE
1846 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001847 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001848#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001849 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001850 if (f->f_trace == NULL)
1851 continue;
1852 /* Trace each line of code reached */
1853 f->f_lasti = INSTR_OFFSET();
1854 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossumb209a111997-04-29 18:18:01 +00001855 f, "line", Py_None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001856 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001857
1858 case CALL_FUNCTION:
Jeremy Hylton52820442001-01-03 23:52:36 +00001859 {
1860 int na = oparg & 0xff;
1861 int nk = (oparg>>8) & 0xff;
1862 int n = na + 2 * nk;
1863 PyObject **pfunc = stack_pointer - n - 1;
1864 PyObject *func = *pfunc;
1865 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1866
1867 /* Always dispatch PyCFunction first, because
1868 these are presumed to be the most frequent
1869 callable object.
1870 */
1871 if (PyCFunction_Check(func)) {
1872 if (PyCFunction_GET_FLAGS(func) == 0) {
1873 x = fast_cfunction(func,
Guido van Rossumac7be682001-01-17 15:42:30 +00001874 &stack_pointer, na);
Jeremy Hylton52820442001-01-03 23:52:36 +00001875 } else {
1876 x = do_call(func, &stack_pointer,
1877 na, nk);
1878 }
1879 } else {
Guido van Rossumac7be682001-01-17 15:42:30 +00001880 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001881 && PyMethod_GET_SELF(func) != NULL) {
1882 /* optimize access to bound methods */
1883 PyObject *self = PyMethod_GET_SELF(func);
1884 Py_INCREF(self);
1885 func = PyMethod_GET_FUNCTION(func);
1886 Py_INCREF(func);
1887 Py_DECREF(*pfunc);
1888 *pfunc = self;
1889 na++;
1890 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00001891 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00001892 Py_INCREF(func);
1893 if (PyFunction_Check(func)) {
1894 x = fast_function(func, &stack_pointer,
Guido van Rossumac7be682001-01-17 15:42:30 +00001895 n, na, nk);
Jeremy Hylton52820442001-01-03 23:52:36 +00001896 } else {
1897 x = do_call(func, &stack_pointer,
1898 na, nk);
1899 }
1900 Py_DECREF(func);
1901 }
1902
1903 while (stack_pointer > pfunc) {
1904 w = POP();
1905 Py_DECREF(w);
1906 }
1907 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00001908 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00001909 continue;
1910 break;
1911 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001912
Jeremy Hylton76901512000-03-28 23:49:17 +00001913 case CALL_FUNCTION_VAR:
1914 case CALL_FUNCTION_KW:
1915 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001916 {
Jeremy Hylton76901512000-03-28 23:49:17 +00001917 int na = oparg & 0xff;
1918 int nk = (oparg>>8) & 0xff;
1919 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00001920 int n = na + 2 * nk;
1921 PyObject **pfunc, *func;
1922 if (flags & CALL_FLAG_VAR)
1923 n++;
1924 if (flags & CALL_FLAG_KW)
1925 n++;
1926 pfunc = stack_pointer - n - 1;
1927 func = *pfunc;
Jeremy Hylton76901512000-03-28 23:49:17 +00001928 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Jeremy Hylton52820442001-01-03 23:52:36 +00001929
Guido van Rossumac7be682001-01-17 15:42:30 +00001930 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001931 && PyMethod_GET_SELF(func) != NULL) {
1932 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00001933 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00001934 func = PyMethod_GET_FUNCTION(func);
1935 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00001936 Py_DECREF(*pfunc);
1937 *pfunc = self;
1938 na++;
1939 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00001940 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00001941 Py_INCREF(func);
1942 x = ext_do_call(func, &stack_pointer, flags, na, nk);
Jeremy Hylton76901512000-03-28 23:49:17 +00001943 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00001944
Jeremy Hylton76901512000-03-28 23:49:17 +00001945 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00001946 w = POP();
1947 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00001948 }
1949 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00001950 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00001951 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00001952 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001953 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001954
Guido van Rossum681d79a1995-07-18 14:51:37 +00001955 case MAKE_FUNCTION:
1956 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00001957 x = PyFunction_New(v, f->f_globals);
1958 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001959 /* XXX Maybe this should be a separate opcode? */
1960 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001961 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001962 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001963 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001964 x = NULL;
1965 break;
1966 }
1967 while (--oparg >= 0) {
1968 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001969 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001970 }
1971 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001972 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001973 }
1974 PUSH(x);
1975 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001976
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001977 case MAKE_CLOSURE:
1978 {
1979 int nfree;
1980 v = POP(); /* code object */
1981 x = PyFunction_New(v, f->f_globals);
1982 nfree = PyTuple_GET_SIZE(((PyCodeObject *)v)->co_freevars);
1983 Py_DECREF(v);
1984 /* XXX Maybe this should be a separate opcode? */
1985 if (x != NULL && nfree > 0) {
1986 v = PyTuple_New(nfree);
1987 if (v == NULL) {
1988 Py_DECREF(x);
1989 x = NULL;
1990 break;
1991 }
1992 while (--nfree >= 0) {
1993 w = POP();
1994 PyTuple_SET_ITEM(v, nfree, w);
1995 }
1996 err = PyFunction_SetClosure(x, v);
1997 Py_DECREF(v);
1998 }
1999 if (x != NULL && oparg > 0) {
2000 v = PyTuple_New(oparg);
2001 if (v == NULL) {
2002 Py_DECREF(x);
2003 x = NULL;
2004 break;
2005 }
2006 while (--oparg >= 0) {
2007 w = POP();
2008 PyTuple_SET_ITEM(v, oparg, w);
2009 }
2010 err = PyFunction_SetDefaults(x, v);
2011 Py_DECREF(v);
2012 }
2013 PUSH(x);
2014 break;
2015 }
2016
Guido van Rossum8861b741996-07-30 16:49:37 +00002017 case BUILD_SLICE:
2018 if (oparg == 3)
2019 w = POP();
2020 else
2021 w = NULL;
2022 v = POP();
2023 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002024 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002025 Py_DECREF(u);
2026 Py_DECREF(v);
2027 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00002028 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002029 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002030 break;
2031
Fred Drakeef8ace32000-08-24 00:32:09 +00002032 case EXTENDED_ARG:
2033 opcode = NEXTOP();
2034 oparg = oparg<<16 | NEXTARG();
2035 goto dispatch_opcode;
2036 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002037
Guido van Rossum374a9221991-04-04 10:40:29 +00002038 default:
2039 fprintf(stderr,
2040 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00002041 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002042 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002043 why = WHY_EXCEPTION;
2044 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002045
2046#ifdef CASE_TOO_BIG
2047 }
2048#endif
2049
Guido van Rossum374a9221991-04-04 10:40:29 +00002050 } /* switch */
2051
2052 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002053
Guido van Rossum374a9221991-04-04 10:40:29 +00002054 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002055
Guido van Rossum374a9221991-04-04 10:40:29 +00002056 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002057 if (err == 0 && x != NULL) {
2058#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002059 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002060 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002061 fprintf(stderr,
2062 "XXX undetected error\n");
2063 else
2064#endif
2065 continue; /* Normal, fast path */
2066 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002067 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002068 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002069 err = 0;
2070 }
2071
Guido van Rossum374a9221991-04-04 10:40:29 +00002072 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002073
Guido van Rossum374a9221991-04-04 10:40:29 +00002074 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002075 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002076 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002077 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002078 why = WHY_EXCEPTION;
2079 }
2080 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002081#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002082 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002083 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002084 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002085 fprintf(stderr,
2086 "XXX undetected error (why=%d)\n",
2087 why);
2088 why = WHY_EXCEPTION;
2089 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002090 }
2091#endif
2092
2093 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002094
Guido van Rossum374a9221991-04-04 10:40:29 +00002095 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002096 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00002097 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00002098 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00002099 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002100
Guido van Rossume59214e1994-08-30 08:01:59 +00002101 if (f->f_trace)
2102 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002103 if (tstate->sys_profilefunc)
2104 call_exc_trace(&tstate->sys_profilefunc,
2105 (PyObject**)0, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002106 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002107
Guido van Rossum374a9221991-04-04 10:40:29 +00002108 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002109
Guido van Rossum374a9221991-04-04 10:40:29 +00002110 if (why == WHY_RERAISE)
2111 why = WHY_EXCEPTION;
2112
2113 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002114
Guido van Rossum374a9221991-04-04 10:40:29 +00002115 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002116 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00002117 while (STACK_LEVEL() > b->b_level) {
2118 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002119 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002120 }
2121 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2122 why = WHY_NOT;
2123 JUMPTO(b->b_handler);
2124 break;
2125 }
2126 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002127 (b->b_type == SETUP_EXCEPT &&
2128 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002129 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002130 PyObject *exc, *val, *tb;
2131 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002132 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002133 val = Py_None;
2134 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002135 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002136 /* Make the raw exception data
2137 available to the handler,
2138 so a program can emulate the
2139 Python main loop. Don't do
2140 this for 'finally'. */
2141 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002142 PyErr_NormalizeException(
2143 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002144 set_exc_info(tstate,
2145 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002146 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002147 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002148 PUSH(val);
2149 PUSH(exc);
2150 }
2151 else {
2152 if (why == WHY_RETURN)
2153 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002154 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002155 PUSH(v);
2156 }
2157 why = WHY_NOT;
2158 JUMPTO(b->b_handler);
2159 break;
2160 }
2161 } /* unwind stack */
2162
2163 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002164
Guido van Rossum374a9221991-04-04 10:40:29 +00002165 if (why != WHY_NOT)
2166 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002167
Guido van Rossum374a9221991-04-04 10:40:29 +00002168 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002169
Guido van Rossum374a9221991-04-04 10:40:29 +00002170 /* Pop remaining stack entries */
Guido van Rossumac7be682001-01-17 15:42:30 +00002171
Guido van Rossum374a9221991-04-04 10:40:29 +00002172 while (!EMPTY()) {
2173 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002174 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002175 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002176
Guido van Rossum96a42c81992-01-12 02:29:51 +00002177 if (why != WHY_RETURN)
2178 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002179
Guido van Rossume59214e1994-08-30 08:01:59 +00002180 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002181 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00002182 if (call_trace(&f->f_trace, &f->f_trace, f,
2183 "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002184 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002185 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002186 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002187 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002188 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002189 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002190
Guido van Rossuma027efa1997-05-05 20:56:21 +00002191 if (tstate->sys_profilefunc && why == WHY_RETURN) {
2192 if (call_trace(&tstate->sys_profilefunc, (PyObject**)0,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002193 f, "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002194 Py_XDECREF(retval);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002195 retval = NULL;
2196 why = WHY_EXCEPTION;
2197 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002198 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002199
Guido van Rossuma027efa1997-05-05 20:56:21 +00002200 reset_exc_info(tstate);
2201
2202 --tstate->recursion_depth;
Guido van Rossum8c5df061997-01-24 04:19:24 +00002203
2204 fail: /* Jump here from prelude on failure */
Guido van Rossumac7be682001-01-17 15:42:30 +00002205
Guido van Rossum374a9221991-04-04 10:40:29 +00002206 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00002207
Guido van Rossuma027efa1997-05-05 20:56:21 +00002208 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +00002209 Py_DECREF(f);
Guido van Rossumac7be682001-01-17 15:42:30 +00002210
Guido van Rossum96a42c81992-01-12 02:29:51 +00002211 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002212}
2213
Guido van Rossuma027efa1997-05-05 20:56:21 +00002214static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002215set_exc_info(PyThreadState *tstate,
2216 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002217{
2218 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002219 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002220
Guido van Rossuma027efa1997-05-05 20:56:21 +00002221 frame = tstate->frame;
2222 if (frame->f_exc_type == NULL) {
2223 /* This frame didn't catch an exception before */
2224 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002225 if (tstate->exc_type == NULL) {
2226 Py_INCREF(Py_None);
2227 tstate->exc_type = Py_None;
2228 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002229 tmp_type = frame->f_exc_type;
2230 tmp_value = frame->f_exc_value;
2231 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002232 Py_XINCREF(tstate->exc_type);
2233 Py_XINCREF(tstate->exc_value);
2234 Py_XINCREF(tstate->exc_traceback);
2235 frame->f_exc_type = tstate->exc_type;
2236 frame->f_exc_value = tstate->exc_value;
2237 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002238 Py_XDECREF(tmp_type);
2239 Py_XDECREF(tmp_value);
2240 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002241 }
2242 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002243 tmp_type = tstate->exc_type;
2244 tmp_value = tstate->exc_value;
2245 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002246 Py_XINCREF(type);
2247 Py_XINCREF(value);
2248 Py_XINCREF(tb);
2249 tstate->exc_type = type;
2250 tstate->exc_value = value;
2251 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002252 Py_XDECREF(tmp_type);
2253 Py_XDECREF(tmp_value);
2254 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002255 /* For b/w compatibility */
2256 PySys_SetObject("exc_type", type);
2257 PySys_SetObject("exc_value", value);
2258 PySys_SetObject("exc_traceback", tb);
2259}
2260
2261static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002262reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002263{
2264 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002265 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002266 frame = tstate->frame;
2267 if (frame->f_exc_type != NULL) {
2268 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002269 tmp_type = tstate->exc_type;
2270 tmp_value = tstate->exc_value;
2271 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002272 Py_XINCREF(frame->f_exc_type);
2273 Py_XINCREF(frame->f_exc_value);
2274 Py_XINCREF(frame->f_exc_traceback);
2275 tstate->exc_type = frame->f_exc_type;
2276 tstate->exc_value = frame->f_exc_value;
2277 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002278 Py_XDECREF(tmp_type);
2279 Py_XDECREF(tmp_value);
2280 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002281 /* For b/w compatibility */
2282 PySys_SetObject("exc_type", frame->f_exc_type);
2283 PySys_SetObject("exc_value", frame->f_exc_value);
2284 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2285 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002286 tmp_type = frame->f_exc_type;
2287 tmp_value = frame->f_exc_value;
2288 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002289 frame->f_exc_type = NULL;
2290 frame->f_exc_value = NULL;
2291 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002292 Py_XDECREF(tmp_type);
2293 Py_XDECREF(tmp_value);
2294 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002295}
2296
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002297/* Logic for the raise statement (too complicated for inlining).
2298 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002299static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002300do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002301{
Guido van Rossumd295f121998-04-09 21:39:57 +00002302 if (type == NULL) {
2303 /* Reraise */
2304 PyThreadState *tstate = PyThreadState_Get();
2305 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2306 value = tstate->exc_value;
2307 tb = tstate->exc_traceback;
2308 Py_XINCREF(type);
2309 Py_XINCREF(value);
2310 Py_XINCREF(tb);
2311 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002312
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002313 /* We support the following forms of raise:
2314 raise <class>, <classinstance>
2315 raise <class>, <argument tuple>
2316 raise <class>, None
2317 raise <class>, <argument>
2318 raise <classinstance>, None
2319 raise <string>, <object>
2320 raise <string>, None
2321
2322 An omitted second argument is the same as None.
2323
2324 In addition, raise <tuple>, <anything> is the same as
2325 raising the tuple's first item (and it better have one!);
2326 this rule is applied recursively.
2327
2328 Finally, an optional third argument can be supplied, which
2329 gives the traceback to be substituted (useful when
2330 re-raising an exception after examining it). */
2331
2332 /* First, check the traceback argument, replacing None with
2333 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002334 if (tb == Py_None) {
2335 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002336 tb = NULL;
2337 }
2338 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002339 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002340 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002341 goto raise_error;
2342 }
2343
2344 /* Next, replace a missing value with None */
2345 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002346 value = Py_None;
2347 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002348 }
2349
2350 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002351 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2352 PyObject *tmp = type;
2353 type = PyTuple_GET_ITEM(type, 0);
2354 Py_INCREF(type);
2355 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002356 }
2357
Barry Warsaw4249f541997-08-22 21:26:19 +00002358 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002359 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002360
2361 else if (PyClass_Check(type))
2362 PyErr_NormalizeException(&type, &value, &tb);
2363
Guido van Rossumb209a111997-04-29 18:18:01 +00002364 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002365 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002366 if (value != Py_None) {
2367 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002368 "instance exception may not have a separate value");
2369 goto raise_error;
2370 }
2371 else {
2372 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002373 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002374 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002375 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2376 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002377 }
2378 }
2379 else {
2380 /* Not something you can raise. You get an exception
2381 anyway, just not what you specified :-) */
Guido van Rossumb209a111997-04-29 18:18:01 +00002382 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002383 "exceptions must be strings, classes, or instances");
2384 goto raise_error;
2385 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002386 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002387 if (tb == NULL)
2388 return WHY_EXCEPTION;
2389 else
2390 return WHY_RERAISE;
2391 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002392 Py_XDECREF(value);
2393 Py_XDECREF(type);
2394 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002395 return WHY_EXCEPTION;
2396}
2397
Barry Warsawe42b18f1997-08-25 22:13:04 +00002398static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002399unpack_sequence(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002400{
2401 int i;
2402 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00002403
Barry Warsawe42b18f1997-08-25 22:13:04 +00002404 for (i = 0; i < argcnt; i++) {
2405 if (! (w = PySequence_GetItem(v, i))) {
2406 if (PyErr_ExceptionMatches(PyExc_IndexError))
2407 PyErr_SetString(PyExc_ValueError,
2408 "unpack sequence of wrong size");
2409 goto finally;
2410 }
2411 *--sp = w;
2412 }
2413 /* we better get an IndexError now */
2414 if (PySequence_GetItem(v, i) == NULL) {
2415 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2416 PyErr_Clear();
2417 return 1;
2418 }
2419 /* some other exception occurred. fall through to finally */
2420 }
2421 else
2422 PyErr_SetString(PyExc_ValueError,
2423 "unpack sequence of wrong size");
2424 /* fall through */
2425finally:
Barry Warsaw91010551997-08-25 22:30:51 +00002426 for (; i > 0; i--, sp++)
2427 Py_DECREF(*sp);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002428
2429 return 0;
2430}
2431
2432
Guido van Rossum96a42c81992-01-12 02:29:51 +00002433#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002434static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002435prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002436{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002437 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002438 if (PyObject_Print(v, stdout, 0) != 0)
2439 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002440 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002441 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002442}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002443#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002444
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002445static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002446call_exc_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002447{
Guido van Rossumb209a111997-04-29 18:18:01 +00002448 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002449 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002450 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002451 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002452 value = Py_None;
2453 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002454 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002455 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002456 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002457 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002458 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002459 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002460 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002461 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002462 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002463 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002464 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002465 Py_XDECREF(type);
2466 Py_XDECREF(value);
2467 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002468 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002469}
2470
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002471/* PyObject **p_trace: in/out; may not be NULL;
2472 may not point to NULL variable initially
2473 PyObject **p_newtrace: in/out; may be NULL;
2474 may point to NULL variable;
2475 may be same variable as p_newtrace */
2476
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002477static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002478call_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f,
2479 char *msg, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002480{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002481 PyThreadState *tstate = f->f_tstate;
Guido van Rossumb209a111997-04-29 18:18:01 +00002482 PyObject *args, *what;
2483 PyObject *res = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002484
Guido van Rossuma027efa1997-05-05 20:56:21 +00002485 if (tstate->tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002486 /* Don't do recursive traces */
2487 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002488 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002489 *p_newtrace = NULL;
2490 }
2491 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002492 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002493
Guido van Rossumb209a111997-04-29 18:18:01 +00002494 args = PyTuple_New(3);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002495 if (args == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002496 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002497 what = PyString_FromString(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002498 if (what == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002499 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002500 Py_INCREF(f);
2501 PyTuple_SET_ITEM(args, 0, (PyObject *)f);
2502 PyTuple_SET_ITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002503 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002504 arg = Py_None;
2505 Py_INCREF(arg);
2506 PyTuple_SET_ITEM(args, 2, arg);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002507 tstate->tracing++;
Guido van Rossumb209a111997-04-29 18:18:01 +00002508 PyFrame_FastToLocals(f);
2509 res = PyEval_CallObject(*p_trace, args); /* May clear *p_trace! */
2510 PyFrame_LocalsToFast(f, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002511 tstate->tracing--;
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002512 cleanup:
Guido van Rossumb209a111997-04-29 18:18:01 +00002513 Py_XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002514 if (res == NULL) {
2515 /* The trace proc raised an exception */
Guido van Rossumb209a111997-04-29 18:18:01 +00002516 PyTraceBack_Here(f);
2517 Py_XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002518 *p_trace = NULL;
2519 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002520 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002521 *p_newtrace = NULL;
2522 }
Barry Warsawf6202631999-09-08 16:26:33 +00002523 /* to be extra double plus sure we don't get recursive
2524 * calls inf either tracefunc or profilefunc gets an
2525 * exception, zap the global variables.
2526 */
2527 Py_XDECREF(tstate->sys_tracefunc);
2528 tstate->sys_tracefunc = NULL;
2529 Py_XDECREF(tstate->sys_profilefunc);
2530 tstate->sys_profilefunc = NULL;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002531 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002532 }
2533 else {
2534 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002535 Py_XDECREF(*p_newtrace);
2536 if (res == Py_None)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002537 *p_newtrace = NULL;
2538 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002539 Py_INCREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002540 *p_newtrace = res;
2541 }
2542 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002543 Py_DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002544 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002545 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002546}
2547
Guido van Rossumb209a111997-04-29 18:18:01 +00002548PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002549PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002550{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002551 PyThreadState *tstate = PyThreadState_Get();
2552 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002553 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002554 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002555 else
2556 return current_frame->f_builtins;
2557}
2558
Guido van Rossumb209a111997-04-29 18:18:01 +00002559PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002560PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002561{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002562 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002563 if (current_frame == NULL)
2564 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002565 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002566 return current_frame->f_locals;
2567}
2568
Guido van Rossumb209a111997-04-29 18:18:01 +00002569PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002570PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002571{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002572 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002573 if (current_frame == NULL)
2574 return NULL;
2575 else
2576 return current_frame->f_globals;
2577}
2578
Guido van Rossumb209a111997-04-29 18:18:01 +00002579PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002580PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002581{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002582 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002583 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002584}
2585
Guido van Rossum6135a871995-01-09 17:53:26 +00002586int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002587PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002588{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002589 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002590 return current_frame == NULL ? 0 : current_frame->f_restricted;
2591}
2592
Guido van Rossumbe270261997-05-22 22:26:18 +00002593int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002594Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002595{
Guido van Rossumb209a111997-04-29 18:18:01 +00002596 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002597 if (f == NULL)
2598 return 0;
2599 if (!PyFile_SoftSpace(f, 0))
2600 return 0;
2601 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002602}
2603
Guido van Rossum3f5da241990-12-20 15:06:42 +00002604
Guido van Rossum681d79a1995-07-18 14:51:37 +00002605/* External interface to call any callable object.
2606 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002607
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002608#undef PyEval_CallObject
2609/* for backward compatibility: export this interface */
2610
Guido van Rossumb209a111997-04-29 18:18:01 +00002611PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002612PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002613{
Guido van Rossumb209a111997-04-29 18:18:01 +00002614 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002615}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002616#define PyEval_CallObject(func,arg) \
2617 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002618
Guido van Rossumb209a111997-04-29 18:18:01 +00002619PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002620PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002621{
Jeremy Hylton52820442001-01-03 23:52:36 +00002622 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002623
2624 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002625 arg = PyTuple_New(0);
2626 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002627 PyErr_SetString(PyExc_TypeError,
2628 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002629 return NULL;
2630 }
2631 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002632 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002633
Guido van Rossumb209a111997-04-29 18:18:01 +00002634 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002635 PyErr_SetString(PyExc_TypeError,
2636 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00002637 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002638 return NULL;
2639 }
2640
Jeremy Hylton52820442001-01-03 23:52:36 +00002641 result = call_object(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002642 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00002643 return result;
2644}
2645
2646/* How often is each kind of object called? The answer depends on the
2647 program. An instrumented call_object() was used to run the Python
2648 regression test suite. The results were:
2649 4200000 PyCFunctions
2650 390000 fast_function() calls
2651 94000 other functions
2652 480000 all functions (sum of prev two)
2653 150000 methods
2654 100000 classes
2655
2656 Tests on other bodies of code show that PyCFunctions are still
2657 most common, but not by such a large margin.
2658*/
2659
2660static PyObject *
2661call_object(PyObject *func, PyObject *arg, PyObject *kw)
2662{
2663 ternaryfunc call;
2664 PyObject *result;
2665
2666 if (PyMethod_Check(func))
2667 result = call_method(func, arg, kw);
2668 else if (PyFunction_Check(func))
2669 result = call_eval_code2(func, arg, kw);
2670 else if (PyCFunction_Check(func))
2671 result = call_cfunction(func, arg, kw);
2672 else if (PyClass_Check(func))
2673 result = PyInstance_New(func, arg, kw);
2674 else if (PyInstance_Check(func))
2675 result = call_instance(func, arg, kw);
2676 else if ((call = func->ob_type->tp_call) != NULL)
2677 result = (*call)(func, arg, kw);
2678 else {
2679 PyErr_Format(PyExc_TypeError, "object is not callable: %s",
2680 PyString_AS_STRING(PyObject_Repr(func)));
2681 return NULL;
2682 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002683 if (result == NULL && !PyErr_Occurred())
2684 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002685 "NULL result without error in call_object");
Guido van Rossumac7be682001-01-17 15:42:30 +00002686
Guido van Rossume59214e1994-08-30 08:01:59 +00002687 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002688}
2689
Guido van Rossumb209a111997-04-29 18:18:01 +00002690static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00002691call_cfunction(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002692{
Jeremy Hylton52820442001-01-03 23:52:36 +00002693 PyCFunctionObject* f = (PyCFunctionObject*)func;
2694 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
2695 PyObject *self = PyCFunction_GET_SELF(func);
2696 int flags = PyCFunction_GET_FLAGS(func);
2697
Jeremy Hylton52820442001-01-03 23:52:36 +00002698 if (flags & METH_KEYWORDS) {
Fred Drake1a7aab72001-01-04 22:33:02 +00002699 if (kw == NULL) {
2700 static PyObject *dict = NULL;
2701 if (dict == NULL) {
2702 dict = PyDict_New();
2703 if (dict == NULL)
2704 return NULL;
2705 }
2706 kw = dict;
2707 Py_INCREF(dict);
2708 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002709 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002710 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002711 if (kw != NULL && PyDict_Size(kw) != 0) {
2712 PyErr_Format(PyExc_TypeError,
2713 "%.200s() takes no keyword arguments",
2714 f->m_ml->ml_name);
2715 return NULL;
2716 }
Fred Drake1a7aab72001-01-04 22:33:02 +00002717 if (flags & METH_VARARGS) {
2718 return (*meth)(self, arg);
2719 }
2720 if (!(flags & METH_VARARGS)) {
2721 /* the really old style */
2722 int size = PyTuple_GET_SIZE(arg);
2723 if (size == 1)
2724 arg = PyTuple_GET_ITEM(arg, 0);
2725 else if (size == 0)
2726 arg = NULL;
2727 return (*meth)(self, arg);
2728 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002729 /* should never get here ??? */
2730 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002731 return NULL;
2732}
2733
Guido van Rossumb209a111997-04-29 18:18:01 +00002734static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00002735call_instance(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002736{
Jeremy Hylton52820442001-01-03 23:52:36 +00002737 PyObject *res, *call = PyObject_GetAttrString(func, "__call__");
2738 if (call == NULL) {
2739 PyInstanceObject *inst = (PyInstanceObject*) func;
2740 PyErr_Clear();
2741 PyErr_Format(PyExc_AttributeError,
2742 "%.200s instance has no __call__ method",
2743 PyString_AsString(inst->in_class->cl_name));
Guido van Rossum681d79a1995-07-18 14:51:37 +00002744 return NULL;
2745 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002746 res = call_object(call, arg, kw);
2747 Py_DECREF(call);
2748 return res;
2749}
2750
2751static PyObject *
2752call_method(PyObject *func, PyObject *arg, PyObject *kw)
2753{
2754 PyObject *self = PyMethod_GET_SELF(func);
2755 PyObject *class = PyMethod_GET_CLASS(func);
2756 PyObject *result;
2757
2758 func = PyMethod_GET_FUNCTION(func);
2759 if (self == NULL) {
2760 /* Unbound methods must be called with an instance of
2761 the class (or a derived class) as first argument */
2762 if (PyTuple_Size(arg) >= 1)
2763 self = PyTuple_GET_ITEM(arg, 0);
2764 if (!(self != NULL && PyInstance_Check(self)
2765 && PyClass_IsSubclass((PyObject *)
2766 (((PyInstanceObject *)self)->in_class),
2767 class))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00002768 PyObject* fn = ((PyFunctionObject*) func)->func_name;
2769 PyErr_Format(PyExc_TypeError,
2770 "unbound method %s%smust be "
2771 "called with instance as first argument",
2772 fn ? PyString_AsString(fn) : "",
2773 fn ? "() " : "");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002774 return NULL;
2775 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002776 Py_INCREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00002777 } else {
2778 int argcount = PyTuple_Size(arg);
2779 PyObject *newarg = PyTuple_New(argcount + 1);
2780 int i;
2781 if (newarg == NULL)
2782 return NULL;
2783 Py_INCREF(self);
2784 PyTuple_SET_ITEM(newarg, 0, self);
2785 for (i = 0; i < argcount; i++) {
2786 PyObject *v = PyTuple_GET_ITEM(arg, i);
2787 Py_XINCREF(v);
2788 PyTuple_SET_ITEM(newarg, i+1, v);
2789 }
2790 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002791 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002792 result = call_object(func, arg, kw);
2793 Py_DECREF(arg);
2794 return result;
2795}
2796
2797static PyObject *
2798call_eval_code2(PyObject *func, PyObject *arg, PyObject *kw)
2799{
2800 PyObject *result;
2801 PyObject *argdefs;
2802 PyObject **d, **k;
2803 int nk, nd;
2804
2805 argdefs = PyFunction_GET_DEFAULTS(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00002806 if (argdefs != NULL && PyTuple_Check(argdefs)) {
2807 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
2808 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002809 }
2810 else {
2811 d = NULL;
2812 nd = 0;
2813 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002814
Guido van Rossum681d79a1995-07-18 14:51:37 +00002815 if (kw != NULL) {
2816 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002817 nk = PyDict_Size(kw);
2818 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002819 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002820 PyErr_NoMemory();
2821 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002822 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002823 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002824 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002825 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002826 i += 2;
2827 nk = i/2;
2828 /* XXX This is broken if the caller deletes dict items! */
2829 }
2830 else {
2831 k = NULL;
2832 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002833 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002834
Guido van Rossum681d79a1995-07-18 14:51:37 +00002835 result = eval_code2(
Jeremy Hylton52820442001-01-03 23:52:36 +00002836 (PyCodeObject *)PyFunction_GET_CODE(func),
2837 PyFunction_GET_GLOBALS(func), (PyObject *)NULL,
Guido van Rossumb209a111997-04-29 18:18:01 +00002838 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002839 k, nk, d, nd,
2840 PyFunction_GET_CLOSURE(func));
Guido van Rossumac7be682001-01-17 15:42:30 +00002841
Guido van Rossumb18618d2000-05-03 23:44:39 +00002842 if (k != NULL)
2843 PyMem_DEL(k);
Guido van Rossumac7be682001-01-17 15:42:30 +00002844
Guido van Rossum681d79a1995-07-18 14:51:37 +00002845 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002846}
2847
Jeremy Hylton52820442001-01-03 23:52:36 +00002848#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
2849
2850/* The two fast_xxx() functions optimize calls for which no argument
2851 tuple is necessary; the objects are passed directly from the stack.
2852 fast_cfunction() is called for METH_OLDARGS functions.
2853 fast_function() is for functions with no special argument handling.
2854*/
2855
2856static PyObject *
2857fast_cfunction(PyObject *func, PyObject ***pp_stack, int na)
2858{
2859 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
2860 PyObject *self = PyCFunction_GET_SELF(func);
2861
2862 if (na == 0)
2863 return (*meth)(self, NULL);
Charles G. Waldmaneec72a72001-01-10 22:11:59 +00002864 else if (na == 1) {
2865 PyObject *arg = EXT_POP(*pp_stack);
Guido van Rossumac7be682001-01-17 15:42:30 +00002866 PyObject *result = (*meth)(self, arg);
Charles G. Waldmaneec72a72001-01-10 22:11:59 +00002867 Py_DECREF(arg);
2868 return result;
2869 } else {
Jeremy Hylton52820442001-01-03 23:52:36 +00002870 PyObject *args = load_args(pp_stack, na);
2871 PyObject *result = (*meth)(self, args);
2872 Py_DECREF(args);
2873 return result;
2874 }
2875}
2876
2877static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00002878fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00002879{
2880 PyObject *co = PyFunction_GET_CODE(func);
2881 PyObject *globals = PyFunction_GET_GLOBALS(func);
2882 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002883 PyObject *closure = PyFunction_GET_CLOSURE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002884 PyObject **d = NULL;
2885 int nd = 0;
2886
2887 if (argdefs != NULL) {
2888 d = &PyTuple_GET_ITEM(argdefs, 0);
2889 nd = ((PyTupleObject *)argdefs)->ob_size;
2890 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002891 return eval_code2((PyCodeObject *)co, globals,
Jeremy Hylton52820442001-01-03 23:52:36 +00002892 (PyObject *)NULL, (*pp_stack)-n, na,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002893 (*pp_stack)-2*nk, nk, d, nd,
2894 closure);
Jeremy Hylton52820442001-01-03 23:52:36 +00002895}
2896
2897static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00002898update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
2899 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00002900{
2901 PyObject *kwdict = NULL;
2902 if (orig_kwdict == NULL)
2903 kwdict = PyDict_New();
2904 else {
2905 kwdict = PyDict_Copy(orig_kwdict);
2906 Py_DECREF(orig_kwdict);
2907 }
2908 if (kwdict == NULL)
2909 return NULL;
2910 while (--nk >= 0) {
2911 int err;
2912 PyObject *value = EXT_POP(*pp_stack);
2913 PyObject *key = EXT_POP(*pp_stack);
2914 if (PyDict_GetItem(kwdict, key) != NULL) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00002915 PyObject* fn = ((PyFunctionObject*) func)->func_name;
Guido van Rossumac7be682001-01-17 15:42:30 +00002916 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00002917 "%.200s%s got multiple values "
2918 "for keyword argument '%.400s'",
2919 fn ? PyString_AsString(fn) : "function",
2920 fn ? "()" : "", PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00002921 Py_DECREF(key);
2922 Py_DECREF(value);
2923 Py_DECREF(kwdict);
2924 return NULL;
2925 }
2926 err = PyDict_SetItem(kwdict, key, value);
2927 Py_DECREF(key);
2928 Py_DECREF(value);
2929 if (err) {
2930 Py_DECREF(kwdict);
2931 return NULL;
2932 }
2933 }
2934 return kwdict;
2935}
2936
2937static PyObject *
2938update_star_args(int nstack, int nstar, PyObject *stararg,
2939 PyObject ***pp_stack)
2940{
2941 PyObject *callargs, *w;
2942
2943 callargs = PyTuple_New(nstack + nstar);
2944 if (callargs == NULL) {
2945 return NULL;
2946 }
2947 if (nstar) {
2948 int i;
2949 for (i = 0; i < nstar; i++) {
2950 PyObject *a = PyTuple_GET_ITEM(stararg, i);
2951 Py_INCREF(a);
2952 PyTuple_SET_ITEM(callargs, nstack + i, a);
2953 }
2954 }
2955 while (--nstack >= 0) {
2956 w = EXT_POP(*pp_stack);
2957 PyTuple_SET_ITEM(callargs, nstack, w);
2958 }
2959 return callargs;
2960}
2961
2962static PyObject *
2963load_args(PyObject ***pp_stack, int na)
2964{
2965 PyObject *args = PyTuple_New(na);
2966 PyObject *w;
2967
2968 if (args == NULL)
2969 return NULL;
2970 while (--na >= 0) {
2971 w = EXT_POP(*pp_stack);
2972 PyTuple_SET_ITEM(args, na, w);
2973 }
2974 return args;
2975}
2976
2977static PyObject *
2978do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
2979{
2980 PyObject *callargs = NULL;
2981 PyObject *kwdict = NULL;
2982 PyObject *result = NULL;
2983
2984 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00002985 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002986 if (kwdict == NULL)
2987 goto call_fail;
2988 }
2989 callargs = load_args(pp_stack, na);
2990 if (callargs == NULL)
2991 goto call_fail;
2992 result = call_object(func, callargs, kwdict);
2993 call_fail:
2994 Py_XDECREF(callargs);
2995 Py_XDECREF(kwdict);
2996 return result;
2997}
2998
2999static PyObject *
3000ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3001{
3002 int nstar = 0;
3003 PyObject *callargs = NULL;
3004 PyObject *stararg = NULL;
3005 PyObject *kwdict = NULL;
3006 PyObject *result = NULL;
3007
3008 if (flags & CALL_FLAG_KW) {
3009 kwdict = EXT_POP(*pp_stack);
3010 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003011 PyObject* fn = ((PyFunctionObject*) func)->func_name;
3012 PyErr_Format(PyExc_TypeError,
3013 "%s%s argument after ** must be a dictionary",
3014 fn ? PyString_AsString(fn) : "function",
3015 fn ? "()" : "");
Jeremy Hylton52820442001-01-03 23:52:36 +00003016 goto ext_call_fail;
3017 }
3018 }
3019 if (flags & CALL_FLAG_VAR) {
3020 stararg = EXT_POP(*pp_stack);
3021 if (!PyTuple_Check(stararg)) {
3022 PyObject *t = NULL;
3023 t = PySequence_Tuple(stararg);
3024 if (t == NULL) {
3025 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003026 PyObject* fn =
3027 ((PyFunctionObject*) func)->func_name;
3028 PyErr_Format(PyExc_TypeError,
3029 "%s%s argument after * must be a sequence",
3030 fn ? PyString_AsString(fn) : "function",
3031 fn ? "()" : "");
Jeremy Hylton52820442001-01-03 23:52:36 +00003032 }
3033 goto ext_call_fail;
3034 }
3035 Py_DECREF(stararg);
3036 stararg = t;
3037 }
3038 nstar = PyTuple_GET_SIZE(stararg);
3039 }
3040 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003041 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003042 if (kwdict == NULL)
3043 goto ext_call_fail;
3044 }
3045 callargs = update_star_args(na, nstar, stararg, pp_stack);
3046 if (callargs == NULL)
3047 goto ext_call_fail;
3048 result = call_object(func, callargs, kwdict);
3049 ext_call_fail:
3050 Py_XDECREF(callargs);
3051 Py_XDECREF(kwdict);
3052 Py_XDECREF(stararg);
3053 return result;
3054}
3055
Guido van Rossum3b9c6671996-07-30 18:40:29 +00003056#define SLICE_ERROR_MSG \
3057 "standard sequence type does not support step size other than one"
3058
Guido van Rossumb209a111997-04-29 18:18:01 +00003059static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003060loop_subscript(PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003061{
Guido van Rossumb209a111997-04-29 18:18:01 +00003062 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00003063 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003064 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003065 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003066 return NULL;
3067 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003068 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00003069 v = (*sq->sq_item)(v, i);
3070 if (v)
3071 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00003072 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00003073 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00003074 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003075}
3076
Guido van Rossum20c6add2000-05-08 14:06:50 +00003077/* Extract a slice index from a PyInt or PyLong, the index is bound to
3078 the range [-INT_MAX+1, INTMAX]. Returns 0 and an exception if there is
3079 and error. Returns 1 on success.*/
3080
3081int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003082_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003083{
3084 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003085 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003086 if (PyInt_Check(v)) {
3087 x = PyInt_AsLong(v);
3088 } else if (PyLong_Check(v)) {
3089 x = PyLong_AsLong(v);
3090 if (x==-1 && PyErr_Occurred()) {
3091 PyObject *long_zero;
Guido van Rossumac7be682001-01-17 15:42:30 +00003092 int cmp;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003093
Guido van Rossumac7be682001-01-17 15:42:30 +00003094 if (!PyErr_ExceptionMatches(
3095 PyExc_OverflowError)) {
3096 /* It's not an overflow error, so just
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003097 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00003098 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003099 }
3100
Guido van Rossumac7be682001-01-17 15:42:30 +00003101 /* Clear the OverflowError */
3102 PyErr_Clear();
3103
3104 /* It's an overflow error, so we need to
3105 check the sign of the long integer,
3106 set the value to INT_MAX or 0, and clear
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003107 the error. */
3108
3109 /* Create a long integer with a value of 0 */
Guido van Rossumac7be682001-01-17 15:42:30 +00003110 long_zero = PyLong_FromLong(0L);
Guido van Rossum20c6add2000-05-08 14:06:50 +00003111 if (long_zero == NULL) return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003112
3113 /* Check sign */
Guido van Rossumac7be682001-01-17 15:42:30 +00003114 cmp = PyObject_RichCompareBool(v, long_zero,
3115 Py_GT);
3116 Py_DECREF(long_zero);
3117 if (cmp < 0)
3118 return 0;
3119 else if (cmp > 0)
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003120 x = INT_MAX;
3121 else
3122 x = 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003123 }
3124 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003125 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003126 "slice indices must be integers");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003127 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003128 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003129 /* Truncate -- very long indices are truncated anyway */
3130 if (x > INT_MAX)
3131 x = INT_MAX;
3132 else if (x < -INT_MAX)
3133 x = 0;
3134 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003135 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003136 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003137}
3138
Guido van Rossumb209a111997-04-29 18:18:01 +00003139static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003140apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
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 Rossum10dc2e81990-11-18 17:27:39 +00003144 return NULL;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003145 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum04691fc1992-08-12 15:35:34 +00003146 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003147 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003148}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003149
3150static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003151assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3152 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003153{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003154 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003155 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum3f5da241990-12-20 15:06:42 +00003156 return -1;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003157 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum3f5da241990-12-20 15:06:42 +00003158 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003159 if (x == NULL)
3160 return PySequence_DelSlice(u, ilow, ihigh);
3161 else
3162 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003163}
3164
Guido van Rossumb209a111997-04-29 18:18:01 +00003165static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003166cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003167{
Guido van Rossumac7be682001-01-17 15:42:30 +00003168 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003169 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00003170 case IS:
3171 case IS_NOT:
3172 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00003173 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003174 res = !res;
3175 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003176 case IN:
3177 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003178 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003179 if (res < 0)
3180 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00003181 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003182 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003183 break;
3184 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00003185 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003186 break;
3187 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003188 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003189 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003190 v = res ? Py_True : Py_False;
3191 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003192 return v;
3193}
3194
Thomas Wouters52152252000-08-17 22:55:00 +00003195static PyObject *
3196import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003197{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003198 PyObject *x;
3199
3200 x = PyObject_GetAttr(v, name);
3201 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00003202 PyErr_Format(PyExc_ImportError,
3203 "cannot import name %.230s",
3204 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003205 }
Thomas Wouters52152252000-08-17 22:55:00 +00003206 return x;
3207}
Guido van Rossumac7be682001-01-17 15:42:30 +00003208
Thomas Wouters52152252000-08-17 22:55:00 +00003209static int
3210import_all_from(PyObject *locals, PyObject *v)
3211{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003212 PyObject *all = PyObject_GetAttrString(v, "__all__");
3213 PyObject *dict, *name, *value;
3214 int skip_leading_underscores = 0;
3215 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003216
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003217 if (all == NULL) {
3218 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3219 return -1; /* Unexpected error */
3220 PyErr_Clear();
3221 dict = PyObject_GetAttrString(v, "__dict__");
3222 if (dict == NULL) {
3223 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3224 return -1;
3225 PyErr_SetString(PyExc_ImportError,
3226 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003227 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003228 }
3229 all = PyMapping_Keys(dict);
3230 Py_DECREF(dict);
3231 if (all == NULL)
3232 return -1;
3233 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003234 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003235
3236 for (pos = 0, err = 0; ; pos++) {
3237 name = PySequence_GetItem(all, pos);
3238 if (name == NULL) {
3239 if (!PyErr_ExceptionMatches(PyExc_IndexError))
3240 err = -1;
3241 else
3242 PyErr_Clear();
3243 break;
3244 }
3245 if (skip_leading_underscores &&
3246 PyString_Check(name) &&
3247 PyString_AS_STRING(name)[0] == '_')
3248 {
3249 Py_DECREF(name);
3250 continue;
3251 }
3252 value = PyObject_GetAttr(v, name);
3253 if (value == NULL)
3254 err = -1;
3255 else
3256 err = PyDict_SetItem(locals, name, value);
3257 Py_DECREF(name);
3258 Py_XDECREF(value);
3259 if (err != 0)
3260 break;
3261 }
3262 Py_DECREF(all);
3263 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003264}
3265
Guido van Rossumb209a111997-04-29 18:18:01 +00003266static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003267build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003268{
Guido van Rossumcd649651997-08-22 16:56:16 +00003269 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003270 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003271 PyErr_SetString(PyExc_SystemError,
3272 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00003273 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003274 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003275 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003276 PyErr_SetString(PyExc_SystemError,
3277 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00003278 return NULL;
3279 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003280 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003281 PyErr_SetString(PyExc_SystemError,
Guido van Rossum7a5b7962000-03-31 13:52:29 +00003282 "build_class with non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00003283 return NULL;
3284 }
Guido van Rossumcd649651997-08-22 16:56:16 +00003285 n = PyTuple_Size(bases);
3286 for (i = 0; i < n; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003287 PyObject *base = PyTuple_GET_ITEM(bases, i);
3288 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00003289 /* Call the base's *type*, if it is callable.
3290 This code is a hook for Donald Beaudry's
3291 and Jim Fulton's type extensions. In
Thomas Wouters7e474022000-07-16 12:04:32 +00003292 unextended Python it will never be triggered
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003293 since its types are not callable.
3294 Ditto: call the bases's *class*, if it has
3295 one. This makes the same thing possible
3296 without writing C code. A true meta-object
3297 protocol! */
3298 PyObject *basetype = (PyObject *)base->ob_type;
3299 PyObject *callable = NULL;
3300 if (PyCallable_Check(basetype))
3301 callable = basetype;
3302 else
3303 callable = PyObject_GetAttrString(
3304 base, "__class__");
3305 if (callable) {
3306 PyObject *args;
3307 PyObject *newclass = NULL;
3308 args = Py_BuildValue(
3309 "(OOO)", name, bases, methods);
3310 if (args != NULL) {
3311 newclass = PyEval_CallObject(
3312 callable, args);
3313 Py_DECREF(args);
3314 }
Guido van Rossum730806d1998-04-10 22:27:42 +00003315 if (callable != basetype) {
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003316 Py_DECREF(callable);
Guido van Rossum730806d1998-04-10 22:27:42 +00003317 }
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003318 return newclass;
Guido van Rossum150b2df1996-12-05 23:17:11 +00003319 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003320 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00003321 "base is not a class object");
3322 return NULL;
3323 }
3324 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003325 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00003326}
3327
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003328static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003329exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3330 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003331{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003332 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003333 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003334 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003335
Guido van Rossumb209a111997-04-29 18:18:01 +00003336 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3337 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003338 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003339 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003340 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003341 locals = PyTuple_GetItem(prog, 2);
3342 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003343 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003344 if (globals == Py_None) {
3345 globals = PyEval_GetGlobals();
3346 if (locals == Py_None) {
3347 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003348 plain = 1;
3349 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003350 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003351 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003352 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003353 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003354 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003355 !PyCode_Check(prog) &&
3356 !PyFile_Check(prog)) {
3357 PyErr_SetString(PyExc_TypeError,
Guido van Rossumac7be682001-01-17 15:42:30 +00003358 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003359 return -1;
3360 }
Fred Drake661ea262000-10-24 19:57:45 +00003361 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003362 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003363 "exec: arg 2 must be a dictionary or None");
3364 return -1;
3365 }
3366 if (!PyDict_Check(locals)) {
3367 PyErr_SetString(PyExc_TypeError,
3368 "exec: arg 3 must be a dictionary or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003369 return -1;
3370 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003371 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003372 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003373 if (PyCode_Check(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003374 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003375 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003376 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003377 FILE *fp = PyFile_AsFile(prog);
3378 char *name = PyString_AsString(PyFile_Name(prog));
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003379 v = PyRun_File(fp, name, Py_file_input, globals, locals);
3380 }
3381 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003382 char *str;
3383 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003384 return -1;
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003385 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003386 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003387 if (plain)
3388 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003389 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003390 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003391 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003392 return 0;
3393}
Guido van Rossum24c13741995-02-14 09:42:43 +00003394
Guido van Rossumac7be682001-01-17 15:42:30 +00003395static void
Paul Prescode68140d2000-08-30 20:25:01 +00003396format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3397{
3398 char *obj_str;
3399
3400 if (!obj)
3401 return;
3402
3403 obj_str = PyString_AsString(obj);
3404 if (!obj_str)
3405 return;
3406
3407 PyErr_Format(exc, format_str, obj_str);
3408}
Guido van Rossum950361c1997-01-24 13:49:28 +00003409
3410#ifdef DYNAMIC_EXECUTION_PROFILE
3411
3412PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003413getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003414{
3415 int i;
3416 PyObject *l = PyList_New(256);
3417 if (l == NULL) return NULL;
3418 for (i = 0; i < 256; i++) {
3419 PyObject *x = PyInt_FromLong(a[i]);
3420 if (x == NULL) {
3421 Py_DECREF(l);
3422 return NULL;
3423 }
3424 PyList_SetItem(l, i, x);
3425 }
3426 for (i = 0; i < 256; i++)
3427 a[i] = 0;
3428 return l;
3429}
3430
3431PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003432_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003433{
3434#ifndef DXPAIRS
3435 return getarray(dxp);
3436#else
3437 int i;
3438 PyObject *l = PyList_New(257);
3439 if (l == NULL) return NULL;
3440 for (i = 0; i < 257; i++) {
3441 PyObject *x = getarray(dxpairs[i]);
3442 if (x == NULL) {
3443 Py_DECREF(l);
3444 return NULL;
3445 }
3446 PyList_SetItem(l, i, x);
3447 }
3448 return l;
3449#endif
3450}
3451
3452#endif