blob: a9e37ae1fcbae0f6f72cb0ca69a56b0156963b8c [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
Fredrik Lundh7a830892006-05-27 10:39:48 +00009/* enable more aggressive intra-module optimizations, where available */
Fredrik Lundh57640f52006-05-26 11:54:04 +000010#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
Tim Peters7df5e7f2006-05-26 23:14:37 +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
Thomas Wouterse2176022007-09-20 17:35:10 +000031 section should work for GCC on any PowerPC
32 platform, irrespective of OS.
33 POWER? Who knows :-) */
Michael W. Hudson800ba232004-08-12 18:19:17 +000034
Michael W. Hudson75eabd22005-01-18 15:56:11 +000035#define READ_TIMESTAMP(var) ppc_getcounter(&var)
Michael W. Hudson800ba232004-08-12 18:19:17 +000036
Fredrik Lundh7a830892006-05-27 10:39:48 +000037static void
Michael W. Hudson800ba232004-08-12 18:19:17 +000038ppc_getcounter(uint64 *v)
39{
40 register unsigned long tbu, tb, tbu2;
41
42 loop:
43 asm volatile ("mftbu %0" : "=r" (tbu) );
44 asm volatile ("mftb %0" : "=r" (tb) );
45 asm volatile ("mftbu %0" : "=r" (tbu2));
46 if (__builtin_expect(tbu != tbu2, 0)) goto loop;
47
Tim Peters7df5e7f2006-05-26 23:14:37 +000048 /* The slightly peculiar way of writing the next lines is
Michael W. Hudson800ba232004-08-12 18:19:17 +000049 compiled better by GCC than any other way I tried. */
50 ((long*)(v))[0] = tbu;
51 ((long*)(v))[1] = tb;
52}
53
Michael W. Hudson75eabd22005-01-18 15:56:11 +000054#else /* this is for linux/x86 (and probably any other GCC/x86 combo) */
Michael W. Hudson800ba232004-08-12 18:19:17 +000055
Michael W. Hudson75eabd22005-01-18 15:56:11 +000056#define READ_TIMESTAMP(val) \
57 __asm__ __volatile__("rdtsc" : "=A" (val))
Michael W. Hudson800ba232004-08-12 18:19:17 +000058
59#endif
60
Tim Peters7df5e7f2006-05-26 23:14:37 +000061void dump_tsc(int opcode, int ticked, uint64 inst0, uint64 inst1,
Martin v. Löwisf30d60e2004-06-08 08:17:44 +000062 uint64 loop0, uint64 loop1, uint64 intr0, uint64 intr1)
63{
64 uint64 intr, inst, loop;
65 PyThreadState *tstate = PyThreadState_Get();
66 if (!tstate->interp->tscdump)
67 return;
68 intr = intr1 - intr0;
69 inst = inst1 - inst0 - intr;
70 loop = loop1 - loop0 - intr;
71 fprintf(stderr, "opcode=%03d t=%d inst=%06lld loop=%06lld\n",
72 opcode, ticked, inst, loop);
73}
Michael W. Hudson800ba232004-08-12 18:19:17 +000074
Martin v. Löwisf30d60e2004-06-08 08:17:44 +000075#endif
76
Guido van Rossum04691fc1992-08-12 15:35:34 +000077/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000078/* #define CASE_TOO_BIG 1 */
Guido van Rossum04691fc1992-08-12 15:35:34 +000079
Guido van Rossum408027e1996-12-30 16:17:54 +000080#ifdef Py_DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000081/* For debugging the interpreter: */
82#define LLTRACE 1 /* Low-level trace feature */
83#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000084#endif
85
Jeremy Hylton52820442001-01-03 23:52:36 +000086typedef PyObject *(*callproc)(PyObject *, PyObject *, PyObject *);
Guido van Rossum5b722181993-03-30 17:46:03 +000087
Guido van Rossum374a9221991-04-04 10:40:29 +000088/* Forward declarations */
Martin v. Löwisf30d60e2004-06-08 08:17:44 +000089#ifdef WITH_TSC
Fredrik Lundh7a830892006-05-27 10:39:48 +000090static PyObject * call_function(PyObject ***, int, uint64*, uint64*);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +000091#else
Fredrik Lundh7a830892006-05-27 10:39:48 +000092static PyObject * call_function(PyObject ***, int);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +000093#endif
Fredrik Lundh7a830892006-05-27 10:39:48 +000094static PyObject * fast_function(PyObject *, PyObject ***, int, int, int);
95static PyObject * do_call(PyObject *, PyObject ***, int, int);
96static PyObject * ext_do_call(PyObject *, PyObject ***, int, int, int);
Thomas Wouterse2176022007-09-20 17:35:10 +000097static PyObject * update_keyword_args(PyObject *, int, PyObject ***,
98 PyObject *);
Fredrik Lundh7a830892006-05-27 10:39:48 +000099static PyObject * update_star_args(int, int, PyObject *, PyObject ***);
100static PyObject * load_args(PyObject ***, int);
Jeremy Hylton52820442001-01-03 23:52:36 +0000101#define CALL_FLAG_VAR 1
102#define CALL_FLAG_KW 2
103
Guido van Rossum0a066c01992-03-27 17:29:15 +0000104#ifdef LLTRACE
Fredrik Lundh1b949402006-05-26 12:01:49 +0000105static int lltrace;
Fredrik Lundh7a830892006-05-27 10:39:48 +0000106static int prtrace(PyObject *, char *);
Guido van Rossum0a066c01992-03-27 17:29:15 +0000107#endif
Fredrik Lundh7a830892006-05-27 10:39:48 +0000108static int call_trace(Py_tracefunc, PyObject *, PyFrameObject *,
Fred Drake5755ce62001-06-27 19:19:46 +0000109 int, PyObject *);
Amaury Forgeot d'Arc0d75f092007-11-13 21:54:28 +0000110static int call_trace_protected(Py_tracefunc, PyObject *,
Armin Rigo1c2d7e52005-09-20 18:34:01 +0000111 PyFrameObject *, int, PyObject *);
Fredrik Lundh7a830892006-05-27 10:39:48 +0000112static void call_exc_trace(Py_tracefunc, PyObject *, PyFrameObject *);
113static int maybe_call_line_trace(Py_tracefunc, PyObject *,
Armin Rigobf57a142004-03-22 19:24:58 +0000114 PyFrameObject *, int *, int *, int *);
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000115
Fredrik Lundh7a830892006-05-27 10:39:48 +0000116static PyObject * apply_slice(PyObject *, PyObject *, PyObject *);
117static int assign_slice(PyObject *, PyObject *,
Tim Petersdbd9ba62000-07-09 03:09:57 +0000118 PyObject *, PyObject *);
Fredrik Lundh7a830892006-05-27 10:39:48 +0000119static PyObject * cmp_outcome(int, PyObject *, PyObject *);
120static PyObject * import_from(PyObject *, PyObject *);
121static int import_all_from(PyObject *, PyObject *);
122static PyObject * build_class(PyObject *, PyObject *, PyObject *);
123static int exec_statement(PyFrameObject *,
Tim Petersdbd9ba62000-07-09 03:09:57 +0000124 PyObject *, PyObject *, PyObject *);
Fredrik Lundh7a830892006-05-27 10:39:48 +0000125static void set_exc_info(PyThreadState *, PyObject *, PyObject *, PyObject *);
126static void reset_exc_info(PyThreadState *);
127static void format_exc_check_arg(PyObject *, char *, PyObject *);
128static PyObject * string_concatenate(PyObject *, PyObject *,
Raymond Hettinger52a21b82004-08-06 18:43:09 +0000129 PyFrameObject *, unsigned char *);
Guido van Rossum374a9221991-04-04 10:40:29 +0000130
Paul Prescode68140d2000-08-30 20:25:01 +0000131#define NAME_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +0000132 "name '%.200s' is not defined"
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000133#define GLOBAL_NAME_ERROR_MSG \
134 "global name '%.200s' is not defined"
Paul Prescode68140d2000-08-30 20:25:01 +0000135#define UNBOUNDLOCAL_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +0000136 "local variable '%.200s' referenced before assignment"
Jeremy Hyltonc76770c2001-04-13 16:51:46 +0000137#define UNBOUNDFREE_ERROR_MSG \
138 "free variable '%.200s' referenced before assignment" \
139 " in enclosing scope"
Guido van Rossum374a9221991-04-04 10:40:29 +0000140
Guido van Rossum950361c1997-01-24 13:49:28 +0000141/* Dynamic execution profile */
142#ifdef DYNAMIC_EXECUTION_PROFILE
143#ifdef DXPAIRS
144static long dxpairs[257][256];
145#define dxp dxpairs[256]
146#else
147static long dxp[256];
148#endif
149#endif
150
Jeremy Hylton985eba52003-02-05 23:13:00 +0000151/* Function call profile */
152#ifdef CALL_PROFILE
153#define PCALL_NUM 11
154static int pcall[PCALL_NUM];
155
156#define PCALL_ALL 0
157#define PCALL_FUNCTION 1
158#define PCALL_FAST_FUNCTION 2
159#define PCALL_FASTER_FUNCTION 3
160#define PCALL_METHOD 4
161#define PCALL_BOUND_METHOD 5
162#define PCALL_CFUNCTION 6
163#define PCALL_TYPE 7
164#define PCALL_GENERATOR 8
165#define PCALL_OTHER 9
166#define PCALL_POP 10
167
168/* Notes about the statistics
169
170 PCALL_FAST stats
171
172 FAST_FUNCTION means no argument tuple needs to be created.
173 FASTER_FUNCTION means that the fast-path frame setup code is used.
174
175 If there is a method call where the call can be optimized by changing
176 the argument tuple and calling the function directly, it gets recorded
177 twice.
178
179 As a result, the relationship among the statistics appears to be
180 PCALL_ALL == PCALL_FUNCTION + PCALL_METHOD - PCALL_BOUND_METHOD +
181 PCALL_CFUNCTION + PCALL_TYPE + PCALL_GENERATOR + PCALL_OTHER
182 PCALL_FUNCTION > PCALL_FAST_FUNCTION > PCALL_FASTER_FUNCTION
183 PCALL_METHOD > PCALL_BOUND_METHOD
184*/
185
186#define PCALL(POS) pcall[POS]++
187
188PyObject *
189PyEval_GetCallStats(PyObject *self)
190{
Andrew M. Kuchling1f3ebe02006-10-27 13:22:46 +0000191 return Py_BuildValue("iiiiiiiiiii",
Jeremy Hylton985eba52003-02-05 23:13:00 +0000192 pcall[0], pcall[1], pcall[2], pcall[3],
193 pcall[4], pcall[5], pcall[6], pcall[7],
Andrew M. Kuchling1f3ebe02006-10-27 13:22:46 +0000194 pcall[8], pcall[9], pcall[10]);
Jeremy Hylton985eba52003-02-05 23:13:00 +0000195}
196#else
197#define PCALL(O)
198
199PyObject *
200PyEval_GetCallStats(PyObject *self)
201{
202 Py_INCREF(Py_None);
203 return Py_None;
204}
205#endif
206
Tim Peters5ca576e2001-06-18 22:08:13 +0000207
Guido van Rossume59214e1994-08-30 08:01:59 +0000208#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000209
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +0000210#ifdef HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000211#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +0000212#endif
Guido van Rossum49b56061998-10-01 20:42:43 +0000213#include "pythread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000214
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000215static PyThread_type_lock interpreter_lock = 0; /* This is the GIL */
Guido van Rossuma9672091994-09-14 13:31:22 +0000216static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000217
Tim Peters7f468f22004-10-11 02:40:51 +0000218int
219PyEval_ThreadsInitialized(void)
220{
221 return interpreter_lock != 0;
222}
223
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000224void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000225PyEval_InitThreads(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000226{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000227 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000228 return;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000229 interpreter_lock = PyThread_allocate_lock();
230 PyThread_acquire_lock(interpreter_lock, 1);
231 main_thread = PyThread_get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000232}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000233
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000234void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000235PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000236{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000237 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000238}
239
240void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000241PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000242{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000243 PyThread_release_lock(interpreter_lock);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000244}
245
246void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000247PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000248{
249 if (tstate == NULL)
250 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000251 /* Check someone has called PyEval_InitThreads() to create the lock */
252 assert(interpreter_lock);
Guido van Rossum65d5b571998-12-21 19:32:43 +0000253 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000254 if (PyThreadState_Swap(tstate) != NULL)
255 Py_FatalError(
256 "PyEval_AcquireThread: non-NULL old thread state");
257}
258
259void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000260PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000261{
262 if (tstate == NULL)
263 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
264 if (PyThreadState_Swap(NULL) != tstate)
265 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000266 PyThread_release_lock(interpreter_lock);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000267}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000268
269/* This function is called from PyOS_AfterFork to ensure that newly
270 created child processes don't hold locks referring to threads which
271 are not running in the child process. (This could also be done using
272 pthread_atfork mechanism, at least for the pthreads implementation.) */
273
274void
275PyEval_ReInitThreads(void)
276{
277 if (!interpreter_lock)
278 return;
279 /*XXX Can't use PyThread_free_lock here because it does too
280 much error-checking. Doing this cleanly would require
281 adding a new function to each thread_*.h. Instead, just
282 create a new lock and waste a little bit of memory */
283 interpreter_lock = PyThread_allocate_lock();
284 PyThread_acquire_lock(interpreter_lock, 1);
285 main_thread = PyThread_get_thread_ident();
286}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000287#endif
288
Guido van Rossumff4949e1992-08-05 19:58:53 +0000289/* Functions save_thread and restore_thread are always defined so
290 dynamically loaded modules needn't be compiled separately for use
291 with and without threads: */
292
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000293PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000294PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000295{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000296 PyThreadState *tstate = PyThreadState_Swap(NULL);
297 if (tstate == NULL)
298 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000299#ifdef WITH_THREAD
Guido van Rossumb74eca91997-09-30 22:03:16 +0000300 if (interpreter_lock)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000301 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000302#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000303 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000304}
305
306void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000307PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000308{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000309 if (tstate == NULL)
310 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000311#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000312 if (interpreter_lock) {
Guido van Rossumb74eca91997-09-30 22:03:16 +0000313 int err = errno;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000314 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000315 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000316 }
317#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000318 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000319}
320
321
Guido van Rossuma9672091994-09-14 13:31:22 +0000322/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
323 signal handlers or Mac I/O completion routines) can schedule calls
324 to a function to be called synchronously.
325 The synchronous function is called with one void* argument.
326 It should return 0 for success or -1 for failure -- failure should
327 be accompanied by an exception.
328
329 If registry succeeds, the registry function returns 0; if it fails
330 (e.g. due to too many pending calls) it returns -1 (without setting
331 an exception condition).
332
333 Note that because registry may occur from within signal handlers,
334 or other asynchronous events, calling malloc() is unsafe!
335
336#ifdef WITH_THREAD
337 Any thread can schedule pending calls, but only the main thread
338 will execute them.
339#endif
340
341 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
342 There are two possible race conditions:
343 (1) nested asynchronous registry calls;
344 (2) registry calls made while pending calls are being processed.
345 While (1) is very unlikely, (2) is a real possibility.
346 The current code is safe against (2), but not against (1).
347 The safety against (2) is derived from the fact that only one
348 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000349
Guido van Rossuma027efa1997-05-05 20:56:21 +0000350 XXX Darn! With the advent of thread state, we should have an array
351 of pending calls per thread in the thread state! Later...
352*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000353
Guido van Rossuma9672091994-09-14 13:31:22 +0000354#define NPENDINGCALLS 32
355static struct {
Thomas Wouters334fb892000-07-25 12:56:38 +0000356 int (*func)(void *);
357 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000358} pendingcalls[NPENDINGCALLS];
359static volatile int pendingfirst = 0;
360static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000361static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000362
363int
Thomas Wouters334fb892000-07-25 12:56:38 +0000364Py_AddPendingCall(int (*func)(void *), void *arg)
Guido van Rossuma9672091994-09-14 13:31:22 +0000365{
Michael W. Hudson30ea2f22004-07-07 17:44:12 +0000366 static volatile int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000367 int i, j;
368 /* XXX Begin critical section */
369 /* XXX If you want this to be safe against nested
370 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000371 if (busy)
372 return -1;
373 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000374 i = pendinglast;
375 j = (i + 1) % NPENDINGCALLS;
Guido van Rossum04e70322002-07-17 16:57:13 +0000376 if (j == pendingfirst) {
377 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000378 return -1; /* Queue full */
Guido van Rossum04e70322002-07-17 16:57:13 +0000379 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000380 pendingcalls[i].func = func;
381 pendingcalls[i].arg = arg;
382 pendinglast = j;
Skip Montanarod581d772002-09-03 20:10:45 +0000383
384 _Py_Ticker = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000385 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000386 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000387 /* XXX End critical section */
388 return 0;
389}
390
Guido van Rossum180d7b41994-09-29 09:45:57 +0000391int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000392Py_MakePendingCalls(void)
Guido van Rossuma9672091994-09-14 13:31:22 +0000393{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000394 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000395#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000396 if (main_thread && PyThread_get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000397 return 0;
398#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000399 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000400 return 0;
401 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000402 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000403 for (;;) {
404 int i;
Thomas Wouters334fb892000-07-25 12:56:38 +0000405 int (*func)(void *);
406 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000407 i = pendingfirst;
408 if (i == pendinglast)
409 break; /* Queue empty */
410 func = pendingcalls[i].func;
411 arg = pendingcalls[i].arg;
412 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000413 if (func(arg) < 0) {
414 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000415 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000416 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000417 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000418 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000419 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000420 return 0;
421}
422
423
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000424/* The interpreter's recursion limit */
425
Hye-Shik Changb6fa2812005-04-04 15:49:02 +0000426#ifndef Py_DEFAULT_RECURSION_LIMIT
427#define Py_DEFAULT_RECURSION_LIMIT 1000
428#endif
429static int recursion_limit = Py_DEFAULT_RECURSION_LIMIT;
430int _Py_CheckRecursionLimit = Py_DEFAULT_RECURSION_LIMIT;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000431
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000432int
433Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000434{
435 return recursion_limit;
436}
437
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000438void
439Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000440{
441 recursion_limit = new_limit;
Thomas Woutersae406c62007-09-19 17:27:43 +0000442 _Py_CheckRecursionLimit = recursion_limit;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000443}
444
Armin Rigo2b3eb402003-10-28 12:05:48 +0000445/* the macro Py_EnterRecursiveCall() only calls _Py_CheckRecursiveCall()
446 if the recursion_depth reaches _Py_CheckRecursionLimit.
447 If USE_STACKCHECK, the macro decrements _Py_CheckRecursionLimit
448 to guarantee that _Py_CheckRecursiveCall() is regularly called.
449 Without USE_STACKCHECK, there is no need for this. */
450int
451_Py_CheckRecursiveCall(char *where)
452{
453 PyThreadState *tstate = PyThreadState_GET();
454
455#ifdef USE_STACKCHECK
456 if (PyOS_CheckStack()) {
457 --tstate->recursion_depth;
458 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
459 return -1;
460 }
461#endif
462 if (tstate->recursion_depth > recursion_limit) {
463 --tstate->recursion_depth;
464 PyErr_Format(PyExc_RuntimeError,
465 "maximum recursion depth exceeded%s",
466 where);
467 return -1;
468 }
Thomas Woutersae406c62007-09-19 17:27:43 +0000469 _Py_CheckRecursionLimit = recursion_limit;
Armin Rigo2b3eb402003-10-28 12:05:48 +0000470 return 0;
471}
472
Guido van Rossum374a9221991-04-04 10:40:29 +0000473/* Status code for main loop (reason for stack unwind) */
Raymond Hettinger7c958652004-04-06 10:11:10 +0000474enum why_code {
475 WHY_NOT = 0x0001, /* No error */
476 WHY_EXCEPTION = 0x0002, /* Exception occurred */
477 WHY_RERAISE = 0x0004, /* Exception re-raised by 'finally' */
478 WHY_RETURN = 0x0008, /* 'return' statement */
479 WHY_BREAK = 0x0010, /* 'break' statement */
480 WHY_CONTINUE = 0x0020, /* 'continue' statement */
481 WHY_YIELD = 0x0040 /* 'yield' operator */
482};
Guido van Rossum374a9221991-04-04 10:40:29 +0000483
Fredrik Lundh7a830892006-05-27 10:39:48 +0000484static enum why_code do_raise(PyObject *, PyObject *, PyObject *);
485static int unpack_iterable(PyObject *, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000486
Skip Montanarod581d772002-09-03 20:10:45 +0000487/* for manipulating the thread switch and periodic "stuff" - used to be
488 per thread, now just a pair o' globals */
Skip Montanaro99dba272002-09-03 20:19:06 +0000489int _Py_CheckInterval = 100;
490volatile int _Py_Ticker = 100;
Guido van Rossum374a9221991-04-04 10:40:29 +0000491
Guido van Rossumb209a111997-04-29 18:18:01 +0000492PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000493PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000494{
Tim Peters6d6c1a32001-08-02 04:15:00 +0000495 return PyEval_EvalCodeEx(co,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000496 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000497 (PyObject **)NULL, 0,
498 (PyObject **)NULL, 0,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000499 (PyObject **)NULL, 0,
500 NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000501}
502
503
504/* Interpreter main loop */
505
Martin v. Löwis8d97e332004-06-27 15:43:12 +0000506PyObject *
Phillip J. Eby0d6615f2005-08-02 00:46:46 +0000507PyEval_EvalFrame(PyFrameObject *f) {
508 /* This is for backward compatibility with extension modules that
Thomas Wouterse2176022007-09-20 17:35:10 +0000509 used this API; core interpreter code should call
510 PyEval_EvalFrameEx() */
Phillip J. Eby0d6615f2005-08-02 00:46:46 +0000511 return PyEval_EvalFrameEx(f, 0);
512}
513
514PyObject *
Anthony Baxtera863d332006-04-11 07:43:46 +0000515PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
Guido van Rossum374a9221991-04-04 10:40:29 +0000516{
Guido van Rossum950361c1997-01-24 13:49:28 +0000517#ifdef DXPAIRS
518 int lastopcode = 0;
519#endif
Thomas Wouterse2176022007-09-20 17:35:10 +0000520 register PyObject **stack_pointer; /* Next free slot in value stack */
Guido van Rossum374a9221991-04-04 10:40:29 +0000521 register unsigned char *next_instr;
Armin Rigo8817fcd2004-06-17 10:22:40 +0000522 register int opcode; /* Current opcode */
523 register int oparg; /* Current opcode argument, if any */
Raymond Hettinger7c958652004-04-06 10:11:10 +0000524 register enum why_code why; /* Reason for block stack unwind */
Guido van Rossum374a9221991-04-04 10:40:29 +0000525 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000526 register PyObject *x; /* Result object -- NULL if error */
527 register PyObject *v; /* Temporary objects popped off stack */
528 register PyObject *w;
529 register PyObject *u;
530 register PyObject *t;
Barry Warsaw23c9ec82000-08-21 15:44:01 +0000531 register PyObject *stream = NULL; /* for PRINT opcodes */
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000532 register PyObject **fastlocals, **freevars;
Guido van Rossum014518f1998-11-23 21:09:51 +0000533 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000534 PyThreadState *tstate = PyThreadState_GET();
Tim Peters5ca576e2001-06-18 22:08:13 +0000535 PyCodeObject *co;
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000536
Tim Peters8a5c3c72004-04-05 19:36:21 +0000537 /* when tracing we set things up so that
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000538
539 not (instr_lb <= current_bytecode_offset < instr_ub)
540
Tim Peters8a5c3c72004-04-05 19:36:21 +0000541 is true when the line being executed has changed. The
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000542 initial values are such as to make this false the first
543 time it is tested. */
Armin Rigobf57a142004-03-22 19:24:58 +0000544 int instr_ub = -1, instr_lb = 0, instr_prev = -1;
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000545
Guido van Rossumd076c731998-10-07 19:42:25 +0000546 unsigned char *first_instr;
Skip Montanaro04d80f82002-08-04 21:03:35 +0000547 PyObject *names;
548 PyObject *consts;
Neal Norwitz5f5153e2005-10-21 04:28:38 +0000549#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000550 /* Make it easier to find out where we are with a debugger */
Tim Peters5ca576e2001-06-18 22:08:13 +0000551 char *filename;
Guido van Rossum99bec951992-09-03 20:29:45 +0000552#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000553
Neal Norwitza81d2202002-07-14 00:27:26 +0000554/* Tuple access macros */
555
556#ifndef Py_DEBUG
557#define GETITEM(v, i) PyTuple_GET_ITEM((PyTupleObject *)(v), (i))
558#else
559#define GETITEM(v, i) PyTuple_GetItem((v), (i))
560#endif
561
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000562#ifdef WITH_TSC
563/* Use Pentium timestamp counter to mark certain events:
564 inst0 -- beginning of switch statement for opcode dispatch
565 inst1 -- end of switch statement (may be skipped)
566 loop0 -- the top of the mainloop
Tim Peters7df5e7f2006-05-26 23:14:37 +0000567 loop1 -- place where control returns again to top of mainloop
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000568 (may be skipped)
569 intr1 -- beginning of long interruption
570 intr2 -- end of long interruption
571
572 Many opcodes call out to helper C functions. In some cases, the
573 time in those functions should be counted towards the time for the
574 opcode, but not in all cases. For example, a CALL_FUNCTION opcode
575 calls another Python function; there's no point in charge all the
576 bytecode executed by the called function to the caller.
577
578 It's hard to make a useful judgement statically. In the presence
579 of operator overloading, it's impossible to tell if a call will
580 execute new Python code or not.
581
582 It's a case-by-case judgement. I'll use intr1 for the following
583 cases:
584
585 EXEC_STMT
586 IMPORT_STAR
587 IMPORT_FROM
588 CALL_FUNCTION (and friends)
589
590 */
591 uint64 inst0, inst1, loop0, loop1, intr0 = 0, intr1 = 0;
592 int ticked = 0;
593
Michael W. Hudson75eabd22005-01-18 15:56:11 +0000594 READ_TIMESTAMP(inst0);
595 READ_TIMESTAMP(inst1);
596 READ_TIMESTAMP(loop0);
597 READ_TIMESTAMP(loop1);
Michael W. Hudson800ba232004-08-12 18:19:17 +0000598
599 /* shut up the compiler */
600 opcode = 0;
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000601#endif
602
Guido van Rossum374a9221991-04-04 10:40:29 +0000603/* Code access macros */
604
Martin v. Löwis18e16552006-02-15 17:27:45 +0000605#define INSTR_OFFSET() ((int)(next_instr - first_instr))
Guido van Rossum374a9221991-04-04 10:40:29 +0000606#define NEXTOP() (*next_instr++)
Raymond Hettinger5bed4562004-04-10 23:34:17 +0000607#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Raymond Hettinger52a21b82004-08-06 18:43:09 +0000608#define PEEKARG() ((next_instr[2]<<8) + next_instr[1])
Guido van Rossumd076c731998-10-07 19:42:25 +0000609#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000610#define JUMPBY(x) (next_instr += (x))
611
Raymond Hettingerf606f872003-03-16 03:11:04 +0000612/* OpCode prediction macros
Thomas Wouterse2176022007-09-20 17:35:10 +0000613 Some opcodes tend to come in pairs thus making it possible to
614 predict the second code when the first is run. For example,
615 COMPARE_OP is often followed by JUMP_IF_FALSE or JUMP_IF_TRUE. And,
616 those opcodes are often followed by a POP_TOP.
Raymond Hettingerf606f872003-03-16 03:11:04 +0000617
Raymond Hettingerafae11e2008-07-05 02:11:55 +0000618 Verifying the prediction costs a single high-speed test of a register
Raymond Hettingerac2072922003-03-16 15:41:11 +0000619 variable against a constant. If the pairing was good, then the
Raymond Hettingerafae11e2008-07-05 02:11:55 +0000620 processor's own internal branch predication has a high likelihood of
621 success, resulting in a nearly zero-overhead transition to the
622 next opcode. A successful prediction saves a trip through the eval-loop
623 including its two unpredictable branches, the HAS_ARG test and the
624 switch-case. Combined with the processor's internal branch prediction,
625 a successful PREDICT has the effect of making the two opcodes run as if
626 they were a single new opcode with the bodies combined.
Raymond Hettingerf606f872003-03-16 03:11:04 +0000627
Raymond Hettingerafae11e2008-07-05 02:11:55 +0000628 If collecting opcode statistics, your choices are to either keep the
629 predictions turned-on and interpret the results as if some opcodes
630 had been combined or turn-off predictions so that the opcode frequency
631 counter updates for both opcodes.
Raymond Hettingerf606f872003-03-16 03:11:04 +0000632*/
633
Raymond Hettingera7216982004-02-08 19:59:27 +0000634#ifdef DYNAMIC_EXECUTION_PROFILE
635#define PREDICT(op) if (0) goto PRED_##op
636#else
Raymond Hettingerac2072922003-03-16 15:41:11 +0000637#define PREDICT(op) if (*next_instr == op) goto PRED_##op
Raymond Hettingera7216982004-02-08 19:59:27 +0000638#endif
639
Raymond Hettingerf606f872003-03-16 03:11:04 +0000640#define PREDICTED(op) PRED_##op: next_instr++
Raymond Hettinger52a21b82004-08-06 18:43:09 +0000641#define PREDICTED_WITH_ARG(op) PRED_##op: oparg = PEEKARG(); next_instr += 3
Raymond Hettingerf606f872003-03-16 03:11:04 +0000642
Guido van Rossum374a9221991-04-04 10:40:29 +0000643/* Stack manipulation macros */
644
Martin v. Löwis18e16552006-02-15 17:27:45 +0000645/* The stack can grow at most MAXINT deep, as co_nlocals and
646 co_stacksize are ints. */
647#define STACK_LEVEL() ((int)(stack_pointer - f->f_valuestack))
Guido van Rossum374a9221991-04-04 10:40:29 +0000648#define EMPTY() (STACK_LEVEL() == 0)
649#define TOP() (stack_pointer[-1])
Raymond Hettinger663004b2003-01-09 15:24:30 +0000650#define SECOND() (stack_pointer[-2])
651#define THIRD() (stack_pointer[-3])
652#define FOURTH() (stack_pointer[-4])
Raymond Hettinger663004b2003-01-09 15:24:30 +0000653#define SET_TOP(v) (stack_pointer[-1] = (v))
654#define SET_SECOND(v) (stack_pointer[-2] = (v))
655#define SET_THIRD(v) (stack_pointer[-3] = (v))
656#define SET_FOURTH(v) (stack_pointer[-4] = (v))
Raymond Hettinger663004b2003-01-09 15:24:30 +0000657#define BASIC_STACKADJ(n) (stack_pointer += n)
Guido van Rossum374a9221991-04-04 10:40:29 +0000658#define BASIC_PUSH(v) (*stack_pointer++ = (v))
659#define BASIC_POP() (*--stack_pointer)
660
Guido van Rossum96a42c81992-01-12 02:29:51 +0000661#ifdef LLTRACE
Jeremy Hylton14368152001-10-17 13:29:30 +0000662#define PUSH(v) { (void)(BASIC_PUSH(v), \
663 lltrace && prtrace(TOP(), "push")); \
Richard Jonescebbefc2006-05-23 18:28:17 +0000664 assert(STACK_LEVEL() <= co->co_stacksize); }
Thomas Wouterse2176022007-09-20 17:35:10 +0000665#define POP() ((void)(lltrace && prtrace(TOP(), "pop")), \
666 BASIC_POP())
Raymond Hettinger663004b2003-01-09 15:24:30 +0000667#define STACKADJ(n) { (void)(BASIC_STACKADJ(n), \
668 lltrace && prtrace(TOP(), "stackadj")); \
Richard Jonescebbefc2006-05-23 18:28:17 +0000669 assert(STACK_LEVEL() <= co->co_stacksize); }
Christian Heimes52729ac2007-12-14 02:33:57 +0000670#define EXT_POP(STACK_POINTER) ((void)(lltrace && \
671 prtrace((STACK_POINTER)[-1], "ext_pop")), \
672 *--(STACK_POINTER))
Guido van Rossum374a9221991-04-04 10:40:29 +0000673#else
674#define PUSH(v) BASIC_PUSH(v)
675#define POP() BASIC_POP()
Raymond Hettinger663004b2003-01-09 15:24:30 +0000676#define STACKADJ(n) BASIC_STACKADJ(n)
Guido van Rossumc2e20742006-02-27 22:32:47 +0000677#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
Guido van Rossum374a9221991-04-04 10:40:29 +0000678#endif
679
Guido van Rossum681d79a1995-07-18 14:51:37 +0000680/* Local variable macros */
681
682#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumcfbf1a32002-03-28 20:17:52 +0000683
684/* The SETLOCAL() macro must not DECREF the local variable in-place and
685 then store the new value; it must copy the old value to a temporary
686 value, then store the new value, and then DECREF the temporary value.
687 This is because it is possible that during the DECREF the frame is
688 accessed by other code (e.g. a __del__ method or gc.collect()) and the
689 variable would be pointing to already-freed memory. */
690#define SETLOCAL(i, value) do { PyObject *tmp = GETLOCAL(i); \
691 GETLOCAL(i) = value; \
692 Py_XDECREF(tmp); } while (0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000693
Guido van Rossuma027efa1997-05-05 20:56:21 +0000694/* Start of code */
695
Tim Peters5ca576e2001-06-18 22:08:13 +0000696 if (f == NULL)
697 return NULL;
698
Armin Rigo1d313ab2003-10-25 14:33:09 +0000699 /* push frame */
Armin Rigo2b3eb402003-10-28 12:05:48 +0000700 if (Py_EnterRecursiveCall(""))
Armin Rigo1d313ab2003-10-25 14:33:09 +0000701 return NULL;
Guido van Rossum8861b741996-07-30 16:49:37 +0000702
Tim Peters5ca576e2001-06-18 22:08:13 +0000703 tstate->frame = f;
Tim Peters5ca576e2001-06-18 22:08:13 +0000704
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000705 if (tstate->use_tracing) {
706 if (tstate->c_tracefunc != NULL) {
707 /* tstate->c_tracefunc, if defined, is a
708 function that will be called on *every* entry
709 to a code block. Its return value, if not
710 None, is a function that will be called at
711 the start of each executed line of code.
712 (Actually, the function must return itself
713 in order to continue tracing.) The trace
714 functions are called with three arguments:
715 a pointer to the current frame, a string
716 indicating why the function is called, and
717 an argument which depends on the situation.
718 The global trace function is also called
719 whenever an exception is detected. */
Amaury Forgeot d'Arc0d75f092007-11-13 21:54:28 +0000720 if (call_trace_protected(tstate->c_tracefunc,
721 tstate->c_traceobj,
722 f, PyTrace_CALL, Py_None)) {
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000723 /* Trace function raised an error */
Armin Rigo2b3eb402003-10-28 12:05:48 +0000724 goto exit_eval_frame;
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000725 }
726 }
727 if (tstate->c_profilefunc != NULL) {
728 /* Similar for c_profilefunc, except it needn't
729 return itself and isn't called for "line" events */
Amaury Forgeot d'Arc0d75f092007-11-13 21:54:28 +0000730 if (call_trace_protected(tstate->c_profilefunc,
731 tstate->c_profileobj,
732 f, PyTrace_CALL, Py_None)) {
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000733 /* Profile function raised an error */
Armin Rigo2b3eb402003-10-28 12:05:48 +0000734 goto exit_eval_frame;
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000735 }
736 }
737 }
738
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000739 co = f->f_code;
740 names = co->co_names;
741 consts = co->co_consts;
742 fastlocals = f->f_localsplus;
Richard Jonescebbefc2006-05-23 18:28:17 +0000743 freevars = f->f_localsplus + co->co_nlocals;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000744 first_instr = (unsigned char*) PyString_AS_STRING(co->co_code);
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000745 /* An explanation is in order for the next line.
746
747 f->f_lasti now refers to the index of the last instruction
748 executed. You might think this was obvious from the name, but
749 this wasn't always true before 2.3! PyFrame_New now sets
750 f->f_lasti to -1 (i.e. the index *before* the first instruction)
751 and YIELD_VALUE doesn't fiddle with f_lasti any more. So this
Raymond Hettinger4bd97d42007-01-06 01:14:41 +0000752 does work. Promise.
753
754 When the PREDICT() macros are enabled, some opcode pairs follow in
755 direct succession without updating f->f_lasti. A successful
756 prediction effectively links the two codes together as if they
757 were a single new opcode; accordingly,f->f_lasti will point to
758 the first code in the pair (for instance, GET_ITER followed by
759 FOR_ITER is effectively a single opcode and f->f_lasti will point
760 at to the beginning of the combined pair.)
761 */
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000762 next_instr = first_instr + f->f_lasti + 1;
763 stack_pointer = f->f_stacktop;
764 assert(stack_pointer != NULL);
765 f->f_stacktop = NULL; /* remains NULL unless yield suspends frame */
766
Tim Peters5ca576e2001-06-18 22:08:13 +0000767#ifdef LLTRACE
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000768 lltrace = PyDict_GetItemString(f->f_globals, "__lltrace__") != NULL;
Tim Peters5ca576e2001-06-18 22:08:13 +0000769#endif
Neal Norwitz5f5153e2005-10-21 04:28:38 +0000770#if defined(Py_DEBUG) || defined(LLTRACE)
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000771 filename = PyString_AsString(co->co_filename);
Tim Peters5ca576e2001-06-18 22:08:13 +0000772#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000773
Guido van Rossum374a9221991-04-04 10:40:29 +0000774 why = WHY_NOT;
775 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000776 x = Py_None; /* Not a reference, just anything non-NULL */
Fred Drake48fba732000-10-11 13:54:07 +0000777 w = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +0000778
Anthony Baxtera863d332006-04-11 07:43:46 +0000779 if (throwflag) { /* support for generator.throw() */
Phillip J. Eby0d6615f2005-08-02 00:46:46 +0000780 why = WHY_EXCEPTION;
781 goto on_error;
782 }
Tim Peters7df5e7f2006-05-26 23:14:37 +0000783
Guido van Rossum374a9221991-04-04 10:40:29 +0000784 for (;;) {
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000785#ifdef WITH_TSC
786 if (inst1 == 0) {
787 /* Almost surely, the opcode executed a break
788 or a continue, preventing inst1 from being set
789 on the way out of the loop.
790 */
Michael W. Hudson75eabd22005-01-18 15:56:11 +0000791 READ_TIMESTAMP(inst1);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000792 loop1 = inst1;
793 }
794 dump_tsc(opcode, ticked, inst0, inst1, loop0, loop1,
795 intr0, intr1);
796 ticked = 0;
797 inst1 = 0;
798 intr0 = 0;
799 intr1 = 0;
Michael W. Hudson75eabd22005-01-18 15:56:11 +0000800 READ_TIMESTAMP(loop0);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000801#endif
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000802 assert(stack_pointer >= f->f_valuestack); /* else underflow */
Richard Jonescebbefc2006-05-23 18:28:17 +0000803 assert(STACK_LEVEL() <= co->co_stacksize); /* else overflow */
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000804
Guido van Rossuma027efa1997-05-05 20:56:21 +0000805 /* Do periodic things. Doing this every time through
806 the loop would add too much overhead, so we do it
807 only every Nth instruction. We also do it if
808 ``things_to_do'' is set, i.e. when an asynchronous
809 event needs attention (e.g. a signal handler or
810 async I/O handler); see Py_AddPendingCall() and
811 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +0000812
Skip Montanarod581d772002-09-03 20:10:45 +0000813 if (--_Py_Ticker < 0) {
Thomas Woutersae406c62007-09-19 17:27:43 +0000814 if (*next_instr == SETUP_FINALLY) {
815 /* Make the last opcode before
816 a try: finally: block uninterruptable. */
817 goto fast_next_opcode;
818 }
Skip Montanarod581d772002-09-03 20:10:45 +0000819 _Py_Ticker = _Py_CheckInterval;
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000820 tstate->tick_counter++;
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000821#ifdef WITH_TSC
822 ticked = 1;
823#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000824 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000825 if (Py_MakePendingCalls() < 0) {
826 why = WHY_EXCEPTION;
827 goto on_error;
828 }
Kurt B. Kaiser4c79a832004-11-23 18:06:08 +0000829 if (things_to_do)
830 /* MakePendingCalls() didn't succeed.
831 Force early re-execution of this
832 "periodic" code, possibly after
833 a thread switch */
834 _Py_Ticker = 0;
Guido van Rossum8861b741996-07-30 16:49:37 +0000835 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000836#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000837 if (interpreter_lock) {
838 /* Give another thread a chance */
839
Guido van Rossum25ce5661997-08-02 03:10:38 +0000840 if (PyThreadState_Swap(NULL) != tstate)
841 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000842 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000843
844 /* Other threads may run now */
845
Guido van Rossum65d5b571998-12-21 19:32:43 +0000846 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000847 if (PyThreadState_Swap(tstate) != NULL)
848 Py_FatalError("ceval: orphan tstate");
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000849
850 /* Check for thread interrupts */
851
852 if (tstate->async_exc != NULL) {
853 x = tstate->async_exc;
854 tstate->async_exc = NULL;
855 PyErr_SetNone(x);
856 Py_DECREF(x);
857 why = WHY_EXCEPTION;
858 goto on_error;
859 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000860 }
861#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000862 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000863
Neil Schemenauer63543862002-02-17 19:10:14 +0000864 fast_next_opcode:
Guido van Rossum99bec951992-09-03 20:29:45 +0000865 f->f_lasti = INSTR_OFFSET();
Guido van Rossumac7be682001-01-17 15:42:30 +0000866
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000867 /* line-by-line tracing support */
868
869 if (tstate->c_tracefunc != NULL && !tstate->tracing) {
870 /* see maybe_call_line_trace
871 for expository comments */
872 f->f_stacktop = stack_pointer;
Tim Peters8a5c3c72004-04-05 19:36:21 +0000873
Michael W. Hudson58ee2af2003-04-29 16:18:47 +0000874 err = maybe_call_line_trace(tstate->c_tracefunc,
875 tstate->c_traceobj,
Armin Rigobf57a142004-03-22 19:24:58 +0000876 f, &instr_lb, &instr_ub,
877 &instr_prev);
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000878 /* Reload possibly changed frame fields */
879 JUMPTO(f->f_lasti);
Michael W. Hudson58ee2af2003-04-29 16:18:47 +0000880 if (f->f_stacktop != NULL) {
881 stack_pointer = f->f_stacktop;
882 f->f_stacktop = NULL;
883 }
884 if (err) {
885 /* trace function raised an exception */
886 goto on_error;
887 }
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000888 }
889
890 /* Extract opcode and argument */
891
Guido van Rossum374a9221991-04-04 10:40:29 +0000892 opcode = NEXTOP();
Armin Rigo8817fcd2004-06-17 10:22:40 +0000893 oparg = 0; /* allows oparg to be stored in a register because
894 it doesn't have to be remembered across a full loop */
Raymond Hettinger5bed4562004-04-10 23:34:17 +0000895 if (HAS_ARG(opcode))
896 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000897 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000898#ifdef DYNAMIC_EXECUTION_PROFILE
899#ifdef DXPAIRS
900 dxpairs[lastopcode][opcode]++;
901 lastopcode = opcode;
902#endif
903 dxp[opcode]++;
904#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000905
Guido van Rossum96a42c81992-01-12 02:29:51 +0000906#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000907 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +0000908
Guido van Rossum96a42c81992-01-12 02:29:51 +0000909 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000910 if (HAS_ARG(opcode)) {
911 printf("%d: %d, %d\n",
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000912 f->f_lasti, opcode, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +0000913 }
914 else {
915 printf("%d: %d\n",
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000916 f->f_lasti, opcode);
Guido van Rossum374a9221991-04-04 10:40:29 +0000917 }
918 }
919#endif
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000920
Guido van Rossum374a9221991-04-04 10:40:29 +0000921 /* Main switch on opcode */
Michael W. Hudson75eabd22005-01-18 15:56:11 +0000922 READ_TIMESTAMP(inst0);
Jeremy Hylton52820442001-01-03 23:52:36 +0000923
Guido van Rossum374a9221991-04-04 10:40:29 +0000924 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000925
Guido van Rossum374a9221991-04-04 10:40:29 +0000926 /* BEWARE!
927 It is essential that any operation that fails sets either
928 x to NULL, err to nonzero, or why to anything but WHY_NOT,
929 and that no operation that succeeds does this! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000930
Guido van Rossum374a9221991-04-04 10:40:29 +0000931 /* case STOP_CODE: this is an error! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000932
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000933 case NOP:
934 goto fast_next_opcode;
935
Neil Schemenauer63543862002-02-17 19:10:14 +0000936 case LOAD_FAST:
937 x = GETLOCAL(oparg);
938 if (x != NULL) {
939 Py_INCREF(x);
940 PUSH(x);
941 goto fast_next_opcode;
942 }
943 format_exc_check_arg(PyExc_UnboundLocalError,
944 UNBOUNDLOCAL_ERROR_MSG,
945 PyTuple_GetItem(co->co_varnames, oparg));
946 break;
947
948 case LOAD_CONST:
Skip Montanaro04d80f82002-08-04 21:03:35 +0000949 x = GETITEM(consts, oparg);
Neil Schemenauer63543862002-02-17 19:10:14 +0000950 Py_INCREF(x);
951 PUSH(x);
952 goto fast_next_opcode;
953
Raymond Hettinger7dc52212003-03-16 20:14:44 +0000954 PREDICTED_WITH_ARG(STORE_FAST);
Neil Schemenauer63543862002-02-17 19:10:14 +0000955 case STORE_FAST:
956 v = POP();
957 SETLOCAL(oparg, v);
958 goto fast_next_opcode;
959
Raymond Hettingerf606f872003-03-16 03:11:04 +0000960 PREDICTED(POP_TOP);
Guido van Rossum374a9221991-04-04 10:40:29 +0000961 case POP_TOP:
962 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000963 Py_DECREF(v);
Neil Schemenauer63543862002-02-17 19:10:14 +0000964 goto fast_next_opcode;
Guido van Rossumac7be682001-01-17 15:42:30 +0000965
Guido van Rossum374a9221991-04-04 10:40:29 +0000966 case ROT_TWO:
Raymond Hettinger663004b2003-01-09 15:24:30 +0000967 v = TOP();
968 w = SECOND();
969 SET_TOP(w);
970 SET_SECOND(v);
Raymond Hettinger080cb322003-03-14 01:37:42 +0000971 goto fast_next_opcode;
Guido van Rossumac7be682001-01-17 15:42:30 +0000972
Guido van Rossum374a9221991-04-04 10:40:29 +0000973 case ROT_THREE:
Raymond Hettinger663004b2003-01-09 15:24:30 +0000974 v = TOP();
975 w = SECOND();
976 x = THIRD();
977 SET_TOP(w);
978 SET_SECOND(x);
979 SET_THIRD(v);
Raymond Hettinger080cb322003-03-14 01:37:42 +0000980 goto fast_next_opcode;
Guido van Rossumac7be682001-01-17 15:42:30 +0000981
Thomas Wouters434d0822000-08-24 20:11:32 +0000982 case ROT_FOUR:
Raymond Hettinger663004b2003-01-09 15:24:30 +0000983 u = TOP();
984 v = SECOND();
985 w = THIRD();
986 x = FOURTH();
987 SET_TOP(v);
988 SET_SECOND(w);
989 SET_THIRD(x);
990 SET_FOURTH(u);
Raymond Hettinger080cb322003-03-14 01:37:42 +0000991 goto fast_next_opcode;
Guido van Rossumac7be682001-01-17 15:42:30 +0000992
Guido van Rossum374a9221991-04-04 10:40:29 +0000993 case DUP_TOP:
994 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000995 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000996 PUSH(v);
Raymond Hettinger080cb322003-03-14 01:37:42 +0000997 goto fast_next_opcode;
Guido van Rossumac7be682001-01-17 15:42:30 +0000998
Thomas Wouters434d0822000-08-24 20:11:32 +0000999 case DUP_TOPX:
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +00001000 if (oparg == 2) {
Raymond Hettinger663004b2003-01-09 15:24:30 +00001001 x = TOP();
Tim Peters35ba6892000-10-11 07:04:49 +00001002 Py_INCREF(x);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001003 w = SECOND();
Tim Peters35ba6892000-10-11 07:04:49 +00001004 Py_INCREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001005 STACKADJ(2);
1006 SET_TOP(x);
1007 SET_SECOND(w);
Raymond Hettingerf606f872003-03-16 03:11:04 +00001008 goto fast_next_opcode;
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +00001009 } else if (oparg == 3) {
Raymond Hettinger663004b2003-01-09 15:24:30 +00001010 x = TOP();
Tim Peters35ba6892000-10-11 07:04:49 +00001011 Py_INCREF(x);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001012 w = SECOND();
Tim Peters35ba6892000-10-11 07:04:49 +00001013 Py_INCREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001014 v = THIRD();
Tim Peters35ba6892000-10-11 07:04:49 +00001015 Py_INCREF(v);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001016 STACKADJ(3);
1017 SET_TOP(x);
1018 SET_SECOND(w);
1019 SET_THIRD(v);
Raymond Hettingerf606f872003-03-16 03:11:04 +00001020 goto fast_next_opcode;
Thomas Wouters434d0822000-08-24 20:11:32 +00001021 }
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +00001022 Py_FatalError("invalid argument to DUP_TOPX"
1023 " (bytecode corruption?)");
Tim Peters35ba6892000-10-11 07:04:49 +00001024 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001025
Guido van Rossum374a9221991-04-04 10:40:29 +00001026 case UNARY_POSITIVE:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001027 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001028 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001029 Py_DECREF(v);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001030 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001031 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001032 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001033
Guido van Rossum374a9221991-04-04 10:40:29 +00001034 case UNARY_NEGATIVE:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001035 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001036 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001037 Py_DECREF(v);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001038 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001039 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001040 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001041
Guido van Rossum374a9221991-04-04 10:40:29 +00001042 case UNARY_NOT:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001043 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001044 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001045 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +00001046 if (err == 0) {
1047 Py_INCREF(Py_True);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001048 SET_TOP(Py_True);
Guido van Rossumfc490731997-05-06 15:06:49 +00001049 continue;
1050 }
1051 else if (err > 0) {
1052 Py_INCREF(Py_False);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001053 SET_TOP(Py_False);
Guido van Rossumfc490731997-05-06 15:06:49 +00001054 err = 0;
1055 continue;
1056 }
Raymond Hettinger8bb90a52003-01-14 12:43:10 +00001057 STACKADJ(-1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001058 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001059
Guido van Rossum374a9221991-04-04 10:40:29 +00001060 case UNARY_CONVERT:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001061 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001062 x = PyObject_Repr(v);
1063 Py_DECREF(v);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001064 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001065 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001066 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001067
Guido van Rossum7928cd71991-10-24 14:59:31 +00001068 case UNARY_INVERT:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001069 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001070 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001071 Py_DECREF(v);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001072 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001073 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001074 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001075
Guido van Rossum50564e81996-01-12 01:13:16 +00001076 case BINARY_POWER:
1077 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001078 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001079 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +00001080 Py_DECREF(v);
1081 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001082 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001083 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +00001084 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001085
Guido van Rossum374a9221991-04-04 10:40:29 +00001086 case BINARY_MULTIPLY:
1087 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001088 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001089 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001090 Py_DECREF(v);
1091 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001092 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001093 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001094 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001095
Guido van Rossum374a9221991-04-04 10:40:29 +00001096 case BINARY_DIVIDE:
Tim Peters3caca232001-12-06 06:23:26 +00001097 if (!_Py_QnewFlag) {
1098 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001099 v = TOP();
Tim Peters3caca232001-12-06 06:23:26 +00001100 x = PyNumber_Divide(v, w);
1101 Py_DECREF(v);
1102 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001103 SET_TOP(x);
Tim Peters3caca232001-12-06 06:23:26 +00001104 if (x != NULL) continue;
1105 break;
1106 }
Raymond Hettinger663004b2003-01-09 15:24:30 +00001107 /* -Qnew is in effect: fall through to
Tim Peters3caca232001-12-06 06:23:26 +00001108 BINARY_TRUE_DIVIDE */
1109 case BINARY_TRUE_DIVIDE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001110 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001111 v = TOP();
Tim Peters3caca232001-12-06 06:23:26 +00001112 x = PyNumber_TrueDivide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001113 Py_DECREF(v);
1114 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001115 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001116 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001117 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001118
Guido van Rossum4668b002001-08-08 05:00:18 +00001119 case BINARY_FLOOR_DIVIDE:
1120 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001121 v = TOP();
Guido van Rossum4668b002001-08-08 05:00:18 +00001122 x = PyNumber_FloorDivide(v, w);
1123 Py_DECREF(v);
1124 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001125 SET_TOP(x);
Guido van Rossum4668b002001-08-08 05:00:18 +00001126 if (x != NULL) continue;
1127 break;
1128
Guido van Rossum374a9221991-04-04 10:40:29 +00001129 case BINARY_MODULO:
1130 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001131 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001132 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001133 Py_DECREF(v);
1134 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001135 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001136 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001137 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001138
Guido van Rossum374a9221991-04-04 10:40:29 +00001139 case BINARY_ADD:
1140 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001141 v = TOP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001142 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001143 /* INLINE: int + int */
1144 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001145 a = PyInt_AS_LONG(v);
1146 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001147 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001148 if ((i^a) < 0 && (i^b) < 0)
1149 goto slow_add;
1150 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001151 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001152 else if (PyString_CheckExact(v) &&
1153 PyString_CheckExact(w)) {
Raymond Hettinger52a21b82004-08-06 18:43:09 +00001154 x = string_concatenate(v, w, f, next_instr);
1155 /* string_concatenate consumed the ref to v */
1156 goto skip_decref_vx;
1157 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001158 else {
1159 slow_add:
Guido van Rossumc12da691997-07-17 23:12:42 +00001160 x = PyNumber_Add(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001161 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001162 Py_DECREF(v);
Raymond Hettinger52a21b82004-08-06 18:43:09 +00001163 skip_decref_vx:
Guido van Rossumb209a111997-04-29 18:18:01 +00001164 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001165 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001166 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001167 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001168
Guido van Rossum374a9221991-04-04 10:40:29 +00001169 case BINARY_SUBTRACT:
1170 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001171 v = TOP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001172 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001173 /* INLINE: int - int */
1174 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001175 a = PyInt_AS_LONG(v);
1176 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001177 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001178 if ((i^a) < 0 && (i^~b) < 0)
1179 goto slow_sub;
1180 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001181 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001182 else {
1183 slow_sub:
Guido van Rossumc12da691997-07-17 23:12:42 +00001184 x = PyNumber_Subtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001185 }
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 Rossum374a9221991-04-04 10:40:29 +00001190 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001191
Guido van Rossum374a9221991-04-04 10:40:29 +00001192 case BINARY_SUBSCR:
1193 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001194 v = TOP();
Tim Petersb1c46982001-10-05 20:41:38 +00001195 if (PyList_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001196 /* INLINE: list[int] */
Neal Norwitz814e9382006-03-02 07:54:28 +00001197 Py_ssize_t i = PyInt_AsSsize_t(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001198 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +00001199 i += PyList_GET_SIZE(v);
Raymond Hettinger467a6982004-04-07 11:39:21 +00001200 if (i >= 0 && i < PyList_GET_SIZE(v)) {
Guido van Rossumfa00e951998-07-08 15:02:37 +00001201 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001202 Py_INCREF(x);
1203 }
Raymond Hettinger467a6982004-04-07 11:39:21 +00001204 else
1205 goto slow_get;
Guido van Rossumc12da691997-07-17 23:12:42 +00001206 }
1207 else
Raymond Hettinger467a6982004-04-07 11:39:21 +00001208 slow_get:
Guido van Rossumc12da691997-07-17 23:12:42 +00001209 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001210 Py_DECREF(v);
1211 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001212 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001213 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001214 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001215
Guido van Rossum7928cd71991-10-24 14:59:31 +00001216 case BINARY_LSHIFT:
1217 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001218 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001219 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001220 Py_DECREF(v);
1221 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001222 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001223 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001224 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001225
Guido van Rossum7928cd71991-10-24 14:59:31 +00001226 case BINARY_RSHIFT:
1227 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001228 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001229 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001230 Py_DECREF(v);
1231 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001232 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001233 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001234 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001235
Guido van Rossum7928cd71991-10-24 14:59:31 +00001236 case BINARY_AND:
1237 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001238 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001239 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001240 Py_DECREF(v);
1241 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001242 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001243 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001244 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001245
Guido van Rossum7928cd71991-10-24 14:59:31 +00001246 case BINARY_XOR:
1247 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001248 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001249 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001250 Py_DECREF(v);
1251 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001252 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001253 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001254 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001255
Guido van Rossum7928cd71991-10-24 14:59:31 +00001256 case BINARY_OR:
1257 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001258 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001259 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001260 Py_DECREF(v);
1261 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001262 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001263 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001264 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001265
Raymond Hettingerdd80f762004-03-07 07:31:06 +00001266 case LIST_APPEND:
1267 w = POP();
1268 v = POP();
1269 err = PyList_Append(v, w);
1270 Py_DECREF(v);
1271 Py_DECREF(w);
Raymond Hettingerfba1cfc2004-03-12 16:33:17 +00001272 if (err == 0) {
1273 PREDICT(JUMP_ABSOLUTE);
1274 continue;
1275 }
Raymond Hettingerdd80f762004-03-07 07:31:06 +00001276 break;
1277
Thomas Wouters434d0822000-08-24 20:11:32 +00001278 case INPLACE_POWER:
1279 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001280 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001281 x = PyNumber_InPlacePower(v, w, Py_None);
1282 Py_DECREF(v);
1283 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001284 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001285 if (x != NULL) continue;
1286 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001287
Thomas Wouters434d0822000-08-24 20:11:32 +00001288 case INPLACE_MULTIPLY:
1289 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001290 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001291 x = PyNumber_InPlaceMultiply(v, w);
1292 Py_DECREF(v);
1293 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001294 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001295 if (x != NULL) continue;
1296 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001297
Thomas Wouters434d0822000-08-24 20:11:32 +00001298 case INPLACE_DIVIDE:
Tim Peters54b11912001-12-25 18:49:11 +00001299 if (!_Py_QnewFlag) {
1300 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001301 v = TOP();
Tim Peters54b11912001-12-25 18:49:11 +00001302 x = PyNumber_InPlaceDivide(v, w);
1303 Py_DECREF(v);
1304 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001305 SET_TOP(x);
Tim Peters54b11912001-12-25 18:49:11 +00001306 if (x != NULL) continue;
1307 break;
1308 }
Raymond Hettinger663004b2003-01-09 15:24:30 +00001309 /* -Qnew is in effect: fall through to
Tim Peters54b11912001-12-25 18:49:11 +00001310 INPLACE_TRUE_DIVIDE */
1311 case INPLACE_TRUE_DIVIDE:
Thomas Wouters434d0822000-08-24 20:11:32 +00001312 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001313 v = TOP();
Tim Peters54b11912001-12-25 18:49:11 +00001314 x = PyNumber_InPlaceTrueDivide(v, w);
Thomas Wouters434d0822000-08-24 20:11:32 +00001315 Py_DECREF(v);
1316 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001317 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001318 if (x != NULL) continue;
1319 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001320
Guido van Rossum4668b002001-08-08 05:00:18 +00001321 case INPLACE_FLOOR_DIVIDE:
1322 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001323 v = TOP();
Guido van Rossum4668b002001-08-08 05:00:18 +00001324 x = PyNumber_InPlaceFloorDivide(v, w);
1325 Py_DECREF(v);
1326 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001327 SET_TOP(x);
Guido van Rossum4668b002001-08-08 05:00:18 +00001328 if (x != NULL) continue;
1329 break;
1330
Thomas Wouters434d0822000-08-24 20:11:32 +00001331 case INPLACE_MODULO:
1332 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001333 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001334 x = PyNumber_InPlaceRemainder(v, w);
1335 Py_DECREF(v);
1336 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001337 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001338 if (x != NULL) continue;
1339 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001340
Thomas Wouters434d0822000-08-24 20:11:32 +00001341 case INPLACE_ADD:
1342 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001343 v = TOP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001344 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001345 /* INLINE: int + int */
1346 register long a, b, i;
1347 a = PyInt_AS_LONG(v);
1348 b = PyInt_AS_LONG(w);
1349 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001350 if ((i^a) < 0 && (i^b) < 0)
1351 goto slow_iadd;
1352 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001353 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001354 else if (PyString_CheckExact(v) &&
1355 PyString_CheckExact(w)) {
Raymond Hettinger52a21b82004-08-06 18:43:09 +00001356 x = string_concatenate(v, w, f, next_instr);
1357 /* string_concatenate consumed the ref to v */
1358 goto skip_decref_v;
1359 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001360 else {
1361 slow_iadd:
Thomas Wouters434d0822000-08-24 20:11:32 +00001362 x = PyNumber_InPlaceAdd(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001363 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001364 Py_DECREF(v);
Raymond Hettinger52a21b82004-08-06 18:43:09 +00001365 skip_decref_v:
Thomas Wouters434d0822000-08-24 20:11:32 +00001366 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001367 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001368 if (x != NULL) continue;
1369 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001370
Thomas Wouters434d0822000-08-24 20:11:32 +00001371 case INPLACE_SUBTRACT:
1372 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001373 v = TOP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001374 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001375 /* INLINE: int - int */
1376 register long a, b, i;
1377 a = PyInt_AS_LONG(v);
1378 b = PyInt_AS_LONG(w);
1379 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001380 if ((i^a) < 0 && (i^~b) < 0)
1381 goto slow_isub;
1382 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001383 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001384 else {
1385 slow_isub:
Thomas Wouters434d0822000-08-24 20:11:32 +00001386 x = PyNumber_InPlaceSubtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001387 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001388 Py_DECREF(v);
1389 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001390 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001391 if (x != NULL) continue;
1392 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001393
Thomas Wouters434d0822000-08-24 20:11:32 +00001394 case INPLACE_LSHIFT:
1395 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001396 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001397 x = PyNumber_InPlaceLshift(v, w);
1398 Py_DECREF(v);
1399 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001400 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001401 if (x != NULL) continue;
1402 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001403
Thomas Wouters434d0822000-08-24 20:11:32 +00001404 case INPLACE_RSHIFT:
1405 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001406 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001407 x = PyNumber_InPlaceRshift(v, w);
1408 Py_DECREF(v);
1409 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001410 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001411 if (x != NULL) continue;
1412 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001413
Thomas Wouters434d0822000-08-24 20:11:32 +00001414 case INPLACE_AND:
1415 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001416 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001417 x = PyNumber_InPlaceAnd(v, w);
1418 Py_DECREF(v);
1419 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001420 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001421 if (x != NULL) continue;
1422 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001423
Thomas Wouters434d0822000-08-24 20:11:32 +00001424 case INPLACE_XOR:
1425 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001426 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001427 x = PyNumber_InPlaceXor(v, w);
1428 Py_DECREF(v);
1429 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001430 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001431 if (x != NULL) continue;
1432 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001433
Thomas Wouters434d0822000-08-24 20:11:32 +00001434 case INPLACE_OR:
1435 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001436 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001437 x = PyNumber_InPlaceOr(v, w);
1438 Py_DECREF(v);
1439 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001440 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001441 if (x != NULL) continue;
1442 break;
1443
Guido van Rossum374a9221991-04-04 10:40:29 +00001444 case SLICE+0:
1445 case SLICE+1:
1446 case SLICE+2:
1447 case SLICE+3:
1448 if ((opcode-SLICE) & 2)
1449 w = POP();
1450 else
1451 w = NULL;
1452 if ((opcode-SLICE) & 1)
1453 v = POP();
1454 else
1455 v = NULL;
Raymond Hettinger663004b2003-01-09 15:24:30 +00001456 u = TOP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001457 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001458 Py_DECREF(u);
1459 Py_XDECREF(v);
1460 Py_XDECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001461 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001462 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001463 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001464
Guido van Rossum374a9221991-04-04 10:40:29 +00001465 case STORE_SLICE+0:
1466 case STORE_SLICE+1:
1467 case STORE_SLICE+2:
1468 case STORE_SLICE+3:
1469 if ((opcode-STORE_SLICE) & 2)
1470 w = POP();
1471 else
1472 w = NULL;
1473 if ((opcode-STORE_SLICE) & 1)
1474 v = POP();
1475 else
1476 v = NULL;
1477 u = POP();
1478 t = POP();
1479 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001480 Py_DECREF(t);
1481 Py_DECREF(u);
1482 Py_XDECREF(v);
1483 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001484 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001485 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001486
Guido van Rossum374a9221991-04-04 10:40:29 +00001487 case DELETE_SLICE+0:
1488 case DELETE_SLICE+1:
1489 case DELETE_SLICE+2:
1490 case DELETE_SLICE+3:
1491 if ((opcode-DELETE_SLICE) & 2)
1492 w = POP();
1493 else
1494 w = NULL;
1495 if ((opcode-DELETE_SLICE) & 1)
1496 v = POP();
1497 else
1498 v = NULL;
1499 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001500 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001501 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001502 Py_DECREF(u);
1503 Py_XDECREF(v);
1504 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001505 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001506 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001507
Guido van Rossum374a9221991-04-04 10:40:29 +00001508 case STORE_SUBSCR:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001509 w = TOP();
1510 v = SECOND();
1511 u = THIRD();
1512 STACKADJ(-3);
Guido van Rossum374a9221991-04-04 10:40:29 +00001513 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001514 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001515 Py_DECREF(u);
1516 Py_DECREF(v);
1517 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001518 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001519 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001520
Guido van Rossum374a9221991-04-04 10:40:29 +00001521 case DELETE_SUBSCR:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001522 w = TOP();
1523 v = SECOND();
1524 STACKADJ(-2);
Guido van Rossum374a9221991-04-04 10:40:29 +00001525 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001526 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001527 Py_DECREF(v);
1528 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001529 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001530 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001531
Guido van Rossum374a9221991-04-04 10:40:29 +00001532 case PRINT_EXPR:
1533 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001534 w = PySys_GetObject("displayhook");
1535 if (w == NULL) {
1536 PyErr_SetString(PyExc_RuntimeError,
1537 "lost sys.displayhook");
1538 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001539 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001540 }
1541 if (err == 0) {
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001542 x = PyTuple_Pack(1, v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001543 if (x == NULL)
1544 err = -1;
1545 }
1546 if (err == 0) {
1547 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001548 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001549 if (w == NULL)
1550 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001551 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001552 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001553 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001554 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001555
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001556 case PRINT_ITEM_TO:
1557 w = stream = POP();
1558 /* fall through to PRINT_ITEM */
1559
Guido van Rossum374a9221991-04-04 10:40:29 +00001560 case PRINT_ITEM:
1561 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001562 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001563 w = PySys_GetObject("stdout");
1564 if (w == NULL) {
1565 PyErr_SetString(PyExc_RuntimeError,
1566 "lost sys.stdout");
1567 err = -1;
1568 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001569 }
Neal Norwitzc5131bc2003-06-29 14:48:32 +00001570 /* PyFile_SoftSpace() can exececute arbitrary code
1571 if sys.stdout is an instance with a __getattr__.
1572 If __getattr__ raises an exception, w will
1573 be freed, so we need to prevent that temporarily. */
1574 Py_XINCREF(w);
Tim Peters8e5fd532002-03-24 19:25:00 +00001575 if (w != NULL && PyFile_SoftSpace(w, 0))
Guido van Rossumbe270261997-05-22 22:26:18 +00001576 err = PyFile_WriteString(" ", w);
1577 if (err == 0)
1578 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001579 if (err == 0) {
Tim Peters8e5fd532002-03-24 19:25:00 +00001580 /* XXX move into writeobject() ? */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001581 if (PyString_Check(v)) {
1582 char *s = PyString_AS_STRING(v);
1583 Py_ssize_t len = PyString_GET_SIZE(v);
Tim Peters8e5fd532002-03-24 19:25:00 +00001584 if (len == 0 ||
1585 !isspace(Py_CHARMASK(s[len-1])) ||
1586 s[len-1] == ' ')
1587 PyFile_SoftSpace(w, 1);
Tim Peters8a5c3c72004-04-05 19:36:21 +00001588 }
Martin v. Löwis8d3ce5a2001-12-18 22:36:40 +00001589#ifdef Py_USING_UNICODE
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001590 else if (PyUnicode_Check(v)) {
1591 Py_UNICODE *s = PyUnicode_AS_UNICODE(v);
Martin v. Löwis66851282006-04-22 11:40:03 +00001592 Py_ssize_t len = PyUnicode_GET_SIZE(v);
Tim Peters8e5fd532002-03-24 19:25:00 +00001593 if (len == 0 ||
1594 !Py_UNICODE_ISSPACE(s[len-1]) ||
1595 s[len-1] == ' ')
1596 PyFile_SoftSpace(w, 1);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001597 }
Michael W. Hudsond95c8282002-05-20 13:56:11 +00001598#endif
Tim Peters8e5fd532002-03-24 19:25:00 +00001599 else
1600 PyFile_SoftSpace(w, 1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001601 }
Neal Norwitzc5131bc2003-06-29 14:48:32 +00001602 Py_XDECREF(w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001603 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001604 Py_XDECREF(stream);
1605 stream = NULL;
1606 if (err == 0)
1607 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001608 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001609
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001610 case PRINT_NEWLINE_TO:
1611 w = stream = POP();
1612 /* fall through to PRINT_NEWLINE */
1613
Guido van Rossum374a9221991-04-04 10:40:29 +00001614 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001615 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001616 w = PySys_GetObject("stdout");
1617 if (w == NULL)
1618 PyErr_SetString(PyExc_RuntimeError,
1619 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001620 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001621 if (w != NULL) {
Georg Brandlaa76d772008-07-01 20:56:03 +00001622 /* w.write() may replace sys.stdout, so we
1623 * have to keep our reference to it */
Amaury Forgeot d'Arcbdd941f2008-07-01 20:38:04 +00001624 Py_INCREF(w);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001625 err = PyFile_WriteString("\n", w);
1626 if (err == 0)
1627 PyFile_SoftSpace(w, 0);
Amaury Forgeot d'Arcbdd941f2008-07-01 20:38:04 +00001628 Py_DECREF(w);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001629 }
1630 Py_XDECREF(stream);
1631 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001632 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001633
Thomas Wouters434d0822000-08-24 20:11:32 +00001634
1635#ifdef CASE_TOO_BIG
1636 default: switch (opcode) {
1637#endif
Guido van Rossumf10570b1995-07-07 22:53:21 +00001638 case RAISE_VARARGS:
1639 u = v = w = NULL;
1640 switch (oparg) {
1641 case 3:
1642 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001643 /* Fallthrough */
1644 case 2:
1645 v = POP(); /* value */
1646 /* Fallthrough */
1647 case 1:
1648 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001649 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001650 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001651 break;
1652 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001653 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001654 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001655 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001656 break;
1657 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001658 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001659
Guido van Rossum374a9221991-04-04 10:40:29 +00001660 case LOAD_LOCALS:
Raymond Hettinger467a6982004-04-07 11:39:21 +00001661 if ((x = f->f_locals) != NULL) {
1662 Py_INCREF(x);
1663 PUSH(x);
1664 continue;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001665 }
Raymond Hettinger467a6982004-04-07 11:39:21 +00001666 PyErr_SetString(PyExc_SystemError, "no locals");
Guido van Rossum374a9221991-04-04 10:40:29 +00001667 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001668
Guido van Rossum374a9221991-04-04 10:40:29 +00001669 case RETURN_VALUE:
1670 retval = POP();
1671 why = WHY_RETURN;
Raymond Hettinger1dd83092004-02-06 18:32:33 +00001672 goto fast_block_end;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001673
Tim Peters5ca576e2001-06-18 22:08:13 +00001674 case YIELD_VALUE:
1675 retval = POP();
Tim Peters8c963692001-06-23 05:26:56 +00001676 f->f_stacktop = stack_pointer;
Tim Peters5ca576e2001-06-18 22:08:13 +00001677 why = WHY_YIELD;
Raymond Hettinger1dd83092004-02-06 18:32:33 +00001678 goto fast_yield;
Tim Peters5ca576e2001-06-18 22:08:13 +00001679
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001680 case EXEC_STMT:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001681 w = TOP();
1682 v = SECOND();
1683 u = THIRD();
1684 STACKADJ(-3);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00001685 READ_TIMESTAMP(intr0);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001686 err = exec_statement(f, u, v, w);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00001687 READ_TIMESTAMP(intr1);
Guido van Rossumb209a111997-04-29 18:18:01 +00001688 Py_DECREF(u);
1689 Py_DECREF(v);
1690 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001691 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001692
Guido van Rossum374a9221991-04-04 10:40:29 +00001693 case POP_BLOCK:
1694 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001695 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001696 while (STACK_LEVEL() > b->b_level) {
1697 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001698 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001699 }
1700 }
Raymond Hettinger7eddd782004-04-07 14:38:08 +00001701 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001702
Jeffrey Yasskin9063a992008-03-03 01:27:03 +00001703 PREDICTED(END_FINALLY);
Guido van Rossum374a9221991-04-04 10:40:29 +00001704 case END_FINALLY:
1705 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001706 if (PyInt_Check(v)) {
Raymond Hettinger7c958652004-04-06 10:11:10 +00001707 why = (enum why_code) PyInt_AS_LONG(v);
Tim Peters8a5c3c72004-04-05 19:36:21 +00001708 assert(why != WHY_YIELD);
Raymond Hettingerc8aa08b2004-04-11 14:59:33 +00001709 if (why == WHY_RETURN ||
1710 why == WHY_CONTINUE)
Guido van Rossum374a9221991-04-04 10:40:29 +00001711 retval = POP();
1712 }
Thomas Wouterse2176022007-09-20 17:35:10 +00001713 else if (PyExceptionClass_Check(v) ||
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001714 PyString_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001715 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001716 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001717 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001718 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001719 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001720 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001721 else if (v != Py_None) {
1722 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001723 "'finally' pops bad exception");
1724 why = WHY_EXCEPTION;
1725 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001726 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001727 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001728
Guido van Rossum374a9221991-04-04 10:40:29 +00001729 case BUILD_CLASS:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001730 u = TOP();
1731 v = SECOND();
1732 w = THIRD();
1733 STACKADJ(-2);
Guido van Rossum25831651993-05-19 14:50:45 +00001734 x = build_class(u, v, w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001735 SET_TOP(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001736 Py_DECREF(u);
1737 Py_DECREF(v);
1738 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001739 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001740
Guido van Rossum374a9221991-04-04 10:40:29 +00001741 case STORE_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001742 w = GETITEM(names, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001743 v = POP();
Raymond Hettinger467a6982004-04-07 11:39:21 +00001744 if ((x = f->f_locals) != NULL) {
Raymond Hettinger66bd2332004-08-02 08:30:07 +00001745 if (PyDict_CheckExact(x))
Raymond Hettinger214b1c32004-07-02 06:41:07 +00001746 err = PyDict_SetItem(x, w, v);
1747 else
1748 err = PyObject_SetItem(x, w, v);
Raymond Hettinger467a6982004-04-07 11:39:21 +00001749 Py_DECREF(v);
Raymond Hettinger7eddd782004-04-07 14:38:08 +00001750 if (err == 0) continue;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001751 break;
1752 }
Raymond Hettinger467a6982004-04-07 11:39:21 +00001753 PyErr_Format(PyExc_SystemError,
1754 "no locals found when storing %s",
1755 PyObject_REPR(w));
Guido van Rossum374a9221991-04-04 10:40:29 +00001756 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001757
Guido van Rossum374a9221991-04-04 10:40:29 +00001758 case DELETE_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001759 w = GETITEM(names, oparg);
Raymond Hettinger467a6982004-04-07 11:39:21 +00001760 if ((x = f->f_locals) != NULL) {
Raymond Hettinger214b1c32004-07-02 06:41:07 +00001761 if ((err = PyObject_DelItem(x, w)) != 0)
Raymond Hettinger467a6982004-04-07 11:39:21 +00001762 format_exc_check_arg(PyExc_NameError,
Thomas Wouterse2176022007-09-20 17:35:10 +00001763 NAME_ERROR_MSG,
1764 w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001765 break;
1766 }
Raymond Hettinger467a6982004-04-07 11:39:21 +00001767 PyErr_Format(PyExc_SystemError,
1768 "no locals when deleting %s",
1769 PyObject_REPR(w));
Guido van Rossum374a9221991-04-04 10:40:29 +00001770 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001771
Raymond Hettinger7dc52212003-03-16 20:14:44 +00001772 PREDICTED_WITH_ARG(UNPACK_SEQUENCE);
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001773 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001774 v = POP();
Thomas Wouterse2176022007-09-20 17:35:10 +00001775 if (PyTuple_CheckExact(v) &&
1776 PyTuple_GET_SIZE(v) == oparg) {
1777 PyObject **items = \
1778 ((PyTupleObject *)v)->ob_item;
Raymond Hettingerf114a3a2004-03-08 23:25:30 +00001779 while (oparg--) {
1780 w = items[oparg];
1781 Py_INCREF(w);
1782 PUSH(w);
Barry Warsawe42b18f1997-08-25 22:13:04 +00001783 }
Raymond Hettinger7eddd782004-04-07 14:38:08 +00001784 Py_DECREF(v);
1785 continue;
Thomas Wouterse2176022007-09-20 17:35:10 +00001786 } else if (PyList_CheckExact(v) &&
1787 PyList_GET_SIZE(v) == oparg) {
1788 PyObject **items = \
1789 ((PyListObject *)v)->ob_item;
Raymond Hettingerf114a3a2004-03-08 23:25:30 +00001790 while (oparg--) {
1791 w = items[oparg];
1792 Py_INCREF(w);
1793 PUSH(w);
Barry Warsawe42b18f1997-08-25 22:13:04 +00001794 }
Raymond Hettingerf114a3a2004-03-08 23:25:30 +00001795 } else if (unpack_iterable(v, oparg,
Thomas Wouterse2176022007-09-20 17:35:10 +00001796 stack_pointer + oparg)) {
Tim Petersd6d010b2001-06-21 02:49:55 +00001797 stack_pointer += oparg;
Georg Brandl5cb76c12007-03-21 09:00:39 +00001798 } else {
1799 /* unpack_iterable() raised an exception */
Barry Warsawe42b18f1997-08-25 22:13:04 +00001800 why = WHY_EXCEPTION;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001801 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001802 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001803 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001804
Guido van Rossum374a9221991-04-04 10:40:29 +00001805 case STORE_ATTR:
Skip Montanaro496e6582002-08-06 17:47:40 +00001806 w = GETITEM(names, oparg);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001807 v = TOP();
1808 u = SECOND();
1809 STACKADJ(-2);
Guido van Rossumb209a111997-04-29 18:18:01 +00001810 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1811 Py_DECREF(v);
1812 Py_DECREF(u);
Raymond Hettinger7eddd782004-04-07 14:38:08 +00001813 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001814 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001815
Guido van Rossum374a9221991-04-04 10:40:29 +00001816 case DELETE_ATTR:
Skip Montanaro496e6582002-08-06 17:47:40 +00001817 w = GETITEM(names, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001818 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001819 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1820 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001821 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001822 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001823
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001824 case STORE_GLOBAL:
Skip Montanaro496e6582002-08-06 17:47:40 +00001825 w = GETITEM(names, oparg);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001826 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001827 err = PyDict_SetItem(f->f_globals, w, v);
1828 Py_DECREF(v);
Raymond Hettinger7eddd782004-04-07 14:38:08 +00001829 if (err == 0) continue;
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001830 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001831
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001832 case DELETE_GLOBAL:
Skip Montanaro496e6582002-08-06 17:47:40 +00001833 w = GETITEM(names, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001834 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001835 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001836 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001837 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001838
Guido van Rossum374a9221991-04-04 10:40:29 +00001839 case LOAD_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001840 w = GETITEM(names, oparg);
Raymond Hettinger214b1c32004-07-02 06:41:07 +00001841 if ((v = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001842 PyErr_Format(PyExc_SystemError,
1843 "no locals when loading %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001844 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001845 break;
1846 }
Michael W. Hudsona3711f72004-08-02 14:50:43 +00001847 if (PyDict_CheckExact(v)) {
Raymond Hettinger214b1c32004-07-02 06:41:07 +00001848 x = PyDict_GetItem(v, w);
Michael W. Hudsona3711f72004-08-02 14:50:43 +00001849 Py_XINCREF(x);
1850 }
Raymond Hettinger214b1c32004-07-02 06:41:07 +00001851 else {
1852 x = PyObject_GetItem(v, w);
1853 if (x == NULL && PyErr_Occurred()) {
Thomas Wouterse2176022007-09-20 17:35:10 +00001854 if (!PyErr_ExceptionMatches(
1855 PyExc_KeyError))
Raymond Hettinger214b1c32004-07-02 06:41:07 +00001856 break;
1857 PyErr_Clear();
1858 }
1859 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001860 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001861 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001862 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001863 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001864 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001865 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001866 PyExc_NameError,
Thomas Wouterse2176022007-09-20 17:35:10 +00001867 NAME_ERROR_MSG, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001868 break;
1869 }
1870 }
Michael W. Hudsona3711f72004-08-02 14:50:43 +00001871 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001872 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001873 PUSH(x);
Raymond Hettinger467a6982004-04-07 11:39:21 +00001874 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001875
Guido van Rossum374a9221991-04-04 10:40:29 +00001876 case LOAD_GLOBAL:
Skip Montanaro496e6582002-08-06 17:47:40 +00001877 w = GETITEM(names, oparg);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001878 if (PyString_CheckExact(w)) {
Guido van Rossumd8dbf842002-08-19 21:17:53 +00001879 /* Inline the PyDict_GetItem() calls.
1880 WARNING: this is an extreme speed hack.
1881 Do not try this at home. */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001882 long hash = ((PyStringObject *)w)->ob_shash;
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001883 if (hash != -1) {
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001884 PyDictObject *d;
Armin Rigo35f6d362006-06-01 13:19:12 +00001885 PyDictEntry *e;
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001886 d = (PyDictObject *)(f->f_globals);
Armin Rigo35f6d362006-06-01 13:19:12 +00001887 e = d->ma_lookup(d, w, hash);
1888 if (e == NULL) {
1889 x = NULL;
1890 break;
1891 }
1892 x = e->me_value;
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001893 if (x != NULL) {
1894 Py_INCREF(x);
1895 PUSH(x);
1896 continue;
1897 }
1898 d = (PyDictObject *)(f->f_builtins);
Armin Rigo35f6d362006-06-01 13:19:12 +00001899 e = d->ma_lookup(d, w, hash);
1900 if (e == NULL) {
1901 x = NULL;
1902 break;
1903 }
1904 x = e->me_value;
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001905 if (x != NULL) {
1906 Py_INCREF(x);
1907 PUSH(x);
1908 continue;
1909 }
1910 goto load_global_error;
1911 }
1912 }
1913 /* This is the un-inlined version of the code above */
Guido van Rossumb209a111997-04-29 18:18:01 +00001914 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001915 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001916 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001917 if (x == NULL) {
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001918 load_global_error:
Paul Prescode68140d2000-08-30 20:25:01 +00001919 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001920 PyExc_NameError,
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001921 GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001922 break;
1923 }
1924 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001925 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001926 PUSH(x);
Raymond Hettinger7eddd782004-04-07 14:38:08 +00001927 continue;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001928
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001929 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001930 x = GETLOCAL(oparg);
Raymond Hettinger467a6982004-04-07 11:39:21 +00001931 if (x != NULL) {
1932 SETLOCAL(oparg, NULL);
1933 continue;
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001934 }
Raymond Hettinger467a6982004-04-07 11:39:21 +00001935 format_exc_check_arg(
1936 PyExc_UnboundLocalError,
1937 UNBOUNDLOCAL_ERROR_MSG,
1938 PyTuple_GetItem(co->co_varnames, oparg)
1939 );
1940 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001941
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001942 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001943 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001944 Py_INCREF(x);
1945 PUSH(x);
Raymond Hettinger7eddd782004-04-07 14:38:08 +00001946 if (x != NULL) continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001947 break;
1948
1949 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001950 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001951 w = PyCell_Get(x);
Raymond Hettinger467a6982004-04-07 11:39:21 +00001952 if (w != NULL) {
1953 PUSH(w);
1954 continue;
Jeremy Hylton2524d692001-02-05 17:23:16 +00001955 }
Raymond Hettinger467a6982004-04-07 11:39:21 +00001956 err = -1;
1957 /* Don't stomp existing exception */
1958 if (PyErr_Occurred())
1959 break;
Richard Jonescebbefc2006-05-23 18:28:17 +00001960 if (oparg < PyTuple_GET_SIZE(co->co_cellvars)) {
1961 v = PyTuple_GET_ITEM(co->co_cellvars,
Raymond Hettinger467a6982004-04-07 11:39:21 +00001962 oparg);
1963 format_exc_check_arg(
1964 PyExc_UnboundLocalError,
1965 UNBOUNDLOCAL_ERROR_MSG,
1966 v);
1967 } else {
Thomas Wouterse2176022007-09-20 17:35:10 +00001968 v = PyTuple_GET_ITEM(co->co_freevars, oparg -
1969 PyTuple_GET_SIZE(co->co_cellvars));
1970 format_exc_check_arg(PyExc_NameError,
1971 UNBOUNDFREE_ERROR_MSG, v);
Raymond Hettinger467a6982004-04-07 11:39:21 +00001972 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001973 break;
1974
1975 case STORE_DEREF:
1976 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001977 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001978 PyCell_Set(x, w);
Jeremy Hylton30c9f392001-03-13 01:58:22 +00001979 Py_DECREF(w);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001980 continue;
1981
Guido van Rossum374a9221991-04-04 10:40:29 +00001982 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001983 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001984 if (x != NULL) {
Raymond Hettinger5bed4562004-04-10 23:34:17 +00001985 for (; --oparg >= 0;) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001986 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001987 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001988 }
1989 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001990 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001991 }
1992 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001993
Guido van Rossum374a9221991-04-04 10:40:29 +00001994 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001995 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001996 if (x != NULL) {
Raymond Hettinger5bed4562004-04-10 23:34:17 +00001997 for (; --oparg >= 0;) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001998 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001999 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00002000 }
2001 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002002 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00002003 }
2004 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002005
Guido van Rossum374a9221991-04-04 10:40:29 +00002006 case BUILD_MAP:
Raymond Hettingerfd7ed402007-12-18 21:24:09 +00002007 x = _PyDict_NewPresized((Py_ssize_t)oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00002008 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002009 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00002010 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002011
Raymond Hettingereffde122007-12-18 18:26:18 +00002012 case STORE_MAP:
2013 w = TOP(); /* key */
2014 u = SECOND(); /* value */
2015 v = THIRD(); /* dict */
2016 STACKADJ(-2);
2017 assert (PyDict_CheckExact(v));
2018 err = PyDict_SetItem(v, w, u); /* v[w] = u */
2019 Py_DECREF(u);
2020 Py_DECREF(w);
2021 if (err == 0) continue;
2022 break;
2023
Guido van Rossum374a9221991-04-04 10:40:29 +00002024 case LOAD_ATTR:
Skip Montanaro496e6582002-08-06 17:47:40 +00002025 w = GETITEM(names, oparg);
Raymond Hettinger663004b2003-01-09 15:24:30 +00002026 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002027 x = PyObject_GetAttr(v, w);
2028 Py_DECREF(v);
Raymond Hettinger663004b2003-01-09 15:24:30 +00002029 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002030 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00002031 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002032
Guido van Rossum374a9221991-04-04 10:40:29 +00002033 case COMPARE_OP:
2034 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00002035 v = TOP();
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +00002036 if (PyInt_CheckExact(w) && PyInt_CheckExact(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00002037 /* INLINE: cmp(int, int) */
2038 register long a, b;
2039 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00002040 a = PyInt_AS_LONG(v);
2041 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00002042 switch (oparg) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00002043 case PyCmp_LT: res = a < b; break;
2044 case PyCmp_LE: res = a <= b; break;
2045 case PyCmp_EQ: res = a == b; break;
2046 case PyCmp_NE: res = a != b; break;
2047 case PyCmp_GT: res = a > b; break;
2048 case PyCmp_GE: res = a >= b; break;
2049 case PyCmp_IS: res = v == w; break;
2050 case PyCmp_IS_NOT: res = v != w; break;
Guido van Rossumc12da691997-07-17 23:12:42 +00002051 default: goto slow_compare;
2052 }
2053 x = res ? Py_True : Py_False;
2054 Py_INCREF(x);
2055 }
2056 else {
2057 slow_compare:
2058 x = cmp_outcome(oparg, v, w);
2059 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002060 Py_DECREF(v);
2061 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00002062 SET_TOP(x);
Raymond Hettingerf606f872003-03-16 03:11:04 +00002063 if (x == NULL) break;
2064 PREDICT(JUMP_IF_FALSE);
2065 PREDICT(JUMP_IF_TRUE);
2066 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00002067
Guido van Rossum374a9221991-04-04 10:40:29 +00002068 case IMPORT_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00002069 w = GETITEM(names, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002070 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002071 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002072 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00002073 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002074 break;
2075 }
Guido van Rossum1d9a9ea2008-01-23 20:19:01 +00002076 Py_INCREF(x);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002077 v = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00002078 u = TOP();
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002079 if (PyInt_AsLong(u) != -1 || PyErr_Occurred())
2080 w = PyTuple_Pack(5,
2081 w,
2082 f->f_globals,
2083 f->f_locals == NULL ?
2084 Py_None : f->f_locals,
2085 v,
2086 u);
2087 else
2088 w = PyTuple_Pack(4,
2089 w,
2090 f->f_globals,
2091 f->f_locals == NULL ?
2092 Py_None : f->f_locals,
2093 v);
2094 Py_DECREF(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00002095 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002096 if (w == NULL) {
Raymond Hettinger663004b2003-01-09 15:24:30 +00002097 u = POP();
Guido van Rossum1d9a9ea2008-01-23 20:19:01 +00002098 Py_DECREF(x);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002099 x = NULL;
2100 break;
2101 }
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002102 READ_TIMESTAMP(intr0);
Guido van Rossum1d9a9ea2008-01-23 20:19:01 +00002103 v = x;
2104 x = PyEval_CallObject(v, w);
2105 Py_DECREF(v);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002106 READ_TIMESTAMP(intr1);
Guido van Rossumb209a111997-04-29 18:18:01 +00002107 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00002108 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002109 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00002110 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002111
Thomas Wouters52152252000-08-17 22:55:00 +00002112 case IMPORT_STAR:
2113 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002114 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002115 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002116 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00002117 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002118 break;
2119 }
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002120 READ_TIMESTAMP(intr0);
Thomas Wouters52152252000-08-17 22:55:00 +00002121 err = import_all_from(x, v);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002122 READ_TIMESTAMP(intr1);
Guido van Rossumb209a111997-04-29 18:18:01 +00002123 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00002124 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002125 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00002126 break;
Guido van Rossum25831651993-05-19 14:50:45 +00002127
Thomas Wouters52152252000-08-17 22:55:00 +00002128 case IMPORT_FROM:
Skip Montanaro496e6582002-08-06 17:47:40 +00002129 w = GETITEM(names, oparg);
Thomas Wouters52152252000-08-17 22:55:00 +00002130 v = TOP();
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002131 READ_TIMESTAMP(intr0);
Thomas Wouters52152252000-08-17 22:55:00 +00002132 x = import_from(v, w);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002133 READ_TIMESTAMP(intr1);
Thomas Wouters52152252000-08-17 22:55:00 +00002134 PUSH(x);
2135 if (x != NULL) continue;
2136 break;
2137
Guido van Rossum374a9221991-04-04 10:40:29 +00002138 case JUMP_FORWARD:
2139 JUMPBY(oparg);
Neil Schemenauerc4b570f2003-06-01 19:21:12 +00002140 goto fast_next_opcode;
Guido van Rossumac7be682001-01-17 15:42:30 +00002141
Raymond Hettingerf606f872003-03-16 03:11:04 +00002142 PREDICTED_WITH_ARG(JUMP_IF_FALSE);
Guido van Rossum374a9221991-04-04 10:40:29 +00002143 case JUMP_IF_FALSE:
Raymond Hettinger21012b82003-02-26 18:11:50 +00002144 w = TOP();
Raymond Hettingerf606f872003-03-16 03:11:04 +00002145 if (w == Py_True) {
2146 PREDICT(POP_TOP);
Neil Schemenauerc4b570f2003-06-01 19:21:12 +00002147 goto fast_next_opcode;
Raymond Hettingerf606f872003-03-16 03:11:04 +00002148 }
Raymond Hettinger21012b82003-02-26 18:11:50 +00002149 if (w == Py_False) {
2150 JUMPBY(oparg);
Neil Schemenauerc4b570f2003-06-01 19:21:12 +00002151 goto fast_next_opcode;
Raymond Hettinger21012b82003-02-26 18:11:50 +00002152 }
2153 err = PyObject_IsTrue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002154 if (err > 0)
2155 err = 0;
2156 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00002157 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002158 else
2159 break;
2160 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00002161
Raymond Hettingerf606f872003-03-16 03:11:04 +00002162 PREDICTED_WITH_ARG(JUMP_IF_TRUE);
Guido van Rossum374a9221991-04-04 10:40:29 +00002163 case JUMP_IF_TRUE:
Raymond Hettinger21012b82003-02-26 18:11:50 +00002164 w = TOP();
Raymond Hettingerf606f872003-03-16 03:11:04 +00002165 if (w == Py_False) {
2166 PREDICT(POP_TOP);
Neil Schemenauerc4b570f2003-06-01 19:21:12 +00002167 goto fast_next_opcode;
Raymond Hettingerf606f872003-03-16 03:11:04 +00002168 }
Raymond Hettinger21012b82003-02-26 18:11:50 +00002169 if (w == Py_True) {
2170 JUMPBY(oparg);
Neil Schemenauerc4b570f2003-06-01 19:21:12 +00002171 goto fast_next_opcode;
Raymond Hettinger21012b82003-02-26 18:11:50 +00002172 }
2173 err = PyObject_IsTrue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002174 if (err > 0) {
2175 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00002176 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002177 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002178 else if (err == 0)
2179 ;
2180 else
2181 break;
2182 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00002183
Raymond Hettingerfba1cfc2004-03-12 16:33:17 +00002184 PREDICTED_WITH_ARG(JUMP_ABSOLUTE);
Guido van Rossum374a9221991-04-04 10:40:29 +00002185 case JUMP_ABSOLUTE:
2186 JUMPTO(oparg);
Raymond Hettingerdc1d1ba2007-11-07 02:45:46 +00002187#if FAST_LOOPS
2188 /* Enabling this path speeds-up all while and for-loops by bypassing
2189 the per-loop checks for signals. By default, this should be turned-off
2190 because it prevents detection of a control-break in tight loops like
2191 "while 1: pass". Compile with this option turned-on when you need
2192 the speed-up and do not need break checking inside tight loops (ones
2193 that contain only instructions ending with goto fast_next_opcode).
2194 */
2195 goto fast_next_opcode;
2196#else
Neil Schemenauerca2a2f12003-05-30 23:59:44 +00002197 continue;
Raymond Hettingerdc1d1ba2007-11-07 02:45:46 +00002198#endif
Guido van Rossumac7be682001-01-17 15:42:30 +00002199
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002200 case GET_ITER:
2201 /* before: [obj]; after [getiter(obj)] */
Raymond Hettinger663004b2003-01-09 15:24:30 +00002202 v = TOP();
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002203 x = PyObject_GetIter(v);
2204 Py_DECREF(v);
2205 if (x != NULL) {
Raymond Hettinger663004b2003-01-09 15:24:30 +00002206 SET_TOP(x);
Raymond Hettinger7dc52212003-03-16 20:14:44 +00002207 PREDICT(FOR_ITER);
Guido van Rossum213c7a62001-04-23 14:08:49 +00002208 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002209 }
Raymond Hettinger8bb90a52003-01-14 12:43:10 +00002210 STACKADJ(-1);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002211 break;
2212
Raymond Hettinger7dc52212003-03-16 20:14:44 +00002213 PREDICTED_WITH_ARG(FOR_ITER);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002214 case FOR_ITER:
2215 /* before: [iter]; after: [iter, iter()] *or* [] */
2216 v = TOP();
Raymond Hettingerdb0de9e2004-03-12 08:41:36 +00002217 x = (*v->ob_type->tp_iternext)(v);
Guido van Rossum213c7a62001-04-23 14:08:49 +00002218 if (x != NULL) {
2219 PUSH(x);
Raymond Hettinger7dc52212003-03-16 20:14:44 +00002220 PREDICT(STORE_FAST);
2221 PREDICT(UNPACK_SEQUENCE);
Guido van Rossum213c7a62001-04-23 14:08:49 +00002222 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002223 }
Raymond Hettingerdb0de9e2004-03-12 08:41:36 +00002224 if (PyErr_Occurred()) {
Thomas Wouterse2176022007-09-20 17:35:10 +00002225 if (!PyErr_ExceptionMatches(
2226 PyExc_StopIteration))
Raymond Hettingerdb0de9e2004-03-12 08:41:36 +00002227 break;
2228 PyErr_Clear();
Guido van Rossum213c7a62001-04-23 14:08:49 +00002229 }
Raymond Hettingerdb0de9e2004-03-12 08:41:36 +00002230 /* iterator ended normally */
2231 x = v = POP();
2232 Py_DECREF(v);
2233 JUMPBY(oparg);
2234 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002235
Raymond Hettinger2d783e92004-03-12 09:12:22 +00002236 case BREAK_LOOP:
2237 why = WHY_BREAK;
2238 goto fast_block_end;
2239
2240 case CONTINUE_LOOP:
2241 retval = PyInt_FromLong(oparg);
Neal Norwitz02104df2006-05-19 06:31:23 +00002242 if (!retval) {
2243 x = NULL;
2244 break;
2245 }
Raymond Hettinger2d783e92004-03-12 09:12:22 +00002246 why = WHY_CONTINUE;
2247 goto fast_block_end;
2248
Guido van Rossum374a9221991-04-04 10:40:29 +00002249 case SETUP_LOOP:
2250 case SETUP_EXCEPT:
2251 case SETUP_FINALLY:
Thomas Wouterse2176022007-09-20 17:35:10 +00002252 /* NOTE: If you add any new block-setup opcodes that
2253 are not try/except/finally handlers, you may need
2254 to update the PyGen_NeedsFinalizing() function.
2255 */
Phillip J. Eby2ba96612006-04-10 17:51:05 +00002256
Guido van Rossumb209a111997-04-29 18:18:01 +00002257 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002258 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002259 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00002260
Guido van Rossumc2e20742006-02-27 22:32:47 +00002261 case WITH_CLEANUP:
2262 {
Nick Coghlan7af53be2008-03-07 14:13:28 +00002263 /* At the top of the stack are 1-3 values indicating
2264 how/why we entered the finally clause:
2265 - TOP = None
2266 - (TOP, SECOND) = (WHY_{RETURN,CONTINUE}), retval
2267 - TOP = WHY_*; no retval below it
2268 - (TOP, SECOND, THIRD) = exc_info()
2269 Below them is EXIT, the context.__exit__ bound method.
Guido van Rossumc2e20742006-02-27 22:32:47 +00002270 In the last case, we must call
Nick Coghlan7af53be2008-03-07 14:13:28 +00002271 EXIT(TOP, SECOND, THIRD)
Guido van Rossumc2e20742006-02-27 22:32:47 +00002272 otherwise we must call
Nick Coghlan7af53be2008-03-07 14:13:28 +00002273 EXIT(None, None, None)
2274
2275 In all cases, we remove EXIT from the stack, leaving
2276 the rest in the same order.
Guido van Rossum1a5e21e2006-02-28 21:57:43 +00002277
2278 In addition, if the stack represents an exception,
Guido van Rossumf6694362006-03-10 02:28:35 +00002279 *and* the function call returns a 'true' value, we
2280 "zap" this information, to prevent END_FINALLY from
2281 re-raising the exception. (But non-local gotos
2282 should still be resumed.)
Guido van Rossumc2e20742006-02-27 22:32:47 +00002283 */
Tim Peters7df5e7f2006-05-26 23:14:37 +00002284
Nick Coghlan7af53be2008-03-07 14:13:28 +00002285 PyObject *exit_func;
2286
2287 u = POP();
2288 if (u == Py_None) {
2289 exit_func = TOP();
2290 SET_TOP(u);
2291 v = w = Py_None;
2292 }
2293 else if (PyInt_Check(u)) {
2294 switch(PyInt_AS_LONG(u)) {
2295 case WHY_RETURN:
2296 case WHY_CONTINUE:
2297 /* Retval in TOP. */
2298 exit_func = SECOND();
2299 SET_SECOND(TOP());
2300 SET_TOP(u);
2301 break;
2302 default:
2303 exit_func = TOP();
2304 SET_TOP(u);
2305 break;
2306 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00002307 u = v = w = Py_None;
2308 }
2309 else {
Nick Coghlan7af53be2008-03-07 14:13:28 +00002310 v = TOP();
2311 w = SECOND();
2312 exit_func = THIRD();
2313 SET_TOP(u);
2314 SET_SECOND(v);
2315 SET_THIRD(w);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002316 }
Guido van Rossumf6694362006-03-10 02:28:35 +00002317 /* XXX Not the fastest way to call it... */
Nick Coghlan7af53be2008-03-07 14:13:28 +00002318 x = PyObject_CallFunctionObjArgs(exit_func, u, v, w,
2319 NULL);
2320 if (x == NULL) {
2321 Py_DECREF(exit_func);
Guido van Rossumf6694362006-03-10 02:28:35 +00002322 break; /* Go to error exit */
Nick Coghlan7af53be2008-03-07 14:13:28 +00002323 }
Guido van Rossumf6694362006-03-10 02:28:35 +00002324 if (u != Py_None && PyObject_IsTrue(x)) {
2325 /* There was an exception and a true return */
Nick Coghlan7af53be2008-03-07 14:13:28 +00002326 STACKADJ(-2);
Guido van Rossumf6694362006-03-10 02:28:35 +00002327 Py_INCREF(Py_None);
2328 SET_TOP(Py_None);
Guido van Rossumf6694362006-03-10 02:28:35 +00002329 Py_DECREF(u);
2330 Py_DECREF(v);
2331 Py_DECREF(w);
2332 } else {
Nick Coghlan7af53be2008-03-07 14:13:28 +00002333 /* The stack was rearranged to remove EXIT
2334 above. Let END_FINALLY do its thing */
Guido van Rossumf6694362006-03-10 02:28:35 +00002335 }
Nick Coghlan7af53be2008-03-07 14:13:28 +00002336 Py_DECREF(x);
2337 Py_DECREF(exit_func);
Jeffrey Yasskin9063a992008-03-03 01:27:03 +00002338 PREDICT(END_FINALLY);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002339 break;
2340 }
2341
Guido van Rossumf10570b1995-07-07 22:53:21 +00002342 case CALL_FUNCTION:
Armin Rigo8817fcd2004-06-17 10:22:40 +00002343 {
2344 PyObject **sp;
Jeremy Hylton985eba52003-02-05 23:13:00 +00002345 PCALL(PCALL_ALL);
Armin Rigo8817fcd2004-06-17 10:22:40 +00002346 sp = stack_pointer;
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00002347#ifdef WITH_TSC
Armin Rigo8817fcd2004-06-17 10:22:40 +00002348 x = call_function(&sp, oparg, &intr0, &intr1);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00002349#else
Armin Rigo8817fcd2004-06-17 10:22:40 +00002350 x = call_function(&sp, oparg);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00002351#endif
Armin Rigo8817fcd2004-06-17 10:22:40 +00002352 stack_pointer = sp;
Jeremy Hyltone8c04322002-08-16 17:47:26 +00002353 PUSH(x);
2354 if (x != NULL)
2355 continue;
2356 break;
Armin Rigo8817fcd2004-06-17 10:22:40 +00002357 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002358
Jeremy Hylton76901512000-03-28 23:49:17 +00002359 case CALL_FUNCTION_VAR:
2360 case CALL_FUNCTION_KW:
2361 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00002362 {
Jeremy Hylton76901512000-03-28 23:49:17 +00002363 int na = oparg & 0xff;
2364 int nk = (oparg>>8) & 0xff;
2365 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00002366 int n = na + 2 * nk;
Armin Rigo8817fcd2004-06-17 10:22:40 +00002367 PyObject **pfunc, *func, **sp;
Jeremy Hylton985eba52003-02-05 23:13:00 +00002368 PCALL(PCALL_ALL);
Jeremy Hylton52820442001-01-03 23:52:36 +00002369 if (flags & CALL_FLAG_VAR)
2370 n++;
2371 if (flags & CALL_FLAG_KW)
2372 n++;
2373 pfunc = stack_pointer - n - 1;
2374 func = *pfunc;
Jeremy Hylton52820442001-01-03 23:52:36 +00002375
Guido van Rossumac7be682001-01-17 15:42:30 +00002376 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00002377 && PyMethod_GET_SELF(func) != NULL) {
2378 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002379 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00002380 func = PyMethod_GET_FUNCTION(func);
2381 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002382 Py_DECREF(*pfunc);
2383 *pfunc = self;
2384 na++;
2385 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00002386 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00002387 Py_INCREF(func);
Armin Rigo8817fcd2004-06-17 10:22:40 +00002388 sp = stack_pointer;
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002389 READ_TIMESTAMP(intr0);
Armin Rigo8817fcd2004-06-17 10:22:40 +00002390 x = ext_do_call(func, &sp, flags, na, nk);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002391 READ_TIMESTAMP(intr1);
Armin Rigo8817fcd2004-06-17 10:22:40 +00002392 stack_pointer = sp;
Jeremy Hylton76901512000-03-28 23:49:17 +00002393 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002394
Jeremy Hylton76901512000-03-28 23:49:17 +00002395 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00002396 w = POP();
2397 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00002398 }
2399 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002400 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002401 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00002402 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002403 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002404
Guido van Rossum681d79a1995-07-18 14:51:37 +00002405 case MAKE_FUNCTION:
2406 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00002407 x = PyFunction_New(v, f->f_globals);
2408 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002409 /* XXX Maybe this should be a separate opcode? */
2410 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002411 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002412 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002413 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002414 x = NULL;
2415 break;
2416 }
Raymond Hettinger5bed4562004-04-10 23:34:17 +00002417 while (--oparg >= 0) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002418 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002419 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002420 }
2421 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00002422 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002423 }
2424 PUSH(x);
2425 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002426
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002427 case MAKE_CLOSURE:
2428 {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002429 v = POP(); /* code object */
2430 x = PyFunction_New(v, f->f_globals);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002431 Py_DECREF(v);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002432 if (x != NULL) {
2433 v = POP();
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002434 err = PyFunction_SetClosure(x, v);
2435 Py_DECREF(v);
2436 }
2437 if (x != NULL && oparg > 0) {
2438 v = PyTuple_New(oparg);
2439 if (v == NULL) {
2440 Py_DECREF(x);
2441 x = NULL;
2442 break;
2443 }
Raymond Hettinger5bed4562004-04-10 23:34:17 +00002444 while (--oparg >= 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002445 w = POP();
2446 PyTuple_SET_ITEM(v, oparg, w);
2447 }
2448 err = PyFunction_SetDefaults(x, v);
2449 Py_DECREF(v);
2450 }
2451 PUSH(x);
2452 break;
2453 }
2454
Guido van Rossum8861b741996-07-30 16:49:37 +00002455 case BUILD_SLICE:
2456 if (oparg == 3)
2457 w = POP();
2458 else
2459 w = NULL;
2460 v = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00002461 u = TOP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002462 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002463 Py_DECREF(u);
2464 Py_DECREF(v);
2465 Py_XDECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00002466 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002467 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002468 break;
2469
Fred Drakeef8ace32000-08-24 00:32:09 +00002470 case EXTENDED_ARG:
2471 opcode = NEXTOP();
Raymond Hettinger5bed4562004-04-10 23:34:17 +00002472 oparg = oparg<<16 | NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +00002473 goto dispatch_opcode;
Guido van Rossum8861b741996-07-30 16:49:37 +00002474
Guido van Rossum374a9221991-04-04 10:40:29 +00002475 default:
2476 fprintf(stderr,
2477 "XXX lineno: %d, opcode: %d\n",
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002478 PyCode_Addr2Line(f->f_code, f->f_lasti),
2479 opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002480 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002481 why = WHY_EXCEPTION;
2482 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002483
2484#ifdef CASE_TOO_BIG
2485 }
2486#endif
2487
Guido van Rossum374a9221991-04-04 10:40:29 +00002488 } /* switch */
2489
2490 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002491
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002492 READ_TIMESTAMP(inst1);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00002493
Guido van Rossum374a9221991-04-04 10:40:29 +00002494 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002495
Guido van Rossum374a9221991-04-04 10:40:29 +00002496 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002497 if (err == 0 && x != NULL) {
2498#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002499 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002500 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002501 fprintf(stderr,
2502 "XXX undetected error\n");
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00002503 else {
2504#endif
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002505 READ_TIMESTAMP(loop1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002506 continue; /* Normal, fast path */
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00002507#ifdef CHECKEXC
2508 }
2509#endif
Guido van Rossum681d79a1995-07-18 14:51:37 +00002510 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002511 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002512 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002513 err = 0;
2514 }
2515
Guido van Rossum374a9221991-04-04 10:40:29 +00002516 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002517
Raymond Hettingerc8aa08b2004-04-11 14:59:33 +00002518 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002519 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002520 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002521 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002522 why = WHY_EXCEPTION;
2523 }
2524 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002525#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002526 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002527 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002528 if (PyErr_Occurred()) {
Neal Norwitz8250fbe2008-01-27 17:12:15 +00002529 char buf[128];
Jeremy Hylton904ed862003-11-05 17:29:35 +00002530 sprintf(buf, "Stack unwind with exception "
2531 "set and why=%d", why);
2532 Py_FatalError(buf);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002533 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002534 }
2535#endif
2536
2537 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002538
Guido van Rossum374a9221991-04-04 10:40:29 +00002539 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002540 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002541
Fred Drake8f51f542001-10-04 14:48:42 +00002542 if (tstate->c_tracefunc != NULL)
2543 call_exc_trace(tstate->c_tracefunc,
2544 tstate->c_traceobj, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002545 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002546
Guido van Rossum374a9221991-04-04 10:40:29 +00002547 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002548
Guido van Rossum374a9221991-04-04 10:40:29 +00002549 if (why == WHY_RERAISE)
2550 why = WHY_EXCEPTION;
2551
2552 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002553
Raymond Hettinger1dd83092004-02-06 18:32:33 +00002554fast_block_end:
Tim Peters8a5c3c72004-04-05 19:36:21 +00002555 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002556 PyTryBlock *b = PyFrame_BlockPop(f);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002557
Tim Peters8a5c3c72004-04-05 19:36:21 +00002558 assert(why != WHY_YIELD);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002559 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2560 /* For a continue inside a try block,
2561 don't pop the block for the loop. */
Thomas Wouters1ee64222001-09-24 19:32:01 +00002562 PyFrame_BlockSetup(f, b->b_type, b->b_handler,
2563 b->b_level);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002564 why = WHY_NOT;
2565 JUMPTO(PyInt_AS_LONG(retval));
2566 Py_DECREF(retval);
2567 break;
2568 }
2569
Guido van Rossum374a9221991-04-04 10:40:29 +00002570 while (STACK_LEVEL() > b->b_level) {
2571 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002572 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002573 }
2574 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2575 why = WHY_NOT;
2576 JUMPTO(b->b_handler);
2577 break;
2578 }
2579 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002580 (b->b_type == SETUP_EXCEPT &&
2581 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002582 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002583 PyObject *exc, *val, *tb;
2584 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002585 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002586 val = Py_None;
2587 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002588 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002589 /* Make the raw exception data
2590 available to the handler,
2591 so a program can emulate the
2592 Python main loop. Don't do
2593 this for 'finally'. */
2594 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002595 PyErr_NormalizeException(
2596 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002597 set_exc_info(tstate,
2598 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002599 }
Jeremy Hyltonc6314892001-09-26 19:24:45 +00002600 if (tb == NULL) {
2601 Py_INCREF(Py_None);
2602 PUSH(Py_None);
2603 } else
2604 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002605 PUSH(val);
2606 PUSH(exc);
2607 }
2608 else {
Raymond Hettinger06032cb2004-04-06 09:37:35 +00002609 if (why & (WHY_RETURN | WHY_CONTINUE))
Guido van Rossum374a9221991-04-04 10:40:29 +00002610 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002611 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002612 PUSH(v);
2613 }
2614 why = WHY_NOT;
2615 JUMPTO(b->b_handler);
2616 break;
2617 }
2618 } /* unwind stack */
2619
2620 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002621
Guido van Rossum374a9221991-04-04 10:40:29 +00002622 if (why != WHY_NOT)
2623 break;
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002624 READ_TIMESTAMP(loop1);
Guido van Rossumac7be682001-01-17 15:42:30 +00002625
Guido van Rossum374a9221991-04-04 10:40:29 +00002626 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002627
Tim Peters8a5c3c72004-04-05 19:36:21 +00002628 assert(why != WHY_YIELD);
2629 /* Pop remaining stack entries. */
2630 while (!EMPTY()) {
2631 v = POP();
2632 Py_XDECREF(v);
Guido van Rossum35974fb2001-12-06 21:28:18 +00002633 }
2634
Tim Peters8a5c3c72004-04-05 19:36:21 +00002635 if (why != WHY_RETURN)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002636 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002637
Raymond Hettinger1dd83092004-02-06 18:32:33 +00002638fast_yield:
Fred Drake9e3ad782001-07-03 23:39:52 +00002639 if (tstate->use_tracing) {
Barry Warsawe2eca0b2005-08-15 18:14:19 +00002640 if (tstate->c_tracefunc) {
2641 if (why == WHY_RETURN || why == WHY_YIELD) {
2642 if (call_trace(tstate->c_tracefunc,
2643 tstate->c_traceobj, f,
2644 PyTrace_RETURN, retval)) {
2645 Py_XDECREF(retval);
2646 retval = NULL;
2647 why = WHY_EXCEPTION;
2648 }
2649 }
2650 else if (why == WHY_EXCEPTION) {
2651 call_trace_protected(tstate->c_tracefunc,
2652 tstate->c_traceobj, f,
Armin Rigo1c2d7e52005-09-20 18:34:01 +00002653 PyTrace_RETURN, NULL);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002654 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002655 }
Fred Drake8f51f542001-10-04 14:48:42 +00002656 if (tstate->c_profilefunc) {
Fred Drake4ec5d562001-10-04 19:26:43 +00002657 if (why == WHY_EXCEPTION)
2658 call_trace_protected(tstate->c_profilefunc,
2659 tstate->c_profileobj, f,
Armin Rigo1c2d7e52005-09-20 18:34:01 +00002660 PyTrace_RETURN, NULL);
Fred Drake4ec5d562001-10-04 19:26:43 +00002661 else if (call_trace(tstate->c_profilefunc,
2662 tstate->c_profileobj, f,
2663 PyTrace_RETURN, retval)) {
Fred Drake9e3ad782001-07-03 23:39:52 +00002664 Py_XDECREF(retval);
2665 retval = NULL;
2666 why = WHY_EXCEPTION;
2667 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002668 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002669 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002670
Tim Peters7df5e7f2006-05-26 23:14:37 +00002671 if (tstate->frame->f_exc_type != NULL)
2672 reset_exc_info(tstate);
2673 else {
2674 assert(tstate->frame->f_exc_value == NULL);
2675 assert(tstate->frame->f_exc_traceback == NULL);
2676 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00002677
Tim Peters5ca576e2001-06-18 22:08:13 +00002678 /* pop frame */
Thomas Woutersae406c62007-09-19 17:27:43 +00002679exit_eval_frame:
Armin Rigo2b3eb402003-10-28 12:05:48 +00002680 Py_LeaveRecursiveCall();
Guido van Rossuma027efa1997-05-05 20:56:21 +00002681 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00002682
Guido van Rossum96a42c81992-01-12 02:29:51 +00002683 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002684}
2685
Guido van Rossumc2e20742006-02-27 22:32:47 +00002686/* This is gonna seem *real weird*, but if you put some other code between
Martin v. Löwis8d97e332004-06-27 15:43:12 +00002687 PyEval_EvalFrame() and PyEval_EvalCodeEx() you will need to adjust
Guido van Rossumc2e20742006-02-27 22:32:47 +00002688 the test in the if statements in Misc/gdbinit (pystack and pystackv). */
Skip Montanaro786ea6b2004-03-01 15:44:05 +00002689
Tim Peters6d6c1a32001-08-02 04:15:00 +00002690PyObject *
2691PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals,
Tim Peters5ca576e2001-06-18 22:08:13 +00002692 PyObject **args, int argcount, PyObject **kws, int kwcount,
2693 PyObject **defs, int defcount, PyObject *closure)
2694{
2695 register PyFrameObject *f;
2696 register PyObject *retval = NULL;
2697 register PyObject **fastlocals, **freevars;
2698 PyThreadState *tstate = PyThreadState_GET();
2699 PyObject *x, *u;
2700
2701 if (globals == NULL) {
Tim Peters8a5c3c72004-04-05 19:36:21 +00002702 PyErr_SetString(PyExc_SystemError,
Jeremy Hylton910d7d42001-08-12 21:52:24 +00002703 "PyEval_EvalCodeEx: NULL globals");
Tim Peters5ca576e2001-06-18 22:08:13 +00002704 return NULL;
2705 }
2706
Neal Norwitzdf6a6492006-08-13 18:10:10 +00002707 assert(tstate != NULL);
Jeremy Hylton985eba52003-02-05 23:13:00 +00002708 assert(globals != NULL);
2709 f = PyFrame_New(tstate, co, globals, locals);
Tim Peters5ca576e2001-06-18 22:08:13 +00002710 if (f == NULL)
2711 return NULL;
2712
2713 fastlocals = f->f_localsplus;
Richard Jonescebbefc2006-05-23 18:28:17 +00002714 freevars = f->f_localsplus + co->co_nlocals;
Tim Peters5ca576e2001-06-18 22:08:13 +00002715
2716 if (co->co_argcount > 0 ||
2717 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
2718 int i;
2719 int n = argcount;
2720 PyObject *kwdict = NULL;
2721 if (co->co_flags & CO_VARKEYWORDS) {
2722 kwdict = PyDict_New();
2723 if (kwdict == NULL)
2724 goto fail;
2725 i = co->co_argcount;
2726 if (co->co_flags & CO_VARARGS)
2727 i++;
2728 SETLOCAL(i, kwdict);
2729 }
2730 if (argcount > co->co_argcount) {
2731 if (!(co->co_flags & CO_VARARGS)) {
2732 PyErr_Format(PyExc_TypeError,
2733 "%.200s() takes %s %d "
2734 "%sargument%s (%d given)",
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002735 PyString_AsString(co->co_name),
Tim Peters5ca576e2001-06-18 22:08:13 +00002736 defcount ? "at most" : "exactly",
2737 co->co_argcount,
2738 kwcount ? "non-keyword " : "",
2739 co->co_argcount == 1 ? "" : "s",
2740 argcount);
2741 goto fail;
2742 }
2743 n = co->co_argcount;
2744 }
2745 for (i = 0; i < n; i++) {
2746 x = args[i];
2747 Py_INCREF(x);
2748 SETLOCAL(i, x);
2749 }
2750 if (co->co_flags & CO_VARARGS) {
2751 u = PyTuple_New(argcount - n);
2752 if (u == NULL)
2753 goto fail;
2754 SETLOCAL(co->co_argcount, u);
2755 for (i = n; i < argcount; i++) {
2756 x = args[i];
2757 Py_INCREF(x);
2758 PyTuple_SET_ITEM(u, i-n, x);
2759 }
2760 }
2761 for (i = 0; i < kwcount; i++) {
2762 PyObject *keyword = kws[2*i];
2763 PyObject *value = kws[2*i + 1];
2764 int j;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002765 if (keyword == NULL || !PyString_Check(keyword)) {
Tim Peters5ca576e2001-06-18 22:08:13 +00002766 PyErr_Format(PyExc_TypeError,
2767 "%.200s() keywords must be strings",
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002768 PyString_AsString(co->co_name));
Tim Peters5ca576e2001-06-18 22:08:13 +00002769 goto fail;
2770 }
2771 /* XXX slow -- speed up using dictionary? */
2772 for (j = 0; j < co->co_argcount; j++) {
2773 PyObject *nm = PyTuple_GET_ITEM(
2774 co->co_varnames, j);
2775 int cmp = PyObject_RichCompareBool(
2776 keyword, nm, Py_EQ);
2777 if (cmp > 0)
2778 break;
2779 else if (cmp < 0)
2780 goto fail;
2781 }
2782 /* Check errors from Compare */
2783 if (PyErr_Occurred())
2784 goto fail;
2785 if (j >= co->co_argcount) {
2786 if (kwdict == NULL) {
2787 PyErr_Format(PyExc_TypeError,
2788 "%.200s() got an unexpected "
2789 "keyword argument '%.400s'",
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002790 PyString_AsString(co->co_name),
2791 PyString_AsString(keyword));
Tim Peters5ca576e2001-06-18 22:08:13 +00002792 goto fail;
2793 }
2794 PyDict_SetItem(kwdict, keyword, value);
2795 }
2796 else {
2797 if (GETLOCAL(j) != NULL) {
2798 PyErr_Format(PyExc_TypeError,
2799 "%.200s() got multiple "
2800 "values for keyword "
2801 "argument '%.400s'",
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002802 PyString_AsString(co->co_name),
2803 PyString_AsString(keyword));
Tim Peters5ca576e2001-06-18 22:08:13 +00002804 goto fail;
2805 }
2806 Py_INCREF(value);
2807 SETLOCAL(j, value);
2808 }
2809 }
2810 if (argcount < co->co_argcount) {
2811 int m = co->co_argcount - defcount;
2812 for (i = argcount; i < m; i++) {
2813 if (GETLOCAL(i) == NULL) {
2814 PyErr_Format(PyExc_TypeError,
2815 "%.200s() takes %s %d "
2816 "%sargument%s (%d given)",
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002817 PyString_AsString(co->co_name),
Tim Peters5ca576e2001-06-18 22:08:13 +00002818 ((co->co_flags & CO_VARARGS) ||
2819 defcount) ? "at least"
2820 : "exactly",
2821 m, kwcount ? "non-keyword " : "",
2822 m == 1 ? "" : "s", i);
2823 goto fail;
2824 }
2825 }
2826 if (n > m)
2827 i = n - m;
2828 else
2829 i = 0;
2830 for (; i < defcount; i++) {
2831 if (GETLOCAL(m+i) == NULL) {
2832 PyObject *def = defs[i];
2833 Py_INCREF(def);
2834 SETLOCAL(m+i, def);
2835 }
2836 }
2837 }
2838 }
2839 else {
2840 if (argcount > 0 || kwcount > 0) {
2841 PyErr_Format(PyExc_TypeError,
2842 "%.200s() takes no arguments (%d given)",
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002843 PyString_AsString(co->co_name),
Tim Peters5ca576e2001-06-18 22:08:13 +00002844 argcount + kwcount);
2845 goto fail;
2846 }
2847 }
2848 /* Allocate and initialize storage for cell vars, and copy free
2849 vars into frame. This isn't too efficient right now. */
Richard Jonescebbefc2006-05-23 18:28:17 +00002850 if (PyTuple_GET_SIZE(co->co_cellvars)) {
Neal Norwitz245ce8d2006-06-12 02:16:10 +00002851 int i, j, nargs, found;
Tim Peters5ca576e2001-06-18 22:08:13 +00002852 char *cellname, *argname;
2853 PyObject *c;
2854
2855 nargs = co->co_argcount;
2856 if (co->co_flags & CO_VARARGS)
2857 nargs++;
2858 if (co->co_flags & CO_VARKEYWORDS)
2859 nargs++;
2860
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002861 /* Initialize each cell var, taking into account
2862 cell vars that are initialized from arguments.
2863
2864 Should arrange for the compiler to put cellvars
2865 that are arguments at the beginning of the cellvars
2866 list so that we can march over it more efficiently?
2867 */
Richard Jonescebbefc2006-05-23 18:28:17 +00002868 for (i = 0; i < PyTuple_GET_SIZE(co->co_cellvars); ++i) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002869 cellname = PyString_AS_STRING(
Tim Peters5ca576e2001-06-18 22:08:13 +00002870 PyTuple_GET_ITEM(co->co_cellvars, i));
2871 found = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002872 for (j = 0; j < nargs; j++) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002873 argname = PyString_AS_STRING(
Tim Peters5ca576e2001-06-18 22:08:13 +00002874 PyTuple_GET_ITEM(co->co_varnames, j));
2875 if (strcmp(cellname, argname) == 0) {
2876 c = PyCell_New(GETLOCAL(j));
2877 if (c == NULL)
2878 goto fail;
Richard Jonescebbefc2006-05-23 18:28:17 +00002879 GETLOCAL(co->co_nlocals + i) = c;
Tim Peters5ca576e2001-06-18 22:08:13 +00002880 found = 1;
2881 break;
2882 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002883 }
2884 if (found == 0) {
2885 c = PyCell_New(NULL);
2886 if (c == NULL)
2887 goto fail;
Richard Jonescebbefc2006-05-23 18:28:17 +00002888 SETLOCAL(co->co_nlocals + i, c);
Tim Peters5ca576e2001-06-18 22:08:13 +00002889 }
2890 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002891 }
Richard Jonescebbefc2006-05-23 18:28:17 +00002892 if (PyTuple_GET_SIZE(co->co_freevars)) {
Tim Peters5ca576e2001-06-18 22:08:13 +00002893 int i;
Richard Jonescebbefc2006-05-23 18:28:17 +00002894 for (i = 0; i < PyTuple_GET_SIZE(co->co_freevars); ++i) {
Tim Peters5ca576e2001-06-18 22:08:13 +00002895 PyObject *o = PyTuple_GET_ITEM(closure, i);
2896 Py_INCREF(o);
Richard Jonescebbefc2006-05-23 18:28:17 +00002897 freevars[PyTuple_GET_SIZE(co->co_cellvars) + i] = o;
Tim Peters5ca576e2001-06-18 22:08:13 +00002898 }
2899 }
2900
Tim Peters5ca576e2001-06-18 22:08:13 +00002901 if (co->co_flags & CO_GENERATOR) {
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002902 /* Don't need to keep the reference to f_back, it will be set
2903 * when the generator is resumed. */
Tim Peters5ba58662001-07-16 02:29:45 +00002904 Py_XDECREF(f->f_back);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002905 f->f_back = NULL;
2906
Jeremy Hylton985eba52003-02-05 23:13:00 +00002907 PCALL(PCALL_GENERATOR);
2908
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002909 /* Create a new generator that owns the ready to run frame
2910 * and return that as the value. */
Martin v. Löwise440e472004-06-01 15:22:42 +00002911 return PyGen_New(f);
Tim Peters5ca576e2001-06-18 22:08:13 +00002912 }
2913
Thomas Woutersae406c62007-09-19 17:27:43 +00002914 retval = PyEval_EvalFrameEx(f,0);
Tim Peters5ca576e2001-06-18 22:08:13 +00002915
Thomas Woutersae406c62007-09-19 17:27:43 +00002916fail: /* Jump here from prelude on failure */
Tim Peters5ca576e2001-06-18 22:08:13 +00002917
Tim Petersb13680b2001-11-27 23:29:29 +00002918 /* decref'ing the frame can cause __del__ methods to get invoked,
2919 which can call back into Python. While we're done with the
2920 current Python frame (f), the associated C stack is still in use,
2921 so recursion_depth must be boosted for the duration.
2922 */
2923 assert(tstate != NULL);
2924 ++tstate->recursion_depth;
Thomas Woutersae406c62007-09-19 17:27:43 +00002925 Py_DECREF(f);
Tim Petersb13680b2001-11-27 23:29:29 +00002926 --tstate->recursion_depth;
Tim Peters5ca576e2001-06-18 22:08:13 +00002927 return retval;
2928}
2929
2930
Guido van Rossumc9fbb722003-03-01 03:36:33 +00002931/* Implementation notes for set_exc_info() and reset_exc_info():
2932
2933- Below, 'exc_ZZZ' stands for 'exc_type', 'exc_value' and
2934 'exc_traceback'. These always travel together.
2935
2936- tstate->curexc_ZZZ is the "hot" exception that is set by
2937 PyErr_SetString(), cleared by PyErr_Clear(), and so on.
2938
2939- Once an exception is caught by an except clause, it is transferred
2940 from tstate->curexc_ZZZ to tstate->exc_ZZZ, from which sys.exc_info()
2941 can pick it up. This is the primary task of set_exc_info().
Tim Peters7df5e7f2006-05-26 23:14:37 +00002942 XXX That can't be right: set_exc_info() doesn't look at tstate->curexc_ZZZ.
Guido van Rossumc9fbb722003-03-01 03:36:33 +00002943
2944- Now let me explain the complicated dance with frame->f_exc_ZZZ.
2945
2946 Long ago, when none of this existed, there were just a few globals:
2947 one set corresponding to the "hot" exception, and one set
2948 corresponding to sys.exc_ZZZ. (Actually, the latter weren't C
2949 globals; they were simply stored as sys.exc_ZZZ. For backwards
2950 compatibility, they still are!) The problem was that in code like
2951 this:
2952
2953 try:
2954 "something that may fail"
2955 except "some exception":
2956 "do something else first"
2957 "print the exception from sys.exc_ZZZ."
2958
2959 if "do something else first" invoked something that raised and caught
2960 an exception, sys.exc_ZZZ were overwritten. That was a frequent
2961 cause of subtle bugs. I fixed this by changing the semantics as
2962 follows:
2963
2964 - Within one frame, sys.exc_ZZZ will hold the last exception caught
2965 *in that frame*.
2966
2967 - But initially, and as long as no exception is caught in a given
2968 frame, sys.exc_ZZZ will hold the last exception caught in the
2969 previous frame (or the frame before that, etc.).
2970
2971 The first bullet fixed the bug in the above example. The second
2972 bullet was for backwards compatibility: it was (and is) common to
2973 have a function that is called when an exception is caught, and to
2974 have that function access the caught exception via sys.exc_ZZZ.
2975 (Example: traceback.print_exc()).
2976
2977 At the same time I fixed the problem that sys.exc_ZZZ weren't
2978 thread-safe, by introducing sys.exc_info() which gets it from tstate;
2979 but that's really a separate improvement.
2980
2981 The reset_exc_info() function in ceval.c restores the tstate->exc_ZZZ
2982 variables to what they were before the current frame was called. The
2983 set_exc_info() function saves them on the frame so that
2984 reset_exc_info() can restore them. The invariant is that
2985 frame->f_exc_ZZZ is NULL iff the current frame never caught an
2986 exception (where "catching" an exception applies only to successful
2987 except clauses); and if the current frame ever caught an exception,
2988 frame->f_exc_ZZZ is the exception that was stored in tstate->exc_ZZZ
2989 at the start of the current frame.
2990
2991*/
2992
Fredrik Lundh7a830892006-05-27 10:39:48 +00002993static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002994set_exc_info(PyThreadState *tstate,
2995 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002996{
Tim Peters7df5e7f2006-05-26 23:14:37 +00002997 PyFrameObject *frame = tstate->frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002998 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002999
Tim Peters7df5e7f2006-05-26 23:14:37 +00003000 assert(type != NULL);
3001 assert(frame != NULL);
Guido van Rossuma027efa1997-05-05 20:56:21 +00003002 if (frame->f_exc_type == NULL) {
Tim Peters7df5e7f2006-05-26 23:14:37 +00003003 assert(frame->f_exc_value == NULL);
3004 assert(frame->f_exc_traceback == NULL);
3005 /* This frame didn't catch an exception before. */
3006 /* Save previous exception of this thread in this frame. */
Guido van Rossuma027efa1997-05-05 20:56:21 +00003007 if (tstate->exc_type == NULL) {
Tim Peters7df5e7f2006-05-26 23:14:37 +00003008 /* XXX Why is this set to Py_None? */
Guido van Rossuma027efa1997-05-05 20:56:21 +00003009 Py_INCREF(Py_None);
3010 tstate->exc_type = Py_None;
3011 }
Tim Peters7df5e7f2006-05-26 23:14:37 +00003012 Py_INCREF(tstate->exc_type);
Guido van Rossuma027efa1997-05-05 20:56:21 +00003013 Py_XINCREF(tstate->exc_value);
3014 Py_XINCREF(tstate->exc_traceback);
3015 frame->f_exc_type = tstate->exc_type;
3016 frame->f_exc_value = tstate->exc_value;
3017 frame->f_exc_traceback = tstate->exc_traceback;
3018 }
Tim Peters7df5e7f2006-05-26 23:14:37 +00003019 /* Set new exception for this thread. */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00003020 tmp_type = tstate->exc_type;
3021 tmp_value = tstate->exc_value;
3022 tmp_tb = tstate->exc_traceback;
Tim Peters7df5e7f2006-05-26 23:14:37 +00003023 Py_INCREF(type);
Guido van Rossuma027efa1997-05-05 20:56:21 +00003024 Py_XINCREF(value);
3025 Py_XINCREF(tb);
3026 tstate->exc_type = type;
3027 tstate->exc_value = value;
3028 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00003029 Py_XDECREF(tmp_type);
3030 Py_XDECREF(tmp_value);
3031 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00003032 /* For b/w compatibility */
3033 PySys_SetObject("exc_type", type);
3034 PySys_SetObject("exc_value", value);
3035 PySys_SetObject("exc_traceback", tb);
3036}
3037
Fredrik Lundh7a830892006-05-27 10:39:48 +00003038static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003039reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003040{
3041 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00003042 PyObject *tmp_type, *tmp_value, *tmp_tb;
Tim Peters7df5e7f2006-05-26 23:14:37 +00003043
3044 /* It's a precondition that the thread state's frame caught an
3045 * exception -- verify in a debug build.
3046 */
3047 assert(tstate != NULL);
Guido van Rossuma027efa1997-05-05 20:56:21 +00003048 frame = tstate->frame;
Tim Peters7df5e7f2006-05-26 23:14:37 +00003049 assert(frame != NULL);
3050 assert(frame->f_exc_type != NULL);
3051
3052 /* Copy the frame's exception info back to the thread state. */
3053 tmp_type = tstate->exc_type;
3054 tmp_value = tstate->exc_value;
3055 tmp_tb = tstate->exc_traceback;
3056 Py_INCREF(frame->f_exc_type);
3057 Py_XINCREF(frame->f_exc_value);
3058 Py_XINCREF(frame->f_exc_traceback);
3059 tstate->exc_type = frame->f_exc_type;
3060 tstate->exc_value = frame->f_exc_value;
3061 tstate->exc_traceback = frame->f_exc_traceback;
3062 Py_XDECREF(tmp_type);
3063 Py_XDECREF(tmp_value);
3064 Py_XDECREF(tmp_tb);
3065
3066 /* For b/w compatibility */
3067 PySys_SetObject("exc_type", frame->f_exc_type);
3068 PySys_SetObject("exc_value", frame->f_exc_value);
3069 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
3070
3071 /* Clear the frame's exception info. */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00003072 tmp_type = frame->f_exc_type;
3073 tmp_value = frame->f_exc_value;
3074 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003075 frame->f_exc_type = NULL;
3076 frame->f_exc_value = NULL;
3077 frame->f_exc_traceback = NULL;
Tim Peters7df5e7f2006-05-26 23:14:37 +00003078 Py_DECREF(tmp_type);
Guido van Rossumdf4c3081997-05-20 17:06:11 +00003079 Py_XDECREF(tmp_value);
3080 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00003081}
3082
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003083/* Logic for the raise statement (too complicated for inlining).
3084 This *consumes* a reference count to each of its arguments. */
Fredrik Lundh7a830892006-05-27 10:39:48 +00003085static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003086do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003087{
Guido van Rossumd295f121998-04-09 21:39:57 +00003088 if (type == NULL) {
3089 /* Reraise */
Nicholas Bastine5662ae2004-03-24 22:22:12 +00003090 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossumd295f121998-04-09 21:39:57 +00003091 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
3092 value = tstate->exc_value;
3093 tb = tstate->exc_traceback;
3094 Py_XINCREF(type);
3095 Py_XINCREF(value);
3096 Py_XINCREF(tb);
3097 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003098
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003099 /* We support the following forms of raise:
3100 raise <class>, <classinstance>
3101 raise <class>, <argument tuple>
3102 raise <class>, None
3103 raise <class>, <argument>
3104 raise <classinstance>, None
3105 raise <string>, <object>
3106 raise <string>, None
3107
3108 An omitted second argument is the same as None.
3109
3110 In addition, raise <tuple>, <anything> is the same as
3111 raising the tuple's first item (and it better have one!);
3112 this rule is applied recursively.
3113
3114 Finally, an optional third argument can be supplied, which
3115 gives the traceback to be substituted (useful when
3116 re-raising an exception after examining it). */
3117
3118 /* First, check the traceback argument, replacing None with
3119 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00003120 if (tb == Py_None) {
3121 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003122 tb = NULL;
3123 }
3124 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003125 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003126 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003127 goto raise_error;
3128 }
3129
3130 /* Next, replace a missing value with None */
3131 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003132 value = Py_None;
3133 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003134 }
3135
3136 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00003137 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
3138 PyObject *tmp = type;
3139 type = PyTuple_GET_ITEM(type, 0);
3140 Py_INCREF(type);
3141 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003142 }
3143
Brett Cannon129bd522007-01-30 21:34:36 +00003144 if (PyExceptionClass_Check(type))
Barry Warsaw4249f541997-08-22 21:26:19 +00003145 PyErr_NormalizeException(&type, &value, &tb);
3146
Brett Cannonbf364092006-03-01 04:25:17 +00003147 else if (PyExceptionInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003148 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00003149 if (value != Py_None) {
3150 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003151 "instance exception may not have a separate value");
3152 goto raise_error;
3153 }
3154 else {
3155 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00003156 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003157 value = type;
Brett Cannonbf364092006-03-01 04:25:17 +00003158 type = PyExceptionInstance_Class(type);
Guido van Rossumb209a111997-04-29 18:18:01 +00003159 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003160 }
3161 }
3162 else {
3163 /* Not something you can raise. You get an exception
3164 anyway, just not what you specified :-) */
Jeremy Hylton960d9482001-04-27 02:25:33 +00003165 PyErr_Format(PyExc_TypeError,
Benjamin Petersonf19a7b92008-04-27 18:40:21 +00003166 "exceptions must be classes or instances, not %s",
3167 type->ob_type->tp_name);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003168 goto raise_error;
3169 }
Guido van Rossum504153d2008-03-18 04:26:48 +00003170
3171 assert(PyExceptionClass_Check(type));
3172 if (Py_Py3kWarningFlag && PyClass_Check(type)) {
Benjamin Peterson9f4f4812008-04-27 03:01:45 +00003173 if (PyErr_WarnEx(PyExc_DeprecationWarning,
Benjamin Petersonf19a7b92008-04-27 18:40:21 +00003174 "exceptions must derive from BaseException "
3175 "in 3.x", 1) < 0)
Guido van Rossum504153d2008-03-18 04:26:48 +00003176 goto raise_error;
3177 }
3178
Guido van Rossumb209a111997-04-29 18:18:01 +00003179 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003180 if (tb == NULL)
3181 return WHY_EXCEPTION;
3182 else
3183 return WHY_RERAISE;
3184 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00003185 Py_XDECREF(value);
3186 Py_XDECREF(type);
3187 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003188 return WHY_EXCEPTION;
3189}
3190
Tim Petersd6d010b2001-06-21 02:49:55 +00003191/* Iterate v argcnt times and store the results on the stack (via decreasing
3192 sp). Return 1 for success, 0 if error. */
3193
Fredrik Lundh7a830892006-05-27 10:39:48 +00003194static int
Tim Petersd6d010b2001-06-21 02:49:55 +00003195unpack_iterable(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00003196{
Tim Petersd6d010b2001-06-21 02:49:55 +00003197 int i = 0;
3198 PyObject *it; /* iter(v) */
Barry Warsawe42b18f1997-08-25 22:13:04 +00003199 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00003200
Tim Petersd6d010b2001-06-21 02:49:55 +00003201 assert(v != NULL);
3202
3203 it = PyObject_GetIter(v);
3204 if (it == NULL)
3205 goto Error;
3206
3207 for (; i < argcnt; i++) {
3208 w = PyIter_Next(it);
3209 if (w == NULL) {
3210 /* Iterator done, via error or exhaustion. */
3211 if (!PyErr_Occurred()) {
3212 PyErr_Format(PyExc_ValueError,
3213 "need more than %d value%s to unpack",
3214 i, i == 1 ? "" : "s");
3215 }
3216 goto Error;
Barry Warsawe42b18f1997-08-25 22:13:04 +00003217 }
3218 *--sp = w;
3219 }
Tim Petersd6d010b2001-06-21 02:49:55 +00003220
3221 /* We better have exhausted the iterator now. */
3222 w = PyIter_Next(it);
3223 if (w == NULL) {
3224 if (PyErr_Occurred())
3225 goto Error;
3226 Py_DECREF(it);
3227 return 1;
Barry Warsawe42b18f1997-08-25 22:13:04 +00003228 }
Guido van Rossumbb8f59a2001-12-03 19:33:25 +00003229 Py_DECREF(w);
Tim Petersd6d010b2001-06-21 02:49:55 +00003230 PyErr_SetString(PyExc_ValueError, "too many values to unpack");
Barry Warsawe42b18f1997-08-25 22:13:04 +00003231 /* fall through */
Tim Petersd6d010b2001-06-21 02:49:55 +00003232Error:
Barry Warsaw91010551997-08-25 22:30:51 +00003233 for (; i > 0; i--, sp++)
3234 Py_DECREF(*sp);
Tim Petersd6d010b2001-06-21 02:49:55 +00003235 Py_XDECREF(it);
Barry Warsawe42b18f1997-08-25 22:13:04 +00003236 return 0;
3237}
3238
3239
Guido van Rossum96a42c81992-01-12 02:29:51 +00003240#ifdef LLTRACE
Fredrik Lundh7a830892006-05-27 10:39:48 +00003241static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003242prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003243{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003244 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00003245 if (PyObject_Print(v, stdout, 0) != 0)
3246 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00003247 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00003248 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003249}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003250#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003251
Fredrik Lundh7a830892006-05-27 10:39:48 +00003252static void
Fred Drake5755ce62001-06-27 19:19:46 +00003253call_exc_trace(Py_tracefunc func, PyObject *self, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003254{
Guido van Rossumb209a111997-04-29 18:18:01 +00003255 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003256 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00003257 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00003258 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003259 value = Py_None;
3260 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00003261 }
Raymond Hettinger8ae46892003-10-12 19:09:37 +00003262 arg = PyTuple_Pack(3, type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003263 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003264 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003265 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003266 }
Fred Drake5755ce62001-06-27 19:19:46 +00003267 err = call_trace(func, self, f, PyTrace_EXCEPTION, arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00003268 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003269 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00003270 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003271 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00003272 Py_XDECREF(type);
3273 Py_XDECREF(value);
3274 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003275 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003276}
3277
Amaury Forgeot d'Arc0d75f092007-11-13 21:54:28 +00003278static int
Fred Drake4ec5d562001-10-04 19:26:43 +00003279call_trace_protected(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003280 int what, PyObject *arg)
Fred Drake4ec5d562001-10-04 19:26:43 +00003281{
3282 PyObject *type, *value, *traceback;
3283 int err;
3284 PyErr_Fetch(&type, &value, &traceback);
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003285 err = call_trace(func, obj, frame, what, arg);
Fred Drake4ec5d562001-10-04 19:26:43 +00003286 if (err == 0)
Amaury Forgeot d'Arc0d75f092007-11-13 21:54:28 +00003287 {
Fred Drake4ec5d562001-10-04 19:26:43 +00003288 PyErr_Restore(type, value, traceback);
Amaury Forgeot d'Arc0d75f092007-11-13 21:54:28 +00003289 return 0;
3290 }
Fred Drake4ec5d562001-10-04 19:26:43 +00003291 else {
3292 Py_XDECREF(type);
3293 Py_XDECREF(value);
3294 Py_XDECREF(traceback);
Amaury Forgeot d'Arc0d75f092007-11-13 21:54:28 +00003295 return -1;
Fred Drake4ec5d562001-10-04 19:26:43 +00003296 }
3297}
3298
Fredrik Lundh7a830892006-05-27 10:39:48 +00003299static int
Fred Drake5755ce62001-06-27 19:19:46 +00003300call_trace(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
3301 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00003302{
Fred Drake5755ce62001-06-27 19:19:46 +00003303 register PyThreadState *tstate = frame->f_tstate;
3304 int result;
3305 if (tstate->tracing)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003306 return 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003307 tstate->tracing++;
Fred Drake9e3ad782001-07-03 23:39:52 +00003308 tstate->use_tracing = 0;
Fred Drake5755ce62001-06-27 19:19:46 +00003309 result = func(obj, frame, what, arg);
Fred Drake9e3ad782001-07-03 23:39:52 +00003310 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
3311 || (tstate->c_profilefunc != NULL));
Guido van Rossuma027efa1997-05-05 20:56:21 +00003312 tstate->tracing--;
Fred Drake5755ce62001-06-27 19:19:46 +00003313 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00003314}
3315
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00003316PyObject *
3317_PyEval_CallTracing(PyObject *func, PyObject *args)
3318{
3319 PyFrameObject *frame = PyEval_GetFrame();
3320 PyThreadState *tstate = frame->f_tstate;
3321 int save_tracing = tstate->tracing;
3322 int save_use_tracing = tstate->use_tracing;
3323 PyObject *result;
3324
3325 tstate->tracing = 0;
3326 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
3327 || (tstate->c_profilefunc != NULL));
3328 result = PyObject_Call(func, args, NULL);
3329 tstate->tracing = save_tracing;
3330 tstate->use_tracing = save_use_tracing;
3331 return result;
3332}
3333
Fredrik Lundh7a830892006-05-27 10:39:48 +00003334static int
Tim Peters8a5c3c72004-04-05 19:36:21 +00003335maybe_call_line_trace(Py_tracefunc func, PyObject *obj,
Armin Rigobf57a142004-03-22 19:24:58 +00003336 PyFrameObject *frame, int *instr_lb, int *instr_ub,
3337 int *instr_prev)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003338{
Michael W. Hudson006c7522002-11-08 13:08:46 +00003339 int result = 0;
3340
Jeremy Hyltona4ebc132006-04-18 14:47:00 +00003341 /* If the last instruction executed isn't in the current
3342 instruction window, reset the window. If the last
3343 instruction happens to fall at the start of a line or if it
3344 represents a jump backwards, call the trace function.
3345 */
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00003346 if ((frame->f_lasti < *instr_lb || frame->f_lasti >= *instr_ub)) {
Thomas Woutersae406c62007-09-19 17:27:43 +00003347 int line;
3348 PyAddrPair bounds;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003349
Thomas Woutersae406c62007-09-19 17:27:43 +00003350 line = PyCode_CheckLineNumber(frame->f_code, frame->f_lasti,
3351 &bounds);
3352 if (line >= 0) {
Michael W. Hudson02ff6a92002-09-11 15:36:32 +00003353 frame->f_lineno = line;
Tim Peters8a5c3c72004-04-05 19:36:21 +00003354 result = call_trace(func, obj, frame,
Michael W. Hudson006c7522002-11-08 13:08:46 +00003355 PyTrace_LINE, Py_None);
Thomas Woutersae406c62007-09-19 17:27:43 +00003356 }
3357 *instr_lb = bounds.ap_lower;
3358 *instr_ub = bounds.ap_upper;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003359 }
Armin Rigobf57a142004-03-22 19:24:58 +00003360 else if (frame->f_lasti <= *instr_prev) {
Jeremy Hyltona4ebc132006-04-18 14:47:00 +00003361 result = call_trace(func, obj, frame, PyTrace_LINE, Py_None);
Armin Rigobf57a142004-03-22 19:24:58 +00003362 }
3363 *instr_prev = frame->f_lasti;
Michael W. Hudson006c7522002-11-08 13:08:46 +00003364 return result;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003365}
3366
Fred Drake5755ce62001-06-27 19:19:46 +00003367void
3368PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00003369{
Nicholas Bastine5662ae2004-03-24 22:22:12 +00003370 PyThreadState *tstate = PyThreadState_GET();
Fred Drake5755ce62001-06-27 19:19:46 +00003371 PyObject *temp = tstate->c_profileobj;
3372 Py_XINCREF(arg);
3373 tstate->c_profilefunc = NULL;
3374 tstate->c_profileobj = NULL;
Brett Cannon55fa66d2005-06-25 07:07:35 +00003375 /* Must make sure that tracing is not ignored if 'temp' is freed */
Fred Drake9e3ad782001-07-03 23:39:52 +00003376 tstate->use_tracing = tstate->c_tracefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00003377 Py_XDECREF(temp);
3378 tstate->c_profilefunc = func;
3379 tstate->c_profileobj = arg;
Brett Cannon55fa66d2005-06-25 07:07:35 +00003380 /* Flag that tracing or profiling is turned on */
Fred Drake9e3ad782001-07-03 23:39:52 +00003381 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
Fred Drake5755ce62001-06-27 19:19:46 +00003382}
3383
3384void
3385PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
3386{
Nicholas Bastine5662ae2004-03-24 22:22:12 +00003387 PyThreadState *tstate = PyThreadState_GET();
Fred Drake5755ce62001-06-27 19:19:46 +00003388 PyObject *temp = tstate->c_traceobj;
3389 Py_XINCREF(arg);
3390 tstate->c_tracefunc = NULL;
3391 tstate->c_traceobj = NULL;
Brett Cannon55fa66d2005-06-25 07:07:35 +00003392 /* Must make sure that profiling is not ignored if 'temp' is freed */
Fred Drake9e3ad782001-07-03 23:39:52 +00003393 tstate->use_tracing = tstate->c_profilefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00003394 Py_XDECREF(temp);
3395 tstate->c_tracefunc = func;
3396 tstate->c_traceobj = arg;
Brett Cannon55fa66d2005-06-25 07:07:35 +00003397 /* Flag that tracing or profiling is turned on */
Fred Drake9e3ad782001-07-03 23:39:52 +00003398 tstate->use_tracing = ((func != NULL)
3399 || (tstate->c_profilefunc != NULL));
Fred Draked0838392001-06-16 21:02:31 +00003400}
3401
Guido van Rossumb209a111997-04-29 18:18:01 +00003402PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003403PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00003404{
Guido van Rossum6297a7a2003-02-19 15:53:17 +00003405 PyFrameObject *current_frame = PyEval_GetFrame();
Guido van Rossum6135a871995-01-09 17:53:26 +00003406 if (current_frame == NULL)
Nicholas Bastine5662ae2004-03-24 22:22:12 +00003407 return PyThreadState_GET()->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00003408 else
3409 return current_frame->f_builtins;
3410}
3411
Guido van Rossumb209a111997-04-29 18:18:01 +00003412PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003413PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00003414{
Guido van Rossum6297a7a2003-02-19 15:53:17 +00003415 PyFrameObject *current_frame = PyEval_GetFrame();
Guido van Rossum5b722181993-03-30 17:46:03 +00003416 if (current_frame == NULL)
3417 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00003418 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00003419 return current_frame->f_locals;
3420}
3421
Guido van Rossumb209a111997-04-29 18:18:01 +00003422PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003423PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003424{
Guido van Rossum6297a7a2003-02-19 15:53:17 +00003425 PyFrameObject *current_frame = PyEval_GetFrame();
Guido van Rossum3f5da241990-12-20 15:06:42 +00003426 if (current_frame == NULL)
3427 return NULL;
3428 else
3429 return current_frame->f_globals;
3430}
3431
Guido van Rossum6297a7a2003-02-19 15:53:17 +00003432PyFrameObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003433PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00003434{
Nicholas Bastine5662ae2004-03-24 22:22:12 +00003435 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossum6297a7a2003-02-19 15:53:17 +00003436 return _PyThreadState_GetFrame(tstate);
Guido van Rossume59214e1994-08-30 08:01:59 +00003437}
3438
Guido van Rossum6135a871995-01-09 17:53:26 +00003439int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003440PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00003441{
Guido van Rossum6297a7a2003-02-19 15:53:17 +00003442 PyFrameObject *current_frame = PyEval_GetFrame();
Neal Norwitzb9845e72006-06-12 02:11:18 +00003443 return current_frame == NULL ? 0 : PyFrame_IsRestricted(current_frame);
Guido van Rossum6135a871995-01-09 17:53:26 +00003444}
3445
Guido van Rossumbe270261997-05-22 22:26:18 +00003446int
Tim Peters5ba58662001-07-16 02:29:45 +00003447PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
Jeremy Hylton061d1062001-03-22 02:32:48 +00003448{
Guido van Rossum6297a7a2003-02-19 15:53:17 +00003449 PyFrameObject *current_frame = PyEval_GetFrame();
Just van Rossum3aaf42c2003-02-10 08:21:10 +00003450 int result = cf->cf_flags != 0;
Tim Peters5ba58662001-07-16 02:29:45 +00003451
3452 if (current_frame != NULL) {
3453 const int codeflags = current_frame->f_code->co_flags;
Tim Peterse2c18e92001-08-17 20:47:47 +00003454 const int compilerflags = codeflags & PyCF_MASK;
3455 if (compilerflags) {
Tim Peters5ba58662001-07-16 02:29:45 +00003456 result = 1;
Tim Peterse2c18e92001-08-17 20:47:47 +00003457 cf->cf_flags |= compilerflags;
Tim Peters5ba58662001-07-16 02:29:45 +00003458 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00003459#if 0 /* future keyword */
Martin v. Löwis7198a522002-01-01 19:59:11 +00003460 if (codeflags & CO_GENERATOR_ALLOWED) {
3461 result = 1;
3462 cf->cf_flags |= CO_GENERATOR_ALLOWED;
3463 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00003464#endif
Tim Peters5ba58662001-07-16 02:29:45 +00003465 }
3466 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00003467}
3468
3469int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003470Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003471{
Guido van Rossumb209a111997-04-29 18:18:01 +00003472 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00003473 if (f == NULL)
3474 return 0;
3475 if (!PyFile_SoftSpace(f, 0))
3476 return 0;
3477 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003478}
3479
Guido van Rossum3f5da241990-12-20 15:06:42 +00003480
Guido van Rossum681d79a1995-07-18 14:51:37 +00003481/* External interface to call any callable object.
3482 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003483
Guido van Rossumd7ed6831997-08-30 15:02:50 +00003484#undef PyEval_CallObject
3485/* for backward compatibility: export this interface */
3486
Guido van Rossumb209a111997-04-29 18:18:01 +00003487PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003488PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003489{
Guido van Rossumb209a111997-04-29 18:18:01 +00003490 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003491}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00003492#define PyEval_CallObject(func,arg) \
3493 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00003494
Guido van Rossumb209a111997-04-29 18:18:01 +00003495PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003496PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003497{
Jeremy Hylton52820442001-01-03 23:52:36 +00003498 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003499
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00003500 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003501 arg = PyTuple_New(0);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00003502 if (arg == NULL)
3503 return NULL;
3504 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003505 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003506 PyErr_SetString(PyExc_TypeError,
3507 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00003508 return NULL;
3509 }
3510 else
Guido van Rossumb209a111997-04-29 18:18:01 +00003511 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003512
Guido van Rossumb209a111997-04-29 18:18:01 +00003513 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003514 PyErr_SetString(PyExc_TypeError,
3515 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00003516 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00003517 return NULL;
3518 }
3519
Tim Peters6d6c1a32001-08-02 04:15:00 +00003520 result = PyObject_Call(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00003521 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00003522 return result;
3523}
3524
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00003525const char *
Tim Peters6d6c1a32001-08-02 04:15:00 +00003526PyEval_GetFuncName(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003527{
3528 if (PyMethod_Check(func))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003529 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003530 else if (PyFunction_Check(func))
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003531 return PyString_AsString(((PyFunctionObject*)func)->func_name);
Jeremy Hylton512a2372001-04-11 13:52:29 +00003532 else if (PyCFunction_Check(func))
3533 return ((PyCFunctionObject*)func)->m_ml->ml_name;
3534 else if (PyClass_Check(func))
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003535 return PyString_AsString(((PyClassObject*)func)->cl_name);
Jeremy Hylton512a2372001-04-11 13:52:29 +00003536 else if (PyInstance_Check(func)) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003537 return PyString_AsString(
Jeremy Hylton512a2372001-04-11 13:52:29 +00003538 ((PyInstanceObject*)func)->in_class->cl_name);
3539 } else {
3540 return func->ob_type->tp_name;
3541 }
3542}
3543
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00003544const char *
Tim Peters6d6c1a32001-08-02 04:15:00 +00003545PyEval_GetFuncDesc(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003546{
3547 if (PyMethod_Check(func))
3548 return "()";
3549 else if (PyFunction_Check(func))
3550 return "()";
3551 else if (PyCFunction_Check(func))
3552 return "()";
3553 else if (PyClass_Check(func))
3554 return " constructor";
3555 else if (PyInstance_Check(func)) {
3556 return " instance";
3557 } else {
3558 return " object";
3559 }
3560}
3561
Fredrik Lundh7a830892006-05-27 10:39:48 +00003562static void
Jeremy Hylton192690e2002-08-16 18:36:11 +00003563err_args(PyObject *func, int flags, int nargs)
3564{
3565 if (flags & METH_NOARGS)
Tim Peters8a5c3c72004-04-05 19:36:21 +00003566 PyErr_Format(PyExc_TypeError,
Guido van Rossum86c659a2002-08-23 14:11:35 +00003567 "%.200s() takes no arguments (%d given)",
Tim Peters8a5c3c72004-04-05 19:36:21 +00003568 ((PyCFunctionObject *)func)->m_ml->ml_name,
Jeremy Hylton192690e2002-08-16 18:36:11 +00003569 nargs);
3570 else
Tim Peters8a5c3c72004-04-05 19:36:21 +00003571 PyErr_Format(PyExc_TypeError,
Guido van Rossum86c659a2002-08-23 14:11:35 +00003572 "%.200s() takes exactly one argument (%d given)",
Tim Peters8a5c3c72004-04-05 19:36:21 +00003573 ((PyCFunctionObject *)func)->m_ml->ml_name,
Jeremy Hylton192690e2002-08-16 18:36:11 +00003574 nargs);
3575}
3576
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003577#define C_TRACE(x, call) \
Nicholas Bastind858a772004-06-25 23:31:06 +00003578if (tstate->use_tracing && tstate->c_profilefunc) { \
3579 if (call_trace(tstate->c_profilefunc, \
3580 tstate->c_profileobj, \
3581 tstate->frame, PyTrace_C_CALL, \
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003582 func)) { \
3583 x = NULL; \
3584 } \
3585 else { \
3586 x = call; \
3587 if (tstate->c_profilefunc != NULL) { \
3588 if (x == NULL) { \
3589 call_trace_protected(tstate->c_profilefunc, \
3590 tstate->c_profileobj, \
3591 tstate->frame, PyTrace_C_EXCEPTION, \
3592 func); \
3593 /* XXX should pass (type, value, tb) */ \
3594 } else { \
3595 if (call_trace(tstate->c_profilefunc, \
3596 tstate->c_profileobj, \
3597 tstate->frame, PyTrace_C_RETURN, \
3598 func)) { \
3599 Py_DECREF(x); \
3600 x = NULL; \
3601 } \
3602 } \
Nicholas Bastinc69ebe82004-03-24 21:57:10 +00003603 } \
Nicholas Bastind858a772004-06-25 23:31:06 +00003604 } \
3605} else { \
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003606 x = call; \
Nicholas Bastinc69ebe82004-03-24 21:57:10 +00003607 }
3608
Fredrik Lundh7a830892006-05-27 10:39:48 +00003609static PyObject *
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00003610call_function(PyObject ***pp_stack, int oparg
3611#ifdef WITH_TSC
3612 , uint64* pintr0, uint64* pintr1
3613#endif
3614 )
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003615{
3616 int na = oparg & 0xff;
3617 int nk = (oparg>>8) & 0xff;
3618 int n = na + 2 * nk;
3619 PyObject **pfunc = (*pp_stack) - n - 1;
3620 PyObject *func = *pfunc;
3621 PyObject *x, *w;
3622
Jeremy Hylton985eba52003-02-05 23:13:00 +00003623 /* Always dispatch PyCFunction first, because these are
3624 presumed to be the most frequent callable object.
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003625 */
3626 if (PyCFunction_Check(func) && nk == 0) {
3627 int flags = PyCFunction_GET_FLAGS(func);
Nicholas Bastind858a772004-06-25 23:31:06 +00003628 PyThreadState *tstate = PyThreadState_GET();
Raymond Hettingera7f56bc2004-06-26 04:34:33 +00003629
3630 PCALL(PCALL_CFUNCTION);
Jeremy Hylton192690e2002-08-16 18:36:11 +00003631 if (flags & (METH_NOARGS | METH_O)) {
3632 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3633 PyObject *self = PyCFunction_GET_SELF(func);
Nicholas Bastinc69ebe82004-03-24 21:57:10 +00003634 if (flags & METH_NOARGS && na == 0) {
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003635 C_TRACE(x, (*meth)(self,NULL));
Nicholas Bastinc69ebe82004-03-24 21:57:10 +00003636 }
Jeremy Hylton192690e2002-08-16 18:36:11 +00003637 else if (flags & METH_O && na == 1) {
3638 PyObject *arg = EXT_POP(*pp_stack);
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003639 C_TRACE(x, (*meth)(self,arg));
Jeremy Hylton192690e2002-08-16 18:36:11 +00003640 Py_DECREF(arg);
3641 }
3642 else {
3643 err_args(func, flags, na);
3644 x = NULL;
3645 }
3646 }
3647 else {
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003648 PyObject *callargs;
3649 callargs = load_args(pp_stack, na);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00003650 READ_TIMESTAMP(*pintr0);
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003651 C_TRACE(x, PyCFunction_Call(func,callargs,NULL));
Michael W. Hudson75eabd22005-01-18 15:56:11 +00003652 READ_TIMESTAMP(*pintr1);
Tim Peters8a5c3c72004-04-05 19:36:21 +00003653 Py_XDECREF(callargs);
3654 }
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003655 } else {
3656 if (PyMethod_Check(func) && PyMethod_GET_SELF(func) != NULL) {
3657 /* optimize access to bound methods */
3658 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton985eba52003-02-05 23:13:00 +00003659 PCALL(PCALL_METHOD);
3660 PCALL(PCALL_BOUND_METHOD);
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003661 Py_INCREF(self);
3662 func = PyMethod_GET_FUNCTION(func);
3663 Py_INCREF(func);
3664 Py_DECREF(*pfunc);
3665 *pfunc = self;
3666 na++;
3667 n++;
3668 } else
3669 Py_INCREF(func);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00003670 READ_TIMESTAMP(*pintr0);
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003671 if (PyFunction_Check(func))
3672 x = fast_function(func, pp_stack, n, na, nk);
Tim Peters8a5c3c72004-04-05 19:36:21 +00003673 else
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003674 x = do_call(func, pp_stack, na, nk);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00003675 READ_TIMESTAMP(*pintr1);
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003676 Py_DECREF(func);
3677 }
Tim Peters8a5c3c72004-04-05 19:36:21 +00003678
Armin Rigod34fa522006-03-28 19:10:40 +00003679 /* Clear the stack of the function object. Also removes
3680 the arguments in case they weren't consumed already
3681 (fast_function() and err_args() leave them on the stack).
Thomas Wouters7f597322006-03-01 05:32:33 +00003682 */
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003683 while ((*pp_stack) > pfunc) {
3684 w = EXT_POP(*pp_stack);
3685 Py_DECREF(w);
Jeremy Hylton985eba52003-02-05 23:13:00 +00003686 PCALL(PCALL_POP);
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003687 }
3688 return x;
3689}
3690
Jeremy Hylton192690e2002-08-16 18:36:11 +00003691/* The fast_function() function optimize calls for which no argument
Jeremy Hylton52820442001-01-03 23:52:36 +00003692 tuple is necessary; the objects are passed directly from the stack.
Jeremy Hylton985eba52003-02-05 23:13:00 +00003693 For the simplest case -- a function that takes only positional
3694 arguments and is called with only positional arguments -- it
3695 inlines the most primitive frame setup code from
3696 PyEval_EvalCodeEx(), which vastly reduces the checks that must be
3697 done before evaluating the frame.
Jeremy Hylton52820442001-01-03 23:52:36 +00003698*/
3699
Fredrik Lundh7a830892006-05-27 10:39:48 +00003700static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00003701fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00003702{
Jeremy Hylton985eba52003-02-05 23:13:00 +00003703 PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003704 PyObject *globals = PyFunction_GET_GLOBALS(func);
3705 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
3706 PyObject **d = NULL;
3707 int nd = 0;
3708
Jeremy Hylton985eba52003-02-05 23:13:00 +00003709 PCALL(PCALL_FUNCTION);
3710 PCALL(PCALL_FAST_FUNCTION);
Raymond Hettinger40174c32003-05-31 07:04:16 +00003711 if (argdefs == NULL && co->co_argcount == n && nk==0 &&
Jeremy Hylton985eba52003-02-05 23:13:00 +00003712 co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) {
3713 PyFrameObject *f;
3714 PyObject *retval = NULL;
3715 PyThreadState *tstate = PyThreadState_GET();
3716 PyObject **fastlocals, **stack;
3717 int i;
3718
3719 PCALL(PCALL_FASTER_FUNCTION);
3720 assert(globals != NULL);
3721 /* XXX Perhaps we should create a specialized
3722 PyFrame_New() that doesn't take locals, but does
3723 take builtins without sanity checking them.
3724 */
Neal Norwitzdf6a6492006-08-13 18:10:10 +00003725 assert(tstate != NULL);
Jeremy Hylton985eba52003-02-05 23:13:00 +00003726 f = PyFrame_New(tstate, co, globals, NULL);
3727 if (f == NULL)
3728 return NULL;
3729
3730 fastlocals = f->f_localsplus;
3731 stack = (*pp_stack) - n;
3732
3733 for (i = 0; i < n; i++) {
3734 Py_INCREF(*stack);
3735 fastlocals[i] = *stack++;
3736 }
Phillip J. Eby0d6615f2005-08-02 00:46:46 +00003737 retval = PyEval_EvalFrameEx(f,0);
Jeremy Hylton985eba52003-02-05 23:13:00 +00003738 ++tstate->recursion_depth;
3739 Py_DECREF(f);
3740 --tstate->recursion_depth;
3741 return retval;
3742 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003743 if (argdefs != NULL) {
3744 d = &PyTuple_GET_ITEM(argdefs, 0);
Christian Heimese93237d2007-12-19 02:37:44 +00003745 nd = Py_SIZE(argdefs);
Jeremy Hylton52820442001-01-03 23:52:36 +00003746 }
Jeremy Hylton985eba52003-02-05 23:13:00 +00003747 return PyEval_EvalCodeEx(co, globals,
3748 (PyObject *)NULL, (*pp_stack)-n, na,
3749 (*pp_stack)-2*nk, nk, d, nd,
3750 PyFunction_GET_CLOSURE(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00003751}
3752
Fredrik Lundh7a830892006-05-27 10:39:48 +00003753static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00003754update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
3755 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00003756{
3757 PyObject *kwdict = NULL;
3758 if (orig_kwdict == NULL)
3759 kwdict = PyDict_New();
3760 else {
3761 kwdict = PyDict_Copy(orig_kwdict);
3762 Py_DECREF(orig_kwdict);
3763 }
3764 if (kwdict == NULL)
3765 return NULL;
Raymond Hettinger5bed4562004-04-10 23:34:17 +00003766 while (--nk >= 0) {
Jeremy Hylton52820442001-01-03 23:52:36 +00003767 int err;
3768 PyObject *value = EXT_POP(*pp_stack);
3769 PyObject *key = EXT_POP(*pp_stack);
3770 if (PyDict_GetItem(kwdict, key) != NULL) {
Thomas Woutersae406c62007-09-19 17:27:43 +00003771 PyErr_Format(PyExc_TypeError,
3772 "%.200s%s got multiple values "
3773 "for keyword argument '%.200s'",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003774 PyEval_GetFuncName(func),
3775 PyEval_GetFuncDesc(func),
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003776 PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00003777 Py_DECREF(key);
3778 Py_DECREF(value);
3779 Py_DECREF(kwdict);
3780 return NULL;
3781 }
3782 err = PyDict_SetItem(kwdict, key, value);
3783 Py_DECREF(key);
3784 Py_DECREF(value);
3785 if (err) {
3786 Py_DECREF(kwdict);
3787 return NULL;
3788 }
3789 }
3790 return kwdict;
3791}
3792
Fredrik Lundh7a830892006-05-27 10:39:48 +00003793static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00003794update_star_args(int nstack, int nstar, PyObject *stararg,
3795 PyObject ***pp_stack)
3796{
3797 PyObject *callargs, *w;
3798
3799 callargs = PyTuple_New(nstack + nstar);
3800 if (callargs == NULL) {
3801 return NULL;
3802 }
3803 if (nstar) {
3804 int i;
3805 for (i = 0; i < nstar; i++) {
3806 PyObject *a = PyTuple_GET_ITEM(stararg, i);
3807 Py_INCREF(a);
3808 PyTuple_SET_ITEM(callargs, nstack + i, a);
3809 }
3810 }
Raymond Hettinger5bed4562004-04-10 23:34:17 +00003811 while (--nstack >= 0) {
Jeremy Hylton52820442001-01-03 23:52:36 +00003812 w = EXT_POP(*pp_stack);
3813 PyTuple_SET_ITEM(callargs, nstack, w);
3814 }
3815 return callargs;
3816}
3817
Fredrik Lundh7a830892006-05-27 10:39:48 +00003818static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00003819load_args(PyObject ***pp_stack, int na)
3820{
3821 PyObject *args = PyTuple_New(na);
3822 PyObject *w;
3823
3824 if (args == NULL)
3825 return NULL;
Raymond Hettinger5bed4562004-04-10 23:34:17 +00003826 while (--na >= 0) {
Jeremy Hylton52820442001-01-03 23:52:36 +00003827 w = EXT_POP(*pp_stack);
3828 PyTuple_SET_ITEM(args, na, w);
3829 }
3830 return args;
3831}
3832
Fredrik Lundh7a830892006-05-27 10:39:48 +00003833static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00003834do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
3835{
3836 PyObject *callargs = NULL;
3837 PyObject *kwdict = NULL;
3838 PyObject *result = NULL;
3839
3840 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003841 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003842 if (kwdict == NULL)
3843 goto call_fail;
3844 }
3845 callargs = load_args(pp_stack, na);
3846 if (callargs == NULL)
3847 goto call_fail;
Jeremy Hylton985eba52003-02-05 23:13:00 +00003848#ifdef CALL_PROFILE
3849 /* At this point, we have to look at the type of func to
3850 update the call stats properly. Do it here so as to avoid
3851 exposing the call stats machinery outside ceval.c
3852 */
3853 if (PyFunction_Check(func))
3854 PCALL(PCALL_FUNCTION);
3855 else if (PyMethod_Check(func))
3856 PCALL(PCALL_METHOD);
3857 else if (PyType_Check(func))
3858 PCALL(PCALL_TYPE);
3859 else
3860 PCALL(PCALL_OTHER);
3861#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +00003862 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003863 call_fail:
3864 Py_XDECREF(callargs);
3865 Py_XDECREF(kwdict);
3866 return result;
3867}
3868
Fredrik Lundh7a830892006-05-27 10:39:48 +00003869static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00003870ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3871{
3872 int nstar = 0;
3873 PyObject *callargs = NULL;
3874 PyObject *stararg = NULL;
3875 PyObject *kwdict = NULL;
3876 PyObject *result = NULL;
3877
3878 if (flags & CALL_FLAG_KW) {
3879 kwdict = EXT_POP(*pp_stack);
Georg Brandl2134e752007-05-21 20:34:16 +00003880 if (!PyDict_Check(kwdict)) {
3881 PyObject *d;
3882 d = PyDict_New();
3883 if (d == NULL)
3884 goto ext_call_fail;
3885 if (PyDict_Update(d, kwdict) != 0) {
3886 Py_DECREF(d);
3887 /* PyDict_Update raises attribute
3888 * error (percolated from an attempt
3889 * to get 'keys' attribute) instead of
3890 * a type error if its second argument
3891 * is not a mapping.
3892 */
3893 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
3894 PyErr_Format(PyExc_TypeError,
3895 "%.200s%.200s argument after ** "
3896 "must be a mapping, not %.200s",
3897 PyEval_GetFuncName(func),
3898 PyEval_GetFuncDesc(func),
3899 kwdict->ob_type->tp_name);
3900 }
3901 goto ext_call_fail;
3902 }
3903 Py_DECREF(kwdict);
3904 kwdict = d;
Jeremy Hylton52820442001-01-03 23:52:36 +00003905 }
3906 }
3907 if (flags & CALL_FLAG_VAR) {
3908 stararg = EXT_POP(*pp_stack);
3909 if (!PyTuple_Check(stararg)) {
3910 PyObject *t = NULL;
3911 t = PySequence_Tuple(stararg);
3912 if (t == NULL) {
Jeremy Hylton512a2372001-04-11 13:52:29 +00003913 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
3914 PyErr_Format(PyExc_TypeError,
Georg Brandl2134e752007-05-21 20:34:16 +00003915 "%.200s%.200s argument after * "
3916 "must be a sequence, not %200s",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003917 PyEval_GetFuncName(func),
Georg Brandl2134e752007-05-21 20:34:16 +00003918 PyEval_GetFuncDesc(func),
3919 stararg->ob_type->tp_name);
Jeremy Hylton512a2372001-04-11 13:52:29 +00003920 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003921 goto ext_call_fail;
3922 }
3923 Py_DECREF(stararg);
3924 stararg = t;
3925 }
3926 nstar = PyTuple_GET_SIZE(stararg);
3927 }
3928 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003929 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003930 if (kwdict == NULL)
3931 goto ext_call_fail;
3932 }
3933 callargs = update_star_args(na, nstar, stararg, pp_stack);
3934 if (callargs == NULL)
3935 goto ext_call_fail;
Jeremy Hylton985eba52003-02-05 23:13:00 +00003936#ifdef CALL_PROFILE
3937 /* At this point, we have to look at the type of func to
3938 update the call stats properly. Do it here so as to avoid
3939 exposing the call stats machinery outside ceval.c
3940 */
3941 if (PyFunction_Check(func))
3942 PCALL(PCALL_FUNCTION);
3943 else if (PyMethod_Check(func))
3944 PCALL(PCALL_METHOD);
3945 else if (PyType_Check(func))
3946 PCALL(PCALL_TYPE);
3947 else
3948 PCALL(PCALL_OTHER);
3949#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +00003950 result = PyObject_Call(func, callargs, kwdict);
Thomas Woutersae406c62007-09-19 17:27:43 +00003951ext_call_fail:
Jeremy Hylton52820442001-01-03 23:52:36 +00003952 Py_XDECREF(callargs);
3953 Py_XDECREF(kwdict);
3954 Py_XDECREF(stararg);
3955 return result;
3956}
3957
Guido van Rossum38fff8c2006-03-07 18:50:55 +00003958/* Extract a slice index from a PyInt or PyLong or an object with the
3959 nb_index slot defined, and store in *pi.
3960 Silently reduce values larger than PY_SSIZE_T_MAX to PY_SSIZE_T_MAX,
3961 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 +00003962 Return 0 on error, 1 on success.
Tim Peterscb479e72001-12-16 19:11:44 +00003963*/
Tim Petersb5196382001-12-16 19:44:20 +00003964/* Note: If v is NULL, return success without storing into *pi. This
3965 is because_PyEval_SliceIndex() is called by apply_slice(), which can be
3966 called by the SLICE opcode with v and/or w equal to NULL.
Tim Peterscb479e72001-12-16 19:11:44 +00003967*/
Guido van Rossum20c6add2000-05-08 14:06:50 +00003968int
Martin v. Löwis18e16552006-02-15 17:27:45 +00003969_PyEval_SliceIndex(PyObject *v, Py_ssize_t *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003970{
Tim Petersb5196382001-12-16 19:44:20 +00003971 if (v != NULL) {
Martin v. Löwisdde99d22006-02-17 15:57:41 +00003972 Py_ssize_t x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003973 if (PyInt_Check(v)) {
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00003974 /* XXX(nnorwitz): I think PyInt_AS_LONG is correct,
3975 however, it looks like it should be AsSsize_t.
3976 There should be a comment here explaining why.
3977 */
3978 x = PyInt_AS_LONG(v);
Tim Peters7df5e7f2006-05-26 23:14:37 +00003979 }
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00003980 else if (PyIndex_Check(v)) {
3981 x = PyNumber_AsSsize_t(v, NULL);
Guido van Rossum38fff8c2006-03-07 18:50:55 +00003982 if (x == -1 && PyErr_Occurred())
3983 return 0;
3984 }
3985 else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003986 PyErr_SetString(PyExc_TypeError,
Guido van Rossum38fff8c2006-03-07 18:50:55 +00003987 "slice indices must be integers or "
3988 "None or have an __index__ method");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003989 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003990 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003991 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003992 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003993 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003994}
3995
Guido van Rossum38fff8c2006-03-07 18:50:55 +00003996#undef ISINDEX
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00003997#define ISINDEX(x) ((x) == NULL || \
3998 PyInt_Check(x) || PyLong_Check(x) || PyIndex_Check(x))
Guido van Rossum50d756e2001-08-18 17:43:36 +00003999
Fredrik Lundh7a830892006-05-27 10:39:48 +00004000static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004001apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004002{
Guido van Rossum50d756e2001-08-18 17:43:36 +00004003 PyTypeObject *tp = u->ob_type;
4004 PySequenceMethods *sq = tp->tp_as_sequence;
4005
Guido van Rossum38fff8c2006-03-07 18:50:55 +00004006 if (sq && sq->sq_slice && ISINDEX(v) && ISINDEX(w)) {
Martin v. Löwisdde99d22006-02-17 15:57:41 +00004007 Py_ssize_t ilow = 0, ihigh = PY_SSIZE_T_MAX;
Guido van Rossum50d756e2001-08-18 17:43:36 +00004008 if (!_PyEval_SliceIndex(v, &ilow))
4009 return NULL;
4010 if (!_PyEval_SliceIndex(w, &ihigh))
4011 return NULL;
4012 return PySequence_GetSlice(u, ilow, ihigh);
4013 }
4014 else {
4015 PyObject *slice = PySlice_New(v, w, NULL);
Guido van Rossum354797c2001-12-03 19:45:06 +00004016 if (slice != NULL) {
4017 PyObject *res = PyObject_GetItem(u, slice);
4018 Py_DECREF(slice);
4019 return res;
4020 }
Guido van Rossum50d756e2001-08-18 17:43:36 +00004021 else
4022 return NULL;
4023 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004024}
Guido van Rossum3f5da241990-12-20 15:06:42 +00004025
Fredrik Lundh7a830892006-05-27 10:39:48 +00004026static int
Guido van Rossumac7be682001-01-17 15:42:30 +00004027assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
4028 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004029{
Guido van Rossum50d756e2001-08-18 17:43:36 +00004030 PyTypeObject *tp = u->ob_type;
4031 PySequenceMethods *sq = tp->tp_as_sequence;
4032
Georg Brandl0fca97a2007-03-05 22:28:08 +00004033 if (sq && sq->sq_ass_slice && ISINDEX(v) && ISINDEX(w)) {
Martin v. Löwisdde99d22006-02-17 15:57:41 +00004034 Py_ssize_t ilow = 0, ihigh = PY_SSIZE_T_MAX;
Guido van Rossum50d756e2001-08-18 17:43:36 +00004035 if (!_PyEval_SliceIndex(v, &ilow))
4036 return -1;
4037 if (!_PyEval_SliceIndex(w, &ihigh))
4038 return -1;
4039 if (x == NULL)
4040 return PySequence_DelSlice(u, ilow, ihigh);
4041 else
4042 return PySequence_SetSlice(u, ilow, ihigh, x);
4043 }
4044 else {
4045 PyObject *slice = PySlice_New(v, w, NULL);
4046 if (slice != NULL) {
Guido van Rossum354797c2001-12-03 19:45:06 +00004047 int res;
Guido van Rossum50d756e2001-08-18 17:43:36 +00004048 if (x != NULL)
Guido van Rossum354797c2001-12-03 19:45:06 +00004049 res = PyObject_SetItem(u, slice, x);
Guido van Rossum50d756e2001-08-18 17:43:36 +00004050 else
Guido van Rossum354797c2001-12-03 19:45:06 +00004051 res = PyObject_DelItem(u, slice);
4052 Py_DECREF(slice);
4053 return res;
Guido van Rossum50d756e2001-08-18 17:43:36 +00004054 }
4055 else
4056 return -1;
4057 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004058}
4059
Guido van Rossum04edb522008-03-18 02:49:46 +00004060#define Py3kExceptionClass_Check(x) \
4061 (PyType_Check((x)) && \
4062 PyType_FastSubclass((PyTypeObject*)(x), Py_TPFLAGS_BASE_EXC_SUBCLASS))
4063
4064#define CANNOT_CATCH_MSG "catching classes that don't inherit from " \
Georg Brandld5b635f2008-03-25 08:29:14 +00004065 "BaseException is not allowed in 3.x"
Guido van Rossum04edb522008-03-18 02:49:46 +00004066
Fredrik Lundh7a830892006-05-27 10:39:48 +00004067static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004068cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004069{
Guido van Rossumac7be682001-01-17 15:42:30 +00004070 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004071 switch (op) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00004072 case PyCmp_IS:
Guido van Rossum3f5da241990-12-20 15:06:42 +00004073 res = (v == w);
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +00004074 break;
4075 case PyCmp_IS_NOT:
4076 res = (v != w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004077 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00004078 case PyCmp_IN:
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +00004079 res = PySequence_Contains(w, v);
4080 if (res < 0)
4081 return NULL;
4082 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00004083 case PyCmp_NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00004084 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004085 if (res < 0)
4086 return NULL;
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +00004087 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004088 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00004089 case PyCmp_EXC_MATCH:
Brett Cannon129bd522007-01-30 21:34:36 +00004090 if (PyTuple_Check(w)) {
4091 Py_ssize_t i, length;
4092 length = PyTuple_Size(w);
4093 for (i = 0; i < length; i += 1) {
4094 PyObject *exc = PyTuple_GET_ITEM(w, i);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004095 if (PyString_Check(exc)) {
Brett Cannon129bd522007-01-30 21:34:36 +00004096 int ret_val;
4097 ret_val = PyErr_WarnEx(
Thomas Wouterse2176022007-09-20 17:35:10 +00004098 PyExc_DeprecationWarning,
4099 "catching of string "
4100 "exceptions is deprecated", 1);
Benjamin Petersonf19a7b92008-04-27 18:40:21 +00004101 if (ret_val < 0)
Brett Cannon129bd522007-01-30 21:34:36 +00004102 return NULL;
4103 }
Guido van Rossum20bda582008-03-18 03:15:05 +00004104 else if (Py_Py3kWarningFlag &&
4105 !PyTuple_Check(exc) &&
4106 !Py3kExceptionClass_Check(exc))
Guido van Rossum04edb522008-03-18 02:49:46 +00004107 {
4108 int ret_val;
4109 ret_val = PyErr_WarnEx(
4110 PyExc_DeprecationWarning,
4111 CANNOT_CATCH_MSG, 1);
Benjamin Petersonf19a7b92008-04-27 18:40:21 +00004112 if (ret_val < 0)
Guido van Rossum04edb522008-03-18 02:49:46 +00004113 return NULL;
4114 }
Brett Cannon129bd522007-01-30 21:34:36 +00004115 }
4116 }
4117 else {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004118 if (PyString_Check(w)) {
Brett Cannon129bd522007-01-30 21:34:36 +00004119 int ret_val;
4120 ret_val = PyErr_WarnEx(
4121 PyExc_DeprecationWarning,
4122 "catching of string "
Thomas Wouterse2176022007-09-20 17:35:10 +00004123 "exceptions is deprecated", 1);
Benjamin Petersonf19a7b92008-04-27 18:40:21 +00004124 if (ret_val < 0)
Brett Cannon129bd522007-01-30 21:34:36 +00004125 return NULL;
4126 }
Guido van Rossum20bda582008-03-18 03:15:05 +00004127 else if (Py_Py3kWarningFlag &&
4128 !PyTuple_Check(w) &&
4129 !Py3kExceptionClass_Check(w))
Guido van Rossum04edb522008-03-18 02:49:46 +00004130 {
4131 int ret_val;
4132 ret_val = PyErr_WarnEx(
4133 PyExc_DeprecationWarning,
4134 CANNOT_CATCH_MSG, 1);
Benjamin Petersonf19a7b92008-04-27 18:40:21 +00004135 if (ret_val < 0)
Guido van Rossum04edb522008-03-18 02:49:46 +00004136 return NULL;
4137 }
Brett Cannon129bd522007-01-30 21:34:36 +00004138 }
Barry Warsaw4249f541997-08-22 21:26:19 +00004139 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004140 break;
4141 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00004142 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004143 }
Guido van Rossumb209a111997-04-29 18:18:01 +00004144 v = res ? Py_True : Py_False;
4145 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004146 return v;
4147}
4148
Fredrik Lundh7a830892006-05-27 10:39:48 +00004149static PyObject *
Thomas Wouters52152252000-08-17 22:55:00 +00004150import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00004151{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00004152 PyObject *x;
4153
4154 x = PyObject_GetAttr(v, name);
4155 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00004156 PyErr_Format(PyExc_ImportError,
4157 "cannot import name %.230s",
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004158 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00004159 }
Thomas Wouters52152252000-08-17 22:55:00 +00004160 return x;
4161}
Guido van Rossumac7be682001-01-17 15:42:30 +00004162
Fredrik Lundh7a830892006-05-27 10:39:48 +00004163static int
Thomas Wouters52152252000-08-17 22:55:00 +00004164import_all_from(PyObject *locals, PyObject *v)
4165{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00004166 PyObject *all = PyObject_GetAttrString(v, "__all__");
4167 PyObject *dict, *name, *value;
4168 int skip_leading_underscores = 0;
4169 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00004170
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00004171 if (all == NULL) {
4172 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
4173 return -1; /* Unexpected error */
4174 PyErr_Clear();
4175 dict = PyObject_GetAttrString(v, "__dict__");
4176 if (dict == NULL) {
4177 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
4178 return -1;
4179 PyErr_SetString(PyExc_ImportError,
4180 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00004181 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00004182 }
4183 all = PyMapping_Keys(dict);
4184 Py_DECREF(dict);
4185 if (all == NULL)
4186 return -1;
4187 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00004188 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00004189
4190 for (pos = 0, err = 0; ; pos++) {
4191 name = PySequence_GetItem(all, pos);
4192 if (name == NULL) {
4193 if (!PyErr_ExceptionMatches(PyExc_IndexError))
4194 err = -1;
4195 else
4196 PyErr_Clear();
4197 break;
4198 }
4199 if (skip_leading_underscores &&
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004200 PyString_Check(name) &&
4201 PyString_AS_STRING(name)[0] == '_')
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00004202 {
4203 Py_DECREF(name);
4204 continue;
4205 }
4206 value = PyObject_GetAttr(v, name);
4207 if (value == NULL)
4208 err = -1;
Armin Rigo70370852006-11-29 21:59:22 +00004209 else if (PyDict_CheckExact(locals))
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00004210 err = PyDict_SetItem(locals, name, value);
Armin Rigo70370852006-11-29 21:59:22 +00004211 else
4212 err = PyObject_SetItem(locals, name, value);
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00004213 Py_DECREF(name);
4214 Py_XDECREF(value);
4215 if (err != 0)
4216 break;
4217 }
4218 Py_DECREF(all);
4219 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00004220}
4221
Fredrik Lundh7a830892006-05-27 10:39:48 +00004222static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004223build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00004224{
Guido van Rossum7851eea2001-09-12 19:19:18 +00004225 PyObject *metaclass = NULL, *result, *base;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004226
4227 if (PyDict_Check(methods))
4228 metaclass = PyDict_GetItemString(methods, "__metaclass__");
Guido van Rossum7851eea2001-09-12 19:19:18 +00004229 if (metaclass != NULL)
Guido van Rossum2556f2e2001-12-06 14:09:56 +00004230 Py_INCREF(metaclass);
Guido van Rossum7851eea2001-09-12 19:19:18 +00004231 else if (PyTuple_Check(bases) && PyTuple_GET_SIZE(bases) > 0) {
4232 base = PyTuple_GET_ITEM(bases, 0);
4233 metaclass = PyObject_GetAttrString(base, "__class__");
4234 if (metaclass == NULL) {
4235 PyErr_Clear();
4236 metaclass = (PyObject *)base->ob_type;
4237 Py_INCREF(metaclass);
Guido van Rossum25831651993-05-19 14:50:45 +00004238 }
4239 }
Guido van Rossum7851eea2001-09-12 19:19:18 +00004240 else {
4241 PyObject *g = PyEval_GetGlobals();
4242 if (g != NULL && PyDict_Check(g))
4243 metaclass = PyDict_GetItemString(g, "__metaclass__");
4244 if (metaclass == NULL)
4245 metaclass = (PyObject *) &PyClass_Type;
4246 Py_INCREF(metaclass);
4247 }
Jeremy Hylton7c1e3472007-02-26 16:14:51 +00004248 result = PyObject_CallFunctionObjArgs(metaclass, name, bases, methods,
Thomas Woutersae406c62007-09-19 17:27:43 +00004249 NULL);
Guido van Rossum7851eea2001-09-12 19:19:18 +00004250 Py_DECREF(metaclass);
Raymond Hettingerf2c08302004-06-05 06:16:22 +00004251 if (result == NULL && PyErr_ExceptionMatches(PyExc_TypeError)) {
Tim Peters7df5e7f2006-05-26 23:14:37 +00004252 /* A type error here likely means that the user passed
Raymond Hettingerf2c08302004-06-05 06:16:22 +00004253 in a base that was not a class (such the random module
4254 instead of the random.random type). Help them out with
Raymond Hettingercfc31922004-09-16 16:41:57 +00004255 by augmenting the error message with more information.*/
4256
4257 PyObject *ptype, *pvalue, *ptraceback;
4258
4259 PyErr_Fetch(&ptype, &pvalue, &ptraceback);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004260 if (PyString_Check(pvalue)) {
Raymond Hettingercfc31922004-09-16 16:41:57 +00004261 PyObject *newmsg;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004262 newmsg = PyString_FromFormat(
Jeremy Hylton7c1e3472007-02-26 16:14:51 +00004263 "Error when calling the metaclass bases\n"
Thomas Woutersae406c62007-09-19 17:27:43 +00004264 " %s",
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004265 PyString_AS_STRING(pvalue));
Raymond Hettingercfc31922004-09-16 16:41:57 +00004266 if (newmsg != NULL) {
4267 Py_DECREF(pvalue);
4268 pvalue = newmsg;
4269 }
4270 }
4271 PyErr_Restore(ptype, pvalue, ptraceback);
Raymond Hettingerf2c08302004-06-05 06:16:22 +00004272 }
Guido van Rossum7851eea2001-09-12 19:19:18 +00004273 return result;
Guido van Rossum25831651993-05-19 14:50:45 +00004274}
4275
Fredrik Lundh7a830892006-05-27 10:39:48 +00004276static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004277exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
4278 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004279{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004280 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00004281 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004282 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004283
Guido van Rossumb209a111997-04-29 18:18:01 +00004284 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
4285 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004286 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00004287 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004288 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00004289 locals = PyTuple_GetItem(prog, 2);
4290 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004291 }
Guido van Rossumb209a111997-04-29 18:18:01 +00004292 if (globals == Py_None) {
4293 globals = PyEval_GetGlobals();
4294 if (locals == Py_None) {
4295 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00004296 plain = 1;
4297 }
Neal Norwitzdf6a6492006-08-13 18:10:10 +00004298 if (!globals || !locals) {
4299 PyErr_SetString(PyExc_SystemError,
4300 "globals and locals cannot be NULL");
4301 return -1;
4302 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004303 }
Guido van Rossumb209a111997-04-29 18:18:01 +00004304 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004305 locals = globals;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004306 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00004307 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00004308 !PyCode_Check(prog) &&
4309 !PyFile_Check(prog)) {
4310 PyErr_SetString(PyExc_TypeError,
Guido van Rossumac7be682001-01-17 15:42:30 +00004311 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004312 return -1;
4313 }
Fred Drake661ea262000-10-24 19:57:45 +00004314 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00004315 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00004316 "exec: arg 2 must be a dictionary or None");
4317 return -1;
4318 }
Raymond Hettinger66bd2332004-08-02 08:30:07 +00004319 if (!PyMapping_Check(locals)) {
Fred Drake661ea262000-10-24 19:57:45 +00004320 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger66bd2332004-08-02 08:30:07 +00004321 "exec: arg 3 must be a mapping or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004322 return -1;
4323 }
Guido van Rossumb209a111997-04-29 18:18:01 +00004324 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00004325 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00004326 if (PyCode_Check(prog)) {
Jeremy Hylton733c8932001-12-13 19:51:56 +00004327 if (PyCode_GetNumFree((PyCodeObject *)prog) > 0) {
4328 PyErr_SetString(PyExc_TypeError,
4329 "code object passed to exec may not contain free variables");
4330 return -1;
4331 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00004332 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004333 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00004334 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00004335 FILE *fp = PyFile_AsFile(prog);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004336 char *name = PyString_AsString(PyFile_Name(prog));
Jeremy Hylton714b1122007-02-25 16:01:58 +00004337 PyCompilerFlags cf;
Thomas Woutersae406c62007-09-19 17:27:43 +00004338 if (name == NULL)
4339 return -1;
Tim Peters5ba58662001-07-16 02:29:45 +00004340 cf.cf_flags = 0;
4341 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00004342 v = PyRun_FileFlags(fp, name, Py_file_input, globals,
Tim Peters8a5c3c72004-04-05 19:36:21 +00004343 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00004344 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00004345 v = PyRun_File(fp, name, Py_file_input, globals,
Tim Peters8a5c3c72004-04-05 19:36:21 +00004346 locals);
Guido van Rossuma400d8a2000-01-12 22:45:54 +00004347 }
4348 else {
Just van Rossum3aaf42c2003-02-10 08:21:10 +00004349 PyObject *tmp = NULL;
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00004350 char *str;
Tim Peters5ba58662001-07-16 02:29:45 +00004351 PyCompilerFlags cf;
Just van Rossum3aaf42c2003-02-10 08:21:10 +00004352 cf.cf_flags = 0;
4353#ifdef Py_USING_UNICODE
4354 if (PyUnicode_Check(prog)) {
4355 tmp = PyUnicode_AsUTF8String(prog);
4356 if (tmp == NULL)
4357 return -1;
4358 prog = tmp;
4359 cf.cf_flags |= PyCF_SOURCE_IS_UTF8;
4360 }
4361#endif
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004362 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004363 return -1;
Tim Peters5ba58662001-07-16 02:29:45 +00004364 if (PyEval_MergeCompilerFlags(&cf))
Tim Peters8a5c3c72004-04-05 19:36:21 +00004365 v = PyRun_StringFlags(str, Py_file_input, globals,
Jeremy Hyltonbc320242001-03-22 02:47:58 +00004366 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00004367 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00004368 v = PyRun_String(str, Py_file_input, globals, locals);
Just van Rossum3aaf42c2003-02-10 08:21:10 +00004369 Py_XDECREF(tmp);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004370 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00004371 if (plain)
4372 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004373 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004374 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00004375 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004376 return 0;
4377}
Guido van Rossum24c13741995-02-14 09:42:43 +00004378
Fredrik Lundh7a830892006-05-27 10:39:48 +00004379static void
Paul Prescode68140d2000-08-30 20:25:01 +00004380format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
4381{
4382 char *obj_str;
4383
4384 if (!obj)
4385 return;
4386
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004387 obj_str = PyString_AsString(obj);
Paul Prescode68140d2000-08-30 20:25:01 +00004388 if (!obj_str)
4389 return;
4390
4391 PyErr_Format(exc, format_str, obj_str);
4392}
Guido van Rossum950361c1997-01-24 13:49:28 +00004393
Fredrik Lundh7a830892006-05-27 10:39:48 +00004394static PyObject *
Raymond Hettinger52a21b82004-08-06 18:43:09 +00004395string_concatenate(PyObject *v, PyObject *w,
4396 PyFrameObject *f, unsigned char *next_instr)
4397{
4398 /* This function implements 'variable += expr' when both arguments
4399 are strings. */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004400 Py_ssize_t v_len = PyString_GET_SIZE(v);
4401 Py_ssize_t w_len = PyString_GET_SIZE(w);
Armin Rigo97ff0472006-08-09 15:37:26 +00004402 Py_ssize_t new_len = v_len + w_len;
4403 if (new_len < 0) {
4404 PyErr_SetString(PyExc_OverflowError,
4405 "strings are too large to concat");
4406 return NULL;
4407 }
Tim Peters7df5e7f2006-05-26 23:14:37 +00004408
Raymond Hettinger52a21b82004-08-06 18:43:09 +00004409 if (v->ob_refcnt == 2) {
4410 /* In the common case, there are 2 references to the value
4411 * stored in 'variable' when the += is performed: one on the
Thomas Wouterse2176022007-09-20 17:35:10 +00004412 * value stack (in 'v') and one still stored in the
4413 * 'variable'. We try to delete the variable now to reduce
4414 * the refcnt to 1.
Raymond Hettinger52a21b82004-08-06 18:43:09 +00004415 */
4416 switch (*next_instr) {
4417 case STORE_FAST:
4418 {
4419 int oparg = PEEKARG();
4420 PyObject **fastlocals = f->f_localsplus;
4421 if (GETLOCAL(oparg) == v)
4422 SETLOCAL(oparg, NULL);
4423 break;
4424 }
4425 case STORE_DEREF:
4426 {
Thomas Wouterse2176022007-09-20 17:35:10 +00004427 PyObject **freevars = (f->f_localsplus +
4428 f->f_code->co_nlocals);
Raymond Hettinger52a21b82004-08-06 18:43:09 +00004429 PyObject *c = freevars[PEEKARG()];
4430 if (PyCell_GET(c) == v)
4431 PyCell_Set(c, NULL);
4432 break;
4433 }
4434 case STORE_NAME:
4435 {
4436 PyObject *names = f->f_code->co_names;
4437 PyObject *name = GETITEM(names, PEEKARG());
4438 PyObject *locals = f->f_locals;
4439 if (PyDict_CheckExact(locals) &&
4440 PyDict_GetItem(locals, name) == v) {
4441 if (PyDict_DelItem(locals, name) != 0) {
4442 PyErr_Clear();
4443 }
4444 }
4445 break;
4446 }
4447 }
4448 }
4449
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004450 if (v->ob_refcnt == 1 && !PyString_CHECK_INTERNED(v)) {
Raymond Hettinger52a21b82004-08-06 18:43:09 +00004451 /* Now we own the last reference to 'v', so we can resize it
4452 * in-place.
4453 */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004454 if (_PyString_Resize(&v, new_len) != 0) {
4455 /* XXX if _PyString_Resize() fails, 'v' has been
Thomas Wouterse2176022007-09-20 17:35:10 +00004456 * deallocated so it cannot be put back into
4457 * 'variable'. The MemoryError is raised when there
4458 * is no value in 'variable', which might (very
4459 * remotely) be a cause of incompatibilities.
Raymond Hettinger52a21b82004-08-06 18:43:09 +00004460 */
4461 return NULL;
4462 }
4463 /* copy 'w' into the newly allocated area of 'v' */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004464 memcpy(PyString_AS_STRING(v) + v_len,
4465 PyString_AS_STRING(w), w_len);
Raymond Hettinger52a21b82004-08-06 18:43:09 +00004466 return v;
4467 }
4468 else {
4469 /* When in-place resizing is not an option. */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004470 PyString_Concat(&v, w);
Raymond Hettinger52a21b82004-08-06 18:43:09 +00004471 return v;
4472 }
4473}
4474
Guido van Rossum950361c1997-01-24 13:49:28 +00004475#ifdef DYNAMIC_EXECUTION_PROFILE
4476
Fredrik Lundh7a830892006-05-27 10:39:48 +00004477static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004478getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00004479{
4480 int i;
4481 PyObject *l = PyList_New(256);
4482 if (l == NULL) return NULL;
4483 for (i = 0; i < 256; i++) {
4484 PyObject *x = PyInt_FromLong(a[i]);
4485 if (x == NULL) {
4486 Py_DECREF(l);
4487 return NULL;
4488 }
4489 PyList_SetItem(l, i, x);
4490 }
4491 for (i = 0; i < 256; i++)
4492 a[i] = 0;
4493 return l;
4494}
4495
4496PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004497_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00004498{
4499#ifndef DXPAIRS
4500 return getarray(dxp);
4501#else
4502 int i;
4503 PyObject *l = PyList_New(257);
4504 if (l == NULL) return NULL;
4505 for (i = 0; i < 257; i++) {
4506 PyObject *x = getarray(dxpairs[i]);
4507 if (x == NULL) {
4508 Py_DECREF(l);
4509 return NULL;
4510 }
4511 PyList_SetItem(l, i, x);
4512 }
4513 return l;
4514#endif
4515}
4516
4517#endif