blob: 15e0b3afb62f16434a80d4622ec2e3700d31500c [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum3f5da241990-12-20 15:06:42 +00002/* Execute compiled code */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003
Guido van Rossum681d79a1995-07-18 14:51:37 +00004/* XXX TO DO:
5 XXX how to pass arguments to call_trace?
Guido van Rossum681d79a1995-07-18 14:51:37 +00006 XXX speed up searching for keywords by using a dictionary
Guido van Rossum681d79a1995-07-18 14:51:37 +00007 XXX document it!
8 */
9
Guido van Rossumb209a111997-04-29 18:18:01 +000010#include "Python.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000011
Guido van Rossum10dc2e81990-11-18 17:27:39 +000012#include "compile.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000013#include "frameobject.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000014#include "eval.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000015#include "opcode.h"
16
Jack Jansencbf630f2000-07-11 21:59:16 +000017#ifdef macintosh
18#include "macglue.h"
19#endif
20
Guido van Rossumc6004111993-11-05 10:22:19 +000021#include <ctype.h>
22
Guido van Rossum04691fc1992-08-12 15:35:34 +000023/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000024/* #define CASE_TOO_BIG 1 */
Guido van Rossum04691fc1992-08-12 15:35:34 +000025
Guido van Rossum408027e1996-12-30 16:17:54 +000026#ifdef Py_DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000027/* For debugging the interpreter: */
28#define LLTRACE 1 /* Low-level trace feature */
29#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000030#endif
31
Jeremy Hylton52820442001-01-03 23:52:36 +000032typedef PyObject *(*callproc)(PyObject *, PyObject *, PyObject *);
Guido van Rossum5b722181993-03-30 17:46:03 +000033
Jeremy Hylton64949cb2001-01-25 20:06:59 +000034#define REPR(ob) PyString_AS_STRING(PyObject_Repr(ob))
35
Guido van Rossum374a9221991-04-04 10:40:29 +000036/* Forward declarations */
Guido van Rossum374a9221991-04-04 10:40:29 +000037
Tim Petersdbd9ba62000-07-09 03:09:57 +000038static PyObject *eval_code2(PyCodeObject *,
39 PyObject *, PyObject *,
40 PyObject **, int,
41 PyObject **, int,
Jeremy Hylton64949cb2001-01-25 20:06:59 +000042 PyObject **, int,
43 PyObject *);
Jeremy Hylton52820442001-01-03 23:52:36 +000044
45static PyObject *call_object(PyObject *, PyObject *, PyObject *);
46static PyObject *call_cfunction(PyObject *, PyObject *, PyObject *);
47static PyObject *call_instance(PyObject *, PyObject *, PyObject *);
48static PyObject *call_method(PyObject *, PyObject *, PyObject *);
49static PyObject *call_eval_code2(PyObject *, PyObject *, PyObject *);
50static PyObject *fast_function(PyObject *, PyObject ***, int, int, int);
51static PyObject *fast_cfunction(PyObject *, PyObject ***, int);
52static PyObject *do_call(PyObject *, PyObject ***, int, int);
53static PyObject *ext_do_call(PyObject *, PyObject ***, int, int, int);
Guido van Rossumac7be682001-01-17 15:42:30 +000054static PyObject *update_keyword_args(PyObject *, int, PyObject ***,PyObject *);
Ka-Ping Yee20579702001-01-15 22:14:16 +000055static PyObject *update_star_args(int, int, PyObject *, PyObject ***);
Jeremy Hylton52820442001-01-03 23:52:36 +000056static PyObject *load_args(PyObject ***, int);
57#define CALL_FLAG_VAR 1
58#define CALL_FLAG_KW 2
59
Guido van Rossum0a066c01992-03-27 17:29:15 +000060#ifdef LLTRACE
Tim Petersdbd9ba62000-07-09 03:09:57 +000061static int prtrace(PyObject *, char *);
Guido van Rossum0a066c01992-03-27 17:29:15 +000062#endif
Tim Petersdbd9ba62000-07-09 03:09:57 +000063static void call_exc_trace(PyObject **, PyObject**, PyFrameObject *);
64static int call_trace(PyObject **, PyObject **,
65 PyFrameObject *, char *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000066static PyObject *loop_subscript(PyObject *, PyObject *);
67static PyObject *apply_slice(PyObject *, PyObject *, PyObject *);
68static int assign_slice(PyObject *, PyObject *,
69 PyObject *, PyObject *);
70static PyObject *cmp_outcome(int, PyObject *, PyObject *);
Thomas Wouters52152252000-08-17 22:55:00 +000071static PyObject *import_from(PyObject *, PyObject *);
72static int import_all_from(PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000073static PyObject *build_class(PyObject *, PyObject *, PyObject *);
74static int exec_statement(PyFrameObject *,
75 PyObject *, PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000076static void set_exc_info(PyThreadState *, PyObject *, PyObject *, PyObject *);
77static void reset_exc_info(PyThreadState *);
Paul Prescode68140d2000-08-30 20:25:01 +000078static void format_exc_check_arg(PyObject *, char *, PyObject *);
Guido van Rossum374a9221991-04-04 10:40:29 +000079
Paul Prescode68140d2000-08-30 20:25:01 +000080#define NAME_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000081 "name '%.200s' is not defined"
Jeremy Hylton64949cb2001-01-25 20:06:59 +000082#define GLOBAL_NAME_ERROR_MSG \
83 "global name '%.200s' is not defined"
Paul Prescode68140d2000-08-30 20:25:01 +000084#define UNBOUNDLOCAL_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000085 "local variable '%.200s' referenced before assignment"
Guido van Rossum374a9221991-04-04 10:40:29 +000086
Guido van Rossum950361c1997-01-24 13:49:28 +000087/* Dynamic execution profile */
88#ifdef DYNAMIC_EXECUTION_PROFILE
89#ifdef DXPAIRS
90static long dxpairs[257][256];
91#define dxp dxpairs[256]
92#else
93static long dxp[256];
94#endif
95#endif
96
Guido van Rossume59214e1994-08-30 08:01:59 +000097#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +000098
Guido van Rossum2571cc81999-04-07 16:07:23 +000099#ifndef DONT_HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000100#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +0000101#endif
Guido van Rossum49b56061998-10-01 20:42:43 +0000102#include "pythread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000103
Guido van Rossuma027efa1997-05-05 20:56:21 +0000104extern int _PyThread_Started; /* Flag for Py_Exit */
105
Guido van Rossum65d5b571998-12-21 19:32:43 +0000106static PyThread_type_lock interpreter_lock = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000107static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000108
109void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000110PyEval_InitThreads(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000111{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000112 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000113 return;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000114 _PyThread_Started = 1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000115 interpreter_lock = PyThread_allocate_lock();
116 PyThread_acquire_lock(interpreter_lock, 1);
117 main_thread = PyThread_get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000118}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000119
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000120void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000121PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000122{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000123 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000124}
125
126void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000127PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000128{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000129 PyThread_release_lock(interpreter_lock);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000130}
131
132void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000133PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000134{
135 if (tstate == NULL)
136 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000137 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000138 if (PyThreadState_Swap(tstate) != NULL)
139 Py_FatalError(
140 "PyEval_AcquireThread: non-NULL old thread state");
141}
142
143void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000144PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000145{
146 if (tstate == NULL)
147 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
148 if (PyThreadState_Swap(NULL) != tstate)
149 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000150 PyThread_release_lock(interpreter_lock);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000151}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000152
153/* This function is called from PyOS_AfterFork to ensure that newly
154 created child processes don't hold locks referring to threads which
155 are not running in the child process. (This could also be done using
156 pthread_atfork mechanism, at least for the pthreads implementation.) */
157
158void
159PyEval_ReInitThreads(void)
160{
161 if (!interpreter_lock)
162 return;
163 /*XXX Can't use PyThread_free_lock here because it does too
164 much error-checking. Doing this cleanly would require
165 adding a new function to each thread_*.h. Instead, just
166 create a new lock and waste a little bit of memory */
167 interpreter_lock = PyThread_allocate_lock();
168 PyThread_acquire_lock(interpreter_lock, 1);
169 main_thread = PyThread_get_thread_ident();
170}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000171#endif
172
Guido van Rossumff4949e1992-08-05 19:58:53 +0000173/* Functions save_thread and restore_thread are always defined so
174 dynamically loaded modules needn't be compiled separately for use
175 with and without threads: */
176
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000177PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000178PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000179{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000180 PyThreadState *tstate = PyThreadState_Swap(NULL);
181 if (tstate == NULL)
182 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000183#ifdef WITH_THREAD
Guido van Rossumb74eca91997-09-30 22:03:16 +0000184 if (interpreter_lock)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000185 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000186#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000187 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000188}
189
190void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000191PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000192{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000193 if (tstate == NULL)
194 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000195#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000196 if (interpreter_lock) {
Guido van Rossumb74eca91997-09-30 22:03:16 +0000197 int err = errno;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000198 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000199 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000200 }
201#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000202 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000203}
204
205
Guido van Rossuma9672091994-09-14 13:31:22 +0000206/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
207 signal handlers or Mac I/O completion routines) can schedule calls
208 to a function to be called synchronously.
209 The synchronous function is called with one void* argument.
210 It should return 0 for success or -1 for failure -- failure should
211 be accompanied by an exception.
212
213 If registry succeeds, the registry function returns 0; if it fails
214 (e.g. due to too many pending calls) it returns -1 (without setting
215 an exception condition).
216
217 Note that because registry may occur from within signal handlers,
218 or other asynchronous events, calling malloc() is unsafe!
219
220#ifdef WITH_THREAD
221 Any thread can schedule pending calls, but only the main thread
222 will execute them.
223#endif
224
225 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
226 There are two possible race conditions:
227 (1) nested asynchronous registry calls;
228 (2) registry calls made while pending calls are being processed.
229 While (1) is very unlikely, (2) is a real possibility.
230 The current code is safe against (2), but not against (1).
231 The safety against (2) is derived from the fact that only one
232 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000233
Guido van Rossuma027efa1997-05-05 20:56:21 +0000234 XXX Darn! With the advent of thread state, we should have an array
235 of pending calls per thread in the thread state! Later...
236*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000237
Guido van Rossuma9672091994-09-14 13:31:22 +0000238#define NPENDINGCALLS 32
239static struct {
Thomas Wouters334fb892000-07-25 12:56:38 +0000240 int (*func)(void *);
241 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000242} pendingcalls[NPENDINGCALLS];
243static volatile int pendingfirst = 0;
244static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000245static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000246
247int
Thomas Wouters334fb892000-07-25 12:56:38 +0000248Py_AddPendingCall(int (*func)(void *), void *arg)
Guido van Rossuma9672091994-09-14 13:31:22 +0000249{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000250 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000251 int i, j;
252 /* XXX Begin critical section */
253 /* XXX If you want this to be safe against nested
254 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000255 if (busy)
256 return -1;
257 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000258 i = pendinglast;
259 j = (i + 1) % NPENDINGCALLS;
260 if (j == pendingfirst)
261 return -1; /* Queue full */
262 pendingcalls[i].func = func;
263 pendingcalls[i].arg = arg;
264 pendinglast = j;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000265 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000266 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000267 /* XXX End critical section */
268 return 0;
269}
270
Guido van Rossum180d7b41994-09-29 09:45:57 +0000271int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000272Py_MakePendingCalls(void)
Guido van Rossuma9672091994-09-14 13:31:22 +0000273{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000274 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000275#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000276 if (main_thread && PyThread_get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000277 return 0;
278#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000279 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000280 return 0;
281 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000282 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000283 for (;;) {
284 int i;
Thomas Wouters334fb892000-07-25 12:56:38 +0000285 int (*func)(void *);
286 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000287 i = pendingfirst;
288 if (i == pendinglast)
289 break; /* Queue empty */
290 func = pendingcalls[i].func;
291 arg = pendingcalls[i].arg;
292 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000293 if (func(arg) < 0) {
294 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000295 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000296 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000297 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000298 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000299 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000300 return 0;
301}
302
303
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000304/* The interpreter's recursion limit */
305
Guido van Rossum349ff6f2000-09-01 01:52:08 +0000306static int recursion_limit = 1000;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000307
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000308int
309Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000310{
311 return recursion_limit;
312}
313
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000314void
315Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000316{
317 recursion_limit = new_limit;
318}
319
Guido van Rossum374a9221991-04-04 10:40:29 +0000320/* Status code for main loop (reason for stack unwind) */
321
322enum why_code {
323 WHY_NOT, /* No error */
324 WHY_EXCEPTION, /* Exception occurred */
325 WHY_RERAISE, /* Exception re-raised by 'finally' */
326 WHY_RETURN, /* 'return' statement */
327 WHY_BREAK /* 'break' statement */
328};
329
Tim Petersdbd9ba62000-07-09 03:09:57 +0000330static enum why_code do_raise(PyObject *, PyObject *, PyObject *);
331static int unpack_sequence(PyObject *, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000332
Guido van Rossum374a9221991-04-04 10:40:29 +0000333
Guido van Rossumb209a111997-04-29 18:18:01 +0000334PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000335PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000336{
337 return eval_code2(co,
338 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000339 (PyObject **)NULL, 0,
340 (PyObject **)NULL, 0,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000341 (PyObject **)NULL, 0,
342 NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000343}
344
345
346/* Interpreter main loop */
347
Guido van Rossumb209a111997-04-29 18:18:01 +0000348static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000349eval_code2(PyCodeObject *co, PyObject *globals, PyObject *locals,
350 PyObject **args, int argcount, PyObject **kws, int kwcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000351 PyObject **defs, int defcount, PyObject *closure)
Guido van Rossum374a9221991-04-04 10:40:29 +0000352{
Guido van Rossum950361c1997-01-24 13:49:28 +0000353#ifdef DXPAIRS
354 int lastopcode = 0;
355#endif
Jeremy Hylton52820442001-01-03 23:52:36 +0000356 PyObject **stack_pointer;
Guido van Rossum374a9221991-04-04 10:40:29 +0000357 register unsigned char *next_instr;
Moshe Zadkaaa39a7e2000-08-07 06:34:45 +0000358 register int opcode=0; /* Current opcode */
359 register int oparg=0; /* Current opcode argument, if any */
Guido van Rossum374a9221991-04-04 10:40:29 +0000360 register enum why_code why; /* Reason for block stack unwind */
361 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000362 register PyObject *x; /* Result object -- NULL if error */
363 register PyObject *v; /* Temporary objects popped off stack */
364 register PyObject *w;
365 register PyObject *u;
366 register PyObject *t;
Barry Warsaw23c9ec82000-08-21 15:44:01 +0000367 register PyObject *stream = NULL; /* for PRINT opcodes */
Guido van Rossumb209a111997-04-29 18:18:01 +0000368 register PyFrameObject *f; /* Current frame */
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000369 register PyObject **fastlocals, **freevars;
Guido van Rossum014518f1998-11-23 21:09:51 +0000370 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000371 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossumd076c731998-10-07 19:42:25 +0000372 unsigned char *first_instr;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000373#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000374 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000375#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000376#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000377 /* Make it easier to find out where we are with a debugger */
Guido van Rossumb209a111997-04-29 18:18:01 +0000378 char *filename = PyString_AsString(co->co_filename);
Guido van Rossum99bec951992-09-03 20:29:45 +0000379#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000380
381/* Code access macros */
382
383#define GETCONST(i) Getconst(f, i)
384#define GETNAME(i) Getname(f, i)
385#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumd076c731998-10-07 19:42:25 +0000386#define INSTR_OFFSET() (next_instr - first_instr)
Guido van Rossum374a9221991-04-04 10:40:29 +0000387#define NEXTOP() (*next_instr++)
388#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossumd076c731998-10-07 19:42:25 +0000389#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000390#define JUMPBY(x) (next_instr += (x))
391
392/* Stack manipulation macros */
393
394#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
395#define EMPTY() (STACK_LEVEL() == 0)
396#define TOP() (stack_pointer[-1])
397#define BASIC_PUSH(v) (*stack_pointer++ = (v))
398#define BASIC_POP() (*--stack_pointer)
399
Guido van Rossum96a42c81992-01-12 02:29:51 +0000400#ifdef LLTRACE
401#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
402#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000403#else
404#define PUSH(v) BASIC_PUSH(v)
405#define POP() BASIC_POP()
406#endif
407
Guido van Rossum681d79a1995-07-18 14:51:37 +0000408/* Local variable macros */
409
410#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumb209a111997-04-29 18:18:01 +0000411#define SETLOCAL(i, value) do { Py_XDECREF(GETLOCAL(i)); \
Guido van Rossum681d79a1995-07-18 14:51:37 +0000412 GETLOCAL(i) = value; } while (0)
413
Guido van Rossuma027efa1997-05-05 20:56:21 +0000414/* Start of code */
415
Guido van Rossum8861b741996-07-30 16:49:37 +0000416#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000417 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000418 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000419 return NULL;
420 }
421#endif
422
Guido van Rossum681d79a1995-07-18 14:51:37 +0000423 if (globals == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000424 PyErr_SetString(PyExc_SystemError, "eval_code2: NULL globals");
Guido van Rossum6135a871995-01-09 17:53:26 +0000425 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000426 }
427
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000428#ifdef LLTRACE
Guido van Rossumb209a111997-04-29 18:18:01 +0000429 lltrace = PyDict_GetItemString(globals, "__lltrace__") != NULL;
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000430#endif
431
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000432 f = PyFrame_New(tstate, /*back*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000433 co, /*code*/
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000434 globals, locals, closure);
Guido van Rossum374a9221991-04-04 10:40:29 +0000435 if (f == NULL)
436 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000437
Guido van Rossuma027efa1997-05-05 20:56:21 +0000438 tstate->frame = f;
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000439 fastlocals = f->f_localsplus;
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000440 freevars = f->f_localsplus + f->f_nlocals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000441
442 if (co->co_argcount > 0 ||
443 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
444 int i;
445 int n = argcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000446 PyObject *kwdict = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000447 if (co->co_flags & CO_VARKEYWORDS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000448 kwdict = PyDict_New();
Guido van Rossum681d79a1995-07-18 14:51:37 +0000449 if (kwdict == NULL)
450 goto fail;
Guido van Rossum8c5df061997-01-24 04:19:24 +0000451 i = co->co_argcount;
452 if (co->co_flags & CO_VARARGS)
453 i++;
454 SETLOCAL(i, kwdict);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000455 }
456 if (argcount > co->co_argcount) {
457 if (!(co->co_flags & CO_VARARGS)) {
Guido van Rossumdf9db1e1997-11-19 16:05:40 +0000458 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +0000459 "%.200s() takes %s %d "
460 "%sargument%s (%d given)",
Fred Drake661ea262000-10-24 19:57:45 +0000461 PyString_AsString(co->co_name),
Ka-Ping Yee20579702001-01-15 22:14:16 +0000462 defcount ? "at most" : "exactly",
463 co->co_argcount,
464 kwcount ? "non-keyword " : "",
465 co->co_argcount == 1 ? "" : "s",
466 argcount);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000467 goto fail;
468 }
469 n = co->co_argcount;
470 }
471 for (i = 0; i < n; i++) {
472 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000473 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000474 SETLOCAL(i, x);
475 }
476 if (co->co_flags & CO_VARARGS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000477 u = PyTuple_New(argcount - n);
Guido van Rossum8c5df061997-01-24 04:19:24 +0000478 if (u == NULL)
479 goto fail;
480 SETLOCAL(co->co_argcount, u);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000481 for (i = n; i < argcount; i++) {
482 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000483 Py_INCREF(x);
484 PyTuple_SET_ITEM(u, i-n, x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000485 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000486 }
487 for (i = 0; i < kwcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000488 PyObject *keyword = kws[2*i];
489 PyObject *value = kws[2*i + 1];
Guido van Rossum681d79a1995-07-18 14:51:37 +0000490 int j;
Guido van Rossum25da5be1999-10-26 00:12:20 +0000491 if (keyword == NULL || !PyString_Check(keyword)) {
Ka-Ping Yee20579702001-01-15 22:14:16 +0000492 PyErr_Format(PyExc_TypeError,
493 "%.200s() keywords must be strings",
494 PyString_AsString(co->co_name));
Guido van Rossum25da5be1999-10-26 00:12:20 +0000495 goto fail;
496 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000497 /* XXX slow -- speed up using dictionary? */
498 for (j = 0; j < co->co_argcount; j++) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000499 PyObject *nm = PyTuple_GET_ITEM(
500 co->co_varnames, j);
Guido van Rossumac7be682001-01-17 15:42:30 +0000501 int cmp = PyObject_RichCompareBool(
502 keyword, nm, Py_EQ);
503 if (cmp > 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000504 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000505 else if (cmp < 0)
506 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000507 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000508 /* Check errors from Compare */
509 if (PyErr_Occurred())
510 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000511 if (j >= co->co_argcount) {
512 if (kwdict == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000513 PyErr_Format(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +0000514 "%.200s() got an unexpected "
515 "keyword argument '%.400s'",
516 PyString_AsString(co->co_name),
Jeremy Hylton76901512000-03-28 23:49:17 +0000517 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000518 goto fail;
519 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000520 PyDict_SetItem(kwdict, keyword, value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000521 }
522 else {
523 if (GETLOCAL(j) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000524 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +0000525 "%.200s() got multiple "
526 "values for keyword "
527 "argument '%.400s'",
528 PyString_AsString(co->co_name),
529 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000530 goto fail;
531 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000532 Py_INCREF(value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000533 SETLOCAL(j, value);
534 }
535 }
536 if (argcount < co->co_argcount) {
537 int m = co->co_argcount - defcount;
538 for (i = argcount; i < m; i++) {
539 if (GETLOCAL(i) == NULL) {
Guido van Rossumdf9db1e1997-11-19 16:05:40 +0000540 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +0000541 "%.200s() takes %s %d "
542 "%sargument%s (%d given)",
Fred Drake661ea262000-10-24 19:57:45 +0000543 PyString_AsString(co->co_name),
Ka-Ping Yee20579702001-01-15 22:14:16 +0000544 ((co->co_flags & CO_VARARGS) ||
545 defcount) ? "at least"
546 : "exactly",
547 m, kwcount ? "non-keyword " : "",
548 m == 1 ? "" : "s", i);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000549 goto fail;
550 }
551 }
552 if (n > m)
553 i = n - m;
554 else
555 i = 0;
556 for (; i < defcount; i++) {
557 if (GETLOCAL(m+i) == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000558 PyObject *def = defs[i];
559 Py_INCREF(def);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000560 SETLOCAL(m+i, def);
561 }
562 }
563 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000564 }
565 else {
566 if (argcount > 0 || kwcount > 0) {
Fred Drake661ea262000-10-24 19:57:45 +0000567 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +0000568 "%.200s() takes no arguments (%d given)",
569 PyString_AsString(co->co_name),
570 argcount + kwcount);
Guido van Rossum8c5df061997-01-24 04:19:24 +0000571 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000572 }
573 }
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000574 /* Allocate storage for cell vars and copy free vars into frame */
575 if (f->f_ncells) {
576 int i;
577 for (i = 0; i < f->f_ncells; ++i)
578 freevars[i] = PyCell_New(NULL);
579 }
580 if (f->f_nfreevars) {
581 int i;
582 for (i = 0; i < f->f_nfreevars; ++i)
583 freevars[f->f_ncells + i] = PyTuple_GET_ITEM(closure, i);
584 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000585
Guido van Rossuma027efa1997-05-05 20:56:21 +0000586 if (tstate->sys_tracefunc != NULL) {
587 /* tstate->sys_tracefunc, if defined, is a function that
588 will be called on *every* entry to a code block.
Guido van Rossum96a42c81992-01-12 02:29:51 +0000589 Its return value, if not None, is a function that
590 will be called at the start of each executed line
591 of code. (Actually, the function must return
592 itself in order to continue tracing.)
593 The trace functions are called with three arguments:
594 a pointer to the current frame, a string indicating
595 why the function is called, and an argument which
596 depends on the situation. The global trace function
597 (sys.trace) is also called whenever an exception
598 is detected. */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000599 if (call_trace(&tstate->sys_tracefunc,
600 &f->f_trace, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000601 Py_None/*XXX how to compute arguments now?*/)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000602 /* Trace function raised an error */
Guido van Rossum8c5df061997-01-24 04:19:24 +0000603 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000604 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000605 }
606
Guido van Rossuma027efa1997-05-05 20:56:21 +0000607 if (tstate->sys_profilefunc != NULL) {
608 /* Similar for sys_profilefunc, except it needn't return
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000609 itself and isn't called for "line" events */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000610 if (call_trace(&tstate->sys_profilefunc,
611 (PyObject**)0, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000612 Py_None/*XXX*/)) {
Guido van Rossum8c5df061997-01-24 04:19:24 +0000613 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000614 }
615 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000616
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000617 if (++tstate->recursion_depth > recursion_limit) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000618 --tstate->recursion_depth;
619 PyErr_SetString(PyExc_RuntimeError,
Fred Drake661ea262000-10-24 19:57:45 +0000620 "maximum recursion depth exceeded");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000621 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +0000622 Py_DECREF(f);
Guido van Rossum8861b741996-07-30 16:49:37 +0000623 return NULL;
624 }
625
Guido van Rossumd076c731998-10-07 19:42:25 +0000626 _PyCode_GETCODEPTR(co, &first_instr);
627 next_instr = first_instr;
Guido van Rossum374a9221991-04-04 10:40:29 +0000628 stack_pointer = f->f_valuestack;
Guido van Rossumac7be682001-01-17 15:42:30 +0000629
Guido van Rossum374a9221991-04-04 10:40:29 +0000630 why = WHY_NOT;
631 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000632 x = Py_None; /* Not a reference, just anything non-NULL */
Fred Drake48fba732000-10-11 13:54:07 +0000633 w = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +0000634
Guido van Rossum374a9221991-04-04 10:40:29 +0000635 for (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000636 /* Do periodic things. Doing this every time through
637 the loop would add too much overhead, so we do it
638 only every Nth instruction. We also do it if
639 ``things_to_do'' is set, i.e. when an asynchronous
640 event needs attention (e.g. a signal handler or
641 async I/O handler); see Py_AddPendingCall() and
642 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +0000643
Guido van Rossuma027efa1997-05-05 20:56:21 +0000644 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000645 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000646 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000647 if (Py_MakePendingCalls() < 0) {
648 why = WHY_EXCEPTION;
649 goto on_error;
650 }
651 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000652#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000653 /* If we have true signals, the signal handler
654 will call Py_AddPendingCall() so we don't
655 have to call sigcheck(). On the Mac and
656 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000657 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000658 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000659 goto on_error;
660 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000661#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000662
Guido van Rossume59214e1994-08-30 08:01:59 +0000663#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000664 if (interpreter_lock) {
665 /* Give another thread a chance */
666
Guido van Rossum25ce5661997-08-02 03:10:38 +0000667 if (PyThreadState_Swap(NULL) != tstate)
668 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000669 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000670
671 /* Other threads may run now */
672
Guido van Rossum65d5b571998-12-21 19:32:43 +0000673 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000674 if (PyThreadState_Swap(tstate) != NULL)
675 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000676 }
677#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000678 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000679
Guido van Rossum374a9221991-04-04 10:40:29 +0000680 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000681
Guido van Rossum408027e1996-12-30 16:17:54 +0000682#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000683 f->f_lasti = INSTR_OFFSET();
684#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000685
Guido van Rossum374a9221991-04-04 10:40:29 +0000686 opcode = NEXTOP();
687 if (HAS_ARG(opcode))
688 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000689 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000690#ifdef DYNAMIC_EXECUTION_PROFILE
691#ifdef DXPAIRS
692 dxpairs[lastopcode][opcode]++;
693 lastopcode = opcode;
694#endif
695 dxp[opcode]++;
696#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000697
Guido van Rossum96a42c81992-01-12 02:29:51 +0000698#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000699 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +0000700
Guido van Rossum96a42c81992-01-12 02:29:51 +0000701 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000702 if (HAS_ARG(opcode)) {
703 printf("%d: %d, %d\n",
704 (int) (INSTR_OFFSET() - 3),
705 opcode, oparg);
706 }
707 else {
708 printf("%d: %d\n",
709 (int) (INSTR_OFFSET() - 1), opcode);
710 }
711 }
712#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000713 /* Main switch on opcode */
Jeremy Hylton52820442001-01-03 23:52:36 +0000714
Guido van Rossum374a9221991-04-04 10:40:29 +0000715 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000716
Guido van Rossum374a9221991-04-04 10:40:29 +0000717 /* BEWARE!
718 It is essential that any operation that fails sets either
719 x to NULL, err to nonzero, or why to anything but WHY_NOT,
720 and that no operation that succeeds does this! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000721
Guido van Rossum374a9221991-04-04 10:40:29 +0000722 /* case STOP_CODE: this is an error! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000723
Guido van Rossum374a9221991-04-04 10:40:29 +0000724 case POP_TOP:
725 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000726 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000727 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000728
Guido van Rossum374a9221991-04-04 10:40:29 +0000729 case ROT_TWO:
730 v = POP();
731 w = POP();
732 PUSH(v);
733 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000734 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000735
Guido van Rossum374a9221991-04-04 10:40:29 +0000736 case ROT_THREE:
737 v = POP();
738 w = POP();
739 x = POP();
740 PUSH(v);
741 PUSH(x);
742 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000743 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000744
Thomas Wouters434d0822000-08-24 20:11:32 +0000745 case ROT_FOUR:
746 u = POP();
747 v = POP();
748 w = POP();
749 x = POP();
750 PUSH(u);
751 PUSH(x);
752 PUSH(w);
753 PUSH(v);
754 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000755
Guido van Rossum374a9221991-04-04 10:40:29 +0000756 case DUP_TOP:
757 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000758 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000759 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000760 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000761
Thomas Wouters434d0822000-08-24 20:11:32 +0000762 case DUP_TOPX:
763 switch (oparg) {
Thomas Wouters434d0822000-08-24 20:11:32 +0000764 case 1:
Tim Peters35ba6892000-10-11 07:04:49 +0000765 x = TOP();
766 Py_INCREF(x);
767 PUSH(x);
768 continue;
769 case 2:
Thomas Wouters434d0822000-08-24 20:11:32 +0000770 x = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000771 Py_INCREF(x);
772 w = TOP();
773 Py_INCREF(w);
774 PUSH(x);
775 PUSH(w);
776 PUSH(x);
777 continue;
778 case 3:
779 x = POP();
780 Py_INCREF(x);
Thomas Wouters434d0822000-08-24 20:11:32 +0000781 w = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000782 Py_INCREF(w);
783 v = TOP();
784 Py_INCREF(v);
785 PUSH(w);
786 PUSH(x);
787 PUSH(v);
788 PUSH(w);
789 PUSH(x);
790 continue;
791 case 4:
792 x = POP();
793 Py_INCREF(x);
794 w = POP();
795 Py_INCREF(w);
Thomas Wouters434d0822000-08-24 20:11:32 +0000796 v = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000797 Py_INCREF(v);
798 u = TOP();
799 Py_INCREF(u);
800 PUSH(v);
801 PUSH(w);
802 PUSH(x);
803 PUSH(u);
804 PUSH(v);
805 PUSH(w);
806 PUSH(x);
807 continue;
808 case 5:
809 x = POP();
810 Py_INCREF(x);
811 w = POP();
812 Py_INCREF(w);
813 v = POP();
814 Py_INCREF(v);
Thomas Wouters434d0822000-08-24 20:11:32 +0000815 u = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000816 Py_INCREF(u);
817 t = TOP();
818 Py_INCREF(t);
819 PUSH(u);
820 PUSH(v);
821 PUSH(w);
822 PUSH(x);
823 PUSH(t);
824 PUSH(u);
825 PUSH(v);
826 PUSH(w);
827 PUSH(x);
828 continue;
Thomas Wouters434d0822000-08-24 20:11:32 +0000829 default:
Thomas Wouters0be483f2000-10-11 23:26:11 +0000830 Py_FatalError("invalid argument to DUP_TOPX"
831 " (bytecode corruption?)");
Thomas Wouters434d0822000-08-24 20:11:32 +0000832 }
Tim Peters35ba6892000-10-11 07:04:49 +0000833 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000834
Guido van Rossum374a9221991-04-04 10:40:29 +0000835 case UNARY_POSITIVE:
836 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000837 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000838 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000839 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000840 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000841 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000842
Guido van Rossum374a9221991-04-04 10:40:29 +0000843 case UNARY_NEGATIVE:
844 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000845 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000846 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000847 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000848 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000849 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000850
Guido van Rossum374a9221991-04-04 10:40:29 +0000851 case UNARY_NOT:
852 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000853 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000854 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000855 if (err == 0) {
856 Py_INCREF(Py_True);
857 PUSH(Py_True);
858 continue;
859 }
860 else if (err > 0) {
861 Py_INCREF(Py_False);
862 PUSH(Py_False);
863 err = 0;
864 continue;
865 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000866 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000867
Guido van Rossum374a9221991-04-04 10:40:29 +0000868 case UNARY_CONVERT:
869 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000870 x = PyObject_Repr(v);
871 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000872 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000873 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000874 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000875
Guido van Rossum7928cd71991-10-24 14:59:31 +0000876 case UNARY_INVERT:
877 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000878 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000879 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000880 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000881 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000882 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000883
Guido van Rossum50564e81996-01-12 01:13:16 +0000884 case BINARY_POWER:
885 w = POP();
886 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000887 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000888 Py_DECREF(v);
889 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000890 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000891 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000892 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000893
Guido van Rossum374a9221991-04-04 10:40:29 +0000894 case BINARY_MULTIPLY:
895 w = POP();
896 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000897 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000898 Py_DECREF(v);
899 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000900 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000901 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000902 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000903
Guido van Rossum374a9221991-04-04 10:40:29 +0000904 case BINARY_DIVIDE:
905 w = POP();
906 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000907 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000908 Py_DECREF(v);
909 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000910 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000911 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000912 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000913
Guido van Rossum374a9221991-04-04 10:40:29 +0000914 case BINARY_MODULO:
915 w = POP();
916 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000917 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000918 Py_DECREF(v);
919 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000920 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000921 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000922 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000923
Guido van Rossum374a9221991-04-04 10:40:29 +0000924 case BINARY_ADD:
925 w = POP();
926 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000927 if (PyInt_Check(v) && PyInt_Check(w)) {
928 /* INLINE: int + int */
929 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000930 a = PyInt_AS_LONG(v);
931 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000932 i = a + b;
933 if ((i^a) < 0 && (i^b) < 0) {
934 PyErr_SetString(PyExc_OverflowError,
935 "integer addition");
936 x = NULL;
937 }
938 else
939 x = PyInt_FromLong(i);
940 }
941 else
942 x = PyNumber_Add(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000943 Py_DECREF(v);
944 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000945 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000946 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000947 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000948
Guido van Rossum374a9221991-04-04 10:40:29 +0000949 case BINARY_SUBTRACT:
950 w = POP();
951 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000952 if (PyInt_Check(v) && PyInt_Check(w)) {
953 /* INLINE: int - int */
954 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000955 a = PyInt_AS_LONG(v);
956 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000957 i = a - b;
958 if ((i^a) < 0 && (i^~b) < 0) {
959 PyErr_SetString(PyExc_OverflowError,
960 "integer subtraction");
961 x = NULL;
962 }
963 else
964 x = PyInt_FromLong(i);
965 }
966 else
967 x = PyNumber_Subtract(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000968 Py_DECREF(v);
969 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000970 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000971 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000972 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000973
Guido van Rossum374a9221991-04-04 10:40:29 +0000974 case BINARY_SUBSCR:
975 w = POP();
976 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000977 if (PyList_Check(v) && PyInt_Check(w)) {
978 /* INLINE: list[int] */
979 long i = PyInt_AsLong(w);
980 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +0000981 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +0000982 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 PyErr_SetString(PyExc_IndexError,
985 "list index out of range");
986 x = NULL;
987 }
988 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +0000989 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000990 Py_INCREF(x);
991 }
992 }
993 else
994 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000995 Py_DECREF(v);
996 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000997 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000998 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000999 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001000
Guido van Rossum7928cd71991-10-24 14:59:31 +00001001 case BINARY_LSHIFT:
1002 w = POP();
1003 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001004 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001005 Py_DECREF(v);
1006 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001007 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001008 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001009 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001010
Guido van Rossum7928cd71991-10-24 14:59:31 +00001011 case BINARY_RSHIFT:
1012 w = POP();
1013 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001014 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001015 Py_DECREF(v);
1016 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001017 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001018 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001019 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001020
Guido van Rossum7928cd71991-10-24 14:59:31 +00001021 case BINARY_AND:
1022 w = POP();
1023 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001024 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001025 Py_DECREF(v);
1026 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001027 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001028 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001029 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001030
Guido van Rossum7928cd71991-10-24 14:59:31 +00001031 case BINARY_XOR:
1032 w = POP();
1033 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001034 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001035 Py_DECREF(v);
1036 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001037 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001038 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001039 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001040
Guido van Rossum7928cd71991-10-24 14:59:31 +00001041 case BINARY_OR:
1042 w = POP();
1043 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001044 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001045 Py_DECREF(v);
1046 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001047 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001048 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001049 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001050
1051 case INPLACE_POWER:
1052 w = POP();
1053 v = POP();
1054 x = PyNumber_InPlacePower(v, w, Py_None);
1055 Py_DECREF(v);
1056 Py_DECREF(w);
1057 PUSH(x);
1058 if (x != NULL) continue;
1059 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001060
Thomas Wouters434d0822000-08-24 20:11:32 +00001061 case INPLACE_MULTIPLY:
1062 w = POP();
1063 v = POP();
1064 x = PyNumber_InPlaceMultiply(v, w);
1065 Py_DECREF(v);
1066 Py_DECREF(w);
1067 PUSH(x);
1068 if (x != NULL) continue;
1069 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001070
Thomas Wouters434d0822000-08-24 20:11:32 +00001071 case INPLACE_DIVIDE:
1072 w = POP();
1073 v = POP();
1074 x = PyNumber_InPlaceDivide(v, w);
1075 Py_DECREF(v);
1076 Py_DECREF(w);
1077 PUSH(x);
1078 if (x != NULL) continue;
1079 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001080
Thomas Wouters434d0822000-08-24 20:11:32 +00001081 case INPLACE_MODULO:
1082 w = POP();
1083 v = POP();
1084 x = PyNumber_InPlaceRemainder(v, w);
1085 Py_DECREF(v);
1086 Py_DECREF(w);
1087 PUSH(x);
1088 if (x != NULL) continue;
1089 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001090
Thomas Wouters434d0822000-08-24 20:11:32 +00001091 case INPLACE_ADD:
1092 w = POP();
1093 v = POP();
1094 if (PyInt_Check(v) && PyInt_Check(w)) {
1095 /* INLINE: int + int */
1096 register long a, b, i;
1097 a = PyInt_AS_LONG(v);
1098 b = PyInt_AS_LONG(w);
1099 i = a + b;
1100 if ((i^a) < 0 && (i^b) < 0) {
1101 PyErr_SetString(PyExc_OverflowError,
1102 "integer addition");
1103 x = NULL;
1104 }
1105 else
1106 x = PyInt_FromLong(i);
1107 }
1108 else
1109 x = PyNumber_InPlaceAdd(v, w);
1110 Py_DECREF(v);
1111 Py_DECREF(w);
1112 PUSH(x);
1113 if (x != NULL) continue;
1114 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001115
Thomas Wouters434d0822000-08-24 20:11:32 +00001116 case INPLACE_SUBTRACT:
1117 w = POP();
1118 v = POP();
1119 if (PyInt_Check(v) && PyInt_Check(w)) {
1120 /* INLINE: int - int */
1121 register long a, b, i;
1122 a = PyInt_AS_LONG(v);
1123 b = PyInt_AS_LONG(w);
1124 i = a - b;
1125 if ((i^a) < 0 && (i^~b) < 0) {
1126 PyErr_SetString(PyExc_OverflowError,
1127 "integer subtraction");
1128 x = NULL;
1129 }
1130 else
1131 x = PyInt_FromLong(i);
1132 }
1133 else
1134 x = PyNumber_InPlaceSubtract(v, w);
1135 Py_DECREF(v);
1136 Py_DECREF(w);
1137 PUSH(x);
1138 if (x != NULL) continue;
1139 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001140
Thomas Wouters434d0822000-08-24 20:11:32 +00001141 case INPLACE_LSHIFT:
1142 w = POP();
1143 v = POP();
1144 x = PyNumber_InPlaceLshift(v, w);
1145 Py_DECREF(v);
1146 Py_DECREF(w);
1147 PUSH(x);
1148 if (x != NULL) continue;
1149 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001150
Thomas Wouters434d0822000-08-24 20:11:32 +00001151 case INPLACE_RSHIFT:
1152 w = POP();
1153 v = POP();
1154 x = PyNumber_InPlaceRshift(v, w);
1155 Py_DECREF(v);
1156 Py_DECREF(w);
1157 PUSH(x);
1158 if (x != NULL) continue;
1159 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001160
Thomas Wouters434d0822000-08-24 20:11:32 +00001161 case INPLACE_AND:
1162 w = POP();
1163 v = POP();
1164 x = PyNumber_InPlaceAnd(v, w);
1165 Py_DECREF(v);
1166 Py_DECREF(w);
1167 PUSH(x);
1168 if (x != NULL) continue;
1169 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001170
Thomas Wouters434d0822000-08-24 20:11:32 +00001171 case INPLACE_XOR:
1172 w = POP();
1173 v = POP();
1174 x = PyNumber_InPlaceXor(v, w);
1175 Py_DECREF(v);
1176 Py_DECREF(w);
1177 PUSH(x);
1178 if (x != NULL) continue;
1179 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001180
Thomas Wouters434d0822000-08-24 20:11:32 +00001181 case INPLACE_OR:
1182 w = POP();
1183 v = POP();
1184 x = PyNumber_InPlaceOr(v, w);
1185 Py_DECREF(v);
1186 Py_DECREF(w);
1187 PUSH(x);
1188 if (x != NULL) continue;
1189 break;
1190
Guido van Rossum374a9221991-04-04 10:40:29 +00001191 case SLICE+0:
1192 case SLICE+1:
1193 case SLICE+2:
1194 case SLICE+3:
1195 if ((opcode-SLICE) & 2)
1196 w = POP();
1197 else
1198 w = NULL;
1199 if ((opcode-SLICE) & 1)
1200 v = POP();
1201 else
1202 v = NULL;
1203 u = POP();
1204 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001205 Py_DECREF(u);
1206 Py_XDECREF(v);
1207 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001208 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001209 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001210 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001211
Guido van Rossum374a9221991-04-04 10:40:29 +00001212 case STORE_SLICE+0:
1213 case STORE_SLICE+1:
1214 case STORE_SLICE+2:
1215 case STORE_SLICE+3:
1216 if ((opcode-STORE_SLICE) & 2)
1217 w = POP();
1218 else
1219 w = NULL;
1220 if ((opcode-STORE_SLICE) & 1)
1221 v = POP();
1222 else
1223 v = NULL;
1224 u = POP();
1225 t = POP();
1226 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001227 Py_DECREF(t);
1228 Py_DECREF(u);
1229 Py_XDECREF(v);
1230 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001231 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001232 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001233
Guido van Rossum374a9221991-04-04 10:40:29 +00001234 case DELETE_SLICE+0:
1235 case DELETE_SLICE+1:
1236 case DELETE_SLICE+2:
1237 case DELETE_SLICE+3:
1238 if ((opcode-DELETE_SLICE) & 2)
1239 w = POP();
1240 else
1241 w = NULL;
1242 if ((opcode-DELETE_SLICE) & 1)
1243 v = POP();
1244 else
1245 v = NULL;
1246 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001247 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001248 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001249 Py_DECREF(u);
1250 Py_XDECREF(v);
1251 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001252 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001253 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001254
Guido van Rossum374a9221991-04-04 10:40:29 +00001255 case STORE_SUBSCR:
1256 w = POP();
1257 v = POP();
1258 u = POP();
1259 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001260 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001261 Py_DECREF(u);
1262 Py_DECREF(v);
1263 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001264 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001265 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001266
Guido van Rossum374a9221991-04-04 10:40:29 +00001267 case DELETE_SUBSCR:
1268 w = POP();
1269 v = POP();
1270 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001271 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001272 Py_DECREF(v);
1273 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001274 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001275 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001276
Guido van Rossum374a9221991-04-04 10:40:29 +00001277 case PRINT_EXPR:
1278 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001279 w = PySys_GetObject("displayhook");
1280 if (w == NULL) {
1281 PyErr_SetString(PyExc_RuntimeError,
1282 "lost sys.displayhook");
1283 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001284 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001285 }
1286 if (err == 0) {
1287 x = Py_BuildValue("(O)", v);
1288 if (x == NULL)
1289 err = -1;
1290 }
1291 if (err == 0) {
1292 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001293 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001294 if (w == NULL)
1295 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001296 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001297 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001298 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001299 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001300
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001301 case PRINT_ITEM_TO:
1302 w = stream = POP();
1303 /* fall through to PRINT_ITEM */
1304
Guido van Rossum374a9221991-04-04 10:40:29 +00001305 case PRINT_ITEM:
1306 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001307 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001308 w = PySys_GetObject("stdout");
1309 if (w == NULL) {
1310 PyErr_SetString(PyExc_RuntimeError,
1311 "lost sys.stdout");
1312 err = -1;
1313 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001314 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001315 if (w != NULL && PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001316 err = PyFile_WriteString(" ", w);
1317 if (err == 0)
1318 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001319 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001320 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001321 char *s = PyString_AsString(v);
1322 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001323 if (len > 0 &&
1324 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001325 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001326 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001327 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001328 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001329 Py_XDECREF(stream);
1330 stream = NULL;
1331 if (err == 0)
1332 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001333 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001334
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001335 case PRINT_NEWLINE_TO:
1336 w = stream = POP();
1337 /* fall through to PRINT_NEWLINE */
1338
Guido van Rossum374a9221991-04-04 10:40:29 +00001339 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001340 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001341 w = PySys_GetObject("stdout");
1342 if (w == NULL)
1343 PyErr_SetString(PyExc_RuntimeError,
1344 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001345 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001346 if (w != NULL) {
1347 err = PyFile_WriteString("\n", w);
1348 if (err == 0)
1349 PyFile_SoftSpace(w, 0);
1350 }
1351 Py_XDECREF(stream);
1352 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001353 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001354
Thomas Wouters434d0822000-08-24 20:11:32 +00001355
1356#ifdef CASE_TOO_BIG
1357 default: switch (opcode) {
1358#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001359 case BREAK_LOOP:
1360 why = WHY_BREAK;
1361 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001362
Guido van Rossumf10570b1995-07-07 22:53:21 +00001363 case RAISE_VARARGS:
1364 u = v = w = NULL;
1365 switch (oparg) {
1366 case 3:
1367 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001368 /* Fallthrough */
1369 case 2:
1370 v = POP(); /* value */
1371 /* Fallthrough */
1372 case 1:
1373 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001374 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001375 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001376 break;
1377 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001378 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001379 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001380 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001381 break;
1382 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001383 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001384
Guido van Rossum374a9221991-04-04 10:40:29 +00001385 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001386 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001387 PyErr_SetString(PyExc_SystemError,
1388 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001389 break;
1390 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001391 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001392 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001393 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001394
Guido van Rossum374a9221991-04-04 10:40:29 +00001395 case RETURN_VALUE:
1396 retval = POP();
1397 why = WHY_RETURN;
1398 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001399
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001400 case EXEC_STMT:
1401 w = POP();
1402 v = POP();
1403 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001404 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001405 Py_DECREF(u);
1406 Py_DECREF(v);
1407 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001408 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001409
Guido van Rossum374a9221991-04-04 10:40:29 +00001410 case POP_BLOCK:
1411 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001412 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001413 while (STACK_LEVEL() > b->b_level) {
1414 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001415 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001416 }
1417 }
1418 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001419
Guido van Rossum374a9221991-04-04 10:40:29 +00001420 case END_FINALLY:
1421 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001422 if (PyInt_Check(v)) {
1423 why = (enum why_code) PyInt_AsLong(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001424 if (why == WHY_RETURN)
1425 retval = POP();
1426 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001427 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001428 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001429 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001430 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001431 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001432 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001433 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001434 else if (v != Py_None) {
1435 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001436 "'finally' pops bad exception");
1437 why = WHY_EXCEPTION;
1438 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001439 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001440 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001441
Guido van Rossum374a9221991-04-04 10:40:29 +00001442 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001443 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001444 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001445 w = POP();
1446 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001447 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001448 Py_DECREF(u);
1449 Py_DECREF(v);
1450 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001451 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001452
Guido van Rossum374a9221991-04-04 10:40:29 +00001453 case STORE_NAME:
1454 w = GETNAMEV(oparg);
1455 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001456 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001457 PyErr_Format(PyExc_SystemError,
1458 "no locals found when storing %s",
1459 REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001460 break;
1461 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001462 err = PyDict_SetItem(x, w, v);
1463 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001464 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001465
Guido van Rossum374a9221991-04-04 10:40:29 +00001466 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001467 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001468 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001469 PyErr_Format(PyExc_SystemError,
1470 "no locals when deleting %s",
1471 REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001472 break;
1473 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001474 if ((err = PyDict_DelItem(x, w)) != 0)
Guido van Rossumac7be682001-01-17 15:42:30 +00001475 format_exc_check_arg(PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001476 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001477 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001478
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001479 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001480 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001481 if (PyTuple_Check(v)) {
1482 if (PyTuple_Size(v) != oparg) {
1483 PyErr_SetString(PyExc_ValueError,
1484 "unpack tuple of wrong size");
1485 why = WHY_EXCEPTION;
1486 }
1487 else {
1488 for (; --oparg >= 0; ) {
1489 w = PyTuple_GET_ITEM(v, oparg);
1490 Py_INCREF(w);
1491 PUSH(w);
1492 }
1493 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001494 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001495 else if (PyList_Check(v)) {
1496 if (PyList_Size(v) != oparg) {
1497 PyErr_SetString(PyExc_ValueError,
1498 "unpack list of wrong size");
1499 why = WHY_EXCEPTION;
1500 }
1501 else {
1502 for (; --oparg >= 0; ) {
1503 w = PyList_GET_ITEM(v, oparg);
1504 Py_INCREF(w);
1505 PUSH(w);
1506 }
1507 }
1508 }
1509 else if (PySequence_Check(v)) {
1510 if (unpack_sequence(v, oparg,
1511 stack_pointer + oparg))
1512 stack_pointer += oparg;
1513 else
1514 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001515 }
1516 else {
Barry Warsawe42b18f1997-08-25 22:13:04 +00001517 PyErr_SetString(PyExc_TypeError,
1518 "unpack non-sequence");
1519 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001520 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001521 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001522 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001523
Guido van Rossum374a9221991-04-04 10:40:29 +00001524 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001525 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001526 v = POP();
1527 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001528 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1529 Py_DECREF(v);
1530 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001531 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001532
Guido van Rossum374a9221991-04-04 10:40:29 +00001533 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001534 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001535 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001536 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1537 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001538 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001539 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001540
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001541 case STORE_GLOBAL:
1542 w = GETNAMEV(oparg);
1543 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001544 err = PyDict_SetItem(f->f_globals, w, v);
1545 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001546 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001547
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001548 case DELETE_GLOBAL:
1549 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001550 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001551 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001552 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001553 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001554
Guido van Rossum374a9221991-04-04 10:40:29 +00001555 case LOAD_CONST:
1556 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001557 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001558 PUSH(x);
1559 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001560
Guido van Rossum374a9221991-04-04 10:40:29 +00001561 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001562 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001563 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001564 PyErr_Format(PyExc_SystemError,
1565 "no locals when loading %s",
1566 REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001567 break;
1568 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001569 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001570 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001571 x = PyDict_GetItem(f->f_globals, 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_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001574 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001575 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001576 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001577 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001578 break;
1579 }
1580 }
1581 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001582 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001583 PUSH(x);
1584 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001585
Guido van Rossum374a9221991-04-04 10:40:29 +00001586 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001587 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001588 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001589 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001590 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001591 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001592 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001593 PyExc_NameError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001594 GLOBAL_NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001595 break;
1596 }
1597 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001598 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001599 PUSH(x);
1600 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001601
Guido van Rossum9bfef441993-03-29 10:43:31 +00001602 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001603 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001604 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001605 format_exc_check_arg(
1606 PyExc_UnboundLocalError,
1607 UNBOUNDLOCAL_ERROR_MSG,
1608 PyTuple_GetItem(co->co_varnames, oparg)
1609 );
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001610 break;
1611 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001612 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001613 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001614 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001615 break;
1616
1617 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001618 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001619 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001620 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001621
1622 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001623 x = GETLOCAL(oparg);
1624 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001625 format_exc_check_arg(
1626 PyExc_UnboundLocalError,
1627 UNBOUNDLOCAL_ERROR_MSG,
1628 PyTuple_GetItem(co->co_varnames, oparg)
1629 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001630 break;
1631 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001632 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001633 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001634
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001635 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001636 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001637 Py_INCREF(x);
1638 PUSH(x);
1639 break;
1640
1641 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001642 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001643 w = PyCell_Get(x);
1644 Py_INCREF(w);
1645 PUSH(w);
1646 break;
1647
1648 case STORE_DEREF:
1649 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001650 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001651 PyCell_Set(x, w);
1652 continue;
1653
Guido van Rossum374a9221991-04-04 10:40:29 +00001654 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001655 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001656 if (x != NULL) {
1657 for (; --oparg >= 0;) {
1658 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001659 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001660 }
1661 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001662 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001663 }
1664 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001665
Guido van Rossum374a9221991-04-04 10:40:29 +00001666 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001667 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001668 if (x != NULL) {
1669 for (; --oparg >= 0;) {
1670 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001671 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001672 }
1673 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001674 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001675 }
1676 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001677
Guido van Rossum374a9221991-04-04 10:40:29 +00001678 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001679 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001680 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001681 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001682 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001683
Guido van Rossum374a9221991-04-04 10:40:29 +00001684 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001685 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001686 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001687 x = PyObject_GetAttr(v, w);
1688 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001689 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001690 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001691 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001692
Guido van Rossum374a9221991-04-04 10:40:29 +00001693 case COMPARE_OP:
1694 w = POP();
1695 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001696 if (PyInt_Check(v) && PyInt_Check(w)) {
1697 /* INLINE: cmp(int, int) */
1698 register long a, b;
1699 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001700 a = PyInt_AS_LONG(v);
1701 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001702 switch (oparg) {
1703 case LT: res = a < b; break;
1704 case LE: res = a <= b; break;
1705 case EQ: res = a == b; break;
1706 case NE: res = a != b; break;
1707 case GT: res = a > b; break;
1708 case GE: res = a >= b; break;
1709 case IS: res = v == w; break;
1710 case IS_NOT: res = v != w; break;
1711 default: goto slow_compare;
1712 }
1713 x = res ? Py_True : Py_False;
1714 Py_INCREF(x);
1715 }
1716 else {
1717 slow_compare:
1718 x = cmp_outcome(oparg, v, w);
1719 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001720 Py_DECREF(v);
1721 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001722 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001723 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001724 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001725
Guido van Rossum374a9221991-04-04 10:40:29 +00001726 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001727 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001728 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001729 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001730 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001731 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001732 break;
1733 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001734 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001735 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001736 w,
1737 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001738 f->f_locals == NULL ?
1739 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001740 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001741 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001742 if (w == NULL) {
1743 x = NULL;
1744 break;
1745 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001746 x = PyEval_CallObject(x, w);
1747 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001748 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001749 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001750 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001751
Thomas Wouters52152252000-08-17 22:55:00 +00001752 case IMPORT_STAR:
1753 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001754 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001755 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001756 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001757 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001758 break;
1759 }
Thomas Wouters52152252000-08-17 22:55:00 +00001760 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001761 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001762 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001763 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001764 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001765
Thomas Wouters52152252000-08-17 22:55:00 +00001766 case IMPORT_FROM:
1767 w = GETNAMEV(oparg);
1768 v = TOP();
1769 x = import_from(v, w);
1770 PUSH(x);
1771 if (x != NULL) continue;
1772 break;
1773
Guido van Rossum374a9221991-04-04 10:40:29 +00001774 case JUMP_FORWARD:
1775 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001776 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001777
Guido van Rossum374a9221991-04-04 10:40:29 +00001778 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001779 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001780 if (err > 0)
1781 err = 0;
1782 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001783 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001784 else
1785 break;
1786 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001787
Guido van Rossum374a9221991-04-04 10:40:29 +00001788 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001789 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001790 if (err > 0) {
1791 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001792 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001793 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001794 else if (err == 0)
1795 ;
1796 else
1797 break;
1798 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001799
Guido van Rossum374a9221991-04-04 10:40:29 +00001800 case JUMP_ABSOLUTE:
1801 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001802 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001803
Guido van Rossum374a9221991-04-04 10:40:29 +00001804 case FOR_LOOP:
1805 /* for v in s: ...
1806 On entry: stack contains s, i.
1807 On exit: stack contains s, i+1, s[i];
1808 but if loop exhausted:
1809 s, i are popped, and we jump */
1810 w = POP(); /* Loop index */
1811 v = POP(); /* Sequence object */
1812 u = loop_subscript(v, w);
1813 if (u != NULL) {
1814 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001815 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001816 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001817 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001818 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001819 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001820 }
1821 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001822 Py_DECREF(v);
1823 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001824 /* A NULL can mean "s exhausted"
1825 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001826 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001827 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001828 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001829 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001830 continue;
1831 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001832 }
1833 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001834
Guido van Rossum374a9221991-04-04 10:40:29 +00001835 case SETUP_LOOP:
1836 case SETUP_EXCEPT:
1837 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001838 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Guido van Rossum374a9221991-04-04 10:40:29 +00001839 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001840 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001841
Guido van Rossum374a9221991-04-04 10:40:29 +00001842 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001843#ifdef LLTRACE
1844 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001845 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001846#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001847 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001848 if (f->f_trace == NULL)
1849 continue;
1850 /* Trace each line of code reached */
1851 f->f_lasti = INSTR_OFFSET();
1852 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossumb209a111997-04-29 18:18:01 +00001853 f, "line", Py_None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001854 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001855
1856 case CALL_FUNCTION:
Jeremy Hylton52820442001-01-03 23:52:36 +00001857 {
1858 int na = oparg & 0xff;
1859 int nk = (oparg>>8) & 0xff;
1860 int n = na + 2 * nk;
1861 PyObject **pfunc = stack_pointer - n - 1;
1862 PyObject *func = *pfunc;
1863 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1864
1865 /* Always dispatch PyCFunction first, because
1866 these are presumed to be the most frequent
1867 callable object.
1868 */
1869 if (PyCFunction_Check(func)) {
1870 if (PyCFunction_GET_FLAGS(func) == 0) {
1871 x = fast_cfunction(func,
Guido van Rossumac7be682001-01-17 15:42:30 +00001872 &stack_pointer, na);
Jeremy Hylton52820442001-01-03 23:52:36 +00001873 } else {
1874 x = do_call(func, &stack_pointer,
1875 na, nk);
1876 }
1877 } else {
Guido van Rossumac7be682001-01-17 15:42:30 +00001878 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001879 && PyMethod_GET_SELF(func) != NULL) {
1880 /* optimize access to bound methods */
1881 PyObject *self = PyMethod_GET_SELF(func);
1882 Py_INCREF(self);
1883 func = PyMethod_GET_FUNCTION(func);
1884 Py_INCREF(func);
1885 Py_DECREF(*pfunc);
1886 *pfunc = self;
1887 na++;
1888 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00001889 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00001890 Py_INCREF(func);
1891 if (PyFunction_Check(func)) {
1892 x = fast_function(func, &stack_pointer,
Guido van Rossumac7be682001-01-17 15:42:30 +00001893 n, na, nk);
Jeremy Hylton52820442001-01-03 23:52:36 +00001894 } else {
1895 x = do_call(func, &stack_pointer,
1896 na, nk);
1897 }
1898 Py_DECREF(func);
1899 }
1900
1901 while (stack_pointer > pfunc) {
1902 w = POP();
1903 Py_DECREF(w);
1904 }
1905 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00001906 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00001907 continue;
1908 break;
1909 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001910
Jeremy Hylton76901512000-03-28 23:49:17 +00001911 case CALL_FUNCTION_VAR:
1912 case CALL_FUNCTION_KW:
1913 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001914 {
Jeremy Hylton76901512000-03-28 23:49:17 +00001915 int na = oparg & 0xff;
1916 int nk = (oparg>>8) & 0xff;
1917 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00001918 int n = na + 2 * nk;
1919 PyObject **pfunc, *func;
1920 if (flags & CALL_FLAG_VAR)
1921 n++;
1922 if (flags & CALL_FLAG_KW)
1923 n++;
1924 pfunc = stack_pointer - n - 1;
1925 func = *pfunc;
Jeremy Hylton76901512000-03-28 23:49:17 +00001926 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Jeremy Hylton52820442001-01-03 23:52:36 +00001927
Guido van Rossumac7be682001-01-17 15:42:30 +00001928 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001929 && PyMethod_GET_SELF(func) != NULL) {
1930 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00001931 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00001932 func = PyMethod_GET_FUNCTION(func);
1933 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00001934 Py_DECREF(*pfunc);
1935 *pfunc = self;
1936 na++;
1937 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00001938 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00001939 Py_INCREF(func);
1940 x = ext_do_call(func, &stack_pointer, flags, na, nk);
Jeremy Hylton76901512000-03-28 23:49:17 +00001941 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00001942
Jeremy Hylton76901512000-03-28 23:49:17 +00001943 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00001944 w = POP();
1945 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00001946 }
1947 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00001948 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00001949 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00001950 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001951 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001952
Guido van Rossum681d79a1995-07-18 14:51:37 +00001953 case MAKE_FUNCTION:
1954 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00001955 x = PyFunction_New(v, f->f_globals);
1956 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001957 /* XXX Maybe this should be a separate opcode? */
1958 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001959 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001960 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001961 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001962 x = NULL;
1963 break;
1964 }
1965 while (--oparg >= 0) {
1966 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001967 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001968 }
1969 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001970 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001971 }
1972 PUSH(x);
1973 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001974
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001975 case MAKE_CLOSURE:
1976 {
1977 int nfree;
1978 v = POP(); /* code object */
1979 x = PyFunction_New(v, f->f_globals);
1980 nfree = PyTuple_GET_SIZE(((PyCodeObject *)v)->co_freevars);
1981 Py_DECREF(v);
1982 /* XXX Maybe this should be a separate opcode? */
1983 if (x != NULL && nfree > 0) {
1984 v = PyTuple_New(nfree);
1985 if (v == NULL) {
1986 Py_DECREF(x);
1987 x = NULL;
1988 break;
1989 }
1990 while (--nfree >= 0) {
1991 w = POP();
1992 PyTuple_SET_ITEM(v, nfree, w);
1993 }
1994 err = PyFunction_SetClosure(x, v);
1995 Py_DECREF(v);
1996 }
1997 if (x != NULL && oparg > 0) {
1998 v = PyTuple_New(oparg);
1999 if (v == NULL) {
2000 Py_DECREF(x);
2001 x = NULL;
2002 break;
2003 }
2004 while (--oparg >= 0) {
2005 w = POP();
2006 PyTuple_SET_ITEM(v, oparg, w);
2007 }
2008 err = PyFunction_SetDefaults(x, v);
2009 Py_DECREF(v);
2010 }
2011 PUSH(x);
2012 break;
2013 }
2014
Guido van Rossum8861b741996-07-30 16:49:37 +00002015 case BUILD_SLICE:
2016 if (oparg == 3)
2017 w = POP();
2018 else
2019 w = NULL;
2020 v = POP();
2021 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002022 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002023 Py_DECREF(u);
2024 Py_DECREF(v);
2025 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00002026 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002027 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002028 break;
2029
Fred Drakeef8ace32000-08-24 00:32:09 +00002030 case EXTENDED_ARG:
2031 opcode = NEXTOP();
2032 oparg = oparg<<16 | NEXTARG();
2033 goto dispatch_opcode;
2034 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002035
Guido van Rossum374a9221991-04-04 10:40:29 +00002036 default:
2037 fprintf(stderr,
2038 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00002039 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002040 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002041 why = WHY_EXCEPTION;
2042 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002043
2044#ifdef CASE_TOO_BIG
2045 }
2046#endif
2047
Guido van Rossum374a9221991-04-04 10:40:29 +00002048 } /* switch */
2049
2050 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002051
Guido van Rossum374a9221991-04-04 10:40:29 +00002052 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002053
Guido van Rossum374a9221991-04-04 10:40:29 +00002054 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002055 if (err == 0 && x != NULL) {
2056#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002057 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002058 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002059 fprintf(stderr,
2060 "XXX undetected error\n");
2061 else
2062#endif
2063 continue; /* Normal, fast path */
2064 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002065 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002066 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002067 err = 0;
2068 }
2069
Guido van Rossum374a9221991-04-04 10:40:29 +00002070 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002071
Guido van Rossum374a9221991-04-04 10:40:29 +00002072 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002073 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002074 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002075 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002076 why = WHY_EXCEPTION;
2077 }
2078 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002079#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002080 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002081 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002082 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002083 fprintf(stderr,
2084 "XXX undetected error (why=%d)\n",
2085 why);
2086 why = WHY_EXCEPTION;
2087 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002088 }
2089#endif
2090
2091 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002092
Guido van Rossum374a9221991-04-04 10:40:29 +00002093 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002094 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00002095 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00002096 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00002097 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002098
Guido van Rossume59214e1994-08-30 08:01:59 +00002099 if (f->f_trace)
2100 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002101 if (tstate->sys_profilefunc)
2102 call_exc_trace(&tstate->sys_profilefunc,
2103 (PyObject**)0, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002104 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002105
Guido van Rossum374a9221991-04-04 10:40:29 +00002106 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002107
Guido van Rossum374a9221991-04-04 10:40:29 +00002108 if (why == WHY_RERAISE)
2109 why = WHY_EXCEPTION;
2110
2111 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002112
Guido van Rossum374a9221991-04-04 10:40:29 +00002113 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002114 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00002115 while (STACK_LEVEL() > b->b_level) {
2116 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002117 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002118 }
2119 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2120 why = WHY_NOT;
2121 JUMPTO(b->b_handler);
2122 break;
2123 }
2124 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002125 (b->b_type == SETUP_EXCEPT &&
2126 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002127 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002128 PyObject *exc, *val, *tb;
2129 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002130 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002131 val = Py_None;
2132 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002133 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002134 /* Make the raw exception data
2135 available to the handler,
2136 so a program can emulate the
2137 Python main loop. Don't do
2138 this for 'finally'. */
2139 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002140 PyErr_NormalizeException(
2141 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002142 set_exc_info(tstate,
2143 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002144 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002145 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002146 PUSH(val);
2147 PUSH(exc);
2148 }
2149 else {
2150 if (why == WHY_RETURN)
2151 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002152 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002153 PUSH(v);
2154 }
2155 why = WHY_NOT;
2156 JUMPTO(b->b_handler);
2157 break;
2158 }
2159 } /* unwind stack */
2160
2161 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002162
Guido van Rossum374a9221991-04-04 10:40:29 +00002163 if (why != WHY_NOT)
2164 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002165
Guido van Rossum374a9221991-04-04 10:40:29 +00002166 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002167
Guido van Rossum374a9221991-04-04 10:40:29 +00002168 /* Pop remaining stack entries */
Guido van Rossumac7be682001-01-17 15:42:30 +00002169
Guido van Rossum374a9221991-04-04 10:40:29 +00002170 while (!EMPTY()) {
2171 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002172 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002173 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002174
Guido van Rossum96a42c81992-01-12 02:29:51 +00002175 if (why != WHY_RETURN)
2176 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002177
Guido van Rossume59214e1994-08-30 08:01:59 +00002178 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002179 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00002180 if (call_trace(&f->f_trace, &f->f_trace, f,
2181 "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002182 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002183 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002184 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002185 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002186 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002187 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002188
Guido van Rossuma027efa1997-05-05 20:56:21 +00002189 if (tstate->sys_profilefunc && why == WHY_RETURN) {
2190 if (call_trace(&tstate->sys_profilefunc, (PyObject**)0,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002191 f, "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002192 Py_XDECREF(retval);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002193 retval = NULL;
2194 why = WHY_EXCEPTION;
2195 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002196 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002197
Guido van Rossuma027efa1997-05-05 20:56:21 +00002198 reset_exc_info(tstate);
2199
2200 --tstate->recursion_depth;
Guido van Rossum8c5df061997-01-24 04:19:24 +00002201
2202 fail: /* Jump here from prelude on failure */
Guido van Rossumac7be682001-01-17 15:42:30 +00002203
Guido van Rossum374a9221991-04-04 10:40:29 +00002204 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00002205
Guido van Rossuma027efa1997-05-05 20:56:21 +00002206 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +00002207 Py_DECREF(f);
Guido van Rossumac7be682001-01-17 15:42:30 +00002208
Guido van Rossum96a42c81992-01-12 02:29:51 +00002209 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002210}
2211
Guido van Rossuma027efa1997-05-05 20:56:21 +00002212static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002213set_exc_info(PyThreadState *tstate,
2214 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002215{
2216 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002217 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002218
Guido van Rossuma027efa1997-05-05 20:56:21 +00002219 frame = tstate->frame;
2220 if (frame->f_exc_type == NULL) {
2221 /* This frame didn't catch an exception before */
2222 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002223 if (tstate->exc_type == NULL) {
2224 Py_INCREF(Py_None);
2225 tstate->exc_type = Py_None;
2226 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002227 tmp_type = frame->f_exc_type;
2228 tmp_value = frame->f_exc_value;
2229 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002230 Py_XINCREF(tstate->exc_type);
2231 Py_XINCREF(tstate->exc_value);
2232 Py_XINCREF(tstate->exc_traceback);
2233 frame->f_exc_type = tstate->exc_type;
2234 frame->f_exc_value = tstate->exc_value;
2235 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002236 Py_XDECREF(tmp_type);
2237 Py_XDECREF(tmp_value);
2238 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002239 }
2240 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002241 tmp_type = tstate->exc_type;
2242 tmp_value = tstate->exc_value;
2243 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002244 Py_XINCREF(type);
2245 Py_XINCREF(value);
2246 Py_XINCREF(tb);
2247 tstate->exc_type = type;
2248 tstate->exc_value = value;
2249 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002250 Py_XDECREF(tmp_type);
2251 Py_XDECREF(tmp_value);
2252 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002253 /* For b/w compatibility */
2254 PySys_SetObject("exc_type", type);
2255 PySys_SetObject("exc_value", value);
2256 PySys_SetObject("exc_traceback", tb);
2257}
2258
2259static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002260reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002261{
2262 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002263 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002264 frame = tstate->frame;
2265 if (frame->f_exc_type != NULL) {
2266 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002267 tmp_type = tstate->exc_type;
2268 tmp_value = tstate->exc_value;
2269 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002270 Py_XINCREF(frame->f_exc_type);
2271 Py_XINCREF(frame->f_exc_value);
2272 Py_XINCREF(frame->f_exc_traceback);
2273 tstate->exc_type = frame->f_exc_type;
2274 tstate->exc_value = frame->f_exc_value;
2275 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002276 Py_XDECREF(tmp_type);
2277 Py_XDECREF(tmp_value);
2278 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002279 /* For b/w compatibility */
2280 PySys_SetObject("exc_type", frame->f_exc_type);
2281 PySys_SetObject("exc_value", frame->f_exc_value);
2282 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2283 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002284 tmp_type = frame->f_exc_type;
2285 tmp_value = frame->f_exc_value;
2286 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002287 frame->f_exc_type = NULL;
2288 frame->f_exc_value = NULL;
2289 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002290 Py_XDECREF(tmp_type);
2291 Py_XDECREF(tmp_value);
2292 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002293}
2294
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002295/* Logic for the raise statement (too complicated for inlining).
2296 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002297static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002298do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002299{
Guido van Rossumd295f121998-04-09 21:39:57 +00002300 if (type == NULL) {
2301 /* Reraise */
2302 PyThreadState *tstate = PyThreadState_Get();
2303 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2304 value = tstate->exc_value;
2305 tb = tstate->exc_traceback;
2306 Py_XINCREF(type);
2307 Py_XINCREF(value);
2308 Py_XINCREF(tb);
2309 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002310
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002311 /* We support the following forms of raise:
2312 raise <class>, <classinstance>
2313 raise <class>, <argument tuple>
2314 raise <class>, None
2315 raise <class>, <argument>
2316 raise <classinstance>, None
2317 raise <string>, <object>
2318 raise <string>, None
2319
2320 An omitted second argument is the same as None.
2321
2322 In addition, raise <tuple>, <anything> is the same as
2323 raising the tuple's first item (and it better have one!);
2324 this rule is applied recursively.
2325
2326 Finally, an optional third argument can be supplied, which
2327 gives the traceback to be substituted (useful when
2328 re-raising an exception after examining it). */
2329
2330 /* First, check the traceback argument, replacing None with
2331 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002332 if (tb == Py_None) {
2333 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002334 tb = NULL;
2335 }
2336 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002337 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002338 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002339 goto raise_error;
2340 }
2341
2342 /* Next, replace a missing value with None */
2343 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002344 value = Py_None;
2345 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002346 }
2347
2348 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002349 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2350 PyObject *tmp = type;
2351 type = PyTuple_GET_ITEM(type, 0);
2352 Py_INCREF(type);
2353 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002354 }
2355
Barry Warsaw4249f541997-08-22 21:26:19 +00002356 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002357 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002358
2359 else if (PyClass_Check(type))
2360 PyErr_NormalizeException(&type, &value, &tb);
2361
Guido van Rossumb209a111997-04-29 18:18:01 +00002362 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002363 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002364 if (value != Py_None) {
2365 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002366 "instance exception may not have a separate value");
2367 goto raise_error;
2368 }
2369 else {
2370 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002371 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002372 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002373 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2374 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002375 }
2376 }
2377 else {
2378 /* Not something you can raise. You get an exception
2379 anyway, just not what you specified :-) */
Guido van Rossumb209a111997-04-29 18:18:01 +00002380 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002381 "exceptions must be strings, classes, or instances");
2382 goto raise_error;
2383 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002384 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002385 if (tb == NULL)
2386 return WHY_EXCEPTION;
2387 else
2388 return WHY_RERAISE;
2389 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002390 Py_XDECREF(value);
2391 Py_XDECREF(type);
2392 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002393 return WHY_EXCEPTION;
2394}
2395
Barry Warsawe42b18f1997-08-25 22:13:04 +00002396static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002397unpack_sequence(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002398{
2399 int i;
2400 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00002401
Barry Warsawe42b18f1997-08-25 22:13:04 +00002402 for (i = 0; i < argcnt; i++) {
2403 if (! (w = PySequence_GetItem(v, i))) {
2404 if (PyErr_ExceptionMatches(PyExc_IndexError))
2405 PyErr_SetString(PyExc_ValueError,
2406 "unpack sequence of wrong size");
2407 goto finally;
2408 }
2409 *--sp = w;
2410 }
2411 /* we better get an IndexError now */
2412 if (PySequence_GetItem(v, i) == NULL) {
2413 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2414 PyErr_Clear();
2415 return 1;
2416 }
2417 /* some other exception occurred. fall through to finally */
2418 }
2419 else
2420 PyErr_SetString(PyExc_ValueError,
2421 "unpack sequence of wrong size");
2422 /* fall through */
2423finally:
Barry Warsaw91010551997-08-25 22:30:51 +00002424 for (; i > 0; i--, sp++)
2425 Py_DECREF(*sp);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002426
2427 return 0;
2428}
2429
2430
Guido van Rossum96a42c81992-01-12 02:29:51 +00002431#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002432static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002433prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002434{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002435 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002436 if (PyObject_Print(v, stdout, 0) != 0)
2437 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002438 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002439 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002440}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002441#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002442
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002443static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002444call_exc_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002445{
Guido van Rossumb209a111997-04-29 18:18:01 +00002446 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002447 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002448 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002449 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002450 value = Py_None;
2451 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002452 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002453 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002454 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002455 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002456 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002457 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002458 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002459 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002460 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002461 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002462 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002463 Py_XDECREF(type);
2464 Py_XDECREF(value);
2465 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002466 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002467}
2468
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002469/* PyObject **p_trace: in/out; may not be NULL;
2470 may not point to NULL variable initially
2471 PyObject **p_newtrace: in/out; may be NULL;
2472 may point to NULL variable;
2473 may be same variable as p_newtrace */
2474
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002475static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002476call_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f,
2477 char *msg, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002478{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002479 PyThreadState *tstate = f->f_tstate;
Guido van Rossumb209a111997-04-29 18:18:01 +00002480 PyObject *args, *what;
2481 PyObject *res = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002482
Guido van Rossuma027efa1997-05-05 20:56:21 +00002483 if (tstate->tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002484 /* Don't do recursive traces */
2485 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002486 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002487 *p_newtrace = NULL;
2488 }
2489 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002490 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002491
Guido van Rossumb209a111997-04-29 18:18:01 +00002492 args = PyTuple_New(3);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002493 if (args == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002494 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002495 what = PyString_FromString(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002496 if (what == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002497 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002498 Py_INCREF(f);
2499 PyTuple_SET_ITEM(args, 0, (PyObject *)f);
2500 PyTuple_SET_ITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002501 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002502 arg = Py_None;
2503 Py_INCREF(arg);
2504 PyTuple_SET_ITEM(args, 2, arg);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002505 tstate->tracing++;
Guido van Rossumb209a111997-04-29 18:18:01 +00002506 PyFrame_FastToLocals(f);
2507 res = PyEval_CallObject(*p_trace, args); /* May clear *p_trace! */
2508 PyFrame_LocalsToFast(f, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002509 tstate->tracing--;
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002510 cleanup:
Guido van Rossumb209a111997-04-29 18:18:01 +00002511 Py_XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002512 if (res == NULL) {
2513 /* The trace proc raised an exception */
Guido van Rossumb209a111997-04-29 18:18:01 +00002514 PyTraceBack_Here(f);
2515 Py_XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002516 *p_trace = NULL;
2517 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002518 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002519 *p_newtrace = NULL;
2520 }
Barry Warsawf6202631999-09-08 16:26:33 +00002521 /* to be extra double plus sure we don't get recursive
2522 * calls inf either tracefunc or profilefunc gets an
2523 * exception, zap the global variables.
2524 */
2525 Py_XDECREF(tstate->sys_tracefunc);
2526 tstate->sys_tracefunc = NULL;
2527 Py_XDECREF(tstate->sys_profilefunc);
2528 tstate->sys_profilefunc = NULL;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002529 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002530 }
2531 else {
2532 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002533 Py_XDECREF(*p_newtrace);
2534 if (res == Py_None)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002535 *p_newtrace = NULL;
2536 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002537 Py_INCREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002538 *p_newtrace = res;
2539 }
2540 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002541 Py_DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002542 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002543 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002544}
2545
Guido van Rossumb209a111997-04-29 18:18:01 +00002546PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002547PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002548{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002549 PyThreadState *tstate = PyThreadState_Get();
2550 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002551 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002552 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002553 else
2554 return current_frame->f_builtins;
2555}
2556
Guido van Rossumb209a111997-04-29 18:18:01 +00002557PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002558PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002559{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002560 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002561 if (current_frame == NULL)
2562 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002563 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002564 return current_frame->f_locals;
2565}
2566
Guido van Rossumb209a111997-04-29 18:18:01 +00002567PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002568PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002569{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002570 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002571 if (current_frame == NULL)
2572 return NULL;
2573 else
2574 return current_frame->f_globals;
2575}
2576
Guido van Rossumb209a111997-04-29 18:18:01 +00002577PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002578PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002579{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002580 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002581 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002582}
2583
Guido van Rossum6135a871995-01-09 17:53:26 +00002584int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002585PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002586{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002587 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002588 return current_frame == NULL ? 0 : current_frame->f_restricted;
2589}
2590
Guido van Rossumbe270261997-05-22 22:26:18 +00002591int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002592Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002593{
Guido van Rossumb209a111997-04-29 18:18:01 +00002594 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002595 if (f == NULL)
2596 return 0;
2597 if (!PyFile_SoftSpace(f, 0))
2598 return 0;
2599 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002600}
2601
Guido van Rossum3f5da241990-12-20 15:06:42 +00002602
Guido van Rossum681d79a1995-07-18 14:51:37 +00002603/* External interface to call any callable object.
2604 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002605
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002606#undef PyEval_CallObject
2607/* for backward compatibility: export this interface */
2608
Guido van Rossumb209a111997-04-29 18:18:01 +00002609PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002610PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002611{
Guido van Rossumb209a111997-04-29 18:18:01 +00002612 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002613}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002614#define PyEval_CallObject(func,arg) \
2615 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002616
Guido van Rossumb209a111997-04-29 18:18:01 +00002617PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002618PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002619{
Jeremy Hylton52820442001-01-03 23:52:36 +00002620 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002621
2622 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002623 arg = PyTuple_New(0);
2624 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002625 PyErr_SetString(PyExc_TypeError,
2626 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002627 return NULL;
2628 }
2629 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002630 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002631
Guido van Rossumb209a111997-04-29 18:18:01 +00002632 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002633 PyErr_SetString(PyExc_TypeError,
2634 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00002635 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002636 return NULL;
2637 }
2638
Jeremy Hylton52820442001-01-03 23:52:36 +00002639 result = call_object(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002640 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00002641 return result;
2642}
2643
2644/* How often is each kind of object called? The answer depends on the
2645 program. An instrumented call_object() was used to run the Python
2646 regression test suite. The results were:
2647 4200000 PyCFunctions
2648 390000 fast_function() calls
2649 94000 other functions
2650 480000 all functions (sum of prev two)
2651 150000 methods
2652 100000 classes
2653
2654 Tests on other bodies of code show that PyCFunctions are still
2655 most common, but not by such a large margin.
2656*/
2657
2658static PyObject *
2659call_object(PyObject *func, PyObject *arg, PyObject *kw)
2660{
2661 ternaryfunc call;
2662 PyObject *result;
2663
2664 if (PyMethod_Check(func))
2665 result = call_method(func, arg, kw);
2666 else if (PyFunction_Check(func))
2667 result = call_eval_code2(func, arg, kw);
2668 else if (PyCFunction_Check(func))
2669 result = call_cfunction(func, arg, kw);
2670 else if (PyClass_Check(func))
2671 result = PyInstance_New(func, arg, kw);
2672 else if (PyInstance_Check(func))
2673 result = call_instance(func, arg, kw);
2674 else if ((call = func->ob_type->tp_call) != NULL)
2675 result = (*call)(func, arg, kw);
2676 else {
2677 PyErr_Format(PyExc_TypeError, "object is not callable: %s",
2678 PyString_AS_STRING(PyObject_Repr(func)));
2679 return NULL;
2680 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002681 if (result == NULL && !PyErr_Occurred())
2682 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002683 "NULL result without error in call_object");
Guido van Rossumac7be682001-01-17 15:42:30 +00002684
Guido van Rossume59214e1994-08-30 08:01:59 +00002685 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002686}
2687
Guido van Rossumb209a111997-04-29 18:18:01 +00002688static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00002689call_cfunction(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002690{
Jeremy Hylton52820442001-01-03 23:52:36 +00002691 PyCFunctionObject* f = (PyCFunctionObject*)func;
2692 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
2693 PyObject *self = PyCFunction_GET_SELF(func);
2694 int flags = PyCFunction_GET_FLAGS(func);
2695
Jeremy Hylton52820442001-01-03 23:52:36 +00002696 if (flags & METH_KEYWORDS) {
Fred Drake1a7aab72001-01-04 22:33:02 +00002697 if (kw == NULL) {
2698 static PyObject *dict = NULL;
2699 if (dict == NULL) {
2700 dict = PyDict_New();
2701 if (dict == NULL)
2702 return NULL;
2703 }
2704 kw = dict;
2705 Py_INCREF(dict);
2706 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002707 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002708 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002709 if (kw != NULL && PyDict_Size(kw) != 0) {
2710 PyErr_Format(PyExc_TypeError,
2711 "%.200s() takes no keyword arguments",
2712 f->m_ml->ml_name);
2713 return NULL;
2714 }
Fred Drake1a7aab72001-01-04 22:33:02 +00002715 if (flags & METH_VARARGS) {
2716 return (*meth)(self, arg);
2717 }
2718 if (!(flags & METH_VARARGS)) {
2719 /* the really old style */
2720 int size = PyTuple_GET_SIZE(arg);
2721 if (size == 1)
2722 arg = PyTuple_GET_ITEM(arg, 0);
2723 else if (size == 0)
2724 arg = NULL;
2725 return (*meth)(self, arg);
2726 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002727 /* should never get here ??? */
2728 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002729 return NULL;
2730}
2731
Guido van Rossumb209a111997-04-29 18:18:01 +00002732static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00002733call_instance(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002734{
Jeremy Hylton52820442001-01-03 23:52:36 +00002735 PyObject *res, *call = PyObject_GetAttrString(func, "__call__");
2736 if (call == NULL) {
2737 PyInstanceObject *inst = (PyInstanceObject*) func;
2738 PyErr_Clear();
2739 PyErr_Format(PyExc_AttributeError,
2740 "%.200s instance has no __call__ method",
2741 PyString_AsString(inst->in_class->cl_name));
Guido van Rossum681d79a1995-07-18 14:51:37 +00002742 return NULL;
2743 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002744 res = call_object(call, arg, kw);
2745 Py_DECREF(call);
2746 return res;
2747}
2748
2749static PyObject *
2750call_method(PyObject *func, PyObject *arg, PyObject *kw)
2751{
2752 PyObject *self = PyMethod_GET_SELF(func);
2753 PyObject *class = PyMethod_GET_CLASS(func);
2754 PyObject *result;
2755
2756 func = PyMethod_GET_FUNCTION(func);
2757 if (self == NULL) {
2758 /* Unbound methods must be called with an instance of
2759 the class (or a derived class) as first argument */
2760 if (PyTuple_Size(arg) >= 1)
2761 self = PyTuple_GET_ITEM(arg, 0);
2762 if (!(self != NULL && PyInstance_Check(self)
2763 && PyClass_IsSubclass((PyObject *)
2764 (((PyInstanceObject *)self)->in_class),
2765 class))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00002766 PyObject* fn = ((PyFunctionObject*) func)->func_name;
2767 PyErr_Format(PyExc_TypeError,
2768 "unbound method %s%smust be "
2769 "called with instance as first argument",
2770 fn ? PyString_AsString(fn) : "",
2771 fn ? "() " : "");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002772 return NULL;
2773 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002774 Py_INCREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00002775 } else {
2776 int argcount = PyTuple_Size(arg);
2777 PyObject *newarg = PyTuple_New(argcount + 1);
2778 int i;
2779 if (newarg == NULL)
2780 return NULL;
2781 Py_INCREF(self);
2782 PyTuple_SET_ITEM(newarg, 0, self);
2783 for (i = 0; i < argcount; i++) {
2784 PyObject *v = PyTuple_GET_ITEM(arg, i);
2785 Py_XINCREF(v);
2786 PyTuple_SET_ITEM(newarg, i+1, v);
2787 }
2788 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002789 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002790 result = call_object(func, arg, kw);
2791 Py_DECREF(arg);
2792 return result;
2793}
2794
2795static PyObject *
2796call_eval_code2(PyObject *func, PyObject *arg, PyObject *kw)
2797{
2798 PyObject *result;
2799 PyObject *argdefs;
2800 PyObject **d, **k;
2801 int nk, nd;
2802
2803 argdefs = PyFunction_GET_DEFAULTS(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00002804 if (argdefs != NULL && PyTuple_Check(argdefs)) {
2805 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
2806 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002807 }
2808 else {
2809 d = NULL;
2810 nd = 0;
2811 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002812
Guido van Rossum681d79a1995-07-18 14:51:37 +00002813 if (kw != NULL) {
2814 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002815 nk = PyDict_Size(kw);
2816 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002817 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002818 PyErr_NoMemory();
2819 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002820 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002821 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002822 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002823 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002824 i += 2;
2825 nk = i/2;
2826 /* XXX This is broken if the caller deletes dict items! */
2827 }
2828 else {
2829 k = NULL;
2830 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002831 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002832
Guido van Rossum681d79a1995-07-18 14:51:37 +00002833 result = eval_code2(
Jeremy Hylton52820442001-01-03 23:52:36 +00002834 (PyCodeObject *)PyFunction_GET_CODE(func),
2835 PyFunction_GET_GLOBALS(func), (PyObject *)NULL,
Guido van Rossumb209a111997-04-29 18:18:01 +00002836 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002837 k, nk, d, nd,
2838 PyFunction_GET_CLOSURE(func));
Guido van Rossumac7be682001-01-17 15:42:30 +00002839
Guido van Rossumb18618d2000-05-03 23:44:39 +00002840 if (k != NULL)
2841 PyMem_DEL(k);
Guido van Rossumac7be682001-01-17 15:42:30 +00002842
Guido van Rossum681d79a1995-07-18 14:51:37 +00002843 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002844}
2845
Jeremy Hylton52820442001-01-03 23:52:36 +00002846#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
2847
2848/* The two fast_xxx() functions optimize calls for which no argument
2849 tuple is necessary; the objects are passed directly from the stack.
2850 fast_cfunction() is called for METH_OLDARGS functions.
2851 fast_function() is for functions with no special argument handling.
2852*/
2853
2854static PyObject *
2855fast_cfunction(PyObject *func, PyObject ***pp_stack, int na)
2856{
2857 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
2858 PyObject *self = PyCFunction_GET_SELF(func);
2859
2860 if (na == 0)
2861 return (*meth)(self, NULL);
Charles G. Waldmaneec72a72001-01-10 22:11:59 +00002862 else if (na == 1) {
2863 PyObject *arg = EXT_POP(*pp_stack);
Guido van Rossumac7be682001-01-17 15:42:30 +00002864 PyObject *result = (*meth)(self, arg);
Charles G. Waldmaneec72a72001-01-10 22:11:59 +00002865 Py_DECREF(arg);
2866 return result;
2867 } else {
Jeremy Hylton52820442001-01-03 23:52:36 +00002868 PyObject *args = load_args(pp_stack, na);
2869 PyObject *result = (*meth)(self, args);
2870 Py_DECREF(args);
2871 return result;
2872 }
2873}
2874
2875static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00002876fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00002877{
2878 PyObject *co = PyFunction_GET_CODE(func);
2879 PyObject *globals = PyFunction_GET_GLOBALS(func);
2880 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002881 PyObject *closure = PyFunction_GET_CLOSURE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002882 PyObject **d = NULL;
2883 int nd = 0;
2884
2885 if (argdefs != NULL) {
2886 d = &PyTuple_GET_ITEM(argdefs, 0);
2887 nd = ((PyTupleObject *)argdefs)->ob_size;
2888 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002889 return eval_code2((PyCodeObject *)co, globals,
Jeremy Hylton52820442001-01-03 23:52:36 +00002890 (PyObject *)NULL, (*pp_stack)-n, na,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002891 (*pp_stack)-2*nk, nk, d, nd,
2892 closure);
Jeremy Hylton52820442001-01-03 23:52:36 +00002893}
2894
2895static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00002896update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
2897 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00002898{
2899 PyObject *kwdict = NULL;
2900 if (orig_kwdict == NULL)
2901 kwdict = PyDict_New();
2902 else {
2903 kwdict = PyDict_Copy(orig_kwdict);
2904 Py_DECREF(orig_kwdict);
2905 }
2906 if (kwdict == NULL)
2907 return NULL;
2908 while (--nk >= 0) {
2909 int err;
2910 PyObject *value = EXT_POP(*pp_stack);
2911 PyObject *key = EXT_POP(*pp_stack);
2912 if (PyDict_GetItem(kwdict, key) != NULL) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00002913 PyObject* fn = ((PyFunctionObject*) func)->func_name;
Guido van Rossumac7be682001-01-17 15:42:30 +00002914 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00002915 "%.200s%s got multiple values "
2916 "for keyword argument '%.400s'",
2917 fn ? PyString_AsString(fn) : "function",
2918 fn ? "()" : "", PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00002919 Py_DECREF(key);
2920 Py_DECREF(value);
2921 Py_DECREF(kwdict);
2922 return NULL;
2923 }
2924 err = PyDict_SetItem(kwdict, key, value);
2925 Py_DECREF(key);
2926 Py_DECREF(value);
2927 if (err) {
2928 Py_DECREF(kwdict);
2929 return NULL;
2930 }
2931 }
2932 return kwdict;
2933}
2934
2935static PyObject *
2936update_star_args(int nstack, int nstar, PyObject *stararg,
2937 PyObject ***pp_stack)
2938{
2939 PyObject *callargs, *w;
2940
2941 callargs = PyTuple_New(nstack + nstar);
2942 if (callargs == NULL) {
2943 return NULL;
2944 }
2945 if (nstar) {
2946 int i;
2947 for (i = 0; i < nstar; i++) {
2948 PyObject *a = PyTuple_GET_ITEM(stararg, i);
2949 Py_INCREF(a);
2950 PyTuple_SET_ITEM(callargs, nstack + i, a);
2951 }
2952 }
2953 while (--nstack >= 0) {
2954 w = EXT_POP(*pp_stack);
2955 PyTuple_SET_ITEM(callargs, nstack, w);
2956 }
2957 return callargs;
2958}
2959
2960static PyObject *
2961load_args(PyObject ***pp_stack, int na)
2962{
2963 PyObject *args = PyTuple_New(na);
2964 PyObject *w;
2965
2966 if (args == NULL)
2967 return NULL;
2968 while (--na >= 0) {
2969 w = EXT_POP(*pp_stack);
2970 PyTuple_SET_ITEM(args, na, w);
2971 }
2972 return args;
2973}
2974
2975static PyObject *
2976do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
2977{
2978 PyObject *callargs = NULL;
2979 PyObject *kwdict = NULL;
2980 PyObject *result = NULL;
2981
2982 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00002983 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002984 if (kwdict == NULL)
2985 goto call_fail;
2986 }
2987 callargs = load_args(pp_stack, na);
2988 if (callargs == NULL)
2989 goto call_fail;
2990 result = call_object(func, callargs, kwdict);
2991 call_fail:
2992 Py_XDECREF(callargs);
2993 Py_XDECREF(kwdict);
2994 return result;
2995}
2996
2997static PyObject *
2998ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
2999{
3000 int nstar = 0;
3001 PyObject *callargs = NULL;
3002 PyObject *stararg = NULL;
3003 PyObject *kwdict = NULL;
3004 PyObject *result = NULL;
3005
3006 if (flags & CALL_FLAG_KW) {
3007 kwdict = EXT_POP(*pp_stack);
3008 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003009 PyObject* fn = ((PyFunctionObject*) func)->func_name;
3010 PyErr_Format(PyExc_TypeError,
3011 "%s%s argument after ** must be a dictionary",
3012 fn ? PyString_AsString(fn) : "function",
3013 fn ? "()" : "");
Jeremy Hylton52820442001-01-03 23:52:36 +00003014 goto ext_call_fail;
3015 }
3016 }
3017 if (flags & CALL_FLAG_VAR) {
3018 stararg = EXT_POP(*pp_stack);
3019 if (!PyTuple_Check(stararg)) {
3020 PyObject *t = NULL;
3021 t = PySequence_Tuple(stararg);
3022 if (t == NULL) {
3023 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003024 PyObject* fn =
3025 ((PyFunctionObject*) func)->func_name;
3026 PyErr_Format(PyExc_TypeError,
3027 "%s%s argument after * must be a sequence",
3028 fn ? PyString_AsString(fn) : "function",
3029 fn ? "()" : "");
Jeremy Hylton52820442001-01-03 23:52:36 +00003030 }
3031 goto ext_call_fail;
3032 }
3033 Py_DECREF(stararg);
3034 stararg = t;
3035 }
3036 nstar = PyTuple_GET_SIZE(stararg);
3037 }
3038 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003039 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003040 if (kwdict == NULL)
3041 goto ext_call_fail;
3042 }
3043 callargs = update_star_args(na, nstar, stararg, pp_stack);
3044 if (callargs == NULL)
3045 goto ext_call_fail;
3046 result = call_object(func, callargs, kwdict);
3047 ext_call_fail:
3048 Py_XDECREF(callargs);
3049 Py_XDECREF(kwdict);
3050 Py_XDECREF(stararg);
3051 return result;
3052}
3053
Guido van Rossum3b9c6671996-07-30 18:40:29 +00003054#define SLICE_ERROR_MSG \
3055 "standard sequence type does not support step size other than one"
3056
Guido van Rossumb209a111997-04-29 18:18:01 +00003057static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003058loop_subscript(PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003059{
Guido van Rossumb209a111997-04-29 18:18:01 +00003060 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00003061 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003062 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003063 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003064 return NULL;
3065 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003066 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00003067 v = (*sq->sq_item)(v, i);
3068 if (v)
3069 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00003070 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00003071 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00003072 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003073}
3074
Guido van Rossum20c6add2000-05-08 14:06:50 +00003075/* Extract a slice index from a PyInt or PyLong, the index is bound to
3076 the range [-INT_MAX+1, INTMAX]. Returns 0 and an exception if there is
3077 and error. Returns 1 on success.*/
3078
3079int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003080_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003081{
3082 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003083 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003084 if (PyInt_Check(v)) {
3085 x = PyInt_AsLong(v);
3086 } else if (PyLong_Check(v)) {
3087 x = PyLong_AsLong(v);
3088 if (x==-1 && PyErr_Occurred()) {
3089 PyObject *long_zero;
Guido van Rossumac7be682001-01-17 15:42:30 +00003090 int cmp;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003091
Guido van Rossumac7be682001-01-17 15:42:30 +00003092 if (!PyErr_ExceptionMatches(
3093 PyExc_OverflowError)) {
3094 /* It's not an overflow error, so just
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003095 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00003096 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003097 }
3098
Guido van Rossumac7be682001-01-17 15:42:30 +00003099 /* Clear the OverflowError */
3100 PyErr_Clear();
3101
3102 /* It's an overflow error, so we need to
3103 check the sign of the long integer,
3104 set the value to INT_MAX or 0, and clear
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003105 the error. */
3106
3107 /* Create a long integer with a value of 0 */
Guido van Rossumac7be682001-01-17 15:42:30 +00003108 long_zero = PyLong_FromLong(0L);
Guido van Rossum20c6add2000-05-08 14:06:50 +00003109 if (long_zero == NULL) return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003110
3111 /* Check sign */
Guido van Rossumac7be682001-01-17 15:42:30 +00003112 cmp = PyObject_RichCompareBool(v, long_zero,
3113 Py_GT);
3114 Py_DECREF(long_zero);
3115 if (cmp < 0)
3116 return 0;
3117 else if (cmp > 0)
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003118 x = INT_MAX;
3119 else
3120 x = 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003121 }
3122 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003123 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003124 "slice indices must be integers");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003125 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003126 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003127 /* Truncate -- very long indices are truncated anyway */
3128 if (x > INT_MAX)
3129 x = INT_MAX;
3130 else if (x < -INT_MAX)
3131 x = 0;
3132 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003133 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003134 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003135}
3136
Guido van Rossumb209a111997-04-29 18:18:01 +00003137static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003138apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003139{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003140 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003141 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003142 return NULL;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003143 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum04691fc1992-08-12 15:35:34 +00003144 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003145 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003146}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003147
3148static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003149assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3150 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003151{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003152 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003153 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum3f5da241990-12-20 15:06:42 +00003154 return -1;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003155 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum3f5da241990-12-20 15:06:42 +00003156 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003157 if (x == NULL)
3158 return PySequence_DelSlice(u, ilow, ihigh);
3159 else
3160 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003161}
3162
Guido van Rossumb209a111997-04-29 18:18:01 +00003163static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003164cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003165{
Guido van Rossumac7be682001-01-17 15:42:30 +00003166 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003167 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00003168 case IS:
3169 case IS_NOT:
3170 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00003171 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003172 res = !res;
3173 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003174 case IN:
3175 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003176 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003177 if (res < 0)
3178 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00003179 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003180 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003181 break;
3182 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00003183 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003184 break;
3185 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003186 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003187 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003188 v = res ? Py_True : Py_False;
3189 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003190 return v;
3191}
3192
Thomas Wouters52152252000-08-17 22:55:00 +00003193static PyObject *
3194import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003195{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003196 PyObject *x;
3197
3198 x = PyObject_GetAttr(v, name);
3199 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00003200 PyErr_Format(PyExc_ImportError,
3201 "cannot import name %.230s",
3202 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003203 }
Thomas Wouters52152252000-08-17 22:55:00 +00003204 return x;
3205}
Guido van Rossumac7be682001-01-17 15:42:30 +00003206
Thomas Wouters52152252000-08-17 22:55:00 +00003207static int
3208import_all_from(PyObject *locals, PyObject *v)
3209{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003210 PyObject *all = PyObject_GetAttrString(v, "__all__");
3211 PyObject *dict, *name, *value;
3212 int skip_leading_underscores = 0;
3213 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003214
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003215 if (all == NULL) {
3216 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3217 return -1; /* Unexpected error */
3218 PyErr_Clear();
3219 dict = PyObject_GetAttrString(v, "__dict__");
3220 if (dict == NULL) {
3221 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3222 return -1;
3223 PyErr_SetString(PyExc_ImportError,
3224 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003225 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003226 }
3227 all = PyMapping_Keys(dict);
3228 Py_DECREF(dict);
3229 if (all == NULL)
3230 return -1;
3231 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003232 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003233
3234 for (pos = 0, err = 0; ; pos++) {
3235 name = PySequence_GetItem(all, pos);
3236 if (name == NULL) {
3237 if (!PyErr_ExceptionMatches(PyExc_IndexError))
3238 err = -1;
3239 else
3240 PyErr_Clear();
3241 break;
3242 }
3243 if (skip_leading_underscores &&
3244 PyString_Check(name) &&
3245 PyString_AS_STRING(name)[0] == '_')
3246 {
3247 Py_DECREF(name);
3248 continue;
3249 }
3250 value = PyObject_GetAttr(v, name);
3251 if (value == NULL)
3252 err = -1;
3253 else
3254 err = PyDict_SetItem(locals, name, value);
3255 Py_DECREF(name);
3256 Py_XDECREF(value);
3257 if (err != 0)
3258 break;
3259 }
3260 Py_DECREF(all);
3261 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003262}
3263
Guido van Rossumb209a111997-04-29 18:18:01 +00003264static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003265build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003266{
Guido van Rossumcd649651997-08-22 16:56:16 +00003267 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003268 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003269 PyErr_SetString(PyExc_SystemError,
3270 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00003271 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003272 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003273 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003274 PyErr_SetString(PyExc_SystemError,
3275 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00003276 return NULL;
3277 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003278 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003279 PyErr_SetString(PyExc_SystemError,
Guido van Rossum7a5b7962000-03-31 13:52:29 +00003280 "build_class with non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00003281 return NULL;
3282 }
Guido van Rossumcd649651997-08-22 16:56:16 +00003283 n = PyTuple_Size(bases);
3284 for (i = 0; i < n; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003285 PyObject *base = PyTuple_GET_ITEM(bases, i);
3286 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00003287 /* Call the base's *type*, if it is callable.
3288 This code is a hook for Donald Beaudry's
3289 and Jim Fulton's type extensions. In
Thomas Wouters7e474022000-07-16 12:04:32 +00003290 unextended Python it will never be triggered
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003291 since its types are not callable.
3292 Ditto: call the bases's *class*, if it has
3293 one. This makes the same thing possible
3294 without writing C code. A true meta-object
3295 protocol! */
3296 PyObject *basetype = (PyObject *)base->ob_type;
3297 PyObject *callable = NULL;
3298 if (PyCallable_Check(basetype))
3299 callable = basetype;
3300 else
3301 callable = PyObject_GetAttrString(
3302 base, "__class__");
3303 if (callable) {
3304 PyObject *args;
3305 PyObject *newclass = NULL;
3306 args = Py_BuildValue(
3307 "(OOO)", name, bases, methods);
3308 if (args != NULL) {
3309 newclass = PyEval_CallObject(
3310 callable, args);
3311 Py_DECREF(args);
3312 }
Guido van Rossum730806d1998-04-10 22:27:42 +00003313 if (callable != basetype) {
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003314 Py_DECREF(callable);
Guido van Rossum730806d1998-04-10 22:27:42 +00003315 }
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003316 return newclass;
Guido van Rossum150b2df1996-12-05 23:17:11 +00003317 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003318 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00003319 "base is not a class object");
3320 return NULL;
3321 }
3322 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003323 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00003324}
3325
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003326static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003327exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3328 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003329{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003330 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003331 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003332 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003333
Guido van Rossumb209a111997-04-29 18:18:01 +00003334 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3335 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003336 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003337 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003338 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003339 locals = PyTuple_GetItem(prog, 2);
3340 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003341 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003342 if (globals == Py_None) {
3343 globals = PyEval_GetGlobals();
3344 if (locals == Py_None) {
3345 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003346 plain = 1;
3347 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003348 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003349 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003350 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003351 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003352 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003353 !PyCode_Check(prog) &&
3354 !PyFile_Check(prog)) {
3355 PyErr_SetString(PyExc_TypeError,
Guido van Rossumac7be682001-01-17 15:42:30 +00003356 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003357 return -1;
3358 }
Fred Drake661ea262000-10-24 19:57:45 +00003359 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003360 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003361 "exec: arg 2 must be a dictionary or None");
3362 return -1;
3363 }
3364 if (!PyDict_Check(locals)) {
3365 PyErr_SetString(PyExc_TypeError,
3366 "exec: arg 3 must be a dictionary or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003367 return -1;
3368 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003369 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003370 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003371 if (PyCode_Check(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003372 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003373 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003374 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003375 FILE *fp = PyFile_AsFile(prog);
3376 char *name = PyString_AsString(PyFile_Name(prog));
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003377 v = PyRun_File(fp, name, Py_file_input, globals, locals);
3378 }
3379 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003380 char *str;
3381 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003382 return -1;
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003383 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003384 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003385 if (plain)
3386 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003387 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003388 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003389 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003390 return 0;
3391}
Guido van Rossum24c13741995-02-14 09:42:43 +00003392
Guido van Rossumac7be682001-01-17 15:42:30 +00003393static void
Paul Prescode68140d2000-08-30 20:25:01 +00003394format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3395{
3396 char *obj_str;
3397
3398 if (!obj)
3399 return;
3400
3401 obj_str = PyString_AsString(obj);
3402 if (!obj_str)
3403 return;
3404
3405 PyErr_Format(exc, format_str, obj_str);
3406}
Guido van Rossum950361c1997-01-24 13:49:28 +00003407
3408#ifdef DYNAMIC_EXECUTION_PROFILE
3409
3410PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003411getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003412{
3413 int i;
3414 PyObject *l = PyList_New(256);
3415 if (l == NULL) return NULL;
3416 for (i = 0; i < 256; i++) {
3417 PyObject *x = PyInt_FromLong(a[i]);
3418 if (x == NULL) {
3419 Py_DECREF(l);
3420 return NULL;
3421 }
3422 PyList_SetItem(l, i, x);
3423 }
3424 for (i = 0; i < 256; i++)
3425 a[i] = 0;
3426 return l;
3427}
3428
3429PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003430_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003431{
3432#ifndef DXPAIRS
3433 return getarray(dxp);
3434#else
3435 int i;
3436 PyObject *l = PyList_New(257);
3437 if (l == NULL) return NULL;
3438 for (i = 0; i < 257; i++) {
3439 PyObject *x = getarray(dxpairs[i]);
3440 if (x == NULL) {
3441 Py_DECREF(l);
3442 return NULL;
3443 }
3444 PyList_SetItem(l, i, x);
3445 }
3446 return l;
3447#endif
3448}
3449
3450#endif