blob: 902d52918bdecdacce352d63531afe22e7653b0a [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 Rossum374a9221991-04-04 10:40:29 +0000384
385/* Code access macros */
386
387#define GETCONST(i) Getconst(f, i)
388#define GETNAME(i) Getname(f, i)
389#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumd076c731998-10-07 19:42:25 +0000390#define INSTR_OFFSET() (next_instr - first_instr)
Guido van Rossum374a9221991-04-04 10:40:29 +0000391#define NEXTOP() (*next_instr++)
392#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossumd076c731998-10-07 19:42:25 +0000393#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000394#define JUMPBY(x) (next_instr += (x))
395
396/* Stack manipulation macros */
397
398#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
399#define EMPTY() (STACK_LEVEL() == 0)
400#define TOP() (stack_pointer[-1])
401#define BASIC_PUSH(v) (*stack_pointer++ = (v))
402#define BASIC_POP() (*--stack_pointer)
403
Guido van Rossum96a42c81992-01-12 02:29:51 +0000404#ifdef LLTRACE
405#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
406#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000407#else
408#define PUSH(v) BASIC_PUSH(v)
409#define POP() BASIC_POP()
410#endif
411
Guido van Rossum681d79a1995-07-18 14:51:37 +0000412/* Local variable macros */
413
414#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumb209a111997-04-29 18:18:01 +0000415#define SETLOCAL(i, value) do { Py_XDECREF(GETLOCAL(i)); \
Guido van Rossum681d79a1995-07-18 14:51:37 +0000416 GETLOCAL(i) = value; } while (0)
417
Guido van Rossuma027efa1997-05-05 20:56:21 +0000418/* Start of code */
419
Guido van Rossum8861b741996-07-30 16:49:37 +0000420#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000421 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000422 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000423 return NULL;
424 }
425#endif
426
Guido van Rossum681d79a1995-07-18 14:51:37 +0000427 if (globals == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000428 PyErr_SetString(PyExc_SystemError, "eval_code2: NULL globals");
Guido van Rossum6135a871995-01-09 17:53:26 +0000429 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000430 }
431
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000432#ifdef LLTRACE
Guido van Rossumb209a111997-04-29 18:18:01 +0000433 lltrace = PyDict_GetItemString(globals, "__lltrace__") != NULL;
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000434#endif
435
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000436 f = PyFrame_New(tstate, /*back*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000437 co, /*code*/
Jeremy Hylton30c9f392001-03-13 01:58:22 +0000438 globals, locals);
Guido van Rossum374a9221991-04-04 10:40:29 +0000439 if (f == NULL)
440 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000441
Guido van Rossuma027efa1997-05-05 20:56:21 +0000442 tstate->frame = f;
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000443 fastlocals = f->f_localsplus;
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000444 freevars = f->f_localsplus + f->f_nlocals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000445
446 if (co->co_argcount > 0 ||
447 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
448 int i;
449 int n = argcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000450 PyObject *kwdict = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000451 if (co->co_flags & CO_VARKEYWORDS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000452 kwdict = PyDict_New();
Guido van Rossum681d79a1995-07-18 14:51:37 +0000453 if (kwdict == NULL)
454 goto fail;
Guido van Rossum8c5df061997-01-24 04:19:24 +0000455 i = co->co_argcount;
456 if (co->co_flags & CO_VARARGS)
457 i++;
458 SETLOCAL(i, kwdict);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000459 }
460 if (argcount > co->co_argcount) {
461 if (!(co->co_flags & CO_VARARGS)) {
Guido van Rossumdf9db1e1997-11-19 16:05:40 +0000462 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +0000463 "%.200s() takes %s %d "
464 "%sargument%s (%d given)",
Fred Drake661ea262000-10-24 19:57:45 +0000465 PyString_AsString(co->co_name),
Ka-Ping Yee20579702001-01-15 22:14:16 +0000466 defcount ? "at most" : "exactly",
467 co->co_argcount,
468 kwcount ? "non-keyword " : "",
469 co->co_argcount == 1 ? "" : "s",
470 argcount);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000471 goto fail;
472 }
473 n = co->co_argcount;
474 }
475 for (i = 0; i < n; i++) {
476 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000477 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000478 SETLOCAL(i, x);
479 }
480 if (co->co_flags & CO_VARARGS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000481 u = PyTuple_New(argcount - n);
Guido van Rossum8c5df061997-01-24 04:19:24 +0000482 if (u == NULL)
483 goto fail;
484 SETLOCAL(co->co_argcount, u);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000485 for (i = n; i < argcount; i++) {
486 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000487 Py_INCREF(x);
488 PyTuple_SET_ITEM(u, i-n, x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000489 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000490 }
491 for (i = 0; i < kwcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000492 PyObject *keyword = kws[2*i];
493 PyObject *value = kws[2*i + 1];
Guido van Rossum681d79a1995-07-18 14:51:37 +0000494 int j;
Guido van Rossum25da5be1999-10-26 00:12:20 +0000495 if (keyword == NULL || !PyString_Check(keyword)) {
Ka-Ping Yee20579702001-01-15 22:14:16 +0000496 PyErr_Format(PyExc_TypeError,
497 "%.200s() keywords must be strings",
498 PyString_AsString(co->co_name));
Guido van Rossum25da5be1999-10-26 00:12:20 +0000499 goto fail;
500 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000501 /* XXX slow -- speed up using dictionary? */
502 for (j = 0; j < co->co_argcount; j++) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000503 PyObject *nm = PyTuple_GET_ITEM(
504 co->co_varnames, j);
Guido van Rossumac7be682001-01-17 15:42:30 +0000505 int cmp = PyObject_RichCompareBool(
506 keyword, nm, Py_EQ);
507 if (cmp > 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000508 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000509 else if (cmp < 0)
510 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000511 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000512 /* Check errors from Compare */
513 if (PyErr_Occurred())
514 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000515 if (j >= co->co_argcount) {
516 if (kwdict == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000517 PyErr_Format(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +0000518 "%.200s() got an unexpected "
519 "keyword argument '%.400s'",
520 PyString_AsString(co->co_name),
Jeremy Hylton76901512000-03-28 23:49:17 +0000521 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000522 goto fail;
523 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000524 PyDict_SetItem(kwdict, keyword, value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000525 }
526 else {
527 if (GETLOCAL(j) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000528 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +0000529 "%.200s() got multiple "
530 "values for keyword "
531 "argument '%.400s'",
532 PyString_AsString(co->co_name),
533 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000534 goto fail;
535 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000536 Py_INCREF(value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000537 SETLOCAL(j, value);
538 }
539 }
540 if (argcount < co->co_argcount) {
541 int m = co->co_argcount - defcount;
542 for (i = argcount; i < m; i++) {
543 if (GETLOCAL(i) == NULL) {
Guido van Rossumdf9db1e1997-11-19 16:05:40 +0000544 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +0000545 "%.200s() takes %s %d "
546 "%sargument%s (%d given)",
Fred Drake661ea262000-10-24 19:57:45 +0000547 PyString_AsString(co->co_name),
Ka-Ping Yee20579702001-01-15 22:14:16 +0000548 ((co->co_flags & CO_VARARGS) ||
549 defcount) ? "at least"
550 : "exactly",
551 m, kwcount ? "non-keyword " : "",
552 m == 1 ? "" : "s", i);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000553 goto fail;
554 }
555 }
556 if (n > m)
557 i = n - m;
558 else
559 i = 0;
560 for (; i < defcount; i++) {
561 if (GETLOCAL(m+i) == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000562 PyObject *def = defs[i];
563 Py_INCREF(def);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000564 SETLOCAL(m+i, def);
565 }
566 }
567 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000568 }
569 else {
570 if (argcount > 0 || kwcount > 0) {
Fred Drake661ea262000-10-24 19:57:45 +0000571 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +0000572 "%.200s() takes no arguments (%d given)",
573 PyString_AsString(co->co_name),
574 argcount + kwcount);
Guido van Rossum8c5df061997-01-24 04:19:24 +0000575 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000576 }
577 }
Jeremy Hylton220ae7c2001-03-21 16:43:47 +0000578 /* Allocate and initialize storage for cell vars, and copy free
579 vars into frame. This isn't too efficient right now. */
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000580 if (f->f_ncells) {
Jeremy Hylton220ae7c2001-03-21 16:43:47 +0000581 int i = 0, j = 0, nargs, found;
582 char *cellname, *argname;
583 PyObject *c;
584
585 nargs = co->co_argcount;
586 if (co->co_flags & CO_VARARGS)
587 nargs++;
588 if (co->co_flags & CO_VARKEYWORDS)
589 nargs++;
590
591 /* Check for cells that shadow args */
592 for (i = 0; i < f->f_ncells && j < nargs; ++i) {
593 cellname = PyString_AS_STRING(
594 PyTuple_GET_ITEM(co->co_cellvars, i));
595 found = 0;
596 while (j < nargs) {
597 argname = PyString_AS_STRING(
598 PyTuple_GET_ITEM(co->co_varnames, j));
599 if (strcmp(cellname, argname) == 0) {
600 c = PyCell_New(GETLOCAL(j));
601 if (c == NULL)
602 goto fail;
603 GETLOCAL(f->f_nlocals + i) = c;
604 found = 1;
605 break;
606 }
607 j++;
608 }
609 if (found == 0) {
610 c = PyCell_New(NULL);
611 if (c == NULL)
612 goto fail;
613 SETLOCAL(f->f_nlocals + i, c);
614 }
615 }
616 /* Initialize any that are left */
617 while (i < f->f_ncells) {
618 c = PyCell_New(NULL);
619 if (c == NULL)
620 goto fail;
621 SETLOCAL(f->f_nlocals + i, c);
622 i++;
623 }
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000624 }
625 if (f->f_nfreevars) {
626 int i;
Jeremy Hylton30c9f392001-03-13 01:58:22 +0000627 for (i = 0; i < f->f_nfreevars; ++i) {
628 PyObject *o = PyTuple_GET_ITEM(closure, i);
629 Py_INCREF(o);
630 freevars[f->f_ncells + i] = o;
631 }
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000632 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000633
Guido van Rossuma027efa1997-05-05 20:56:21 +0000634 if (tstate->sys_tracefunc != NULL) {
635 /* tstate->sys_tracefunc, if defined, is a function that
636 will be called on *every* entry to a code block.
Guido van Rossum96a42c81992-01-12 02:29:51 +0000637 Its return value, if not None, is a function that
638 will be called at the start of each executed line
639 of code. (Actually, the function must return
640 itself in order to continue tracing.)
641 The trace functions are called with three arguments:
642 a pointer to the current frame, a string indicating
643 why the function is called, and an argument which
644 depends on the situation. The global trace function
645 (sys.trace) is also called whenever an exception
646 is detected. */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000647 if (call_trace(&tstate->sys_tracefunc,
648 &f->f_trace, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000649 Py_None/*XXX how to compute arguments now?*/)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000650 /* Trace function raised an error */
Guido van Rossum8c5df061997-01-24 04:19:24 +0000651 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000652 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000653 }
654
Guido van Rossuma027efa1997-05-05 20:56:21 +0000655 if (tstate->sys_profilefunc != NULL) {
656 /* Similar for sys_profilefunc, except it needn't return
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000657 itself and isn't called for "line" events */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000658 if (call_trace(&tstate->sys_profilefunc,
659 (PyObject**)0, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000660 Py_None/*XXX*/)) {
Guido van Rossum8c5df061997-01-24 04:19:24 +0000661 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000662 }
663 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000664
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000665 if (++tstate->recursion_depth > recursion_limit) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000666 --tstate->recursion_depth;
667 PyErr_SetString(PyExc_RuntimeError,
Fred Drake661ea262000-10-24 19:57:45 +0000668 "maximum recursion depth exceeded");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000669 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +0000670 Py_DECREF(f);
Guido van Rossum8861b741996-07-30 16:49:37 +0000671 return NULL;
672 }
673
Guido van Rossumd076c731998-10-07 19:42:25 +0000674 _PyCode_GETCODEPTR(co, &first_instr);
675 next_instr = first_instr;
Guido van Rossum374a9221991-04-04 10:40:29 +0000676 stack_pointer = f->f_valuestack;
Guido van Rossumac7be682001-01-17 15:42:30 +0000677
Guido van Rossum374a9221991-04-04 10:40:29 +0000678 why = WHY_NOT;
679 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000680 x = Py_None; /* Not a reference, just anything non-NULL */
Fred Drake48fba732000-10-11 13:54:07 +0000681 w = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +0000682
Guido van Rossum374a9221991-04-04 10:40:29 +0000683 for (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000684 /* Do periodic things. Doing this every time through
685 the loop would add too much overhead, so we do it
686 only every Nth instruction. We also do it if
687 ``things_to_do'' is set, i.e. when an asynchronous
688 event needs attention (e.g. a signal handler or
689 async I/O handler); see Py_AddPendingCall() and
690 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +0000691
Guido van Rossuma027efa1997-05-05 20:56:21 +0000692 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000693 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000694 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000695 if (Py_MakePendingCalls() < 0) {
696 why = WHY_EXCEPTION;
697 goto on_error;
698 }
699 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000700#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000701 /* If we have true signals, the signal handler
702 will call Py_AddPendingCall() so we don't
703 have to call sigcheck(). On the Mac and
704 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000705 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000706 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000707 goto on_error;
708 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000709#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000710
Guido van Rossume59214e1994-08-30 08:01:59 +0000711#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000712 if (interpreter_lock) {
713 /* Give another thread a chance */
714
Guido van Rossum25ce5661997-08-02 03:10:38 +0000715 if (PyThreadState_Swap(NULL) != tstate)
716 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000717 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000718
719 /* Other threads may run now */
720
Guido van Rossum65d5b571998-12-21 19:32:43 +0000721 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000722 if (PyThreadState_Swap(tstate) != NULL)
723 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000724 }
725#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000726 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000727
Guido van Rossum374a9221991-04-04 10:40:29 +0000728 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000729
Guido van Rossum408027e1996-12-30 16:17:54 +0000730#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000731 f->f_lasti = INSTR_OFFSET();
732#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000733
Guido van Rossum374a9221991-04-04 10:40:29 +0000734 opcode = NEXTOP();
735 if (HAS_ARG(opcode))
736 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000737 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000738#ifdef DYNAMIC_EXECUTION_PROFILE
739#ifdef DXPAIRS
740 dxpairs[lastopcode][opcode]++;
741 lastopcode = opcode;
742#endif
743 dxp[opcode]++;
744#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000745
Guido van Rossum96a42c81992-01-12 02:29:51 +0000746#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000747 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +0000748
Guido van Rossum96a42c81992-01-12 02:29:51 +0000749 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000750 if (HAS_ARG(opcode)) {
751 printf("%d: %d, %d\n",
752 (int) (INSTR_OFFSET() - 3),
753 opcode, oparg);
754 }
755 else {
756 printf("%d: %d\n",
757 (int) (INSTR_OFFSET() - 1), opcode);
758 }
759 }
760#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000761 /* Main switch on opcode */
Jeremy Hylton52820442001-01-03 23:52:36 +0000762
Guido van Rossum374a9221991-04-04 10:40:29 +0000763 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000764
Guido van Rossum374a9221991-04-04 10:40:29 +0000765 /* BEWARE!
766 It is essential that any operation that fails sets either
767 x to NULL, err to nonzero, or why to anything but WHY_NOT,
768 and that no operation that succeeds does this! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000769
Guido van Rossum374a9221991-04-04 10:40:29 +0000770 /* case STOP_CODE: this is an error! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000771
Guido van Rossum374a9221991-04-04 10:40:29 +0000772 case POP_TOP:
773 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000774 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000775 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000776
Guido van Rossum374a9221991-04-04 10:40:29 +0000777 case ROT_TWO:
778 v = POP();
779 w = POP();
780 PUSH(v);
781 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000782 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000783
Guido van Rossum374a9221991-04-04 10:40:29 +0000784 case ROT_THREE:
785 v = POP();
786 w = POP();
787 x = POP();
788 PUSH(v);
789 PUSH(x);
790 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000791 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000792
Thomas Wouters434d0822000-08-24 20:11:32 +0000793 case ROT_FOUR:
794 u = POP();
795 v = POP();
796 w = POP();
797 x = POP();
798 PUSH(u);
799 PUSH(x);
800 PUSH(w);
801 PUSH(v);
802 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000803
Guido van Rossum374a9221991-04-04 10:40:29 +0000804 case DUP_TOP:
805 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000806 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000807 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000808 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000809
Thomas Wouters434d0822000-08-24 20:11:32 +0000810 case DUP_TOPX:
811 switch (oparg) {
Thomas Wouters434d0822000-08-24 20:11:32 +0000812 case 1:
Tim Peters35ba6892000-10-11 07:04:49 +0000813 x = TOP();
814 Py_INCREF(x);
815 PUSH(x);
816 continue;
817 case 2:
Thomas Wouters434d0822000-08-24 20:11:32 +0000818 x = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000819 Py_INCREF(x);
820 w = TOP();
821 Py_INCREF(w);
822 PUSH(x);
823 PUSH(w);
824 PUSH(x);
825 continue;
826 case 3:
827 x = POP();
828 Py_INCREF(x);
Thomas Wouters434d0822000-08-24 20:11:32 +0000829 w = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000830 Py_INCREF(w);
831 v = TOP();
832 Py_INCREF(v);
833 PUSH(w);
834 PUSH(x);
835 PUSH(v);
836 PUSH(w);
837 PUSH(x);
838 continue;
839 case 4:
840 x = POP();
841 Py_INCREF(x);
842 w = POP();
843 Py_INCREF(w);
Thomas Wouters434d0822000-08-24 20:11:32 +0000844 v = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000845 Py_INCREF(v);
846 u = TOP();
847 Py_INCREF(u);
848 PUSH(v);
849 PUSH(w);
850 PUSH(x);
851 PUSH(u);
852 PUSH(v);
853 PUSH(w);
854 PUSH(x);
855 continue;
856 case 5:
857 x = POP();
858 Py_INCREF(x);
859 w = POP();
860 Py_INCREF(w);
861 v = POP();
862 Py_INCREF(v);
Thomas Wouters434d0822000-08-24 20:11:32 +0000863 u = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000864 Py_INCREF(u);
865 t = TOP();
866 Py_INCREF(t);
867 PUSH(u);
868 PUSH(v);
869 PUSH(w);
870 PUSH(x);
871 PUSH(t);
872 PUSH(u);
873 PUSH(v);
874 PUSH(w);
875 PUSH(x);
876 continue;
Thomas Wouters434d0822000-08-24 20:11:32 +0000877 default:
Thomas Wouters0be483f2000-10-11 23:26:11 +0000878 Py_FatalError("invalid argument to DUP_TOPX"
879 " (bytecode corruption?)");
Thomas Wouters434d0822000-08-24 20:11:32 +0000880 }
Tim Peters35ba6892000-10-11 07:04:49 +0000881 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000882
Guido van Rossum374a9221991-04-04 10:40:29 +0000883 case UNARY_POSITIVE:
884 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000885 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000886 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000887 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000888 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000889 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000890
Guido van Rossum374a9221991-04-04 10:40:29 +0000891 case UNARY_NEGATIVE:
892 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000893 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000894 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000895 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000896 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000897 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000898
Guido van Rossum374a9221991-04-04 10:40:29 +0000899 case UNARY_NOT:
900 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000901 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000902 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000903 if (err == 0) {
904 Py_INCREF(Py_True);
905 PUSH(Py_True);
906 continue;
907 }
908 else if (err > 0) {
909 Py_INCREF(Py_False);
910 PUSH(Py_False);
911 err = 0;
912 continue;
913 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000914 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000915
Guido van Rossum374a9221991-04-04 10:40:29 +0000916 case UNARY_CONVERT:
917 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000918 x = PyObject_Repr(v);
919 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000920 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000921 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000922 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000923
Guido van Rossum7928cd71991-10-24 14:59:31 +0000924 case UNARY_INVERT:
925 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000926 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000927 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000928 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000929 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000930 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000931
Guido van Rossum50564e81996-01-12 01:13:16 +0000932 case BINARY_POWER:
933 w = POP();
934 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000935 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000936 Py_DECREF(v);
937 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000938 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000939 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000940 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000941
Guido van Rossum374a9221991-04-04 10:40:29 +0000942 case BINARY_MULTIPLY:
943 w = POP();
944 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000945 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000946 Py_DECREF(v);
947 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000948 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000949 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000950 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000951
Guido van Rossum374a9221991-04-04 10:40:29 +0000952 case BINARY_DIVIDE:
953 w = POP();
954 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000955 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000956 Py_DECREF(v);
957 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000958 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000959 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000960 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000961
Guido van Rossum374a9221991-04-04 10:40:29 +0000962 case BINARY_MODULO:
963 w = POP();
964 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000965 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000966 Py_DECREF(v);
967 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000968 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000969 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000970 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000971
Guido van Rossum374a9221991-04-04 10:40:29 +0000972 case BINARY_ADD:
973 w = POP();
974 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000975 if (PyInt_Check(v) && PyInt_Check(w)) {
976 /* INLINE: int + int */
977 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000978 a = PyInt_AS_LONG(v);
979 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000980 i = a + b;
981 if ((i^a) < 0 && (i^b) < 0) {
982 PyErr_SetString(PyExc_OverflowError,
983 "integer addition");
984 x = NULL;
985 }
986 else
987 x = PyInt_FromLong(i);
988 }
989 else
990 x = PyNumber_Add(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000991 Py_DECREF(v);
992 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000993 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000994 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000995 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000996
Guido van Rossum374a9221991-04-04 10:40:29 +0000997 case BINARY_SUBTRACT:
998 w = POP();
999 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001000 if (PyInt_Check(v) && PyInt_Check(w)) {
1001 /* INLINE: int - int */
1002 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001003 a = PyInt_AS_LONG(v);
1004 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001005 i = a - b;
1006 if ((i^a) < 0 && (i^~b) < 0) {
1007 PyErr_SetString(PyExc_OverflowError,
1008 "integer subtraction");
1009 x = NULL;
1010 }
1011 else
1012 x = PyInt_FromLong(i);
1013 }
1014 else
1015 x = PyNumber_Subtract(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001016 Py_DECREF(v);
1017 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001018 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001019 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001020 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001021
Guido van Rossum374a9221991-04-04 10:40:29 +00001022 case BINARY_SUBSCR:
1023 w = POP();
1024 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001025 if (PyList_Check(v) && PyInt_Check(w)) {
1026 /* INLINE: list[int] */
1027 long i = PyInt_AsLong(w);
1028 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +00001029 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +00001030 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +00001031 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001032 PyErr_SetString(PyExc_IndexError,
1033 "list index out of range");
1034 x = NULL;
1035 }
1036 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +00001037 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001038 Py_INCREF(x);
1039 }
1040 }
1041 else
1042 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001043 Py_DECREF(v);
1044 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001045 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001046 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001047 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001048
Guido van Rossum7928cd71991-10-24 14:59:31 +00001049 case BINARY_LSHIFT:
1050 w = POP();
1051 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001052 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001053 Py_DECREF(v);
1054 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001055 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001056 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001057 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001058
Guido van Rossum7928cd71991-10-24 14:59:31 +00001059 case BINARY_RSHIFT:
1060 w = POP();
1061 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001062 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001063 Py_DECREF(v);
1064 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001065 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001066 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001067 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001068
Guido van Rossum7928cd71991-10-24 14:59:31 +00001069 case BINARY_AND:
1070 w = POP();
1071 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001072 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001073 Py_DECREF(v);
1074 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001075 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001076 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001077 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001078
Guido van Rossum7928cd71991-10-24 14:59:31 +00001079 case BINARY_XOR:
1080 w = POP();
1081 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001082 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001083 Py_DECREF(v);
1084 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001085 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001086 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001087 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001088
Guido van Rossum7928cd71991-10-24 14:59:31 +00001089 case BINARY_OR:
1090 w = POP();
1091 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001092 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001093 Py_DECREF(v);
1094 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001095 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001096 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001097 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001098
1099 case INPLACE_POWER:
1100 w = POP();
1101 v = POP();
1102 x = PyNumber_InPlacePower(v, w, Py_None);
1103 Py_DECREF(v);
1104 Py_DECREF(w);
1105 PUSH(x);
1106 if (x != NULL) continue;
1107 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001108
Thomas Wouters434d0822000-08-24 20:11:32 +00001109 case INPLACE_MULTIPLY:
1110 w = POP();
1111 v = POP();
1112 x = PyNumber_InPlaceMultiply(v, w);
1113 Py_DECREF(v);
1114 Py_DECREF(w);
1115 PUSH(x);
1116 if (x != NULL) continue;
1117 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001118
Thomas Wouters434d0822000-08-24 20:11:32 +00001119 case INPLACE_DIVIDE:
1120 w = POP();
1121 v = POP();
1122 x = PyNumber_InPlaceDivide(v, w);
1123 Py_DECREF(v);
1124 Py_DECREF(w);
1125 PUSH(x);
1126 if (x != NULL) continue;
1127 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001128
Thomas Wouters434d0822000-08-24 20:11:32 +00001129 case INPLACE_MODULO:
1130 w = POP();
1131 v = POP();
1132 x = PyNumber_InPlaceRemainder(v, w);
1133 Py_DECREF(v);
1134 Py_DECREF(w);
1135 PUSH(x);
1136 if (x != NULL) continue;
1137 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001138
Thomas Wouters434d0822000-08-24 20:11:32 +00001139 case INPLACE_ADD:
1140 w = POP();
1141 v = POP();
1142 if (PyInt_Check(v) && PyInt_Check(w)) {
1143 /* INLINE: int + int */
1144 register long a, b, i;
1145 a = PyInt_AS_LONG(v);
1146 b = PyInt_AS_LONG(w);
1147 i = a + b;
1148 if ((i^a) < 0 && (i^b) < 0) {
1149 PyErr_SetString(PyExc_OverflowError,
1150 "integer addition");
1151 x = NULL;
1152 }
1153 else
1154 x = PyInt_FromLong(i);
1155 }
1156 else
1157 x = PyNumber_InPlaceAdd(v, w);
1158 Py_DECREF(v);
1159 Py_DECREF(w);
1160 PUSH(x);
1161 if (x != NULL) continue;
1162 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001163
Thomas Wouters434d0822000-08-24 20:11:32 +00001164 case INPLACE_SUBTRACT:
1165 w = POP();
1166 v = POP();
1167 if (PyInt_Check(v) && PyInt_Check(w)) {
1168 /* INLINE: int - int */
1169 register long a, b, i;
1170 a = PyInt_AS_LONG(v);
1171 b = PyInt_AS_LONG(w);
1172 i = a - b;
1173 if ((i^a) < 0 && (i^~b) < 0) {
1174 PyErr_SetString(PyExc_OverflowError,
1175 "integer subtraction");
1176 x = NULL;
1177 }
1178 else
1179 x = PyInt_FromLong(i);
1180 }
1181 else
1182 x = PyNumber_InPlaceSubtract(v, w);
1183 Py_DECREF(v);
1184 Py_DECREF(w);
1185 PUSH(x);
1186 if (x != NULL) continue;
1187 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001188
Thomas Wouters434d0822000-08-24 20:11:32 +00001189 case INPLACE_LSHIFT:
1190 w = POP();
1191 v = POP();
1192 x = PyNumber_InPlaceLshift(v, w);
1193 Py_DECREF(v);
1194 Py_DECREF(w);
1195 PUSH(x);
1196 if (x != NULL) continue;
1197 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001198
Thomas Wouters434d0822000-08-24 20:11:32 +00001199 case INPLACE_RSHIFT:
1200 w = POP();
1201 v = POP();
1202 x = PyNumber_InPlaceRshift(v, w);
1203 Py_DECREF(v);
1204 Py_DECREF(w);
1205 PUSH(x);
1206 if (x != NULL) continue;
1207 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001208
Thomas Wouters434d0822000-08-24 20:11:32 +00001209 case INPLACE_AND:
1210 w = POP();
1211 v = POP();
1212 x = PyNumber_InPlaceAnd(v, w);
1213 Py_DECREF(v);
1214 Py_DECREF(w);
1215 PUSH(x);
1216 if (x != NULL) continue;
1217 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001218
Thomas Wouters434d0822000-08-24 20:11:32 +00001219 case INPLACE_XOR:
1220 w = POP();
1221 v = POP();
1222 x = PyNumber_InPlaceXor(v, w);
1223 Py_DECREF(v);
1224 Py_DECREF(w);
1225 PUSH(x);
1226 if (x != NULL) continue;
1227 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001228
Thomas Wouters434d0822000-08-24 20:11:32 +00001229 case INPLACE_OR:
1230 w = POP();
1231 v = POP();
1232 x = PyNumber_InPlaceOr(v, w);
1233 Py_DECREF(v);
1234 Py_DECREF(w);
1235 PUSH(x);
1236 if (x != NULL) continue;
1237 break;
1238
Guido van Rossum374a9221991-04-04 10:40:29 +00001239 case SLICE+0:
1240 case SLICE+1:
1241 case SLICE+2:
1242 case SLICE+3:
1243 if ((opcode-SLICE) & 2)
1244 w = POP();
1245 else
1246 w = NULL;
1247 if ((opcode-SLICE) & 1)
1248 v = POP();
1249 else
1250 v = NULL;
1251 u = POP();
1252 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001253 Py_DECREF(u);
1254 Py_XDECREF(v);
1255 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001256 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001257 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001258 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001259
Guido van Rossum374a9221991-04-04 10:40:29 +00001260 case STORE_SLICE+0:
1261 case STORE_SLICE+1:
1262 case STORE_SLICE+2:
1263 case STORE_SLICE+3:
1264 if ((opcode-STORE_SLICE) & 2)
1265 w = POP();
1266 else
1267 w = NULL;
1268 if ((opcode-STORE_SLICE) & 1)
1269 v = POP();
1270 else
1271 v = NULL;
1272 u = POP();
1273 t = POP();
1274 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001275 Py_DECREF(t);
1276 Py_DECREF(u);
1277 Py_XDECREF(v);
1278 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001279 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001280 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001281
Guido van Rossum374a9221991-04-04 10:40:29 +00001282 case DELETE_SLICE+0:
1283 case DELETE_SLICE+1:
1284 case DELETE_SLICE+2:
1285 case DELETE_SLICE+3:
1286 if ((opcode-DELETE_SLICE) & 2)
1287 w = POP();
1288 else
1289 w = NULL;
1290 if ((opcode-DELETE_SLICE) & 1)
1291 v = POP();
1292 else
1293 v = NULL;
1294 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001295 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001296 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001297 Py_DECREF(u);
1298 Py_XDECREF(v);
1299 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001300 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001301 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001302
Guido van Rossum374a9221991-04-04 10:40:29 +00001303 case STORE_SUBSCR:
1304 w = POP();
1305 v = POP();
1306 u = POP();
1307 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001308 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001309 Py_DECREF(u);
1310 Py_DECREF(v);
1311 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001312 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001313 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001314
Guido van Rossum374a9221991-04-04 10:40:29 +00001315 case DELETE_SUBSCR:
1316 w = POP();
1317 v = POP();
1318 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001319 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001320 Py_DECREF(v);
1321 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001322 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001323 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001324
Guido van Rossum374a9221991-04-04 10:40:29 +00001325 case PRINT_EXPR:
1326 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001327 w = PySys_GetObject("displayhook");
1328 if (w == NULL) {
1329 PyErr_SetString(PyExc_RuntimeError,
1330 "lost sys.displayhook");
1331 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001332 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001333 }
1334 if (err == 0) {
1335 x = Py_BuildValue("(O)", v);
1336 if (x == NULL)
1337 err = -1;
1338 }
1339 if (err == 0) {
1340 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001341 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001342 if (w == NULL)
1343 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001344 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001345 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001346 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001347 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001348
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001349 case PRINT_ITEM_TO:
1350 w = stream = POP();
1351 /* fall through to PRINT_ITEM */
1352
Guido van Rossum374a9221991-04-04 10:40:29 +00001353 case PRINT_ITEM:
1354 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001355 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001356 w = PySys_GetObject("stdout");
1357 if (w == NULL) {
1358 PyErr_SetString(PyExc_RuntimeError,
1359 "lost sys.stdout");
1360 err = -1;
1361 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001362 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001363 if (w != NULL && PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001364 err = PyFile_WriteString(" ", w);
1365 if (err == 0)
1366 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001367 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001368 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001369 char *s = PyString_AsString(v);
1370 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001371 if (len > 0 &&
1372 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001373 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001374 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001375 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001376 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001377 Py_XDECREF(stream);
1378 stream = NULL;
1379 if (err == 0)
1380 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001381 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001382
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001383 case PRINT_NEWLINE_TO:
1384 w = stream = POP();
1385 /* fall through to PRINT_NEWLINE */
1386
Guido van Rossum374a9221991-04-04 10:40:29 +00001387 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001388 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001389 w = PySys_GetObject("stdout");
1390 if (w == NULL)
1391 PyErr_SetString(PyExc_RuntimeError,
1392 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001393 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001394 if (w != NULL) {
1395 err = PyFile_WriteString("\n", w);
1396 if (err == 0)
1397 PyFile_SoftSpace(w, 0);
1398 }
1399 Py_XDECREF(stream);
1400 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001401 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001402
Thomas Wouters434d0822000-08-24 20:11:32 +00001403
1404#ifdef CASE_TOO_BIG
1405 default: switch (opcode) {
1406#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001407 case BREAK_LOOP:
1408 why = WHY_BREAK;
1409 break;
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00001410
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001411 case CONTINUE_LOOP:
1412 retval = PyInt_FromLong(oparg);
1413 why = WHY_CONTINUE;
1414 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001415
Guido van Rossumf10570b1995-07-07 22:53:21 +00001416 case RAISE_VARARGS:
1417 u = v = w = NULL;
1418 switch (oparg) {
1419 case 3:
1420 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001421 /* Fallthrough */
1422 case 2:
1423 v = POP(); /* value */
1424 /* Fallthrough */
1425 case 1:
1426 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001427 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001428 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001429 break;
1430 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001431 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001432 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001433 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001434 break;
1435 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001436 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001437
Guido van Rossum374a9221991-04-04 10:40:29 +00001438 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001439 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001440 PyErr_SetString(PyExc_SystemError,
1441 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001442 break;
1443 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001444 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001445 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001446 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001447
Guido van Rossum374a9221991-04-04 10:40:29 +00001448 case RETURN_VALUE:
1449 retval = POP();
1450 why = WHY_RETURN;
1451 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001452
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001453 case EXEC_STMT:
1454 w = POP();
1455 v = POP();
1456 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001457 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001458 Py_DECREF(u);
1459 Py_DECREF(v);
1460 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001461 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001462
Guido van Rossum374a9221991-04-04 10:40:29 +00001463 case POP_BLOCK:
1464 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001465 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001466 while (STACK_LEVEL() > b->b_level) {
1467 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001468 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001469 }
1470 }
1471 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001472
Guido van Rossum374a9221991-04-04 10:40:29 +00001473 case END_FINALLY:
1474 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001475 if (PyInt_Check(v)) {
1476 why = (enum why_code) PyInt_AsLong(v);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001477 if (why == WHY_RETURN ||
1478 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00001479 retval = POP();
1480 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001481 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001482 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001483 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001484 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001485 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001486 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001487 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001488 else if (v != Py_None) {
1489 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001490 "'finally' pops bad exception");
1491 why = WHY_EXCEPTION;
1492 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001493 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001494 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001495
Guido van Rossum374a9221991-04-04 10:40:29 +00001496 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001497 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001498 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001499 w = POP();
1500 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001501 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001502 Py_DECREF(u);
1503 Py_DECREF(v);
1504 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001505 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001506
Guido van Rossum374a9221991-04-04 10:40:29 +00001507 case STORE_NAME:
1508 w = GETNAMEV(oparg);
1509 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001510 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001511 PyErr_Format(PyExc_SystemError,
1512 "no locals found when storing %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001513 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001514 break;
1515 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001516 err = PyDict_SetItem(x, w, v);
1517 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001518 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001519
Guido van Rossum374a9221991-04-04 10:40:29 +00001520 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001521 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001522 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001523 PyErr_Format(PyExc_SystemError,
1524 "no locals when deleting %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001525 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001526 break;
1527 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001528 if ((err = PyDict_DelItem(x, w)) != 0)
Guido van Rossumac7be682001-01-17 15:42:30 +00001529 format_exc_check_arg(PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001530 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001531 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001532
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001533 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001534 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001535 if (PyTuple_Check(v)) {
1536 if (PyTuple_Size(v) != oparg) {
1537 PyErr_SetString(PyExc_ValueError,
1538 "unpack tuple of wrong size");
1539 why = WHY_EXCEPTION;
1540 }
1541 else {
1542 for (; --oparg >= 0; ) {
1543 w = PyTuple_GET_ITEM(v, oparg);
1544 Py_INCREF(w);
1545 PUSH(w);
1546 }
1547 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001548 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001549 else if (PyList_Check(v)) {
1550 if (PyList_Size(v) != oparg) {
1551 PyErr_SetString(PyExc_ValueError,
1552 "unpack list of wrong size");
1553 why = WHY_EXCEPTION;
1554 }
1555 else {
1556 for (; --oparg >= 0; ) {
1557 w = PyList_GET_ITEM(v, oparg);
1558 Py_INCREF(w);
1559 PUSH(w);
1560 }
1561 }
1562 }
1563 else if (PySequence_Check(v)) {
1564 if (unpack_sequence(v, oparg,
1565 stack_pointer + oparg))
1566 stack_pointer += oparg;
1567 else
1568 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001569 }
1570 else {
Barry Warsawe42b18f1997-08-25 22:13:04 +00001571 PyErr_SetString(PyExc_TypeError,
1572 "unpack non-sequence");
1573 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001574 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001575 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001576 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001577
Guido van Rossum374a9221991-04-04 10:40:29 +00001578 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001579 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001580 v = POP();
1581 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001582 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1583 Py_DECREF(v);
1584 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001585 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001586
Guido van Rossum374a9221991-04-04 10:40:29 +00001587 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001588 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001589 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001590 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1591 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001592 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001593 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001594
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001595 case STORE_GLOBAL:
1596 w = GETNAMEV(oparg);
1597 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001598 err = PyDict_SetItem(f->f_globals, w, v);
1599 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001600 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001601
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001602 case DELETE_GLOBAL:
1603 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001604 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001605 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001606 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001607 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001608
Guido van Rossum374a9221991-04-04 10:40:29 +00001609 case LOAD_CONST:
1610 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001611 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001612 PUSH(x);
1613 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001614
Guido van Rossum374a9221991-04-04 10:40:29 +00001615 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001616 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001617 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001618 PyErr_Format(PyExc_SystemError,
1619 "no locals when loading %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001620 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001621 break;
1622 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001623 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001624 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001625 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001626 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001627 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001628 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001629 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001630 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001631 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001632 break;
1633 }
1634 }
1635 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001636 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001637 PUSH(x);
1638 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001639
Guido van Rossum374a9221991-04-04 10:40:29 +00001640 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001641 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001642 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001643 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001644 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001645 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001646 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001647 PyExc_NameError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001648 GLOBAL_NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001649 break;
1650 }
1651 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001652 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001653 PUSH(x);
1654 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001655
Guido van Rossum9bfef441993-03-29 10:43:31 +00001656 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001657 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001658 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001659 format_exc_check_arg(
1660 PyExc_UnboundLocalError,
1661 UNBOUNDLOCAL_ERROR_MSG,
1662 PyTuple_GetItem(co->co_varnames, oparg)
1663 );
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001664 break;
1665 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001666 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001667 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001668 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001669 break;
1670
1671 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001672 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001673 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001674 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001675
1676 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001677 x = GETLOCAL(oparg);
1678 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001679 format_exc_check_arg(
1680 PyExc_UnboundLocalError,
1681 UNBOUNDLOCAL_ERROR_MSG,
1682 PyTuple_GetItem(co->co_varnames, oparg)
1683 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001684 break;
1685 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001686 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001687 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001688
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001689 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001690 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001691 Py_INCREF(x);
1692 PUSH(x);
1693 break;
1694
1695 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001696 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001697 w = PyCell_Get(x);
Jeremy Hylton2524d692001-02-05 17:23:16 +00001698 if (w == NULL) {
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001699 if (oparg < f->f_ncells) {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001700 v = PyTuple_GetItem(co->co_cellvars,
1701 oparg);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001702 format_exc_check_arg(
1703 PyExc_UnboundLocalError,
1704 UNBOUNDLOCAL_ERROR_MSG,
1705 v);
1706 } else {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001707 v = PyTuple_GetItem(
1708 co->co_freevars,
1709 oparg - f->f_ncells);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001710 format_exc_check_arg(
1711 PyExc_NameError,
1712 UNBOUNDFREE_ERROR_MSG,
1713 v);
1714 }
Jeremy Hylton2524d692001-02-05 17:23:16 +00001715 err = -1;
1716 break;
1717 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001718 PUSH(w);
1719 break;
1720
1721 case STORE_DEREF:
1722 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001723 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001724 PyCell_Set(x, w);
Jeremy Hylton30c9f392001-03-13 01:58:22 +00001725 Py_DECREF(w);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001726 continue;
1727
Guido van Rossum374a9221991-04-04 10:40:29 +00001728 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001729 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001730 if (x != NULL) {
1731 for (; --oparg >= 0;) {
1732 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001733 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001734 }
1735 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001736 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001737 }
1738 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001739
Guido van Rossum374a9221991-04-04 10:40:29 +00001740 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001741 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001742 if (x != NULL) {
1743 for (; --oparg >= 0;) {
1744 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001745 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001746 }
1747 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001748 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001749 }
1750 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001751
Guido van Rossum374a9221991-04-04 10:40:29 +00001752 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001753 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001754 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001755 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001756 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001757
Guido van Rossum374a9221991-04-04 10:40:29 +00001758 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001759 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001760 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001761 x = PyObject_GetAttr(v, w);
1762 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001763 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001764 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001765 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001766
Guido van Rossum374a9221991-04-04 10:40:29 +00001767 case COMPARE_OP:
1768 w = POP();
1769 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001770 if (PyInt_Check(v) && PyInt_Check(w)) {
1771 /* INLINE: cmp(int, int) */
1772 register long a, b;
1773 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001774 a = PyInt_AS_LONG(v);
1775 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001776 switch (oparg) {
1777 case LT: res = a < b; break;
1778 case LE: res = a <= b; break;
1779 case EQ: res = a == b; break;
1780 case NE: res = a != b; break;
1781 case GT: res = a > b; break;
1782 case GE: res = a >= b; break;
1783 case IS: res = v == w; break;
1784 case IS_NOT: res = v != w; break;
1785 default: goto slow_compare;
1786 }
1787 x = res ? Py_True : Py_False;
1788 Py_INCREF(x);
1789 }
1790 else {
1791 slow_compare:
1792 x = cmp_outcome(oparg, v, w);
1793 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001794 Py_DECREF(v);
1795 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001796 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001797 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001798 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001799
Guido van Rossum374a9221991-04-04 10:40:29 +00001800 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001801 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001802 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001803 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001804 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001805 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001806 break;
1807 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001808 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001809 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001810 w,
1811 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001812 f->f_locals == NULL ?
1813 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001814 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001815 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001816 if (w == NULL) {
1817 x = NULL;
1818 break;
1819 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001820 x = PyEval_CallObject(x, w);
1821 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001822 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001823 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001824 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001825
Thomas Wouters52152252000-08-17 22:55:00 +00001826 case IMPORT_STAR:
1827 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001828 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001829 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001830 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001831 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001832 break;
1833 }
Thomas Wouters52152252000-08-17 22:55:00 +00001834 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001835 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001836 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001837 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001838 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001839
Thomas Wouters52152252000-08-17 22:55:00 +00001840 case IMPORT_FROM:
1841 w = GETNAMEV(oparg);
1842 v = TOP();
1843 x = import_from(v, w);
1844 PUSH(x);
1845 if (x != NULL) continue;
1846 break;
1847
Guido van Rossum374a9221991-04-04 10:40:29 +00001848 case JUMP_FORWARD:
1849 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001850 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001851
Guido van Rossum374a9221991-04-04 10:40:29 +00001852 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001853 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001854 if (err > 0)
1855 err = 0;
1856 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001857 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001858 else
1859 break;
1860 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001861
Guido van Rossum374a9221991-04-04 10:40:29 +00001862 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001863 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001864 if (err > 0) {
1865 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001866 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001867 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001868 else if (err == 0)
1869 ;
1870 else
1871 break;
1872 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001873
Guido van Rossum374a9221991-04-04 10:40:29 +00001874 case JUMP_ABSOLUTE:
1875 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001876 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001877
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001878 case GET_ITER:
1879 /* before: [obj]; after [getiter(obj)] */
1880 v = POP();
1881 x = PyObject_GetIter(v);
1882 Py_DECREF(v);
1883 if (x != NULL) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00001884 PUSH(x);
1885 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001886 }
1887 break;
1888
1889 case FOR_ITER:
1890 /* before: [iter]; after: [iter, iter()] *or* [] */
1891 v = TOP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001892 x = PyIter_Next(v);
1893 if (x != NULL) {
1894 PUSH(x);
1895 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001896 }
Tim Petersf4848da2001-05-05 00:14:56 +00001897 if (!PyErr_Occurred()) {
1898 /* iterator ended normally */
1899 x = v = POP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001900 Py_DECREF(v);
1901 JUMPBY(oparg);
1902 continue;
1903 }
1904 break;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001905
Guido van Rossum374a9221991-04-04 10:40:29 +00001906 case FOR_LOOP:
1907 /* for v in s: ...
1908 On entry: stack contains s, i.
1909 On exit: stack contains s, i+1, s[i];
1910 but if loop exhausted:
1911 s, i are popped, and we jump */
1912 w = POP(); /* Loop index */
1913 v = POP(); /* Sequence object */
1914 u = loop_subscript(v, w);
1915 if (u != NULL) {
1916 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001917 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001918 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001919 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001920 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001921 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001922 }
1923 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001924 Py_DECREF(v);
1925 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001926 /* A NULL can mean "s exhausted"
1927 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001928 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001929 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001930 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001931 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001932 continue;
1933 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001934 }
1935 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001936
Guido van Rossum374a9221991-04-04 10:40:29 +00001937 case SETUP_LOOP:
1938 case SETUP_EXCEPT:
1939 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001940 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001941 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001942 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001943
Guido van Rossum374a9221991-04-04 10:40:29 +00001944 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001945#ifdef LLTRACE
1946 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001947 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001948#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001949 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001950 if (f->f_trace == NULL)
1951 continue;
1952 /* Trace each line of code reached */
1953 f->f_lasti = INSTR_OFFSET();
1954 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossumb209a111997-04-29 18:18:01 +00001955 f, "line", Py_None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001956 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001957
1958 case CALL_FUNCTION:
Jeremy Hylton52820442001-01-03 23:52:36 +00001959 {
1960 int na = oparg & 0xff;
1961 int nk = (oparg>>8) & 0xff;
1962 int n = na + 2 * nk;
1963 PyObject **pfunc = stack_pointer - n - 1;
1964 PyObject *func = *pfunc;
1965 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1966
1967 /* Always dispatch PyCFunction first, because
1968 these are presumed to be the most frequent
1969 callable object.
1970 */
1971 if (PyCFunction_Check(func)) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001972 int flags = PyCFunction_GET_FLAGS(func);
Jeremy Hylton4c9dace2001-05-29 16:23:26 +00001973 if (flags > 1 || nk != 0)
1974 x = do_call(func, &stack_pointer,
1975 na, nk);
1976 else if (flags == METH_VARARGS) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001977 PyObject *callargs;
1978 callargs = load_args(&stack_pointer, na);
1979 x = call_cfunction(func, callargs, NULL);
1980 Py_XDECREF(callargs);
Jeremy Hylton4c9dace2001-05-29 16:23:26 +00001981 } else if (flags == 0)
Jeremy Hylton52820442001-01-03 23:52:36 +00001982 x = fast_cfunction(func,
Guido van Rossumac7be682001-01-17 15:42:30 +00001983 &stack_pointer, na);
Jeremy Hylton52820442001-01-03 23:52:36 +00001984 } else {
Guido van Rossumac7be682001-01-17 15:42:30 +00001985 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001986 && PyMethod_GET_SELF(func) != NULL) {
1987 /* optimize access to bound methods */
1988 PyObject *self = PyMethod_GET_SELF(func);
1989 Py_INCREF(self);
1990 func = PyMethod_GET_FUNCTION(func);
1991 Py_INCREF(func);
1992 Py_DECREF(*pfunc);
1993 *pfunc = self;
1994 na++;
1995 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00001996 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00001997 Py_INCREF(func);
1998 if (PyFunction_Check(func)) {
1999 x = fast_function(func, &stack_pointer,
Guido van Rossumac7be682001-01-17 15:42:30 +00002000 n, na, nk);
Jeremy Hylton52820442001-01-03 23:52:36 +00002001 } else {
2002 x = do_call(func, &stack_pointer,
2003 na, nk);
2004 }
2005 Py_DECREF(func);
2006 }
2007
2008 while (stack_pointer > pfunc) {
2009 w = POP();
2010 Py_DECREF(w);
2011 }
2012 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002013 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002014 continue;
2015 break;
2016 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002017
Jeremy Hylton76901512000-03-28 23:49:17 +00002018 case CALL_FUNCTION_VAR:
2019 case CALL_FUNCTION_KW:
2020 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00002021 {
Jeremy Hylton76901512000-03-28 23:49:17 +00002022 int na = oparg & 0xff;
2023 int nk = (oparg>>8) & 0xff;
2024 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00002025 int n = na + 2 * nk;
2026 PyObject **pfunc, *func;
2027 if (flags & CALL_FLAG_VAR)
2028 n++;
2029 if (flags & CALL_FLAG_KW)
2030 n++;
2031 pfunc = stack_pointer - n - 1;
2032 func = *pfunc;
Jeremy Hylton76901512000-03-28 23:49:17 +00002033 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Jeremy Hylton52820442001-01-03 23:52:36 +00002034
Guido van Rossumac7be682001-01-17 15:42:30 +00002035 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00002036 && PyMethod_GET_SELF(func) != NULL) {
2037 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002038 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00002039 func = PyMethod_GET_FUNCTION(func);
2040 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002041 Py_DECREF(*pfunc);
2042 *pfunc = self;
2043 na++;
2044 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00002045 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00002046 Py_INCREF(func);
2047 x = ext_do_call(func, &stack_pointer, flags, na, nk);
Jeremy Hylton76901512000-03-28 23:49:17 +00002048 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002049
Jeremy Hylton76901512000-03-28 23:49:17 +00002050 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00002051 w = POP();
2052 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00002053 }
2054 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002055 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002056 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00002057 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002058 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002059
Guido van Rossum681d79a1995-07-18 14:51:37 +00002060 case MAKE_FUNCTION:
2061 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00002062 x = PyFunction_New(v, f->f_globals);
2063 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002064 /* XXX Maybe this should be a separate opcode? */
2065 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002066 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002067 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002068 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002069 x = NULL;
2070 break;
2071 }
2072 while (--oparg >= 0) {
2073 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002074 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002075 }
2076 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00002077 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002078 }
2079 PUSH(x);
2080 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002081
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002082 case MAKE_CLOSURE:
2083 {
2084 int nfree;
2085 v = POP(); /* code object */
2086 x = PyFunction_New(v, f->f_globals);
2087 nfree = PyTuple_GET_SIZE(((PyCodeObject *)v)->co_freevars);
2088 Py_DECREF(v);
2089 /* XXX Maybe this should be a separate opcode? */
2090 if (x != NULL && nfree > 0) {
2091 v = PyTuple_New(nfree);
2092 if (v == NULL) {
2093 Py_DECREF(x);
2094 x = NULL;
2095 break;
2096 }
2097 while (--nfree >= 0) {
2098 w = POP();
2099 PyTuple_SET_ITEM(v, nfree, w);
2100 }
2101 err = PyFunction_SetClosure(x, v);
2102 Py_DECREF(v);
2103 }
2104 if (x != NULL && oparg > 0) {
2105 v = PyTuple_New(oparg);
2106 if (v == NULL) {
2107 Py_DECREF(x);
2108 x = NULL;
2109 break;
2110 }
2111 while (--oparg >= 0) {
2112 w = POP();
2113 PyTuple_SET_ITEM(v, oparg, w);
2114 }
2115 err = PyFunction_SetDefaults(x, v);
2116 Py_DECREF(v);
2117 }
2118 PUSH(x);
2119 break;
2120 }
2121
Guido van Rossum8861b741996-07-30 16:49:37 +00002122 case BUILD_SLICE:
2123 if (oparg == 3)
2124 w = POP();
2125 else
2126 w = NULL;
2127 v = POP();
2128 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002129 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002130 Py_DECREF(u);
2131 Py_DECREF(v);
2132 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00002133 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002134 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002135 break;
2136
Fred Drakeef8ace32000-08-24 00:32:09 +00002137 case EXTENDED_ARG:
2138 opcode = NEXTOP();
2139 oparg = oparg<<16 | NEXTARG();
2140 goto dispatch_opcode;
Guido van Rossum8861b741996-07-30 16:49:37 +00002141
Guido van Rossum374a9221991-04-04 10:40:29 +00002142 default:
2143 fprintf(stderr,
2144 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00002145 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002146 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002147 why = WHY_EXCEPTION;
2148 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002149
2150#ifdef CASE_TOO_BIG
2151 }
2152#endif
2153
Guido van Rossum374a9221991-04-04 10:40:29 +00002154 } /* switch */
2155
2156 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002157
Guido van Rossum374a9221991-04-04 10:40:29 +00002158 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002159
Guido van Rossum374a9221991-04-04 10:40:29 +00002160 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002161 if (err == 0 && x != NULL) {
2162#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002163 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002164 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002165 fprintf(stderr,
2166 "XXX undetected error\n");
2167 else
2168#endif
2169 continue; /* Normal, fast path */
2170 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002171 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002172 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002173 err = 0;
2174 }
2175
Guido van Rossum374a9221991-04-04 10:40:29 +00002176 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002177
Guido van Rossum374a9221991-04-04 10:40:29 +00002178 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002179 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002180 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002181 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002182 why = WHY_EXCEPTION;
2183 }
2184 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002185#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002186 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002187 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002188 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002189 fprintf(stderr,
2190 "XXX undetected error (why=%d)\n",
2191 why);
2192 why = WHY_EXCEPTION;
2193 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002194 }
2195#endif
2196
2197 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002198
Guido van Rossum374a9221991-04-04 10:40:29 +00002199 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002200 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00002201 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00002202 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00002203 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002204
Guido van Rossume59214e1994-08-30 08:01:59 +00002205 if (f->f_trace)
2206 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002207 if (tstate->sys_profilefunc)
2208 call_exc_trace(&tstate->sys_profilefunc,
2209 (PyObject**)0, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002210 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002211
Guido van Rossum374a9221991-04-04 10:40:29 +00002212 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002213
Guido van Rossum374a9221991-04-04 10:40:29 +00002214 if (why == WHY_RERAISE)
2215 why = WHY_EXCEPTION;
2216
2217 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002218
Guido van Rossum374a9221991-04-04 10:40:29 +00002219 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002220 PyTryBlock *b = PyFrame_BlockPop(f);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002221
2222 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2223 /* For a continue inside a try block,
2224 don't pop the block for the loop. */
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00002225 PyFrame_BlockSetup(f, b->b_type, b->b_level,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002226 b->b_handler);
2227 why = WHY_NOT;
2228 JUMPTO(PyInt_AS_LONG(retval));
2229 Py_DECREF(retval);
2230 break;
2231 }
2232
Guido van Rossum374a9221991-04-04 10:40:29 +00002233 while (STACK_LEVEL() > b->b_level) {
2234 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002235 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002236 }
2237 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2238 why = WHY_NOT;
2239 JUMPTO(b->b_handler);
2240 break;
2241 }
2242 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002243 (b->b_type == SETUP_EXCEPT &&
2244 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002245 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002246 PyObject *exc, *val, *tb;
2247 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002248 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002249 val = Py_None;
2250 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002251 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002252 /* Make the raw exception data
2253 available to the handler,
2254 so a program can emulate the
2255 Python main loop. Don't do
2256 this for 'finally'. */
2257 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002258 PyErr_NormalizeException(
2259 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002260 set_exc_info(tstate,
2261 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002262 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002263 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002264 PUSH(val);
2265 PUSH(exc);
2266 }
2267 else {
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002268 if (why == WHY_RETURN ||
2269 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00002270 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002271 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002272 PUSH(v);
2273 }
2274 why = WHY_NOT;
2275 JUMPTO(b->b_handler);
2276 break;
2277 }
2278 } /* unwind stack */
2279
2280 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002281
Guido van Rossum374a9221991-04-04 10:40:29 +00002282 if (why != WHY_NOT)
2283 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002284
Guido van Rossum374a9221991-04-04 10:40:29 +00002285 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002286
Guido van Rossum374a9221991-04-04 10:40:29 +00002287 /* Pop remaining stack entries */
Guido van Rossumac7be682001-01-17 15:42:30 +00002288
Guido van Rossum374a9221991-04-04 10:40:29 +00002289 while (!EMPTY()) {
2290 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002291 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002292 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002293
Guido van Rossum96a42c81992-01-12 02:29:51 +00002294 if (why != WHY_RETURN)
2295 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002296
Guido van Rossume59214e1994-08-30 08:01:59 +00002297 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002298 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00002299 if (call_trace(&f->f_trace, &f->f_trace, f,
2300 "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002301 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002302 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002303 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002304 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002305 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002306 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002307
Guido van Rossuma027efa1997-05-05 20:56:21 +00002308 if (tstate->sys_profilefunc && why == WHY_RETURN) {
2309 if (call_trace(&tstate->sys_profilefunc, (PyObject**)0,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002310 f, "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002311 Py_XDECREF(retval);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002312 retval = NULL;
2313 why = WHY_EXCEPTION;
2314 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002315 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002316
Guido van Rossuma027efa1997-05-05 20:56:21 +00002317 reset_exc_info(tstate);
2318
2319 --tstate->recursion_depth;
Guido van Rossum8c5df061997-01-24 04:19:24 +00002320
2321 fail: /* Jump here from prelude on failure */
Guido van Rossumac7be682001-01-17 15:42:30 +00002322
Guido van Rossum374a9221991-04-04 10:40:29 +00002323 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00002324
Guido van Rossuma027efa1997-05-05 20:56:21 +00002325 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +00002326 Py_DECREF(f);
Guido van Rossumac7be682001-01-17 15:42:30 +00002327
Guido van Rossum96a42c81992-01-12 02:29:51 +00002328 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002329}
2330
Guido van Rossuma027efa1997-05-05 20:56:21 +00002331static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002332set_exc_info(PyThreadState *tstate,
2333 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002334{
2335 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002336 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002337
Guido van Rossuma027efa1997-05-05 20:56:21 +00002338 frame = tstate->frame;
2339 if (frame->f_exc_type == NULL) {
2340 /* This frame didn't catch an exception before */
2341 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002342 if (tstate->exc_type == NULL) {
2343 Py_INCREF(Py_None);
2344 tstate->exc_type = Py_None;
2345 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002346 tmp_type = frame->f_exc_type;
2347 tmp_value = frame->f_exc_value;
2348 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002349 Py_XINCREF(tstate->exc_type);
2350 Py_XINCREF(tstate->exc_value);
2351 Py_XINCREF(tstate->exc_traceback);
2352 frame->f_exc_type = tstate->exc_type;
2353 frame->f_exc_value = tstate->exc_value;
2354 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002355 Py_XDECREF(tmp_type);
2356 Py_XDECREF(tmp_value);
2357 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002358 }
2359 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002360 tmp_type = tstate->exc_type;
2361 tmp_value = tstate->exc_value;
2362 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002363 Py_XINCREF(type);
2364 Py_XINCREF(value);
2365 Py_XINCREF(tb);
2366 tstate->exc_type = type;
2367 tstate->exc_value = value;
2368 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002369 Py_XDECREF(tmp_type);
2370 Py_XDECREF(tmp_value);
2371 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002372 /* For b/w compatibility */
2373 PySys_SetObject("exc_type", type);
2374 PySys_SetObject("exc_value", value);
2375 PySys_SetObject("exc_traceback", tb);
2376}
2377
2378static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002379reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002380{
2381 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002382 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002383 frame = tstate->frame;
2384 if (frame->f_exc_type != NULL) {
2385 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002386 tmp_type = tstate->exc_type;
2387 tmp_value = tstate->exc_value;
2388 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002389 Py_XINCREF(frame->f_exc_type);
2390 Py_XINCREF(frame->f_exc_value);
2391 Py_XINCREF(frame->f_exc_traceback);
2392 tstate->exc_type = frame->f_exc_type;
2393 tstate->exc_value = frame->f_exc_value;
2394 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002395 Py_XDECREF(tmp_type);
2396 Py_XDECREF(tmp_value);
2397 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002398 /* For b/w compatibility */
2399 PySys_SetObject("exc_type", frame->f_exc_type);
2400 PySys_SetObject("exc_value", frame->f_exc_value);
2401 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2402 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002403 tmp_type = frame->f_exc_type;
2404 tmp_value = frame->f_exc_value;
2405 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002406 frame->f_exc_type = NULL;
2407 frame->f_exc_value = NULL;
2408 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002409 Py_XDECREF(tmp_type);
2410 Py_XDECREF(tmp_value);
2411 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002412}
2413
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002414/* Logic for the raise statement (too complicated for inlining).
2415 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002416static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002417do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002418{
Guido van Rossumd295f121998-04-09 21:39:57 +00002419 if (type == NULL) {
2420 /* Reraise */
2421 PyThreadState *tstate = PyThreadState_Get();
2422 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2423 value = tstate->exc_value;
2424 tb = tstate->exc_traceback;
2425 Py_XINCREF(type);
2426 Py_XINCREF(value);
2427 Py_XINCREF(tb);
2428 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002429
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002430 /* We support the following forms of raise:
2431 raise <class>, <classinstance>
2432 raise <class>, <argument tuple>
2433 raise <class>, None
2434 raise <class>, <argument>
2435 raise <classinstance>, None
2436 raise <string>, <object>
2437 raise <string>, None
2438
2439 An omitted second argument is the same as None.
2440
2441 In addition, raise <tuple>, <anything> is the same as
2442 raising the tuple's first item (and it better have one!);
2443 this rule is applied recursively.
2444
2445 Finally, an optional third argument can be supplied, which
2446 gives the traceback to be substituted (useful when
2447 re-raising an exception after examining it). */
2448
2449 /* First, check the traceback argument, replacing None with
2450 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002451 if (tb == Py_None) {
2452 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002453 tb = NULL;
2454 }
2455 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002456 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002457 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002458 goto raise_error;
2459 }
2460
2461 /* Next, replace a missing value with None */
2462 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002463 value = Py_None;
2464 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002465 }
2466
2467 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002468 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2469 PyObject *tmp = type;
2470 type = PyTuple_GET_ITEM(type, 0);
2471 Py_INCREF(type);
2472 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002473 }
2474
Barry Warsaw4249f541997-08-22 21:26:19 +00002475 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002476 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002477
2478 else if (PyClass_Check(type))
2479 PyErr_NormalizeException(&type, &value, &tb);
2480
Guido van Rossumb209a111997-04-29 18:18:01 +00002481 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002482 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002483 if (value != Py_None) {
2484 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002485 "instance exception may not have a separate value");
2486 goto raise_error;
2487 }
2488 else {
2489 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002490 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002491 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002492 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2493 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002494 }
2495 }
2496 else {
2497 /* Not something you can raise. You get an exception
2498 anyway, just not what you specified :-) */
Jeremy Hylton960d9482001-04-27 02:25:33 +00002499 PyErr_Format(PyExc_TypeError,
2500 "exceptions must be strings, classes, or "
2501 "instances, not %s", type->ob_type->tp_name);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002502 goto raise_error;
2503 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002504 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002505 if (tb == NULL)
2506 return WHY_EXCEPTION;
2507 else
2508 return WHY_RERAISE;
2509 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002510 Py_XDECREF(value);
2511 Py_XDECREF(type);
2512 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002513 return WHY_EXCEPTION;
2514}
2515
Barry Warsawe42b18f1997-08-25 22:13:04 +00002516static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002517unpack_sequence(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002518{
2519 int i;
2520 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00002521
Barry Warsawe42b18f1997-08-25 22:13:04 +00002522 for (i = 0; i < argcnt; i++) {
2523 if (! (w = PySequence_GetItem(v, i))) {
2524 if (PyErr_ExceptionMatches(PyExc_IndexError))
2525 PyErr_SetString(PyExc_ValueError,
2526 "unpack sequence of wrong size");
2527 goto finally;
2528 }
2529 *--sp = w;
2530 }
2531 /* we better get an IndexError now */
2532 if (PySequence_GetItem(v, i) == NULL) {
2533 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2534 PyErr_Clear();
2535 return 1;
2536 }
2537 /* some other exception occurred. fall through to finally */
2538 }
2539 else
2540 PyErr_SetString(PyExc_ValueError,
2541 "unpack sequence of wrong size");
2542 /* fall through */
2543finally:
Barry Warsaw91010551997-08-25 22:30:51 +00002544 for (; i > 0; i--, sp++)
2545 Py_DECREF(*sp);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002546
2547 return 0;
2548}
2549
2550
Guido van Rossum96a42c81992-01-12 02:29:51 +00002551#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002552static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002553prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002554{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002555 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002556 if (PyObject_Print(v, stdout, 0) != 0)
2557 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002558 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002559 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002560}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002561#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002562
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002563static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002564call_exc_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002565{
Guido van Rossumb209a111997-04-29 18:18:01 +00002566 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002567 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002568 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002569 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002570 value = Py_None;
2571 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002572 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002573 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002574 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002575 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002576 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002577 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002578 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002579 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002580 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002581 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002582 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002583 Py_XDECREF(type);
2584 Py_XDECREF(value);
2585 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002586 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002587}
2588
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002589/* PyObject **p_trace: in/out; may not be NULL;
2590 may not point to NULL variable initially
2591 PyObject **p_newtrace: in/out; may be NULL;
2592 may point to NULL variable;
2593 may be same variable as p_newtrace */
2594
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002595static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002596call_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f,
2597 char *msg, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002598{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002599 PyThreadState *tstate = f->f_tstate;
Guido van Rossumb209a111997-04-29 18:18:01 +00002600 PyObject *args, *what;
2601 PyObject *res = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002602
Guido van Rossuma027efa1997-05-05 20:56:21 +00002603 if (tstate->tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002604 /* Don't do recursive traces */
2605 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002606 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002607 *p_newtrace = NULL;
2608 }
2609 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002610 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002611
Guido van Rossumb209a111997-04-29 18:18:01 +00002612 args = PyTuple_New(3);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002613 if (args == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002614 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002615 what = PyString_FromString(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002616 if (what == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002617 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002618 Py_INCREF(f);
2619 PyTuple_SET_ITEM(args, 0, (PyObject *)f);
2620 PyTuple_SET_ITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002621 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002622 arg = Py_None;
2623 Py_INCREF(arg);
2624 PyTuple_SET_ITEM(args, 2, arg);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002625 tstate->tracing++;
Guido van Rossumb209a111997-04-29 18:18:01 +00002626 PyFrame_FastToLocals(f);
2627 res = PyEval_CallObject(*p_trace, args); /* May clear *p_trace! */
2628 PyFrame_LocalsToFast(f, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002629 tstate->tracing--;
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002630 cleanup:
Guido van Rossumb209a111997-04-29 18:18:01 +00002631 Py_XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002632 if (res == NULL) {
2633 /* The trace proc raised an exception */
Guido van Rossumb209a111997-04-29 18:18:01 +00002634 PyTraceBack_Here(f);
2635 Py_XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002636 *p_trace = NULL;
2637 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002638 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002639 *p_newtrace = NULL;
2640 }
Barry Warsawf6202631999-09-08 16:26:33 +00002641 /* to be extra double plus sure we don't get recursive
2642 * calls inf either tracefunc or profilefunc gets an
2643 * exception, zap the global variables.
2644 */
2645 Py_XDECREF(tstate->sys_tracefunc);
2646 tstate->sys_tracefunc = NULL;
2647 Py_XDECREF(tstate->sys_profilefunc);
2648 tstate->sys_profilefunc = NULL;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002649 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002650 }
2651 else {
2652 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002653 Py_XDECREF(*p_newtrace);
2654 if (res == Py_None)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002655 *p_newtrace = NULL;
2656 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002657 Py_INCREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002658 *p_newtrace = res;
2659 }
2660 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002661 Py_DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002662 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002663 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002664}
2665
Guido van Rossumb209a111997-04-29 18:18:01 +00002666PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002667PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002668{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002669 PyThreadState *tstate = PyThreadState_Get();
2670 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002671 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002672 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002673 else
2674 return current_frame->f_builtins;
2675}
2676
Guido van Rossumb209a111997-04-29 18:18:01 +00002677PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002678PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002679{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002680 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002681 if (current_frame == NULL)
2682 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002683 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002684 return current_frame->f_locals;
2685}
2686
Guido van Rossumb209a111997-04-29 18:18:01 +00002687PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002688PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002689{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002690 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002691 if (current_frame == NULL)
2692 return NULL;
2693 else
2694 return current_frame->f_globals;
2695}
2696
Guido van Rossumb209a111997-04-29 18:18:01 +00002697PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002698PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002699{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002700 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002701 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002702}
2703
Guido van Rossum6135a871995-01-09 17:53:26 +00002704int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002705PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002706{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002707 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002708 return current_frame == NULL ? 0 : current_frame->f_restricted;
2709}
2710
Guido van Rossumbe270261997-05-22 22:26:18 +00002711int
Jeremy Hylton061d1062001-03-22 02:32:48 +00002712PyEval_GetNestedScopes(void)
2713{
2714 PyFrameObject *current_frame = PyThreadState_Get()->frame;
2715 return current_frame == NULL ? 0 :
2716 current_frame->f_code->co_flags & CO_NESTED;
2717}
2718
2719int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002720Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002721{
Guido van Rossumb209a111997-04-29 18:18:01 +00002722 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002723 if (f == NULL)
2724 return 0;
2725 if (!PyFile_SoftSpace(f, 0))
2726 return 0;
2727 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002728}
2729
Guido van Rossum3f5da241990-12-20 15:06:42 +00002730
Guido van Rossum681d79a1995-07-18 14:51:37 +00002731/* External interface to call any callable object.
2732 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002733
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002734#undef PyEval_CallObject
2735/* for backward compatibility: export this interface */
2736
Guido van Rossumb209a111997-04-29 18:18:01 +00002737PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002738PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002739{
Guido van Rossumb209a111997-04-29 18:18:01 +00002740 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002741}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002742#define PyEval_CallObject(func,arg) \
2743 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002744
Guido van Rossumb209a111997-04-29 18:18:01 +00002745PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002746PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002747{
Jeremy Hylton52820442001-01-03 23:52:36 +00002748 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002749
2750 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002751 arg = PyTuple_New(0);
2752 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002753 PyErr_SetString(PyExc_TypeError,
2754 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002755 return NULL;
2756 }
2757 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002758 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002759
Guido van Rossumb209a111997-04-29 18:18:01 +00002760 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002761 PyErr_SetString(PyExc_TypeError,
2762 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00002763 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002764 return NULL;
2765 }
2766
Jeremy Hylton52820442001-01-03 23:52:36 +00002767 result = call_object(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002768 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00002769 return result;
2770}
2771
2772/* How often is each kind of object called? The answer depends on the
2773 program. An instrumented call_object() was used to run the Python
2774 regression test suite. The results were:
2775 4200000 PyCFunctions
2776 390000 fast_function() calls
2777 94000 other functions
2778 480000 all functions (sum of prev two)
2779 150000 methods
2780 100000 classes
2781
2782 Tests on other bodies of code show that PyCFunctions are still
2783 most common, but not by such a large margin.
2784*/
2785
Jeremy Hylton512a2372001-04-11 13:52:29 +00002786static char *
2787get_func_name(PyObject *func)
2788{
2789 if (PyMethod_Check(func))
2790 return get_func_name(PyMethod_GET_FUNCTION(func));
2791 else if (PyFunction_Check(func))
2792 return PyString_AsString(((PyFunctionObject*)func)->func_name);
2793 else if (PyCFunction_Check(func))
2794 return ((PyCFunctionObject*)func)->m_ml->ml_name;
2795 else if (PyClass_Check(func))
2796 return PyString_AsString(((PyClassObject*)func)->cl_name);
2797 else if (PyInstance_Check(func)) {
2798 return PyString_AsString(
2799 ((PyInstanceObject*)func)->in_class->cl_name);
2800 } else {
2801 return func->ob_type->tp_name;
2802 }
2803}
2804
2805static char *
2806get_func_desc(PyObject *func)
2807{
2808 if (PyMethod_Check(func))
2809 return "()";
2810 else if (PyFunction_Check(func))
2811 return "()";
2812 else if (PyCFunction_Check(func))
2813 return "()";
2814 else if (PyClass_Check(func))
2815 return " constructor";
2816 else if (PyInstance_Check(func)) {
2817 return " instance";
2818 } else {
2819 return " object";
2820 }
2821}
2822
Jeremy Hylton52820442001-01-03 23:52:36 +00002823static PyObject *
2824call_object(PyObject *func, PyObject *arg, PyObject *kw)
2825{
2826 ternaryfunc call;
2827 PyObject *result;
2828
2829 if (PyMethod_Check(func))
2830 result = call_method(func, arg, kw);
2831 else if (PyFunction_Check(func))
2832 result = call_eval_code2(func, arg, kw);
2833 else if (PyCFunction_Check(func))
2834 result = call_cfunction(func, arg, kw);
2835 else if (PyClass_Check(func))
2836 result = PyInstance_New(func, arg, kw);
2837 else if (PyInstance_Check(func))
2838 result = call_instance(func, arg, kw);
2839 else if ((call = func->ob_type->tp_call) != NULL)
2840 result = (*call)(func, arg, kw);
2841 else {
2842 PyErr_Format(PyExc_TypeError, "object is not callable: %s",
2843 PyString_AS_STRING(PyObject_Repr(func)));
2844 return NULL;
2845 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002846 if (result == NULL && !PyErr_Occurred())
2847 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002848 "NULL result without error in call_object");
Guido van Rossumac7be682001-01-17 15:42:30 +00002849
Guido van Rossume59214e1994-08-30 08:01:59 +00002850 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002851}
2852
Guido van Rossumb209a111997-04-29 18:18:01 +00002853static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00002854call_cfunction(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002855{
Jeremy Hylton52820442001-01-03 23:52:36 +00002856 PyCFunctionObject* f = (PyCFunctionObject*)func;
2857 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
2858 PyObject *self = PyCFunction_GET_SELF(func);
2859 int flags = PyCFunction_GET_FLAGS(func);
2860
Jeremy Hylton52820442001-01-03 23:52:36 +00002861 if (flags & METH_KEYWORDS) {
2862 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002863 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002864 if (kw != NULL && PyDict_Size(kw) != 0) {
2865 PyErr_Format(PyExc_TypeError,
2866 "%.200s() takes no keyword arguments",
2867 f->m_ml->ml_name);
2868 return NULL;
2869 }
Fred Drake1a7aab72001-01-04 22:33:02 +00002870 if (flags & METH_VARARGS) {
2871 return (*meth)(self, arg);
2872 }
2873 if (!(flags & METH_VARARGS)) {
2874 /* the really old style */
2875 int size = PyTuple_GET_SIZE(arg);
2876 if (size == 1)
2877 arg = PyTuple_GET_ITEM(arg, 0);
2878 else if (size == 0)
2879 arg = NULL;
2880 return (*meth)(self, arg);
2881 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002882 /* should never get here ??? */
2883 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002884 return NULL;
2885}
2886
Guido van Rossumb209a111997-04-29 18:18:01 +00002887static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00002888call_instance(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002889{
Jeremy Hylton52820442001-01-03 23:52:36 +00002890 PyObject *res, *call = PyObject_GetAttrString(func, "__call__");
2891 if (call == NULL) {
2892 PyInstanceObject *inst = (PyInstanceObject*) func;
2893 PyErr_Clear();
2894 PyErr_Format(PyExc_AttributeError,
2895 "%.200s instance has no __call__ method",
2896 PyString_AsString(inst->in_class->cl_name));
Guido van Rossum681d79a1995-07-18 14:51:37 +00002897 return NULL;
2898 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002899 res = call_object(call, arg, kw);
2900 Py_DECREF(call);
2901 return res;
2902}
2903
2904static PyObject *
2905call_method(PyObject *func, PyObject *arg, PyObject *kw)
2906{
2907 PyObject *self = PyMethod_GET_SELF(func);
2908 PyObject *class = PyMethod_GET_CLASS(func);
2909 PyObject *result;
2910
2911 func = PyMethod_GET_FUNCTION(func);
2912 if (self == NULL) {
2913 /* Unbound methods must be called with an instance of
2914 the class (or a derived class) as first argument */
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00002915 int ok;
Jeremy Hylton52820442001-01-03 23:52:36 +00002916 if (PyTuple_Size(arg) >= 1)
2917 self = PyTuple_GET_ITEM(arg, 0);
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00002918 if (self == NULL)
2919 ok = 0;
2920 else {
2921 ok = PyObject_IsInstance(self, class);
2922 if (ok < 0)
2923 return NULL;
2924 }
2925 if (!ok) {
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00002926 PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00002927 "unbound method %s%s must be "
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00002928 "called with instance as first argument",
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00002929 get_func_name(func), get_func_desc(func));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002930 return NULL;
2931 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002932 Py_INCREF(arg);
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00002933 }
2934 else {
Jeremy Hylton52820442001-01-03 23:52:36 +00002935 int argcount = PyTuple_Size(arg);
2936 PyObject *newarg = PyTuple_New(argcount + 1);
2937 int i;
2938 if (newarg == NULL)
2939 return NULL;
2940 Py_INCREF(self);
2941 PyTuple_SET_ITEM(newarg, 0, self);
2942 for (i = 0; i < argcount; i++) {
2943 PyObject *v = PyTuple_GET_ITEM(arg, i);
2944 Py_XINCREF(v);
2945 PyTuple_SET_ITEM(newarg, i+1, v);
2946 }
2947 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002948 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002949 result = call_object(func, arg, kw);
2950 Py_DECREF(arg);
2951 return result;
2952}
2953
2954static PyObject *
2955call_eval_code2(PyObject *func, PyObject *arg, PyObject *kw)
2956{
2957 PyObject *result;
2958 PyObject *argdefs;
2959 PyObject **d, **k;
2960 int nk, nd;
2961
2962 argdefs = PyFunction_GET_DEFAULTS(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00002963 if (argdefs != NULL && PyTuple_Check(argdefs)) {
2964 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
2965 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002966 }
2967 else {
2968 d = NULL;
2969 nd = 0;
2970 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002971
Guido van Rossum681d79a1995-07-18 14:51:37 +00002972 if (kw != NULL) {
2973 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002974 nk = PyDict_Size(kw);
2975 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002976 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002977 PyErr_NoMemory();
2978 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002979 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002980 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002981 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002982 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002983 i += 2;
2984 nk = i/2;
2985 /* XXX This is broken if the caller deletes dict items! */
2986 }
2987 else {
2988 k = NULL;
2989 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002990 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002991
Guido van Rossum681d79a1995-07-18 14:51:37 +00002992 result = eval_code2(
Jeremy Hylton52820442001-01-03 23:52:36 +00002993 (PyCodeObject *)PyFunction_GET_CODE(func),
2994 PyFunction_GET_GLOBALS(func), (PyObject *)NULL,
Guido van Rossumb209a111997-04-29 18:18:01 +00002995 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002996 k, nk, d, nd,
2997 PyFunction_GET_CLOSURE(func));
Guido van Rossumac7be682001-01-17 15:42:30 +00002998
Guido van Rossumb18618d2000-05-03 23:44:39 +00002999 if (k != NULL)
3000 PyMem_DEL(k);
Guido van Rossumac7be682001-01-17 15:42:30 +00003001
Guido van Rossum681d79a1995-07-18 14:51:37 +00003002 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003003}
3004
Jeremy Hylton52820442001-01-03 23:52:36 +00003005#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
3006
3007/* The two fast_xxx() functions optimize calls for which no argument
3008 tuple is necessary; the objects are passed directly from the stack.
3009 fast_cfunction() is called for METH_OLDARGS functions.
3010 fast_function() is for functions with no special argument handling.
3011*/
3012
3013static PyObject *
3014fast_cfunction(PyObject *func, PyObject ***pp_stack, int na)
3015{
3016 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3017 PyObject *self = PyCFunction_GET_SELF(func);
3018
3019 if (na == 0)
3020 return (*meth)(self, NULL);
Charles G. Waldmaneec72a72001-01-10 22:11:59 +00003021 else if (na == 1) {
3022 PyObject *arg = EXT_POP(*pp_stack);
Guido van Rossumac7be682001-01-17 15:42:30 +00003023 PyObject *result = (*meth)(self, arg);
Charles G. Waldmaneec72a72001-01-10 22:11:59 +00003024 Py_DECREF(arg);
3025 return result;
3026 } else {
Jeremy Hylton52820442001-01-03 23:52:36 +00003027 PyObject *args = load_args(pp_stack, na);
3028 PyObject *result = (*meth)(self, args);
3029 Py_DECREF(args);
3030 return result;
3031 }
3032}
3033
3034static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00003035fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00003036{
3037 PyObject *co = PyFunction_GET_CODE(func);
3038 PyObject *globals = PyFunction_GET_GLOBALS(func);
3039 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003040 PyObject *closure = PyFunction_GET_CLOSURE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003041 PyObject **d = NULL;
3042 int nd = 0;
3043
3044 if (argdefs != NULL) {
3045 d = &PyTuple_GET_ITEM(argdefs, 0);
3046 nd = ((PyTupleObject *)argdefs)->ob_size;
3047 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003048 return eval_code2((PyCodeObject *)co, globals,
Jeremy Hylton52820442001-01-03 23:52:36 +00003049 (PyObject *)NULL, (*pp_stack)-n, na,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003050 (*pp_stack)-2*nk, nk, d, nd,
3051 closure);
Jeremy Hylton52820442001-01-03 23:52:36 +00003052}
3053
3054static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00003055update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
3056 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00003057{
3058 PyObject *kwdict = NULL;
3059 if (orig_kwdict == NULL)
3060 kwdict = PyDict_New();
3061 else {
3062 kwdict = PyDict_Copy(orig_kwdict);
3063 Py_DECREF(orig_kwdict);
3064 }
3065 if (kwdict == NULL)
3066 return NULL;
3067 while (--nk >= 0) {
3068 int err;
3069 PyObject *value = EXT_POP(*pp_stack);
3070 PyObject *key = EXT_POP(*pp_stack);
3071 if (PyDict_GetItem(kwdict, key) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +00003072 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00003073 "%.200s%s got multiple values "
Jeremy Hylton512a2372001-04-11 13:52:29 +00003074 "for keyword argument '%.200s'",
3075 get_func_name(func),
3076 get_func_desc(func),
3077 PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00003078 Py_DECREF(key);
3079 Py_DECREF(value);
3080 Py_DECREF(kwdict);
3081 return NULL;
3082 }
3083 err = PyDict_SetItem(kwdict, key, value);
3084 Py_DECREF(key);
3085 Py_DECREF(value);
3086 if (err) {
3087 Py_DECREF(kwdict);
3088 return NULL;
3089 }
3090 }
3091 return kwdict;
3092}
3093
3094static PyObject *
3095update_star_args(int nstack, int nstar, PyObject *stararg,
3096 PyObject ***pp_stack)
3097{
3098 PyObject *callargs, *w;
3099
3100 callargs = PyTuple_New(nstack + nstar);
3101 if (callargs == NULL) {
3102 return NULL;
3103 }
3104 if (nstar) {
3105 int i;
3106 for (i = 0; i < nstar; i++) {
3107 PyObject *a = PyTuple_GET_ITEM(stararg, i);
3108 Py_INCREF(a);
3109 PyTuple_SET_ITEM(callargs, nstack + i, a);
3110 }
3111 }
3112 while (--nstack >= 0) {
3113 w = EXT_POP(*pp_stack);
3114 PyTuple_SET_ITEM(callargs, nstack, w);
3115 }
3116 return callargs;
3117}
3118
3119static PyObject *
3120load_args(PyObject ***pp_stack, int na)
3121{
3122 PyObject *args = PyTuple_New(na);
3123 PyObject *w;
3124
3125 if (args == NULL)
3126 return NULL;
3127 while (--na >= 0) {
3128 w = EXT_POP(*pp_stack);
3129 PyTuple_SET_ITEM(args, na, w);
3130 }
3131 return args;
3132}
3133
3134static PyObject *
3135do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
3136{
3137 PyObject *callargs = NULL;
3138 PyObject *kwdict = NULL;
3139 PyObject *result = NULL;
3140
3141 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003142 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003143 if (kwdict == NULL)
3144 goto call_fail;
3145 }
3146 callargs = load_args(pp_stack, na);
3147 if (callargs == NULL)
3148 goto call_fail;
3149 result = call_object(func, callargs, kwdict);
3150 call_fail:
3151 Py_XDECREF(callargs);
3152 Py_XDECREF(kwdict);
3153 return result;
3154}
3155
3156static PyObject *
3157ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3158{
3159 int nstar = 0;
3160 PyObject *callargs = NULL;
3161 PyObject *stararg = NULL;
3162 PyObject *kwdict = NULL;
3163 PyObject *result = NULL;
3164
3165 if (flags & CALL_FLAG_KW) {
3166 kwdict = EXT_POP(*pp_stack);
3167 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003168 PyErr_Format(PyExc_TypeError,
Jeremy Hylton512a2372001-04-11 13:52:29 +00003169 "%s%s argument after ** "
3170 "must be a dictionary",
3171 get_func_name(func),
3172 get_func_desc(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00003173 goto ext_call_fail;
3174 }
3175 }
3176 if (flags & CALL_FLAG_VAR) {
3177 stararg = EXT_POP(*pp_stack);
3178 if (!PyTuple_Check(stararg)) {
3179 PyObject *t = NULL;
3180 t = PySequence_Tuple(stararg);
3181 if (t == NULL) {
Jeremy Hylton512a2372001-04-11 13:52:29 +00003182 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
3183 PyErr_Format(PyExc_TypeError,
3184 "%s%s argument after * "
3185 "must be a sequence",
3186 get_func_name(func),
3187 get_func_desc(func));
3188 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003189 goto ext_call_fail;
3190 }
3191 Py_DECREF(stararg);
3192 stararg = t;
3193 }
3194 nstar = PyTuple_GET_SIZE(stararg);
3195 }
3196 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003197 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003198 if (kwdict == NULL)
3199 goto ext_call_fail;
3200 }
3201 callargs = update_star_args(na, nstar, stararg, pp_stack);
3202 if (callargs == NULL)
3203 goto ext_call_fail;
3204 result = call_object(func, callargs, kwdict);
3205 ext_call_fail:
3206 Py_XDECREF(callargs);
3207 Py_XDECREF(kwdict);
3208 Py_XDECREF(stararg);
3209 return result;
3210}
3211
Guido van Rossum3b9c6671996-07-30 18:40:29 +00003212#define SLICE_ERROR_MSG \
3213 "standard sequence type does not support step size other than one"
3214
Guido van Rossumb209a111997-04-29 18:18:01 +00003215static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003216loop_subscript(PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003217{
Guido van Rossumb209a111997-04-29 18:18:01 +00003218 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00003219 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003220 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003221 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003222 return NULL;
3223 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003224 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00003225 v = (*sq->sq_item)(v, i);
3226 if (v)
3227 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00003228 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00003229 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00003230 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003231}
3232
Guido van Rossum20c6add2000-05-08 14:06:50 +00003233/* Extract a slice index from a PyInt or PyLong, the index is bound to
3234 the range [-INT_MAX+1, INTMAX]. Returns 0 and an exception if there is
3235 and error. Returns 1 on success.*/
3236
3237int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003238_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003239{
3240 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003241 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003242 if (PyInt_Check(v)) {
3243 x = PyInt_AsLong(v);
3244 } else if (PyLong_Check(v)) {
3245 x = PyLong_AsLong(v);
3246 if (x==-1 && PyErr_Occurred()) {
3247 PyObject *long_zero;
Guido van Rossumac7be682001-01-17 15:42:30 +00003248 int cmp;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003249
Guido van Rossumac7be682001-01-17 15:42:30 +00003250 if (!PyErr_ExceptionMatches(
3251 PyExc_OverflowError)) {
3252 /* It's not an overflow error, so just
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003253 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00003254 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003255 }
3256
Guido van Rossumac7be682001-01-17 15:42:30 +00003257 /* Clear the OverflowError */
3258 PyErr_Clear();
3259
3260 /* It's an overflow error, so we need to
3261 check the sign of the long integer,
3262 set the value to INT_MAX or 0, and clear
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003263 the error. */
3264
3265 /* Create a long integer with a value of 0 */
Guido van Rossumac7be682001-01-17 15:42:30 +00003266 long_zero = PyLong_FromLong(0L);
Guido van Rossum20c6add2000-05-08 14:06:50 +00003267 if (long_zero == NULL) return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003268
3269 /* Check sign */
Guido van Rossumac7be682001-01-17 15:42:30 +00003270 cmp = PyObject_RichCompareBool(v, long_zero,
3271 Py_GT);
3272 Py_DECREF(long_zero);
3273 if (cmp < 0)
3274 return 0;
3275 else if (cmp > 0)
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003276 x = INT_MAX;
3277 else
3278 x = 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003279 }
3280 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003281 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003282 "slice indices must be integers");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003283 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003284 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003285 /* Truncate -- very long indices are truncated anyway */
3286 if (x > INT_MAX)
3287 x = INT_MAX;
3288 else if (x < -INT_MAX)
3289 x = 0;
3290 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003291 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003292 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003293}
3294
Guido van Rossumb209a111997-04-29 18:18:01 +00003295static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003296apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003297{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003298 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003299 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003300 return NULL;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003301 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum04691fc1992-08-12 15:35:34 +00003302 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003303 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003304}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003305
3306static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003307assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3308 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003309{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003310 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003311 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum3f5da241990-12-20 15:06:42 +00003312 return -1;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003313 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum3f5da241990-12-20 15:06:42 +00003314 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003315 if (x == NULL)
3316 return PySequence_DelSlice(u, ilow, ihigh);
3317 else
3318 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003319}
3320
Guido van Rossumb209a111997-04-29 18:18:01 +00003321static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003322cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003323{
Guido van Rossumac7be682001-01-17 15:42:30 +00003324 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003325 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00003326 case IS:
3327 case IS_NOT:
3328 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00003329 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003330 res = !res;
3331 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003332 case IN:
3333 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003334 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003335 if (res < 0)
3336 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00003337 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003338 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003339 break;
3340 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00003341 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003342 break;
3343 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003344 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003345 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003346 v = res ? Py_True : Py_False;
3347 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003348 return v;
3349}
3350
Thomas Wouters52152252000-08-17 22:55:00 +00003351static PyObject *
3352import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003353{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003354 PyObject *x;
3355
3356 x = PyObject_GetAttr(v, name);
3357 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00003358 PyErr_Format(PyExc_ImportError,
3359 "cannot import name %.230s",
3360 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003361 }
Thomas Wouters52152252000-08-17 22:55:00 +00003362 return x;
3363}
Guido van Rossumac7be682001-01-17 15:42:30 +00003364
Thomas Wouters52152252000-08-17 22:55:00 +00003365static int
3366import_all_from(PyObject *locals, PyObject *v)
3367{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003368 PyObject *all = PyObject_GetAttrString(v, "__all__");
3369 PyObject *dict, *name, *value;
3370 int skip_leading_underscores = 0;
3371 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003372
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003373 if (all == NULL) {
3374 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3375 return -1; /* Unexpected error */
3376 PyErr_Clear();
3377 dict = PyObject_GetAttrString(v, "__dict__");
3378 if (dict == NULL) {
3379 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3380 return -1;
3381 PyErr_SetString(PyExc_ImportError,
3382 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003383 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003384 }
3385 all = PyMapping_Keys(dict);
3386 Py_DECREF(dict);
3387 if (all == NULL)
3388 return -1;
3389 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003390 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003391
3392 for (pos = 0, err = 0; ; pos++) {
3393 name = PySequence_GetItem(all, pos);
3394 if (name == NULL) {
3395 if (!PyErr_ExceptionMatches(PyExc_IndexError))
3396 err = -1;
3397 else
3398 PyErr_Clear();
3399 break;
3400 }
3401 if (skip_leading_underscores &&
3402 PyString_Check(name) &&
3403 PyString_AS_STRING(name)[0] == '_')
3404 {
3405 Py_DECREF(name);
3406 continue;
3407 }
3408 value = PyObject_GetAttr(v, name);
3409 if (value == NULL)
3410 err = -1;
3411 else
3412 err = PyDict_SetItem(locals, name, value);
3413 Py_DECREF(name);
3414 Py_XDECREF(value);
3415 if (err != 0)
3416 break;
3417 }
3418 Py_DECREF(all);
3419 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003420}
3421
Guido van Rossumb209a111997-04-29 18:18:01 +00003422static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003423build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003424{
Guido van Rossumcd649651997-08-22 16:56:16 +00003425 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003426 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003427 PyErr_SetString(PyExc_SystemError,
3428 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00003429 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003430 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003431 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003432 PyErr_SetString(PyExc_SystemError,
3433 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00003434 return NULL;
3435 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003436 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003437 PyErr_SetString(PyExc_SystemError,
Guido van Rossum7a5b7962000-03-31 13:52:29 +00003438 "build_class with non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00003439 return NULL;
3440 }
Guido van Rossumcd649651997-08-22 16:56:16 +00003441 n = PyTuple_Size(bases);
3442 for (i = 0; i < n; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003443 PyObject *base = PyTuple_GET_ITEM(bases, i);
3444 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00003445 /* Call the base's *type*, if it is callable.
3446 This code is a hook for Donald Beaudry's
3447 and Jim Fulton's type extensions. In
Thomas Wouters7e474022000-07-16 12:04:32 +00003448 unextended Python it will never be triggered
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003449 since its types are not callable.
3450 Ditto: call the bases's *class*, if it has
3451 one. This makes the same thing possible
3452 without writing C code. A true meta-object
3453 protocol! */
3454 PyObject *basetype = (PyObject *)base->ob_type;
3455 PyObject *callable = NULL;
3456 if (PyCallable_Check(basetype))
3457 callable = basetype;
3458 else
3459 callable = PyObject_GetAttrString(
3460 base, "__class__");
3461 if (callable) {
3462 PyObject *args;
3463 PyObject *newclass = NULL;
3464 args = Py_BuildValue(
3465 "(OOO)", name, bases, methods);
3466 if (args != NULL) {
3467 newclass = PyEval_CallObject(
3468 callable, args);
3469 Py_DECREF(args);
3470 }
Guido van Rossum730806d1998-04-10 22:27:42 +00003471 if (callable != basetype) {
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003472 Py_DECREF(callable);
Guido van Rossum730806d1998-04-10 22:27:42 +00003473 }
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003474 return newclass;
Guido van Rossum150b2df1996-12-05 23:17:11 +00003475 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003476 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00003477 "base is not a class object");
3478 return NULL;
3479 }
3480 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003481 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00003482}
3483
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003484static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003485exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3486 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003487{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003488 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003489 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003490 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003491
Guido van Rossumb209a111997-04-29 18:18:01 +00003492 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3493 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003494 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003495 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003496 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003497 locals = PyTuple_GetItem(prog, 2);
3498 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003499 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003500 if (globals == Py_None) {
3501 globals = PyEval_GetGlobals();
3502 if (locals == Py_None) {
3503 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003504 plain = 1;
3505 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003506 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003507 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003508 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003509 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003510 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003511 !PyCode_Check(prog) &&
3512 !PyFile_Check(prog)) {
3513 PyErr_SetString(PyExc_TypeError,
Guido van Rossumac7be682001-01-17 15:42:30 +00003514 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003515 return -1;
3516 }
Fred Drake661ea262000-10-24 19:57:45 +00003517 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003518 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003519 "exec: arg 2 must be a dictionary or None");
3520 return -1;
3521 }
3522 if (!PyDict_Check(locals)) {
3523 PyErr_SetString(PyExc_TypeError,
3524 "exec: arg 3 must be a dictionary or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003525 return -1;
3526 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003527 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003528 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003529 if (PyCode_Check(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003530 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003531 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003532 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003533 FILE *fp = PyFile_AsFile(prog);
3534 char *name = PyString_AsString(PyFile_Name(prog));
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003535 if (PyEval_GetNestedScopes()) {
3536 PyCompilerFlags cf;
3537 cf.cf_nested_scopes = 1;
3538 v = PyRun_FileFlags(fp, name, Py_file_input, globals,
3539 locals, &cf);
3540 } else {
3541 v = PyRun_File(fp, name, Py_file_input, globals,
3542 locals);
3543 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003544 }
3545 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003546 char *str;
3547 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003548 return -1;
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003549 if (PyEval_GetNestedScopes()) {
3550 PyCompilerFlags cf;
3551 cf.cf_nested_scopes = 1;
3552 v = PyRun_StringFlags(str, Py_file_input, globals,
3553 locals, &cf);
3554 } else
3555 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003556 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003557 if (plain)
3558 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003559 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003560 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003561 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003562 return 0;
3563}
Guido van Rossum24c13741995-02-14 09:42:43 +00003564
Guido van Rossumac7be682001-01-17 15:42:30 +00003565static void
Paul Prescode68140d2000-08-30 20:25:01 +00003566format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3567{
3568 char *obj_str;
3569
3570 if (!obj)
3571 return;
3572
3573 obj_str = PyString_AsString(obj);
3574 if (!obj_str)
3575 return;
3576
3577 PyErr_Format(exc, format_str, obj_str);
3578}
Guido van Rossum950361c1997-01-24 13:49:28 +00003579
3580#ifdef DYNAMIC_EXECUTION_PROFILE
3581
3582PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003583getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003584{
3585 int i;
3586 PyObject *l = PyList_New(256);
3587 if (l == NULL) return NULL;
3588 for (i = 0; i < 256; i++) {
3589 PyObject *x = PyInt_FromLong(a[i]);
3590 if (x == NULL) {
3591 Py_DECREF(l);
3592 return NULL;
3593 }
3594 PyList_SetItem(l, i, x);
3595 }
3596 for (i = 0; i < 256; i++)
3597 a[i] = 0;
3598 return l;
3599}
3600
3601PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003602_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003603{
3604#ifndef DXPAIRS
3605 return getarray(dxp);
3606#else
3607 int i;
3608 PyObject *l = PyList_New(257);
3609 if (l == NULL) return NULL;
3610 for (i = 0; i < 257; i++) {
3611 PyObject *x = getarray(dxpairs[i]);
3612 if (x == NULL) {
3613 Py_DECREF(l);
3614 return NULL;
3615 }
3616 PyList_SetItem(l, i, x);
3617 }
3618 return l;
3619#endif
3620}
3621
3622#endif