blob: 10b5c5d32cc12dcdc3cff92dcdbfb9f09213bbbd [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum3f5da241990-12-20 15:06:42 +00002/* Execute compiled code */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003
Guido van Rossum681d79a1995-07-18 14:51:37 +00004/* XXX TO DO:
5 XXX how to pass arguments to call_trace?
Guido van Rossum681d79a1995-07-18 14:51:37 +00006 XXX speed up searching for keywords by using a dictionary
Guido van Rossum681d79a1995-07-18 14:51:37 +00007 XXX document it!
8 */
9
Guido van Rossumb209a111997-04-29 18:18:01 +000010#include "Python.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000011
Guido van Rossum10dc2e81990-11-18 17:27:39 +000012#include "compile.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000013#include "frameobject.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000014#include "eval.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000015#include "opcode.h"
16
Jack Jansencbf630f2000-07-11 21:59:16 +000017#ifdef macintosh
18#include "macglue.h"
19#endif
20
Guido van Rossumc6004111993-11-05 10:22:19 +000021#include <ctype.h>
22
Guido van Rossum04691fc1992-08-12 15:35:34 +000023/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000024/* #define CASE_TOO_BIG 1 */
Guido van Rossum04691fc1992-08-12 15:35:34 +000025
Guido van Rossum408027e1996-12-30 16:17:54 +000026#ifdef Py_DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000027/* For debugging the interpreter: */
28#define LLTRACE 1 /* Low-level trace feature */
29#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000030#endif
31
Jeremy Hylton52820442001-01-03 23:52:36 +000032typedef PyObject *(*callproc)(PyObject *, PyObject *, PyObject *);
Guido van Rossum5b722181993-03-30 17:46:03 +000033
Guido van Rossum374a9221991-04-04 10:40:29 +000034/* Forward declarations */
Guido van Rossum374a9221991-04-04 10:40:29 +000035
Tim Petersdbd9ba62000-07-09 03:09:57 +000036static PyObject *eval_code2(PyCodeObject *,
37 PyObject *, PyObject *,
38 PyObject **, int,
39 PyObject **, int,
Jeremy Hylton64949cb2001-01-25 20:06:59 +000040 PyObject **, int,
41 PyObject *);
Jeremy Hylton52820442001-01-03 23:52:36 +000042
Jeremy Hylton512a2372001-04-11 13:52:29 +000043static char *get_func_name(PyObject *);
44static char *get_func_desc(PyObject *);
Jeremy Hylton52820442001-01-03 23:52:36 +000045static 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 */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +0000327 WHY_BREAK, /* 'break' statement */
Thomas Woutersfc93b0a2001-02-16 11:52:31 +0000328 WHY_CONTINUE /* 'continue' statement */
Guido van Rossum374a9221991-04-04 10:40:29 +0000329};
330
Tim Petersdbd9ba62000-07-09 03:09:57 +0000331static enum why_code do_raise(PyObject *, PyObject *, PyObject *);
332static int unpack_sequence(PyObject *, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000333
Guido van Rossum374a9221991-04-04 10:40:29 +0000334
Guido van Rossumb209a111997-04-29 18:18:01 +0000335PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000336PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000337{
338 return eval_code2(co,
339 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000340 (PyObject **)NULL, 0,
341 (PyObject **)NULL, 0,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000342 (PyObject **)NULL, 0,
343 NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000344}
345
346
347/* Interpreter main loop */
348
Guido van Rossumb209a111997-04-29 18:18:01 +0000349static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000350eval_code2(PyCodeObject *co, PyObject *globals, PyObject *locals,
351 PyObject **args, int argcount, PyObject **kws, int kwcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000352 PyObject **defs, int defcount, PyObject *closure)
Guido van Rossum374a9221991-04-04 10:40:29 +0000353{
Guido van Rossum950361c1997-01-24 13:49:28 +0000354#ifdef DXPAIRS
355 int lastopcode = 0;
356#endif
Jeremy Hylton52820442001-01-03 23:52:36 +0000357 PyObject **stack_pointer;
Guido van Rossum374a9221991-04-04 10:40:29 +0000358 register unsigned char *next_instr;
Moshe Zadkaaa39a7e2000-08-07 06:34:45 +0000359 register int opcode=0; /* Current opcode */
360 register int oparg=0; /* Current opcode argument, if any */
Guido van Rossum374a9221991-04-04 10:40:29 +0000361 register enum why_code why; /* Reason for block stack unwind */
362 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000363 register PyObject *x; /* Result object -- NULL if error */
364 register PyObject *v; /* Temporary objects popped off stack */
365 register PyObject *w;
366 register PyObject *u;
367 register PyObject *t;
Barry Warsaw23c9ec82000-08-21 15:44:01 +0000368 register PyObject *stream = NULL; /* for PRINT opcodes */
Guido van Rossumb209a111997-04-29 18:18:01 +0000369 register PyFrameObject *f; /* Current frame */
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000370 register PyObject **fastlocals, **freevars;
Guido van Rossum014518f1998-11-23 21:09:51 +0000371 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000372 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossumd076c731998-10-07 19:42:25 +0000373 unsigned char *first_instr;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000374#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000375 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000376#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000377#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000378 /* Make it easier to find out where we are with a debugger */
Guido van Rossumb209a111997-04-29 18:18:01 +0000379 char *filename = PyString_AsString(co->co_filename);
Guido van Rossum99bec951992-09-03 20:29:45 +0000380#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000381
382/* Code access macros */
383
384#define GETCONST(i) Getconst(f, i)
385#define GETNAME(i) Getname(f, i)
386#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumd076c731998-10-07 19:42:25 +0000387#define INSTR_OFFSET() (next_instr - first_instr)
Guido van Rossum374a9221991-04-04 10:40:29 +0000388#define NEXTOP() (*next_instr++)
389#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossumd076c731998-10-07 19:42:25 +0000390#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000391#define JUMPBY(x) (next_instr += (x))
392
393/* Stack manipulation macros */
394
395#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
396#define EMPTY() (STACK_LEVEL() == 0)
397#define TOP() (stack_pointer[-1])
398#define BASIC_PUSH(v) (*stack_pointer++ = (v))
399#define BASIC_POP() (*--stack_pointer)
400
Guido van Rossum96a42c81992-01-12 02:29:51 +0000401#ifdef LLTRACE
402#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
403#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000404#else
405#define PUSH(v) BASIC_PUSH(v)
406#define POP() BASIC_POP()
407#endif
408
Guido van Rossum681d79a1995-07-18 14:51:37 +0000409/* Local variable macros */
410
411#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumb209a111997-04-29 18:18:01 +0000412#define SETLOCAL(i, value) do { Py_XDECREF(GETLOCAL(i)); \
Guido van Rossum681d79a1995-07-18 14:51:37 +0000413 GETLOCAL(i) = value; } while (0)
414
Guido van Rossuma027efa1997-05-05 20:56:21 +0000415/* Start of code */
416
Guido van Rossum8861b741996-07-30 16:49:37 +0000417#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000418 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000419 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000420 return NULL;
421 }
422#endif
423
Guido van Rossum681d79a1995-07-18 14:51:37 +0000424 if (globals == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000425 PyErr_SetString(PyExc_SystemError, "eval_code2: NULL globals");
Guido van Rossum6135a871995-01-09 17:53:26 +0000426 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000427 }
428
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000429#ifdef LLTRACE
Guido van Rossumb209a111997-04-29 18:18:01 +0000430 lltrace = PyDict_GetItemString(globals, "__lltrace__") != NULL;
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000431#endif
432
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000433 f = PyFrame_New(tstate, /*back*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000434 co, /*code*/
Jeremy Hylton30c9f392001-03-13 01:58:22 +0000435 globals, locals);
Guido van Rossum374a9221991-04-04 10:40:29 +0000436 if (f == NULL)
437 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000438
Guido van Rossuma027efa1997-05-05 20:56:21 +0000439 tstate->frame = f;
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000440 fastlocals = f->f_localsplus;
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000441 freevars = f->f_localsplus + f->f_nlocals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000442
443 if (co->co_argcount > 0 ||
444 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
445 int i;
446 int n = argcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000447 PyObject *kwdict = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000448 if (co->co_flags & CO_VARKEYWORDS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000449 kwdict = PyDict_New();
Guido van Rossum681d79a1995-07-18 14:51:37 +0000450 if (kwdict == NULL)
451 goto fail;
Guido van Rossum8c5df061997-01-24 04:19:24 +0000452 i = co->co_argcount;
453 if (co->co_flags & CO_VARARGS)
454 i++;
455 SETLOCAL(i, kwdict);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000456 }
457 if (argcount > co->co_argcount) {
458 if (!(co->co_flags & CO_VARARGS)) {
Guido van Rossumdf9db1e1997-11-19 16:05:40 +0000459 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +0000460 "%.200s() takes %s %d "
461 "%sargument%s (%d given)",
Fred Drake661ea262000-10-24 19:57:45 +0000462 PyString_AsString(co->co_name),
Ka-Ping Yee20579702001-01-15 22:14:16 +0000463 defcount ? "at most" : "exactly",
464 co->co_argcount,
465 kwcount ? "non-keyword " : "",
466 co->co_argcount == 1 ? "" : "s",
467 argcount);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000468 goto fail;
469 }
470 n = co->co_argcount;
471 }
472 for (i = 0; i < n; i++) {
473 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000474 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000475 SETLOCAL(i, x);
476 }
477 if (co->co_flags & CO_VARARGS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000478 u = PyTuple_New(argcount - n);
Guido van Rossum8c5df061997-01-24 04:19:24 +0000479 if (u == NULL)
480 goto fail;
481 SETLOCAL(co->co_argcount, u);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000482 for (i = n; i < argcount; i++) {
483 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000484 Py_INCREF(x);
485 PyTuple_SET_ITEM(u, i-n, x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000486 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000487 }
488 for (i = 0; i < kwcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000489 PyObject *keyword = kws[2*i];
490 PyObject *value = kws[2*i + 1];
Guido van Rossum681d79a1995-07-18 14:51:37 +0000491 int j;
Guido van Rossum25da5be1999-10-26 00:12:20 +0000492 if (keyword == NULL || !PyString_Check(keyword)) {
Ka-Ping Yee20579702001-01-15 22:14:16 +0000493 PyErr_Format(PyExc_TypeError,
494 "%.200s() keywords must be strings",
495 PyString_AsString(co->co_name));
Guido van Rossum25da5be1999-10-26 00:12:20 +0000496 goto fail;
497 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000498 /* XXX slow -- speed up using dictionary? */
499 for (j = 0; j < co->co_argcount; j++) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000500 PyObject *nm = PyTuple_GET_ITEM(
501 co->co_varnames, j);
Guido van Rossumac7be682001-01-17 15:42:30 +0000502 int cmp = PyObject_RichCompareBool(
503 keyword, nm, Py_EQ);
504 if (cmp > 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000505 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000506 else if (cmp < 0)
507 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000508 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000509 /* Check errors from Compare */
510 if (PyErr_Occurred())
511 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000512 if (j >= co->co_argcount) {
513 if (kwdict == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000514 PyErr_Format(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +0000515 "%.200s() got an unexpected "
516 "keyword argument '%.400s'",
517 PyString_AsString(co->co_name),
Jeremy Hylton76901512000-03-28 23:49:17 +0000518 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000519 goto fail;
520 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000521 PyDict_SetItem(kwdict, keyword, value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000522 }
523 else {
524 if (GETLOCAL(j) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000525 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +0000526 "%.200s() got multiple "
527 "values for keyword "
528 "argument '%.400s'",
529 PyString_AsString(co->co_name),
530 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000531 goto fail;
532 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000533 Py_INCREF(value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000534 SETLOCAL(j, value);
535 }
536 }
537 if (argcount < co->co_argcount) {
538 int m = co->co_argcount - defcount;
539 for (i = argcount; i < m; i++) {
540 if (GETLOCAL(i) == NULL) {
Guido van Rossumdf9db1e1997-11-19 16:05:40 +0000541 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +0000542 "%.200s() takes %s %d "
543 "%sargument%s (%d given)",
Fred Drake661ea262000-10-24 19:57:45 +0000544 PyString_AsString(co->co_name),
Ka-Ping Yee20579702001-01-15 22:14:16 +0000545 ((co->co_flags & CO_VARARGS) ||
546 defcount) ? "at least"
547 : "exactly",
548 m, kwcount ? "non-keyword " : "",
549 m == 1 ? "" : "s", i);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000550 goto fail;
551 }
552 }
553 if (n > m)
554 i = n - m;
555 else
556 i = 0;
557 for (; i < defcount; i++) {
558 if (GETLOCAL(m+i) == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000559 PyObject *def = defs[i];
560 Py_INCREF(def);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000561 SETLOCAL(m+i, def);
562 }
563 }
564 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000565 }
566 else {
567 if (argcount > 0 || kwcount > 0) {
Fred Drake661ea262000-10-24 19:57:45 +0000568 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +0000569 "%.200s() takes no arguments (%d given)",
570 PyString_AsString(co->co_name),
571 argcount + kwcount);
Guido van Rossum8c5df061997-01-24 04:19:24 +0000572 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000573 }
574 }
Jeremy Hylton220ae7c2001-03-21 16:43:47 +0000575 /* Allocate and initialize storage for cell vars, and copy free
576 vars into frame. This isn't too efficient right now. */
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000577 if (f->f_ncells) {
Jeremy Hylton220ae7c2001-03-21 16:43:47 +0000578 int i = 0, j = 0, nargs, found;
579 char *cellname, *argname;
580 PyObject *c;
581
582 nargs = co->co_argcount;
583 if (co->co_flags & CO_VARARGS)
584 nargs++;
585 if (co->co_flags & CO_VARKEYWORDS)
586 nargs++;
587
588 /* Check for cells that shadow args */
589 for (i = 0; i < f->f_ncells && j < nargs; ++i) {
590 cellname = PyString_AS_STRING(
591 PyTuple_GET_ITEM(co->co_cellvars, i));
592 found = 0;
593 while (j < nargs) {
594 argname = PyString_AS_STRING(
595 PyTuple_GET_ITEM(co->co_varnames, j));
596 if (strcmp(cellname, argname) == 0) {
597 c = PyCell_New(GETLOCAL(j));
598 if (c == NULL)
599 goto fail;
600 GETLOCAL(f->f_nlocals + i) = c;
601 found = 1;
602 break;
603 }
604 j++;
605 }
606 if (found == 0) {
607 c = PyCell_New(NULL);
608 if (c == NULL)
609 goto fail;
610 SETLOCAL(f->f_nlocals + i, c);
611 }
612 }
613 /* Initialize any that are left */
614 while (i < f->f_ncells) {
615 c = PyCell_New(NULL);
616 if (c == NULL)
617 goto fail;
618 SETLOCAL(f->f_nlocals + i, c);
619 i++;
620 }
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000621 }
622 if (f->f_nfreevars) {
623 int i;
Jeremy Hylton30c9f392001-03-13 01:58:22 +0000624 for (i = 0; i < f->f_nfreevars; ++i) {
625 PyObject *o = PyTuple_GET_ITEM(closure, i);
626 Py_INCREF(o);
627 freevars[f->f_ncells + i] = o;
628 }
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000629 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000630
Guido van Rossuma027efa1997-05-05 20:56:21 +0000631 if (tstate->sys_tracefunc != NULL) {
632 /* tstate->sys_tracefunc, if defined, is a function that
633 will be called on *every* entry to a code block.
Guido van Rossum96a42c81992-01-12 02:29:51 +0000634 Its return value, if not None, is a function that
635 will be called at the start of each executed line
636 of code. (Actually, the function must return
637 itself in order to continue tracing.)
638 The trace functions are called with three arguments:
639 a pointer to the current frame, a string indicating
640 why the function is called, and an argument which
641 depends on the situation. The global trace function
642 (sys.trace) is also called whenever an exception
643 is detected. */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000644 if (call_trace(&tstate->sys_tracefunc,
645 &f->f_trace, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000646 Py_None/*XXX how to compute arguments now?*/)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000647 /* Trace function raised an error */
Guido van Rossum8c5df061997-01-24 04:19:24 +0000648 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000649 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000650 }
651
Guido van Rossuma027efa1997-05-05 20:56:21 +0000652 if (tstate->sys_profilefunc != NULL) {
653 /* Similar for sys_profilefunc, except it needn't return
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000654 itself and isn't called for "line" events */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000655 if (call_trace(&tstate->sys_profilefunc,
656 (PyObject**)0, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000657 Py_None/*XXX*/)) {
Guido van Rossum8c5df061997-01-24 04:19:24 +0000658 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000659 }
660 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000661
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000662 if (++tstate->recursion_depth > recursion_limit) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000663 --tstate->recursion_depth;
664 PyErr_SetString(PyExc_RuntimeError,
Fred Drake661ea262000-10-24 19:57:45 +0000665 "maximum recursion depth exceeded");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000666 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +0000667 Py_DECREF(f);
Guido van Rossum8861b741996-07-30 16:49:37 +0000668 return NULL;
669 }
670
Guido van Rossumd076c731998-10-07 19:42:25 +0000671 _PyCode_GETCODEPTR(co, &first_instr);
672 next_instr = first_instr;
Guido van Rossum374a9221991-04-04 10:40:29 +0000673 stack_pointer = f->f_valuestack;
Guido van Rossumac7be682001-01-17 15:42:30 +0000674
Guido van Rossum374a9221991-04-04 10:40:29 +0000675 why = WHY_NOT;
676 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000677 x = Py_None; /* Not a reference, just anything non-NULL */
Fred Drake48fba732000-10-11 13:54:07 +0000678 w = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +0000679
Guido van Rossum374a9221991-04-04 10:40:29 +0000680 for (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000681 /* Do periodic things. Doing this every time through
682 the loop would add too much overhead, so we do it
683 only every Nth instruction. We also do it if
684 ``things_to_do'' is set, i.e. when an asynchronous
685 event needs attention (e.g. a signal handler or
686 async I/O handler); see Py_AddPendingCall() and
687 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +0000688
Guido van Rossuma027efa1997-05-05 20:56:21 +0000689 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000690 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000691 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000692 if (Py_MakePendingCalls() < 0) {
693 why = WHY_EXCEPTION;
694 goto on_error;
695 }
696 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000697#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000698 /* If we have true signals, the signal handler
699 will call Py_AddPendingCall() so we don't
700 have to call sigcheck(). On the Mac and
701 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000702 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000703 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000704 goto on_error;
705 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000706#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000707
Guido van Rossume59214e1994-08-30 08:01:59 +0000708#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000709 if (interpreter_lock) {
710 /* Give another thread a chance */
711
Guido van Rossum25ce5661997-08-02 03:10:38 +0000712 if (PyThreadState_Swap(NULL) != tstate)
713 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000714 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000715
716 /* Other threads may run now */
717
Guido van Rossum65d5b571998-12-21 19:32:43 +0000718 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000719 if (PyThreadState_Swap(tstate) != NULL)
720 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000721 }
722#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000723 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000724
Guido van Rossum374a9221991-04-04 10:40:29 +0000725 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000726
Guido van Rossum408027e1996-12-30 16:17:54 +0000727#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000728 f->f_lasti = INSTR_OFFSET();
729#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000730
Guido van Rossum374a9221991-04-04 10:40:29 +0000731 opcode = NEXTOP();
732 if (HAS_ARG(opcode))
733 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000734 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000735#ifdef DYNAMIC_EXECUTION_PROFILE
736#ifdef DXPAIRS
737 dxpairs[lastopcode][opcode]++;
738 lastopcode = opcode;
739#endif
740 dxp[opcode]++;
741#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000742
Guido van Rossum96a42c81992-01-12 02:29:51 +0000743#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000744 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +0000745
Guido van Rossum96a42c81992-01-12 02:29:51 +0000746 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000747 if (HAS_ARG(opcode)) {
748 printf("%d: %d, %d\n",
749 (int) (INSTR_OFFSET() - 3),
750 opcode, oparg);
751 }
752 else {
753 printf("%d: %d\n",
754 (int) (INSTR_OFFSET() - 1), opcode);
755 }
756 }
757#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000758 /* Main switch on opcode */
Jeremy Hylton52820442001-01-03 23:52:36 +0000759
Guido van Rossum374a9221991-04-04 10:40:29 +0000760 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000761
Guido van Rossum374a9221991-04-04 10:40:29 +0000762 /* BEWARE!
763 It is essential that any operation that fails sets either
764 x to NULL, err to nonzero, or why to anything but WHY_NOT,
765 and that no operation that succeeds does this! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000766
Guido van Rossum374a9221991-04-04 10:40:29 +0000767 /* case STOP_CODE: this is an error! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000768
Guido van Rossum374a9221991-04-04 10:40:29 +0000769 case POP_TOP:
770 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000771 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000772 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000773
Guido van Rossum374a9221991-04-04 10:40:29 +0000774 case ROT_TWO:
775 v = POP();
776 w = POP();
777 PUSH(v);
778 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000779 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000780
Guido van Rossum374a9221991-04-04 10:40:29 +0000781 case ROT_THREE:
782 v = POP();
783 w = POP();
784 x = POP();
785 PUSH(v);
786 PUSH(x);
787 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000788 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000789
Thomas Wouters434d0822000-08-24 20:11:32 +0000790 case ROT_FOUR:
791 u = POP();
792 v = POP();
793 w = POP();
794 x = POP();
795 PUSH(u);
796 PUSH(x);
797 PUSH(w);
798 PUSH(v);
799 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000800
Guido van Rossum374a9221991-04-04 10:40:29 +0000801 case DUP_TOP:
802 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000803 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000804 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000805 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000806
Thomas Wouters434d0822000-08-24 20:11:32 +0000807 case DUP_TOPX:
808 switch (oparg) {
Thomas Wouters434d0822000-08-24 20:11:32 +0000809 case 1:
Tim Peters35ba6892000-10-11 07:04:49 +0000810 x = TOP();
811 Py_INCREF(x);
812 PUSH(x);
813 continue;
814 case 2:
Thomas Wouters434d0822000-08-24 20:11:32 +0000815 x = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000816 Py_INCREF(x);
817 w = TOP();
818 Py_INCREF(w);
819 PUSH(x);
820 PUSH(w);
821 PUSH(x);
822 continue;
823 case 3:
824 x = POP();
825 Py_INCREF(x);
Thomas Wouters434d0822000-08-24 20:11:32 +0000826 w = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000827 Py_INCREF(w);
828 v = TOP();
829 Py_INCREF(v);
830 PUSH(w);
831 PUSH(x);
832 PUSH(v);
833 PUSH(w);
834 PUSH(x);
835 continue;
836 case 4:
837 x = POP();
838 Py_INCREF(x);
839 w = POP();
840 Py_INCREF(w);
Thomas Wouters434d0822000-08-24 20:11:32 +0000841 v = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000842 Py_INCREF(v);
843 u = TOP();
844 Py_INCREF(u);
845 PUSH(v);
846 PUSH(w);
847 PUSH(x);
848 PUSH(u);
849 PUSH(v);
850 PUSH(w);
851 PUSH(x);
852 continue;
853 case 5:
854 x = POP();
855 Py_INCREF(x);
856 w = POP();
857 Py_INCREF(w);
858 v = POP();
859 Py_INCREF(v);
Thomas Wouters434d0822000-08-24 20:11:32 +0000860 u = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000861 Py_INCREF(u);
862 t = TOP();
863 Py_INCREF(t);
864 PUSH(u);
865 PUSH(v);
866 PUSH(w);
867 PUSH(x);
868 PUSH(t);
869 PUSH(u);
870 PUSH(v);
871 PUSH(w);
872 PUSH(x);
873 continue;
Thomas Wouters434d0822000-08-24 20:11:32 +0000874 default:
Thomas Wouters0be483f2000-10-11 23:26:11 +0000875 Py_FatalError("invalid argument to DUP_TOPX"
876 " (bytecode corruption?)");
Thomas Wouters434d0822000-08-24 20:11:32 +0000877 }
Tim Peters35ba6892000-10-11 07:04:49 +0000878 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000879
Guido van Rossum374a9221991-04-04 10:40:29 +0000880 case UNARY_POSITIVE:
881 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000882 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000883 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000884 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000885 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000886 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000887
Guido van Rossum374a9221991-04-04 10:40:29 +0000888 case UNARY_NEGATIVE:
889 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000890 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000891 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000892 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000893 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000894 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000895
Guido van Rossum374a9221991-04-04 10:40:29 +0000896 case UNARY_NOT:
897 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000898 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000899 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000900 if (err == 0) {
901 Py_INCREF(Py_True);
902 PUSH(Py_True);
903 continue;
904 }
905 else if (err > 0) {
906 Py_INCREF(Py_False);
907 PUSH(Py_False);
908 err = 0;
909 continue;
910 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000911 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000912
Guido van Rossum374a9221991-04-04 10:40:29 +0000913 case UNARY_CONVERT:
914 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000915 x = PyObject_Repr(v);
916 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000917 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000918 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000919 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000920
Guido van Rossum7928cd71991-10-24 14:59:31 +0000921 case UNARY_INVERT:
922 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000923 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000924 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000925 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000926 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000927 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000928
Guido van Rossum50564e81996-01-12 01:13:16 +0000929 case BINARY_POWER:
930 w = POP();
931 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000932 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000933 Py_DECREF(v);
934 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000935 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000936 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000937 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000938
Guido van Rossum374a9221991-04-04 10:40:29 +0000939 case BINARY_MULTIPLY:
940 w = POP();
941 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000942 x = PyNumber_Multiply(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_DIVIDE:
950 w = POP();
951 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000952 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000953 Py_DECREF(v);
954 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000955 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000956 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000957 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000958
Guido van Rossum374a9221991-04-04 10:40:29 +0000959 case BINARY_MODULO:
960 w = POP();
961 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000962 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000963 Py_DECREF(v);
964 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000965 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000966 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000967 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000968
Guido van Rossum374a9221991-04-04 10:40:29 +0000969 case BINARY_ADD:
970 w = POP();
971 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000972 if (PyInt_Check(v) && PyInt_Check(w)) {
973 /* INLINE: int + int */
974 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000975 a = PyInt_AS_LONG(v);
976 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000977 i = a + b;
978 if ((i^a) < 0 && (i^b) < 0) {
979 PyErr_SetString(PyExc_OverflowError,
980 "integer addition");
981 x = NULL;
982 }
983 else
984 x = PyInt_FromLong(i);
985 }
986 else
987 x = PyNumber_Add(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000988 Py_DECREF(v);
989 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000990 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000991 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000992 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000993
Guido van Rossum374a9221991-04-04 10:40:29 +0000994 case BINARY_SUBTRACT:
995 w = POP();
996 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000997 if (PyInt_Check(v) && PyInt_Check(w)) {
998 /* INLINE: int - int */
999 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001000 a = PyInt_AS_LONG(v);
1001 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001002 i = a - b;
1003 if ((i^a) < 0 && (i^~b) < 0) {
1004 PyErr_SetString(PyExc_OverflowError,
1005 "integer subtraction");
1006 x = NULL;
1007 }
1008 else
1009 x = PyInt_FromLong(i);
1010 }
1011 else
1012 x = PyNumber_Subtract(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001013 Py_DECREF(v);
1014 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001015 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001016 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001017 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001018
Guido van Rossum374a9221991-04-04 10:40:29 +00001019 case BINARY_SUBSCR:
1020 w = POP();
1021 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001022 if (PyList_Check(v) && PyInt_Check(w)) {
1023 /* INLINE: list[int] */
1024 long i = PyInt_AsLong(w);
1025 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +00001026 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +00001027 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +00001028 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001029 PyErr_SetString(PyExc_IndexError,
1030 "list index out of range");
1031 x = NULL;
1032 }
1033 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +00001034 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001035 Py_INCREF(x);
1036 }
1037 }
1038 else
1039 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001040 Py_DECREF(v);
1041 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001042 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001043 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001044 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001045
Guido van Rossum7928cd71991-10-24 14:59:31 +00001046 case BINARY_LSHIFT:
1047 w = POP();
1048 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001049 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001050 Py_DECREF(v);
1051 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001052 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001053 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001054 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001055
Guido van Rossum7928cd71991-10-24 14:59:31 +00001056 case BINARY_RSHIFT:
1057 w = POP();
1058 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001059 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001060 Py_DECREF(v);
1061 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001062 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001063 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001064 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001065
Guido van Rossum7928cd71991-10-24 14:59:31 +00001066 case BINARY_AND:
1067 w = POP();
1068 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001069 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001070 Py_DECREF(v);
1071 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001072 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001073 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001074 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001075
Guido van Rossum7928cd71991-10-24 14:59:31 +00001076 case BINARY_XOR:
1077 w = POP();
1078 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001079 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001080 Py_DECREF(v);
1081 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001082 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001083 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001084 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001085
Guido van Rossum7928cd71991-10-24 14:59:31 +00001086 case BINARY_OR:
1087 w = POP();
1088 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001089 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001090 Py_DECREF(v);
1091 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001092 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001093 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001094 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001095
1096 case INPLACE_POWER:
1097 w = POP();
1098 v = POP();
1099 x = PyNumber_InPlacePower(v, w, Py_None);
1100 Py_DECREF(v);
1101 Py_DECREF(w);
1102 PUSH(x);
1103 if (x != NULL) continue;
1104 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001105
Thomas Wouters434d0822000-08-24 20:11:32 +00001106 case INPLACE_MULTIPLY:
1107 w = POP();
1108 v = POP();
1109 x = PyNumber_InPlaceMultiply(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_DIVIDE:
1117 w = POP();
1118 v = POP();
1119 x = PyNumber_InPlaceDivide(v, w);
1120 Py_DECREF(v);
1121 Py_DECREF(w);
1122 PUSH(x);
1123 if (x != NULL) continue;
1124 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001125
Thomas Wouters434d0822000-08-24 20:11:32 +00001126 case INPLACE_MODULO:
1127 w = POP();
1128 v = POP();
1129 x = PyNumber_InPlaceRemainder(v, w);
1130 Py_DECREF(v);
1131 Py_DECREF(w);
1132 PUSH(x);
1133 if (x != NULL) continue;
1134 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001135
Thomas Wouters434d0822000-08-24 20:11:32 +00001136 case INPLACE_ADD:
1137 w = POP();
1138 v = POP();
1139 if (PyInt_Check(v) && PyInt_Check(w)) {
1140 /* INLINE: int + int */
1141 register long a, b, i;
1142 a = PyInt_AS_LONG(v);
1143 b = PyInt_AS_LONG(w);
1144 i = a + b;
1145 if ((i^a) < 0 && (i^b) < 0) {
1146 PyErr_SetString(PyExc_OverflowError,
1147 "integer addition");
1148 x = NULL;
1149 }
1150 else
1151 x = PyInt_FromLong(i);
1152 }
1153 else
1154 x = PyNumber_InPlaceAdd(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_SUBTRACT:
1162 w = POP();
1163 v = POP();
1164 if (PyInt_Check(v) && PyInt_Check(w)) {
1165 /* INLINE: int - int */
1166 register long a, b, i;
1167 a = PyInt_AS_LONG(v);
1168 b = PyInt_AS_LONG(w);
1169 i = a - b;
1170 if ((i^a) < 0 && (i^~b) < 0) {
1171 PyErr_SetString(PyExc_OverflowError,
1172 "integer subtraction");
1173 x = NULL;
1174 }
1175 else
1176 x = PyInt_FromLong(i);
1177 }
1178 else
1179 x = PyNumber_InPlaceSubtract(v, w);
1180 Py_DECREF(v);
1181 Py_DECREF(w);
1182 PUSH(x);
1183 if (x != NULL) continue;
1184 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001185
Thomas Wouters434d0822000-08-24 20:11:32 +00001186 case INPLACE_LSHIFT:
1187 w = POP();
1188 v = POP();
1189 x = PyNumber_InPlaceLshift(v, w);
1190 Py_DECREF(v);
1191 Py_DECREF(w);
1192 PUSH(x);
1193 if (x != NULL) continue;
1194 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001195
Thomas Wouters434d0822000-08-24 20:11:32 +00001196 case INPLACE_RSHIFT:
1197 w = POP();
1198 v = POP();
1199 x = PyNumber_InPlaceRshift(v, w);
1200 Py_DECREF(v);
1201 Py_DECREF(w);
1202 PUSH(x);
1203 if (x != NULL) continue;
1204 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001205
Thomas Wouters434d0822000-08-24 20:11:32 +00001206 case INPLACE_AND:
1207 w = POP();
1208 v = POP();
1209 x = PyNumber_InPlaceAnd(v, w);
1210 Py_DECREF(v);
1211 Py_DECREF(w);
1212 PUSH(x);
1213 if (x != NULL) continue;
1214 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001215
Thomas Wouters434d0822000-08-24 20:11:32 +00001216 case INPLACE_XOR:
1217 w = POP();
1218 v = POP();
1219 x = PyNumber_InPlaceXor(v, w);
1220 Py_DECREF(v);
1221 Py_DECREF(w);
1222 PUSH(x);
1223 if (x != NULL) continue;
1224 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001225
Thomas Wouters434d0822000-08-24 20:11:32 +00001226 case INPLACE_OR:
1227 w = POP();
1228 v = POP();
1229 x = PyNumber_InPlaceOr(v, w);
1230 Py_DECREF(v);
1231 Py_DECREF(w);
1232 PUSH(x);
1233 if (x != NULL) continue;
1234 break;
1235
Guido van Rossum374a9221991-04-04 10:40:29 +00001236 case SLICE+0:
1237 case SLICE+1:
1238 case SLICE+2:
1239 case SLICE+3:
1240 if ((opcode-SLICE) & 2)
1241 w = POP();
1242 else
1243 w = NULL;
1244 if ((opcode-SLICE) & 1)
1245 v = POP();
1246 else
1247 v = NULL;
1248 u = POP();
1249 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001250 Py_DECREF(u);
1251 Py_XDECREF(v);
1252 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001253 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001254 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001255 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001256
Guido van Rossum374a9221991-04-04 10:40:29 +00001257 case STORE_SLICE+0:
1258 case STORE_SLICE+1:
1259 case STORE_SLICE+2:
1260 case STORE_SLICE+3:
1261 if ((opcode-STORE_SLICE) & 2)
1262 w = POP();
1263 else
1264 w = NULL;
1265 if ((opcode-STORE_SLICE) & 1)
1266 v = POP();
1267 else
1268 v = NULL;
1269 u = POP();
1270 t = POP();
1271 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001272 Py_DECREF(t);
1273 Py_DECREF(u);
1274 Py_XDECREF(v);
1275 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001276 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001277 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001278
Guido van Rossum374a9221991-04-04 10:40:29 +00001279 case DELETE_SLICE+0:
1280 case DELETE_SLICE+1:
1281 case DELETE_SLICE+2:
1282 case DELETE_SLICE+3:
1283 if ((opcode-DELETE_SLICE) & 2)
1284 w = POP();
1285 else
1286 w = NULL;
1287 if ((opcode-DELETE_SLICE) & 1)
1288 v = POP();
1289 else
1290 v = NULL;
1291 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001292 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001293 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001294 Py_DECREF(u);
1295 Py_XDECREF(v);
1296 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001297 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001298 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001299
Guido van Rossum374a9221991-04-04 10:40:29 +00001300 case STORE_SUBSCR:
1301 w = POP();
1302 v = POP();
1303 u = POP();
1304 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001305 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001306 Py_DECREF(u);
1307 Py_DECREF(v);
1308 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001309 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001310 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001311
Guido van Rossum374a9221991-04-04 10:40:29 +00001312 case DELETE_SUBSCR:
1313 w = POP();
1314 v = POP();
1315 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001316 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001317 Py_DECREF(v);
1318 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001319 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001320 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001321
Guido van Rossum374a9221991-04-04 10:40:29 +00001322 case PRINT_EXPR:
1323 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001324 w = PySys_GetObject("displayhook");
1325 if (w == NULL) {
1326 PyErr_SetString(PyExc_RuntimeError,
1327 "lost sys.displayhook");
1328 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001329 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001330 }
1331 if (err == 0) {
1332 x = Py_BuildValue("(O)", v);
1333 if (x == NULL)
1334 err = -1;
1335 }
1336 if (err == 0) {
1337 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001338 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001339 if (w == NULL)
1340 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001341 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001342 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001343 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001344 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001345
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001346 case PRINT_ITEM_TO:
1347 w = stream = POP();
1348 /* fall through to PRINT_ITEM */
1349
Guido van Rossum374a9221991-04-04 10:40:29 +00001350 case PRINT_ITEM:
1351 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001352 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001353 w = PySys_GetObject("stdout");
1354 if (w == NULL) {
1355 PyErr_SetString(PyExc_RuntimeError,
1356 "lost sys.stdout");
1357 err = -1;
1358 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001359 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001360 if (w != NULL && PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001361 err = PyFile_WriteString(" ", w);
1362 if (err == 0)
1363 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001364 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001365 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001366 char *s = PyString_AsString(v);
1367 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001368 if (len > 0 &&
1369 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001370 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001371 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001372 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001373 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001374 Py_XDECREF(stream);
1375 stream = NULL;
1376 if (err == 0)
1377 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001378 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001379
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001380 case PRINT_NEWLINE_TO:
1381 w = stream = POP();
1382 /* fall through to PRINT_NEWLINE */
1383
Guido van Rossum374a9221991-04-04 10:40:29 +00001384 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001385 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001386 w = PySys_GetObject("stdout");
1387 if (w == NULL)
1388 PyErr_SetString(PyExc_RuntimeError,
1389 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001390 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001391 if (w != NULL) {
1392 err = PyFile_WriteString("\n", w);
1393 if (err == 0)
1394 PyFile_SoftSpace(w, 0);
1395 }
1396 Py_XDECREF(stream);
1397 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001398 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001399
Thomas Wouters434d0822000-08-24 20:11:32 +00001400
1401#ifdef CASE_TOO_BIG
1402 default: switch (opcode) {
1403#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001404 case BREAK_LOOP:
1405 why = WHY_BREAK;
1406 break;
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00001407
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001408 case CONTINUE_LOOP:
1409 retval = PyInt_FromLong(oparg);
1410 why = WHY_CONTINUE;
1411 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001412
Guido van Rossumf10570b1995-07-07 22:53:21 +00001413 case RAISE_VARARGS:
1414 u = v = w = NULL;
1415 switch (oparg) {
1416 case 3:
1417 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001418 /* Fallthrough */
1419 case 2:
1420 v = POP(); /* value */
1421 /* Fallthrough */
1422 case 1:
1423 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001424 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001425 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001426 break;
1427 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001428 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001429 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001430 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001431 break;
1432 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001433 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001434
Guido van Rossum374a9221991-04-04 10:40:29 +00001435 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001436 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001437 PyErr_SetString(PyExc_SystemError,
1438 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001439 break;
1440 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001441 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001442 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001443 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001444
Guido van Rossum374a9221991-04-04 10:40:29 +00001445 case RETURN_VALUE:
1446 retval = POP();
1447 why = WHY_RETURN;
1448 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001449
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001450 case EXEC_STMT:
1451 w = POP();
1452 v = POP();
1453 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001454 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001455 Py_DECREF(u);
1456 Py_DECREF(v);
1457 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001458 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001459
Guido van Rossum374a9221991-04-04 10:40:29 +00001460 case POP_BLOCK:
1461 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001462 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001463 while (STACK_LEVEL() > b->b_level) {
1464 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001465 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001466 }
1467 }
1468 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001469
Guido van Rossum374a9221991-04-04 10:40:29 +00001470 case END_FINALLY:
1471 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001472 if (PyInt_Check(v)) {
1473 why = (enum why_code) PyInt_AsLong(v);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001474 if (why == WHY_RETURN ||
1475 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00001476 retval = POP();
1477 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001478 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001479 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001480 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001481 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001482 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001483 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001484 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001485 else if (v != Py_None) {
1486 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001487 "'finally' pops bad exception");
1488 why = WHY_EXCEPTION;
1489 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001490 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001491 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001492
Guido van Rossum374a9221991-04-04 10:40:29 +00001493 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001494 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001495 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001496 w = POP();
1497 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001498 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001499 Py_DECREF(u);
1500 Py_DECREF(v);
1501 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001502 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001503
Guido van Rossum374a9221991-04-04 10:40:29 +00001504 case STORE_NAME:
1505 w = GETNAMEV(oparg);
1506 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001507 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001508 PyErr_Format(PyExc_SystemError,
1509 "no locals found when storing %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001510 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001511 break;
1512 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001513 err = PyDict_SetItem(x, w, v);
1514 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001515 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001516
Guido van Rossum374a9221991-04-04 10:40:29 +00001517 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001518 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001519 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001520 PyErr_Format(PyExc_SystemError,
1521 "no locals when deleting %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001522 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001523 break;
1524 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001525 if ((err = PyDict_DelItem(x, w)) != 0)
Guido van Rossumac7be682001-01-17 15:42:30 +00001526 format_exc_check_arg(PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001527 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001528 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001529
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001530 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001531 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001532 if (PyTuple_Check(v)) {
1533 if (PyTuple_Size(v) != oparg) {
1534 PyErr_SetString(PyExc_ValueError,
1535 "unpack tuple of wrong size");
1536 why = WHY_EXCEPTION;
1537 }
1538 else {
1539 for (; --oparg >= 0; ) {
1540 w = PyTuple_GET_ITEM(v, oparg);
1541 Py_INCREF(w);
1542 PUSH(w);
1543 }
1544 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001545 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001546 else if (PyList_Check(v)) {
1547 if (PyList_Size(v) != oparg) {
1548 PyErr_SetString(PyExc_ValueError,
1549 "unpack list of wrong size");
1550 why = WHY_EXCEPTION;
1551 }
1552 else {
1553 for (; --oparg >= 0; ) {
1554 w = PyList_GET_ITEM(v, oparg);
1555 Py_INCREF(w);
1556 PUSH(w);
1557 }
1558 }
1559 }
1560 else if (PySequence_Check(v)) {
1561 if (unpack_sequence(v, oparg,
1562 stack_pointer + oparg))
1563 stack_pointer += oparg;
1564 else
1565 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001566 }
1567 else {
Barry Warsawe42b18f1997-08-25 22:13:04 +00001568 PyErr_SetString(PyExc_TypeError,
1569 "unpack non-sequence");
1570 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001571 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001572 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001573 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001574
Guido van Rossum374a9221991-04-04 10:40:29 +00001575 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001576 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001577 v = POP();
1578 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001579 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1580 Py_DECREF(v);
1581 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001582 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001583
Guido van Rossum374a9221991-04-04 10:40:29 +00001584 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001585 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001586 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001587 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1588 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001589 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001590 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001591
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001592 case STORE_GLOBAL:
1593 w = GETNAMEV(oparg);
1594 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001595 err = PyDict_SetItem(f->f_globals, w, v);
1596 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001597 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001598
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001599 case DELETE_GLOBAL:
1600 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001601 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001602 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001603 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001604 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001605
Guido van Rossum374a9221991-04-04 10:40:29 +00001606 case LOAD_CONST:
1607 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001608 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001609 PUSH(x);
1610 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001611
Guido van Rossum374a9221991-04-04 10:40:29 +00001612 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001613 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001614 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001615 PyErr_Format(PyExc_SystemError,
1616 "no locals when loading %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001617 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001618 break;
1619 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001620 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001621 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001622 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001623 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001624 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001625 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001626 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001627 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001628 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001629 break;
1630 }
1631 }
1632 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001633 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001634 PUSH(x);
1635 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001636
Guido van Rossum374a9221991-04-04 10:40:29 +00001637 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001638 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001639 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001640 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001641 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001642 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001643 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001644 PyExc_NameError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001645 GLOBAL_NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001646 break;
1647 }
1648 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001649 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001650 PUSH(x);
1651 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001652
Guido van Rossum9bfef441993-03-29 10:43:31 +00001653 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001654 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001655 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001656 format_exc_check_arg(
1657 PyExc_UnboundLocalError,
1658 UNBOUNDLOCAL_ERROR_MSG,
1659 PyTuple_GetItem(co->co_varnames, oparg)
1660 );
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001661 break;
1662 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001663 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001664 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001665 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001666 break;
1667
1668 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001669 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001670 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001671 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001672
1673 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001674 x = GETLOCAL(oparg);
1675 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001676 format_exc_check_arg(
1677 PyExc_UnboundLocalError,
1678 UNBOUNDLOCAL_ERROR_MSG,
1679 PyTuple_GetItem(co->co_varnames, oparg)
1680 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001681 break;
1682 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001683 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001684 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001685
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001686 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001687 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001688 Py_INCREF(x);
1689 PUSH(x);
1690 break;
1691
1692 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001693 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001694 w = PyCell_Get(x);
Jeremy Hylton2524d692001-02-05 17:23:16 +00001695 if (w == NULL) {
1696 if (oparg < f->f_ncells)
1697 v = PyTuple_GetItem(co->co_cellvars,
1698 oparg);
1699 else
1700 v = PyTuple_GetItem(
1701 co->co_freevars,
1702 oparg - f->f_ncells);
1703
1704 format_exc_check_arg(
1705 PyExc_UnboundLocalError,
1706 UNBOUNDLOCAL_ERROR_MSG,
1707 v);
1708 err = -1;
1709 break;
1710 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001711 PUSH(w);
1712 break;
1713
1714 case STORE_DEREF:
1715 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001716 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001717 PyCell_Set(x, w);
Jeremy Hylton30c9f392001-03-13 01:58:22 +00001718 Py_DECREF(w);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001719 continue;
1720
Guido van Rossum374a9221991-04-04 10:40:29 +00001721 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001722 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001723 if (x != NULL) {
1724 for (; --oparg >= 0;) {
1725 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001726 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001727 }
1728 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001729 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001730 }
1731 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001732
Guido van Rossum374a9221991-04-04 10:40:29 +00001733 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001734 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001735 if (x != NULL) {
1736 for (; --oparg >= 0;) {
1737 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001738 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001739 }
1740 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001741 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001742 }
1743 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001744
Guido van Rossum374a9221991-04-04 10:40:29 +00001745 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001746 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001747 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001748 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001749 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001750
Guido van Rossum374a9221991-04-04 10:40:29 +00001751 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001752 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001753 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001754 x = PyObject_GetAttr(v, w);
1755 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001756 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001757 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001758 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001759
Guido van Rossum374a9221991-04-04 10:40:29 +00001760 case COMPARE_OP:
1761 w = POP();
1762 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001763 if (PyInt_Check(v) && PyInt_Check(w)) {
1764 /* INLINE: cmp(int, int) */
1765 register long a, b;
1766 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001767 a = PyInt_AS_LONG(v);
1768 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001769 switch (oparg) {
1770 case LT: res = a < b; break;
1771 case LE: res = a <= b; break;
1772 case EQ: res = a == b; break;
1773 case NE: res = a != b; break;
1774 case GT: res = a > b; break;
1775 case GE: res = a >= b; break;
1776 case IS: res = v == w; break;
1777 case IS_NOT: res = v != w; break;
1778 default: goto slow_compare;
1779 }
1780 x = res ? Py_True : Py_False;
1781 Py_INCREF(x);
1782 }
1783 else {
1784 slow_compare:
1785 x = cmp_outcome(oparg, v, w);
1786 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001787 Py_DECREF(v);
1788 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001789 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001790 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001791 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001792
Guido van Rossum374a9221991-04-04 10:40:29 +00001793 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001794 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001795 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001796 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001797 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001798 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001799 break;
1800 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001801 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001802 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001803 w,
1804 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001805 f->f_locals == NULL ?
1806 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001807 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001808 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001809 if (w == NULL) {
1810 x = NULL;
1811 break;
1812 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001813 x = PyEval_CallObject(x, w);
1814 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001815 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001816 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001817 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001818
Thomas Wouters52152252000-08-17 22:55:00 +00001819 case IMPORT_STAR:
1820 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001821 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001822 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001823 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001824 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001825 break;
1826 }
Thomas Wouters52152252000-08-17 22:55:00 +00001827 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001828 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001829 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001830 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001831 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001832
Thomas Wouters52152252000-08-17 22:55:00 +00001833 case IMPORT_FROM:
1834 w = GETNAMEV(oparg);
1835 v = TOP();
1836 x = import_from(v, w);
1837 PUSH(x);
1838 if (x != NULL) continue;
1839 break;
1840
Guido van Rossum374a9221991-04-04 10:40:29 +00001841 case JUMP_FORWARD:
1842 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001843 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001844
Guido van Rossum374a9221991-04-04 10:40:29 +00001845 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001846 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001847 if (err > 0)
1848 err = 0;
1849 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001850 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001851 else
1852 break;
1853 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001854
Guido van Rossum374a9221991-04-04 10:40:29 +00001855 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001856 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001857 if (err > 0) {
1858 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001859 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001860 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001861 else if (err == 0)
1862 ;
1863 else
1864 break;
1865 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001866
Guido van Rossum374a9221991-04-04 10:40:29 +00001867 case JUMP_ABSOLUTE:
1868 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001869 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001870
Guido van Rossum374a9221991-04-04 10:40:29 +00001871 case FOR_LOOP:
1872 /* for v in s: ...
1873 On entry: stack contains s, i.
1874 On exit: stack contains s, i+1, s[i];
1875 but if loop exhausted:
1876 s, i are popped, and we jump */
1877 w = POP(); /* Loop index */
1878 v = POP(); /* Sequence object */
1879 u = loop_subscript(v, w);
1880 if (u != NULL) {
1881 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001882 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001883 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001884 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001885 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001886 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001887 }
1888 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001889 Py_DECREF(v);
1890 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001891 /* A NULL can mean "s exhausted"
1892 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001893 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001894 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001895 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001896 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001897 continue;
1898 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001899 }
1900 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001901
Guido van Rossum374a9221991-04-04 10:40:29 +00001902 case SETUP_LOOP:
1903 case SETUP_EXCEPT:
1904 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001905 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001906 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001907 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001908
Guido van Rossum374a9221991-04-04 10:40:29 +00001909 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001910#ifdef LLTRACE
1911 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001912 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001913#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001914 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001915 if (f->f_trace == NULL)
1916 continue;
1917 /* Trace each line of code reached */
1918 f->f_lasti = INSTR_OFFSET();
1919 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossumb209a111997-04-29 18:18:01 +00001920 f, "line", Py_None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001921 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001922
1923 case CALL_FUNCTION:
Jeremy Hylton52820442001-01-03 23:52:36 +00001924 {
1925 int na = oparg & 0xff;
1926 int nk = (oparg>>8) & 0xff;
1927 int n = na + 2 * nk;
1928 PyObject **pfunc = stack_pointer - n - 1;
1929 PyObject *func = *pfunc;
1930 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1931
1932 /* Always dispatch PyCFunction first, because
1933 these are presumed to be the most frequent
1934 callable object.
1935 */
1936 if (PyCFunction_Check(func)) {
1937 if (PyCFunction_GET_FLAGS(func) == 0) {
1938 x = fast_cfunction(func,
Guido van Rossumac7be682001-01-17 15:42:30 +00001939 &stack_pointer, na);
Jeremy Hylton52820442001-01-03 23:52:36 +00001940 } else {
1941 x = do_call(func, &stack_pointer,
1942 na, nk);
1943 }
1944 } else {
Guido van Rossumac7be682001-01-17 15:42:30 +00001945 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001946 && PyMethod_GET_SELF(func) != NULL) {
1947 /* optimize access to bound methods */
1948 PyObject *self = PyMethod_GET_SELF(func);
1949 Py_INCREF(self);
1950 func = PyMethod_GET_FUNCTION(func);
1951 Py_INCREF(func);
1952 Py_DECREF(*pfunc);
1953 *pfunc = self;
1954 na++;
1955 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00001956 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00001957 Py_INCREF(func);
1958 if (PyFunction_Check(func)) {
1959 x = fast_function(func, &stack_pointer,
Guido van Rossumac7be682001-01-17 15:42:30 +00001960 n, na, nk);
Jeremy Hylton52820442001-01-03 23:52:36 +00001961 } else {
1962 x = do_call(func, &stack_pointer,
1963 na, nk);
1964 }
1965 Py_DECREF(func);
1966 }
1967
1968 while (stack_pointer > pfunc) {
1969 w = POP();
1970 Py_DECREF(w);
1971 }
1972 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00001973 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00001974 continue;
1975 break;
1976 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001977
Jeremy Hylton76901512000-03-28 23:49:17 +00001978 case CALL_FUNCTION_VAR:
1979 case CALL_FUNCTION_KW:
1980 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001981 {
Jeremy Hylton76901512000-03-28 23:49:17 +00001982 int na = oparg & 0xff;
1983 int nk = (oparg>>8) & 0xff;
1984 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00001985 int n = na + 2 * nk;
1986 PyObject **pfunc, *func;
1987 if (flags & CALL_FLAG_VAR)
1988 n++;
1989 if (flags & CALL_FLAG_KW)
1990 n++;
1991 pfunc = stack_pointer - n - 1;
1992 func = *pfunc;
Jeremy Hylton76901512000-03-28 23:49:17 +00001993 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Jeremy Hylton52820442001-01-03 23:52:36 +00001994
Guido van Rossumac7be682001-01-17 15:42:30 +00001995 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001996 && PyMethod_GET_SELF(func) != NULL) {
1997 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00001998 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00001999 func = PyMethod_GET_FUNCTION(func);
2000 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002001 Py_DECREF(*pfunc);
2002 *pfunc = self;
2003 na++;
2004 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00002005 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00002006 Py_INCREF(func);
2007 x = ext_do_call(func, &stack_pointer, flags, na, nk);
Jeremy Hylton76901512000-03-28 23:49:17 +00002008 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002009
Jeremy Hylton76901512000-03-28 23:49:17 +00002010 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00002011 w = POP();
2012 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00002013 }
2014 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002015 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002016 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00002017 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002018 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002019
Guido van Rossum681d79a1995-07-18 14:51:37 +00002020 case MAKE_FUNCTION:
2021 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00002022 x = PyFunction_New(v, f->f_globals);
2023 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002024 /* XXX Maybe this should be a separate opcode? */
2025 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002026 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002027 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002028 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002029 x = NULL;
2030 break;
2031 }
2032 while (--oparg >= 0) {
2033 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002034 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002035 }
2036 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00002037 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002038 }
2039 PUSH(x);
2040 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002041
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002042 case MAKE_CLOSURE:
2043 {
2044 int nfree;
2045 v = POP(); /* code object */
2046 x = PyFunction_New(v, f->f_globals);
2047 nfree = PyTuple_GET_SIZE(((PyCodeObject *)v)->co_freevars);
2048 Py_DECREF(v);
2049 /* XXX Maybe this should be a separate opcode? */
2050 if (x != NULL && nfree > 0) {
2051 v = PyTuple_New(nfree);
2052 if (v == NULL) {
2053 Py_DECREF(x);
2054 x = NULL;
2055 break;
2056 }
2057 while (--nfree >= 0) {
2058 w = POP();
2059 PyTuple_SET_ITEM(v, nfree, w);
2060 }
2061 err = PyFunction_SetClosure(x, v);
2062 Py_DECREF(v);
2063 }
2064 if (x != NULL && oparg > 0) {
2065 v = PyTuple_New(oparg);
2066 if (v == NULL) {
2067 Py_DECREF(x);
2068 x = NULL;
2069 break;
2070 }
2071 while (--oparg >= 0) {
2072 w = POP();
2073 PyTuple_SET_ITEM(v, oparg, w);
2074 }
2075 err = PyFunction_SetDefaults(x, v);
2076 Py_DECREF(v);
2077 }
2078 PUSH(x);
2079 break;
2080 }
2081
Guido van Rossum8861b741996-07-30 16:49:37 +00002082 case BUILD_SLICE:
2083 if (oparg == 3)
2084 w = POP();
2085 else
2086 w = NULL;
2087 v = POP();
2088 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002089 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002090 Py_DECREF(u);
2091 Py_DECREF(v);
2092 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00002093 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002094 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002095 break;
2096
Fred Drakeef8ace32000-08-24 00:32:09 +00002097 case EXTENDED_ARG:
2098 opcode = NEXTOP();
2099 oparg = oparg<<16 | NEXTARG();
2100 goto dispatch_opcode;
2101 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002102
Guido van Rossum374a9221991-04-04 10:40:29 +00002103 default:
2104 fprintf(stderr,
2105 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00002106 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002107 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002108 why = WHY_EXCEPTION;
2109 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002110
2111#ifdef CASE_TOO_BIG
2112 }
2113#endif
2114
Guido van Rossum374a9221991-04-04 10:40:29 +00002115 } /* switch */
2116
2117 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002118
Guido van Rossum374a9221991-04-04 10:40:29 +00002119 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002120
Guido van Rossum374a9221991-04-04 10:40:29 +00002121 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002122 if (err == 0 && x != NULL) {
2123#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002124 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002125 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002126 fprintf(stderr,
2127 "XXX undetected error\n");
2128 else
2129#endif
2130 continue; /* Normal, fast path */
2131 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002132 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002133 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002134 err = 0;
2135 }
2136
Guido van Rossum374a9221991-04-04 10:40:29 +00002137 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002138
Guido van Rossum374a9221991-04-04 10:40:29 +00002139 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002140 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002141 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002142 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002143 why = WHY_EXCEPTION;
2144 }
2145 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002146#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002147 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002148 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002149 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002150 fprintf(stderr,
2151 "XXX undetected error (why=%d)\n",
2152 why);
2153 why = WHY_EXCEPTION;
2154 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002155 }
2156#endif
2157
2158 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002159
Guido van Rossum374a9221991-04-04 10:40:29 +00002160 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002161 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00002162 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00002163 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00002164 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002165
Guido van Rossume59214e1994-08-30 08:01:59 +00002166 if (f->f_trace)
2167 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002168 if (tstate->sys_profilefunc)
2169 call_exc_trace(&tstate->sys_profilefunc,
2170 (PyObject**)0, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002171 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002172
Guido van Rossum374a9221991-04-04 10:40:29 +00002173 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002174
Guido van Rossum374a9221991-04-04 10:40:29 +00002175 if (why == WHY_RERAISE)
2176 why = WHY_EXCEPTION;
2177
2178 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002179
Guido van Rossum374a9221991-04-04 10:40:29 +00002180 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002181 PyTryBlock *b = PyFrame_BlockPop(f);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002182
2183 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2184 /* For a continue inside a try block,
2185 don't pop the block for the loop. */
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00002186 PyFrame_BlockSetup(f, b->b_type, b->b_level,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002187 b->b_handler);
2188 why = WHY_NOT;
2189 JUMPTO(PyInt_AS_LONG(retval));
2190 Py_DECREF(retval);
2191 break;
2192 }
2193
Guido van Rossum374a9221991-04-04 10:40:29 +00002194 while (STACK_LEVEL() > b->b_level) {
2195 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002196 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002197 }
2198 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2199 why = WHY_NOT;
2200 JUMPTO(b->b_handler);
2201 break;
2202 }
2203 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002204 (b->b_type == SETUP_EXCEPT &&
2205 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002206 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002207 PyObject *exc, *val, *tb;
2208 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002209 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002210 val = Py_None;
2211 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002212 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002213 /* Make the raw exception data
2214 available to the handler,
2215 so a program can emulate the
2216 Python main loop. Don't do
2217 this for 'finally'. */
2218 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002219 PyErr_NormalizeException(
2220 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002221 set_exc_info(tstate,
2222 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002223 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002224 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002225 PUSH(val);
2226 PUSH(exc);
2227 }
2228 else {
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002229 if (why == WHY_RETURN ||
2230 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00002231 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002232 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002233 PUSH(v);
2234 }
2235 why = WHY_NOT;
2236 JUMPTO(b->b_handler);
2237 break;
2238 }
2239 } /* unwind stack */
2240
2241 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002242
Guido van Rossum374a9221991-04-04 10:40:29 +00002243 if (why != WHY_NOT)
2244 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002245
Guido van Rossum374a9221991-04-04 10:40:29 +00002246 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002247
Guido van Rossum374a9221991-04-04 10:40:29 +00002248 /* Pop remaining stack entries */
Guido van Rossumac7be682001-01-17 15:42:30 +00002249
Guido van Rossum374a9221991-04-04 10:40:29 +00002250 while (!EMPTY()) {
2251 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002252 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002253 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002254
Guido van Rossum96a42c81992-01-12 02:29:51 +00002255 if (why != WHY_RETURN)
2256 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002257
Guido van Rossume59214e1994-08-30 08:01:59 +00002258 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002259 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00002260 if (call_trace(&f->f_trace, &f->f_trace, f,
2261 "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002262 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002263 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002264 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002265 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002266 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002267 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002268
Guido van Rossuma027efa1997-05-05 20:56:21 +00002269 if (tstate->sys_profilefunc && why == WHY_RETURN) {
2270 if (call_trace(&tstate->sys_profilefunc, (PyObject**)0,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002271 f, "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002272 Py_XDECREF(retval);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002273 retval = NULL;
2274 why = WHY_EXCEPTION;
2275 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002276 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002277
Guido van Rossuma027efa1997-05-05 20:56:21 +00002278 reset_exc_info(tstate);
2279
2280 --tstate->recursion_depth;
Guido van Rossum8c5df061997-01-24 04:19:24 +00002281
2282 fail: /* Jump here from prelude on failure */
Guido van Rossumac7be682001-01-17 15:42:30 +00002283
Guido van Rossum374a9221991-04-04 10:40:29 +00002284 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00002285
Guido van Rossuma027efa1997-05-05 20:56:21 +00002286 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +00002287 Py_DECREF(f);
Guido van Rossumac7be682001-01-17 15:42:30 +00002288
Guido van Rossum96a42c81992-01-12 02:29:51 +00002289 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002290}
2291
Guido van Rossuma027efa1997-05-05 20:56:21 +00002292static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002293set_exc_info(PyThreadState *tstate,
2294 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002295{
2296 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002297 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002298
Guido van Rossuma027efa1997-05-05 20:56:21 +00002299 frame = tstate->frame;
2300 if (frame->f_exc_type == NULL) {
2301 /* This frame didn't catch an exception before */
2302 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002303 if (tstate->exc_type == NULL) {
2304 Py_INCREF(Py_None);
2305 tstate->exc_type = Py_None;
2306 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002307 tmp_type = frame->f_exc_type;
2308 tmp_value = frame->f_exc_value;
2309 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002310 Py_XINCREF(tstate->exc_type);
2311 Py_XINCREF(tstate->exc_value);
2312 Py_XINCREF(tstate->exc_traceback);
2313 frame->f_exc_type = tstate->exc_type;
2314 frame->f_exc_value = tstate->exc_value;
2315 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002316 Py_XDECREF(tmp_type);
2317 Py_XDECREF(tmp_value);
2318 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002319 }
2320 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002321 tmp_type = tstate->exc_type;
2322 tmp_value = tstate->exc_value;
2323 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002324 Py_XINCREF(type);
2325 Py_XINCREF(value);
2326 Py_XINCREF(tb);
2327 tstate->exc_type = type;
2328 tstate->exc_value = value;
2329 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002330 Py_XDECREF(tmp_type);
2331 Py_XDECREF(tmp_value);
2332 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002333 /* For b/w compatibility */
2334 PySys_SetObject("exc_type", type);
2335 PySys_SetObject("exc_value", value);
2336 PySys_SetObject("exc_traceback", tb);
2337}
2338
2339static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002340reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002341{
2342 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002343 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002344 frame = tstate->frame;
2345 if (frame->f_exc_type != NULL) {
2346 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002347 tmp_type = tstate->exc_type;
2348 tmp_value = tstate->exc_value;
2349 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002350 Py_XINCREF(frame->f_exc_type);
2351 Py_XINCREF(frame->f_exc_value);
2352 Py_XINCREF(frame->f_exc_traceback);
2353 tstate->exc_type = frame->f_exc_type;
2354 tstate->exc_value = frame->f_exc_value;
2355 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002356 Py_XDECREF(tmp_type);
2357 Py_XDECREF(tmp_value);
2358 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002359 /* For b/w compatibility */
2360 PySys_SetObject("exc_type", frame->f_exc_type);
2361 PySys_SetObject("exc_value", frame->f_exc_value);
2362 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2363 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002364 tmp_type = frame->f_exc_type;
2365 tmp_value = frame->f_exc_value;
2366 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002367 frame->f_exc_type = NULL;
2368 frame->f_exc_value = NULL;
2369 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002370 Py_XDECREF(tmp_type);
2371 Py_XDECREF(tmp_value);
2372 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002373}
2374
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002375/* Logic for the raise statement (too complicated for inlining).
2376 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002377static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002378do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002379{
Guido van Rossumd295f121998-04-09 21:39:57 +00002380 if (type == NULL) {
2381 /* Reraise */
2382 PyThreadState *tstate = PyThreadState_Get();
2383 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2384 value = tstate->exc_value;
2385 tb = tstate->exc_traceback;
2386 Py_XINCREF(type);
2387 Py_XINCREF(value);
2388 Py_XINCREF(tb);
2389 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002390
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002391 /* We support the following forms of raise:
2392 raise <class>, <classinstance>
2393 raise <class>, <argument tuple>
2394 raise <class>, None
2395 raise <class>, <argument>
2396 raise <classinstance>, None
2397 raise <string>, <object>
2398 raise <string>, None
2399
2400 An omitted second argument is the same as None.
2401
2402 In addition, raise <tuple>, <anything> is the same as
2403 raising the tuple's first item (and it better have one!);
2404 this rule is applied recursively.
2405
2406 Finally, an optional third argument can be supplied, which
2407 gives the traceback to be substituted (useful when
2408 re-raising an exception after examining it). */
2409
2410 /* First, check the traceback argument, replacing None with
2411 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002412 if (tb == Py_None) {
2413 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002414 tb = NULL;
2415 }
2416 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002417 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002418 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002419 goto raise_error;
2420 }
2421
2422 /* Next, replace a missing value with None */
2423 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002424 value = Py_None;
2425 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002426 }
2427
2428 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002429 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2430 PyObject *tmp = type;
2431 type = PyTuple_GET_ITEM(type, 0);
2432 Py_INCREF(type);
2433 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002434 }
2435
Barry Warsaw4249f541997-08-22 21:26:19 +00002436 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002437 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002438
2439 else if (PyClass_Check(type))
2440 PyErr_NormalizeException(&type, &value, &tb);
2441
Guido van Rossumb209a111997-04-29 18:18:01 +00002442 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002443 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002444 if (value != Py_None) {
2445 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002446 "instance exception may not have a separate value");
2447 goto raise_error;
2448 }
2449 else {
2450 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002451 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002452 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002453 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2454 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002455 }
2456 }
2457 else {
2458 /* Not something you can raise. You get an exception
2459 anyway, just not what you specified :-) */
Guido van Rossumb209a111997-04-29 18:18:01 +00002460 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002461 "exceptions must be strings, classes, or instances");
2462 goto raise_error;
2463 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002464 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002465 if (tb == NULL)
2466 return WHY_EXCEPTION;
2467 else
2468 return WHY_RERAISE;
2469 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002470 Py_XDECREF(value);
2471 Py_XDECREF(type);
2472 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002473 return WHY_EXCEPTION;
2474}
2475
Barry Warsawe42b18f1997-08-25 22:13:04 +00002476static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002477unpack_sequence(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002478{
2479 int i;
2480 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00002481
Barry Warsawe42b18f1997-08-25 22:13:04 +00002482 for (i = 0; i < argcnt; i++) {
2483 if (! (w = PySequence_GetItem(v, i))) {
2484 if (PyErr_ExceptionMatches(PyExc_IndexError))
2485 PyErr_SetString(PyExc_ValueError,
2486 "unpack sequence of wrong size");
2487 goto finally;
2488 }
2489 *--sp = w;
2490 }
2491 /* we better get an IndexError now */
2492 if (PySequence_GetItem(v, i) == NULL) {
2493 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2494 PyErr_Clear();
2495 return 1;
2496 }
2497 /* some other exception occurred. fall through to finally */
2498 }
2499 else
2500 PyErr_SetString(PyExc_ValueError,
2501 "unpack sequence of wrong size");
2502 /* fall through */
2503finally:
Barry Warsaw91010551997-08-25 22:30:51 +00002504 for (; i > 0; i--, sp++)
2505 Py_DECREF(*sp);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002506
2507 return 0;
2508}
2509
2510
Guido van Rossum96a42c81992-01-12 02:29:51 +00002511#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002512static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002513prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002514{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002515 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002516 if (PyObject_Print(v, stdout, 0) != 0)
2517 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002518 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002519 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002520}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002521#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002522
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002523static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002524call_exc_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002525{
Guido van Rossumb209a111997-04-29 18:18:01 +00002526 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002527 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002528 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002529 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002530 value = Py_None;
2531 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002532 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002533 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002534 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002535 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002536 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002537 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002538 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002539 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002540 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002541 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002542 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002543 Py_XDECREF(type);
2544 Py_XDECREF(value);
2545 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002546 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002547}
2548
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002549/* PyObject **p_trace: in/out; may not be NULL;
2550 may not point to NULL variable initially
2551 PyObject **p_newtrace: in/out; may be NULL;
2552 may point to NULL variable;
2553 may be same variable as p_newtrace */
2554
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002555static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002556call_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f,
2557 char *msg, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002558{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002559 PyThreadState *tstate = f->f_tstate;
Guido van Rossumb209a111997-04-29 18:18:01 +00002560 PyObject *args, *what;
2561 PyObject *res = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002562
Guido van Rossuma027efa1997-05-05 20:56:21 +00002563 if (tstate->tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002564 /* Don't do recursive traces */
2565 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002566 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002567 *p_newtrace = NULL;
2568 }
2569 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002570 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002571
Guido van Rossumb209a111997-04-29 18:18:01 +00002572 args = PyTuple_New(3);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002573 if (args == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002574 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002575 what = PyString_FromString(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002576 if (what == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002577 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002578 Py_INCREF(f);
2579 PyTuple_SET_ITEM(args, 0, (PyObject *)f);
2580 PyTuple_SET_ITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002581 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002582 arg = Py_None;
2583 Py_INCREF(arg);
2584 PyTuple_SET_ITEM(args, 2, arg);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002585 tstate->tracing++;
Guido van Rossumb209a111997-04-29 18:18:01 +00002586 PyFrame_FastToLocals(f);
2587 res = PyEval_CallObject(*p_trace, args); /* May clear *p_trace! */
2588 PyFrame_LocalsToFast(f, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002589 tstate->tracing--;
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002590 cleanup:
Guido van Rossumb209a111997-04-29 18:18:01 +00002591 Py_XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002592 if (res == NULL) {
2593 /* The trace proc raised an exception */
Guido van Rossumb209a111997-04-29 18:18:01 +00002594 PyTraceBack_Here(f);
2595 Py_XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002596 *p_trace = NULL;
2597 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002598 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002599 *p_newtrace = NULL;
2600 }
Barry Warsawf6202631999-09-08 16:26:33 +00002601 /* to be extra double plus sure we don't get recursive
2602 * calls inf either tracefunc or profilefunc gets an
2603 * exception, zap the global variables.
2604 */
2605 Py_XDECREF(tstate->sys_tracefunc);
2606 tstate->sys_tracefunc = NULL;
2607 Py_XDECREF(tstate->sys_profilefunc);
2608 tstate->sys_profilefunc = NULL;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002609 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002610 }
2611 else {
2612 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002613 Py_XDECREF(*p_newtrace);
2614 if (res == Py_None)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002615 *p_newtrace = NULL;
2616 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002617 Py_INCREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002618 *p_newtrace = res;
2619 }
2620 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002621 Py_DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002622 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002623 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002624}
2625
Guido van Rossumb209a111997-04-29 18:18:01 +00002626PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002627PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002628{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002629 PyThreadState *tstate = PyThreadState_Get();
2630 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002631 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002632 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002633 else
2634 return current_frame->f_builtins;
2635}
2636
Guido van Rossumb209a111997-04-29 18:18:01 +00002637PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002638PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002639{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002640 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002641 if (current_frame == NULL)
2642 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002643 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002644 return current_frame->f_locals;
2645}
2646
Guido van Rossumb209a111997-04-29 18:18:01 +00002647PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002648PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002649{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002650 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002651 if (current_frame == NULL)
2652 return NULL;
2653 else
2654 return current_frame->f_globals;
2655}
2656
Guido van Rossumb209a111997-04-29 18:18:01 +00002657PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002658PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002659{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002660 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002661 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002662}
2663
Guido van Rossum6135a871995-01-09 17:53:26 +00002664int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002665PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002666{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002667 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002668 return current_frame == NULL ? 0 : current_frame->f_restricted;
2669}
2670
Guido van Rossumbe270261997-05-22 22:26:18 +00002671int
Jeremy Hylton061d1062001-03-22 02:32:48 +00002672PyEval_GetNestedScopes(void)
2673{
2674 PyFrameObject *current_frame = PyThreadState_Get()->frame;
2675 return current_frame == NULL ? 0 :
2676 current_frame->f_code->co_flags & CO_NESTED;
2677}
2678
2679int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002680Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002681{
Guido van Rossumb209a111997-04-29 18:18:01 +00002682 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002683 if (f == NULL)
2684 return 0;
2685 if (!PyFile_SoftSpace(f, 0))
2686 return 0;
2687 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002688}
2689
Guido van Rossum3f5da241990-12-20 15:06:42 +00002690
Guido van Rossum681d79a1995-07-18 14:51:37 +00002691/* External interface to call any callable object.
2692 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002693
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002694#undef PyEval_CallObject
2695/* for backward compatibility: export this interface */
2696
Guido van Rossumb209a111997-04-29 18:18:01 +00002697PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002698PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002699{
Guido van Rossumb209a111997-04-29 18:18:01 +00002700 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002701}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002702#define PyEval_CallObject(func,arg) \
2703 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002704
Guido van Rossumb209a111997-04-29 18:18:01 +00002705PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002706PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002707{
Jeremy Hylton52820442001-01-03 23:52:36 +00002708 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002709
2710 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002711 arg = PyTuple_New(0);
2712 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002713 PyErr_SetString(PyExc_TypeError,
2714 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002715 return NULL;
2716 }
2717 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002718 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002719
Guido van Rossumb209a111997-04-29 18:18:01 +00002720 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002721 PyErr_SetString(PyExc_TypeError,
2722 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00002723 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002724 return NULL;
2725 }
2726
Jeremy Hylton52820442001-01-03 23:52:36 +00002727 result = call_object(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002728 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00002729 return result;
2730}
2731
2732/* How often is each kind of object called? The answer depends on the
2733 program. An instrumented call_object() was used to run the Python
2734 regression test suite. The results were:
2735 4200000 PyCFunctions
2736 390000 fast_function() calls
2737 94000 other functions
2738 480000 all functions (sum of prev two)
2739 150000 methods
2740 100000 classes
2741
2742 Tests on other bodies of code show that PyCFunctions are still
2743 most common, but not by such a large margin.
2744*/
2745
Jeremy Hylton512a2372001-04-11 13:52:29 +00002746static char *
2747get_func_name(PyObject *func)
2748{
2749 if (PyMethod_Check(func))
2750 return get_func_name(PyMethod_GET_FUNCTION(func));
2751 else if (PyFunction_Check(func))
2752 return PyString_AsString(((PyFunctionObject*)func)->func_name);
2753 else if (PyCFunction_Check(func))
2754 return ((PyCFunctionObject*)func)->m_ml->ml_name;
2755 else if (PyClass_Check(func))
2756 return PyString_AsString(((PyClassObject*)func)->cl_name);
2757 else if (PyInstance_Check(func)) {
2758 return PyString_AsString(
2759 ((PyInstanceObject*)func)->in_class->cl_name);
2760 } else {
2761 return func->ob_type->tp_name;
2762 }
2763}
2764
2765static char *
2766get_func_desc(PyObject *func)
2767{
2768 if (PyMethod_Check(func))
2769 return "()";
2770 else if (PyFunction_Check(func))
2771 return "()";
2772 else if (PyCFunction_Check(func))
2773 return "()";
2774 else if (PyClass_Check(func))
2775 return " constructor";
2776 else if (PyInstance_Check(func)) {
2777 return " instance";
2778 } else {
2779 return " object";
2780 }
2781}
2782
Jeremy Hylton52820442001-01-03 23:52:36 +00002783static PyObject *
2784call_object(PyObject *func, PyObject *arg, PyObject *kw)
2785{
2786 ternaryfunc call;
2787 PyObject *result;
2788
2789 if (PyMethod_Check(func))
2790 result = call_method(func, arg, kw);
2791 else if (PyFunction_Check(func))
2792 result = call_eval_code2(func, arg, kw);
2793 else if (PyCFunction_Check(func))
2794 result = call_cfunction(func, arg, kw);
2795 else if (PyClass_Check(func))
2796 result = PyInstance_New(func, arg, kw);
2797 else if (PyInstance_Check(func))
2798 result = call_instance(func, arg, kw);
2799 else if ((call = func->ob_type->tp_call) != NULL)
2800 result = (*call)(func, arg, kw);
2801 else {
2802 PyErr_Format(PyExc_TypeError, "object is not callable: %s",
2803 PyString_AS_STRING(PyObject_Repr(func)));
2804 return NULL;
2805 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002806 if (result == NULL && !PyErr_Occurred())
2807 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002808 "NULL result without error in call_object");
Guido van Rossumac7be682001-01-17 15:42:30 +00002809
Guido van Rossume59214e1994-08-30 08:01:59 +00002810 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002811}
2812
Guido van Rossumb209a111997-04-29 18:18:01 +00002813static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00002814call_cfunction(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002815{
Jeremy Hylton52820442001-01-03 23:52:36 +00002816 PyCFunctionObject* f = (PyCFunctionObject*)func;
2817 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
2818 PyObject *self = PyCFunction_GET_SELF(func);
2819 int flags = PyCFunction_GET_FLAGS(func);
2820
Jeremy Hylton52820442001-01-03 23:52:36 +00002821 if (flags & METH_KEYWORDS) {
2822 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002823 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002824 if (kw != NULL && PyDict_Size(kw) != 0) {
2825 PyErr_Format(PyExc_TypeError,
2826 "%.200s() takes no keyword arguments",
2827 f->m_ml->ml_name);
2828 return NULL;
2829 }
Fred Drake1a7aab72001-01-04 22:33:02 +00002830 if (flags & METH_VARARGS) {
2831 return (*meth)(self, arg);
2832 }
2833 if (!(flags & METH_VARARGS)) {
2834 /* the really old style */
2835 int size = PyTuple_GET_SIZE(arg);
2836 if (size == 1)
2837 arg = PyTuple_GET_ITEM(arg, 0);
2838 else if (size == 0)
2839 arg = NULL;
2840 return (*meth)(self, arg);
2841 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002842 /* should never get here ??? */
2843 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002844 return NULL;
2845}
2846
Guido van Rossumb209a111997-04-29 18:18:01 +00002847static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00002848call_instance(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002849{
Jeremy Hylton52820442001-01-03 23:52:36 +00002850 PyObject *res, *call = PyObject_GetAttrString(func, "__call__");
2851 if (call == NULL) {
2852 PyInstanceObject *inst = (PyInstanceObject*) func;
2853 PyErr_Clear();
2854 PyErr_Format(PyExc_AttributeError,
2855 "%.200s instance has no __call__ method",
2856 PyString_AsString(inst->in_class->cl_name));
Guido van Rossum681d79a1995-07-18 14:51:37 +00002857 return NULL;
2858 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002859 res = call_object(call, arg, kw);
2860 Py_DECREF(call);
2861 return res;
2862}
2863
2864static PyObject *
2865call_method(PyObject *func, PyObject *arg, PyObject *kw)
2866{
2867 PyObject *self = PyMethod_GET_SELF(func);
2868 PyObject *class = PyMethod_GET_CLASS(func);
2869 PyObject *result;
2870
2871 func = PyMethod_GET_FUNCTION(func);
2872 if (self == NULL) {
2873 /* Unbound methods must be called with an instance of
2874 the class (or a derived class) as first argument */
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00002875 int ok;
Jeremy Hylton52820442001-01-03 23:52:36 +00002876 if (PyTuple_Size(arg) >= 1)
2877 self = PyTuple_GET_ITEM(arg, 0);
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00002878 if (self == NULL)
2879 ok = 0;
2880 else {
2881 ok = PyObject_IsInstance(self, class);
2882 if (ok < 0)
2883 return NULL;
2884 }
2885 if (!ok) {
2886 PyObject* fn = ((PyFunctionObject*) func)->func_name;
2887 PyErr_Format(PyExc_TypeError,
2888 "unbound method %s%smust be "
2889 "called with instance as first argument",
2890 fn ? PyString_AsString(fn) : "",
2891 fn ? "() " : "");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002892 return NULL;
2893 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002894 Py_INCREF(arg);
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00002895 }
2896 else {
Jeremy Hylton52820442001-01-03 23:52:36 +00002897 int argcount = PyTuple_Size(arg);
2898 PyObject *newarg = PyTuple_New(argcount + 1);
2899 int i;
2900 if (newarg == NULL)
2901 return NULL;
2902 Py_INCREF(self);
2903 PyTuple_SET_ITEM(newarg, 0, self);
2904 for (i = 0; i < argcount; i++) {
2905 PyObject *v = PyTuple_GET_ITEM(arg, i);
2906 Py_XINCREF(v);
2907 PyTuple_SET_ITEM(newarg, i+1, v);
2908 }
2909 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002910 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002911 result = call_object(func, arg, kw);
2912 Py_DECREF(arg);
2913 return result;
2914}
2915
2916static PyObject *
2917call_eval_code2(PyObject *func, PyObject *arg, PyObject *kw)
2918{
2919 PyObject *result;
2920 PyObject *argdefs;
2921 PyObject **d, **k;
2922 int nk, nd;
2923
2924 argdefs = PyFunction_GET_DEFAULTS(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00002925 if (argdefs != NULL && PyTuple_Check(argdefs)) {
2926 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
2927 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002928 }
2929 else {
2930 d = NULL;
2931 nd = 0;
2932 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002933
Guido van Rossum681d79a1995-07-18 14:51:37 +00002934 if (kw != NULL) {
2935 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002936 nk = PyDict_Size(kw);
2937 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002938 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002939 PyErr_NoMemory();
2940 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002941 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002942 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002943 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002944 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002945 i += 2;
2946 nk = i/2;
2947 /* XXX This is broken if the caller deletes dict items! */
2948 }
2949 else {
2950 k = NULL;
2951 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002952 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002953
Guido van Rossum681d79a1995-07-18 14:51:37 +00002954 result = eval_code2(
Jeremy Hylton52820442001-01-03 23:52:36 +00002955 (PyCodeObject *)PyFunction_GET_CODE(func),
2956 PyFunction_GET_GLOBALS(func), (PyObject *)NULL,
Guido van Rossumb209a111997-04-29 18:18:01 +00002957 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002958 k, nk, d, nd,
2959 PyFunction_GET_CLOSURE(func));
Guido van Rossumac7be682001-01-17 15:42:30 +00002960
Guido van Rossumb18618d2000-05-03 23:44:39 +00002961 if (k != NULL)
2962 PyMem_DEL(k);
Guido van Rossumac7be682001-01-17 15:42:30 +00002963
Guido van Rossum681d79a1995-07-18 14:51:37 +00002964 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002965}
2966
Jeremy Hylton52820442001-01-03 23:52:36 +00002967#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
2968
2969/* The two fast_xxx() functions optimize calls for which no argument
2970 tuple is necessary; the objects are passed directly from the stack.
2971 fast_cfunction() is called for METH_OLDARGS functions.
2972 fast_function() is for functions with no special argument handling.
2973*/
2974
2975static PyObject *
2976fast_cfunction(PyObject *func, PyObject ***pp_stack, int na)
2977{
2978 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
2979 PyObject *self = PyCFunction_GET_SELF(func);
2980
2981 if (na == 0)
2982 return (*meth)(self, NULL);
Charles G. Waldmaneec72a72001-01-10 22:11:59 +00002983 else if (na == 1) {
2984 PyObject *arg = EXT_POP(*pp_stack);
Guido van Rossumac7be682001-01-17 15:42:30 +00002985 PyObject *result = (*meth)(self, arg);
Charles G. Waldmaneec72a72001-01-10 22:11:59 +00002986 Py_DECREF(arg);
2987 return result;
2988 } else {
Jeremy Hylton52820442001-01-03 23:52:36 +00002989 PyObject *args = load_args(pp_stack, na);
2990 PyObject *result = (*meth)(self, args);
2991 Py_DECREF(args);
2992 return result;
2993 }
2994}
2995
2996static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00002997fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00002998{
2999 PyObject *co = PyFunction_GET_CODE(func);
3000 PyObject *globals = PyFunction_GET_GLOBALS(func);
3001 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003002 PyObject *closure = PyFunction_GET_CLOSURE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003003 PyObject **d = NULL;
3004 int nd = 0;
3005
3006 if (argdefs != NULL) {
3007 d = &PyTuple_GET_ITEM(argdefs, 0);
3008 nd = ((PyTupleObject *)argdefs)->ob_size;
3009 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003010 return eval_code2((PyCodeObject *)co, globals,
Jeremy Hylton52820442001-01-03 23:52:36 +00003011 (PyObject *)NULL, (*pp_stack)-n, na,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003012 (*pp_stack)-2*nk, nk, d, nd,
3013 closure);
Jeremy Hylton52820442001-01-03 23:52:36 +00003014}
3015
3016static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00003017update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
3018 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00003019{
3020 PyObject *kwdict = NULL;
3021 if (orig_kwdict == NULL)
3022 kwdict = PyDict_New();
3023 else {
3024 kwdict = PyDict_Copy(orig_kwdict);
3025 Py_DECREF(orig_kwdict);
3026 }
3027 if (kwdict == NULL)
3028 return NULL;
3029 while (--nk >= 0) {
3030 int err;
3031 PyObject *value = EXT_POP(*pp_stack);
3032 PyObject *key = EXT_POP(*pp_stack);
3033 if (PyDict_GetItem(kwdict, key) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +00003034 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00003035 "%.200s%s got multiple values "
Jeremy Hylton512a2372001-04-11 13:52:29 +00003036 "for keyword argument '%.200s'",
3037 get_func_name(func),
3038 get_func_desc(func),
3039 PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00003040 Py_DECREF(key);
3041 Py_DECREF(value);
3042 Py_DECREF(kwdict);
3043 return NULL;
3044 }
3045 err = PyDict_SetItem(kwdict, key, value);
3046 Py_DECREF(key);
3047 Py_DECREF(value);
3048 if (err) {
3049 Py_DECREF(kwdict);
3050 return NULL;
3051 }
3052 }
3053 return kwdict;
3054}
3055
3056static PyObject *
3057update_star_args(int nstack, int nstar, PyObject *stararg,
3058 PyObject ***pp_stack)
3059{
3060 PyObject *callargs, *w;
3061
3062 callargs = PyTuple_New(nstack + nstar);
3063 if (callargs == NULL) {
3064 return NULL;
3065 }
3066 if (nstar) {
3067 int i;
3068 for (i = 0; i < nstar; i++) {
3069 PyObject *a = PyTuple_GET_ITEM(stararg, i);
3070 Py_INCREF(a);
3071 PyTuple_SET_ITEM(callargs, nstack + i, a);
3072 }
3073 }
3074 while (--nstack >= 0) {
3075 w = EXT_POP(*pp_stack);
3076 PyTuple_SET_ITEM(callargs, nstack, w);
3077 }
3078 return callargs;
3079}
3080
3081static PyObject *
3082load_args(PyObject ***pp_stack, int na)
3083{
3084 PyObject *args = PyTuple_New(na);
3085 PyObject *w;
3086
3087 if (args == NULL)
3088 return NULL;
3089 while (--na >= 0) {
3090 w = EXT_POP(*pp_stack);
3091 PyTuple_SET_ITEM(args, na, w);
3092 }
3093 return args;
3094}
3095
3096static PyObject *
3097do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
3098{
3099 PyObject *callargs = NULL;
3100 PyObject *kwdict = NULL;
3101 PyObject *result = NULL;
3102
3103 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003104 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003105 if (kwdict == NULL)
3106 goto call_fail;
3107 }
3108 callargs = load_args(pp_stack, na);
3109 if (callargs == NULL)
3110 goto call_fail;
3111 result = call_object(func, callargs, kwdict);
3112 call_fail:
3113 Py_XDECREF(callargs);
3114 Py_XDECREF(kwdict);
3115 return result;
3116}
3117
3118static PyObject *
3119ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3120{
3121 int nstar = 0;
3122 PyObject *callargs = NULL;
3123 PyObject *stararg = NULL;
3124 PyObject *kwdict = NULL;
3125 PyObject *result = NULL;
3126
3127 if (flags & CALL_FLAG_KW) {
3128 kwdict = EXT_POP(*pp_stack);
3129 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003130 PyErr_Format(PyExc_TypeError,
Jeremy Hylton512a2372001-04-11 13:52:29 +00003131 "%s%s argument after ** "
3132 "must be a dictionary",
3133 get_func_name(func),
3134 get_func_desc(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00003135 goto ext_call_fail;
3136 }
3137 }
3138 if (flags & CALL_FLAG_VAR) {
3139 stararg = EXT_POP(*pp_stack);
3140 if (!PyTuple_Check(stararg)) {
3141 PyObject *t = NULL;
3142 t = PySequence_Tuple(stararg);
3143 if (t == NULL) {
Jeremy Hylton512a2372001-04-11 13:52:29 +00003144 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
3145 PyErr_Format(PyExc_TypeError,
3146 "%s%s argument after * "
3147 "must be a sequence",
3148 get_func_name(func),
3149 get_func_desc(func));
3150 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003151 goto ext_call_fail;
3152 }
3153 Py_DECREF(stararg);
3154 stararg = t;
3155 }
3156 nstar = PyTuple_GET_SIZE(stararg);
3157 }
3158 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003159 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003160 if (kwdict == NULL)
3161 goto ext_call_fail;
3162 }
3163 callargs = update_star_args(na, nstar, stararg, pp_stack);
3164 if (callargs == NULL)
3165 goto ext_call_fail;
3166 result = call_object(func, callargs, kwdict);
3167 ext_call_fail:
3168 Py_XDECREF(callargs);
3169 Py_XDECREF(kwdict);
3170 Py_XDECREF(stararg);
3171 return result;
3172}
3173
Guido van Rossum3b9c6671996-07-30 18:40:29 +00003174#define SLICE_ERROR_MSG \
3175 "standard sequence type does not support step size other than one"
3176
Guido van Rossumb209a111997-04-29 18:18:01 +00003177static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003178loop_subscript(PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003179{
Guido van Rossumb209a111997-04-29 18:18:01 +00003180 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00003181 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003182 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003183 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003184 return NULL;
3185 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003186 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00003187 v = (*sq->sq_item)(v, i);
3188 if (v)
3189 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00003190 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00003191 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00003192 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003193}
3194
Guido van Rossum20c6add2000-05-08 14:06:50 +00003195/* Extract a slice index from a PyInt or PyLong, the index is bound to
3196 the range [-INT_MAX+1, INTMAX]. Returns 0 and an exception if there is
3197 and error. Returns 1 on success.*/
3198
3199int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003200_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003201{
3202 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003203 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003204 if (PyInt_Check(v)) {
3205 x = PyInt_AsLong(v);
3206 } else if (PyLong_Check(v)) {
3207 x = PyLong_AsLong(v);
3208 if (x==-1 && PyErr_Occurred()) {
3209 PyObject *long_zero;
Guido van Rossumac7be682001-01-17 15:42:30 +00003210 int cmp;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003211
Guido van Rossumac7be682001-01-17 15:42:30 +00003212 if (!PyErr_ExceptionMatches(
3213 PyExc_OverflowError)) {
3214 /* It's not an overflow error, so just
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003215 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00003216 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003217 }
3218
Guido van Rossumac7be682001-01-17 15:42:30 +00003219 /* Clear the OverflowError */
3220 PyErr_Clear();
3221
3222 /* It's an overflow error, so we need to
3223 check the sign of the long integer,
3224 set the value to INT_MAX or 0, and clear
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003225 the error. */
3226
3227 /* Create a long integer with a value of 0 */
Guido van Rossumac7be682001-01-17 15:42:30 +00003228 long_zero = PyLong_FromLong(0L);
Guido van Rossum20c6add2000-05-08 14:06:50 +00003229 if (long_zero == NULL) return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003230
3231 /* Check sign */
Guido van Rossumac7be682001-01-17 15:42:30 +00003232 cmp = PyObject_RichCompareBool(v, long_zero,
3233 Py_GT);
3234 Py_DECREF(long_zero);
3235 if (cmp < 0)
3236 return 0;
3237 else if (cmp > 0)
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003238 x = INT_MAX;
3239 else
3240 x = 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003241 }
3242 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003243 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003244 "slice indices must be integers");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003245 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003246 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003247 /* Truncate -- very long indices are truncated anyway */
3248 if (x > INT_MAX)
3249 x = INT_MAX;
3250 else if (x < -INT_MAX)
3251 x = 0;
3252 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003253 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003254 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003255}
3256
Guido van Rossumb209a111997-04-29 18:18:01 +00003257static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003258apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003259{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003260 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003261 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003262 return NULL;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003263 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum04691fc1992-08-12 15:35:34 +00003264 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003265 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003266}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003267
3268static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003269assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3270 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003271{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003272 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003273 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum3f5da241990-12-20 15:06:42 +00003274 return -1;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003275 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum3f5da241990-12-20 15:06:42 +00003276 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003277 if (x == NULL)
3278 return PySequence_DelSlice(u, ilow, ihigh);
3279 else
3280 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003281}
3282
Guido van Rossumb209a111997-04-29 18:18:01 +00003283static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003284cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003285{
Guido van Rossumac7be682001-01-17 15:42:30 +00003286 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003287 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00003288 case IS:
3289 case IS_NOT:
3290 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00003291 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003292 res = !res;
3293 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003294 case IN:
3295 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003296 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003297 if (res < 0)
3298 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00003299 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003300 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003301 break;
3302 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00003303 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003304 break;
3305 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003306 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003307 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003308 v = res ? Py_True : Py_False;
3309 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003310 return v;
3311}
3312
Thomas Wouters52152252000-08-17 22:55:00 +00003313static PyObject *
3314import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003315{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003316 PyObject *x;
3317
3318 x = PyObject_GetAttr(v, name);
3319 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00003320 PyErr_Format(PyExc_ImportError,
3321 "cannot import name %.230s",
3322 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003323 }
Thomas Wouters52152252000-08-17 22:55:00 +00003324 return x;
3325}
Guido van Rossumac7be682001-01-17 15:42:30 +00003326
Thomas Wouters52152252000-08-17 22:55:00 +00003327static int
3328import_all_from(PyObject *locals, PyObject *v)
3329{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003330 PyObject *all = PyObject_GetAttrString(v, "__all__");
3331 PyObject *dict, *name, *value;
3332 int skip_leading_underscores = 0;
3333 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003334
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003335 if (all == NULL) {
3336 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3337 return -1; /* Unexpected error */
3338 PyErr_Clear();
3339 dict = PyObject_GetAttrString(v, "__dict__");
3340 if (dict == NULL) {
3341 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3342 return -1;
3343 PyErr_SetString(PyExc_ImportError,
3344 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003345 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003346 }
3347 all = PyMapping_Keys(dict);
3348 Py_DECREF(dict);
3349 if (all == NULL)
3350 return -1;
3351 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003352 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003353
3354 for (pos = 0, err = 0; ; pos++) {
3355 name = PySequence_GetItem(all, pos);
3356 if (name == NULL) {
3357 if (!PyErr_ExceptionMatches(PyExc_IndexError))
3358 err = -1;
3359 else
3360 PyErr_Clear();
3361 break;
3362 }
3363 if (skip_leading_underscores &&
3364 PyString_Check(name) &&
3365 PyString_AS_STRING(name)[0] == '_')
3366 {
3367 Py_DECREF(name);
3368 continue;
3369 }
3370 value = PyObject_GetAttr(v, name);
3371 if (value == NULL)
3372 err = -1;
3373 else
3374 err = PyDict_SetItem(locals, name, value);
3375 Py_DECREF(name);
3376 Py_XDECREF(value);
3377 if (err != 0)
3378 break;
3379 }
3380 Py_DECREF(all);
3381 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003382}
3383
Guido van Rossumb209a111997-04-29 18:18:01 +00003384static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003385build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003386{
Guido van Rossumcd649651997-08-22 16:56:16 +00003387 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003388 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003389 PyErr_SetString(PyExc_SystemError,
3390 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00003391 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003392 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003393 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003394 PyErr_SetString(PyExc_SystemError,
3395 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00003396 return NULL;
3397 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003398 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003399 PyErr_SetString(PyExc_SystemError,
Guido van Rossum7a5b7962000-03-31 13:52:29 +00003400 "build_class with non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00003401 return NULL;
3402 }
Guido van Rossumcd649651997-08-22 16:56:16 +00003403 n = PyTuple_Size(bases);
3404 for (i = 0; i < n; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003405 PyObject *base = PyTuple_GET_ITEM(bases, i);
3406 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00003407 /* Call the base's *type*, if it is callable.
3408 This code is a hook for Donald Beaudry's
3409 and Jim Fulton's type extensions. In
Thomas Wouters7e474022000-07-16 12:04:32 +00003410 unextended Python it will never be triggered
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003411 since its types are not callable.
3412 Ditto: call the bases's *class*, if it has
3413 one. This makes the same thing possible
3414 without writing C code. A true meta-object
3415 protocol! */
3416 PyObject *basetype = (PyObject *)base->ob_type;
3417 PyObject *callable = NULL;
3418 if (PyCallable_Check(basetype))
3419 callable = basetype;
3420 else
3421 callable = PyObject_GetAttrString(
3422 base, "__class__");
3423 if (callable) {
3424 PyObject *args;
3425 PyObject *newclass = NULL;
3426 args = Py_BuildValue(
3427 "(OOO)", name, bases, methods);
3428 if (args != NULL) {
3429 newclass = PyEval_CallObject(
3430 callable, args);
3431 Py_DECREF(args);
3432 }
Guido van Rossum730806d1998-04-10 22:27:42 +00003433 if (callable != basetype) {
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003434 Py_DECREF(callable);
Guido van Rossum730806d1998-04-10 22:27:42 +00003435 }
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003436 return newclass;
Guido van Rossum150b2df1996-12-05 23:17:11 +00003437 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003438 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00003439 "base is not a class object");
3440 return NULL;
3441 }
3442 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003443 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00003444}
3445
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003446static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003447exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3448 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003449{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003450 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003451 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003452 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003453
Guido van Rossumb209a111997-04-29 18:18:01 +00003454 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3455 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003456 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003457 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003458 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003459 locals = PyTuple_GetItem(prog, 2);
3460 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003461 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003462 if (globals == Py_None) {
3463 globals = PyEval_GetGlobals();
3464 if (locals == Py_None) {
3465 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003466 plain = 1;
3467 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003468 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003469 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003470 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003471 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003472 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003473 !PyCode_Check(prog) &&
3474 !PyFile_Check(prog)) {
3475 PyErr_SetString(PyExc_TypeError,
Guido van Rossumac7be682001-01-17 15:42:30 +00003476 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003477 return -1;
3478 }
Fred Drake661ea262000-10-24 19:57:45 +00003479 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003480 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003481 "exec: arg 2 must be a dictionary or None");
3482 return -1;
3483 }
3484 if (!PyDict_Check(locals)) {
3485 PyErr_SetString(PyExc_TypeError,
3486 "exec: arg 3 must be a dictionary or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003487 return -1;
3488 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003489 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003490 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003491 if (PyCode_Check(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003492 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003493 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003494 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003495 FILE *fp = PyFile_AsFile(prog);
3496 char *name = PyString_AsString(PyFile_Name(prog));
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003497 if (PyEval_GetNestedScopes()) {
3498 PyCompilerFlags cf;
3499 cf.cf_nested_scopes = 1;
3500 v = PyRun_FileFlags(fp, name, Py_file_input, globals,
3501 locals, &cf);
3502 } else {
3503 v = PyRun_File(fp, name, Py_file_input, globals,
3504 locals);
3505 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003506 }
3507 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003508 char *str;
3509 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003510 return -1;
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003511 if (PyEval_GetNestedScopes()) {
3512 PyCompilerFlags cf;
3513 cf.cf_nested_scopes = 1;
3514 v = PyRun_StringFlags(str, Py_file_input, globals,
3515 locals, &cf);
3516 } else
3517 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003518 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003519 if (plain)
3520 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003521 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003522 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003523 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003524 return 0;
3525}
Guido van Rossum24c13741995-02-14 09:42:43 +00003526
Guido van Rossumac7be682001-01-17 15:42:30 +00003527static void
Paul Prescode68140d2000-08-30 20:25:01 +00003528format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3529{
3530 char *obj_str;
3531
3532 if (!obj)
3533 return;
3534
3535 obj_str = PyString_AsString(obj);
3536 if (!obj_str)
3537 return;
3538
3539 PyErr_Format(exc, format_str, obj_str);
3540}
Guido van Rossum950361c1997-01-24 13:49:28 +00003541
3542#ifdef DYNAMIC_EXECUTION_PROFILE
3543
3544PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003545getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003546{
3547 int i;
3548 PyObject *l = PyList_New(256);
3549 if (l == NULL) return NULL;
3550 for (i = 0; i < 256; i++) {
3551 PyObject *x = PyInt_FromLong(a[i]);
3552 if (x == NULL) {
3553 Py_DECREF(l);
3554 return NULL;
3555 }
3556 PyList_SetItem(l, i, x);
3557 }
3558 for (i = 0; i < 256; i++)
3559 a[i] = 0;
3560 return l;
3561}
3562
3563PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003564_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003565{
3566#ifndef DXPAIRS
3567 return getarray(dxp);
3568#else
3569 int i;
3570 PyObject *l = PyList_New(257);
3571 if (l == NULL) return NULL;
3572 for (i = 0; i < 257; i++) {
3573 PyObject *x = getarray(dxpairs[i]);
3574 if (x == NULL) {
3575 Py_DECREF(l);
3576 return NULL;
3577 }
3578 PyList_SetItem(l, i, x);
3579 }
3580 return l;
3581#endif
3582}
3583
3584#endif