blob: d76c6f2766d942baaf210c336ee0c762251f59a8 [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"
Jeremy Hyltonc76770c2001-04-13 16:51:46 +000086#define UNBOUNDFREE_ERROR_MSG \
87 "free variable '%.200s' referenced before assignment" \
88 " in enclosing scope"
Guido van Rossum374a9221991-04-04 10:40:29 +000089
Guido van Rossum950361c1997-01-24 13:49:28 +000090/* Dynamic execution profile */
91#ifdef DYNAMIC_EXECUTION_PROFILE
92#ifdef DXPAIRS
93static long dxpairs[257][256];
94#define dxp dxpairs[256]
95#else
96static long dxp[256];
97#endif
98#endif
99
Guido van Rossume59214e1994-08-30 08:01:59 +0000100#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000101
Guido van Rossum2571cc81999-04-07 16:07:23 +0000102#ifndef DONT_HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000103#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +0000104#endif
Guido van Rossum49b56061998-10-01 20:42:43 +0000105#include "pythread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000106
Guido van Rossuma027efa1997-05-05 20:56:21 +0000107extern int _PyThread_Started; /* Flag for Py_Exit */
108
Guido van Rossum65d5b571998-12-21 19:32:43 +0000109static PyThread_type_lock interpreter_lock = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000110static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000111
112void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000113PyEval_InitThreads(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000114{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000115 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000116 return;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000117 _PyThread_Started = 1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000118 interpreter_lock = PyThread_allocate_lock();
119 PyThread_acquire_lock(interpreter_lock, 1);
120 main_thread = PyThread_get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000121}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000122
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000123void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000124PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000125{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000126 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000127}
128
129void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000130PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000131{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000132 PyThread_release_lock(interpreter_lock);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000133}
134
135void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000136PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000137{
138 if (tstate == NULL)
139 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000140 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000141 if (PyThreadState_Swap(tstate) != NULL)
142 Py_FatalError(
143 "PyEval_AcquireThread: non-NULL old thread state");
144}
145
146void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000147PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000148{
149 if (tstate == NULL)
150 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
151 if (PyThreadState_Swap(NULL) != tstate)
152 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000153 PyThread_release_lock(interpreter_lock);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000154}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000155
156/* This function is called from PyOS_AfterFork to ensure that newly
157 created child processes don't hold locks referring to threads which
158 are not running in the child process. (This could also be done using
159 pthread_atfork mechanism, at least for the pthreads implementation.) */
160
161void
162PyEval_ReInitThreads(void)
163{
164 if (!interpreter_lock)
165 return;
166 /*XXX Can't use PyThread_free_lock here because it does too
167 much error-checking. Doing this cleanly would require
168 adding a new function to each thread_*.h. Instead, just
169 create a new lock and waste a little bit of memory */
170 interpreter_lock = PyThread_allocate_lock();
171 PyThread_acquire_lock(interpreter_lock, 1);
172 main_thread = PyThread_get_thread_ident();
173}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000174#endif
175
Guido van Rossumff4949e1992-08-05 19:58:53 +0000176/* Functions save_thread and restore_thread are always defined so
177 dynamically loaded modules needn't be compiled separately for use
178 with and without threads: */
179
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000180PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000181PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000182{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000183 PyThreadState *tstate = PyThreadState_Swap(NULL);
184 if (tstate == NULL)
185 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000186#ifdef WITH_THREAD
Guido van Rossumb74eca91997-09-30 22:03:16 +0000187 if (interpreter_lock)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000188 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000189#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000190 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000191}
192
193void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000194PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000195{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000196 if (tstate == NULL)
197 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000198#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000199 if (interpreter_lock) {
Guido van Rossumb74eca91997-09-30 22:03:16 +0000200 int err = errno;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000201 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000202 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000203 }
204#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000205 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000206}
207
208
Guido van Rossuma9672091994-09-14 13:31:22 +0000209/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
210 signal handlers or Mac I/O completion routines) can schedule calls
211 to a function to be called synchronously.
212 The synchronous function is called with one void* argument.
213 It should return 0 for success or -1 for failure -- failure should
214 be accompanied by an exception.
215
216 If registry succeeds, the registry function returns 0; if it fails
217 (e.g. due to too many pending calls) it returns -1 (without setting
218 an exception condition).
219
220 Note that because registry may occur from within signal handlers,
221 or other asynchronous events, calling malloc() is unsafe!
222
223#ifdef WITH_THREAD
224 Any thread can schedule pending calls, but only the main thread
225 will execute them.
226#endif
227
228 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
229 There are two possible race conditions:
230 (1) nested asynchronous registry calls;
231 (2) registry calls made while pending calls are being processed.
232 While (1) is very unlikely, (2) is a real possibility.
233 The current code is safe against (2), but not against (1).
234 The safety against (2) is derived from the fact that only one
235 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000236
Guido van Rossuma027efa1997-05-05 20:56:21 +0000237 XXX Darn! With the advent of thread state, we should have an array
238 of pending calls per thread in the thread state! Later...
239*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000240
Guido van Rossuma9672091994-09-14 13:31:22 +0000241#define NPENDINGCALLS 32
242static struct {
Thomas Wouters334fb892000-07-25 12:56:38 +0000243 int (*func)(void *);
244 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000245} pendingcalls[NPENDINGCALLS];
246static volatile int pendingfirst = 0;
247static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000248static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000249
250int
Thomas Wouters334fb892000-07-25 12:56:38 +0000251Py_AddPendingCall(int (*func)(void *), void *arg)
Guido van Rossuma9672091994-09-14 13:31:22 +0000252{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000253 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000254 int i, j;
255 /* XXX Begin critical section */
256 /* XXX If you want this to be safe against nested
257 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000258 if (busy)
259 return -1;
260 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000261 i = pendinglast;
262 j = (i + 1) % NPENDINGCALLS;
263 if (j == pendingfirst)
264 return -1; /* Queue full */
265 pendingcalls[i].func = func;
266 pendingcalls[i].arg = arg;
267 pendinglast = j;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000268 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000269 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000270 /* XXX End critical section */
271 return 0;
272}
273
Guido van Rossum180d7b41994-09-29 09:45:57 +0000274int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000275Py_MakePendingCalls(void)
Guido van Rossuma9672091994-09-14 13:31:22 +0000276{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000277 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000278#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000279 if (main_thread && PyThread_get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000280 return 0;
281#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000282 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000283 return 0;
284 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000285 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000286 for (;;) {
287 int i;
Thomas Wouters334fb892000-07-25 12:56:38 +0000288 int (*func)(void *);
289 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000290 i = pendingfirst;
291 if (i == pendinglast)
292 break; /* Queue empty */
293 func = pendingcalls[i].func;
294 arg = pendingcalls[i].arg;
295 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000296 if (func(arg) < 0) {
297 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000298 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000299 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000300 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000301 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000302 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000303 return 0;
304}
305
306
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000307/* The interpreter's recursion limit */
308
Guido van Rossum349ff6f2000-09-01 01:52:08 +0000309static int recursion_limit = 1000;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000310
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000311int
312Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000313{
314 return recursion_limit;
315}
316
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000317void
318Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000319{
320 recursion_limit = new_limit;
321}
322
Guido van Rossum374a9221991-04-04 10:40:29 +0000323/* Status code for main loop (reason for stack unwind) */
324
325enum why_code {
326 WHY_NOT, /* No error */
327 WHY_EXCEPTION, /* Exception occurred */
328 WHY_RERAISE, /* Exception re-raised by 'finally' */
329 WHY_RETURN, /* 'return' statement */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +0000330 WHY_BREAK, /* 'break' statement */
Thomas Woutersfc93b0a2001-02-16 11:52:31 +0000331 WHY_CONTINUE /* 'continue' statement */
Guido van Rossum374a9221991-04-04 10:40:29 +0000332};
333
Tim Petersdbd9ba62000-07-09 03:09:57 +0000334static enum why_code do_raise(PyObject *, PyObject *, PyObject *);
335static int unpack_sequence(PyObject *, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000336
Guido van Rossum374a9221991-04-04 10:40:29 +0000337
Guido van Rossumb209a111997-04-29 18:18:01 +0000338PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000339PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000340{
341 return eval_code2(co,
342 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000343 (PyObject **)NULL, 0,
344 (PyObject **)NULL, 0,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000345 (PyObject **)NULL, 0,
346 NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000347}
348
349
350/* Interpreter main loop */
351
Guido van Rossumb209a111997-04-29 18:18:01 +0000352static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000353eval_code2(PyCodeObject *co, PyObject *globals, PyObject *locals,
354 PyObject **args, int argcount, PyObject **kws, int kwcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000355 PyObject **defs, int defcount, PyObject *closure)
Guido van Rossum374a9221991-04-04 10:40:29 +0000356{
Guido van Rossum950361c1997-01-24 13:49:28 +0000357#ifdef DXPAIRS
358 int lastopcode = 0;
359#endif
Jeremy Hylton52820442001-01-03 23:52:36 +0000360 PyObject **stack_pointer;
Guido van Rossum374a9221991-04-04 10:40:29 +0000361 register unsigned char *next_instr;
Moshe Zadkaaa39a7e2000-08-07 06:34:45 +0000362 register int opcode=0; /* Current opcode */
363 register int oparg=0; /* Current opcode argument, if any */
Guido van Rossum374a9221991-04-04 10:40:29 +0000364 register enum why_code why; /* Reason for block stack unwind */
365 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000366 register PyObject *x; /* Result object -- NULL if error */
367 register PyObject *v; /* Temporary objects popped off stack */
368 register PyObject *w;
369 register PyObject *u;
370 register PyObject *t;
Barry Warsaw23c9ec82000-08-21 15:44:01 +0000371 register PyObject *stream = NULL; /* for PRINT opcodes */
Guido van Rossumb209a111997-04-29 18:18:01 +0000372 register PyFrameObject *f; /* Current frame */
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000373 register PyObject **fastlocals, **freevars;
Guido van Rossum014518f1998-11-23 21:09:51 +0000374 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000375 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossumd076c731998-10-07 19:42:25 +0000376 unsigned char *first_instr;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000377#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000378 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000379#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000380#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000381 /* Make it easier to find out where we are with a debugger */
Guido van Rossumb209a111997-04-29 18:18:01 +0000382 char *filename = PyString_AsString(co->co_filename);
Guido van Rossum99bec951992-09-03 20:29:45 +0000383#endif
Guido van Rossum59d1d2b2001-04-20 19:13:02 +0000384 static PyObject *nextstr;
Guido van Rossum374a9221991-04-04 10:40:29 +0000385
386/* Code access macros */
387
388#define GETCONST(i) Getconst(f, i)
389#define GETNAME(i) Getname(f, i)
390#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumd076c731998-10-07 19:42:25 +0000391#define INSTR_OFFSET() (next_instr - first_instr)
Guido van Rossum374a9221991-04-04 10:40:29 +0000392#define NEXTOP() (*next_instr++)
393#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossumd076c731998-10-07 19:42:25 +0000394#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000395#define JUMPBY(x) (next_instr += (x))
396
397/* Stack manipulation macros */
398
399#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
400#define EMPTY() (STACK_LEVEL() == 0)
401#define TOP() (stack_pointer[-1])
402#define BASIC_PUSH(v) (*stack_pointer++ = (v))
403#define BASIC_POP() (*--stack_pointer)
404
Guido van Rossum96a42c81992-01-12 02:29:51 +0000405#ifdef LLTRACE
406#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
407#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000408#else
409#define PUSH(v) BASIC_PUSH(v)
410#define POP() BASIC_POP()
411#endif
412
Guido van Rossum681d79a1995-07-18 14:51:37 +0000413/* Local variable macros */
414
415#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumb209a111997-04-29 18:18:01 +0000416#define SETLOCAL(i, value) do { Py_XDECREF(GETLOCAL(i)); \
Guido van Rossum681d79a1995-07-18 14:51:37 +0000417 GETLOCAL(i) = value; } while (0)
418
Guido van Rossuma027efa1997-05-05 20:56:21 +0000419/* Start of code */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +0000420 if (nextstr == NULL) {
421 nextstr = PyString_InternFromString("next");
422 if (nextstr == NULL)
423 return NULL;
424 }
Guido van Rossuma027efa1997-05-05 20:56:21 +0000425
Guido van Rossum8861b741996-07-30 16:49:37 +0000426#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000427 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000428 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000429 return NULL;
430 }
431#endif
432
Guido van Rossum681d79a1995-07-18 14:51:37 +0000433 if (globals == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000434 PyErr_SetString(PyExc_SystemError, "eval_code2: NULL globals");
Guido van Rossum6135a871995-01-09 17:53:26 +0000435 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000436 }
437
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000438#ifdef LLTRACE
Guido van Rossumb209a111997-04-29 18:18:01 +0000439 lltrace = PyDict_GetItemString(globals, "__lltrace__") != NULL;
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000440#endif
441
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000442 f = PyFrame_New(tstate, /*back*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000443 co, /*code*/
Jeremy Hylton30c9f392001-03-13 01:58:22 +0000444 globals, locals);
Guido van Rossum374a9221991-04-04 10:40:29 +0000445 if (f == NULL)
446 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000447
Guido van Rossuma027efa1997-05-05 20:56:21 +0000448 tstate->frame = f;
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000449 fastlocals = f->f_localsplus;
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000450 freevars = f->f_localsplus + f->f_nlocals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000451
452 if (co->co_argcount > 0 ||
453 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
454 int i;
455 int n = argcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000456 PyObject *kwdict = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000457 if (co->co_flags & CO_VARKEYWORDS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000458 kwdict = PyDict_New();
Guido van Rossum681d79a1995-07-18 14:51:37 +0000459 if (kwdict == NULL)
460 goto fail;
Guido van Rossum8c5df061997-01-24 04:19:24 +0000461 i = co->co_argcount;
462 if (co->co_flags & CO_VARARGS)
463 i++;
464 SETLOCAL(i, kwdict);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000465 }
466 if (argcount > co->co_argcount) {
467 if (!(co->co_flags & CO_VARARGS)) {
Guido van Rossumdf9db1e1997-11-19 16:05:40 +0000468 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +0000469 "%.200s() takes %s %d "
470 "%sargument%s (%d given)",
Fred Drake661ea262000-10-24 19:57:45 +0000471 PyString_AsString(co->co_name),
Ka-Ping Yee20579702001-01-15 22:14:16 +0000472 defcount ? "at most" : "exactly",
473 co->co_argcount,
474 kwcount ? "non-keyword " : "",
475 co->co_argcount == 1 ? "" : "s",
476 argcount);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000477 goto fail;
478 }
479 n = co->co_argcount;
480 }
481 for (i = 0; i < n; i++) {
482 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000483 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000484 SETLOCAL(i, x);
485 }
486 if (co->co_flags & CO_VARARGS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000487 u = PyTuple_New(argcount - n);
Guido van Rossum8c5df061997-01-24 04:19:24 +0000488 if (u == NULL)
489 goto fail;
490 SETLOCAL(co->co_argcount, u);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000491 for (i = n; i < argcount; i++) {
492 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000493 Py_INCREF(x);
494 PyTuple_SET_ITEM(u, i-n, x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000495 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000496 }
497 for (i = 0; i < kwcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000498 PyObject *keyword = kws[2*i];
499 PyObject *value = kws[2*i + 1];
Guido van Rossum681d79a1995-07-18 14:51:37 +0000500 int j;
Guido van Rossum25da5be1999-10-26 00:12:20 +0000501 if (keyword == NULL || !PyString_Check(keyword)) {
Ka-Ping Yee20579702001-01-15 22:14:16 +0000502 PyErr_Format(PyExc_TypeError,
503 "%.200s() keywords must be strings",
504 PyString_AsString(co->co_name));
Guido van Rossum25da5be1999-10-26 00:12:20 +0000505 goto fail;
506 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000507 /* XXX slow -- speed up using dictionary? */
508 for (j = 0; j < co->co_argcount; j++) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000509 PyObject *nm = PyTuple_GET_ITEM(
510 co->co_varnames, j);
Guido van Rossumac7be682001-01-17 15:42:30 +0000511 int cmp = PyObject_RichCompareBool(
512 keyword, nm, Py_EQ);
513 if (cmp > 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000514 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000515 else if (cmp < 0)
516 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000517 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000518 /* Check errors from Compare */
519 if (PyErr_Occurred())
520 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000521 if (j >= co->co_argcount) {
522 if (kwdict == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000523 PyErr_Format(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +0000524 "%.200s() got an unexpected "
525 "keyword argument '%.400s'",
526 PyString_AsString(co->co_name),
Jeremy Hylton76901512000-03-28 23:49:17 +0000527 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000528 goto fail;
529 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000530 PyDict_SetItem(kwdict, keyword, value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000531 }
532 else {
533 if (GETLOCAL(j) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000534 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +0000535 "%.200s() got multiple "
536 "values for keyword "
537 "argument '%.400s'",
538 PyString_AsString(co->co_name),
539 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000540 goto fail;
541 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000542 Py_INCREF(value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000543 SETLOCAL(j, value);
544 }
545 }
546 if (argcount < co->co_argcount) {
547 int m = co->co_argcount - defcount;
548 for (i = argcount; i < m; i++) {
549 if (GETLOCAL(i) == NULL) {
Guido van Rossumdf9db1e1997-11-19 16:05:40 +0000550 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +0000551 "%.200s() takes %s %d "
552 "%sargument%s (%d given)",
Fred Drake661ea262000-10-24 19:57:45 +0000553 PyString_AsString(co->co_name),
Ka-Ping Yee20579702001-01-15 22:14:16 +0000554 ((co->co_flags & CO_VARARGS) ||
555 defcount) ? "at least"
556 : "exactly",
557 m, kwcount ? "non-keyword " : "",
558 m == 1 ? "" : "s", i);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000559 goto fail;
560 }
561 }
562 if (n > m)
563 i = n - m;
564 else
565 i = 0;
566 for (; i < defcount; i++) {
567 if (GETLOCAL(m+i) == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000568 PyObject *def = defs[i];
569 Py_INCREF(def);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000570 SETLOCAL(m+i, def);
571 }
572 }
573 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000574 }
575 else {
576 if (argcount > 0 || kwcount > 0) {
Fred Drake661ea262000-10-24 19:57:45 +0000577 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +0000578 "%.200s() takes no arguments (%d given)",
579 PyString_AsString(co->co_name),
580 argcount + kwcount);
Guido van Rossum8c5df061997-01-24 04:19:24 +0000581 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000582 }
583 }
Jeremy Hylton220ae7c2001-03-21 16:43:47 +0000584 /* Allocate and initialize storage for cell vars, and copy free
585 vars into frame. This isn't too efficient right now. */
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000586 if (f->f_ncells) {
Jeremy Hylton220ae7c2001-03-21 16:43:47 +0000587 int i = 0, j = 0, nargs, found;
588 char *cellname, *argname;
589 PyObject *c;
590
591 nargs = co->co_argcount;
592 if (co->co_flags & CO_VARARGS)
593 nargs++;
594 if (co->co_flags & CO_VARKEYWORDS)
595 nargs++;
596
597 /* Check for cells that shadow args */
598 for (i = 0; i < f->f_ncells && j < nargs; ++i) {
599 cellname = PyString_AS_STRING(
600 PyTuple_GET_ITEM(co->co_cellvars, i));
601 found = 0;
602 while (j < nargs) {
603 argname = PyString_AS_STRING(
604 PyTuple_GET_ITEM(co->co_varnames, j));
605 if (strcmp(cellname, argname) == 0) {
606 c = PyCell_New(GETLOCAL(j));
607 if (c == NULL)
608 goto fail;
609 GETLOCAL(f->f_nlocals + i) = c;
610 found = 1;
611 break;
612 }
613 j++;
614 }
615 if (found == 0) {
616 c = PyCell_New(NULL);
617 if (c == NULL)
618 goto fail;
619 SETLOCAL(f->f_nlocals + i, c);
620 }
621 }
622 /* Initialize any that are left */
623 while (i < f->f_ncells) {
624 c = PyCell_New(NULL);
625 if (c == NULL)
626 goto fail;
627 SETLOCAL(f->f_nlocals + i, c);
628 i++;
629 }
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000630 }
631 if (f->f_nfreevars) {
632 int i;
Jeremy Hylton30c9f392001-03-13 01:58:22 +0000633 for (i = 0; i < f->f_nfreevars; ++i) {
634 PyObject *o = PyTuple_GET_ITEM(closure, i);
635 Py_INCREF(o);
636 freevars[f->f_ncells + i] = o;
637 }
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000638 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000639
Guido van Rossuma027efa1997-05-05 20:56:21 +0000640 if (tstate->sys_tracefunc != NULL) {
641 /* tstate->sys_tracefunc, if defined, is a function that
642 will be called on *every* entry to a code block.
Guido van Rossum96a42c81992-01-12 02:29:51 +0000643 Its return value, if not None, is a function that
644 will be called at the start of each executed line
645 of code. (Actually, the function must return
646 itself in order to continue tracing.)
647 The trace functions are called with three arguments:
648 a pointer to the current frame, a string indicating
649 why the function is called, and an argument which
650 depends on the situation. The global trace function
651 (sys.trace) is also called whenever an exception
652 is detected. */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000653 if (call_trace(&tstate->sys_tracefunc,
654 &f->f_trace, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000655 Py_None/*XXX how to compute arguments now?*/)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000656 /* Trace function raised an error */
Guido van Rossum8c5df061997-01-24 04:19:24 +0000657 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000658 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000659 }
660
Guido van Rossuma027efa1997-05-05 20:56:21 +0000661 if (tstate->sys_profilefunc != NULL) {
662 /* Similar for sys_profilefunc, except it needn't return
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000663 itself and isn't called for "line" events */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000664 if (call_trace(&tstate->sys_profilefunc,
665 (PyObject**)0, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000666 Py_None/*XXX*/)) {
Guido van Rossum8c5df061997-01-24 04:19:24 +0000667 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000668 }
669 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000670
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000671 if (++tstate->recursion_depth > recursion_limit) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000672 --tstate->recursion_depth;
673 PyErr_SetString(PyExc_RuntimeError,
Fred Drake661ea262000-10-24 19:57:45 +0000674 "maximum recursion depth exceeded");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000675 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +0000676 Py_DECREF(f);
Guido van Rossum8861b741996-07-30 16:49:37 +0000677 return NULL;
678 }
679
Guido van Rossumd076c731998-10-07 19:42:25 +0000680 _PyCode_GETCODEPTR(co, &first_instr);
681 next_instr = first_instr;
Guido van Rossum374a9221991-04-04 10:40:29 +0000682 stack_pointer = f->f_valuestack;
Guido van Rossumac7be682001-01-17 15:42:30 +0000683
Guido van Rossum374a9221991-04-04 10:40:29 +0000684 why = WHY_NOT;
685 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000686 x = Py_None; /* Not a reference, just anything non-NULL */
Fred Drake48fba732000-10-11 13:54:07 +0000687 w = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +0000688
Guido van Rossum374a9221991-04-04 10:40:29 +0000689 for (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000690 /* Do periodic things. Doing this every time through
691 the loop would add too much overhead, so we do it
692 only every Nth instruction. We also do it if
693 ``things_to_do'' is set, i.e. when an asynchronous
694 event needs attention (e.g. a signal handler or
695 async I/O handler); see Py_AddPendingCall() and
696 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +0000697
Guido van Rossuma027efa1997-05-05 20:56:21 +0000698 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000699 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000700 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000701 if (Py_MakePendingCalls() < 0) {
702 why = WHY_EXCEPTION;
703 goto on_error;
704 }
705 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000706#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000707 /* If we have true signals, the signal handler
708 will call Py_AddPendingCall() so we don't
709 have to call sigcheck(). On the Mac and
710 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000711 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000712 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000713 goto on_error;
714 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000715#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000716
Guido van Rossume59214e1994-08-30 08:01:59 +0000717#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000718 if (interpreter_lock) {
719 /* Give another thread a chance */
720
Guido van Rossum25ce5661997-08-02 03:10:38 +0000721 if (PyThreadState_Swap(NULL) != tstate)
722 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000723 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000724
725 /* Other threads may run now */
726
Guido van Rossum65d5b571998-12-21 19:32:43 +0000727 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000728 if (PyThreadState_Swap(tstate) != NULL)
729 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000730 }
731#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000732 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000733
Guido van Rossum374a9221991-04-04 10:40:29 +0000734 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000735
Guido van Rossum408027e1996-12-30 16:17:54 +0000736#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000737 f->f_lasti = INSTR_OFFSET();
738#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000739
Guido van Rossum374a9221991-04-04 10:40:29 +0000740 opcode = NEXTOP();
741 if (HAS_ARG(opcode))
742 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000743 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000744#ifdef DYNAMIC_EXECUTION_PROFILE
745#ifdef DXPAIRS
746 dxpairs[lastopcode][opcode]++;
747 lastopcode = opcode;
748#endif
749 dxp[opcode]++;
750#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000751
Guido van Rossum96a42c81992-01-12 02:29:51 +0000752#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000753 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +0000754
Guido van Rossum96a42c81992-01-12 02:29:51 +0000755 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000756 if (HAS_ARG(opcode)) {
757 printf("%d: %d, %d\n",
758 (int) (INSTR_OFFSET() - 3),
759 opcode, oparg);
760 }
761 else {
762 printf("%d: %d\n",
763 (int) (INSTR_OFFSET() - 1), opcode);
764 }
765 }
766#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000767 /* Main switch on opcode */
Jeremy Hylton52820442001-01-03 23:52:36 +0000768
Guido van Rossum374a9221991-04-04 10:40:29 +0000769 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000770
Guido van Rossum374a9221991-04-04 10:40:29 +0000771 /* BEWARE!
772 It is essential that any operation that fails sets either
773 x to NULL, err to nonzero, or why to anything but WHY_NOT,
774 and that no operation that succeeds does this! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000775
Guido van Rossum374a9221991-04-04 10:40:29 +0000776 /* case STOP_CODE: this is an error! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000777
Guido van Rossum374a9221991-04-04 10:40:29 +0000778 case POP_TOP:
779 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000780 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000781 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000782
Guido van Rossum374a9221991-04-04 10:40:29 +0000783 case ROT_TWO:
784 v = POP();
785 w = POP();
786 PUSH(v);
787 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000788 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000789
Guido van Rossum374a9221991-04-04 10:40:29 +0000790 case ROT_THREE:
791 v = POP();
792 w = POP();
793 x = POP();
794 PUSH(v);
795 PUSH(x);
796 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000797 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000798
Thomas Wouters434d0822000-08-24 20:11:32 +0000799 case ROT_FOUR:
800 u = POP();
801 v = POP();
802 w = POP();
803 x = POP();
804 PUSH(u);
805 PUSH(x);
806 PUSH(w);
807 PUSH(v);
808 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000809
Guido van Rossum374a9221991-04-04 10:40:29 +0000810 case DUP_TOP:
811 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000812 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000813 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000814 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000815
Thomas Wouters434d0822000-08-24 20:11:32 +0000816 case DUP_TOPX:
817 switch (oparg) {
Thomas Wouters434d0822000-08-24 20:11:32 +0000818 case 1:
Tim Peters35ba6892000-10-11 07:04:49 +0000819 x = TOP();
820 Py_INCREF(x);
821 PUSH(x);
822 continue;
823 case 2:
Thomas Wouters434d0822000-08-24 20:11:32 +0000824 x = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000825 Py_INCREF(x);
826 w = TOP();
827 Py_INCREF(w);
828 PUSH(x);
829 PUSH(w);
830 PUSH(x);
831 continue;
832 case 3:
833 x = POP();
834 Py_INCREF(x);
Thomas Wouters434d0822000-08-24 20:11:32 +0000835 w = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000836 Py_INCREF(w);
837 v = TOP();
838 Py_INCREF(v);
839 PUSH(w);
840 PUSH(x);
841 PUSH(v);
842 PUSH(w);
843 PUSH(x);
844 continue;
845 case 4:
846 x = POP();
847 Py_INCREF(x);
848 w = POP();
849 Py_INCREF(w);
Thomas Wouters434d0822000-08-24 20:11:32 +0000850 v = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000851 Py_INCREF(v);
852 u = TOP();
853 Py_INCREF(u);
854 PUSH(v);
855 PUSH(w);
856 PUSH(x);
857 PUSH(u);
858 PUSH(v);
859 PUSH(w);
860 PUSH(x);
861 continue;
862 case 5:
863 x = POP();
864 Py_INCREF(x);
865 w = POP();
866 Py_INCREF(w);
867 v = POP();
868 Py_INCREF(v);
Thomas Wouters434d0822000-08-24 20:11:32 +0000869 u = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000870 Py_INCREF(u);
871 t = TOP();
872 Py_INCREF(t);
873 PUSH(u);
874 PUSH(v);
875 PUSH(w);
876 PUSH(x);
877 PUSH(t);
878 PUSH(u);
879 PUSH(v);
880 PUSH(w);
881 PUSH(x);
882 continue;
Thomas Wouters434d0822000-08-24 20:11:32 +0000883 default:
Thomas Wouters0be483f2000-10-11 23:26:11 +0000884 Py_FatalError("invalid argument to DUP_TOPX"
885 " (bytecode corruption?)");
Thomas Wouters434d0822000-08-24 20:11:32 +0000886 }
Tim Peters35ba6892000-10-11 07:04:49 +0000887 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000888
Guido van Rossum374a9221991-04-04 10:40:29 +0000889 case UNARY_POSITIVE:
890 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000891 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000892 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000893 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000894 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000895 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000896
Guido van Rossum374a9221991-04-04 10:40:29 +0000897 case UNARY_NEGATIVE:
898 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000899 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000900 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000901 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000902 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000903 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000904
Guido van Rossum374a9221991-04-04 10:40:29 +0000905 case UNARY_NOT:
906 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000907 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000908 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000909 if (err == 0) {
910 Py_INCREF(Py_True);
911 PUSH(Py_True);
912 continue;
913 }
914 else if (err > 0) {
915 Py_INCREF(Py_False);
916 PUSH(Py_False);
917 err = 0;
918 continue;
919 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000920 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000921
Guido van Rossum374a9221991-04-04 10:40:29 +0000922 case UNARY_CONVERT:
923 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000924 x = PyObject_Repr(v);
925 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000926 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000927 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000928 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000929
Guido van Rossum7928cd71991-10-24 14:59:31 +0000930 case UNARY_INVERT:
931 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000932 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000933 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000934 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000935 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000936 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000937
Guido van Rossum50564e81996-01-12 01:13:16 +0000938 case BINARY_POWER:
939 w = POP();
940 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000941 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000942 Py_DECREF(v);
943 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000944 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000945 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000946 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000947
Guido van Rossum374a9221991-04-04 10:40:29 +0000948 case BINARY_MULTIPLY:
949 w = POP();
950 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000951 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000952 Py_DECREF(v);
953 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000954 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000955 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000956 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000957
Guido van Rossum374a9221991-04-04 10:40:29 +0000958 case BINARY_DIVIDE:
959 w = POP();
960 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000961 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000962 Py_DECREF(v);
963 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000964 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000965 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000966 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000967
Guido van Rossum374a9221991-04-04 10:40:29 +0000968 case BINARY_MODULO:
969 w = POP();
970 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000971 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000972 Py_DECREF(v);
973 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000974 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000975 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000976 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000977
Guido van Rossum374a9221991-04-04 10:40:29 +0000978 case BINARY_ADD:
979 w = POP();
980 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000981 if (PyInt_Check(v) && PyInt_Check(w)) {
982 /* INLINE: int + int */
983 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000984 a = PyInt_AS_LONG(v);
985 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000986 i = a + b;
987 if ((i^a) < 0 && (i^b) < 0) {
988 PyErr_SetString(PyExc_OverflowError,
989 "integer addition");
990 x = NULL;
991 }
992 else
993 x = PyInt_FromLong(i);
994 }
995 else
996 x = PyNumber_Add(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000997 Py_DECREF(v);
998 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000999 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001000 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001001 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001002
Guido van Rossum374a9221991-04-04 10:40:29 +00001003 case BINARY_SUBTRACT:
1004 w = POP();
1005 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001006 if (PyInt_Check(v) && PyInt_Check(w)) {
1007 /* INLINE: int - int */
1008 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001009 a = PyInt_AS_LONG(v);
1010 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001011 i = a - b;
1012 if ((i^a) < 0 && (i^~b) < 0) {
1013 PyErr_SetString(PyExc_OverflowError,
1014 "integer subtraction");
1015 x = NULL;
1016 }
1017 else
1018 x = PyInt_FromLong(i);
1019 }
1020 else
1021 x = PyNumber_Subtract(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001022 Py_DECREF(v);
1023 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001024 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001025 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001026 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001027
Guido van Rossum374a9221991-04-04 10:40:29 +00001028 case BINARY_SUBSCR:
1029 w = POP();
1030 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001031 if (PyList_Check(v) && PyInt_Check(w)) {
1032 /* INLINE: list[int] */
1033 long i = PyInt_AsLong(w);
1034 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +00001035 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +00001036 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +00001037 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001038 PyErr_SetString(PyExc_IndexError,
1039 "list index out of range");
1040 x = NULL;
1041 }
1042 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +00001043 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001044 Py_INCREF(x);
1045 }
1046 }
1047 else
1048 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001049 Py_DECREF(v);
1050 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001051 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001052 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001053 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001054
Guido van Rossum7928cd71991-10-24 14:59:31 +00001055 case BINARY_LSHIFT:
1056 w = POP();
1057 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001058 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001059 Py_DECREF(v);
1060 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001061 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001062 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001063 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001064
Guido van Rossum7928cd71991-10-24 14:59:31 +00001065 case BINARY_RSHIFT:
1066 w = POP();
1067 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001068 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001069 Py_DECREF(v);
1070 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001071 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001072 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001073 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001074
Guido van Rossum7928cd71991-10-24 14:59:31 +00001075 case BINARY_AND:
1076 w = POP();
1077 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001078 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001079 Py_DECREF(v);
1080 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001081 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001082 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001083 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001084
Guido van Rossum7928cd71991-10-24 14:59:31 +00001085 case BINARY_XOR:
1086 w = POP();
1087 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001088 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001089 Py_DECREF(v);
1090 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001091 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001092 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001093 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001094
Guido van Rossum7928cd71991-10-24 14:59:31 +00001095 case BINARY_OR:
1096 w = POP();
1097 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001098 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001099 Py_DECREF(v);
1100 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001101 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001102 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001103 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001104
1105 case INPLACE_POWER:
1106 w = POP();
1107 v = POP();
1108 x = PyNumber_InPlacePower(v, w, Py_None);
1109 Py_DECREF(v);
1110 Py_DECREF(w);
1111 PUSH(x);
1112 if (x != NULL) continue;
1113 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001114
Thomas Wouters434d0822000-08-24 20:11:32 +00001115 case INPLACE_MULTIPLY:
1116 w = POP();
1117 v = POP();
1118 x = PyNumber_InPlaceMultiply(v, w);
1119 Py_DECREF(v);
1120 Py_DECREF(w);
1121 PUSH(x);
1122 if (x != NULL) continue;
1123 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001124
Thomas Wouters434d0822000-08-24 20:11:32 +00001125 case INPLACE_DIVIDE:
1126 w = POP();
1127 v = POP();
1128 x = PyNumber_InPlaceDivide(v, w);
1129 Py_DECREF(v);
1130 Py_DECREF(w);
1131 PUSH(x);
1132 if (x != NULL) continue;
1133 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001134
Thomas Wouters434d0822000-08-24 20:11:32 +00001135 case INPLACE_MODULO:
1136 w = POP();
1137 v = POP();
1138 x = PyNumber_InPlaceRemainder(v, w);
1139 Py_DECREF(v);
1140 Py_DECREF(w);
1141 PUSH(x);
1142 if (x != NULL) continue;
1143 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001144
Thomas Wouters434d0822000-08-24 20:11:32 +00001145 case INPLACE_ADD:
1146 w = POP();
1147 v = POP();
1148 if (PyInt_Check(v) && PyInt_Check(w)) {
1149 /* INLINE: int + int */
1150 register long a, b, i;
1151 a = PyInt_AS_LONG(v);
1152 b = PyInt_AS_LONG(w);
1153 i = a + b;
1154 if ((i^a) < 0 && (i^b) < 0) {
1155 PyErr_SetString(PyExc_OverflowError,
1156 "integer addition");
1157 x = NULL;
1158 }
1159 else
1160 x = PyInt_FromLong(i);
1161 }
1162 else
1163 x = PyNumber_InPlaceAdd(v, w);
1164 Py_DECREF(v);
1165 Py_DECREF(w);
1166 PUSH(x);
1167 if (x != NULL) continue;
1168 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001169
Thomas Wouters434d0822000-08-24 20:11:32 +00001170 case INPLACE_SUBTRACT:
1171 w = POP();
1172 v = POP();
1173 if (PyInt_Check(v) && PyInt_Check(w)) {
1174 /* INLINE: int - int */
1175 register long a, b, i;
1176 a = PyInt_AS_LONG(v);
1177 b = PyInt_AS_LONG(w);
1178 i = a - b;
1179 if ((i^a) < 0 && (i^~b) < 0) {
1180 PyErr_SetString(PyExc_OverflowError,
1181 "integer subtraction");
1182 x = NULL;
1183 }
1184 else
1185 x = PyInt_FromLong(i);
1186 }
1187 else
1188 x = PyNumber_InPlaceSubtract(v, w);
1189 Py_DECREF(v);
1190 Py_DECREF(w);
1191 PUSH(x);
1192 if (x != NULL) continue;
1193 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001194
Thomas Wouters434d0822000-08-24 20:11:32 +00001195 case INPLACE_LSHIFT:
1196 w = POP();
1197 v = POP();
1198 x = PyNumber_InPlaceLshift(v, w);
1199 Py_DECREF(v);
1200 Py_DECREF(w);
1201 PUSH(x);
1202 if (x != NULL) continue;
1203 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001204
Thomas Wouters434d0822000-08-24 20:11:32 +00001205 case INPLACE_RSHIFT:
1206 w = POP();
1207 v = POP();
1208 x = PyNumber_InPlaceRshift(v, w);
1209 Py_DECREF(v);
1210 Py_DECREF(w);
1211 PUSH(x);
1212 if (x != NULL) continue;
1213 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001214
Thomas Wouters434d0822000-08-24 20:11:32 +00001215 case INPLACE_AND:
1216 w = POP();
1217 v = POP();
1218 x = PyNumber_InPlaceAnd(v, w);
1219 Py_DECREF(v);
1220 Py_DECREF(w);
1221 PUSH(x);
1222 if (x != NULL) continue;
1223 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001224
Thomas Wouters434d0822000-08-24 20:11:32 +00001225 case INPLACE_XOR:
1226 w = POP();
1227 v = POP();
1228 x = PyNumber_InPlaceXor(v, w);
1229 Py_DECREF(v);
1230 Py_DECREF(w);
1231 PUSH(x);
1232 if (x != NULL) continue;
1233 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001234
Thomas Wouters434d0822000-08-24 20:11:32 +00001235 case INPLACE_OR:
1236 w = POP();
1237 v = POP();
1238 x = PyNumber_InPlaceOr(v, w);
1239 Py_DECREF(v);
1240 Py_DECREF(w);
1241 PUSH(x);
1242 if (x != NULL) continue;
1243 break;
1244
Guido van Rossum374a9221991-04-04 10:40:29 +00001245 case SLICE+0:
1246 case SLICE+1:
1247 case SLICE+2:
1248 case SLICE+3:
1249 if ((opcode-SLICE) & 2)
1250 w = POP();
1251 else
1252 w = NULL;
1253 if ((opcode-SLICE) & 1)
1254 v = POP();
1255 else
1256 v = NULL;
1257 u = POP();
1258 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001259 Py_DECREF(u);
1260 Py_XDECREF(v);
1261 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001262 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001263 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001264 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001265
Guido van Rossum374a9221991-04-04 10:40:29 +00001266 case STORE_SLICE+0:
1267 case STORE_SLICE+1:
1268 case STORE_SLICE+2:
1269 case STORE_SLICE+3:
1270 if ((opcode-STORE_SLICE) & 2)
1271 w = POP();
1272 else
1273 w = NULL;
1274 if ((opcode-STORE_SLICE) & 1)
1275 v = POP();
1276 else
1277 v = NULL;
1278 u = POP();
1279 t = POP();
1280 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001281 Py_DECREF(t);
1282 Py_DECREF(u);
1283 Py_XDECREF(v);
1284 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001285 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001286 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001287
Guido van Rossum374a9221991-04-04 10:40:29 +00001288 case DELETE_SLICE+0:
1289 case DELETE_SLICE+1:
1290 case DELETE_SLICE+2:
1291 case DELETE_SLICE+3:
1292 if ((opcode-DELETE_SLICE) & 2)
1293 w = POP();
1294 else
1295 w = NULL;
1296 if ((opcode-DELETE_SLICE) & 1)
1297 v = POP();
1298 else
1299 v = NULL;
1300 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001301 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001302 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001303 Py_DECREF(u);
1304 Py_XDECREF(v);
1305 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001306 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001307 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001308
Guido van Rossum374a9221991-04-04 10:40:29 +00001309 case STORE_SUBSCR:
1310 w = POP();
1311 v = POP();
1312 u = POP();
1313 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001314 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001315 Py_DECREF(u);
1316 Py_DECREF(v);
1317 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001318 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001319 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001320
Guido van Rossum374a9221991-04-04 10:40:29 +00001321 case DELETE_SUBSCR:
1322 w = POP();
1323 v = POP();
1324 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001325 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001326 Py_DECREF(v);
1327 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001328 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001329 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001330
Guido van Rossum374a9221991-04-04 10:40:29 +00001331 case PRINT_EXPR:
1332 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001333 w = PySys_GetObject("displayhook");
1334 if (w == NULL) {
1335 PyErr_SetString(PyExc_RuntimeError,
1336 "lost sys.displayhook");
1337 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001338 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001339 }
1340 if (err == 0) {
1341 x = Py_BuildValue("(O)", v);
1342 if (x == NULL)
1343 err = -1;
1344 }
1345 if (err == 0) {
1346 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001347 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001348 if (w == NULL)
1349 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001350 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001351 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001352 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001353 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001354
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001355 case PRINT_ITEM_TO:
1356 w = stream = POP();
1357 /* fall through to PRINT_ITEM */
1358
Guido van Rossum374a9221991-04-04 10:40:29 +00001359 case PRINT_ITEM:
1360 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001361 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001362 w = PySys_GetObject("stdout");
1363 if (w == NULL) {
1364 PyErr_SetString(PyExc_RuntimeError,
1365 "lost sys.stdout");
1366 err = -1;
1367 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001368 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001369 if (w != NULL && PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001370 err = PyFile_WriteString(" ", w);
1371 if (err == 0)
1372 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001373 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001374 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001375 char *s = PyString_AsString(v);
1376 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001377 if (len > 0 &&
1378 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001379 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001380 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001381 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001382 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001383 Py_XDECREF(stream);
1384 stream = NULL;
1385 if (err == 0)
1386 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001387 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001388
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001389 case PRINT_NEWLINE_TO:
1390 w = stream = POP();
1391 /* fall through to PRINT_NEWLINE */
1392
Guido van Rossum374a9221991-04-04 10:40:29 +00001393 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001394 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001395 w = PySys_GetObject("stdout");
1396 if (w == NULL)
1397 PyErr_SetString(PyExc_RuntimeError,
1398 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001399 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001400 if (w != NULL) {
1401 err = PyFile_WriteString("\n", w);
1402 if (err == 0)
1403 PyFile_SoftSpace(w, 0);
1404 }
1405 Py_XDECREF(stream);
1406 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001407 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001408
Thomas Wouters434d0822000-08-24 20:11:32 +00001409
1410#ifdef CASE_TOO_BIG
1411 default: switch (opcode) {
1412#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001413 case BREAK_LOOP:
1414 why = WHY_BREAK;
1415 break;
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00001416
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001417 case CONTINUE_LOOP:
1418 retval = PyInt_FromLong(oparg);
1419 why = WHY_CONTINUE;
1420 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001421
Guido van Rossumf10570b1995-07-07 22:53:21 +00001422 case RAISE_VARARGS:
1423 u = v = w = NULL;
1424 switch (oparg) {
1425 case 3:
1426 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001427 /* Fallthrough */
1428 case 2:
1429 v = POP(); /* value */
1430 /* Fallthrough */
1431 case 1:
1432 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001433 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001434 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001435 break;
1436 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001437 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001438 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001439 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001440 break;
1441 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001442 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001443
Guido van Rossum374a9221991-04-04 10:40:29 +00001444 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001445 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001446 PyErr_SetString(PyExc_SystemError,
1447 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001448 break;
1449 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001450 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001451 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001452 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001453
Guido van Rossum374a9221991-04-04 10:40:29 +00001454 case RETURN_VALUE:
1455 retval = POP();
1456 why = WHY_RETURN;
1457 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001458
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001459 case EXEC_STMT:
1460 w = POP();
1461 v = POP();
1462 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001463 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001464 Py_DECREF(u);
1465 Py_DECREF(v);
1466 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001467 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001468
Guido van Rossum374a9221991-04-04 10:40:29 +00001469 case POP_BLOCK:
1470 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001471 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001472 while (STACK_LEVEL() > b->b_level) {
1473 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001474 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001475 }
1476 }
1477 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001478
Guido van Rossum374a9221991-04-04 10:40:29 +00001479 case END_FINALLY:
1480 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001481 if (PyInt_Check(v)) {
1482 why = (enum why_code) PyInt_AsLong(v);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001483 if (why == WHY_RETURN ||
1484 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00001485 retval = POP();
1486 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001487 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001488 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001489 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001490 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001491 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001492 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001493 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001494 else if (v != Py_None) {
1495 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001496 "'finally' pops bad exception");
1497 why = WHY_EXCEPTION;
1498 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001499 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001500 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001501
Guido van Rossum374a9221991-04-04 10:40:29 +00001502 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001503 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001504 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001505 w = POP();
1506 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001507 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001508 Py_DECREF(u);
1509 Py_DECREF(v);
1510 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001511 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001512
Guido van Rossum374a9221991-04-04 10:40:29 +00001513 case STORE_NAME:
1514 w = GETNAMEV(oparg);
1515 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001516 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001517 PyErr_Format(PyExc_SystemError,
1518 "no locals found when storing %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001519 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001520 break;
1521 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001522 err = PyDict_SetItem(x, w, v);
1523 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001524 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001525
Guido van Rossum374a9221991-04-04 10:40:29 +00001526 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001527 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001528 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001529 PyErr_Format(PyExc_SystemError,
1530 "no locals when deleting %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001531 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001532 break;
1533 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001534 if ((err = PyDict_DelItem(x, w)) != 0)
Guido van Rossumac7be682001-01-17 15:42:30 +00001535 format_exc_check_arg(PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001536 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001537 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001538
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001539 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001540 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001541 if (PyTuple_Check(v)) {
1542 if (PyTuple_Size(v) != oparg) {
1543 PyErr_SetString(PyExc_ValueError,
1544 "unpack tuple of wrong size");
1545 why = WHY_EXCEPTION;
1546 }
1547 else {
1548 for (; --oparg >= 0; ) {
1549 w = PyTuple_GET_ITEM(v, oparg);
1550 Py_INCREF(w);
1551 PUSH(w);
1552 }
1553 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001554 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001555 else if (PyList_Check(v)) {
1556 if (PyList_Size(v) != oparg) {
1557 PyErr_SetString(PyExc_ValueError,
1558 "unpack list of wrong size");
1559 why = WHY_EXCEPTION;
1560 }
1561 else {
1562 for (; --oparg >= 0; ) {
1563 w = PyList_GET_ITEM(v, oparg);
1564 Py_INCREF(w);
1565 PUSH(w);
1566 }
1567 }
1568 }
1569 else if (PySequence_Check(v)) {
1570 if (unpack_sequence(v, oparg,
1571 stack_pointer + oparg))
1572 stack_pointer += oparg;
1573 else
1574 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001575 }
1576 else {
Barry Warsawe42b18f1997-08-25 22:13:04 +00001577 PyErr_SetString(PyExc_TypeError,
1578 "unpack non-sequence");
1579 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001580 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001581 Py_DECREF(v);
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 STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001585 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001586 v = POP();
1587 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001588 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1589 Py_DECREF(v);
1590 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001591 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001592
Guido van Rossum374a9221991-04-04 10:40:29 +00001593 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001594 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001595 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001596 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1597 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001598 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001599 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001600
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001601 case STORE_GLOBAL:
1602 w = GETNAMEV(oparg);
1603 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001604 err = PyDict_SetItem(f->f_globals, w, v);
1605 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001606 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001607
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001608 case DELETE_GLOBAL:
1609 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001610 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001611 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001612 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001613 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001614
Guido van Rossum374a9221991-04-04 10:40:29 +00001615 case LOAD_CONST:
1616 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001617 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001618 PUSH(x);
1619 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001620
Guido van Rossum374a9221991-04-04 10:40:29 +00001621 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001622 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001623 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001624 PyErr_Format(PyExc_SystemError,
1625 "no locals when loading %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001626 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001627 break;
1628 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001629 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001630 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001631 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001632 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001633 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001634 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001635 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001636 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001637 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001638 break;
1639 }
1640 }
1641 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001642 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001643 PUSH(x);
1644 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001645
Guido van Rossum374a9221991-04-04 10:40:29 +00001646 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001647 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001648 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001649 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001650 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001651 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001652 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001653 PyExc_NameError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001654 GLOBAL_NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001655 break;
1656 }
1657 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001658 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001659 PUSH(x);
1660 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001661
Guido van Rossum9bfef441993-03-29 10:43:31 +00001662 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001663 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001664 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001665 format_exc_check_arg(
1666 PyExc_UnboundLocalError,
1667 UNBOUNDLOCAL_ERROR_MSG,
1668 PyTuple_GetItem(co->co_varnames, oparg)
1669 );
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001670 break;
1671 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001672 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001673 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001674 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001675 break;
1676
1677 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001678 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001679 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001680 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001681
1682 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001683 x = GETLOCAL(oparg);
1684 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001685 format_exc_check_arg(
1686 PyExc_UnboundLocalError,
1687 UNBOUNDLOCAL_ERROR_MSG,
1688 PyTuple_GetItem(co->co_varnames, oparg)
1689 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001690 break;
1691 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001692 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001693 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001694
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001695 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001696 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001697 Py_INCREF(x);
1698 PUSH(x);
1699 break;
1700
1701 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001702 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001703 w = PyCell_Get(x);
Jeremy Hylton2524d692001-02-05 17:23:16 +00001704 if (w == NULL) {
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001705 if (oparg < f->f_ncells) {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001706 v = PyTuple_GetItem(co->co_cellvars,
1707 oparg);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001708 format_exc_check_arg(
1709 PyExc_UnboundLocalError,
1710 UNBOUNDLOCAL_ERROR_MSG,
1711 v);
1712 } else {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001713 v = PyTuple_GetItem(
1714 co->co_freevars,
1715 oparg - f->f_ncells);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001716 format_exc_check_arg(
1717 PyExc_NameError,
1718 UNBOUNDFREE_ERROR_MSG,
1719 v);
1720 }
Jeremy Hylton2524d692001-02-05 17:23:16 +00001721 err = -1;
1722 break;
1723 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001724 PUSH(w);
1725 break;
1726
1727 case STORE_DEREF:
1728 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001729 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001730 PyCell_Set(x, w);
Jeremy Hylton30c9f392001-03-13 01:58:22 +00001731 Py_DECREF(w);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001732 continue;
1733
Guido van Rossum374a9221991-04-04 10:40:29 +00001734 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001735 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001736 if (x != NULL) {
1737 for (; --oparg >= 0;) {
1738 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001739 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001740 }
1741 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001742 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001743 }
1744 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001745
Guido van Rossum374a9221991-04-04 10:40:29 +00001746 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001747 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001748 if (x != NULL) {
1749 for (; --oparg >= 0;) {
1750 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001751 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001752 }
1753 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001754 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001755 }
1756 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001757
Guido van Rossum374a9221991-04-04 10:40:29 +00001758 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001759 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001760 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001761 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001762 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001763
Guido van Rossum374a9221991-04-04 10:40:29 +00001764 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001765 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001766 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001767 x = PyObject_GetAttr(v, w);
1768 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001769 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001770 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001771 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001772
Guido van Rossum374a9221991-04-04 10:40:29 +00001773 case COMPARE_OP:
1774 w = POP();
1775 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001776 if (PyInt_Check(v) && PyInt_Check(w)) {
1777 /* INLINE: cmp(int, int) */
1778 register long a, b;
1779 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001780 a = PyInt_AS_LONG(v);
1781 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001782 switch (oparg) {
1783 case LT: res = a < b; break;
1784 case LE: res = a <= b; break;
1785 case EQ: res = a == b; break;
1786 case NE: res = a != b; break;
1787 case GT: res = a > b; break;
1788 case GE: res = a >= b; break;
1789 case IS: res = v == w; break;
1790 case IS_NOT: res = v != w; break;
1791 default: goto slow_compare;
1792 }
1793 x = res ? Py_True : Py_False;
1794 Py_INCREF(x);
1795 }
1796 else {
1797 slow_compare:
1798 x = cmp_outcome(oparg, v, w);
1799 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001800 Py_DECREF(v);
1801 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001802 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001803 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001804 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001805
Guido van Rossum374a9221991-04-04 10:40:29 +00001806 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001807 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001808 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001809 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001810 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001811 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001812 break;
1813 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001814 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001815 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001816 w,
1817 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001818 f->f_locals == NULL ?
1819 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001820 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001821 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001822 if (w == NULL) {
1823 x = NULL;
1824 break;
1825 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001826 x = PyEval_CallObject(x, w);
1827 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001828 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001829 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001830 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001831
Thomas Wouters52152252000-08-17 22:55:00 +00001832 case IMPORT_STAR:
1833 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001834 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001835 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001836 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001837 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001838 break;
1839 }
Thomas Wouters52152252000-08-17 22:55:00 +00001840 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001841 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001842 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001843 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001844 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001845
Thomas Wouters52152252000-08-17 22:55:00 +00001846 case IMPORT_FROM:
1847 w = GETNAMEV(oparg);
1848 v = TOP();
1849 x = import_from(v, w);
1850 PUSH(x);
1851 if (x != NULL) continue;
1852 break;
1853
Guido van Rossum374a9221991-04-04 10:40:29 +00001854 case JUMP_FORWARD:
1855 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001856 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001857
Guido van Rossum374a9221991-04-04 10:40:29 +00001858 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001859 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001860 if (err > 0)
1861 err = 0;
1862 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001863 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001864 else
1865 break;
1866 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001867
Guido van Rossum374a9221991-04-04 10:40:29 +00001868 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001869 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001870 if (err > 0) {
1871 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001872 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001873 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001874 else if (err == 0)
1875 ;
1876 else
1877 break;
1878 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001879
Guido van Rossum374a9221991-04-04 10:40:29 +00001880 case JUMP_ABSOLUTE:
1881 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001882 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001883
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001884 case GET_ITER:
1885 /* before: [obj]; after [getiter(obj)] */
1886 v = POP();
1887 x = PyObject_GetIter(v);
1888 Py_DECREF(v);
1889 if (x != NULL) {
1890 w = x;
1891 x = PyObject_GetAttr(w, nextstr);
1892 Py_DECREF(w);
1893 if (x != NULL) {
1894 PUSH(x);
1895 continue;
1896 }
1897 }
1898 break;
1899
1900 case FOR_ITER:
1901 /* before: [iter]; after: [iter, iter()] *or* [] */
1902 v = TOP();
1903 x = PyObject_CallObject(v, NULL);
1904 if (x == NULL) {
1905 if (PyErr_ExceptionMatches(
1906 PyExc_StopIteration))
1907 {
1908 PyErr_Clear();
1909 x = v = POP();
1910 Py_DECREF(v);
1911 JUMPBY(oparg);
1912 continue;
1913 }
1914 break;
1915 }
1916 PUSH(x);
1917 continue;
1918
Guido van Rossum374a9221991-04-04 10:40:29 +00001919 case FOR_LOOP:
1920 /* for v in s: ...
1921 On entry: stack contains s, i.
1922 On exit: stack contains s, i+1, s[i];
1923 but if loop exhausted:
1924 s, i are popped, and we jump */
1925 w = POP(); /* Loop index */
1926 v = POP(); /* Sequence object */
1927 u = loop_subscript(v, w);
1928 if (u != NULL) {
1929 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001930 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001931 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001932 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001933 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001934 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001935 }
1936 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001937 Py_DECREF(v);
1938 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001939 /* A NULL can mean "s exhausted"
1940 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001941 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001942 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001943 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001944 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001945 continue;
1946 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001947 }
1948 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001949
Guido van Rossum374a9221991-04-04 10:40:29 +00001950 case SETUP_LOOP:
1951 case SETUP_EXCEPT:
1952 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001953 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001954 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001955 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001956
Guido van Rossum374a9221991-04-04 10:40:29 +00001957 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001958#ifdef LLTRACE
1959 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001960 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001961#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001962 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001963 if (f->f_trace == NULL)
1964 continue;
1965 /* Trace each line of code reached */
1966 f->f_lasti = INSTR_OFFSET();
1967 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossumb209a111997-04-29 18:18:01 +00001968 f, "line", Py_None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001969 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001970
1971 case CALL_FUNCTION:
Jeremy Hylton52820442001-01-03 23:52:36 +00001972 {
1973 int na = oparg & 0xff;
1974 int nk = (oparg>>8) & 0xff;
1975 int n = na + 2 * nk;
1976 PyObject **pfunc = stack_pointer - n - 1;
1977 PyObject *func = *pfunc;
1978 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1979
1980 /* Always dispatch PyCFunction first, because
1981 these are presumed to be the most frequent
1982 callable object.
1983 */
1984 if (PyCFunction_Check(func)) {
1985 if (PyCFunction_GET_FLAGS(func) == 0) {
1986 x = fast_cfunction(func,
Guido van Rossumac7be682001-01-17 15:42:30 +00001987 &stack_pointer, na);
Jeremy Hylton52820442001-01-03 23:52:36 +00001988 } else {
1989 x = do_call(func, &stack_pointer,
1990 na, nk);
1991 }
1992 } else {
Guido van Rossumac7be682001-01-17 15:42:30 +00001993 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001994 && PyMethod_GET_SELF(func) != NULL) {
1995 /* optimize access to bound methods */
1996 PyObject *self = PyMethod_GET_SELF(func);
1997 Py_INCREF(self);
1998 func = PyMethod_GET_FUNCTION(func);
1999 Py_INCREF(func);
2000 Py_DECREF(*pfunc);
2001 *pfunc = self;
2002 na++;
2003 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00002004 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00002005 Py_INCREF(func);
2006 if (PyFunction_Check(func)) {
2007 x = fast_function(func, &stack_pointer,
Guido van Rossumac7be682001-01-17 15:42:30 +00002008 n, na, nk);
Jeremy Hylton52820442001-01-03 23:52:36 +00002009 } else {
2010 x = do_call(func, &stack_pointer,
2011 na, nk);
2012 }
2013 Py_DECREF(func);
2014 }
2015
2016 while (stack_pointer > pfunc) {
2017 w = POP();
2018 Py_DECREF(w);
2019 }
2020 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002021 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002022 continue;
2023 break;
2024 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002025
Jeremy Hylton76901512000-03-28 23:49:17 +00002026 case CALL_FUNCTION_VAR:
2027 case CALL_FUNCTION_KW:
2028 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00002029 {
Jeremy Hylton76901512000-03-28 23:49:17 +00002030 int na = oparg & 0xff;
2031 int nk = (oparg>>8) & 0xff;
2032 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00002033 int n = na + 2 * nk;
2034 PyObject **pfunc, *func;
2035 if (flags & CALL_FLAG_VAR)
2036 n++;
2037 if (flags & CALL_FLAG_KW)
2038 n++;
2039 pfunc = stack_pointer - n - 1;
2040 func = *pfunc;
Jeremy Hylton76901512000-03-28 23:49:17 +00002041 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Jeremy Hylton52820442001-01-03 23:52:36 +00002042
Guido van Rossumac7be682001-01-17 15:42:30 +00002043 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00002044 && PyMethod_GET_SELF(func) != NULL) {
2045 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002046 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00002047 func = PyMethod_GET_FUNCTION(func);
2048 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002049 Py_DECREF(*pfunc);
2050 *pfunc = self;
2051 na++;
2052 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00002053 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00002054 Py_INCREF(func);
2055 x = ext_do_call(func, &stack_pointer, flags, na, nk);
Jeremy Hylton76901512000-03-28 23:49:17 +00002056 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002057
Jeremy Hylton76901512000-03-28 23:49:17 +00002058 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00002059 w = POP();
2060 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00002061 }
2062 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002063 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002064 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00002065 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002066 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002067
Guido van Rossum681d79a1995-07-18 14:51:37 +00002068 case MAKE_FUNCTION:
2069 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00002070 x = PyFunction_New(v, f->f_globals);
2071 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002072 /* XXX Maybe this should be a separate opcode? */
2073 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002074 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002075 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002076 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002077 x = NULL;
2078 break;
2079 }
2080 while (--oparg >= 0) {
2081 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002082 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002083 }
2084 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00002085 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002086 }
2087 PUSH(x);
2088 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002089
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002090 case MAKE_CLOSURE:
2091 {
2092 int nfree;
2093 v = POP(); /* code object */
2094 x = PyFunction_New(v, f->f_globals);
2095 nfree = PyTuple_GET_SIZE(((PyCodeObject *)v)->co_freevars);
2096 Py_DECREF(v);
2097 /* XXX Maybe this should be a separate opcode? */
2098 if (x != NULL && nfree > 0) {
2099 v = PyTuple_New(nfree);
2100 if (v == NULL) {
2101 Py_DECREF(x);
2102 x = NULL;
2103 break;
2104 }
2105 while (--nfree >= 0) {
2106 w = POP();
2107 PyTuple_SET_ITEM(v, nfree, w);
2108 }
2109 err = PyFunction_SetClosure(x, v);
2110 Py_DECREF(v);
2111 }
2112 if (x != NULL && oparg > 0) {
2113 v = PyTuple_New(oparg);
2114 if (v == NULL) {
2115 Py_DECREF(x);
2116 x = NULL;
2117 break;
2118 }
2119 while (--oparg >= 0) {
2120 w = POP();
2121 PyTuple_SET_ITEM(v, oparg, w);
2122 }
2123 err = PyFunction_SetDefaults(x, v);
2124 Py_DECREF(v);
2125 }
2126 PUSH(x);
2127 break;
2128 }
2129
Guido van Rossum8861b741996-07-30 16:49:37 +00002130 case BUILD_SLICE:
2131 if (oparg == 3)
2132 w = POP();
2133 else
2134 w = NULL;
2135 v = POP();
2136 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002137 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002138 Py_DECREF(u);
2139 Py_DECREF(v);
2140 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00002141 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002142 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002143 break;
2144
Fred Drakeef8ace32000-08-24 00:32:09 +00002145 case EXTENDED_ARG:
2146 opcode = NEXTOP();
2147 oparg = oparg<<16 | NEXTARG();
2148 goto dispatch_opcode;
Guido van Rossum8861b741996-07-30 16:49:37 +00002149
Guido van Rossum374a9221991-04-04 10:40:29 +00002150 default:
2151 fprintf(stderr,
2152 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00002153 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002154 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002155 why = WHY_EXCEPTION;
2156 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002157
2158#ifdef CASE_TOO_BIG
2159 }
2160#endif
2161
Guido van Rossum374a9221991-04-04 10:40:29 +00002162 } /* switch */
2163
2164 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002165
Guido van Rossum374a9221991-04-04 10:40:29 +00002166 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002167
Guido van Rossum374a9221991-04-04 10:40:29 +00002168 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002169 if (err == 0 && x != NULL) {
2170#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002171 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002172 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002173 fprintf(stderr,
2174 "XXX undetected error\n");
2175 else
2176#endif
2177 continue; /* Normal, fast path */
2178 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002179 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002180 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002181 err = 0;
2182 }
2183
Guido van Rossum374a9221991-04-04 10:40:29 +00002184 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002185
Guido van Rossum374a9221991-04-04 10:40:29 +00002186 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002187 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002188 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002189 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002190 why = WHY_EXCEPTION;
2191 }
2192 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002193#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002194 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002195 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002196 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002197 fprintf(stderr,
2198 "XXX undetected error (why=%d)\n",
2199 why);
2200 why = WHY_EXCEPTION;
2201 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002202 }
2203#endif
2204
2205 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002206
Guido van Rossum374a9221991-04-04 10:40:29 +00002207 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002208 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00002209 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00002210 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00002211 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002212
Guido van Rossume59214e1994-08-30 08:01:59 +00002213 if (f->f_trace)
2214 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002215 if (tstate->sys_profilefunc)
2216 call_exc_trace(&tstate->sys_profilefunc,
2217 (PyObject**)0, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002218 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002219
Guido van Rossum374a9221991-04-04 10:40:29 +00002220 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002221
Guido van Rossum374a9221991-04-04 10:40:29 +00002222 if (why == WHY_RERAISE)
2223 why = WHY_EXCEPTION;
2224
2225 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002226
Guido van Rossum374a9221991-04-04 10:40:29 +00002227 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002228 PyTryBlock *b = PyFrame_BlockPop(f);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002229
2230 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2231 /* For a continue inside a try block,
2232 don't pop the block for the loop. */
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00002233 PyFrame_BlockSetup(f, b->b_type, b->b_level,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002234 b->b_handler);
2235 why = WHY_NOT;
2236 JUMPTO(PyInt_AS_LONG(retval));
2237 Py_DECREF(retval);
2238 break;
2239 }
2240
Guido van Rossum374a9221991-04-04 10:40:29 +00002241 while (STACK_LEVEL() > b->b_level) {
2242 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002243 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002244 }
2245 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2246 why = WHY_NOT;
2247 JUMPTO(b->b_handler);
2248 break;
2249 }
2250 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002251 (b->b_type == SETUP_EXCEPT &&
2252 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002253 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002254 PyObject *exc, *val, *tb;
2255 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002256 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002257 val = Py_None;
2258 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002259 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002260 /* Make the raw exception data
2261 available to the handler,
2262 so a program can emulate the
2263 Python main loop. Don't do
2264 this for 'finally'. */
2265 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002266 PyErr_NormalizeException(
2267 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002268 set_exc_info(tstate,
2269 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002270 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002271 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002272 PUSH(val);
2273 PUSH(exc);
2274 }
2275 else {
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002276 if (why == WHY_RETURN ||
2277 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00002278 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002279 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002280 PUSH(v);
2281 }
2282 why = WHY_NOT;
2283 JUMPTO(b->b_handler);
2284 break;
2285 }
2286 } /* unwind stack */
2287
2288 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002289
Guido van Rossum374a9221991-04-04 10:40:29 +00002290 if (why != WHY_NOT)
2291 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002292
Guido van Rossum374a9221991-04-04 10:40:29 +00002293 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002294
Guido van Rossum374a9221991-04-04 10:40:29 +00002295 /* Pop remaining stack entries */
Guido van Rossumac7be682001-01-17 15:42:30 +00002296
Guido van Rossum374a9221991-04-04 10:40:29 +00002297 while (!EMPTY()) {
2298 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002299 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002300 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002301
Guido van Rossum96a42c81992-01-12 02:29:51 +00002302 if (why != WHY_RETURN)
2303 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002304
Guido van Rossume59214e1994-08-30 08:01:59 +00002305 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002306 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00002307 if (call_trace(&f->f_trace, &f->f_trace, f,
2308 "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002309 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002310 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002311 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002312 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002313 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002314 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002315
Guido van Rossuma027efa1997-05-05 20:56:21 +00002316 if (tstate->sys_profilefunc && why == WHY_RETURN) {
2317 if (call_trace(&tstate->sys_profilefunc, (PyObject**)0,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002318 f, "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002319 Py_XDECREF(retval);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002320 retval = NULL;
2321 why = WHY_EXCEPTION;
2322 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002323 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002324
Guido van Rossuma027efa1997-05-05 20:56:21 +00002325 reset_exc_info(tstate);
2326
2327 --tstate->recursion_depth;
Guido van Rossum8c5df061997-01-24 04:19:24 +00002328
2329 fail: /* Jump here from prelude on failure */
Guido van Rossumac7be682001-01-17 15:42:30 +00002330
Guido van Rossum374a9221991-04-04 10:40:29 +00002331 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00002332
Guido van Rossuma027efa1997-05-05 20:56:21 +00002333 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +00002334 Py_DECREF(f);
Guido van Rossumac7be682001-01-17 15:42:30 +00002335
Guido van Rossum96a42c81992-01-12 02:29:51 +00002336 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002337}
2338
Guido van Rossuma027efa1997-05-05 20:56:21 +00002339static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002340set_exc_info(PyThreadState *tstate,
2341 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002342{
2343 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002344 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002345
Guido van Rossuma027efa1997-05-05 20:56:21 +00002346 frame = tstate->frame;
2347 if (frame->f_exc_type == NULL) {
2348 /* This frame didn't catch an exception before */
2349 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002350 if (tstate->exc_type == NULL) {
2351 Py_INCREF(Py_None);
2352 tstate->exc_type = Py_None;
2353 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002354 tmp_type = frame->f_exc_type;
2355 tmp_value = frame->f_exc_value;
2356 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002357 Py_XINCREF(tstate->exc_type);
2358 Py_XINCREF(tstate->exc_value);
2359 Py_XINCREF(tstate->exc_traceback);
2360 frame->f_exc_type = tstate->exc_type;
2361 frame->f_exc_value = tstate->exc_value;
2362 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002363 Py_XDECREF(tmp_type);
2364 Py_XDECREF(tmp_value);
2365 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002366 }
2367 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002368 tmp_type = tstate->exc_type;
2369 tmp_value = tstate->exc_value;
2370 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002371 Py_XINCREF(type);
2372 Py_XINCREF(value);
2373 Py_XINCREF(tb);
2374 tstate->exc_type = type;
2375 tstate->exc_value = value;
2376 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002377 Py_XDECREF(tmp_type);
2378 Py_XDECREF(tmp_value);
2379 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002380 /* For b/w compatibility */
2381 PySys_SetObject("exc_type", type);
2382 PySys_SetObject("exc_value", value);
2383 PySys_SetObject("exc_traceback", tb);
2384}
2385
2386static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002387reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002388{
2389 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002390 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002391 frame = tstate->frame;
2392 if (frame->f_exc_type != NULL) {
2393 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002394 tmp_type = tstate->exc_type;
2395 tmp_value = tstate->exc_value;
2396 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002397 Py_XINCREF(frame->f_exc_type);
2398 Py_XINCREF(frame->f_exc_value);
2399 Py_XINCREF(frame->f_exc_traceback);
2400 tstate->exc_type = frame->f_exc_type;
2401 tstate->exc_value = frame->f_exc_value;
2402 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002403 Py_XDECREF(tmp_type);
2404 Py_XDECREF(tmp_value);
2405 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002406 /* For b/w compatibility */
2407 PySys_SetObject("exc_type", frame->f_exc_type);
2408 PySys_SetObject("exc_value", frame->f_exc_value);
2409 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2410 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002411 tmp_type = frame->f_exc_type;
2412 tmp_value = frame->f_exc_value;
2413 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002414 frame->f_exc_type = NULL;
2415 frame->f_exc_value = NULL;
2416 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002417 Py_XDECREF(tmp_type);
2418 Py_XDECREF(tmp_value);
2419 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002420}
2421
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002422/* Logic for the raise statement (too complicated for inlining).
2423 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002424static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002425do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002426{
Guido van Rossumd295f121998-04-09 21:39:57 +00002427 if (type == NULL) {
2428 /* Reraise */
2429 PyThreadState *tstate = PyThreadState_Get();
2430 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2431 value = tstate->exc_value;
2432 tb = tstate->exc_traceback;
2433 Py_XINCREF(type);
2434 Py_XINCREF(value);
2435 Py_XINCREF(tb);
2436 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002437
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002438 /* We support the following forms of raise:
2439 raise <class>, <classinstance>
2440 raise <class>, <argument tuple>
2441 raise <class>, None
2442 raise <class>, <argument>
2443 raise <classinstance>, None
2444 raise <string>, <object>
2445 raise <string>, None
2446
2447 An omitted second argument is the same as None.
2448
2449 In addition, raise <tuple>, <anything> is the same as
2450 raising the tuple's first item (and it better have one!);
2451 this rule is applied recursively.
2452
2453 Finally, an optional third argument can be supplied, which
2454 gives the traceback to be substituted (useful when
2455 re-raising an exception after examining it). */
2456
2457 /* First, check the traceback argument, replacing None with
2458 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002459 if (tb == Py_None) {
2460 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002461 tb = NULL;
2462 }
2463 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002464 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002465 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002466 goto raise_error;
2467 }
2468
2469 /* Next, replace a missing value with None */
2470 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002471 value = Py_None;
2472 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002473 }
2474
2475 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002476 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2477 PyObject *tmp = type;
2478 type = PyTuple_GET_ITEM(type, 0);
2479 Py_INCREF(type);
2480 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002481 }
2482
Barry Warsaw4249f541997-08-22 21:26:19 +00002483 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002484 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002485
2486 else if (PyClass_Check(type))
2487 PyErr_NormalizeException(&type, &value, &tb);
2488
Guido van Rossumb209a111997-04-29 18:18:01 +00002489 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002490 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002491 if (value != Py_None) {
2492 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002493 "instance exception may not have a separate value");
2494 goto raise_error;
2495 }
2496 else {
2497 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002498 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002499 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002500 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2501 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002502 }
2503 }
2504 else {
2505 /* Not something you can raise. You get an exception
2506 anyway, just not what you specified :-) */
Guido van Rossumb209a111997-04-29 18:18:01 +00002507 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002508 "exceptions must be strings, classes, or instances");
2509 goto raise_error;
2510 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002511 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002512 if (tb == NULL)
2513 return WHY_EXCEPTION;
2514 else
2515 return WHY_RERAISE;
2516 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002517 Py_XDECREF(value);
2518 Py_XDECREF(type);
2519 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002520 return WHY_EXCEPTION;
2521}
2522
Barry Warsawe42b18f1997-08-25 22:13:04 +00002523static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002524unpack_sequence(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002525{
2526 int i;
2527 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00002528
Barry Warsawe42b18f1997-08-25 22:13:04 +00002529 for (i = 0; i < argcnt; i++) {
2530 if (! (w = PySequence_GetItem(v, i))) {
2531 if (PyErr_ExceptionMatches(PyExc_IndexError))
2532 PyErr_SetString(PyExc_ValueError,
2533 "unpack sequence of wrong size");
2534 goto finally;
2535 }
2536 *--sp = w;
2537 }
2538 /* we better get an IndexError now */
2539 if (PySequence_GetItem(v, i) == NULL) {
2540 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2541 PyErr_Clear();
2542 return 1;
2543 }
2544 /* some other exception occurred. fall through to finally */
2545 }
2546 else
2547 PyErr_SetString(PyExc_ValueError,
2548 "unpack sequence of wrong size");
2549 /* fall through */
2550finally:
Barry Warsaw91010551997-08-25 22:30:51 +00002551 for (; i > 0; i--, sp++)
2552 Py_DECREF(*sp);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002553
2554 return 0;
2555}
2556
2557
Guido van Rossum96a42c81992-01-12 02:29:51 +00002558#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002559static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002560prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002561{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002562 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002563 if (PyObject_Print(v, stdout, 0) != 0)
2564 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002565 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002566 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002567}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002568#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002569
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002570static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002571call_exc_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002572{
Guido van Rossumb209a111997-04-29 18:18:01 +00002573 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002574 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002575 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002576 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002577 value = Py_None;
2578 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002579 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002580 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002581 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002582 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002583 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002584 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002585 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002586 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002587 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002588 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002589 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002590 Py_XDECREF(type);
2591 Py_XDECREF(value);
2592 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002593 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002594}
2595
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002596/* PyObject **p_trace: in/out; may not be NULL;
2597 may not point to NULL variable initially
2598 PyObject **p_newtrace: in/out; may be NULL;
2599 may point to NULL variable;
2600 may be same variable as p_newtrace */
2601
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002602static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002603call_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f,
2604 char *msg, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002605{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002606 PyThreadState *tstate = f->f_tstate;
Guido van Rossumb209a111997-04-29 18:18:01 +00002607 PyObject *args, *what;
2608 PyObject *res = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002609
Guido van Rossuma027efa1997-05-05 20:56:21 +00002610 if (tstate->tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002611 /* Don't do recursive traces */
2612 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002613 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002614 *p_newtrace = NULL;
2615 }
2616 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002617 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002618
Guido van Rossumb209a111997-04-29 18:18:01 +00002619 args = PyTuple_New(3);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002620 if (args == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002621 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002622 what = PyString_FromString(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002623 if (what == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002624 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002625 Py_INCREF(f);
2626 PyTuple_SET_ITEM(args, 0, (PyObject *)f);
2627 PyTuple_SET_ITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002628 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002629 arg = Py_None;
2630 Py_INCREF(arg);
2631 PyTuple_SET_ITEM(args, 2, arg);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002632 tstate->tracing++;
Guido van Rossumb209a111997-04-29 18:18:01 +00002633 PyFrame_FastToLocals(f);
2634 res = PyEval_CallObject(*p_trace, args); /* May clear *p_trace! */
2635 PyFrame_LocalsToFast(f, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002636 tstate->tracing--;
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002637 cleanup:
Guido van Rossumb209a111997-04-29 18:18:01 +00002638 Py_XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002639 if (res == NULL) {
2640 /* The trace proc raised an exception */
Guido van Rossumb209a111997-04-29 18:18:01 +00002641 PyTraceBack_Here(f);
2642 Py_XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002643 *p_trace = NULL;
2644 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002645 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002646 *p_newtrace = NULL;
2647 }
Barry Warsawf6202631999-09-08 16:26:33 +00002648 /* to be extra double plus sure we don't get recursive
2649 * calls inf either tracefunc or profilefunc gets an
2650 * exception, zap the global variables.
2651 */
2652 Py_XDECREF(tstate->sys_tracefunc);
2653 tstate->sys_tracefunc = NULL;
2654 Py_XDECREF(tstate->sys_profilefunc);
2655 tstate->sys_profilefunc = NULL;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002656 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002657 }
2658 else {
2659 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002660 Py_XDECREF(*p_newtrace);
2661 if (res == Py_None)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002662 *p_newtrace = NULL;
2663 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002664 Py_INCREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002665 *p_newtrace = res;
2666 }
2667 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002668 Py_DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002669 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002670 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002671}
2672
Guido van Rossumb209a111997-04-29 18:18:01 +00002673PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002674PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002675{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002676 PyThreadState *tstate = PyThreadState_Get();
2677 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002678 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002679 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002680 else
2681 return current_frame->f_builtins;
2682}
2683
Guido van Rossumb209a111997-04-29 18:18:01 +00002684PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002685PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002686{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002687 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002688 if (current_frame == NULL)
2689 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002690 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002691 return current_frame->f_locals;
2692}
2693
Guido van Rossumb209a111997-04-29 18:18:01 +00002694PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002695PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002696{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002697 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002698 if (current_frame == NULL)
2699 return NULL;
2700 else
2701 return current_frame->f_globals;
2702}
2703
Guido van Rossumb209a111997-04-29 18:18:01 +00002704PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002705PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002706{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002707 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002708 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002709}
2710
Guido van Rossum6135a871995-01-09 17:53:26 +00002711int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002712PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002713{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002714 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002715 return current_frame == NULL ? 0 : current_frame->f_restricted;
2716}
2717
Guido van Rossumbe270261997-05-22 22:26:18 +00002718int
Jeremy Hylton061d1062001-03-22 02:32:48 +00002719PyEval_GetNestedScopes(void)
2720{
2721 PyFrameObject *current_frame = PyThreadState_Get()->frame;
2722 return current_frame == NULL ? 0 :
2723 current_frame->f_code->co_flags & CO_NESTED;
2724}
2725
2726int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002727Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002728{
Guido van Rossumb209a111997-04-29 18:18:01 +00002729 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002730 if (f == NULL)
2731 return 0;
2732 if (!PyFile_SoftSpace(f, 0))
2733 return 0;
2734 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002735}
2736
Guido van Rossum3f5da241990-12-20 15:06:42 +00002737
Guido van Rossum681d79a1995-07-18 14:51:37 +00002738/* External interface to call any callable object.
2739 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002740
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002741#undef PyEval_CallObject
2742/* for backward compatibility: export this interface */
2743
Guido van Rossumb209a111997-04-29 18:18:01 +00002744PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002745PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002746{
Guido van Rossumb209a111997-04-29 18:18:01 +00002747 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002748}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002749#define PyEval_CallObject(func,arg) \
2750 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002751
Guido van Rossumb209a111997-04-29 18:18:01 +00002752PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002753PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002754{
Jeremy Hylton52820442001-01-03 23:52:36 +00002755 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002756
2757 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002758 arg = PyTuple_New(0);
2759 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002760 PyErr_SetString(PyExc_TypeError,
2761 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002762 return NULL;
2763 }
2764 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002765 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002766
Guido van Rossumb209a111997-04-29 18:18:01 +00002767 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002768 PyErr_SetString(PyExc_TypeError,
2769 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00002770 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002771 return NULL;
2772 }
2773
Jeremy Hylton52820442001-01-03 23:52:36 +00002774 result = call_object(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002775 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00002776 return result;
2777}
2778
2779/* How often is each kind of object called? The answer depends on the
2780 program. An instrumented call_object() was used to run the Python
2781 regression test suite. The results were:
2782 4200000 PyCFunctions
2783 390000 fast_function() calls
2784 94000 other functions
2785 480000 all functions (sum of prev two)
2786 150000 methods
2787 100000 classes
2788
2789 Tests on other bodies of code show that PyCFunctions are still
2790 most common, but not by such a large margin.
2791*/
2792
Jeremy Hylton512a2372001-04-11 13:52:29 +00002793static char *
2794get_func_name(PyObject *func)
2795{
2796 if (PyMethod_Check(func))
2797 return get_func_name(PyMethod_GET_FUNCTION(func));
2798 else if (PyFunction_Check(func))
2799 return PyString_AsString(((PyFunctionObject*)func)->func_name);
2800 else if (PyCFunction_Check(func))
2801 return ((PyCFunctionObject*)func)->m_ml->ml_name;
2802 else if (PyClass_Check(func))
2803 return PyString_AsString(((PyClassObject*)func)->cl_name);
2804 else if (PyInstance_Check(func)) {
2805 return PyString_AsString(
2806 ((PyInstanceObject*)func)->in_class->cl_name);
2807 } else {
2808 return func->ob_type->tp_name;
2809 }
2810}
2811
2812static char *
2813get_func_desc(PyObject *func)
2814{
2815 if (PyMethod_Check(func))
2816 return "()";
2817 else if (PyFunction_Check(func))
2818 return "()";
2819 else if (PyCFunction_Check(func))
2820 return "()";
2821 else if (PyClass_Check(func))
2822 return " constructor";
2823 else if (PyInstance_Check(func)) {
2824 return " instance";
2825 } else {
2826 return " object";
2827 }
2828}
2829
Jeremy Hylton52820442001-01-03 23:52:36 +00002830static PyObject *
2831call_object(PyObject *func, PyObject *arg, PyObject *kw)
2832{
2833 ternaryfunc call;
2834 PyObject *result;
2835
2836 if (PyMethod_Check(func))
2837 result = call_method(func, arg, kw);
2838 else if (PyFunction_Check(func))
2839 result = call_eval_code2(func, arg, kw);
2840 else if (PyCFunction_Check(func))
2841 result = call_cfunction(func, arg, kw);
2842 else if (PyClass_Check(func))
2843 result = PyInstance_New(func, arg, kw);
2844 else if (PyInstance_Check(func))
2845 result = call_instance(func, arg, kw);
2846 else if ((call = func->ob_type->tp_call) != NULL)
2847 result = (*call)(func, arg, kw);
2848 else {
2849 PyErr_Format(PyExc_TypeError, "object is not callable: %s",
2850 PyString_AS_STRING(PyObject_Repr(func)));
2851 return NULL;
2852 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002853 if (result == NULL && !PyErr_Occurred())
2854 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002855 "NULL result without error in call_object");
Guido van Rossumac7be682001-01-17 15:42:30 +00002856
Guido van Rossume59214e1994-08-30 08:01:59 +00002857 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002858}
2859
Guido van Rossumb209a111997-04-29 18:18:01 +00002860static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00002861call_cfunction(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002862{
Jeremy Hylton52820442001-01-03 23:52:36 +00002863 PyCFunctionObject* f = (PyCFunctionObject*)func;
2864 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
2865 PyObject *self = PyCFunction_GET_SELF(func);
2866 int flags = PyCFunction_GET_FLAGS(func);
2867
Jeremy Hylton52820442001-01-03 23:52:36 +00002868 if (flags & METH_KEYWORDS) {
2869 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002870 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002871 if (kw != NULL && PyDict_Size(kw) != 0) {
2872 PyErr_Format(PyExc_TypeError,
2873 "%.200s() takes no keyword arguments",
2874 f->m_ml->ml_name);
2875 return NULL;
2876 }
Fred Drake1a7aab72001-01-04 22:33:02 +00002877 if (flags & METH_VARARGS) {
2878 return (*meth)(self, arg);
2879 }
2880 if (!(flags & METH_VARARGS)) {
2881 /* the really old style */
2882 int size = PyTuple_GET_SIZE(arg);
2883 if (size == 1)
2884 arg = PyTuple_GET_ITEM(arg, 0);
2885 else if (size == 0)
2886 arg = NULL;
2887 return (*meth)(self, arg);
2888 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002889 /* should never get here ??? */
2890 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002891 return NULL;
2892}
2893
Guido van Rossumb209a111997-04-29 18:18:01 +00002894static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00002895call_instance(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002896{
Jeremy Hylton52820442001-01-03 23:52:36 +00002897 PyObject *res, *call = PyObject_GetAttrString(func, "__call__");
2898 if (call == NULL) {
2899 PyInstanceObject *inst = (PyInstanceObject*) func;
2900 PyErr_Clear();
2901 PyErr_Format(PyExc_AttributeError,
2902 "%.200s instance has no __call__ method",
2903 PyString_AsString(inst->in_class->cl_name));
Guido van Rossum681d79a1995-07-18 14:51:37 +00002904 return NULL;
2905 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002906 res = call_object(call, arg, kw);
2907 Py_DECREF(call);
2908 return res;
2909}
2910
2911static PyObject *
2912call_method(PyObject *func, PyObject *arg, PyObject *kw)
2913{
2914 PyObject *self = PyMethod_GET_SELF(func);
2915 PyObject *class = PyMethod_GET_CLASS(func);
2916 PyObject *result;
2917
2918 func = PyMethod_GET_FUNCTION(func);
2919 if (self == NULL) {
2920 /* Unbound methods must be called with an instance of
2921 the class (or a derived class) as first argument */
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00002922 int ok;
Jeremy Hylton52820442001-01-03 23:52:36 +00002923 if (PyTuple_Size(arg) >= 1)
2924 self = PyTuple_GET_ITEM(arg, 0);
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00002925 if (self == NULL)
2926 ok = 0;
2927 else {
2928 ok = PyObject_IsInstance(self, class);
2929 if (ok < 0)
2930 return NULL;
2931 }
2932 if (!ok) {
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00002933 PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00002934 "unbound method %s%s must be "
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00002935 "called with instance as first argument",
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00002936 get_func_name(func), get_func_desc(func));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002937 return NULL;
2938 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002939 Py_INCREF(arg);
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00002940 }
2941 else {
Jeremy Hylton52820442001-01-03 23:52:36 +00002942 int argcount = PyTuple_Size(arg);
2943 PyObject *newarg = PyTuple_New(argcount + 1);
2944 int i;
2945 if (newarg == NULL)
2946 return NULL;
2947 Py_INCREF(self);
2948 PyTuple_SET_ITEM(newarg, 0, self);
2949 for (i = 0; i < argcount; i++) {
2950 PyObject *v = PyTuple_GET_ITEM(arg, i);
2951 Py_XINCREF(v);
2952 PyTuple_SET_ITEM(newarg, i+1, v);
2953 }
2954 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002955 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002956 result = call_object(func, arg, kw);
2957 Py_DECREF(arg);
2958 return result;
2959}
2960
2961static PyObject *
2962call_eval_code2(PyObject *func, PyObject *arg, PyObject *kw)
2963{
2964 PyObject *result;
2965 PyObject *argdefs;
2966 PyObject **d, **k;
2967 int nk, nd;
2968
2969 argdefs = PyFunction_GET_DEFAULTS(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00002970 if (argdefs != NULL && PyTuple_Check(argdefs)) {
2971 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
2972 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002973 }
2974 else {
2975 d = NULL;
2976 nd = 0;
2977 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002978
Guido van Rossum681d79a1995-07-18 14:51:37 +00002979 if (kw != NULL) {
2980 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002981 nk = PyDict_Size(kw);
2982 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002983 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002984 PyErr_NoMemory();
2985 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002986 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002987 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002988 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002989 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002990 i += 2;
2991 nk = i/2;
2992 /* XXX This is broken if the caller deletes dict items! */
2993 }
2994 else {
2995 k = NULL;
2996 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002997 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002998
Guido van Rossum681d79a1995-07-18 14:51:37 +00002999 result = eval_code2(
Jeremy Hylton52820442001-01-03 23:52:36 +00003000 (PyCodeObject *)PyFunction_GET_CODE(func),
3001 PyFunction_GET_GLOBALS(func), (PyObject *)NULL,
Guido van Rossumb209a111997-04-29 18:18:01 +00003002 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003003 k, nk, d, nd,
3004 PyFunction_GET_CLOSURE(func));
Guido van Rossumac7be682001-01-17 15:42:30 +00003005
Guido van Rossumb18618d2000-05-03 23:44:39 +00003006 if (k != NULL)
3007 PyMem_DEL(k);
Guido van Rossumac7be682001-01-17 15:42:30 +00003008
Guido van Rossum681d79a1995-07-18 14:51:37 +00003009 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003010}
3011
Jeremy Hylton52820442001-01-03 23:52:36 +00003012#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
3013
3014/* The two fast_xxx() functions optimize calls for which no argument
3015 tuple is necessary; the objects are passed directly from the stack.
3016 fast_cfunction() is called for METH_OLDARGS functions.
3017 fast_function() is for functions with no special argument handling.
3018*/
3019
3020static PyObject *
3021fast_cfunction(PyObject *func, PyObject ***pp_stack, int na)
3022{
3023 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3024 PyObject *self = PyCFunction_GET_SELF(func);
3025
3026 if (na == 0)
3027 return (*meth)(self, NULL);
Charles G. Waldmaneec72a72001-01-10 22:11:59 +00003028 else if (na == 1) {
3029 PyObject *arg = EXT_POP(*pp_stack);
Guido van Rossumac7be682001-01-17 15:42:30 +00003030 PyObject *result = (*meth)(self, arg);
Charles G. Waldmaneec72a72001-01-10 22:11:59 +00003031 Py_DECREF(arg);
3032 return result;
3033 } else {
Jeremy Hylton52820442001-01-03 23:52:36 +00003034 PyObject *args = load_args(pp_stack, na);
3035 PyObject *result = (*meth)(self, args);
3036 Py_DECREF(args);
3037 return result;
3038 }
3039}
3040
3041static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00003042fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00003043{
3044 PyObject *co = PyFunction_GET_CODE(func);
3045 PyObject *globals = PyFunction_GET_GLOBALS(func);
3046 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003047 PyObject *closure = PyFunction_GET_CLOSURE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003048 PyObject **d = NULL;
3049 int nd = 0;
3050
3051 if (argdefs != NULL) {
3052 d = &PyTuple_GET_ITEM(argdefs, 0);
3053 nd = ((PyTupleObject *)argdefs)->ob_size;
3054 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003055 return eval_code2((PyCodeObject *)co, globals,
Jeremy Hylton52820442001-01-03 23:52:36 +00003056 (PyObject *)NULL, (*pp_stack)-n, na,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003057 (*pp_stack)-2*nk, nk, d, nd,
3058 closure);
Jeremy Hylton52820442001-01-03 23:52:36 +00003059}
3060
3061static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00003062update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
3063 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00003064{
3065 PyObject *kwdict = NULL;
3066 if (orig_kwdict == NULL)
3067 kwdict = PyDict_New();
3068 else {
3069 kwdict = PyDict_Copy(orig_kwdict);
3070 Py_DECREF(orig_kwdict);
3071 }
3072 if (kwdict == NULL)
3073 return NULL;
3074 while (--nk >= 0) {
3075 int err;
3076 PyObject *value = EXT_POP(*pp_stack);
3077 PyObject *key = EXT_POP(*pp_stack);
3078 if (PyDict_GetItem(kwdict, key) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +00003079 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00003080 "%.200s%s got multiple values "
Jeremy Hylton512a2372001-04-11 13:52:29 +00003081 "for keyword argument '%.200s'",
3082 get_func_name(func),
3083 get_func_desc(func),
3084 PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00003085 Py_DECREF(key);
3086 Py_DECREF(value);
3087 Py_DECREF(kwdict);
3088 return NULL;
3089 }
3090 err = PyDict_SetItem(kwdict, key, value);
3091 Py_DECREF(key);
3092 Py_DECREF(value);
3093 if (err) {
3094 Py_DECREF(kwdict);
3095 return NULL;
3096 }
3097 }
3098 return kwdict;
3099}
3100
3101static PyObject *
3102update_star_args(int nstack, int nstar, PyObject *stararg,
3103 PyObject ***pp_stack)
3104{
3105 PyObject *callargs, *w;
3106
3107 callargs = PyTuple_New(nstack + nstar);
3108 if (callargs == NULL) {
3109 return NULL;
3110 }
3111 if (nstar) {
3112 int i;
3113 for (i = 0; i < nstar; i++) {
3114 PyObject *a = PyTuple_GET_ITEM(stararg, i);
3115 Py_INCREF(a);
3116 PyTuple_SET_ITEM(callargs, nstack + i, a);
3117 }
3118 }
3119 while (--nstack >= 0) {
3120 w = EXT_POP(*pp_stack);
3121 PyTuple_SET_ITEM(callargs, nstack, w);
3122 }
3123 return callargs;
3124}
3125
3126static PyObject *
3127load_args(PyObject ***pp_stack, int na)
3128{
3129 PyObject *args = PyTuple_New(na);
3130 PyObject *w;
3131
3132 if (args == NULL)
3133 return NULL;
3134 while (--na >= 0) {
3135 w = EXT_POP(*pp_stack);
3136 PyTuple_SET_ITEM(args, na, w);
3137 }
3138 return args;
3139}
3140
3141static PyObject *
3142do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
3143{
3144 PyObject *callargs = NULL;
3145 PyObject *kwdict = NULL;
3146 PyObject *result = NULL;
3147
3148 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003149 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003150 if (kwdict == NULL)
3151 goto call_fail;
3152 }
3153 callargs = load_args(pp_stack, na);
3154 if (callargs == NULL)
3155 goto call_fail;
3156 result = call_object(func, callargs, kwdict);
3157 call_fail:
3158 Py_XDECREF(callargs);
3159 Py_XDECREF(kwdict);
3160 return result;
3161}
3162
3163static PyObject *
3164ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3165{
3166 int nstar = 0;
3167 PyObject *callargs = NULL;
3168 PyObject *stararg = NULL;
3169 PyObject *kwdict = NULL;
3170 PyObject *result = NULL;
3171
3172 if (flags & CALL_FLAG_KW) {
3173 kwdict = EXT_POP(*pp_stack);
3174 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003175 PyErr_Format(PyExc_TypeError,
Jeremy Hylton512a2372001-04-11 13:52:29 +00003176 "%s%s argument after ** "
3177 "must be a dictionary",
3178 get_func_name(func),
3179 get_func_desc(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00003180 goto ext_call_fail;
3181 }
3182 }
3183 if (flags & CALL_FLAG_VAR) {
3184 stararg = EXT_POP(*pp_stack);
3185 if (!PyTuple_Check(stararg)) {
3186 PyObject *t = NULL;
3187 t = PySequence_Tuple(stararg);
3188 if (t == NULL) {
Jeremy Hylton512a2372001-04-11 13:52:29 +00003189 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
3190 PyErr_Format(PyExc_TypeError,
3191 "%s%s argument after * "
3192 "must be a sequence",
3193 get_func_name(func),
3194 get_func_desc(func));
3195 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003196 goto ext_call_fail;
3197 }
3198 Py_DECREF(stararg);
3199 stararg = t;
3200 }
3201 nstar = PyTuple_GET_SIZE(stararg);
3202 }
3203 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003204 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003205 if (kwdict == NULL)
3206 goto ext_call_fail;
3207 }
3208 callargs = update_star_args(na, nstar, stararg, pp_stack);
3209 if (callargs == NULL)
3210 goto ext_call_fail;
3211 result = call_object(func, callargs, kwdict);
3212 ext_call_fail:
3213 Py_XDECREF(callargs);
3214 Py_XDECREF(kwdict);
3215 Py_XDECREF(stararg);
3216 return result;
3217}
3218
Guido van Rossum3b9c6671996-07-30 18:40:29 +00003219#define SLICE_ERROR_MSG \
3220 "standard sequence type does not support step size other than one"
3221
Guido van Rossumb209a111997-04-29 18:18:01 +00003222static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003223loop_subscript(PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003224{
Guido van Rossumb209a111997-04-29 18:18:01 +00003225 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00003226 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003227 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003228 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003229 return NULL;
3230 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003231 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00003232 v = (*sq->sq_item)(v, i);
3233 if (v)
3234 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00003235 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00003236 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00003237 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003238}
3239
Guido van Rossum20c6add2000-05-08 14:06:50 +00003240/* Extract a slice index from a PyInt or PyLong, the index is bound to
3241 the range [-INT_MAX+1, INTMAX]. Returns 0 and an exception if there is
3242 and error. Returns 1 on success.*/
3243
3244int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003245_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003246{
3247 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003248 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003249 if (PyInt_Check(v)) {
3250 x = PyInt_AsLong(v);
3251 } else if (PyLong_Check(v)) {
3252 x = PyLong_AsLong(v);
3253 if (x==-1 && PyErr_Occurred()) {
3254 PyObject *long_zero;
Guido van Rossumac7be682001-01-17 15:42:30 +00003255 int cmp;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003256
Guido van Rossumac7be682001-01-17 15:42:30 +00003257 if (!PyErr_ExceptionMatches(
3258 PyExc_OverflowError)) {
3259 /* It's not an overflow error, so just
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003260 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00003261 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003262 }
3263
Guido van Rossumac7be682001-01-17 15:42:30 +00003264 /* Clear the OverflowError */
3265 PyErr_Clear();
3266
3267 /* It's an overflow error, so we need to
3268 check the sign of the long integer,
3269 set the value to INT_MAX or 0, and clear
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003270 the error. */
3271
3272 /* Create a long integer with a value of 0 */
Guido van Rossumac7be682001-01-17 15:42:30 +00003273 long_zero = PyLong_FromLong(0L);
Guido van Rossum20c6add2000-05-08 14:06:50 +00003274 if (long_zero == NULL) return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003275
3276 /* Check sign */
Guido van Rossumac7be682001-01-17 15:42:30 +00003277 cmp = PyObject_RichCompareBool(v, long_zero,
3278 Py_GT);
3279 Py_DECREF(long_zero);
3280 if (cmp < 0)
3281 return 0;
3282 else if (cmp > 0)
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003283 x = INT_MAX;
3284 else
3285 x = 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003286 }
3287 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003288 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003289 "slice indices must be integers");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003290 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003291 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003292 /* Truncate -- very long indices are truncated anyway */
3293 if (x > INT_MAX)
3294 x = INT_MAX;
3295 else if (x < -INT_MAX)
3296 x = 0;
3297 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003298 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003299 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003300}
3301
Guido van Rossumb209a111997-04-29 18:18:01 +00003302static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003303apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003304{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003305 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003306 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003307 return NULL;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003308 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum04691fc1992-08-12 15:35:34 +00003309 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003310 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003311}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003312
3313static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003314assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3315 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003316{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003317 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003318 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum3f5da241990-12-20 15:06:42 +00003319 return -1;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003320 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum3f5da241990-12-20 15:06:42 +00003321 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003322 if (x == NULL)
3323 return PySequence_DelSlice(u, ilow, ihigh);
3324 else
3325 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003326}
3327
Guido van Rossumb209a111997-04-29 18:18:01 +00003328static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003329cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003330{
Guido van Rossumac7be682001-01-17 15:42:30 +00003331 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003332 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00003333 case IS:
3334 case IS_NOT:
3335 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00003336 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003337 res = !res;
3338 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003339 case IN:
3340 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003341 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003342 if (res < 0)
3343 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00003344 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003345 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003346 break;
3347 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00003348 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003349 break;
3350 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003351 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003352 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003353 v = res ? Py_True : Py_False;
3354 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003355 return v;
3356}
3357
Thomas Wouters52152252000-08-17 22:55:00 +00003358static PyObject *
3359import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003360{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003361 PyObject *x;
3362
3363 x = PyObject_GetAttr(v, name);
3364 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00003365 PyErr_Format(PyExc_ImportError,
3366 "cannot import name %.230s",
3367 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003368 }
Thomas Wouters52152252000-08-17 22:55:00 +00003369 return x;
3370}
Guido van Rossumac7be682001-01-17 15:42:30 +00003371
Thomas Wouters52152252000-08-17 22:55:00 +00003372static int
3373import_all_from(PyObject *locals, PyObject *v)
3374{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003375 PyObject *all = PyObject_GetAttrString(v, "__all__");
3376 PyObject *dict, *name, *value;
3377 int skip_leading_underscores = 0;
3378 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003379
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003380 if (all == NULL) {
3381 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3382 return -1; /* Unexpected error */
3383 PyErr_Clear();
3384 dict = PyObject_GetAttrString(v, "__dict__");
3385 if (dict == NULL) {
3386 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3387 return -1;
3388 PyErr_SetString(PyExc_ImportError,
3389 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003390 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003391 }
3392 all = PyMapping_Keys(dict);
3393 Py_DECREF(dict);
3394 if (all == NULL)
3395 return -1;
3396 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003397 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003398
3399 for (pos = 0, err = 0; ; pos++) {
3400 name = PySequence_GetItem(all, pos);
3401 if (name == NULL) {
3402 if (!PyErr_ExceptionMatches(PyExc_IndexError))
3403 err = -1;
3404 else
3405 PyErr_Clear();
3406 break;
3407 }
3408 if (skip_leading_underscores &&
3409 PyString_Check(name) &&
3410 PyString_AS_STRING(name)[0] == '_')
3411 {
3412 Py_DECREF(name);
3413 continue;
3414 }
3415 value = PyObject_GetAttr(v, name);
3416 if (value == NULL)
3417 err = -1;
3418 else
3419 err = PyDict_SetItem(locals, name, value);
3420 Py_DECREF(name);
3421 Py_XDECREF(value);
3422 if (err != 0)
3423 break;
3424 }
3425 Py_DECREF(all);
3426 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003427}
3428
Guido van Rossumb209a111997-04-29 18:18:01 +00003429static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003430build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003431{
Guido van Rossumcd649651997-08-22 16:56:16 +00003432 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003433 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003434 PyErr_SetString(PyExc_SystemError,
3435 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00003436 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003437 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003438 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003439 PyErr_SetString(PyExc_SystemError,
3440 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00003441 return NULL;
3442 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003443 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003444 PyErr_SetString(PyExc_SystemError,
Guido van Rossum7a5b7962000-03-31 13:52:29 +00003445 "build_class with non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00003446 return NULL;
3447 }
Guido van Rossumcd649651997-08-22 16:56:16 +00003448 n = PyTuple_Size(bases);
3449 for (i = 0; i < n; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003450 PyObject *base = PyTuple_GET_ITEM(bases, i);
3451 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00003452 /* Call the base's *type*, if it is callable.
3453 This code is a hook for Donald Beaudry's
3454 and Jim Fulton's type extensions. In
Thomas Wouters7e474022000-07-16 12:04:32 +00003455 unextended Python it will never be triggered
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003456 since its types are not callable.
3457 Ditto: call the bases's *class*, if it has
3458 one. This makes the same thing possible
3459 without writing C code. A true meta-object
3460 protocol! */
3461 PyObject *basetype = (PyObject *)base->ob_type;
3462 PyObject *callable = NULL;
3463 if (PyCallable_Check(basetype))
3464 callable = basetype;
3465 else
3466 callable = PyObject_GetAttrString(
3467 base, "__class__");
3468 if (callable) {
3469 PyObject *args;
3470 PyObject *newclass = NULL;
3471 args = Py_BuildValue(
3472 "(OOO)", name, bases, methods);
3473 if (args != NULL) {
3474 newclass = PyEval_CallObject(
3475 callable, args);
3476 Py_DECREF(args);
3477 }
Guido van Rossum730806d1998-04-10 22:27:42 +00003478 if (callable != basetype) {
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003479 Py_DECREF(callable);
Guido van Rossum730806d1998-04-10 22:27:42 +00003480 }
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003481 return newclass;
Guido van Rossum150b2df1996-12-05 23:17:11 +00003482 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003483 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00003484 "base is not a class object");
3485 return NULL;
3486 }
3487 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003488 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00003489}
3490
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003491static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003492exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3493 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003494{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003495 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003496 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003497 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003498
Guido van Rossumb209a111997-04-29 18:18:01 +00003499 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3500 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003501 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003502 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003503 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003504 locals = PyTuple_GetItem(prog, 2);
3505 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003506 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003507 if (globals == Py_None) {
3508 globals = PyEval_GetGlobals();
3509 if (locals == Py_None) {
3510 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003511 plain = 1;
3512 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003513 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003514 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003515 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003516 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003517 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003518 !PyCode_Check(prog) &&
3519 !PyFile_Check(prog)) {
3520 PyErr_SetString(PyExc_TypeError,
Guido van Rossumac7be682001-01-17 15:42:30 +00003521 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003522 return -1;
3523 }
Fred Drake661ea262000-10-24 19:57:45 +00003524 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003525 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003526 "exec: arg 2 must be a dictionary or None");
3527 return -1;
3528 }
3529 if (!PyDict_Check(locals)) {
3530 PyErr_SetString(PyExc_TypeError,
3531 "exec: arg 3 must be a dictionary or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003532 return -1;
3533 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003534 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003535 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003536 if (PyCode_Check(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003537 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003538 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003539 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003540 FILE *fp = PyFile_AsFile(prog);
3541 char *name = PyString_AsString(PyFile_Name(prog));
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003542 if (PyEval_GetNestedScopes()) {
3543 PyCompilerFlags cf;
3544 cf.cf_nested_scopes = 1;
3545 v = PyRun_FileFlags(fp, name, Py_file_input, globals,
3546 locals, &cf);
3547 } else {
3548 v = PyRun_File(fp, name, Py_file_input, globals,
3549 locals);
3550 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003551 }
3552 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003553 char *str;
3554 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003555 return -1;
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003556 if (PyEval_GetNestedScopes()) {
3557 PyCompilerFlags cf;
3558 cf.cf_nested_scopes = 1;
3559 v = PyRun_StringFlags(str, Py_file_input, globals,
3560 locals, &cf);
3561 } else
3562 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003563 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003564 if (plain)
3565 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003566 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003567 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003568 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003569 return 0;
3570}
Guido van Rossum24c13741995-02-14 09:42:43 +00003571
Guido van Rossumac7be682001-01-17 15:42:30 +00003572static void
Paul Prescode68140d2000-08-30 20:25:01 +00003573format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3574{
3575 char *obj_str;
3576
3577 if (!obj)
3578 return;
3579
3580 obj_str = PyString_AsString(obj);
3581 if (!obj_str)
3582 return;
3583
3584 PyErr_Format(exc, format_str, obj_str);
3585}
Guido van Rossum950361c1997-01-24 13:49:28 +00003586
3587#ifdef DYNAMIC_EXECUTION_PROFILE
3588
3589PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003590getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003591{
3592 int i;
3593 PyObject *l = PyList_New(256);
3594 if (l == NULL) return NULL;
3595 for (i = 0; i < 256; i++) {
3596 PyObject *x = PyInt_FromLong(a[i]);
3597 if (x == NULL) {
3598 Py_DECREF(l);
3599 return NULL;
3600 }
3601 PyList_SetItem(l, i, x);
3602 }
3603 for (i = 0; i < 256; i++)
3604 a[i] = 0;
3605 return l;
3606}
3607
3608PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003609_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003610{
3611#ifndef DXPAIRS
3612 return getarray(dxp);
3613#else
3614 int i;
3615 PyObject *l = PyList_New(257);
3616 if (l == NULL) return NULL;
3617 for (i = 0; i < 257; i++) {
3618 PyObject *x = getarray(dxpairs[i]);
3619 if (x == NULL) {
3620 Py_DECREF(l);
3621 return NULL;
3622 }
3623 PyList_SetItem(l, i, x);
3624 }
3625 return l;
3626#endif
3627}
3628
3629#endif