blob: 5a3fc59295fc662826563c68d8466363d5dcc13a [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:
Guido van Rossum681d79a1995-07-18 14:51:37 +00005 XXX speed up searching for keywords by using a dictionary
Guido van Rossum681d79a1995-07-18 14:51:37 +00006 XXX document it!
7 */
8
Thomas Wouters477c8d52006-05-27 19:21:47 +00009/* enable more aggressive intra-module optimizations, where available */
10#define PY_LOCAL_AGGRESSIVE
11
Guido van Rossumb209a111997-04-29 18:18:01 +000012#include "Python.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000013
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000014#include "code.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000015#include "frameobject.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000016#include "eval.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000017#include "opcode.h"
Tim Peters6d6c1a32001-08-02 04:15:00 +000018#include "structmember.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000019
Guido van Rossumc6004111993-11-05 10:22:19 +000020#include <ctype.h>
21
Thomas Wouters477c8d52006-05-27 19:21:47 +000022#ifndef WITH_TSC
Michael W. Hudson75eabd22005-01-18 15:56:11 +000023
24#define READ_TIMESTAMP(var)
25
26#else
Martin v. Löwisf30d60e2004-06-08 08:17:44 +000027
28typedef unsigned long long uint64;
29
Michael W. Hudson800ba232004-08-12 18:19:17 +000030#if defined(__ppc__) /* <- Don't know if this is the correct symbol; this
31 section should work for GCC on any PowerPC platform,
32 irrespective of OS. POWER? Who knows :-) */
33
Michael W. Hudson75eabd22005-01-18 15:56:11 +000034#define READ_TIMESTAMP(var) ppc_getcounter(&var)
Michael W. Hudson800ba232004-08-12 18:19:17 +000035
36static void
37ppc_getcounter(uint64 *v)
38{
39 register unsigned long tbu, tb, tbu2;
40
41 loop:
42 asm volatile ("mftbu %0" : "=r" (tbu) );
43 asm volatile ("mftb %0" : "=r" (tb) );
44 asm volatile ("mftbu %0" : "=r" (tbu2));
45 if (__builtin_expect(tbu != tbu2, 0)) goto loop;
46
Thomas Wouters477c8d52006-05-27 19:21:47 +000047 /* The slightly peculiar way of writing the next lines is
Michael W. Hudson800ba232004-08-12 18:19:17 +000048 compiled better by GCC than any other way I tried. */
49 ((long*)(v))[0] = tbu;
50 ((long*)(v))[1] = tb;
51}
52
Michael W. Hudson75eabd22005-01-18 15:56:11 +000053#else /* this is for linux/x86 (and probably any other GCC/x86 combo) */
Michael W. Hudson800ba232004-08-12 18:19:17 +000054
Michael W. Hudson75eabd22005-01-18 15:56:11 +000055#define READ_TIMESTAMP(val) \
56 __asm__ __volatile__("rdtsc" : "=A" (val))
Michael W. Hudson800ba232004-08-12 18:19:17 +000057
58#endif
59
Thomas Wouters477c8d52006-05-27 19:21:47 +000060void dump_tsc(int opcode, int ticked, uint64 inst0, uint64 inst1,
Martin v. Löwisf30d60e2004-06-08 08:17:44 +000061 uint64 loop0, uint64 loop1, uint64 intr0, uint64 intr1)
62{
63 uint64 intr, inst, loop;
64 PyThreadState *tstate = PyThreadState_Get();
65 if (!tstate->interp->tscdump)
66 return;
67 intr = intr1 - intr0;
68 inst = inst1 - inst0 - intr;
69 loop = loop1 - loop0 - intr;
70 fprintf(stderr, "opcode=%03d t=%d inst=%06lld loop=%06lld\n",
71 opcode, ticked, inst, loop);
72}
Michael W. Hudson800ba232004-08-12 18:19:17 +000073
Martin v. Löwisf30d60e2004-06-08 08:17:44 +000074#endif
75
Guido van Rossum04691fc1992-08-12 15:35:34 +000076/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000077/* #define CASE_TOO_BIG 1 */
Guido van Rossum04691fc1992-08-12 15:35:34 +000078
Guido van Rossum408027e1996-12-30 16:17:54 +000079#ifdef Py_DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000080/* For debugging the interpreter: */
81#define LLTRACE 1 /* Low-level trace feature */
82#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000083#endif
84
Jeremy Hylton52820442001-01-03 23:52:36 +000085typedef PyObject *(*callproc)(PyObject *, PyObject *, PyObject *);
Guido van Rossum5b722181993-03-30 17:46:03 +000086
Guido van Rossum374a9221991-04-04 10:40:29 +000087/* Forward declarations */
Martin v. Löwisf30d60e2004-06-08 08:17:44 +000088#ifdef WITH_TSC
Thomas Wouters477c8d52006-05-27 19:21:47 +000089static PyObject * call_function(PyObject ***, int, uint64*, uint64*);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +000090#else
Thomas Wouters477c8d52006-05-27 19:21:47 +000091static PyObject * call_function(PyObject ***, int);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +000092#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +000093static PyObject * fast_function(PyObject *, PyObject ***, int, int, int);
94static PyObject * do_call(PyObject *, PyObject ***, int, int);
95static PyObject * ext_do_call(PyObject *, PyObject ***, int, int, int);
96static PyObject * update_keyword_args(PyObject *, int, PyObject ***,PyObject *);
97static PyObject * update_star_args(int, int, PyObject *, PyObject ***);
98static PyObject * load_args(PyObject ***, int);
Jeremy Hylton52820442001-01-03 23:52:36 +000099#define CALL_FLAG_VAR 1
100#define CALL_FLAG_KW 2
101
Guido van Rossum0a066c01992-03-27 17:29:15 +0000102#ifdef LLTRACE
Guido van Rossumc2e20742006-02-27 22:32:47 +0000103static int lltrace;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000104static int prtrace(PyObject *, char *);
Guido van Rossum0a066c01992-03-27 17:29:15 +0000105#endif
Fred Drake5755ce62001-06-27 19:19:46 +0000106static int call_trace(Py_tracefunc, PyObject *, PyFrameObject *,
107 int, PyObject *);
Fred Drake4ec5d562001-10-04 19:26:43 +0000108static void call_trace_protected(Py_tracefunc, PyObject *,
Armin Rigo1c2d7e52005-09-20 18:34:01 +0000109 PyFrameObject *, int, PyObject *);
Fred Drake5755ce62001-06-27 19:19:46 +0000110static void call_exc_trace(Py_tracefunc, PyObject *, PyFrameObject *);
Tim Peters8a5c3c72004-04-05 19:36:21 +0000111static int maybe_call_line_trace(Py_tracefunc, PyObject *,
Armin Rigobf57a142004-03-22 19:24:58 +0000112 PyFrameObject *, int *, int *, int *);
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000113
Thomas Wouters477c8d52006-05-27 19:21:47 +0000114static PyObject * apply_slice(PyObject *, PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000115static int assign_slice(PyObject *, PyObject *,
116 PyObject *, PyObject *);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000117static PyObject * cmp_outcome(int, PyObject *, PyObject *);
118static PyObject * import_from(PyObject *, PyObject *);
Thomas Wouters52152252000-08-17 22:55:00 +0000119static int import_all_from(PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000120static void set_exc_info(PyThreadState *, PyObject *, PyObject *, PyObject *);
121static void reset_exc_info(PyThreadState *);
Paul Prescode68140d2000-08-30 20:25:01 +0000122static void format_exc_check_arg(PyObject *, char *, PyObject *);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000123static PyObject * string_concatenate(PyObject *, PyObject *,
Raymond Hettinger52a21b82004-08-06 18:43:09 +0000124 PyFrameObject *, unsigned char *);
Guido van Rossum374a9221991-04-04 10:40:29 +0000125
Paul Prescode68140d2000-08-30 20:25:01 +0000126#define NAME_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +0000127 "name '%.200s' is not defined"
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000128#define GLOBAL_NAME_ERROR_MSG \
129 "global name '%.200s' is not defined"
Paul Prescode68140d2000-08-30 20:25:01 +0000130#define UNBOUNDLOCAL_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +0000131 "local variable '%.200s' referenced before assignment"
Jeremy Hyltonc76770c2001-04-13 16:51:46 +0000132#define UNBOUNDFREE_ERROR_MSG \
133 "free variable '%.200s' referenced before assignment" \
134 " in enclosing scope"
Guido van Rossum374a9221991-04-04 10:40:29 +0000135
Guido van Rossum950361c1997-01-24 13:49:28 +0000136/* Dynamic execution profile */
137#ifdef DYNAMIC_EXECUTION_PROFILE
138#ifdef DXPAIRS
139static long dxpairs[257][256];
140#define dxp dxpairs[256]
141#else
142static long dxp[256];
143#endif
144#endif
145
Jeremy Hylton985eba52003-02-05 23:13:00 +0000146/* Function call profile */
147#ifdef CALL_PROFILE
148#define PCALL_NUM 11
149static int pcall[PCALL_NUM];
150
151#define PCALL_ALL 0
152#define PCALL_FUNCTION 1
153#define PCALL_FAST_FUNCTION 2
154#define PCALL_FASTER_FUNCTION 3
155#define PCALL_METHOD 4
156#define PCALL_BOUND_METHOD 5
157#define PCALL_CFUNCTION 6
158#define PCALL_TYPE 7
159#define PCALL_GENERATOR 8
160#define PCALL_OTHER 9
161#define PCALL_POP 10
162
163/* Notes about the statistics
164
165 PCALL_FAST stats
166
167 FAST_FUNCTION means no argument tuple needs to be created.
168 FASTER_FUNCTION means that the fast-path frame setup code is used.
169
170 If there is a method call where the call can be optimized by changing
171 the argument tuple and calling the function directly, it gets recorded
172 twice.
173
174 As a result, the relationship among the statistics appears to be
175 PCALL_ALL == PCALL_FUNCTION + PCALL_METHOD - PCALL_BOUND_METHOD +
176 PCALL_CFUNCTION + PCALL_TYPE + PCALL_GENERATOR + PCALL_OTHER
177 PCALL_FUNCTION > PCALL_FAST_FUNCTION > PCALL_FASTER_FUNCTION
178 PCALL_METHOD > PCALL_BOUND_METHOD
179*/
180
181#define PCALL(POS) pcall[POS]++
182
183PyObject *
184PyEval_GetCallStats(PyObject *self)
185{
Thomas Wouters89f507f2006-12-13 04:49:30 +0000186 return Py_BuildValue("iiiiiiiiiii",
Jeremy Hylton985eba52003-02-05 23:13:00 +0000187 pcall[0], pcall[1], pcall[2], pcall[3],
188 pcall[4], pcall[5], pcall[6], pcall[7],
Thomas Wouters89f507f2006-12-13 04:49:30 +0000189 pcall[8], pcall[9], pcall[10]);
Jeremy Hylton985eba52003-02-05 23:13:00 +0000190}
191#else
192#define PCALL(O)
193
194PyObject *
195PyEval_GetCallStats(PyObject *self)
196{
197 Py_INCREF(Py_None);
198 return Py_None;
199}
200#endif
201
Tim Peters5ca576e2001-06-18 22:08:13 +0000202
Guido van Rossume59214e1994-08-30 08:01:59 +0000203#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000204
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000205#ifdef HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000206#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +0000207#endif
Guido van Rossum49b56061998-10-01 20:42:43 +0000208#include "pythread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000209
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000210static PyThread_type_lock interpreter_lock = 0; /* This is the GIL */
Guido van Rossuma9672091994-09-14 13:31:22 +0000211static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000212
Tim Peters7f468f22004-10-11 02:40:51 +0000213int
214PyEval_ThreadsInitialized(void)
215{
216 return interpreter_lock != 0;
217}
218
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000219void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000220PyEval_InitThreads(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000221{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000222 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000223 return;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000224 interpreter_lock = PyThread_allocate_lock();
225 PyThread_acquire_lock(interpreter_lock, 1);
226 main_thread = PyThread_get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000227}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000228
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000229void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000230PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000231{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000232 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000233}
234
235void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000236PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000237{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000238 PyThread_release_lock(interpreter_lock);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000239}
240
241void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000242PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000243{
244 if (tstate == NULL)
245 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000246 /* Check someone has called PyEval_InitThreads() to create the lock */
247 assert(interpreter_lock);
Guido van Rossum65d5b571998-12-21 19:32:43 +0000248 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000249 if (PyThreadState_Swap(tstate) != NULL)
250 Py_FatalError(
251 "PyEval_AcquireThread: non-NULL old thread state");
252}
253
254void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000255PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000256{
257 if (tstate == NULL)
258 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
259 if (PyThreadState_Swap(NULL) != tstate)
260 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000261 PyThread_release_lock(interpreter_lock);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000262}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000263
264/* This function is called from PyOS_AfterFork to ensure that newly
265 created child processes don't hold locks referring to threads which
266 are not running in the child process. (This could also be done using
267 pthread_atfork mechanism, at least for the pthreads implementation.) */
268
269void
270PyEval_ReInitThreads(void)
271{
272 if (!interpreter_lock)
273 return;
274 /*XXX Can't use PyThread_free_lock here because it does too
275 much error-checking. Doing this cleanly would require
276 adding a new function to each thread_*.h. Instead, just
277 create a new lock and waste a little bit of memory */
278 interpreter_lock = PyThread_allocate_lock();
279 PyThread_acquire_lock(interpreter_lock, 1);
280 main_thread = PyThread_get_thread_ident();
281}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000282#endif
283
Guido van Rossumff4949e1992-08-05 19:58:53 +0000284/* Functions save_thread and restore_thread are always defined so
285 dynamically loaded modules needn't be compiled separately for use
286 with and without threads: */
287
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000288PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000289PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000290{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000291 PyThreadState *tstate = PyThreadState_Swap(NULL);
292 if (tstate == NULL)
293 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000294#ifdef WITH_THREAD
Guido van Rossumb74eca91997-09-30 22:03:16 +0000295 if (interpreter_lock)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000296 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000297#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000298 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000299}
300
301void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000302PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000303{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000304 if (tstate == NULL)
305 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000306#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000307 if (interpreter_lock) {
Guido van Rossumb74eca91997-09-30 22:03:16 +0000308 int err = errno;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000309 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000310 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000311 }
312#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000313 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000314}
315
316
Guido van Rossuma9672091994-09-14 13:31:22 +0000317/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
318 signal handlers or Mac I/O completion routines) can schedule calls
319 to a function to be called synchronously.
320 The synchronous function is called with one void* argument.
321 It should return 0 for success or -1 for failure -- failure should
322 be accompanied by an exception.
323
324 If registry succeeds, the registry function returns 0; if it fails
325 (e.g. due to too many pending calls) it returns -1 (without setting
326 an exception condition).
327
328 Note that because registry may occur from within signal handlers,
329 or other asynchronous events, calling malloc() is unsafe!
330
331#ifdef WITH_THREAD
332 Any thread can schedule pending calls, but only the main thread
333 will execute them.
334#endif
335
336 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
337 There are two possible race conditions:
338 (1) nested asynchronous registry calls;
339 (2) registry calls made while pending calls are being processed.
340 While (1) is very unlikely, (2) is a real possibility.
341 The current code is safe against (2), but not against (1).
342 The safety against (2) is derived from the fact that only one
343 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000344
Guido van Rossuma027efa1997-05-05 20:56:21 +0000345 XXX Darn! With the advent of thread state, we should have an array
346 of pending calls per thread in the thread state! Later...
347*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000348
Guido van Rossuma9672091994-09-14 13:31:22 +0000349#define NPENDINGCALLS 32
350static struct {
Thomas Wouters334fb892000-07-25 12:56:38 +0000351 int (*func)(void *);
352 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000353} pendingcalls[NPENDINGCALLS];
354static volatile int pendingfirst = 0;
355static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000356static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000357
358int
Thomas Wouters334fb892000-07-25 12:56:38 +0000359Py_AddPendingCall(int (*func)(void *), void *arg)
Guido van Rossuma9672091994-09-14 13:31:22 +0000360{
Michael W. Hudson30ea2f22004-07-07 17:44:12 +0000361 static volatile int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000362 int i, j;
363 /* XXX Begin critical section */
364 /* XXX If you want this to be safe against nested
365 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000366 if (busy)
367 return -1;
368 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000369 i = pendinglast;
370 j = (i + 1) % NPENDINGCALLS;
Guido van Rossum04e70322002-07-17 16:57:13 +0000371 if (j == pendingfirst) {
372 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000373 return -1; /* Queue full */
Guido van Rossum04e70322002-07-17 16:57:13 +0000374 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000375 pendingcalls[i].func = func;
376 pendingcalls[i].arg = arg;
377 pendinglast = j;
Skip Montanarod581d772002-09-03 20:10:45 +0000378
379 _Py_Ticker = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000380 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000381 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000382 /* XXX End critical section */
383 return 0;
384}
385
Guido van Rossum180d7b41994-09-29 09:45:57 +0000386int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000387Py_MakePendingCalls(void)
Guido van Rossuma9672091994-09-14 13:31:22 +0000388{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000389 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000390#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000391 if (main_thread && PyThread_get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000392 return 0;
393#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000394 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000395 return 0;
396 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000397 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000398 for (;;) {
399 int i;
Thomas Wouters334fb892000-07-25 12:56:38 +0000400 int (*func)(void *);
401 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000402 i = pendingfirst;
403 if (i == pendinglast)
404 break; /* Queue empty */
405 func = pendingcalls[i].func;
406 arg = pendingcalls[i].arg;
407 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000408 if (func(arg) < 0) {
409 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000410 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000411 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000412 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000413 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000414 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000415 return 0;
416}
417
418
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000419/* The interpreter's recursion limit */
420
Hye-Shik Changb6fa2812005-04-04 15:49:02 +0000421#ifndef Py_DEFAULT_RECURSION_LIMIT
422#define Py_DEFAULT_RECURSION_LIMIT 1000
423#endif
424static int recursion_limit = Py_DEFAULT_RECURSION_LIMIT;
425int _Py_CheckRecursionLimit = Py_DEFAULT_RECURSION_LIMIT;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000426
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000427int
428Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000429{
430 return recursion_limit;
431}
432
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000433void
434Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000435{
436 recursion_limit = new_limit;
Armin Rigo2b3eb402003-10-28 12:05:48 +0000437 _Py_CheckRecursionLimit = recursion_limit;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000438}
439
Armin Rigo2b3eb402003-10-28 12:05:48 +0000440/* the macro Py_EnterRecursiveCall() only calls _Py_CheckRecursiveCall()
441 if the recursion_depth reaches _Py_CheckRecursionLimit.
442 If USE_STACKCHECK, the macro decrements _Py_CheckRecursionLimit
443 to guarantee that _Py_CheckRecursiveCall() is regularly called.
444 Without USE_STACKCHECK, there is no need for this. */
445int
446_Py_CheckRecursiveCall(char *where)
447{
448 PyThreadState *tstate = PyThreadState_GET();
449
450#ifdef USE_STACKCHECK
451 if (PyOS_CheckStack()) {
452 --tstate->recursion_depth;
453 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
454 return -1;
455 }
456#endif
457 if (tstate->recursion_depth > recursion_limit) {
458 --tstate->recursion_depth;
459 PyErr_Format(PyExc_RuntimeError,
460 "maximum recursion depth exceeded%s",
461 where);
462 return -1;
463 }
464 _Py_CheckRecursionLimit = recursion_limit;
465 return 0;
466}
467
Guido van Rossum374a9221991-04-04 10:40:29 +0000468/* Status code for main loop (reason for stack unwind) */
Raymond Hettinger7c958652004-04-06 10:11:10 +0000469enum why_code {
470 WHY_NOT = 0x0001, /* No error */
471 WHY_EXCEPTION = 0x0002, /* Exception occurred */
472 WHY_RERAISE = 0x0004, /* Exception re-raised by 'finally' */
473 WHY_RETURN = 0x0008, /* 'return' statement */
474 WHY_BREAK = 0x0010, /* 'break' statement */
475 WHY_CONTINUE = 0x0020, /* 'continue' statement */
476 WHY_YIELD = 0x0040 /* 'yield' operator */
477};
Guido van Rossum374a9221991-04-04 10:40:29 +0000478
Raymond Hettinger7c958652004-04-06 10:11:10 +0000479static enum why_code do_raise(PyObject *, PyObject *, PyObject *);
Tim Petersd6d010b2001-06-21 02:49:55 +0000480static int unpack_iterable(PyObject *, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000481
Skip Montanarod581d772002-09-03 20:10:45 +0000482/* for manipulating the thread switch and periodic "stuff" - used to be
483 per thread, now just a pair o' globals */
Skip Montanaro99dba272002-09-03 20:19:06 +0000484int _Py_CheckInterval = 100;
485volatile int _Py_Ticker = 100;
Guido van Rossum374a9221991-04-04 10:40:29 +0000486
Guido van Rossumb209a111997-04-29 18:18:01 +0000487PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000488PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000489{
Jeremy Hylton985eba52003-02-05 23:13:00 +0000490 /* XXX raise SystemError if globals is NULL */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000491 return PyEval_EvalCodeEx(co,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000492 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000493 (PyObject **)NULL, 0,
494 (PyObject **)NULL, 0,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000495 (PyObject **)NULL, 0,
Guido van Rossum4f72a782006-10-27 23:31:49 +0000496 NULL, NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000497}
498
499
500/* Interpreter main loop */
501
Martin v. Löwis8d97e332004-06-27 15:43:12 +0000502PyObject *
Phillip J. Eby0d6615f2005-08-02 00:46:46 +0000503PyEval_EvalFrame(PyFrameObject *f) {
504 /* This is for backward compatibility with extension modules that
505 used this API; core interpreter code should call PyEval_EvalFrameEx() */
506 return PyEval_EvalFrameEx(f, 0);
507}
508
509PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000510PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
Guido van Rossum374a9221991-04-04 10:40:29 +0000511{
Guido van Rossum950361c1997-01-24 13:49:28 +0000512#ifdef DXPAIRS
513 int lastopcode = 0;
514#endif
Armin Rigo8817fcd2004-06-17 10:22:40 +0000515 register PyObject **stack_pointer; /* Next free slot in value stack */
Guido van Rossum374a9221991-04-04 10:40:29 +0000516 register unsigned char *next_instr;
Armin Rigo8817fcd2004-06-17 10:22:40 +0000517 register int opcode; /* Current opcode */
518 register int oparg; /* Current opcode argument, if any */
Raymond Hettinger7c958652004-04-06 10:11:10 +0000519 register enum why_code why; /* Reason for block stack unwind */
Guido van Rossum374a9221991-04-04 10:40:29 +0000520 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000521 register PyObject *x; /* Result object -- NULL if error */
522 register PyObject *v; /* Temporary objects popped off stack */
523 register PyObject *w;
524 register PyObject *u;
525 register PyObject *t;
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000526 register PyObject **fastlocals, **freevars;
Guido van Rossum014518f1998-11-23 21:09:51 +0000527 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000528 PyThreadState *tstate = PyThreadState_GET();
Tim Peters5ca576e2001-06-18 22:08:13 +0000529 PyCodeObject *co;
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000530
Tim Peters8a5c3c72004-04-05 19:36:21 +0000531 /* when tracing we set things up so that
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000532
533 not (instr_lb <= current_bytecode_offset < instr_ub)
534
Tim Peters8a5c3c72004-04-05 19:36:21 +0000535 is true when the line being executed has changed. The
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000536 initial values are such as to make this false the first
537 time it is tested. */
Armin Rigobf57a142004-03-22 19:24:58 +0000538 int instr_ub = -1, instr_lb = 0, instr_prev = -1;
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000539
Guido van Rossumd076c731998-10-07 19:42:25 +0000540 unsigned char *first_instr;
Skip Montanaro04d80f82002-08-04 21:03:35 +0000541 PyObject *names;
542 PyObject *consts;
Neal Norwitz5f5153e2005-10-21 04:28:38 +0000543#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000544 /* Make it easier to find out where we are with a debugger */
Tim Peters5ca576e2001-06-18 22:08:13 +0000545 char *filename;
Guido van Rossum99bec951992-09-03 20:29:45 +0000546#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000547
Neal Norwitza81d2202002-07-14 00:27:26 +0000548/* Tuple access macros */
549
550#ifndef Py_DEBUG
551#define GETITEM(v, i) PyTuple_GET_ITEM((PyTupleObject *)(v), (i))
552#else
553#define GETITEM(v, i) PyTuple_GetItem((v), (i))
554#endif
555
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000556#ifdef WITH_TSC
557/* Use Pentium timestamp counter to mark certain events:
558 inst0 -- beginning of switch statement for opcode dispatch
559 inst1 -- end of switch statement (may be skipped)
560 loop0 -- the top of the mainloop
Thomas Wouters477c8d52006-05-27 19:21:47 +0000561 loop1 -- place where control returns again to top of mainloop
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000562 (may be skipped)
563 intr1 -- beginning of long interruption
564 intr2 -- end of long interruption
565
566 Many opcodes call out to helper C functions. In some cases, the
567 time in those functions should be counted towards the time for the
568 opcode, but not in all cases. For example, a CALL_FUNCTION opcode
569 calls another Python function; there's no point in charge all the
570 bytecode executed by the called function to the caller.
571
572 It's hard to make a useful judgement statically. In the presence
573 of operator overloading, it's impossible to tell if a call will
574 execute new Python code or not.
575
576 It's a case-by-case judgement. I'll use intr1 for the following
577 cases:
578
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000579 IMPORT_STAR
580 IMPORT_FROM
581 CALL_FUNCTION (and friends)
582
583 */
584 uint64 inst0, inst1, loop0, loop1, intr0 = 0, intr1 = 0;
585 int ticked = 0;
586
Michael W. Hudson75eabd22005-01-18 15:56:11 +0000587 READ_TIMESTAMP(inst0);
588 READ_TIMESTAMP(inst1);
589 READ_TIMESTAMP(loop0);
590 READ_TIMESTAMP(loop1);
Michael W. Hudson800ba232004-08-12 18:19:17 +0000591
592 /* shut up the compiler */
593 opcode = 0;
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000594#endif
595
Guido van Rossum374a9221991-04-04 10:40:29 +0000596/* Code access macros */
597
Martin v. Löwis18e16552006-02-15 17:27:45 +0000598#define INSTR_OFFSET() ((int)(next_instr - first_instr))
Guido van Rossum374a9221991-04-04 10:40:29 +0000599#define NEXTOP() (*next_instr++)
Raymond Hettinger5bed4562004-04-10 23:34:17 +0000600#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Raymond Hettinger52a21b82004-08-06 18:43:09 +0000601#define PEEKARG() ((next_instr[2]<<8) + next_instr[1])
Guido van Rossumd076c731998-10-07 19:42:25 +0000602#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000603#define JUMPBY(x) (next_instr += (x))
604
Raymond Hettingerf606f872003-03-16 03:11:04 +0000605/* OpCode prediction macros
606 Some opcodes tend to come in pairs thus making it possible to predict
607 the second code when the first is run. For example, COMPARE_OP is often
608 followed by JUMP_IF_FALSE or JUMP_IF_TRUE. And, those opcodes are often
609 followed by a POP_TOP.
610
611 Verifying the prediction costs a single high-speed test of register
Raymond Hettingerac2072922003-03-16 15:41:11 +0000612 variable against a constant. If the pairing was good, then the
Raymond Hettingerf606f872003-03-16 03:11:04 +0000613 processor has a high likelihood of making its own successful branch
614 prediction which results in a nearly zero overhead transition to the
615 next opcode.
616
617 A successful prediction saves a trip through the eval-loop including
618 its two unpredictable branches, the HASARG test and the switch-case.
Raymond Hettingera7216982004-02-08 19:59:27 +0000619
Tim Peters8a5c3c72004-04-05 19:36:21 +0000620 If collecting opcode statistics, turn off prediction so that
621 statistics are accurately maintained (the predictions bypass
Raymond Hettingera7216982004-02-08 19:59:27 +0000622 the opcode frequency counter updates).
Raymond Hettingerf606f872003-03-16 03:11:04 +0000623*/
624
Raymond Hettingera7216982004-02-08 19:59:27 +0000625#ifdef DYNAMIC_EXECUTION_PROFILE
626#define PREDICT(op) if (0) goto PRED_##op
627#else
Raymond Hettingerac2072922003-03-16 15:41:11 +0000628#define PREDICT(op) if (*next_instr == op) goto PRED_##op
Raymond Hettingera7216982004-02-08 19:59:27 +0000629#endif
630
Raymond Hettingerf606f872003-03-16 03:11:04 +0000631#define PREDICTED(op) PRED_##op: next_instr++
Raymond Hettinger52a21b82004-08-06 18:43:09 +0000632#define PREDICTED_WITH_ARG(op) PRED_##op: oparg = PEEKARG(); next_instr += 3
Raymond Hettingerf606f872003-03-16 03:11:04 +0000633
Guido van Rossum374a9221991-04-04 10:40:29 +0000634/* Stack manipulation macros */
635
Martin v. Löwis18e16552006-02-15 17:27:45 +0000636/* The stack can grow at most MAXINT deep, as co_nlocals and
637 co_stacksize are ints. */
638#define STACK_LEVEL() ((int)(stack_pointer - f->f_valuestack))
Guido van Rossum374a9221991-04-04 10:40:29 +0000639#define EMPTY() (STACK_LEVEL() == 0)
640#define TOP() (stack_pointer[-1])
Raymond Hettinger663004b2003-01-09 15:24:30 +0000641#define SECOND() (stack_pointer[-2])
642#define THIRD() (stack_pointer[-3])
643#define FOURTH() (stack_pointer[-4])
Raymond Hettinger663004b2003-01-09 15:24:30 +0000644#define SET_TOP(v) (stack_pointer[-1] = (v))
645#define SET_SECOND(v) (stack_pointer[-2] = (v))
646#define SET_THIRD(v) (stack_pointer[-3] = (v))
647#define SET_FOURTH(v) (stack_pointer[-4] = (v))
Raymond Hettinger663004b2003-01-09 15:24:30 +0000648#define BASIC_STACKADJ(n) (stack_pointer += n)
Guido van Rossum374a9221991-04-04 10:40:29 +0000649#define BASIC_PUSH(v) (*stack_pointer++ = (v))
650#define BASIC_POP() (*--stack_pointer)
651
Guido van Rossum96a42c81992-01-12 02:29:51 +0000652#ifdef LLTRACE
Jeremy Hylton14368152001-10-17 13:29:30 +0000653#define PUSH(v) { (void)(BASIC_PUSH(v), \
654 lltrace && prtrace(TOP(), "push")); \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000655 assert(STACK_LEVEL() <= co->co_stacksize); }
Fred Drakede26cfc2001-10-13 06:11:28 +0000656#define POP() ((void)(lltrace && prtrace(TOP(), "pop")), BASIC_POP())
Raymond Hettinger663004b2003-01-09 15:24:30 +0000657#define STACKADJ(n) { (void)(BASIC_STACKADJ(n), \
658 lltrace && prtrace(TOP(), "stackadj")); \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000659 assert(STACK_LEVEL() <= co->co_stacksize); }
Guido van Rossumc2e20742006-02-27 22:32:47 +0000660#define EXT_POP(STACK_POINTER) (lltrace && prtrace(*(STACK_POINTER), "ext_pop"), *--(STACK_POINTER))
Guido van Rossum374a9221991-04-04 10:40:29 +0000661#else
662#define PUSH(v) BASIC_PUSH(v)
663#define POP() BASIC_POP()
Raymond Hettinger663004b2003-01-09 15:24:30 +0000664#define STACKADJ(n) BASIC_STACKADJ(n)
Guido van Rossumc2e20742006-02-27 22:32:47 +0000665#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
Guido van Rossum374a9221991-04-04 10:40:29 +0000666#endif
667
Guido van Rossum681d79a1995-07-18 14:51:37 +0000668/* Local variable macros */
669
670#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumcfbf1a32002-03-28 20:17:52 +0000671
672/* The SETLOCAL() macro must not DECREF the local variable in-place and
673 then store the new value; it must copy the old value to a temporary
674 value, then store the new value, and then DECREF the temporary value.
675 This is because it is possible that during the DECREF the frame is
676 accessed by other code (e.g. a __del__ method or gc.collect()) and the
677 variable would be pointing to already-freed memory. */
678#define SETLOCAL(i, value) do { PyObject *tmp = GETLOCAL(i); \
679 GETLOCAL(i) = value; \
680 Py_XDECREF(tmp); } while (0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000681
Guido van Rossuma027efa1997-05-05 20:56:21 +0000682/* Start of code */
683
Tim Peters5ca576e2001-06-18 22:08:13 +0000684 if (f == NULL)
685 return NULL;
686
Armin Rigo1d313ab2003-10-25 14:33:09 +0000687 /* push frame */
Armin Rigo2b3eb402003-10-28 12:05:48 +0000688 if (Py_EnterRecursiveCall(""))
Armin Rigo1d313ab2003-10-25 14:33:09 +0000689 return NULL;
Guido van Rossum8861b741996-07-30 16:49:37 +0000690
Tim Peters5ca576e2001-06-18 22:08:13 +0000691 tstate->frame = f;
Tim Peters5ca576e2001-06-18 22:08:13 +0000692
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000693 if (tstate->use_tracing) {
694 if (tstate->c_tracefunc != NULL) {
695 /* tstate->c_tracefunc, if defined, is a
696 function that will be called on *every* entry
697 to a code block. Its return value, if not
698 None, is a function that will be called at
699 the start of each executed line of code.
700 (Actually, the function must return itself
701 in order to continue tracing.) The trace
702 functions are called with three arguments:
703 a pointer to the current frame, a string
704 indicating why the function is called, and
705 an argument which depends on the situation.
706 The global trace function is also called
707 whenever an exception is detected. */
708 if (call_trace(tstate->c_tracefunc, tstate->c_traceobj,
709 f, PyTrace_CALL, Py_None)) {
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000710 /* Trace function raised an error */
Armin Rigo2b3eb402003-10-28 12:05:48 +0000711 goto exit_eval_frame;
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000712 }
713 }
714 if (tstate->c_profilefunc != NULL) {
715 /* Similar for c_profilefunc, except it needn't
716 return itself and isn't called for "line" events */
717 if (call_trace(tstate->c_profilefunc,
718 tstate->c_profileobj,
719 f, PyTrace_CALL, Py_None)) {
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000720 /* Profile function raised an error */
Armin Rigo2b3eb402003-10-28 12:05:48 +0000721 goto exit_eval_frame;
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000722 }
723 }
724 }
725
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000726 co = f->f_code;
727 names = co->co_names;
728 consts = co->co_consts;
729 fastlocals = f->f_localsplus;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000730 freevars = f->f_localsplus + co->co_nlocals;
Brett Cannonc9371d42005-06-25 08:23:41 +0000731 first_instr = (unsigned char*) PyString_AS_STRING(co->co_code);
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000732 /* An explanation is in order for the next line.
733
734 f->f_lasti now refers to the index of the last instruction
735 executed. You might think this was obvious from the name, but
736 this wasn't always true before 2.3! PyFrame_New now sets
737 f->f_lasti to -1 (i.e. the index *before* the first instruction)
738 and YIELD_VALUE doesn't fiddle with f_lasti any more. So this
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000739 does work. Promise.
740
741 When the PREDICT() macros are enabled, some opcode pairs follow in
742 direct succession without updating f->f_lasti. A successful
743 prediction effectively links the two codes together as if they
744 were a single new opcode; accordingly,f->f_lasti will point to
745 the first code in the pair (for instance, GET_ITER followed by
746 FOR_ITER is effectively a single opcode and f->f_lasti will point
747 at to the beginning of the combined pair.)
748 */
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000749 next_instr = first_instr + f->f_lasti + 1;
750 stack_pointer = f->f_stacktop;
751 assert(stack_pointer != NULL);
752 f->f_stacktop = NULL; /* remains NULL unless yield suspends frame */
753
Tim Peters5ca576e2001-06-18 22:08:13 +0000754#ifdef LLTRACE
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000755 lltrace = PyDict_GetItemString(f->f_globals, "__lltrace__") != NULL;
Tim Peters5ca576e2001-06-18 22:08:13 +0000756#endif
Neal Norwitz5f5153e2005-10-21 04:28:38 +0000757#if defined(Py_DEBUG) || defined(LLTRACE)
Tim Peters5ca576e2001-06-18 22:08:13 +0000758 filename = PyString_AsString(co->co_filename);
759#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000760
Guido van Rossum374a9221991-04-04 10:40:29 +0000761 why = WHY_NOT;
762 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000763 x = Py_None; /* Not a reference, just anything non-NULL */
Fred Drake48fba732000-10-11 13:54:07 +0000764 w = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +0000765
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000766 if (throwflag) { /* support for generator.throw() */
Phillip J. Eby0d6615f2005-08-02 00:46:46 +0000767 why = WHY_EXCEPTION;
768 goto on_error;
769 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000770
Guido van Rossum374a9221991-04-04 10:40:29 +0000771 for (;;) {
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000772#ifdef WITH_TSC
773 if (inst1 == 0) {
774 /* Almost surely, the opcode executed a break
775 or a continue, preventing inst1 from being set
776 on the way out of the loop.
777 */
Michael W. Hudson75eabd22005-01-18 15:56:11 +0000778 READ_TIMESTAMP(inst1);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000779 loop1 = inst1;
780 }
781 dump_tsc(opcode, ticked, inst0, inst1, loop0, loop1,
782 intr0, intr1);
783 ticked = 0;
784 inst1 = 0;
785 intr0 = 0;
786 intr1 = 0;
Michael W. Hudson75eabd22005-01-18 15:56:11 +0000787 READ_TIMESTAMP(loop0);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000788#endif
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000789 assert(stack_pointer >= f->f_valuestack); /* else underflow */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000790 assert(STACK_LEVEL() <= co->co_stacksize); /* else overflow */
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000791
Guido van Rossuma027efa1997-05-05 20:56:21 +0000792 /* Do periodic things. Doing this every time through
793 the loop would add too much overhead, so we do it
794 only every Nth instruction. We also do it if
795 ``things_to_do'' is set, i.e. when an asynchronous
796 event needs attention (e.g. a signal handler or
797 async I/O handler); see Py_AddPendingCall() and
798 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +0000799
Skip Montanarod581d772002-09-03 20:10:45 +0000800 if (--_Py_Ticker < 0) {
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000801 if (*next_instr == SETUP_FINALLY) {
802 /* Make the last opcode before
803 a try: finally: block uninterruptable. */
804 goto fast_next_opcode;
805 }
Skip Montanarod581d772002-09-03 20:10:45 +0000806 _Py_Ticker = _Py_CheckInterval;
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000807 tstate->tick_counter++;
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000808#ifdef WITH_TSC
809 ticked = 1;
810#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000811 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000812 if (Py_MakePendingCalls() < 0) {
813 why = WHY_EXCEPTION;
814 goto on_error;
815 }
Kurt B. Kaiser4c79a832004-11-23 18:06:08 +0000816 if (things_to_do)
817 /* MakePendingCalls() didn't succeed.
818 Force early re-execution of this
819 "periodic" code, possibly after
820 a thread switch */
821 _Py_Ticker = 0;
Guido van Rossum8861b741996-07-30 16:49:37 +0000822 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000823#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000824 if (interpreter_lock) {
825 /* Give another thread a chance */
826
Guido van Rossum25ce5661997-08-02 03:10:38 +0000827 if (PyThreadState_Swap(NULL) != tstate)
828 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000829 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000830
831 /* Other threads may run now */
832
Guido van Rossum65d5b571998-12-21 19:32:43 +0000833 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000834 if (PyThreadState_Swap(tstate) != NULL)
835 Py_FatalError("ceval: orphan tstate");
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000836
837 /* Check for thread interrupts */
838
839 if (tstate->async_exc != NULL) {
840 x = tstate->async_exc;
841 tstate->async_exc = NULL;
842 PyErr_SetNone(x);
843 Py_DECREF(x);
844 why = WHY_EXCEPTION;
845 goto on_error;
846 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000847 }
848#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000849 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000850
Neil Schemenauer63543862002-02-17 19:10:14 +0000851 fast_next_opcode:
Guido van Rossum99bec951992-09-03 20:29:45 +0000852 f->f_lasti = INSTR_OFFSET();
Guido van Rossumac7be682001-01-17 15:42:30 +0000853
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000854 /* line-by-line tracing support */
855
856 if (tstate->c_tracefunc != NULL && !tstate->tracing) {
857 /* see maybe_call_line_trace
858 for expository comments */
859 f->f_stacktop = stack_pointer;
Tim Peters8a5c3c72004-04-05 19:36:21 +0000860
Michael W. Hudson58ee2af2003-04-29 16:18:47 +0000861 err = maybe_call_line_trace(tstate->c_tracefunc,
862 tstate->c_traceobj,
Armin Rigobf57a142004-03-22 19:24:58 +0000863 f, &instr_lb, &instr_ub,
864 &instr_prev);
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000865 /* Reload possibly changed frame fields */
866 JUMPTO(f->f_lasti);
Michael W. Hudson58ee2af2003-04-29 16:18:47 +0000867 if (f->f_stacktop != NULL) {
868 stack_pointer = f->f_stacktop;
869 f->f_stacktop = NULL;
870 }
871 if (err) {
872 /* trace function raised an exception */
873 goto on_error;
874 }
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000875 }
876
877 /* Extract opcode and argument */
878
Guido van Rossum374a9221991-04-04 10:40:29 +0000879 opcode = NEXTOP();
Armin Rigo8817fcd2004-06-17 10:22:40 +0000880 oparg = 0; /* allows oparg to be stored in a register because
881 it doesn't have to be remembered across a full loop */
Raymond Hettinger5bed4562004-04-10 23:34:17 +0000882 if (HAS_ARG(opcode))
883 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000884 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000885#ifdef DYNAMIC_EXECUTION_PROFILE
886#ifdef DXPAIRS
887 dxpairs[lastopcode][opcode]++;
888 lastopcode = opcode;
889#endif
890 dxp[opcode]++;
891#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000892
Guido van Rossum96a42c81992-01-12 02:29:51 +0000893#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000894 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +0000895
Guido van Rossum96a42c81992-01-12 02:29:51 +0000896 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000897 if (HAS_ARG(opcode)) {
898 printf("%d: %d, %d\n",
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000899 f->f_lasti, opcode, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +0000900 }
901 else {
902 printf("%d: %d\n",
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000903 f->f_lasti, opcode);
Guido van Rossum374a9221991-04-04 10:40:29 +0000904 }
905 }
906#endif
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000907
Guido van Rossum374a9221991-04-04 10:40:29 +0000908 /* Main switch on opcode */
Michael W. Hudson75eabd22005-01-18 15:56:11 +0000909 READ_TIMESTAMP(inst0);
Jeremy Hylton52820442001-01-03 23:52:36 +0000910
Guido van Rossum374a9221991-04-04 10:40:29 +0000911 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000912
Guido van Rossum374a9221991-04-04 10:40:29 +0000913 /* BEWARE!
914 It is essential that any operation that fails sets either
915 x to NULL, err to nonzero, or why to anything but WHY_NOT,
916 and that no operation that succeeds does this! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000917
Guido van Rossum374a9221991-04-04 10:40:29 +0000918 /* case STOP_CODE: this is an error! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000919
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000920 case NOP:
921 goto fast_next_opcode;
922
Neil Schemenauer63543862002-02-17 19:10:14 +0000923 case LOAD_FAST:
924 x = GETLOCAL(oparg);
925 if (x != NULL) {
926 Py_INCREF(x);
927 PUSH(x);
928 goto fast_next_opcode;
929 }
930 format_exc_check_arg(PyExc_UnboundLocalError,
931 UNBOUNDLOCAL_ERROR_MSG,
932 PyTuple_GetItem(co->co_varnames, oparg));
933 break;
934
935 case LOAD_CONST:
Skip Montanaro04d80f82002-08-04 21:03:35 +0000936 x = GETITEM(consts, oparg);
Neil Schemenauer63543862002-02-17 19:10:14 +0000937 Py_INCREF(x);
938 PUSH(x);
939 goto fast_next_opcode;
940
Raymond Hettinger7dc52212003-03-16 20:14:44 +0000941 PREDICTED_WITH_ARG(STORE_FAST);
Neil Schemenauer63543862002-02-17 19:10:14 +0000942 case STORE_FAST:
943 v = POP();
944 SETLOCAL(oparg, v);
945 goto fast_next_opcode;
946
Raymond Hettingerf606f872003-03-16 03:11:04 +0000947 PREDICTED(POP_TOP);
Guido van Rossum374a9221991-04-04 10:40:29 +0000948 case POP_TOP:
949 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000950 Py_DECREF(v);
Neil Schemenauer63543862002-02-17 19:10:14 +0000951 goto fast_next_opcode;
Guido van Rossumac7be682001-01-17 15:42:30 +0000952
Guido van Rossum374a9221991-04-04 10:40:29 +0000953 case ROT_TWO:
Raymond Hettinger663004b2003-01-09 15:24:30 +0000954 v = TOP();
955 w = SECOND();
956 SET_TOP(w);
957 SET_SECOND(v);
Raymond Hettinger080cb322003-03-14 01:37:42 +0000958 goto fast_next_opcode;
Guido van Rossumac7be682001-01-17 15:42:30 +0000959
Guido van Rossum374a9221991-04-04 10:40:29 +0000960 case ROT_THREE:
Raymond Hettinger663004b2003-01-09 15:24:30 +0000961 v = TOP();
962 w = SECOND();
963 x = THIRD();
964 SET_TOP(w);
965 SET_SECOND(x);
966 SET_THIRD(v);
Raymond Hettinger080cb322003-03-14 01:37:42 +0000967 goto fast_next_opcode;
Guido van Rossumac7be682001-01-17 15:42:30 +0000968
Thomas Wouters434d0822000-08-24 20:11:32 +0000969 case ROT_FOUR:
Raymond Hettinger663004b2003-01-09 15:24:30 +0000970 u = TOP();
971 v = SECOND();
972 w = THIRD();
973 x = FOURTH();
974 SET_TOP(v);
975 SET_SECOND(w);
976 SET_THIRD(x);
977 SET_FOURTH(u);
Raymond Hettinger080cb322003-03-14 01:37:42 +0000978 goto fast_next_opcode;
Guido van Rossumac7be682001-01-17 15:42:30 +0000979
Guido van Rossum374a9221991-04-04 10:40:29 +0000980 case DUP_TOP:
981 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000982 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000983 PUSH(v);
Raymond Hettinger080cb322003-03-14 01:37:42 +0000984 goto fast_next_opcode;
Guido van Rossumac7be682001-01-17 15:42:30 +0000985
Thomas Wouters434d0822000-08-24 20:11:32 +0000986 case DUP_TOPX:
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +0000987 if (oparg == 2) {
Raymond Hettinger663004b2003-01-09 15:24:30 +0000988 x = TOP();
Tim Peters35ba6892000-10-11 07:04:49 +0000989 Py_INCREF(x);
Raymond Hettinger663004b2003-01-09 15:24:30 +0000990 w = SECOND();
Tim Peters35ba6892000-10-11 07:04:49 +0000991 Py_INCREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +0000992 STACKADJ(2);
993 SET_TOP(x);
994 SET_SECOND(w);
Raymond Hettingerf606f872003-03-16 03:11:04 +0000995 goto fast_next_opcode;
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +0000996 } else if (oparg == 3) {
Raymond Hettinger663004b2003-01-09 15:24:30 +0000997 x = TOP();
Tim Peters35ba6892000-10-11 07:04:49 +0000998 Py_INCREF(x);
Raymond Hettinger663004b2003-01-09 15:24:30 +0000999 w = SECOND();
Tim Peters35ba6892000-10-11 07:04:49 +00001000 Py_INCREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001001 v = THIRD();
Tim Peters35ba6892000-10-11 07:04:49 +00001002 Py_INCREF(v);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001003 STACKADJ(3);
1004 SET_TOP(x);
1005 SET_SECOND(w);
1006 SET_THIRD(v);
Raymond Hettingerf606f872003-03-16 03:11:04 +00001007 goto fast_next_opcode;
Thomas Wouters434d0822000-08-24 20:11:32 +00001008 }
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +00001009 Py_FatalError("invalid argument to DUP_TOPX"
1010 " (bytecode corruption?)");
Tim Peters35ba6892000-10-11 07:04:49 +00001011 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001012
Guido van Rossum374a9221991-04-04 10:40:29 +00001013 case UNARY_POSITIVE:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001014 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001015 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001016 Py_DECREF(v);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001017 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001018 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001019 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001020
Guido van Rossum374a9221991-04-04 10:40:29 +00001021 case UNARY_NEGATIVE:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001022 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001023 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001024 Py_DECREF(v);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001025 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001026 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001027 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001028
Guido van Rossum374a9221991-04-04 10:40:29 +00001029 case UNARY_NOT:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001030 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001031 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001032 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +00001033 if (err == 0) {
1034 Py_INCREF(Py_True);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001035 SET_TOP(Py_True);
Guido van Rossumfc490731997-05-06 15:06:49 +00001036 continue;
1037 }
1038 else if (err > 0) {
1039 Py_INCREF(Py_False);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001040 SET_TOP(Py_False);
Guido van Rossumfc490731997-05-06 15:06:49 +00001041 err = 0;
1042 continue;
1043 }
Raymond Hettinger8bb90a52003-01-14 12:43:10 +00001044 STACKADJ(-1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001045 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001046
Guido van Rossum7928cd71991-10-24 14:59:31 +00001047 case UNARY_INVERT:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001048 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001049 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001050 Py_DECREF(v);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001051 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001052 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001053 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001054
Guido van Rossum50564e81996-01-12 01:13:16 +00001055 case BINARY_POWER:
1056 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001057 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001058 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +00001059 Py_DECREF(v);
1060 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001061 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001062 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +00001063 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001064
Guido van Rossum374a9221991-04-04 10:40:29 +00001065 case BINARY_MULTIPLY:
1066 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001067 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001068 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001069 Py_DECREF(v);
1070 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001071 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001072 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001073 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001074
Tim Peters3caca232001-12-06 06:23:26 +00001075 case BINARY_TRUE_DIVIDE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001076 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001077 v = TOP();
Tim Peters3caca232001-12-06 06:23:26 +00001078 x = PyNumber_TrueDivide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001079 Py_DECREF(v);
1080 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001081 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001082 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001083 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001084
Guido van Rossum4668b002001-08-08 05:00:18 +00001085 case BINARY_FLOOR_DIVIDE:
1086 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001087 v = TOP();
Guido van Rossum4668b002001-08-08 05:00:18 +00001088 x = PyNumber_FloorDivide(v, w);
1089 Py_DECREF(v);
1090 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001091 SET_TOP(x);
Guido van Rossum4668b002001-08-08 05:00:18 +00001092 if (x != NULL) continue;
1093 break;
1094
Guido van Rossum374a9221991-04-04 10:40:29 +00001095 case BINARY_MODULO:
1096 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001097 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001098 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001099 Py_DECREF(v);
1100 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001101 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001102 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001103 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001104
Guido van Rossum374a9221991-04-04 10:40:29 +00001105 case BINARY_ADD:
1106 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001107 v = TOP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001108 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001109 /* INLINE: int + int */
1110 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001111 a = PyInt_AS_LONG(v);
1112 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001113 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001114 if ((i^a) < 0 && (i^b) < 0)
1115 goto slow_add;
1116 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001117 }
Raymond Hettinger52a21b82004-08-06 18:43:09 +00001118 else if (PyString_CheckExact(v) &&
1119 PyString_CheckExact(w)) {
1120 x = string_concatenate(v, w, f, next_instr);
1121 /* string_concatenate consumed the ref to v */
1122 goto skip_decref_vx;
1123 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001124 else {
1125 slow_add:
Guido van Rossumc12da691997-07-17 23:12:42 +00001126 x = PyNumber_Add(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001127 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001128 Py_DECREF(v);
Raymond Hettinger52a21b82004-08-06 18:43:09 +00001129 skip_decref_vx:
Guido van Rossumb209a111997-04-29 18:18:01 +00001130 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001131 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001132 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001133 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001134
Guido van Rossum374a9221991-04-04 10:40:29 +00001135 case BINARY_SUBTRACT:
1136 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001137 v = TOP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001138 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001139 /* INLINE: int - int */
1140 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001141 a = PyInt_AS_LONG(v);
1142 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001143 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001144 if ((i^a) < 0 && (i^~b) < 0)
1145 goto slow_sub;
1146 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001147 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001148 else {
1149 slow_sub:
Guido van Rossumc12da691997-07-17 23:12:42 +00001150 x = PyNumber_Subtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001151 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001152 Py_DECREF(v);
1153 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001154 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001155 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001156 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001157
Guido van Rossum374a9221991-04-04 10:40:29 +00001158 case BINARY_SUBSCR:
1159 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001160 v = TOP();
Tim Petersb1c46982001-10-05 20:41:38 +00001161 if (PyList_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001162 /* INLINE: list[int] */
Neal Norwitz814e9382006-03-02 07:54:28 +00001163 Py_ssize_t i = PyInt_AsSsize_t(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001164 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +00001165 i += PyList_GET_SIZE(v);
Raymond Hettinger467a6982004-04-07 11:39:21 +00001166 if (i >= 0 && i < PyList_GET_SIZE(v)) {
Guido van Rossumfa00e951998-07-08 15:02:37 +00001167 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001168 Py_INCREF(x);
1169 }
Raymond Hettinger467a6982004-04-07 11:39:21 +00001170 else
1171 goto slow_get;
Guido van Rossumc12da691997-07-17 23:12:42 +00001172 }
1173 else
Raymond Hettinger467a6982004-04-07 11:39:21 +00001174 slow_get:
Guido van Rossumc12da691997-07-17 23:12:42 +00001175 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001176 Py_DECREF(v);
1177 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001178 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001179 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001180 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001181
Guido van Rossum7928cd71991-10-24 14:59:31 +00001182 case BINARY_LSHIFT:
1183 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001184 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001185 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001186 Py_DECREF(v);
1187 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001188 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001189 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001190 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001191
Guido van Rossum7928cd71991-10-24 14:59:31 +00001192 case BINARY_RSHIFT:
1193 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001194 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001195 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001196 Py_DECREF(v);
1197 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001198 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001199 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001200 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001201
Guido van Rossum7928cd71991-10-24 14:59:31 +00001202 case BINARY_AND:
1203 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001204 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001205 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001206 Py_DECREF(v);
1207 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001208 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001209 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001210 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001211
Guido van Rossum7928cd71991-10-24 14:59:31 +00001212 case BINARY_XOR:
1213 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001214 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001215 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001216 Py_DECREF(v);
1217 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001218 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001219 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001220 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001221
Guido van Rossum7928cd71991-10-24 14:59:31 +00001222 case BINARY_OR:
1223 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001224 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001225 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001226 Py_DECREF(v);
1227 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001228 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001229 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001230 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001231
Raymond Hettingerdd80f762004-03-07 07:31:06 +00001232 case LIST_APPEND:
1233 w = POP();
1234 v = POP();
1235 err = PyList_Append(v, w);
1236 Py_DECREF(v);
1237 Py_DECREF(w);
Raymond Hettingerfba1cfc2004-03-12 16:33:17 +00001238 if (err == 0) {
1239 PREDICT(JUMP_ABSOLUTE);
1240 continue;
1241 }
Raymond Hettingerdd80f762004-03-07 07:31:06 +00001242 break;
1243
Thomas Wouters434d0822000-08-24 20:11:32 +00001244 case INPLACE_POWER:
1245 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001246 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001247 x = PyNumber_InPlacePower(v, w, Py_None);
1248 Py_DECREF(v);
1249 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001250 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001251 if (x != NULL) continue;
1252 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001253
Thomas Wouters434d0822000-08-24 20:11:32 +00001254 case INPLACE_MULTIPLY:
1255 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001256 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001257 x = PyNumber_InPlaceMultiply(v, w);
1258 Py_DECREF(v);
1259 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001260 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001261 if (x != NULL) continue;
1262 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001263
Tim Peters54b11912001-12-25 18:49:11 +00001264 case INPLACE_TRUE_DIVIDE:
Thomas Wouters434d0822000-08-24 20:11:32 +00001265 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001266 v = TOP();
Tim Peters54b11912001-12-25 18:49:11 +00001267 x = PyNumber_InPlaceTrueDivide(v, w);
Thomas Wouters434d0822000-08-24 20:11:32 +00001268 Py_DECREF(v);
1269 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001270 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001271 if (x != NULL) continue;
1272 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001273
Guido van Rossum4668b002001-08-08 05:00:18 +00001274 case INPLACE_FLOOR_DIVIDE:
1275 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001276 v = TOP();
Guido van Rossum4668b002001-08-08 05:00:18 +00001277 x = PyNumber_InPlaceFloorDivide(v, w);
1278 Py_DECREF(v);
1279 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001280 SET_TOP(x);
Guido van Rossum4668b002001-08-08 05:00:18 +00001281 if (x != NULL) continue;
1282 break;
1283
Thomas Wouters434d0822000-08-24 20:11:32 +00001284 case INPLACE_MODULO:
1285 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001286 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001287 x = PyNumber_InPlaceRemainder(v, w);
1288 Py_DECREF(v);
1289 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001290 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001291 if (x != NULL) continue;
1292 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001293
Thomas Wouters434d0822000-08-24 20:11:32 +00001294 case INPLACE_ADD:
1295 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001296 v = TOP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001297 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001298 /* INLINE: int + int */
1299 register long a, b, i;
1300 a = PyInt_AS_LONG(v);
1301 b = PyInt_AS_LONG(w);
1302 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001303 if ((i^a) < 0 && (i^b) < 0)
1304 goto slow_iadd;
1305 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001306 }
Raymond Hettinger52a21b82004-08-06 18:43:09 +00001307 else if (PyString_CheckExact(v) &&
1308 PyString_CheckExact(w)) {
1309 x = string_concatenate(v, w, f, next_instr);
1310 /* string_concatenate consumed the ref to v */
1311 goto skip_decref_v;
1312 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001313 else {
1314 slow_iadd:
Thomas Wouters434d0822000-08-24 20:11:32 +00001315 x = PyNumber_InPlaceAdd(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001316 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001317 Py_DECREF(v);
Raymond Hettinger52a21b82004-08-06 18:43:09 +00001318 skip_decref_v:
Thomas Wouters434d0822000-08-24 20:11:32 +00001319 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001320 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001321 if (x != NULL) continue;
1322 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001323
Thomas Wouters434d0822000-08-24 20:11:32 +00001324 case INPLACE_SUBTRACT:
1325 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001326 v = TOP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001327 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001328 /* INLINE: int - int */
1329 register long a, b, i;
1330 a = PyInt_AS_LONG(v);
1331 b = PyInt_AS_LONG(w);
1332 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001333 if ((i^a) < 0 && (i^~b) < 0)
1334 goto slow_isub;
1335 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001336 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001337 else {
1338 slow_isub:
Thomas Wouters434d0822000-08-24 20:11:32 +00001339 x = PyNumber_InPlaceSubtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001340 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001341 Py_DECREF(v);
1342 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001343 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001344 if (x != NULL) continue;
1345 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001346
Thomas Wouters434d0822000-08-24 20:11:32 +00001347 case INPLACE_LSHIFT:
1348 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001349 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001350 x = PyNumber_InPlaceLshift(v, w);
1351 Py_DECREF(v);
1352 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001353 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001354 if (x != NULL) continue;
1355 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001356
Thomas Wouters434d0822000-08-24 20:11:32 +00001357 case INPLACE_RSHIFT:
1358 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001359 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001360 x = PyNumber_InPlaceRshift(v, w);
1361 Py_DECREF(v);
1362 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001363 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001364 if (x != NULL) continue;
1365 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001366
Thomas Wouters434d0822000-08-24 20:11:32 +00001367 case INPLACE_AND:
1368 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001369 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001370 x = PyNumber_InPlaceAnd(v, w);
1371 Py_DECREF(v);
1372 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001373 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001374 if (x != NULL) continue;
1375 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001376
Thomas Wouters434d0822000-08-24 20:11:32 +00001377 case INPLACE_XOR:
1378 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001379 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001380 x = PyNumber_InPlaceXor(v, w);
1381 Py_DECREF(v);
1382 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001383 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001384 if (x != NULL) continue;
1385 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001386
Thomas Wouters434d0822000-08-24 20:11:32 +00001387 case INPLACE_OR:
1388 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001389 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001390 x = PyNumber_InPlaceOr(v, w);
1391 Py_DECREF(v);
1392 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001393 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001394 if (x != NULL) continue;
1395 break;
1396
Guido van Rossum374a9221991-04-04 10:40:29 +00001397 case SLICE+0:
1398 case SLICE+1:
1399 case SLICE+2:
1400 case SLICE+3:
1401 if ((opcode-SLICE) & 2)
1402 w = POP();
1403 else
1404 w = NULL;
1405 if ((opcode-SLICE) & 1)
1406 v = POP();
1407 else
1408 v = NULL;
Raymond Hettinger663004b2003-01-09 15:24:30 +00001409 u = TOP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001410 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001411 Py_DECREF(u);
1412 Py_XDECREF(v);
1413 Py_XDECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001414 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001415 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001416 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001417
Guido van Rossum374a9221991-04-04 10:40:29 +00001418 case STORE_SLICE+0:
1419 case STORE_SLICE+1:
1420 case STORE_SLICE+2:
1421 case STORE_SLICE+3:
1422 if ((opcode-STORE_SLICE) & 2)
1423 w = POP();
1424 else
1425 w = NULL;
1426 if ((opcode-STORE_SLICE) & 1)
1427 v = POP();
1428 else
1429 v = NULL;
1430 u = POP();
1431 t = POP();
1432 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001433 Py_DECREF(t);
1434 Py_DECREF(u);
1435 Py_XDECREF(v);
1436 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001437 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001438 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001439
Guido van Rossum374a9221991-04-04 10:40:29 +00001440 case DELETE_SLICE+0:
1441 case DELETE_SLICE+1:
1442 case DELETE_SLICE+2:
1443 case DELETE_SLICE+3:
1444 if ((opcode-DELETE_SLICE) & 2)
1445 w = POP();
1446 else
1447 w = NULL;
1448 if ((opcode-DELETE_SLICE) & 1)
1449 v = POP();
1450 else
1451 v = NULL;
1452 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001453 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001454 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001455 Py_DECREF(u);
1456 Py_XDECREF(v);
1457 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001458 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001459 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001460
Guido van Rossum374a9221991-04-04 10:40:29 +00001461 case STORE_SUBSCR:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001462 w = TOP();
1463 v = SECOND();
1464 u = THIRD();
1465 STACKADJ(-3);
Guido van Rossum374a9221991-04-04 10:40:29 +00001466 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001467 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001468 Py_DECREF(u);
1469 Py_DECREF(v);
1470 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001471 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001472 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001473
Guido van Rossum374a9221991-04-04 10:40:29 +00001474 case DELETE_SUBSCR:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001475 w = TOP();
1476 v = SECOND();
1477 STACKADJ(-2);
Guido van Rossum374a9221991-04-04 10:40:29 +00001478 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001479 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001480 Py_DECREF(v);
1481 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001482 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001483 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001484
Guido van Rossum374a9221991-04-04 10:40:29 +00001485 case PRINT_EXPR:
1486 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001487 w = PySys_GetObject("displayhook");
1488 if (w == NULL) {
1489 PyErr_SetString(PyExc_RuntimeError,
1490 "lost sys.displayhook");
1491 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001492 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001493 }
1494 if (err == 0) {
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001495 x = PyTuple_Pack(1, v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001496 if (x == NULL)
1497 err = -1;
1498 }
1499 if (err == 0) {
1500 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001501 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001502 if (w == NULL)
1503 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001504 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001505 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001506 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001507 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001508
Thomas Wouters434d0822000-08-24 20:11:32 +00001509#ifdef CASE_TOO_BIG
1510 default: switch (opcode) {
1511#endif
Guido van Rossumf10570b1995-07-07 22:53:21 +00001512 case RAISE_VARARGS:
1513 u = v = w = NULL;
1514 switch (oparg) {
1515 case 3:
1516 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001517 /* Fallthrough */
1518 case 2:
1519 v = POP(); /* value */
1520 /* Fallthrough */
1521 case 1:
1522 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001523 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001524 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001525 break;
1526 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001527 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001528 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001529 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001530 break;
1531 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001532 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001533
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001534 case STORE_LOCALS:
1535 x = POP();
1536 v = f->f_locals;
1537 Py_XDECREF(v);
1538 f->f_locals = x;
1539 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001540
Guido van Rossum374a9221991-04-04 10:40:29 +00001541 case RETURN_VALUE:
1542 retval = POP();
1543 why = WHY_RETURN;
Raymond Hettinger1dd83092004-02-06 18:32:33 +00001544 goto fast_block_end;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001545
Tim Peters5ca576e2001-06-18 22:08:13 +00001546 case YIELD_VALUE:
1547 retval = POP();
Tim Peters8c963692001-06-23 05:26:56 +00001548 f->f_stacktop = stack_pointer;
Tim Peters5ca576e2001-06-18 22:08:13 +00001549 why = WHY_YIELD;
Raymond Hettinger1dd83092004-02-06 18:32:33 +00001550 goto fast_yield;
Tim Peters5ca576e2001-06-18 22:08:13 +00001551
Guido van Rossum374a9221991-04-04 10:40:29 +00001552 case POP_BLOCK:
1553 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001554 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001555 while (STACK_LEVEL() > b->b_level) {
1556 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001557 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001558 }
1559 }
Raymond Hettinger7eddd782004-04-07 14:38:08 +00001560 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001561
Guido van Rossum374a9221991-04-04 10:40:29 +00001562 case END_FINALLY:
1563 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001564 if (PyInt_Check(v)) {
Raymond Hettinger7c958652004-04-06 10:11:10 +00001565 why = (enum why_code) PyInt_AS_LONG(v);
Tim Peters8a5c3c72004-04-05 19:36:21 +00001566 assert(why != WHY_YIELD);
Raymond Hettingerc8aa08b2004-04-11 14:59:33 +00001567 if (why == WHY_RETURN ||
1568 why == WHY_CONTINUE)
Guido van Rossum374a9221991-04-04 10:40:29 +00001569 retval = POP();
1570 }
Brett Cannonf74225d2007-02-26 21:10:16 +00001571 else if (PyExceptionClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001572 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001573 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001574 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001575 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001576 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001577 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001578 else if (v != Py_None) {
1579 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001580 "'finally' pops bad exception");
1581 why = WHY_EXCEPTION;
1582 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001583 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001584 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001585
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001586 case LOAD_BUILD_CLASS:
1587 x = PyDict_GetItemString(f->f_builtins,
1588 "__build_class__");
1589 if (x == NULL) {
1590 PyErr_SetString(PyExc_ImportError,
1591 "__build_class__ not found");
1592 break;
1593 }
1594 Py_INCREF(x);
1595 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001596 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001597
Guido van Rossum374a9221991-04-04 10:40:29 +00001598 case STORE_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001599 w = GETITEM(names, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001600 v = POP();
Raymond Hettinger467a6982004-04-07 11:39:21 +00001601 if ((x = f->f_locals) != NULL) {
Raymond Hettinger66bd2332004-08-02 08:30:07 +00001602 if (PyDict_CheckExact(x))
Raymond Hettinger214b1c32004-07-02 06:41:07 +00001603 err = PyDict_SetItem(x, w, v);
1604 else
1605 err = PyObject_SetItem(x, w, v);
Raymond Hettinger467a6982004-04-07 11:39:21 +00001606 Py_DECREF(v);
Raymond Hettinger7eddd782004-04-07 14:38:08 +00001607 if (err == 0) continue;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001608 break;
1609 }
Raymond Hettinger467a6982004-04-07 11:39:21 +00001610 PyErr_Format(PyExc_SystemError,
1611 "no locals found when storing %s",
1612 PyObject_REPR(w));
Guido van Rossum374a9221991-04-04 10:40:29 +00001613 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001614
Guido van Rossum374a9221991-04-04 10:40:29 +00001615 case DELETE_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001616 w = GETITEM(names, oparg);
Raymond Hettinger467a6982004-04-07 11:39:21 +00001617 if ((x = f->f_locals) != NULL) {
Raymond Hettinger214b1c32004-07-02 06:41:07 +00001618 if ((err = PyObject_DelItem(x, w)) != 0)
Raymond Hettinger467a6982004-04-07 11:39:21 +00001619 format_exc_check_arg(PyExc_NameError,
1620 NAME_ERROR_MSG ,w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001621 break;
1622 }
Raymond Hettinger467a6982004-04-07 11:39:21 +00001623 PyErr_Format(PyExc_SystemError,
1624 "no locals when deleting %s",
1625 PyObject_REPR(w));
Guido van Rossum374a9221991-04-04 10:40:29 +00001626 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001627
Raymond Hettinger7dc52212003-03-16 20:14:44 +00001628 PREDICTED_WITH_ARG(UNPACK_SEQUENCE);
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001629 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001630 v = POP();
Raymond Hettingerf114a3a2004-03-08 23:25:30 +00001631 if (PyTuple_CheckExact(v) && PyTuple_GET_SIZE(v) == oparg) {
1632 PyObject **items = ((PyTupleObject *)v)->ob_item;
1633 while (oparg--) {
1634 w = items[oparg];
1635 Py_INCREF(w);
1636 PUSH(w);
Barry Warsawe42b18f1997-08-25 22:13:04 +00001637 }
Raymond Hettinger7eddd782004-04-07 14:38:08 +00001638 Py_DECREF(v);
1639 continue;
Raymond Hettingerf114a3a2004-03-08 23:25:30 +00001640 } else if (PyList_CheckExact(v) && PyList_GET_SIZE(v) == oparg) {
1641 PyObject **items = ((PyListObject *)v)->ob_item;
1642 while (oparg--) {
1643 w = items[oparg];
1644 Py_INCREF(w);
1645 PUSH(w);
Barry Warsawe42b18f1997-08-25 22:13:04 +00001646 }
Raymond Hettingerf114a3a2004-03-08 23:25:30 +00001647 } else if (unpack_iterable(v, oparg,
Tim Petersd6d010b2001-06-21 02:49:55 +00001648 stack_pointer + oparg))
1649 stack_pointer += oparg;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001650 else {
1651 if (PyErr_ExceptionMatches(PyExc_TypeError))
1652 PyErr_SetString(PyExc_TypeError,
1653 "unpack non-sequence");
Barry Warsawe42b18f1997-08-25 22:13:04 +00001654 why = WHY_EXCEPTION;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001655 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001656 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001657 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001658
Guido van Rossum374a9221991-04-04 10:40:29 +00001659 case STORE_ATTR:
Skip Montanaro496e6582002-08-06 17:47:40 +00001660 w = GETITEM(names, oparg);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001661 v = TOP();
1662 u = SECOND();
1663 STACKADJ(-2);
Guido van Rossumb209a111997-04-29 18:18:01 +00001664 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1665 Py_DECREF(v);
1666 Py_DECREF(u);
Raymond Hettinger7eddd782004-04-07 14:38:08 +00001667 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001668 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001669
Guido van Rossum374a9221991-04-04 10:40:29 +00001670 case DELETE_ATTR:
Skip Montanaro496e6582002-08-06 17:47:40 +00001671 w = GETITEM(names, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001672 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001673 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1674 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001675 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001676 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001677
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001678 case STORE_GLOBAL:
Skip Montanaro496e6582002-08-06 17:47:40 +00001679 w = GETITEM(names, oparg);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001680 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001681 err = PyDict_SetItem(f->f_globals, w, v);
1682 Py_DECREF(v);
Raymond Hettinger7eddd782004-04-07 14:38:08 +00001683 if (err == 0) continue;
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001684 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001685
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001686 case DELETE_GLOBAL:
Skip Montanaro496e6582002-08-06 17:47:40 +00001687 w = GETITEM(names, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001688 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001689 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001690 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001691 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001692
Guido van Rossum374a9221991-04-04 10:40:29 +00001693 case LOAD_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001694 w = GETITEM(names, oparg);
Raymond Hettinger214b1c32004-07-02 06:41:07 +00001695 if ((v = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001696 PyErr_Format(PyExc_SystemError,
1697 "no locals when loading %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001698 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001699 break;
1700 }
Michael W. Hudsona3711f72004-08-02 14:50:43 +00001701 if (PyDict_CheckExact(v)) {
Raymond Hettinger214b1c32004-07-02 06:41:07 +00001702 x = PyDict_GetItem(v, w);
Michael W. Hudsona3711f72004-08-02 14:50:43 +00001703 Py_XINCREF(x);
1704 }
Raymond Hettinger214b1c32004-07-02 06:41:07 +00001705 else {
1706 x = PyObject_GetItem(v, w);
1707 if (x == NULL && PyErr_Occurred()) {
1708 if (!PyErr_ExceptionMatches(PyExc_KeyError))
1709 break;
1710 PyErr_Clear();
1711 }
1712 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001713 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001714 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001715 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001716 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001717 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001718 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001719 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001720 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001721 break;
1722 }
1723 }
Michael W. Hudsona3711f72004-08-02 14:50:43 +00001724 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001725 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001726 PUSH(x);
Raymond Hettinger467a6982004-04-07 11:39:21 +00001727 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001728
Guido van Rossum374a9221991-04-04 10:40:29 +00001729 case LOAD_GLOBAL:
Skip Montanaro496e6582002-08-06 17:47:40 +00001730 w = GETITEM(names, oparg);
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001731 if (PyString_CheckExact(w)) {
Guido van Rossumd8dbf842002-08-19 21:17:53 +00001732 /* Inline the PyDict_GetItem() calls.
1733 WARNING: this is an extreme speed hack.
1734 Do not try this at home. */
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001735 long hash = ((PyStringObject *)w)->ob_shash;
1736 if (hash != -1) {
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001737 PyDictObject *d;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001738 PyDictEntry *e;
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001739 d = (PyDictObject *)(f->f_globals);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001740 e = d->ma_lookup(d, w, hash);
1741 if (e == NULL) {
1742 x = NULL;
1743 break;
1744 }
1745 x = e->me_value;
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001746 if (x != NULL) {
1747 Py_INCREF(x);
1748 PUSH(x);
1749 continue;
1750 }
1751 d = (PyDictObject *)(f->f_builtins);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001752 e = d->ma_lookup(d, w, hash);
1753 if (e == NULL) {
1754 x = NULL;
1755 break;
1756 }
1757 x = e->me_value;
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001758 if (x != NULL) {
1759 Py_INCREF(x);
1760 PUSH(x);
1761 continue;
1762 }
1763 goto load_global_error;
1764 }
1765 }
1766 /* This is the un-inlined version of the code above */
Guido van Rossumb209a111997-04-29 18:18:01 +00001767 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001768 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001769 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001770 if (x == NULL) {
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001771 load_global_error:
Paul Prescode68140d2000-08-30 20:25:01 +00001772 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001773 PyExc_NameError,
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001774 GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001775 break;
1776 }
1777 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001778 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001779 PUSH(x);
Raymond Hettinger7eddd782004-04-07 14:38:08 +00001780 continue;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001781
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001782 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001783 x = GETLOCAL(oparg);
Raymond Hettinger467a6982004-04-07 11:39:21 +00001784 if (x != NULL) {
1785 SETLOCAL(oparg, NULL);
1786 continue;
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001787 }
Raymond Hettinger467a6982004-04-07 11:39:21 +00001788 format_exc_check_arg(
1789 PyExc_UnboundLocalError,
1790 UNBOUNDLOCAL_ERROR_MSG,
1791 PyTuple_GetItem(co->co_varnames, oparg)
1792 );
1793 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001794
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001795 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001796 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001797 Py_INCREF(x);
1798 PUSH(x);
Raymond Hettinger7eddd782004-04-07 14:38:08 +00001799 if (x != NULL) continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001800 break;
1801
1802 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001803 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001804 w = PyCell_Get(x);
Raymond Hettinger467a6982004-04-07 11:39:21 +00001805 if (w != NULL) {
1806 PUSH(w);
1807 continue;
Jeremy Hylton2524d692001-02-05 17:23:16 +00001808 }
Raymond Hettinger467a6982004-04-07 11:39:21 +00001809 err = -1;
1810 /* Don't stomp existing exception */
1811 if (PyErr_Occurred())
1812 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001813 if (oparg < PyTuple_GET_SIZE(co->co_cellvars)) {
1814 v = PyTuple_GET_ITEM(co->co_cellvars,
Raymond Hettinger467a6982004-04-07 11:39:21 +00001815 oparg);
1816 format_exc_check_arg(
1817 PyExc_UnboundLocalError,
1818 UNBOUNDLOCAL_ERROR_MSG,
1819 v);
1820 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001821 v = PyTuple_GET_ITEM(
Raymond Hettinger467a6982004-04-07 11:39:21 +00001822 co->co_freevars,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001823 oparg - PyTuple_GET_SIZE(co->co_cellvars));
Raymond Hettinger467a6982004-04-07 11:39:21 +00001824 format_exc_check_arg(
1825 PyExc_NameError,
1826 UNBOUNDFREE_ERROR_MSG,
1827 v);
1828 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001829 break;
1830
1831 case STORE_DEREF:
1832 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001833 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001834 PyCell_Set(x, w);
Jeremy Hylton30c9f392001-03-13 01:58:22 +00001835 Py_DECREF(w);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001836 continue;
1837
Guido van Rossum374a9221991-04-04 10:40:29 +00001838 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001839 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001840 if (x != NULL) {
Raymond Hettinger5bed4562004-04-10 23:34:17 +00001841 for (; --oparg >= 0;) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001842 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001843 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001844 }
1845 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001846 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001847 }
1848 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001849
Guido van Rossum374a9221991-04-04 10:40:29 +00001850 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001851 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001852 if (x != NULL) {
Raymond Hettinger5bed4562004-04-10 23:34:17 +00001853 for (; --oparg >= 0;) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001854 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001855 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001856 }
1857 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001858 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001859 }
1860 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001861
Guido van Rossum86e58e22006-08-28 15:27:34 +00001862 case BUILD_SET:
1863 x = PySet_New(NULL);
1864 if (x != NULL) {
1865 for (; --oparg >= 0;) {
1866 w = POP();
1867 if (err == 0)
1868 err = PySet_Add(x, w);
1869 Py_DECREF(w);
1870 }
1871 if (err != 0) {
1872 Py_DECREF(x);
1873 break;
1874 }
1875 PUSH(x);
1876 continue;
1877 }
1878 break;
1879
Guido van Rossum374a9221991-04-04 10:40:29 +00001880 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001881 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001882 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001883 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001884 break;
Thomas Wouters00e41de2007-02-23 19:56:57 +00001885
1886 case MAKE_BYTES:
1887 w = POP();
1888 if (PyString_Check(w))
1889 x = PyBytes_FromStringAndSize(
1890 PyString_AS_STRING(w),
1891 PyString_GET_SIZE(w));
1892 else
1893 x = NULL;
1894 Py_DECREF(w);
1895 PUSH(x);
1896 if (x != NULL) continue;
1897 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001898
Guido van Rossum374a9221991-04-04 10:40:29 +00001899 case LOAD_ATTR:
Skip Montanaro496e6582002-08-06 17:47:40 +00001900 w = GETITEM(names, oparg);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001901 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001902 x = PyObject_GetAttr(v, w);
1903 Py_DECREF(v);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001904 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001905 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001906 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001907
Guido van Rossum374a9221991-04-04 10:40:29 +00001908 case COMPARE_OP:
1909 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001910 v = TOP();
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +00001911 if (PyInt_CheckExact(w) && PyInt_CheckExact(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001912 /* INLINE: cmp(int, int) */
1913 register long a, b;
1914 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001915 a = PyInt_AS_LONG(v);
1916 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001917 switch (oparg) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00001918 case PyCmp_LT: res = a < b; break;
1919 case PyCmp_LE: res = a <= b; break;
1920 case PyCmp_EQ: res = a == b; break;
1921 case PyCmp_NE: res = a != b; break;
1922 case PyCmp_GT: res = a > b; break;
1923 case PyCmp_GE: res = a >= b; break;
1924 case PyCmp_IS: res = v == w; break;
1925 case PyCmp_IS_NOT: res = v != w; break;
Guido van Rossumc12da691997-07-17 23:12:42 +00001926 default: goto slow_compare;
1927 }
1928 x = res ? Py_True : Py_False;
1929 Py_INCREF(x);
1930 }
1931 else {
1932 slow_compare:
1933 x = cmp_outcome(oparg, v, w);
1934 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001935 Py_DECREF(v);
1936 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001937 SET_TOP(x);
Raymond Hettingerf606f872003-03-16 03:11:04 +00001938 if (x == NULL) break;
1939 PREDICT(JUMP_IF_FALSE);
1940 PREDICT(JUMP_IF_TRUE);
1941 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001942
Guido van Rossum374a9221991-04-04 10:40:29 +00001943 case IMPORT_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001944 w = GETITEM(names, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001945 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001946 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001947 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001948 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001949 break;
1950 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001951 v = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001952 u = TOP();
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001953 if (PyInt_AsLong(u) != -1 || PyErr_Occurred())
1954 w = PyTuple_Pack(5,
1955 w,
1956 f->f_globals,
1957 f->f_locals == NULL ?
1958 Py_None : f->f_locals,
1959 v,
1960 u);
1961 else
1962 w = PyTuple_Pack(4,
1963 w,
1964 f->f_globals,
1965 f->f_locals == NULL ?
1966 Py_None : f->f_locals,
1967 v);
1968 Py_DECREF(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001969 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001970 if (w == NULL) {
Raymond Hettinger663004b2003-01-09 15:24:30 +00001971 u = POP();
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001972 x = NULL;
1973 break;
1974 }
Michael W. Hudson75eabd22005-01-18 15:56:11 +00001975 READ_TIMESTAMP(intr0);
Guido van Rossumb209a111997-04-29 18:18:01 +00001976 x = PyEval_CallObject(x, w);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00001977 READ_TIMESTAMP(intr1);
Guido van Rossumb209a111997-04-29 18:18:01 +00001978 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001979 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001980 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001981 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001982
Thomas Wouters52152252000-08-17 22:55:00 +00001983 case IMPORT_STAR:
1984 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001985 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001986 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001987 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001988 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001989 break;
1990 }
Michael W. Hudson75eabd22005-01-18 15:56:11 +00001991 READ_TIMESTAMP(intr0);
Thomas Wouters52152252000-08-17 22:55:00 +00001992 err = import_all_from(x, v);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00001993 READ_TIMESTAMP(intr1);
Guido van Rossumb209a111997-04-29 18:18:01 +00001994 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001995 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001996 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001997 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001998
Thomas Wouters52152252000-08-17 22:55:00 +00001999 case IMPORT_FROM:
Skip Montanaro496e6582002-08-06 17:47:40 +00002000 w = GETITEM(names, oparg);
Thomas Wouters52152252000-08-17 22:55:00 +00002001 v = TOP();
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002002 READ_TIMESTAMP(intr0);
Thomas Wouters52152252000-08-17 22:55:00 +00002003 x = import_from(v, w);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002004 READ_TIMESTAMP(intr1);
Thomas Wouters52152252000-08-17 22:55:00 +00002005 PUSH(x);
2006 if (x != NULL) continue;
2007 break;
2008
Guido van Rossum374a9221991-04-04 10:40:29 +00002009 case JUMP_FORWARD:
2010 JUMPBY(oparg);
Neil Schemenauerc4b570f2003-06-01 19:21:12 +00002011 goto fast_next_opcode;
Guido van Rossumac7be682001-01-17 15:42:30 +00002012
Raymond Hettingerf606f872003-03-16 03:11:04 +00002013 PREDICTED_WITH_ARG(JUMP_IF_FALSE);
Guido van Rossum374a9221991-04-04 10:40:29 +00002014 case JUMP_IF_FALSE:
Raymond Hettinger21012b82003-02-26 18:11:50 +00002015 w = TOP();
Raymond Hettingerf606f872003-03-16 03:11:04 +00002016 if (w == Py_True) {
2017 PREDICT(POP_TOP);
Neil Schemenauerc4b570f2003-06-01 19:21:12 +00002018 goto fast_next_opcode;
Raymond Hettingerf606f872003-03-16 03:11:04 +00002019 }
Raymond Hettinger21012b82003-02-26 18:11:50 +00002020 if (w == Py_False) {
2021 JUMPBY(oparg);
Neil Schemenauerc4b570f2003-06-01 19:21:12 +00002022 goto fast_next_opcode;
Raymond Hettinger21012b82003-02-26 18:11:50 +00002023 }
2024 err = PyObject_IsTrue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002025 if (err > 0)
2026 err = 0;
2027 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00002028 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002029 else
2030 break;
2031 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00002032
Raymond Hettingerf606f872003-03-16 03:11:04 +00002033 PREDICTED_WITH_ARG(JUMP_IF_TRUE);
Guido van Rossum374a9221991-04-04 10:40:29 +00002034 case JUMP_IF_TRUE:
Raymond Hettinger21012b82003-02-26 18:11:50 +00002035 w = TOP();
Raymond Hettingerf606f872003-03-16 03:11:04 +00002036 if (w == Py_False) {
2037 PREDICT(POP_TOP);
Neil Schemenauerc4b570f2003-06-01 19:21:12 +00002038 goto fast_next_opcode;
Raymond Hettingerf606f872003-03-16 03:11:04 +00002039 }
Raymond Hettinger21012b82003-02-26 18:11:50 +00002040 if (w == Py_True) {
2041 JUMPBY(oparg);
Neil Schemenauerc4b570f2003-06-01 19:21:12 +00002042 goto fast_next_opcode;
Raymond Hettinger21012b82003-02-26 18:11:50 +00002043 }
2044 err = PyObject_IsTrue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002045 if (err > 0) {
2046 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00002047 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002048 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002049 else if (err == 0)
2050 ;
2051 else
2052 break;
2053 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00002054
Raymond Hettingerfba1cfc2004-03-12 16:33:17 +00002055 PREDICTED_WITH_ARG(JUMP_ABSOLUTE);
Guido van Rossum374a9221991-04-04 10:40:29 +00002056 case JUMP_ABSOLUTE:
2057 JUMPTO(oparg);
Neil Schemenauerca2a2f12003-05-30 23:59:44 +00002058 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00002059
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002060 case GET_ITER:
2061 /* before: [obj]; after [getiter(obj)] */
Raymond Hettinger663004b2003-01-09 15:24:30 +00002062 v = TOP();
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002063 x = PyObject_GetIter(v);
2064 Py_DECREF(v);
2065 if (x != NULL) {
Raymond Hettinger663004b2003-01-09 15:24:30 +00002066 SET_TOP(x);
Raymond Hettinger7dc52212003-03-16 20:14:44 +00002067 PREDICT(FOR_ITER);
Guido van Rossum213c7a62001-04-23 14:08:49 +00002068 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002069 }
Raymond Hettinger8bb90a52003-01-14 12:43:10 +00002070 STACKADJ(-1);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002071 break;
2072
Raymond Hettinger7dc52212003-03-16 20:14:44 +00002073 PREDICTED_WITH_ARG(FOR_ITER);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002074 case FOR_ITER:
2075 /* before: [iter]; after: [iter, iter()] *or* [] */
2076 v = TOP();
Raymond Hettingerdb0de9e2004-03-12 08:41:36 +00002077 x = (*v->ob_type->tp_iternext)(v);
Guido van Rossum213c7a62001-04-23 14:08:49 +00002078 if (x != NULL) {
2079 PUSH(x);
Raymond Hettinger7dc52212003-03-16 20:14:44 +00002080 PREDICT(STORE_FAST);
2081 PREDICT(UNPACK_SEQUENCE);
Guido van Rossum213c7a62001-04-23 14:08:49 +00002082 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002083 }
Raymond Hettingerdb0de9e2004-03-12 08:41:36 +00002084 if (PyErr_Occurred()) {
2085 if (!PyErr_ExceptionMatches(PyExc_StopIteration))
2086 break;
2087 PyErr_Clear();
Guido van Rossum213c7a62001-04-23 14:08:49 +00002088 }
Raymond Hettingerdb0de9e2004-03-12 08:41:36 +00002089 /* iterator ended normally */
2090 x = v = POP();
2091 Py_DECREF(v);
2092 JUMPBY(oparg);
2093 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002094
Raymond Hettinger2d783e92004-03-12 09:12:22 +00002095 case BREAK_LOOP:
2096 why = WHY_BREAK;
2097 goto fast_block_end;
2098
2099 case CONTINUE_LOOP:
2100 retval = PyInt_FromLong(oparg);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002101 if (!retval) {
2102 x = NULL;
2103 break;
2104 }
Raymond Hettinger2d783e92004-03-12 09:12:22 +00002105 why = WHY_CONTINUE;
2106 goto fast_block_end;
2107
Guido van Rossum374a9221991-04-04 10:40:29 +00002108 case SETUP_LOOP:
2109 case SETUP_EXCEPT:
2110 case SETUP_FINALLY:
Thomas Wouters9fe394c2007-02-05 01:24:16 +00002111 /* NOTE: If you add any new block-setup opcodes that are
2112 not try/except/finally handlers, you may need to
2113 update the PyGen_NeedsFinalizing() function. */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002114
Guido van Rossumb209a111997-04-29 18:18:01 +00002115 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002116 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002117 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00002118
Guido van Rossumc2e20742006-02-27 22:32:47 +00002119 case WITH_CLEANUP:
2120 {
2121 /* TOP is the context.__exit__ bound method.
2122 Below that are 1-3 values indicating how/why
2123 we entered the finally clause:
2124 - SECOND = None
Guido van Rossumf6694362006-03-10 02:28:35 +00002125 - (SECOND, THIRD) = (WHY_{RETURN,CONTINUE}), retval
Guido van Rossumc2e20742006-02-27 22:32:47 +00002126 - SECOND = WHY_*; no retval below it
2127 - (SECOND, THIRD, FOURTH) = exc_info()
2128 In the last case, we must call
2129 TOP(SECOND, THIRD, FOURTH)
2130 otherwise we must call
2131 TOP(None, None, None)
Guido van Rossum1a5e21e2006-02-28 21:57:43 +00002132
2133 In addition, if the stack represents an exception,
Guido van Rossumf6694362006-03-10 02:28:35 +00002134 *and* the function call returns a 'true' value, we
2135 "zap" this information, to prevent END_FINALLY from
2136 re-raising the exception. (But non-local gotos
2137 should still be resumed.)
Guido van Rossumc2e20742006-02-27 22:32:47 +00002138 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002139
Guido van Rossumc2e20742006-02-27 22:32:47 +00002140 x = TOP();
2141 u = SECOND();
2142 if (PyInt_Check(u) || u == Py_None) {
2143 u = v = w = Py_None;
2144 }
2145 else {
2146 v = THIRD();
2147 w = FOURTH();
2148 }
Guido van Rossumf6694362006-03-10 02:28:35 +00002149 /* XXX Not the fastest way to call it... */
2150 x = PyObject_CallFunctionObjArgs(x, u, v, w, NULL);
2151 if (x == NULL)
2152 break; /* Go to error exit */
2153 if (u != Py_None && PyObject_IsTrue(x)) {
2154 /* There was an exception and a true return */
2155 Py_DECREF(x);
2156 x = TOP(); /* Again */
2157 STACKADJ(-3);
2158 Py_INCREF(Py_None);
2159 SET_TOP(Py_None);
2160 Py_DECREF(x);
2161 Py_DECREF(u);
2162 Py_DECREF(v);
2163 Py_DECREF(w);
2164 } else {
2165 /* Let END_FINALLY do its thing */
2166 Py_DECREF(x);
2167 x = POP();
2168 Py_DECREF(x);
2169 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00002170 break;
2171 }
2172
Guido van Rossumf10570b1995-07-07 22:53:21 +00002173 case CALL_FUNCTION:
Armin Rigo8817fcd2004-06-17 10:22:40 +00002174 {
2175 PyObject **sp;
Jeremy Hylton985eba52003-02-05 23:13:00 +00002176 PCALL(PCALL_ALL);
Armin Rigo8817fcd2004-06-17 10:22:40 +00002177 sp = stack_pointer;
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00002178#ifdef WITH_TSC
Armin Rigo8817fcd2004-06-17 10:22:40 +00002179 x = call_function(&sp, oparg, &intr0, &intr1);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00002180#else
Armin Rigo8817fcd2004-06-17 10:22:40 +00002181 x = call_function(&sp, oparg);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00002182#endif
Armin Rigo8817fcd2004-06-17 10:22:40 +00002183 stack_pointer = sp;
Jeremy Hyltone8c04322002-08-16 17:47:26 +00002184 PUSH(x);
2185 if (x != NULL)
2186 continue;
2187 break;
Armin Rigo8817fcd2004-06-17 10:22:40 +00002188 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002189
Jeremy Hylton76901512000-03-28 23:49:17 +00002190 case CALL_FUNCTION_VAR:
2191 case CALL_FUNCTION_KW:
2192 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00002193 {
Jeremy Hylton76901512000-03-28 23:49:17 +00002194 int na = oparg & 0xff;
2195 int nk = (oparg>>8) & 0xff;
2196 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00002197 int n = na + 2 * nk;
Armin Rigo8817fcd2004-06-17 10:22:40 +00002198 PyObject **pfunc, *func, **sp;
Jeremy Hylton985eba52003-02-05 23:13:00 +00002199 PCALL(PCALL_ALL);
Jeremy Hylton52820442001-01-03 23:52:36 +00002200 if (flags & CALL_FLAG_VAR)
2201 n++;
2202 if (flags & CALL_FLAG_KW)
2203 n++;
2204 pfunc = stack_pointer - n - 1;
2205 func = *pfunc;
Jeremy Hylton52820442001-01-03 23:52:36 +00002206
Guido van Rossumac7be682001-01-17 15:42:30 +00002207 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00002208 && PyMethod_GET_SELF(func) != NULL) {
2209 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002210 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00002211 func = PyMethod_GET_FUNCTION(func);
2212 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002213 Py_DECREF(*pfunc);
2214 *pfunc = self;
2215 na++;
2216 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00002217 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00002218 Py_INCREF(func);
Armin Rigo8817fcd2004-06-17 10:22:40 +00002219 sp = stack_pointer;
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002220 READ_TIMESTAMP(intr0);
Armin Rigo8817fcd2004-06-17 10:22:40 +00002221 x = ext_do_call(func, &sp, flags, na, nk);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002222 READ_TIMESTAMP(intr1);
Armin Rigo8817fcd2004-06-17 10:22:40 +00002223 stack_pointer = sp;
Jeremy Hylton76901512000-03-28 23:49:17 +00002224 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002225
Jeremy Hylton76901512000-03-28 23:49:17 +00002226 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00002227 w = POP();
2228 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00002229 }
2230 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002231 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002232 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00002233 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002234 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002235
Guido van Rossum0240b922007-02-26 21:23:50 +00002236 case MAKE_CLOSURE:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002237 case MAKE_FUNCTION:
Guido van Rossum4f72a782006-10-27 23:31:49 +00002238 {
2239 int posdefaults = oparg & 0xff;
2240 int kwdefaults = (oparg>>8) & 0xff;
Neal Norwitzc1505362006-12-28 06:47:50 +00002241 int num_annotations = (oparg >> 16) & 0x7fff;
Guido van Rossum4f72a782006-10-27 23:31:49 +00002242
Guido van Rossum681d79a1995-07-18 14:51:37 +00002243 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00002244 x = PyFunction_New(v, f->f_globals);
2245 Py_DECREF(v);
Guido van Rossum0240b922007-02-26 21:23:50 +00002246
2247 if (x != NULL && opcode == MAKE_CLOSURE) {
2248 v = POP();
2249 err = PyFunction_SetClosure(x, v);
2250 Py_DECREF(v);
2251 }
Neal Norwitzc1505362006-12-28 06:47:50 +00002252
2253 if (x != NULL && num_annotations > 0) {
2254 Py_ssize_t name_ix;
2255 u = POP(); /* names of args with annotations */
2256 v = PyDict_New();
2257 if (v == NULL) {
2258 Py_DECREF(x);
2259 x = NULL;
2260 break;
2261 }
2262 name_ix = PyTuple_Size(u);
2263 assert(num_annotations == name_ix+1);
2264 while (name_ix > 0) {
2265 --name_ix;
2266 t = PyTuple_GET_ITEM(u, name_ix);
2267 w = POP();
2268 /* XXX(nnorwitz): check for errors */
2269 PyDict_SetItem(v, t, w);
2270 Py_DECREF(w);
2271 }
2272
2273 err = PyFunction_SetAnnotations(x, v);
2274 Py_DECREF(v);
2275 Py_DECREF(u);
2276 }
2277
Guido van Rossum681d79a1995-07-18 14:51:37 +00002278 /* XXX Maybe this should be a separate opcode? */
Guido van Rossum4f72a782006-10-27 23:31:49 +00002279 if (x != NULL && posdefaults > 0) {
2280 v = PyTuple_New(posdefaults);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002281 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002282 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002283 x = NULL;
2284 break;
2285 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00002286 while (--posdefaults >= 0) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002287 w = POP();
Guido van Rossum4f72a782006-10-27 23:31:49 +00002288 PyTuple_SET_ITEM(v, posdefaults, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002289 }
2290 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00002291 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002292 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00002293 if (x != NULL && kwdefaults > 0) {
2294 v = PyDict_New();
2295 if (v == NULL) {
2296 Py_DECREF(x);
2297 x = NULL;
2298 break;
2299 }
2300 while (--kwdefaults >= 0) {
2301 w = POP(); /* default value */
2302 u = POP(); /* kw only arg name */
Neal Norwitzc1505362006-12-28 06:47:50 +00002303 /* XXX(nnorwitz): check for errors */
Guido van Rossum4f72a782006-10-27 23:31:49 +00002304 PyDict_SetItem(v, u, w);
Georg Brandl94ab0002007-02-26 13:58:18 +00002305 Py_DECREF(w);
2306 Py_DECREF(u);
Guido van Rossum4f72a782006-10-27 23:31:49 +00002307 }
2308 err = PyFunction_SetKwDefaults(x, v);
2309 Py_DECREF(v);
2310 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002311 PUSH(x);
2312 break;
Guido van Rossum4f72a782006-10-27 23:31:49 +00002313 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002314
2315 case BUILD_SLICE:
2316 if (oparg == 3)
2317 w = POP();
2318 else
2319 w = NULL;
2320 v = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00002321 u = TOP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002322 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002323 Py_DECREF(u);
2324 Py_DECREF(v);
2325 Py_XDECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00002326 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002327 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002328 break;
2329
Fred Drakeef8ace32000-08-24 00:32:09 +00002330 case EXTENDED_ARG:
2331 opcode = NEXTOP();
Raymond Hettinger5bed4562004-04-10 23:34:17 +00002332 oparg = oparg<<16 | NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +00002333 goto dispatch_opcode;
Guido van Rossum8861b741996-07-30 16:49:37 +00002334
Guido van Rossum374a9221991-04-04 10:40:29 +00002335 default:
2336 fprintf(stderr,
2337 "XXX lineno: %d, opcode: %d\n",
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002338 PyCode_Addr2Line(f->f_code, f->f_lasti),
2339 opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002340 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002341 why = WHY_EXCEPTION;
2342 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002343
2344#ifdef CASE_TOO_BIG
2345 }
2346#endif
2347
Guido van Rossum374a9221991-04-04 10:40:29 +00002348 } /* switch */
2349
2350 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002351
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002352 READ_TIMESTAMP(inst1);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00002353
Guido van Rossum374a9221991-04-04 10:40:29 +00002354 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002355
Guido van Rossum374a9221991-04-04 10:40:29 +00002356 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002357 if (err == 0 && x != NULL) {
2358#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002359 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002360 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002361 fprintf(stderr,
2362 "XXX undetected error\n");
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00002363 else {
2364#endif
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002365 READ_TIMESTAMP(loop1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002366 continue; /* Normal, fast path */
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00002367#ifdef CHECKEXC
2368 }
2369#endif
Guido van Rossum681d79a1995-07-18 14:51:37 +00002370 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002371 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002372 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002373 err = 0;
2374 }
2375
Guido van Rossum374a9221991-04-04 10:40:29 +00002376 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002377
Raymond Hettingerc8aa08b2004-04-11 14:59:33 +00002378 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002379 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002380 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002381 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002382 why = WHY_EXCEPTION;
2383 }
2384 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002385#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002386 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002387 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002388 if (PyErr_Occurred()) {
Jeremy Hylton904ed862003-11-05 17:29:35 +00002389 char buf[1024];
2390 sprintf(buf, "Stack unwind with exception "
2391 "set and why=%d", why);
2392 Py_FatalError(buf);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002393 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002394 }
2395#endif
2396
2397 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002398
Guido van Rossum374a9221991-04-04 10:40:29 +00002399 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002400 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002401
Fred Drake8f51f542001-10-04 14:48:42 +00002402 if (tstate->c_tracefunc != NULL)
2403 call_exc_trace(tstate->c_tracefunc,
2404 tstate->c_traceobj, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002405 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002406
Guido van Rossum374a9221991-04-04 10:40:29 +00002407 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002408
Guido van Rossum374a9221991-04-04 10:40:29 +00002409 if (why == WHY_RERAISE)
2410 why = WHY_EXCEPTION;
2411
2412 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002413
Raymond Hettinger1dd83092004-02-06 18:32:33 +00002414fast_block_end:
Tim Peters8a5c3c72004-04-05 19:36:21 +00002415 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002416 PyTryBlock *b = PyFrame_BlockPop(f);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002417
Tim Peters8a5c3c72004-04-05 19:36:21 +00002418 assert(why != WHY_YIELD);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002419 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2420 /* For a continue inside a try block,
2421 don't pop the block for the loop. */
Thomas Wouters1ee64222001-09-24 19:32:01 +00002422 PyFrame_BlockSetup(f, b->b_type, b->b_handler,
2423 b->b_level);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002424 why = WHY_NOT;
2425 JUMPTO(PyInt_AS_LONG(retval));
2426 Py_DECREF(retval);
2427 break;
2428 }
2429
Guido van Rossum374a9221991-04-04 10:40:29 +00002430 while (STACK_LEVEL() > b->b_level) {
2431 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002432 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002433 }
2434 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2435 why = WHY_NOT;
2436 JUMPTO(b->b_handler);
2437 break;
2438 }
2439 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002440 (b->b_type == SETUP_EXCEPT &&
2441 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002442 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002443 PyObject *exc, *val, *tb;
2444 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002445 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002446 val = Py_None;
2447 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002448 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002449 /* Make the raw exception data
2450 available to the handler,
2451 so a program can emulate the
2452 Python main loop. Don't do
2453 this for 'finally'. */
2454 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002455 PyErr_NormalizeException(
2456 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002457 set_exc_info(tstate,
2458 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002459 }
Jeremy Hyltonc6314892001-09-26 19:24:45 +00002460 if (tb == NULL) {
2461 Py_INCREF(Py_None);
2462 PUSH(Py_None);
2463 } else
2464 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002465 PUSH(val);
2466 PUSH(exc);
2467 }
2468 else {
Raymond Hettinger06032cb2004-04-06 09:37:35 +00002469 if (why & (WHY_RETURN | WHY_CONTINUE))
Guido van Rossum374a9221991-04-04 10:40:29 +00002470 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002471 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002472 PUSH(v);
2473 }
2474 why = WHY_NOT;
2475 JUMPTO(b->b_handler);
2476 break;
2477 }
2478 } /* unwind stack */
2479
2480 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002481
Guido van Rossum374a9221991-04-04 10:40:29 +00002482 if (why != WHY_NOT)
2483 break;
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002484 READ_TIMESTAMP(loop1);
Guido van Rossumac7be682001-01-17 15:42:30 +00002485
Guido van Rossum374a9221991-04-04 10:40:29 +00002486 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002487
Tim Peters8a5c3c72004-04-05 19:36:21 +00002488 assert(why != WHY_YIELD);
2489 /* Pop remaining stack entries. */
2490 while (!EMPTY()) {
2491 v = POP();
2492 Py_XDECREF(v);
Guido van Rossum35974fb2001-12-06 21:28:18 +00002493 }
2494
Tim Peters8a5c3c72004-04-05 19:36:21 +00002495 if (why != WHY_RETURN)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002496 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002497
Raymond Hettinger1dd83092004-02-06 18:32:33 +00002498fast_yield:
Fred Drake9e3ad782001-07-03 23:39:52 +00002499 if (tstate->use_tracing) {
Barry Warsawe2eca0b2005-08-15 18:14:19 +00002500 if (tstate->c_tracefunc) {
2501 if (why == WHY_RETURN || why == WHY_YIELD) {
2502 if (call_trace(tstate->c_tracefunc,
2503 tstate->c_traceobj, f,
2504 PyTrace_RETURN, retval)) {
2505 Py_XDECREF(retval);
2506 retval = NULL;
2507 why = WHY_EXCEPTION;
2508 }
2509 }
2510 else if (why == WHY_EXCEPTION) {
2511 call_trace_protected(tstate->c_tracefunc,
2512 tstate->c_traceobj, f,
Armin Rigo1c2d7e52005-09-20 18:34:01 +00002513 PyTrace_RETURN, NULL);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002514 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002515 }
Fred Drake8f51f542001-10-04 14:48:42 +00002516 if (tstate->c_profilefunc) {
Fred Drake4ec5d562001-10-04 19:26:43 +00002517 if (why == WHY_EXCEPTION)
2518 call_trace_protected(tstate->c_profilefunc,
2519 tstate->c_profileobj, f,
Armin Rigo1c2d7e52005-09-20 18:34:01 +00002520 PyTrace_RETURN, NULL);
Fred Drake4ec5d562001-10-04 19:26:43 +00002521 else if (call_trace(tstate->c_profilefunc,
2522 tstate->c_profileobj, f,
2523 PyTrace_RETURN, retval)) {
Fred Drake9e3ad782001-07-03 23:39:52 +00002524 Py_XDECREF(retval);
2525 retval = NULL;
2526 why = WHY_EXCEPTION;
2527 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002528 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002529 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002530
Thomas Wouters477c8d52006-05-27 19:21:47 +00002531 if (tstate->frame->f_exc_type != NULL)
2532 reset_exc_info(tstate);
2533 else {
2534 assert(tstate->frame->f_exc_value == NULL);
2535 assert(tstate->frame->f_exc_traceback == NULL);
2536 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00002537
Tim Peters5ca576e2001-06-18 22:08:13 +00002538 /* pop frame */
Armin Rigo2b3eb402003-10-28 12:05:48 +00002539 exit_eval_frame:
2540 Py_LeaveRecursiveCall();
Guido van Rossuma027efa1997-05-05 20:56:21 +00002541 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00002542
Guido van Rossum96a42c81992-01-12 02:29:51 +00002543 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002544}
2545
Guido van Rossumc2e20742006-02-27 22:32:47 +00002546/* This is gonna seem *real weird*, but if you put some other code between
Martin v. Löwis8d97e332004-06-27 15:43:12 +00002547 PyEval_EvalFrame() and PyEval_EvalCodeEx() you will need to adjust
Guido van Rossumc2e20742006-02-27 22:32:47 +00002548 the test in the if statements in Misc/gdbinit (pystack and pystackv). */
Skip Montanaro786ea6b2004-03-01 15:44:05 +00002549
Tim Peters6d6c1a32001-08-02 04:15:00 +00002550PyObject *
2551PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals,
Tim Peters5ca576e2001-06-18 22:08:13 +00002552 PyObject **args, int argcount, PyObject **kws, int kwcount,
Guido van Rossum4f72a782006-10-27 23:31:49 +00002553 PyObject **defs, int defcount, PyObject *kwdefs, PyObject *closure)
Tim Peters5ca576e2001-06-18 22:08:13 +00002554{
2555 register PyFrameObject *f;
2556 register PyObject *retval = NULL;
2557 register PyObject **fastlocals, **freevars;
2558 PyThreadState *tstate = PyThreadState_GET();
2559 PyObject *x, *u;
2560
2561 if (globals == NULL) {
Tim Peters8a5c3c72004-04-05 19:36:21 +00002562 PyErr_SetString(PyExc_SystemError,
Jeremy Hylton910d7d42001-08-12 21:52:24 +00002563 "PyEval_EvalCodeEx: NULL globals");
Tim Peters5ca576e2001-06-18 22:08:13 +00002564 return NULL;
2565 }
2566
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002567 assert(tstate != NULL);
Jeremy Hylton985eba52003-02-05 23:13:00 +00002568 assert(globals != NULL);
2569 f = PyFrame_New(tstate, co, globals, locals);
Tim Peters5ca576e2001-06-18 22:08:13 +00002570 if (f == NULL)
2571 return NULL;
2572
2573 fastlocals = f->f_localsplus;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002574 freevars = f->f_localsplus + co->co_nlocals;
Tim Peters5ca576e2001-06-18 22:08:13 +00002575
2576 if (co->co_argcount > 0 ||
Guido van Rossum4f72a782006-10-27 23:31:49 +00002577 co->co_kwonlyargcount > 0 ||
Tim Peters5ca576e2001-06-18 22:08:13 +00002578 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
2579 int i;
2580 int n = argcount;
2581 PyObject *kwdict = NULL;
2582 if (co->co_flags & CO_VARKEYWORDS) {
2583 kwdict = PyDict_New();
2584 if (kwdict == NULL)
2585 goto fail;
Guido van Rossum4f72a782006-10-27 23:31:49 +00002586 i = co->co_argcount + co->co_kwonlyargcount;
Tim Peters5ca576e2001-06-18 22:08:13 +00002587 if (co->co_flags & CO_VARARGS)
2588 i++;
2589 SETLOCAL(i, kwdict);
2590 }
2591 if (argcount > co->co_argcount) {
2592 if (!(co->co_flags & CO_VARARGS)) {
2593 PyErr_Format(PyExc_TypeError,
2594 "%.200s() takes %s %d "
Guido van Rossum4f72a782006-10-27 23:31:49 +00002595 "%spositional argument%s (%d given)",
Tim Peters5ca576e2001-06-18 22:08:13 +00002596 PyString_AsString(co->co_name),
2597 defcount ? "at most" : "exactly",
2598 co->co_argcount,
2599 kwcount ? "non-keyword " : "",
2600 co->co_argcount == 1 ? "" : "s",
2601 argcount);
2602 goto fail;
2603 }
2604 n = co->co_argcount;
2605 }
2606 for (i = 0; i < n; i++) {
2607 x = args[i];
2608 Py_INCREF(x);
2609 SETLOCAL(i, x);
2610 }
2611 if (co->co_flags & CO_VARARGS) {
2612 u = PyTuple_New(argcount - n);
2613 if (u == NULL)
2614 goto fail;
Guido van Rossum4f72a782006-10-27 23:31:49 +00002615 SETLOCAL(co->co_argcount + co->co_kwonlyargcount, u);
Tim Peters5ca576e2001-06-18 22:08:13 +00002616 for (i = n; i < argcount; i++) {
2617 x = args[i];
2618 Py_INCREF(x);
2619 PyTuple_SET_ITEM(u, i-n, x);
2620 }
2621 }
2622 for (i = 0; i < kwcount; i++) {
2623 PyObject *keyword = kws[2*i];
2624 PyObject *value = kws[2*i + 1];
2625 int j;
2626 if (keyword == NULL || !PyString_Check(keyword)) {
2627 PyErr_Format(PyExc_TypeError,
2628 "%.200s() keywords must be strings",
2629 PyString_AsString(co->co_name));
2630 goto fail;
2631 }
2632 /* XXX slow -- speed up using dictionary? */
Guido van Rossum4f72a782006-10-27 23:31:49 +00002633 for (j = 0;
2634 j < co->co_argcount + co->co_kwonlyargcount;
2635 j++) {
Tim Peters5ca576e2001-06-18 22:08:13 +00002636 PyObject *nm = PyTuple_GET_ITEM(
2637 co->co_varnames, j);
2638 int cmp = PyObject_RichCompareBool(
2639 keyword, nm, Py_EQ);
2640 if (cmp > 0)
2641 break;
2642 else if (cmp < 0)
2643 goto fail;
2644 }
2645 /* Check errors from Compare */
2646 if (PyErr_Occurred())
2647 goto fail;
Guido van Rossum4f72a782006-10-27 23:31:49 +00002648 if (j >= co->co_argcount + co->co_kwonlyargcount) {
Tim Peters5ca576e2001-06-18 22:08:13 +00002649 if (kwdict == NULL) {
2650 PyErr_Format(PyExc_TypeError,
2651 "%.200s() got an unexpected "
2652 "keyword argument '%.400s'",
2653 PyString_AsString(co->co_name),
2654 PyString_AsString(keyword));
2655 goto fail;
2656 }
2657 PyDict_SetItem(kwdict, keyword, value);
2658 }
2659 else {
2660 if (GETLOCAL(j) != NULL) {
2661 PyErr_Format(PyExc_TypeError,
2662 "%.200s() got multiple "
2663 "values for keyword "
2664 "argument '%.400s'",
2665 PyString_AsString(co->co_name),
2666 PyString_AsString(keyword));
2667 goto fail;
2668 }
2669 Py_INCREF(value);
2670 SETLOCAL(j, value);
2671 }
2672 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00002673 if (co->co_kwonlyargcount > 0) {
2674 for (i = co->co_argcount;
2675 i < co->co_argcount + co->co_kwonlyargcount;
2676 i++) {
Guido van Rossum29602e42006-11-22 04:45:33 +00002677 PyObject *name, *def;
Guido van Rossum4f72a782006-10-27 23:31:49 +00002678 if (GETLOCAL(i) != NULL)
2679 continue;
Guido van Rossum29602e42006-11-22 04:45:33 +00002680 name = PyTuple_GET_ITEM(co->co_varnames, i);
2681 def = NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00002682 if (kwdefs != NULL)
2683 def = PyDict_GetItem(kwdefs, name);
2684 if (def != NULL) {
2685 Py_INCREF(def);
2686 SETLOCAL(i, def);
2687 continue;
2688 }
2689 PyErr_Format(PyExc_TypeError,
2690 "%.200s() needs "
Brett Cannone33a6112007-01-29 23:43:38 +00002691 "keyword-only argument %s",
Guido van Rossum4f72a782006-10-27 23:31:49 +00002692 PyString_AsString(co->co_name),
2693 PyString_AsString(name));
2694 goto fail;
2695 }
2696 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002697 if (argcount < co->co_argcount) {
2698 int m = co->co_argcount - defcount;
2699 for (i = argcount; i < m; i++) {
2700 if (GETLOCAL(i) == NULL) {
2701 PyErr_Format(PyExc_TypeError,
2702 "%.200s() takes %s %d "
Guido van Rossum4f72a782006-10-27 23:31:49 +00002703 "%spositional argument%s "
2704 "(%d given)",
Tim Peters5ca576e2001-06-18 22:08:13 +00002705 PyString_AsString(co->co_name),
2706 ((co->co_flags & CO_VARARGS) ||
2707 defcount) ? "at least"
2708 : "exactly",
2709 m, kwcount ? "non-keyword " : "",
2710 m == 1 ? "" : "s", i);
2711 goto fail;
2712 }
2713 }
2714 if (n > m)
2715 i = n - m;
2716 else
2717 i = 0;
2718 for (; i < defcount; i++) {
2719 if (GETLOCAL(m+i) == NULL) {
2720 PyObject *def = defs[i];
2721 Py_INCREF(def);
2722 SETLOCAL(m+i, def);
2723 }
2724 }
2725 }
2726 }
2727 else {
2728 if (argcount > 0 || kwcount > 0) {
2729 PyErr_Format(PyExc_TypeError,
2730 "%.200s() takes no arguments (%d given)",
2731 PyString_AsString(co->co_name),
2732 argcount + kwcount);
2733 goto fail;
2734 }
2735 }
2736 /* Allocate and initialize storage for cell vars, and copy free
2737 vars into frame. This isn't too efficient right now. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002738 if (PyTuple_GET_SIZE(co->co_cellvars)) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002739 int i, j, nargs, found;
Tim Peters5ca576e2001-06-18 22:08:13 +00002740 char *cellname, *argname;
2741 PyObject *c;
2742
2743 nargs = co->co_argcount;
2744 if (co->co_flags & CO_VARARGS)
2745 nargs++;
2746 if (co->co_flags & CO_VARKEYWORDS)
2747 nargs++;
2748
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002749 /* Initialize each cell var, taking into account
2750 cell vars that are initialized from arguments.
2751
2752 Should arrange for the compiler to put cellvars
2753 that are arguments at the beginning of the cellvars
2754 list so that we can march over it more efficiently?
2755 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002756 for (i = 0; i < PyTuple_GET_SIZE(co->co_cellvars); ++i) {
Tim Peters5ca576e2001-06-18 22:08:13 +00002757 cellname = PyString_AS_STRING(
2758 PyTuple_GET_ITEM(co->co_cellvars, i));
2759 found = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002760 for (j = 0; j < nargs; j++) {
Tim Peters5ca576e2001-06-18 22:08:13 +00002761 argname = PyString_AS_STRING(
2762 PyTuple_GET_ITEM(co->co_varnames, j));
2763 if (strcmp(cellname, argname) == 0) {
2764 c = PyCell_New(GETLOCAL(j));
2765 if (c == NULL)
2766 goto fail;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002767 GETLOCAL(co->co_nlocals + i) = c;
Tim Peters5ca576e2001-06-18 22:08:13 +00002768 found = 1;
2769 break;
2770 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002771 }
2772 if (found == 0) {
2773 c = PyCell_New(NULL);
2774 if (c == NULL)
2775 goto fail;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002776 SETLOCAL(co->co_nlocals + i, c);
Tim Peters5ca576e2001-06-18 22:08:13 +00002777 }
2778 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002779 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002780 if (PyTuple_GET_SIZE(co->co_freevars)) {
Tim Peters5ca576e2001-06-18 22:08:13 +00002781 int i;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002782 for (i = 0; i < PyTuple_GET_SIZE(co->co_freevars); ++i) {
Tim Peters5ca576e2001-06-18 22:08:13 +00002783 PyObject *o = PyTuple_GET_ITEM(closure, i);
2784 Py_INCREF(o);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002785 freevars[PyTuple_GET_SIZE(co->co_cellvars) + i] = o;
Tim Peters5ca576e2001-06-18 22:08:13 +00002786 }
2787 }
2788
Tim Peters5ca576e2001-06-18 22:08:13 +00002789 if (co->co_flags & CO_GENERATOR) {
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002790 /* Don't need to keep the reference to f_back, it will be set
2791 * when the generator is resumed. */
Tim Peters5ba58662001-07-16 02:29:45 +00002792 Py_XDECREF(f->f_back);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002793 f->f_back = NULL;
2794
Jeremy Hylton985eba52003-02-05 23:13:00 +00002795 PCALL(PCALL_GENERATOR);
2796
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002797 /* Create a new generator that owns the ready to run frame
2798 * and return that as the value. */
Martin v. Löwise440e472004-06-01 15:22:42 +00002799 return PyGen_New(f);
Tim Peters5ca576e2001-06-18 22:08:13 +00002800 }
2801
Phillip J. Eby0d6615f2005-08-02 00:46:46 +00002802 retval = PyEval_EvalFrameEx(f,0);
Tim Peters5ca576e2001-06-18 22:08:13 +00002803
2804 fail: /* Jump here from prelude on failure */
2805
Tim Petersb13680b2001-11-27 23:29:29 +00002806 /* decref'ing the frame can cause __del__ methods to get invoked,
2807 which can call back into Python. While we're done with the
2808 current Python frame (f), the associated C stack is still in use,
2809 so recursion_depth must be boosted for the duration.
2810 */
2811 assert(tstate != NULL);
2812 ++tstate->recursion_depth;
Tim Peters5ca576e2001-06-18 22:08:13 +00002813 Py_DECREF(f);
Tim Petersb13680b2001-11-27 23:29:29 +00002814 --tstate->recursion_depth;
Tim Peters5ca576e2001-06-18 22:08:13 +00002815 return retval;
2816}
2817
2818
Guido van Rossumc9fbb722003-03-01 03:36:33 +00002819/* Implementation notes for set_exc_info() and reset_exc_info():
2820
2821- Below, 'exc_ZZZ' stands for 'exc_type', 'exc_value' and
2822 'exc_traceback'. These always travel together.
2823
2824- tstate->curexc_ZZZ is the "hot" exception that is set by
2825 PyErr_SetString(), cleared by PyErr_Clear(), and so on.
2826
2827- Once an exception is caught by an except clause, it is transferred
2828 from tstate->curexc_ZZZ to tstate->exc_ZZZ, from which sys.exc_info()
2829 can pick it up. This is the primary task of set_exc_info().
Thomas Wouters477c8d52006-05-27 19:21:47 +00002830 XXX That can't be right: set_exc_info() doesn't look at tstate->curexc_ZZZ.
Guido van Rossumc9fbb722003-03-01 03:36:33 +00002831
2832- Now let me explain the complicated dance with frame->f_exc_ZZZ.
2833
2834 Long ago, when none of this existed, there were just a few globals:
2835 one set corresponding to the "hot" exception, and one set
2836 corresponding to sys.exc_ZZZ. (Actually, the latter weren't C
2837 globals; they were simply stored as sys.exc_ZZZ. For backwards
2838 compatibility, they still are!) The problem was that in code like
2839 this:
2840
2841 try:
2842 "something that may fail"
2843 except "some exception":
2844 "do something else first"
2845 "print the exception from sys.exc_ZZZ."
2846
2847 if "do something else first" invoked something that raised and caught
2848 an exception, sys.exc_ZZZ were overwritten. That was a frequent
2849 cause of subtle bugs. I fixed this by changing the semantics as
2850 follows:
2851
2852 - Within one frame, sys.exc_ZZZ will hold the last exception caught
2853 *in that frame*.
2854
2855 - But initially, and as long as no exception is caught in a given
2856 frame, sys.exc_ZZZ will hold the last exception caught in the
2857 previous frame (or the frame before that, etc.).
2858
2859 The first bullet fixed the bug in the above example. The second
2860 bullet was for backwards compatibility: it was (and is) common to
2861 have a function that is called when an exception is caught, and to
2862 have that function access the caught exception via sys.exc_ZZZ.
2863 (Example: traceback.print_exc()).
2864
2865 At the same time I fixed the problem that sys.exc_ZZZ weren't
2866 thread-safe, by introducing sys.exc_info() which gets it from tstate;
2867 but that's really a separate improvement.
2868
2869 The reset_exc_info() function in ceval.c restores the tstate->exc_ZZZ
2870 variables to what they were before the current frame was called. The
2871 set_exc_info() function saves them on the frame so that
2872 reset_exc_info() can restore them. The invariant is that
2873 frame->f_exc_ZZZ is NULL iff the current frame never caught an
2874 exception (where "catching" an exception applies only to successful
2875 except clauses); and if the current frame ever caught an exception,
2876 frame->f_exc_ZZZ is the exception that was stored in tstate->exc_ZZZ
2877 at the start of the current frame.
2878
2879*/
2880
Guido van Rossuma027efa1997-05-05 20:56:21 +00002881static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002882set_exc_info(PyThreadState *tstate,
2883 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002884{
Thomas Wouters477c8d52006-05-27 19:21:47 +00002885 PyFrameObject *frame = tstate->frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002886 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002887
Thomas Wouters477c8d52006-05-27 19:21:47 +00002888 assert(type != NULL);
2889 assert(frame != NULL);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002890 if (frame->f_exc_type == NULL) {
Thomas Wouters477c8d52006-05-27 19:21:47 +00002891 assert(frame->f_exc_value == NULL);
2892 assert(frame->f_exc_traceback == NULL);
2893 /* This frame didn't catch an exception before. */
2894 /* Save previous exception of this thread in this frame. */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002895 if (tstate->exc_type == NULL) {
Thomas Wouters477c8d52006-05-27 19:21:47 +00002896 /* XXX Why is this set to Py_None? */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002897 Py_INCREF(Py_None);
2898 tstate->exc_type = Py_None;
2899 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002900 Py_INCREF(tstate->exc_type);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002901 Py_XINCREF(tstate->exc_value);
2902 Py_XINCREF(tstate->exc_traceback);
2903 frame->f_exc_type = tstate->exc_type;
2904 frame->f_exc_value = tstate->exc_value;
2905 frame->f_exc_traceback = tstate->exc_traceback;
2906 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002907 /* Set new exception for this thread. */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002908 tmp_type = tstate->exc_type;
2909 tmp_value = tstate->exc_value;
2910 tmp_tb = tstate->exc_traceback;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002911 Py_INCREF(type);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002912 Py_XINCREF(value);
2913 Py_XINCREF(tb);
2914 tstate->exc_type = type;
2915 tstate->exc_value = value;
2916 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002917 Py_XDECREF(tmp_type);
2918 Py_XDECREF(tmp_value);
2919 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002920 /* For b/w compatibility */
2921 PySys_SetObject("exc_type", type);
2922 PySys_SetObject("exc_value", value);
2923 PySys_SetObject("exc_traceback", tb);
2924}
2925
2926static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002927reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002928{
2929 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002930 PyObject *tmp_type, *tmp_value, *tmp_tb;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002931
2932 /* It's a precondition that the thread state's frame caught an
2933 * exception -- verify in a debug build.
2934 */
2935 assert(tstate != NULL);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002936 frame = tstate->frame;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002937 assert(frame != NULL);
2938 assert(frame->f_exc_type != NULL);
2939
2940 /* Copy the frame's exception info back to the thread state. */
2941 tmp_type = tstate->exc_type;
2942 tmp_value = tstate->exc_value;
2943 tmp_tb = tstate->exc_traceback;
2944 Py_INCREF(frame->f_exc_type);
2945 Py_XINCREF(frame->f_exc_value);
2946 Py_XINCREF(frame->f_exc_traceback);
2947 tstate->exc_type = frame->f_exc_type;
2948 tstate->exc_value = frame->f_exc_value;
2949 tstate->exc_traceback = frame->f_exc_traceback;
2950 Py_XDECREF(tmp_type);
2951 Py_XDECREF(tmp_value);
2952 Py_XDECREF(tmp_tb);
2953
2954 /* For b/w compatibility */
2955 PySys_SetObject("exc_type", frame->f_exc_type);
2956 PySys_SetObject("exc_value", frame->f_exc_value);
2957 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2958
2959 /* Clear the frame's exception info. */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002960 tmp_type = frame->f_exc_type;
2961 tmp_value = frame->f_exc_value;
2962 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002963 frame->f_exc_type = NULL;
2964 frame->f_exc_value = NULL;
2965 frame->f_exc_traceback = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002966 Py_DECREF(tmp_type);
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002967 Py_XDECREF(tmp_value);
2968 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002969}
2970
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002971/* Logic for the raise statement (too complicated for inlining).
2972 This *consumes* a reference count to each of its arguments. */
Raymond Hettinger7c958652004-04-06 10:11:10 +00002973static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002974do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002975{
Guido van Rossumd295f121998-04-09 21:39:57 +00002976 if (type == NULL) {
2977 /* Reraise */
Nicholas Bastine5662ae2004-03-24 22:22:12 +00002978 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossumd295f121998-04-09 21:39:57 +00002979 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2980 value = tstate->exc_value;
2981 tb = tstate->exc_traceback;
2982 Py_XINCREF(type);
2983 Py_XINCREF(value);
2984 Py_XINCREF(tb);
2985 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002986
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002987 /* We support the following forms of raise:
2988 raise <class>, <classinstance>
2989 raise <class>, <argument tuple>
2990 raise <class>, None
2991 raise <class>, <argument>
2992 raise <classinstance>, None
2993 raise <string>, <object>
2994 raise <string>, None
2995
2996 An omitted second argument is the same as None.
2997
2998 In addition, raise <tuple>, <anything> is the same as
2999 raising the tuple's first item (and it better have one!);
3000 this rule is applied recursively.
3001
3002 Finally, an optional third argument can be supplied, which
3003 gives the traceback to be substituted (useful when
3004 re-raising an exception after examining it). */
3005
3006 /* First, check the traceback argument, replacing None with
3007 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00003008 if (tb == Py_None) {
3009 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003010 tb = NULL;
3011 }
3012 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003013 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003014 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003015 goto raise_error;
3016 }
3017
3018 /* Next, replace a missing value with None */
3019 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003020 value = Py_None;
3021 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003022 }
3023
3024 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00003025 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
3026 PyObject *tmp = type;
3027 type = PyTuple_GET_ITEM(type, 0);
3028 Py_INCREF(type);
3029 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003030 }
3031
Guido van Rossum45aecf42006-03-15 04:58:47 +00003032 if (PyExceptionClass_Check(type))
Barry Warsaw4249f541997-08-22 21:26:19 +00003033 PyErr_NormalizeException(&type, &value, &tb);
3034
Brett Cannonbf364092006-03-01 04:25:17 +00003035 else if (PyExceptionInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003036 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00003037 if (value != Py_None) {
3038 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003039 "instance exception may not have a separate value");
3040 goto raise_error;
3041 }
3042 else {
3043 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00003044 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003045 value = type;
Brett Cannonbf364092006-03-01 04:25:17 +00003046 type = PyExceptionInstance_Class(type);
Guido van Rossumb209a111997-04-29 18:18:01 +00003047 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003048 }
3049 }
3050 else {
3051 /* Not something you can raise. You get an exception
3052 anyway, just not what you specified :-) */
Guido van Rossum45aecf42006-03-15 04:58:47 +00003053 PyErr_SetString(PyExc_TypeError,
3054 "exceptions must derive from BaseException");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003055 goto raise_error;
3056 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003057 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003058 if (tb == NULL)
3059 return WHY_EXCEPTION;
3060 else
3061 return WHY_RERAISE;
3062 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00003063 Py_XDECREF(value);
3064 Py_XDECREF(type);
3065 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003066 return WHY_EXCEPTION;
3067}
3068
Tim Petersd6d010b2001-06-21 02:49:55 +00003069/* Iterate v argcnt times and store the results on the stack (via decreasing
3070 sp). Return 1 for success, 0 if error. */
3071
Barry Warsawe42b18f1997-08-25 22:13:04 +00003072static int
Tim Petersd6d010b2001-06-21 02:49:55 +00003073unpack_iterable(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00003074{
Tim Petersd6d010b2001-06-21 02:49:55 +00003075 int i = 0;
3076 PyObject *it; /* iter(v) */
Barry Warsawe42b18f1997-08-25 22:13:04 +00003077 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00003078
Tim Petersd6d010b2001-06-21 02:49:55 +00003079 assert(v != NULL);
3080
3081 it = PyObject_GetIter(v);
3082 if (it == NULL)
3083 goto Error;
3084
3085 for (; i < argcnt; i++) {
3086 w = PyIter_Next(it);
3087 if (w == NULL) {
3088 /* Iterator done, via error or exhaustion. */
3089 if (!PyErr_Occurred()) {
3090 PyErr_Format(PyExc_ValueError,
3091 "need more than %d value%s to unpack",
3092 i, i == 1 ? "" : "s");
3093 }
3094 goto Error;
Barry Warsawe42b18f1997-08-25 22:13:04 +00003095 }
3096 *--sp = w;
3097 }
Tim Petersd6d010b2001-06-21 02:49:55 +00003098
3099 /* We better have exhausted the iterator now. */
3100 w = PyIter_Next(it);
3101 if (w == NULL) {
3102 if (PyErr_Occurred())
3103 goto Error;
3104 Py_DECREF(it);
3105 return 1;
Barry Warsawe42b18f1997-08-25 22:13:04 +00003106 }
Guido van Rossumbb8f59a2001-12-03 19:33:25 +00003107 Py_DECREF(w);
Tim Petersd6d010b2001-06-21 02:49:55 +00003108 PyErr_SetString(PyExc_ValueError, "too many values to unpack");
Barry Warsawe42b18f1997-08-25 22:13:04 +00003109 /* fall through */
Tim Petersd6d010b2001-06-21 02:49:55 +00003110Error:
Barry Warsaw91010551997-08-25 22:30:51 +00003111 for (; i > 0; i--, sp++)
3112 Py_DECREF(*sp);
Tim Petersd6d010b2001-06-21 02:49:55 +00003113 Py_XDECREF(it);
Barry Warsawe42b18f1997-08-25 22:13:04 +00003114 return 0;
3115}
3116
3117
Guido van Rossum96a42c81992-01-12 02:29:51 +00003118#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00003119static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003120prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003121{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003122 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00003123 if (PyObject_Print(v, stdout, 0) != 0)
3124 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00003125 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00003126 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003127}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003128#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003129
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003130static void
Fred Drake5755ce62001-06-27 19:19:46 +00003131call_exc_trace(Py_tracefunc func, PyObject *self, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003132{
Guido van Rossumb209a111997-04-29 18:18:01 +00003133 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003134 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00003135 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00003136 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003137 value = Py_None;
3138 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00003139 }
Raymond Hettinger8ae46892003-10-12 19:09:37 +00003140 arg = PyTuple_Pack(3, type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003141 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003142 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003143 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003144 }
Fred Drake5755ce62001-06-27 19:19:46 +00003145 err = call_trace(func, self, f, PyTrace_EXCEPTION, arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00003146 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003147 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00003148 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003149 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00003150 Py_XDECREF(type);
3151 Py_XDECREF(value);
3152 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003153 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003154}
3155
Fred Drake4ec5d562001-10-04 19:26:43 +00003156static void
3157call_trace_protected(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003158 int what, PyObject *arg)
Fred Drake4ec5d562001-10-04 19:26:43 +00003159{
3160 PyObject *type, *value, *traceback;
3161 int err;
3162 PyErr_Fetch(&type, &value, &traceback);
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003163 err = call_trace(func, obj, frame, what, arg);
Fred Drake4ec5d562001-10-04 19:26:43 +00003164 if (err == 0)
3165 PyErr_Restore(type, value, traceback);
3166 else {
3167 Py_XDECREF(type);
3168 Py_XDECREF(value);
3169 Py_XDECREF(traceback);
3170 }
3171}
3172
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003173static int
Fred Drake5755ce62001-06-27 19:19:46 +00003174call_trace(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
3175 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00003176{
Fred Drake5755ce62001-06-27 19:19:46 +00003177 register PyThreadState *tstate = frame->f_tstate;
3178 int result;
3179 if (tstate->tracing)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003180 return 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003181 tstate->tracing++;
Fred Drake9e3ad782001-07-03 23:39:52 +00003182 tstate->use_tracing = 0;
Fred Drake5755ce62001-06-27 19:19:46 +00003183 result = func(obj, frame, what, arg);
Fred Drake9e3ad782001-07-03 23:39:52 +00003184 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
3185 || (tstate->c_profilefunc != NULL));
Guido van Rossuma027efa1997-05-05 20:56:21 +00003186 tstate->tracing--;
Fred Drake5755ce62001-06-27 19:19:46 +00003187 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00003188}
3189
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00003190PyObject *
3191_PyEval_CallTracing(PyObject *func, PyObject *args)
3192{
3193 PyFrameObject *frame = PyEval_GetFrame();
3194 PyThreadState *tstate = frame->f_tstate;
3195 int save_tracing = tstate->tracing;
3196 int save_use_tracing = tstate->use_tracing;
3197 PyObject *result;
3198
3199 tstate->tracing = 0;
3200 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
3201 || (tstate->c_profilefunc != NULL));
3202 result = PyObject_Call(func, args, NULL);
3203 tstate->tracing = save_tracing;
3204 tstate->use_tracing = save_use_tracing;
3205 return result;
3206}
3207
Michael W. Hudson006c7522002-11-08 13:08:46 +00003208static int
Tim Peters8a5c3c72004-04-05 19:36:21 +00003209maybe_call_line_trace(Py_tracefunc func, PyObject *obj,
Armin Rigobf57a142004-03-22 19:24:58 +00003210 PyFrameObject *frame, int *instr_lb, int *instr_ub,
3211 int *instr_prev)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003212{
Michael W. Hudson006c7522002-11-08 13:08:46 +00003213 int result = 0;
3214
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003215 /* If the last instruction executed isn't in the current
3216 instruction window, reset the window. If the last
3217 instruction happens to fall at the start of a line or if it
3218 represents a jump backwards, call the trace function.
3219 */
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00003220 if ((frame->f_lasti < *instr_lb || frame->f_lasti >= *instr_ub)) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003221 int line;
3222 PyAddrPair bounds;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003223
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003224 line = PyCode_CheckLineNumber(frame->f_code, frame->f_lasti,
3225 &bounds);
3226 if (line >= 0) {
Michael W. Hudson02ff6a92002-09-11 15:36:32 +00003227 frame->f_lineno = line;
Tim Peters8a5c3c72004-04-05 19:36:21 +00003228 result = call_trace(func, obj, frame,
Michael W. Hudson006c7522002-11-08 13:08:46 +00003229 PyTrace_LINE, Py_None);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003230 }
3231 *instr_lb = bounds.ap_lower;
3232 *instr_ub = bounds.ap_upper;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003233 }
Armin Rigobf57a142004-03-22 19:24:58 +00003234 else if (frame->f_lasti <= *instr_prev) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003235 result = call_trace(func, obj, frame, PyTrace_LINE, Py_None);
Armin Rigobf57a142004-03-22 19:24:58 +00003236 }
3237 *instr_prev = frame->f_lasti;
Michael W. Hudson006c7522002-11-08 13:08:46 +00003238 return result;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003239}
3240
Fred Drake5755ce62001-06-27 19:19:46 +00003241void
3242PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00003243{
Nicholas Bastine5662ae2004-03-24 22:22:12 +00003244 PyThreadState *tstate = PyThreadState_GET();
Fred Drake5755ce62001-06-27 19:19:46 +00003245 PyObject *temp = tstate->c_profileobj;
3246 Py_XINCREF(arg);
3247 tstate->c_profilefunc = NULL;
3248 tstate->c_profileobj = NULL;
Brett Cannon55fa66d2005-06-25 07:07:35 +00003249 /* Must make sure that tracing is not ignored if 'temp' is freed */
Fred Drake9e3ad782001-07-03 23:39:52 +00003250 tstate->use_tracing = tstate->c_tracefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00003251 Py_XDECREF(temp);
3252 tstate->c_profilefunc = func;
3253 tstate->c_profileobj = arg;
Brett Cannon55fa66d2005-06-25 07:07:35 +00003254 /* Flag that tracing or profiling is turned on */
Fred Drake9e3ad782001-07-03 23:39:52 +00003255 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
Fred Drake5755ce62001-06-27 19:19:46 +00003256}
3257
3258void
3259PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
3260{
Nicholas Bastine5662ae2004-03-24 22:22:12 +00003261 PyThreadState *tstate = PyThreadState_GET();
Fred Drake5755ce62001-06-27 19:19:46 +00003262 PyObject *temp = tstate->c_traceobj;
3263 Py_XINCREF(arg);
3264 tstate->c_tracefunc = NULL;
3265 tstate->c_traceobj = NULL;
Brett Cannon55fa66d2005-06-25 07:07:35 +00003266 /* Must make sure that profiling is not ignored if 'temp' is freed */
Fred Drake9e3ad782001-07-03 23:39:52 +00003267 tstate->use_tracing = tstate->c_profilefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00003268 Py_XDECREF(temp);
3269 tstate->c_tracefunc = func;
3270 tstate->c_traceobj = arg;
Brett Cannon55fa66d2005-06-25 07:07:35 +00003271 /* Flag that tracing or profiling is turned on */
Fred Drake9e3ad782001-07-03 23:39:52 +00003272 tstate->use_tracing = ((func != NULL)
3273 || (tstate->c_profilefunc != NULL));
Fred Draked0838392001-06-16 21:02:31 +00003274}
3275
Guido van Rossumb209a111997-04-29 18:18:01 +00003276PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003277PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00003278{
Guido van Rossum6297a7a2003-02-19 15:53:17 +00003279 PyFrameObject *current_frame = PyEval_GetFrame();
Guido van Rossum6135a871995-01-09 17:53:26 +00003280 if (current_frame == NULL)
Nicholas Bastine5662ae2004-03-24 22:22:12 +00003281 return PyThreadState_GET()->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00003282 else
3283 return current_frame->f_builtins;
3284}
3285
Guido van Rossumb209a111997-04-29 18:18:01 +00003286PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003287PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00003288{
Guido van Rossum6297a7a2003-02-19 15:53:17 +00003289 PyFrameObject *current_frame = PyEval_GetFrame();
Guido van Rossum5b722181993-03-30 17:46:03 +00003290 if (current_frame == NULL)
3291 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00003292 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00003293 return current_frame->f_locals;
3294}
3295
Guido van Rossumb209a111997-04-29 18:18:01 +00003296PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003297PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003298{
Guido van Rossum6297a7a2003-02-19 15:53:17 +00003299 PyFrameObject *current_frame = PyEval_GetFrame();
Guido van Rossum3f5da241990-12-20 15:06:42 +00003300 if (current_frame == NULL)
3301 return NULL;
3302 else
3303 return current_frame->f_globals;
3304}
3305
Guido van Rossum6297a7a2003-02-19 15:53:17 +00003306PyFrameObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003307PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00003308{
Nicholas Bastine5662ae2004-03-24 22:22:12 +00003309 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossum6297a7a2003-02-19 15:53:17 +00003310 return _PyThreadState_GetFrame(tstate);
Guido van Rossume59214e1994-08-30 08:01:59 +00003311}
3312
Guido van Rossum6135a871995-01-09 17:53:26 +00003313int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003314PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00003315{
Guido van Rossum6297a7a2003-02-19 15:53:17 +00003316 PyFrameObject *current_frame = PyEval_GetFrame();
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003317 return current_frame == NULL ? 0 : PyFrame_IsRestricted(current_frame);
Guido van Rossum6135a871995-01-09 17:53:26 +00003318}
3319
Guido van Rossumbe270261997-05-22 22:26:18 +00003320int
Tim Peters5ba58662001-07-16 02:29:45 +00003321PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
Jeremy Hylton061d1062001-03-22 02:32:48 +00003322{
Guido van Rossum6297a7a2003-02-19 15:53:17 +00003323 PyFrameObject *current_frame = PyEval_GetFrame();
Just van Rossum3aaf42c2003-02-10 08:21:10 +00003324 int result = cf->cf_flags != 0;
Tim Peters5ba58662001-07-16 02:29:45 +00003325
3326 if (current_frame != NULL) {
3327 const int codeflags = current_frame->f_code->co_flags;
Tim Peterse2c18e92001-08-17 20:47:47 +00003328 const int compilerflags = codeflags & PyCF_MASK;
3329 if (compilerflags) {
Tim Peters5ba58662001-07-16 02:29:45 +00003330 result = 1;
Tim Peterse2c18e92001-08-17 20:47:47 +00003331 cf->cf_flags |= compilerflags;
Tim Peters5ba58662001-07-16 02:29:45 +00003332 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00003333#if 0 /* future keyword */
Martin v. Löwis7198a522002-01-01 19:59:11 +00003334 if (codeflags & CO_GENERATOR_ALLOWED) {
3335 result = 1;
3336 cf->cf_flags |= CO_GENERATOR_ALLOWED;
3337 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00003338#endif
Tim Peters5ba58662001-07-16 02:29:45 +00003339 }
3340 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00003341}
3342
Guido van Rossum3f5da241990-12-20 15:06:42 +00003343
Guido van Rossum681d79a1995-07-18 14:51:37 +00003344/* External interface to call any callable object.
3345 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003346
Guido van Rossumd7ed6831997-08-30 15:02:50 +00003347#undef PyEval_CallObject
3348/* for backward compatibility: export this interface */
3349
Guido van Rossumb209a111997-04-29 18:18:01 +00003350PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003351PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003352{
Guido van Rossumb209a111997-04-29 18:18:01 +00003353 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003354}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00003355#define PyEval_CallObject(func,arg) \
3356 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00003357
Guido van Rossumb209a111997-04-29 18:18:01 +00003358PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003359PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003360{
Jeremy Hylton52820442001-01-03 23:52:36 +00003361 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003362
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00003363 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003364 arg = PyTuple_New(0);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00003365 if (arg == NULL)
3366 return NULL;
3367 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003368 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003369 PyErr_SetString(PyExc_TypeError,
3370 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00003371 return NULL;
3372 }
3373 else
Guido van Rossumb209a111997-04-29 18:18:01 +00003374 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003375
Guido van Rossumb209a111997-04-29 18:18:01 +00003376 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003377 PyErr_SetString(PyExc_TypeError,
3378 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00003379 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00003380 return NULL;
3381 }
3382
Tim Peters6d6c1a32001-08-02 04:15:00 +00003383 result = PyObject_Call(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00003384 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00003385 return result;
3386}
3387
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00003388const char *
Tim Peters6d6c1a32001-08-02 04:15:00 +00003389PyEval_GetFuncName(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003390{
3391 if (PyMethod_Check(func))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003392 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003393 else if (PyFunction_Check(func))
3394 return PyString_AsString(((PyFunctionObject*)func)->func_name);
3395 else if (PyCFunction_Check(func))
3396 return ((PyCFunctionObject*)func)->m_ml->ml_name;
Guido van Rossum50e9fb92006-08-17 05:42:55 +00003397 else
Jeremy Hylton512a2372001-04-11 13:52:29 +00003398 return func->ob_type->tp_name;
Jeremy Hylton512a2372001-04-11 13:52:29 +00003399}
3400
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00003401const char *
Tim Peters6d6c1a32001-08-02 04:15:00 +00003402PyEval_GetFuncDesc(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003403{
3404 if (PyMethod_Check(func))
3405 return "()";
3406 else if (PyFunction_Check(func))
3407 return "()";
3408 else if (PyCFunction_Check(func))
3409 return "()";
Guido van Rossum50e9fb92006-08-17 05:42:55 +00003410 else
Jeremy Hylton512a2372001-04-11 13:52:29 +00003411 return " object";
Jeremy Hylton512a2372001-04-11 13:52:29 +00003412}
3413
Neal Norwitzaddfe0c2002-11-10 14:33:26 +00003414static void
Jeremy Hylton192690e2002-08-16 18:36:11 +00003415err_args(PyObject *func, int flags, int nargs)
3416{
3417 if (flags & METH_NOARGS)
Tim Peters8a5c3c72004-04-05 19:36:21 +00003418 PyErr_Format(PyExc_TypeError,
Guido van Rossum86c659a2002-08-23 14:11:35 +00003419 "%.200s() takes no arguments (%d given)",
Tim Peters8a5c3c72004-04-05 19:36:21 +00003420 ((PyCFunctionObject *)func)->m_ml->ml_name,
Jeremy Hylton192690e2002-08-16 18:36:11 +00003421 nargs);
3422 else
Tim Peters8a5c3c72004-04-05 19:36:21 +00003423 PyErr_Format(PyExc_TypeError,
Guido van Rossum86c659a2002-08-23 14:11:35 +00003424 "%.200s() takes exactly one argument (%d given)",
Tim Peters8a5c3c72004-04-05 19:36:21 +00003425 ((PyCFunctionObject *)func)->m_ml->ml_name,
Jeremy Hylton192690e2002-08-16 18:36:11 +00003426 nargs);
3427}
3428
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003429#define C_TRACE(x, call) \
Nicholas Bastind858a772004-06-25 23:31:06 +00003430if (tstate->use_tracing && tstate->c_profilefunc) { \
3431 if (call_trace(tstate->c_profilefunc, \
3432 tstate->c_profileobj, \
3433 tstate->frame, PyTrace_C_CALL, \
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003434 func)) { \
3435 x = NULL; \
3436 } \
3437 else { \
3438 x = call; \
3439 if (tstate->c_profilefunc != NULL) { \
3440 if (x == NULL) { \
3441 call_trace_protected(tstate->c_profilefunc, \
3442 tstate->c_profileobj, \
3443 tstate->frame, PyTrace_C_EXCEPTION, \
3444 func); \
3445 /* XXX should pass (type, value, tb) */ \
3446 } else { \
3447 if (call_trace(tstate->c_profilefunc, \
3448 tstate->c_profileobj, \
3449 tstate->frame, PyTrace_C_RETURN, \
3450 func)) { \
3451 Py_DECREF(x); \
3452 x = NULL; \
3453 } \
3454 } \
Nicholas Bastinc69ebe82004-03-24 21:57:10 +00003455 } \
Nicholas Bastind858a772004-06-25 23:31:06 +00003456 } \
3457} else { \
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003458 x = call; \
Nicholas Bastinc69ebe82004-03-24 21:57:10 +00003459 }
3460
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003461static PyObject *
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00003462call_function(PyObject ***pp_stack, int oparg
3463#ifdef WITH_TSC
3464 , uint64* pintr0, uint64* pintr1
3465#endif
3466 )
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003467{
3468 int na = oparg & 0xff;
3469 int nk = (oparg>>8) & 0xff;
3470 int n = na + 2 * nk;
3471 PyObject **pfunc = (*pp_stack) - n - 1;
3472 PyObject *func = *pfunc;
3473 PyObject *x, *w;
3474
Jeremy Hylton985eba52003-02-05 23:13:00 +00003475 /* Always dispatch PyCFunction first, because these are
3476 presumed to be the most frequent callable object.
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003477 */
3478 if (PyCFunction_Check(func) && nk == 0) {
3479 int flags = PyCFunction_GET_FLAGS(func);
Nicholas Bastind858a772004-06-25 23:31:06 +00003480 PyThreadState *tstate = PyThreadState_GET();
Raymond Hettingera7f56bc2004-06-26 04:34:33 +00003481
3482 PCALL(PCALL_CFUNCTION);
Jeremy Hylton192690e2002-08-16 18:36:11 +00003483 if (flags & (METH_NOARGS | METH_O)) {
3484 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3485 PyObject *self = PyCFunction_GET_SELF(func);
Nicholas Bastinc69ebe82004-03-24 21:57:10 +00003486 if (flags & METH_NOARGS && na == 0) {
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003487 C_TRACE(x, (*meth)(self,NULL));
Nicholas Bastinc69ebe82004-03-24 21:57:10 +00003488 }
Jeremy Hylton192690e2002-08-16 18:36:11 +00003489 else if (flags & METH_O && na == 1) {
3490 PyObject *arg = EXT_POP(*pp_stack);
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003491 C_TRACE(x, (*meth)(self,arg));
Jeremy Hylton192690e2002-08-16 18:36:11 +00003492 Py_DECREF(arg);
3493 }
3494 else {
3495 err_args(func, flags, na);
3496 x = NULL;
3497 }
3498 }
3499 else {
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003500 PyObject *callargs;
3501 callargs = load_args(pp_stack, na);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00003502 READ_TIMESTAMP(*pintr0);
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003503 C_TRACE(x, PyCFunction_Call(func,callargs,NULL));
Michael W. Hudson75eabd22005-01-18 15:56:11 +00003504 READ_TIMESTAMP(*pintr1);
Tim Peters8a5c3c72004-04-05 19:36:21 +00003505 Py_XDECREF(callargs);
3506 }
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003507 } else {
3508 if (PyMethod_Check(func) && PyMethod_GET_SELF(func) != NULL) {
3509 /* optimize access to bound methods */
3510 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton985eba52003-02-05 23:13:00 +00003511 PCALL(PCALL_METHOD);
3512 PCALL(PCALL_BOUND_METHOD);
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003513 Py_INCREF(self);
3514 func = PyMethod_GET_FUNCTION(func);
3515 Py_INCREF(func);
3516 Py_DECREF(*pfunc);
3517 *pfunc = self;
3518 na++;
3519 n++;
3520 } else
3521 Py_INCREF(func);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00003522 READ_TIMESTAMP(*pintr0);
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003523 if (PyFunction_Check(func))
3524 x = fast_function(func, pp_stack, n, na, nk);
Tim Peters8a5c3c72004-04-05 19:36:21 +00003525 else
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003526 x = do_call(func, pp_stack, na, nk);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00003527 READ_TIMESTAMP(*pintr1);
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003528 Py_DECREF(func);
3529 }
Tim Peters8a5c3c72004-04-05 19:36:21 +00003530
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003531 /* Clear the stack of the function object. Also removes
3532 the arguments in case they weren't consumed already
3533 (fast_function() and err_args() leave them on the stack).
Thomas Wouters7f597322006-03-01 05:32:33 +00003534 */
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003535 while ((*pp_stack) > pfunc) {
3536 w = EXT_POP(*pp_stack);
3537 Py_DECREF(w);
Jeremy Hylton985eba52003-02-05 23:13:00 +00003538 PCALL(PCALL_POP);
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003539 }
3540 return x;
3541}
3542
Jeremy Hylton192690e2002-08-16 18:36:11 +00003543/* The fast_function() function optimize calls for which no argument
Jeremy Hylton52820442001-01-03 23:52:36 +00003544 tuple is necessary; the objects are passed directly from the stack.
Jeremy Hylton985eba52003-02-05 23:13:00 +00003545 For the simplest case -- a function that takes only positional
3546 arguments and is called with only positional arguments -- it
3547 inlines the most primitive frame setup code from
3548 PyEval_EvalCodeEx(), which vastly reduces the checks that must be
3549 done before evaluating the frame.
Jeremy Hylton52820442001-01-03 23:52:36 +00003550*/
3551
3552static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00003553fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00003554{
Jeremy Hylton985eba52003-02-05 23:13:00 +00003555 PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003556 PyObject *globals = PyFunction_GET_GLOBALS(func);
3557 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Guido van Rossum4f72a782006-10-27 23:31:49 +00003558 PyObject *kwdefs = PyFunction_GET_KW_DEFAULTS(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003559 PyObject **d = NULL;
3560 int nd = 0;
3561
Jeremy Hylton985eba52003-02-05 23:13:00 +00003562 PCALL(PCALL_FUNCTION);
3563 PCALL(PCALL_FAST_FUNCTION);
Guido van Rossum4f72a782006-10-27 23:31:49 +00003564 if (argdefs == NULL && co->co_argcount == n &&
3565 co->co_kwonlyargcount == 0 && nk==0 &&
Jeremy Hylton985eba52003-02-05 23:13:00 +00003566 co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) {
3567 PyFrameObject *f;
3568 PyObject *retval = NULL;
3569 PyThreadState *tstate = PyThreadState_GET();
3570 PyObject **fastlocals, **stack;
3571 int i;
3572
3573 PCALL(PCALL_FASTER_FUNCTION);
3574 assert(globals != NULL);
3575 /* XXX Perhaps we should create a specialized
3576 PyFrame_New() that doesn't take locals, but does
3577 take builtins without sanity checking them.
3578 */
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00003579 assert(tstate != NULL);
Jeremy Hylton985eba52003-02-05 23:13:00 +00003580 f = PyFrame_New(tstate, co, globals, NULL);
3581 if (f == NULL)
3582 return NULL;
3583
3584 fastlocals = f->f_localsplus;
3585 stack = (*pp_stack) - n;
3586
3587 for (i = 0; i < n; i++) {
3588 Py_INCREF(*stack);
3589 fastlocals[i] = *stack++;
3590 }
Phillip J. Eby0d6615f2005-08-02 00:46:46 +00003591 retval = PyEval_EvalFrameEx(f,0);
Jeremy Hylton985eba52003-02-05 23:13:00 +00003592 ++tstate->recursion_depth;
3593 Py_DECREF(f);
3594 --tstate->recursion_depth;
3595 return retval;
3596 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003597 if (argdefs != NULL) {
3598 d = &PyTuple_GET_ITEM(argdefs, 0);
3599 nd = ((PyTupleObject *)argdefs)->ob_size;
3600 }
Jeremy Hylton985eba52003-02-05 23:13:00 +00003601 return PyEval_EvalCodeEx(co, globals,
3602 (PyObject *)NULL, (*pp_stack)-n, na,
Guido van Rossum4f72a782006-10-27 23:31:49 +00003603 (*pp_stack)-2*nk, nk, d, nd, kwdefs,
Jeremy Hylton985eba52003-02-05 23:13:00 +00003604 PyFunction_GET_CLOSURE(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00003605}
3606
3607static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00003608update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
3609 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00003610{
3611 PyObject *kwdict = NULL;
3612 if (orig_kwdict == NULL)
3613 kwdict = PyDict_New();
3614 else {
3615 kwdict = PyDict_Copy(orig_kwdict);
3616 Py_DECREF(orig_kwdict);
3617 }
3618 if (kwdict == NULL)
3619 return NULL;
Raymond Hettinger5bed4562004-04-10 23:34:17 +00003620 while (--nk >= 0) {
Jeremy Hylton52820442001-01-03 23:52:36 +00003621 int err;
3622 PyObject *value = EXT_POP(*pp_stack);
3623 PyObject *key = EXT_POP(*pp_stack);
3624 if (PyDict_GetItem(kwdict, key) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +00003625 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00003626 "%.200s%s got multiple values "
Jeremy Hylton512a2372001-04-11 13:52:29 +00003627 "for keyword argument '%.200s'",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003628 PyEval_GetFuncName(func),
3629 PyEval_GetFuncDesc(func),
Jeremy Hylton512a2372001-04-11 13:52:29 +00003630 PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00003631 Py_DECREF(key);
3632 Py_DECREF(value);
3633 Py_DECREF(kwdict);
3634 return NULL;
3635 }
3636 err = PyDict_SetItem(kwdict, key, value);
3637 Py_DECREF(key);
3638 Py_DECREF(value);
3639 if (err) {
3640 Py_DECREF(kwdict);
3641 return NULL;
3642 }
3643 }
3644 return kwdict;
3645}
3646
3647static PyObject *
3648update_star_args(int nstack, int nstar, PyObject *stararg,
3649 PyObject ***pp_stack)
3650{
3651 PyObject *callargs, *w;
3652
3653 callargs = PyTuple_New(nstack + nstar);
3654 if (callargs == NULL) {
3655 return NULL;
3656 }
3657 if (nstar) {
3658 int i;
3659 for (i = 0; i < nstar; i++) {
3660 PyObject *a = PyTuple_GET_ITEM(stararg, i);
3661 Py_INCREF(a);
3662 PyTuple_SET_ITEM(callargs, nstack + i, a);
3663 }
3664 }
Raymond Hettinger5bed4562004-04-10 23:34:17 +00003665 while (--nstack >= 0) {
Jeremy Hylton52820442001-01-03 23:52:36 +00003666 w = EXT_POP(*pp_stack);
3667 PyTuple_SET_ITEM(callargs, nstack, w);
3668 }
3669 return callargs;
3670}
3671
3672static PyObject *
3673load_args(PyObject ***pp_stack, int na)
3674{
3675 PyObject *args = PyTuple_New(na);
3676 PyObject *w;
3677
3678 if (args == NULL)
3679 return NULL;
Raymond Hettinger5bed4562004-04-10 23:34:17 +00003680 while (--na >= 0) {
Jeremy Hylton52820442001-01-03 23:52:36 +00003681 w = EXT_POP(*pp_stack);
3682 PyTuple_SET_ITEM(args, na, w);
3683 }
3684 return args;
3685}
3686
3687static PyObject *
3688do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
3689{
3690 PyObject *callargs = NULL;
3691 PyObject *kwdict = NULL;
3692 PyObject *result = NULL;
3693
3694 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003695 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003696 if (kwdict == NULL)
3697 goto call_fail;
3698 }
3699 callargs = load_args(pp_stack, na);
3700 if (callargs == NULL)
3701 goto call_fail;
Jeremy Hylton985eba52003-02-05 23:13:00 +00003702#ifdef CALL_PROFILE
3703 /* At this point, we have to look at the type of func to
3704 update the call stats properly. Do it here so as to avoid
3705 exposing the call stats machinery outside ceval.c
3706 */
3707 if (PyFunction_Check(func))
3708 PCALL(PCALL_FUNCTION);
3709 else if (PyMethod_Check(func))
3710 PCALL(PCALL_METHOD);
3711 else if (PyType_Check(func))
3712 PCALL(PCALL_TYPE);
3713 else
3714 PCALL(PCALL_OTHER);
3715#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +00003716 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003717 call_fail:
3718 Py_XDECREF(callargs);
3719 Py_XDECREF(kwdict);
3720 return result;
3721}
3722
3723static PyObject *
3724ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3725{
3726 int nstar = 0;
3727 PyObject *callargs = NULL;
3728 PyObject *stararg = NULL;
3729 PyObject *kwdict = NULL;
3730 PyObject *result = NULL;
3731
3732 if (flags & CALL_FLAG_KW) {
3733 kwdict = EXT_POP(*pp_stack);
3734 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003735 PyErr_Format(PyExc_TypeError,
Jeremy Hylton512a2372001-04-11 13:52:29 +00003736 "%s%s argument after ** "
3737 "must be a dictionary",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003738 PyEval_GetFuncName(func),
3739 PyEval_GetFuncDesc(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00003740 goto ext_call_fail;
3741 }
3742 }
3743 if (flags & CALL_FLAG_VAR) {
3744 stararg = EXT_POP(*pp_stack);
3745 if (!PyTuple_Check(stararg)) {
3746 PyObject *t = NULL;
3747 t = PySequence_Tuple(stararg);
3748 if (t == NULL) {
Jeremy Hylton512a2372001-04-11 13:52:29 +00003749 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
3750 PyErr_Format(PyExc_TypeError,
3751 "%s%s argument after * "
3752 "must be a sequence",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003753 PyEval_GetFuncName(func),
3754 PyEval_GetFuncDesc(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003755 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003756 goto ext_call_fail;
3757 }
3758 Py_DECREF(stararg);
3759 stararg = t;
3760 }
3761 nstar = PyTuple_GET_SIZE(stararg);
3762 }
3763 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003764 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003765 if (kwdict == NULL)
3766 goto ext_call_fail;
3767 }
3768 callargs = update_star_args(na, nstar, stararg, pp_stack);
3769 if (callargs == NULL)
3770 goto ext_call_fail;
Jeremy Hylton985eba52003-02-05 23:13:00 +00003771#ifdef CALL_PROFILE
3772 /* At this point, we have to look at the type of func to
3773 update the call stats properly. Do it here so as to avoid
3774 exposing the call stats machinery outside ceval.c
3775 */
3776 if (PyFunction_Check(func))
3777 PCALL(PCALL_FUNCTION);
3778 else if (PyMethod_Check(func))
3779 PCALL(PCALL_METHOD);
3780 else if (PyType_Check(func))
3781 PCALL(PCALL_TYPE);
3782 else
3783 PCALL(PCALL_OTHER);
3784#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +00003785 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003786 ext_call_fail:
3787 Py_XDECREF(callargs);
3788 Py_XDECREF(kwdict);
3789 Py_XDECREF(stararg);
3790 return result;
3791}
3792
Guido van Rossum38fff8c2006-03-07 18:50:55 +00003793/* Extract a slice index from a PyInt or PyLong or an object with the
3794 nb_index slot defined, and store in *pi.
3795 Silently reduce values larger than PY_SSIZE_T_MAX to PY_SSIZE_T_MAX,
3796 and silently boost values less than -PY_SSIZE_T_MAX-1 to -PY_SSIZE_T_MAX-1.
Martin v. Löwisdde99d22006-02-17 15:57:41 +00003797 Return 0 on error, 1 on success.
Tim Peterscb479e72001-12-16 19:11:44 +00003798*/
Tim Petersb5196382001-12-16 19:44:20 +00003799/* Note: If v is NULL, return success without storing into *pi. This
3800 is because_PyEval_SliceIndex() is called by apply_slice(), which can be
3801 called by the SLICE opcode with v and/or w equal to NULL.
Tim Peterscb479e72001-12-16 19:11:44 +00003802*/
Guido van Rossum20c6add2000-05-08 14:06:50 +00003803int
Martin v. Löwis18e16552006-02-15 17:27:45 +00003804_PyEval_SliceIndex(PyObject *v, Py_ssize_t *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003805{
Tim Petersb5196382001-12-16 19:44:20 +00003806 if (v != NULL) {
Martin v. Löwisdde99d22006-02-17 15:57:41 +00003807 Py_ssize_t x;
Guido van Rossumddefaf32007-01-14 03:31:43 +00003808 if (PyInt_CheckExact(v)) {
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00003809 /* XXX(nnorwitz): I think PyInt_AS_LONG is correct,
3810 however, it looks like it should be AsSsize_t.
3811 There should be a comment here explaining why.
3812 */
3813 x = PyInt_AS_LONG(v);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003814 }
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00003815 else if (PyIndex_Check(v)) {
3816 x = PyNumber_AsSsize_t(v, NULL);
Guido van Rossum38fff8c2006-03-07 18:50:55 +00003817 if (x == -1 && PyErr_Occurred())
3818 return 0;
3819 }
3820 else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003821 PyErr_SetString(PyExc_TypeError,
Guido van Rossum38fff8c2006-03-07 18:50:55 +00003822 "slice indices must be integers or "
3823 "None or have an __index__ method");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003824 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003825 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003826 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003827 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003828 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003829}
3830
Guido van Rossum38fff8c2006-03-07 18:50:55 +00003831#undef ISINDEX
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00003832#define ISINDEX(x) ((x) == NULL || \
3833 PyInt_Check(x) || PyLong_Check(x) || PyIndex_Check(x))
Guido van Rossum50d756e2001-08-18 17:43:36 +00003834
Guido van Rossumb209a111997-04-29 18:18:01 +00003835static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003836apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003837{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003838 PyTypeObject *tp = u->ob_type;
3839 PySequenceMethods *sq = tp->tp_as_sequence;
3840
Guido van Rossum38fff8c2006-03-07 18:50:55 +00003841 if (sq && sq->sq_slice && ISINDEX(v) && ISINDEX(w)) {
Martin v. Löwisdde99d22006-02-17 15:57:41 +00003842 Py_ssize_t ilow = 0, ihigh = PY_SSIZE_T_MAX;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003843 if (!_PyEval_SliceIndex(v, &ilow))
3844 return NULL;
3845 if (!_PyEval_SliceIndex(w, &ihigh))
3846 return NULL;
3847 return PySequence_GetSlice(u, ilow, ihigh);
3848 }
3849 else {
3850 PyObject *slice = PySlice_New(v, w, NULL);
Guido van Rossum354797c2001-12-03 19:45:06 +00003851 if (slice != NULL) {
3852 PyObject *res = PyObject_GetItem(u, slice);
3853 Py_DECREF(slice);
3854 return res;
3855 }
Guido van Rossum50d756e2001-08-18 17:43:36 +00003856 else
3857 return NULL;
3858 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003859}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003860
3861static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003862assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3863 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003864{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003865 PyTypeObject *tp = u->ob_type;
3866 PySequenceMethods *sq = tp->tp_as_sequence;
3867
Guido van Rossum38fff8c2006-03-07 18:50:55 +00003868 if (sq && sq->sq_slice && ISINDEX(v) && ISINDEX(w)) {
Martin v. Löwisdde99d22006-02-17 15:57:41 +00003869 Py_ssize_t ilow = 0, ihigh = PY_SSIZE_T_MAX;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003870 if (!_PyEval_SliceIndex(v, &ilow))
3871 return -1;
3872 if (!_PyEval_SliceIndex(w, &ihigh))
3873 return -1;
3874 if (x == NULL)
3875 return PySequence_DelSlice(u, ilow, ihigh);
3876 else
3877 return PySequence_SetSlice(u, ilow, ihigh, x);
3878 }
3879 else {
3880 PyObject *slice = PySlice_New(v, w, NULL);
3881 if (slice != NULL) {
Guido van Rossum354797c2001-12-03 19:45:06 +00003882 int res;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003883 if (x != NULL)
Guido van Rossum354797c2001-12-03 19:45:06 +00003884 res = PyObject_SetItem(u, slice, x);
Guido van Rossum50d756e2001-08-18 17:43:36 +00003885 else
Guido van Rossum354797c2001-12-03 19:45:06 +00003886 res = PyObject_DelItem(u, slice);
3887 Py_DECREF(slice);
3888 return res;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003889 }
3890 else
3891 return -1;
3892 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003893}
3894
Brett Cannon39590462007-02-26 22:01:14 +00003895#define CANNOT_CATCH_MSG "catching classes that do not inherit from"\
3896 "BaseException is not allowed"
Brett Cannonf74225d2007-02-26 21:10:16 +00003897
Guido van Rossumb209a111997-04-29 18:18:01 +00003898static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003899cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003900{
Guido van Rossumac7be682001-01-17 15:42:30 +00003901 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003902 switch (op) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00003903 case PyCmp_IS:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003904 res = (v == w);
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +00003905 break;
3906 case PyCmp_IS_NOT:
3907 res = (v != w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003908 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003909 case PyCmp_IN:
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +00003910 res = PySequence_Contains(w, v);
3911 if (res < 0)
3912 return NULL;
3913 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003914 case PyCmp_NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003915 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003916 if (res < 0)
3917 return NULL;
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +00003918 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003919 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003920 case PyCmp_EXC_MATCH:
Thomas Wouters9fe394c2007-02-05 01:24:16 +00003921 if (PyTuple_Check(w)) {
3922 Py_ssize_t i, length;
3923 length = PyTuple_Size(w);
3924 for (i = 0; i < length; i += 1) {
3925 PyObject *exc = PyTuple_GET_ITEM(w, i);
Brett Cannon39590462007-02-26 22:01:14 +00003926 if (!PyExceptionClass_Check(exc)) {
3927 PyErr_SetString(PyExc_TypeError,
3928 CANNOT_CATCH_MSG);
Brett Cannonf74225d2007-02-26 21:10:16 +00003929 return NULL;
Thomas Wouters9fe394c2007-02-05 01:24:16 +00003930 }
3931 }
3932 }
3933 else {
Brett Cannon39590462007-02-26 22:01:14 +00003934 if (!PyExceptionClass_Check(w)) {
3935 PyErr_SetString(PyExc_TypeError,
3936 CANNOT_CATCH_MSG);
Brett Cannonf74225d2007-02-26 21:10:16 +00003937 return NULL;
Thomas Wouters9fe394c2007-02-05 01:24:16 +00003938 }
3939 }
Barry Warsaw4249f541997-08-22 21:26:19 +00003940 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003941 break;
3942 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003943 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003944 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003945 v = res ? Py_True : Py_False;
3946 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003947 return v;
3948}
3949
Thomas Wouters52152252000-08-17 22:55:00 +00003950static PyObject *
3951import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003952{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003953 PyObject *x;
3954
3955 x = PyObject_GetAttr(v, name);
3956 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00003957 PyErr_Format(PyExc_ImportError,
3958 "cannot import name %.230s",
3959 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003960 }
Thomas Wouters52152252000-08-17 22:55:00 +00003961 return x;
3962}
Guido van Rossumac7be682001-01-17 15:42:30 +00003963
Thomas Wouters52152252000-08-17 22:55:00 +00003964static int
3965import_all_from(PyObject *locals, PyObject *v)
3966{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003967 PyObject *all = PyObject_GetAttrString(v, "__all__");
3968 PyObject *dict, *name, *value;
3969 int skip_leading_underscores = 0;
3970 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003971
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003972 if (all == NULL) {
3973 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3974 return -1; /* Unexpected error */
3975 PyErr_Clear();
3976 dict = PyObject_GetAttrString(v, "__dict__");
3977 if (dict == NULL) {
3978 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3979 return -1;
3980 PyErr_SetString(PyExc_ImportError,
3981 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003982 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003983 }
3984 all = PyMapping_Keys(dict);
3985 Py_DECREF(dict);
3986 if (all == NULL)
3987 return -1;
3988 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003989 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003990
3991 for (pos = 0, err = 0; ; pos++) {
3992 name = PySequence_GetItem(all, pos);
3993 if (name == NULL) {
3994 if (!PyErr_ExceptionMatches(PyExc_IndexError))
3995 err = -1;
3996 else
3997 PyErr_Clear();
3998 break;
3999 }
4000 if (skip_leading_underscores &&
4001 PyString_Check(name) &&
4002 PyString_AS_STRING(name)[0] == '_')
4003 {
4004 Py_DECREF(name);
4005 continue;
4006 }
4007 value = PyObject_GetAttr(v, name);
4008 if (value == NULL)
4009 err = -1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00004010 else if (PyDict_CheckExact(locals))
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00004011 err = PyDict_SetItem(locals, name, value);
Thomas Wouters89f507f2006-12-13 04:49:30 +00004012 else
4013 err = PyObject_SetItem(locals, name, value);
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00004014 Py_DECREF(name);
4015 Py_XDECREF(value);
4016 if (err != 0)
4017 break;
4018 }
4019 Py_DECREF(all);
4020 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00004021}
4022
Guido van Rossumac7be682001-01-17 15:42:30 +00004023static void
Paul Prescode68140d2000-08-30 20:25:01 +00004024format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
4025{
4026 char *obj_str;
4027
4028 if (!obj)
4029 return;
4030
4031 obj_str = PyString_AsString(obj);
4032 if (!obj_str)
4033 return;
4034
4035 PyErr_Format(exc, format_str, obj_str);
4036}
Guido van Rossum950361c1997-01-24 13:49:28 +00004037
Raymond Hettinger52a21b82004-08-06 18:43:09 +00004038static PyObject *
4039string_concatenate(PyObject *v, PyObject *w,
4040 PyFrameObject *f, unsigned char *next_instr)
4041{
4042 /* This function implements 'variable += expr' when both arguments
4043 are strings. */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004044 Py_ssize_t v_len = PyString_GET_SIZE(v);
4045 Py_ssize_t w_len = PyString_GET_SIZE(w);
4046 Py_ssize_t new_len = v_len + w_len;
4047 if (new_len < 0) {
4048 PyErr_SetString(PyExc_OverflowError,
4049 "strings are too large to concat");
4050 return NULL;
4051 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00004052
Raymond Hettinger52a21b82004-08-06 18:43:09 +00004053 if (v->ob_refcnt == 2) {
4054 /* In the common case, there are 2 references to the value
4055 * stored in 'variable' when the += is performed: one on the
4056 * value stack (in 'v') and one still stored in the 'variable'.
4057 * We try to delete the variable now to reduce the refcnt to 1.
4058 */
4059 switch (*next_instr) {
4060 case STORE_FAST:
4061 {
4062 int oparg = PEEKARG();
4063 PyObject **fastlocals = f->f_localsplus;
4064 if (GETLOCAL(oparg) == v)
4065 SETLOCAL(oparg, NULL);
4066 break;
4067 }
4068 case STORE_DEREF:
4069 {
Thomas Wouters477c8d52006-05-27 19:21:47 +00004070 PyObject **freevars = f->f_localsplus + f->f_code->co_nlocals;
Raymond Hettinger52a21b82004-08-06 18:43:09 +00004071 PyObject *c = freevars[PEEKARG()];
4072 if (PyCell_GET(c) == v)
4073 PyCell_Set(c, NULL);
4074 break;
4075 }
4076 case STORE_NAME:
4077 {
4078 PyObject *names = f->f_code->co_names;
4079 PyObject *name = GETITEM(names, PEEKARG());
4080 PyObject *locals = f->f_locals;
4081 if (PyDict_CheckExact(locals) &&
4082 PyDict_GetItem(locals, name) == v) {
4083 if (PyDict_DelItem(locals, name) != 0) {
4084 PyErr_Clear();
4085 }
4086 }
4087 break;
4088 }
4089 }
4090 }
4091
Armin Rigo618fbf52004-08-07 20:58:32 +00004092 if (v->ob_refcnt == 1 && !PyString_CHECK_INTERNED(v)) {
Raymond Hettinger52a21b82004-08-06 18:43:09 +00004093 /* Now we own the last reference to 'v', so we can resize it
4094 * in-place.
4095 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004096 if (_PyString_Resize(&v, new_len) != 0) {
Raymond Hettinger52a21b82004-08-06 18:43:09 +00004097 /* XXX if _PyString_Resize() fails, 'v' has been
4098 * deallocated so it cannot be put back into 'variable'.
4099 * The MemoryError is raised when there is no value in
4100 * 'variable', which might (very remotely) be a cause
4101 * of incompatibilities.
4102 */
4103 return NULL;
4104 }
4105 /* copy 'w' into the newly allocated area of 'v' */
4106 memcpy(PyString_AS_STRING(v) + v_len,
4107 PyString_AS_STRING(w), w_len);
4108 return v;
4109 }
4110 else {
4111 /* When in-place resizing is not an option. */
4112 PyString_Concat(&v, w);
4113 return v;
4114 }
4115}
4116
Guido van Rossum950361c1997-01-24 13:49:28 +00004117#ifdef DYNAMIC_EXECUTION_PROFILE
4118
Skip Montanarof118cb12001-10-15 20:51:38 +00004119static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004120getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00004121{
4122 int i;
4123 PyObject *l = PyList_New(256);
4124 if (l == NULL) return NULL;
4125 for (i = 0; i < 256; i++) {
4126 PyObject *x = PyInt_FromLong(a[i]);
4127 if (x == NULL) {
4128 Py_DECREF(l);
4129 return NULL;
4130 }
4131 PyList_SetItem(l, i, x);
4132 }
4133 for (i = 0; i < 256; i++)
4134 a[i] = 0;
4135 return l;
4136}
4137
4138PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004139_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00004140{
4141#ifndef DXPAIRS
4142 return getarray(dxp);
4143#else
4144 int i;
4145 PyObject *l = PyList_New(257);
4146 if (l == NULL) return NULL;
4147 for (i = 0; i < 257; i++) {
4148 PyObject *x = getarray(dxpairs[i]);
4149 if (x == NULL) {
4150 Py_DECREF(l);
4151 return NULL;
4152 }
4153 PyList_SetItem(l, i, x);
4154 }
4155 return l;
4156#endif
4157}
4158
4159#endif