blob: 677dfc21f85f9e8a54042b54bf53a217ac64c6fd [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
618 Verifying the prediction costs a single high-speed test of register
Raymond Hettingerac2072922003-03-16 15:41:11 +0000619 variable against a constant. If the pairing was good, then the
Raymond Hettingerf606f872003-03-16 03:11:04 +0000620 processor has a high likelihood of making its own successful branch
621 prediction which results in a nearly zero overhead transition to the
622 next opcode.
623
624 A successful prediction saves a trip through the eval-loop including
625 its two unpredictable branches, the HASARG test and the switch-case.
Raymond Hettingera7216982004-02-08 19:59:27 +0000626
Tim Peters8a5c3c72004-04-05 19:36:21 +0000627 If collecting opcode statistics, turn off prediction so that
628 statistics are accurately maintained (the predictions bypass
Raymond Hettingera7216982004-02-08 19:59:27 +0000629 the opcode frequency counter updates).
Raymond Hettingerf606f872003-03-16 03:11:04 +0000630*/
631
Raymond Hettingera7216982004-02-08 19:59:27 +0000632#ifdef DYNAMIC_EXECUTION_PROFILE
633#define PREDICT(op) if (0) goto PRED_##op
634#else
Raymond Hettingerac2072922003-03-16 15:41:11 +0000635#define PREDICT(op) if (*next_instr == op) goto PRED_##op
Raymond Hettingera7216982004-02-08 19:59:27 +0000636#endif
637
Raymond Hettingerf606f872003-03-16 03:11:04 +0000638#define PREDICTED(op) PRED_##op: next_instr++
Raymond Hettinger52a21b82004-08-06 18:43:09 +0000639#define PREDICTED_WITH_ARG(op) PRED_##op: oparg = PEEKARG(); next_instr += 3
Raymond Hettingerf606f872003-03-16 03:11:04 +0000640
Guido van Rossum374a9221991-04-04 10:40:29 +0000641/* Stack manipulation macros */
642
Martin v. Löwis18e16552006-02-15 17:27:45 +0000643/* The stack can grow at most MAXINT deep, as co_nlocals and
644 co_stacksize are ints. */
645#define STACK_LEVEL() ((int)(stack_pointer - f->f_valuestack))
Guido van Rossum374a9221991-04-04 10:40:29 +0000646#define EMPTY() (STACK_LEVEL() == 0)
647#define TOP() (stack_pointer[-1])
Raymond Hettinger663004b2003-01-09 15:24:30 +0000648#define SECOND() (stack_pointer[-2])
649#define THIRD() (stack_pointer[-3])
650#define FOURTH() (stack_pointer[-4])
Raymond Hettinger663004b2003-01-09 15:24:30 +0000651#define SET_TOP(v) (stack_pointer[-1] = (v))
652#define SET_SECOND(v) (stack_pointer[-2] = (v))
653#define SET_THIRD(v) (stack_pointer[-3] = (v))
654#define SET_FOURTH(v) (stack_pointer[-4] = (v))
Raymond Hettinger663004b2003-01-09 15:24:30 +0000655#define BASIC_STACKADJ(n) (stack_pointer += n)
Guido van Rossum374a9221991-04-04 10:40:29 +0000656#define BASIC_PUSH(v) (*stack_pointer++ = (v))
657#define BASIC_POP() (*--stack_pointer)
658
Guido van Rossum96a42c81992-01-12 02:29:51 +0000659#ifdef LLTRACE
Jeremy Hylton14368152001-10-17 13:29:30 +0000660#define PUSH(v) { (void)(BASIC_PUSH(v), \
661 lltrace && prtrace(TOP(), "push")); \
Richard Jonescebbefc2006-05-23 18:28:17 +0000662 assert(STACK_LEVEL() <= co->co_stacksize); }
Thomas Wouterse2176022007-09-20 17:35:10 +0000663#define POP() ((void)(lltrace && prtrace(TOP(), "pop")), \
664 BASIC_POP())
Raymond Hettinger663004b2003-01-09 15:24:30 +0000665#define STACKADJ(n) { (void)(BASIC_STACKADJ(n), \
666 lltrace && prtrace(TOP(), "stackadj")); \
Richard Jonescebbefc2006-05-23 18:28:17 +0000667 assert(STACK_LEVEL() <= co->co_stacksize); }
Thomas Wouterse2176022007-09-20 17:35:10 +0000668#define EXT_POP(STACK_POINTER) (lltrace && prtrace((STACK_POINTER)[-1], \
669 "ext_pop"), *--(STACK_POINTER))
Guido van Rossum374a9221991-04-04 10:40:29 +0000670#else
671#define PUSH(v) BASIC_PUSH(v)
672#define POP() BASIC_POP()
Raymond Hettinger663004b2003-01-09 15:24:30 +0000673#define STACKADJ(n) BASIC_STACKADJ(n)
Guido van Rossumc2e20742006-02-27 22:32:47 +0000674#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
Guido van Rossum374a9221991-04-04 10:40:29 +0000675#endif
676
Guido van Rossum681d79a1995-07-18 14:51:37 +0000677/* Local variable macros */
678
679#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumcfbf1a32002-03-28 20:17:52 +0000680
681/* The SETLOCAL() macro must not DECREF the local variable in-place and
682 then store the new value; it must copy the old value to a temporary
683 value, then store the new value, and then DECREF the temporary value.
684 This is because it is possible that during the DECREF the frame is
685 accessed by other code (e.g. a __del__ method or gc.collect()) and the
686 variable would be pointing to already-freed memory. */
687#define SETLOCAL(i, value) do { PyObject *tmp = GETLOCAL(i); \
688 GETLOCAL(i) = value; \
689 Py_XDECREF(tmp); } while (0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000690
Guido van Rossuma027efa1997-05-05 20:56:21 +0000691/* Start of code */
692
Tim Peters5ca576e2001-06-18 22:08:13 +0000693 if (f == NULL)
694 return NULL;
695
Armin Rigo1d313ab2003-10-25 14:33:09 +0000696 /* push frame */
Armin Rigo2b3eb402003-10-28 12:05:48 +0000697 if (Py_EnterRecursiveCall(""))
Armin Rigo1d313ab2003-10-25 14:33:09 +0000698 return NULL;
Guido van Rossum8861b741996-07-30 16:49:37 +0000699
Tim Peters5ca576e2001-06-18 22:08:13 +0000700 tstate->frame = f;
Tim Peters5ca576e2001-06-18 22:08:13 +0000701
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000702 if (tstate->use_tracing) {
703 if (tstate->c_tracefunc != NULL) {
704 /* tstate->c_tracefunc, if defined, is a
705 function that will be called on *every* entry
706 to a code block. Its return value, if not
707 None, is a function that will be called at
708 the start of each executed line of code.
709 (Actually, the function must return itself
710 in order to continue tracing.) The trace
711 functions are called with three arguments:
712 a pointer to the current frame, a string
713 indicating why the function is called, and
714 an argument which depends on the situation.
715 The global trace function is also called
716 whenever an exception is detected. */
Amaury Forgeot d'Arc0d75f092007-11-13 21:54:28 +0000717 if (call_trace_protected(tstate->c_tracefunc,
718 tstate->c_traceobj,
719 f, PyTrace_CALL, Py_None)) {
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000720 /* Trace function raised an error */
Armin Rigo2b3eb402003-10-28 12:05:48 +0000721 goto exit_eval_frame;
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000722 }
723 }
724 if (tstate->c_profilefunc != NULL) {
725 /* Similar for c_profilefunc, except it needn't
726 return itself and isn't called for "line" events */
Amaury Forgeot d'Arc0d75f092007-11-13 21:54:28 +0000727 if (call_trace_protected(tstate->c_profilefunc,
728 tstate->c_profileobj,
729 f, PyTrace_CALL, Py_None)) {
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000730 /* Profile function raised an error */
Armin Rigo2b3eb402003-10-28 12:05:48 +0000731 goto exit_eval_frame;
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000732 }
733 }
734 }
735
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000736 co = f->f_code;
737 names = co->co_names;
738 consts = co->co_consts;
739 fastlocals = f->f_localsplus;
Richard Jonescebbefc2006-05-23 18:28:17 +0000740 freevars = f->f_localsplus + co->co_nlocals;
Brett Cannonc9371d42005-06-25 08:23:41 +0000741 first_instr = (unsigned char*) PyString_AS_STRING(co->co_code);
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000742 /* An explanation is in order for the next line.
743
744 f->f_lasti now refers to the index of the last instruction
745 executed. You might think this was obvious from the name, but
746 this wasn't always true before 2.3! PyFrame_New now sets
747 f->f_lasti to -1 (i.e. the index *before* the first instruction)
748 and YIELD_VALUE doesn't fiddle with f_lasti any more. So this
Raymond Hettinger4bd97d42007-01-06 01:14:41 +0000749 does work. Promise.
750
751 When the PREDICT() macros are enabled, some opcode pairs follow in
752 direct succession without updating f->f_lasti. A successful
753 prediction effectively links the two codes together as if they
754 were a single new opcode; accordingly,f->f_lasti will point to
755 the first code in the pair (for instance, GET_ITER followed by
756 FOR_ITER is effectively a single opcode and f->f_lasti will point
757 at to the beginning of the combined pair.)
758 */
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000759 next_instr = first_instr + f->f_lasti + 1;
760 stack_pointer = f->f_stacktop;
761 assert(stack_pointer != NULL);
762 f->f_stacktop = NULL; /* remains NULL unless yield suspends frame */
763
Tim Peters5ca576e2001-06-18 22:08:13 +0000764#ifdef LLTRACE
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000765 lltrace = PyDict_GetItemString(f->f_globals, "__lltrace__") != NULL;
Tim Peters5ca576e2001-06-18 22:08:13 +0000766#endif
Neal Norwitz5f5153e2005-10-21 04:28:38 +0000767#if defined(Py_DEBUG) || defined(LLTRACE)
Tim Peters5ca576e2001-06-18 22:08:13 +0000768 filename = PyString_AsString(co->co_filename);
769#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000770
Guido van Rossum374a9221991-04-04 10:40:29 +0000771 why = WHY_NOT;
772 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000773 x = Py_None; /* Not a reference, just anything non-NULL */
Fred Drake48fba732000-10-11 13:54:07 +0000774 w = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +0000775
Anthony Baxtera863d332006-04-11 07:43:46 +0000776 if (throwflag) { /* support for generator.throw() */
Phillip J. Eby0d6615f2005-08-02 00:46:46 +0000777 why = WHY_EXCEPTION;
778 goto on_error;
779 }
Tim Peters7df5e7f2006-05-26 23:14:37 +0000780
Guido van Rossum374a9221991-04-04 10:40:29 +0000781 for (;;) {
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000782#ifdef WITH_TSC
783 if (inst1 == 0) {
784 /* Almost surely, the opcode executed a break
785 or a continue, preventing inst1 from being set
786 on the way out of the loop.
787 */
Michael W. Hudson75eabd22005-01-18 15:56:11 +0000788 READ_TIMESTAMP(inst1);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000789 loop1 = inst1;
790 }
791 dump_tsc(opcode, ticked, inst0, inst1, loop0, loop1,
792 intr0, intr1);
793 ticked = 0;
794 inst1 = 0;
795 intr0 = 0;
796 intr1 = 0;
Michael W. Hudson75eabd22005-01-18 15:56:11 +0000797 READ_TIMESTAMP(loop0);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000798#endif
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000799 assert(stack_pointer >= f->f_valuestack); /* else underflow */
Richard Jonescebbefc2006-05-23 18:28:17 +0000800 assert(STACK_LEVEL() <= co->co_stacksize); /* else overflow */
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000801
Guido van Rossuma027efa1997-05-05 20:56:21 +0000802 /* Do periodic things. Doing this every time through
803 the loop would add too much overhead, so we do it
804 only every Nth instruction. We also do it if
805 ``things_to_do'' is set, i.e. when an asynchronous
806 event needs attention (e.g. a signal handler or
807 async I/O handler); see Py_AddPendingCall() and
808 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +0000809
Skip Montanarod581d772002-09-03 20:10:45 +0000810 if (--_Py_Ticker < 0) {
Thomas Woutersae406c62007-09-19 17:27:43 +0000811 if (*next_instr == SETUP_FINALLY) {
812 /* Make the last opcode before
813 a try: finally: block uninterruptable. */
814 goto fast_next_opcode;
815 }
Skip Montanarod581d772002-09-03 20:10:45 +0000816 _Py_Ticker = _Py_CheckInterval;
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000817 tstate->tick_counter++;
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000818#ifdef WITH_TSC
819 ticked = 1;
820#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000821 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000822 if (Py_MakePendingCalls() < 0) {
823 why = WHY_EXCEPTION;
824 goto on_error;
825 }
Kurt B. Kaiser4c79a832004-11-23 18:06:08 +0000826 if (things_to_do)
827 /* MakePendingCalls() didn't succeed.
828 Force early re-execution of this
829 "periodic" code, possibly after
830 a thread switch */
831 _Py_Ticker = 0;
Guido van Rossum8861b741996-07-30 16:49:37 +0000832 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000833#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000834 if (interpreter_lock) {
835 /* Give another thread a chance */
836
Guido van Rossum25ce5661997-08-02 03:10:38 +0000837 if (PyThreadState_Swap(NULL) != tstate)
838 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000839 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000840
841 /* Other threads may run now */
842
Guido van Rossum65d5b571998-12-21 19:32:43 +0000843 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000844 if (PyThreadState_Swap(tstate) != NULL)
845 Py_FatalError("ceval: orphan tstate");
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000846
847 /* Check for thread interrupts */
848
849 if (tstate->async_exc != NULL) {
850 x = tstate->async_exc;
851 tstate->async_exc = NULL;
852 PyErr_SetNone(x);
853 Py_DECREF(x);
854 why = WHY_EXCEPTION;
855 goto on_error;
856 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000857 }
858#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000859 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000860
Neil Schemenauer63543862002-02-17 19:10:14 +0000861 fast_next_opcode:
Guido van Rossum99bec951992-09-03 20:29:45 +0000862 f->f_lasti = INSTR_OFFSET();
Guido van Rossumac7be682001-01-17 15:42:30 +0000863
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000864 /* line-by-line tracing support */
865
866 if (tstate->c_tracefunc != NULL && !tstate->tracing) {
867 /* see maybe_call_line_trace
868 for expository comments */
869 f->f_stacktop = stack_pointer;
Tim Peters8a5c3c72004-04-05 19:36:21 +0000870
Michael W. Hudson58ee2af2003-04-29 16:18:47 +0000871 err = maybe_call_line_trace(tstate->c_tracefunc,
872 tstate->c_traceobj,
Armin Rigobf57a142004-03-22 19:24:58 +0000873 f, &instr_lb, &instr_ub,
874 &instr_prev);
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000875 /* Reload possibly changed frame fields */
876 JUMPTO(f->f_lasti);
Michael W. Hudson58ee2af2003-04-29 16:18:47 +0000877 if (f->f_stacktop != NULL) {
878 stack_pointer = f->f_stacktop;
879 f->f_stacktop = NULL;
880 }
881 if (err) {
882 /* trace function raised an exception */
883 goto on_error;
884 }
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000885 }
886
887 /* Extract opcode and argument */
888
Guido van Rossum374a9221991-04-04 10:40:29 +0000889 opcode = NEXTOP();
Armin Rigo8817fcd2004-06-17 10:22:40 +0000890 oparg = 0; /* allows oparg to be stored in a register because
891 it doesn't have to be remembered across a full loop */
Raymond Hettinger5bed4562004-04-10 23:34:17 +0000892 if (HAS_ARG(opcode))
893 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000894 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000895#ifdef DYNAMIC_EXECUTION_PROFILE
896#ifdef DXPAIRS
897 dxpairs[lastopcode][opcode]++;
898 lastopcode = opcode;
899#endif
900 dxp[opcode]++;
901#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000902
Guido van Rossum96a42c81992-01-12 02:29:51 +0000903#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000904 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +0000905
Guido van Rossum96a42c81992-01-12 02:29:51 +0000906 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000907 if (HAS_ARG(opcode)) {
908 printf("%d: %d, %d\n",
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000909 f->f_lasti, opcode, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +0000910 }
911 else {
912 printf("%d: %d\n",
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000913 f->f_lasti, opcode);
Guido van Rossum374a9221991-04-04 10:40:29 +0000914 }
915 }
916#endif
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000917
Guido van Rossum374a9221991-04-04 10:40:29 +0000918 /* Main switch on opcode */
Michael W. Hudson75eabd22005-01-18 15:56:11 +0000919 READ_TIMESTAMP(inst0);
Jeremy Hylton52820442001-01-03 23:52:36 +0000920
Guido van Rossum374a9221991-04-04 10:40:29 +0000921 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000922
Guido van Rossum374a9221991-04-04 10:40:29 +0000923 /* BEWARE!
924 It is essential that any operation that fails sets either
925 x to NULL, err to nonzero, or why to anything but WHY_NOT,
926 and that no operation that succeeds does this! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000927
Guido van Rossum374a9221991-04-04 10:40:29 +0000928 /* case STOP_CODE: this is an error! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000929
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000930 case NOP:
931 goto fast_next_opcode;
932
Neil Schemenauer63543862002-02-17 19:10:14 +0000933 case LOAD_FAST:
934 x = GETLOCAL(oparg);
935 if (x != NULL) {
936 Py_INCREF(x);
937 PUSH(x);
938 goto fast_next_opcode;
939 }
940 format_exc_check_arg(PyExc_UnboundLocalError,
941 UNBOUNDLOCAL_ERROR_MSG,
942 PyTuple_GetItem(co->co_varnames, oparg));
943 break;
944
945 case LOAD_CONST:
Skip Montanaro04d80f82002-08-04 21:03:35 +0000946 x = GETITEM(consts, oparg);
Neil Schemenauer63543862002-02-17 19:10:14 +0000947 Py_INCREF(x);
948 PUSH(x);
949 goto fast_next_opcode;
950
Raymond Hettinger7dc52212003-03-16 20:14:44 +0000951 PREDICTED_WITH_ARG(STORE_FAST);
Neil Schemenauer63543862002-02-17 19:10:14 +0000952 case STORE_FAST:
953 v = POP();
954 SETLOCAL(oparg, v);
955 goto fast_next_opcode;
956
Raymond Hettingerf606f872003-03-16 03:11:04 +0000957 PREDICTED(POP_TOP);
Guido van Rossum374a9221991-04-04 10:40:29 +0000958 case POP_TOP:
959 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000960 Py_DECREF(v);
Neil Schemenauer63543862002-02-17 19:10:14 +0000961 goto fast_next_opcode;
Guido van Rossumac7be682001-01-17 15:42:30 +0000962
Guido van Rossum374a9221991-04-04 10:40:29 +0000963 case ROT_TWO:
Raymond Hettinger663004b2003-01-09 15:24:30 +0000964 v = TOP();
965 w = SECOND();
966 SET_TOP(w);
967 SET_SECOND(v);
Raymond Hettinger080cb322003-03-14 01:37:42 +0000968 goto fast_next_opcode;
Guido van Rossumac7be682001-01-17 15:42:30 +0000969
Guido van Rossum374a9221991-04-04 10:40:29 +0000970 case ROT_THREE:
Raymond Hettinger663004b2003-01-09 15:24:30 +0000971 v = TOP();
972 w = SECOND();
973 x = THIRD();
974 SET_TOP(w);
975 SET_SECOND(x);
976 SET_THIRD(v);
Raymond Hettinger080cb322003-03-14 01:37:42 +0000977 goto fast_next_opcode;
Guido van Rossumac7be682001-01-17 15:42:30 +0000978
Thomas Wouters434d0822000-08-24 20:11:32 +0000979 case ROT_FOUR:
Raymond Hettinger663004b2003-01-09 15:24:30 +0000980 u = TOP();
981 v = SECOND();
982 w = THIRD();
983 x = FOURTH();
984 SET_TOP(v);
985 SET_SECOND(w);
986 SET_THIRD(x);
987 SET_FOURTH(u);
Raymond Hettinger080cb322003-03-14 01:37:42 +0000988 goto fast_next_opcode;
Guido van Rossumac7be682001-01-17 15:42:30 +0000989
Guido van Rossum374a9221991-04-04 10:40:29 +0000990 case DUP_TOP:
991 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000992 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000993 PUSH(v);
Raymond Hettinger080cb322003-03-14 01:37:42 +0000994 goto fast_next_opcode;
Guido van Rossumac7be682001-01-17 15:42:30 +0000995
Thomas Wouters434d0822000-08-24 20:11:32 +0000996 case DUP_TOPX:
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +0000997 if (oparg == 2) {
Raymond Hettinger663004b2003-01-09 15:24:30 +0000998 x = TOP();
Tim Peters35ba6892000-10-11 07:04:49 +0000999 Py_INCREF(x);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001000 w = SECOND();
Tim Peters35ba6892000-10-11 07:04:49 +00001001 Py_INCREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001002 STACKADJ(2);
1003 SET_TOP(x);
1004 SET_SECOND(w);
Raymond Hettingerf606f872003-03-16 03:11:04 +00001005 goto fast_next_opcode;
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +00001006 } else if (oparg == 3) {
Raymond Hettinger663004b2003-01-09 15:24:30 +00001007 x = TOP();
Tim Peters35ba6892000-10-11 07:04:49 +00001008 Py_INCREF(x);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001009 w = SECOND();
Tim Peters35ba6892000-10-11 07:04:49 +00001010 Py_INCREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001011 v = THIRD();
Tim Peters35ba6892000-10-11 07:04:49 +00001012 Py_INCREF(v);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001013 STACKADJ(3);
1014 SET_TOP(x);
1015 SET_SECOND(w);
1016 SET_THIRD(v);
Raymond Hettingerf606f872003-03-16 03:11:04 +00001017 goto fast_next_opcode;
Thomas Wouters434d0822000-08-24 20:11:32 +00001018 }
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +00001019 Py_FatalError("invalid argument to DUP_TOPX"
1020 " (bytecode corruption?)");
Tim Peters35ba6892000-10-11 07:04:49 +00001021 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001022
Guido van Rossum374a9221991-04-04 10:40:29 +00001023 case UNARY_POSITIVE:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001024 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001025 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001026 Py_DECREF(v);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001027 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001028 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001029 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001030
Guido van Rossum374a9221991-04-04 10:40:29 +00001031 case UNARY_NEGATIVE:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001032 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001033 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001034 Py_DECREF(v);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001035 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001036 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001037 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001038
Guido van Rossum374a9221991-04-04 10:40:29 +00001039 case UNARY_NOT:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001040 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001041 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001042 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +00001043 if (err == 0) {
1044 Py_INCREF(Py_True);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001045 SET_TOP(Py_True);
Guido van Rossumfc490731997-05-06 15:06:49 +00001046 continue;
1047 }
1048 else if (err > 0) {
1049 Py_INCREF(Py_False);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001050 SET_TOP(Py_False);
Guido van Rossumfc490731997-05-06 15:06:49 +00001051 err = 0;
1052 continue;
1053 }
Raymond Hettinger8bb90a52003-01-14 12:43:10 +00001054 STACKADJ(-1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001055 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001056
Guido van Rossum374a9221991-04-04 10:40:29 +00001057 case UNARY_CONVERT:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001058 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001059 x = PyObject_Repr(v);
1060 Py_DECREF(v);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001061 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001062 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001063 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001064
Guido van Rossum7928cd71991-10-24 14:59:31 +00001065 case UNARY_INVERT:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001066 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001067 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001068 Py_DECREF(v);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001069 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001070 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001071 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001072
Guido van Rossum50564e81996-01-12 01:13:16 +00001073 case BINARY_POWER:
1074 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001075 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001076 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +00001077 Py_DECREF(v);
1078 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001079 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001080 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +00001081 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001082
Guido van Rossum374a9221991-04-04 10:40:29 +00001083 case BINARY_MULTIPLY:
1084 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001085 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001086 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001087 Py_DECREF(v);
1088 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001089 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001090 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001091 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001092
Guido van Rossum374a9221991-04-04 10:40:29 +00001093 case BINARY_DIVIDE:
Tim Peters3caca232001-12-06 06:23:26 +00001094 if (!_Py_QnewFlag) {
1095 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001096 v = TOP();
Tim Peters3caca232001-12-06 06:23:26 +00001097 x = PyNumber_Divide(v, w);
1098 Py_DECREF(v);
1099 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001100 SET_TOP(x);
Tim Peters3caca232001-12-06 06:23:26 +00001101 if (x != NULL) continue;
1102 break;
1103 }
Raymond Hettinger663004b2003-01-09 15:24:30 +00001104 /* -Qnew is in effect: fall through to
Tim Peters3caca232001-12-06 06:23:26 +00001105 BINARY_TRUE_DIVIDE */
1106 case BINARY_TRUE_DIVIDE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001107 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001108 v = TOP();
Tim Peters3caca232001-12-06 06:23:26 +00001109 x = PyNumber_TrueDivide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001110 Py_DECREF(v);
1111 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001112 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001113 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001114 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001115
Guido van Rossum4668b002001-08-08 05:00:18 +00001116 case BINARY_FLOOR_DIVIDE:
1117 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001118 v = TOP();
Guido van Rossum4668b002001-08-08 05:00:18 +00001119 x = PyNumber_FloorDivide(v, w);
1120 Py_DECREF(v);
1121 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001122 SET_TOP(x);
Guido van Rossum4668b002001-08-08 05:00:18 +00001123 if (x != NULL) continue;
1124 break;
1125
Guido van Rossum374a9221991-04-04 10:40:29 +00001126 case BINARY_MODULO:
1127 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001128 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001129 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001130 Py_DECREF(v);
1131 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001132 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001133 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001134 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001135
Guido van Rossum374a9221991-04-04 10:40:29 +00001136 case BINARY_ADD:
1137 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001138 v = TOP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001139 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001140 /* INLINE: int + int */
1141 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001142 a = PyInt_AS_LONG(v);
1143 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001144 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001145 if ((i^a) < 0 && (i^b) < 0)
1146 goto slow_add;
1147 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001148 }
Raymond Hettinger52a21b82004-08-06 18:43:09 +00001149 else if (PyString_CheckExact(v) &&
1150 PyString_CheckExact(w)) {
1151 x = string_concatenate(v, w, f, next_instr);
1152 /* string_concatenate consumed the ref to v */
1153 goto skip_decref_vx;
1154 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001155 else {
1156 slow_add:
Guido van Rossumc12da691997-07-17 23:12:42 +00001157 x = PyNumber_Add(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001158 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001159 Py_DECREF(v);
Raymond Hettinger52a21b82004-08-06 18:43:09 +00001160 skip_decref_vx:
Guido van Rossumb209a111997-04-29 18:18:01 +00001161 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001162 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001163 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001164 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001165
Guido van Rossum374a9221991-04-04 10:40:29 +00001166 case BINARY_SUBTRACT:
1167 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001168 v = TOP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001169 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001170 /* INLINE: int - int */
1171 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001172 a = PyInt_AS_LONG(v);
1173 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001174 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001175 if ((i^a) < 0 && (i^~b) < 0)
1176 goto slow_sub;
1177 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001178 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001179 else {
1180 slow_sub:
Guido van Rossumc12da691997-07-17 23:12:42 +00001181 x = PyNumber_Subtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001182 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001183 Py_DECREF(v);
1184 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001185 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001186 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001187 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001188
Guido van Rossum374a9221991-04-04 10:40:29 +00001189 case BINARY_SUBSCR:
1190 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001191 v = TOP();
Tim Petersb1c46982001-10-05 20:41:38 +00001192 if (PyList_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001193 /* INLINE: list[int] */
Neal Norwitz814e9382006-03-02 07:54:28 +00001194 Py_ssize_t i = PyInt_AsSsize_t(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001195 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +00001196 i += PyList_GET_SIZE(v);
Raymond Hettinger467a6982004-04-07 11:39:21 +00001197 if (i >= 0 && i < PyList_GET_SIZE(v)) {
Guido van Rossumfa00e951998-07-08 15:02:37 +00001198 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001199 Py_INCREF(x);
1200 }
Raymond Hettinger467a6982004-04-07 11:39:21 +00001201 else
1202 goto slow_get;
Guido van Rossumc12da691997-07-17 23:12:42 +00001203 }
1204 else
Raymond Hettinger467a6982004-04-07 11:39:21 +00001205 slow_get:
Guido van Rossumc12da691997-07-17 23:12:42 +00001206 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001207 Py_DECREF(v);
1208 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001209 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001210 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001211 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001212
Guido van Rossum7928cd71991-10-24 14:59:31 +00001213 case BINARY_LSHIFT:
1214 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001215 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001216 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001217 Py_DECREF(v);
1218 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001219 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001220 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001221 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001222
Guido van Rossum7928cd71991-10-24 14:59:31 +00001223 case BINARY_RSHIFT:
1224 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001225 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001226 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001227 Py_DECREF(v);
1228 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001229 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001230 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001231 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001232
Guido van Rossum7928cd71991-10-24 14:59:31 +00001233 case BINARY_AND:
1234 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001235 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001236 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001237 Py_DECREF(v);
1238 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001239 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001240 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001241 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001242
Guido van Rossum7928cd71991-10-24 14:59:31 +00001243 case BINARY_XOR:
1244 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001245 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001246 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001247 Py_DECREF(v);
1248 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001249 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001250 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001251 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001252
Guido van Rossum7928cd71991-10-24 14:59:31 +00001253 case BINARY_OR:
1254 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001255 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001256 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001257 Py_DECREF(v);
1258 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001259 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001260 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001261 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001262
Raymond Hettingerdd80f762004-03-07 07:31:06 +00001263 case LIST_APPEND:
1264 w = POP();
1265 v = POP();
1266 err = PyList_Append(v, w);
1267 Py_DECREF(v);
1268 Py_DECREF(w);
Raymond Hettingerfba1cfc2004-03-12 16:33:17 +00001269 if (err == 0) {
1270 PREDICT(JUMP_ABSOLUTE);
1271 continue;
1272 }
Raymond Hettingerdd80f762004-03-07 07:31:06 +00001273 break;
1274
Thomas Wouters434d0822000-08-24 20:11:32 +00001275 case INPLACE_POWER:
1276 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001277 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001278 x = PyNumber_InPlacePower(v, w, Py_None);
1279 Py_DECREF(v);
1280 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001281 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001282 if (x != NULL) continue;
1283 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001284
Thomas Wouters434d0822000-08-24 20:11:32 +00001285 case INPLACE_MULTIPLY:
1286 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001287 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001288 x = PyNumber_InPlaceMultiply(v, w);
1289 Py_DECREF(v);
1290 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001291 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001292 if (x != NULL) continue;
1293 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001294
Thomas Wouters434d0822000-08-24 20:11:32 +00001295 case INPLACE_DIVIDE:
Tim Peters54b11912001-12-25 18:49:11 +00001296 if (!_Py_QnewFlag) {
1297 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001298 v = TOP();
Tim Peters54b11912001-12-25 18:49:11 +00001299 x = PyNumber_InPlaceDivide(v, w);
1300 Py_DECREF(v);
1301 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001302 SET_TOP(x);
Tim Peters54b11912001-12-25 18:49:11 +00001303 if (x != NULL) continue;
1304 break;
1305 }
Raymond Hettinger663004b2003-01-09 15:24:30 +00001306 /* -Qnew is in effect: fall through to
Tim Peters54b11912001-12-25 18:49:11 +00001307 INPLACE_TRUE_DIVIDE */
1308 case INPLACE_TRUE_DIVIDE:
Thomas Wouters434d0822000-08-24 20:11:32 +00001309 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001310 v = TOP();
Tim Peters54b11912001-12-25 18:49:11 +00001311 x = PyNumber_InPlaceTrueDivide(v, w);
Thomas Wouters434d0822000-08-24 20:11:32 +00001312 Py_DECREF(v);
1313 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001314 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001315 if (x != NULL) continue;
1316 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001317
Guido van Rossum4668b002001-08-08 05:00:18 +00001318 case INPLACE_FLOOR_DIVIDE:
1319 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001320 v = TOP();
Guido van Rossum4668b002001-08-08 05:00:18 +00001321 x = PyNumber_InPlaceFloorDivide(v, w);
1322 Py_DECREF(v);
1323 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001324 SET_TOP(x);
Guido van Rossum4668b002001-08-08 05:00:18 +00001325 if (x != NULL) continue;
1326 break;
1327
Thomas Wouters434d0822000-08-24 20:11:32 +00001328 case INPLACE_MODULO:
1329 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001330 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001331 x = PyNumber_InPlaceRemainder(v, w);
1332 Py_DECREF(v);
1333 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001334 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001335 if (x != NULL) continue;
1336 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001337
Thomas Wouters434d0822000-08-24 20:11:32 +00001338 case INPLACE_ADD:
1339 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001340 v = TOP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001341 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001342 /* INLINE: int + int */
1343 register long a, b, i;
1344 a = PyInt_AS_LONG(v);
1345 b = PyInt_AS_LONG(w);
1346 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001347 if ((i^a) < 0 && (i^b) < 0)
1348 goto slow_iadd;
1349 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001350 }
Raymond Hettinger52a21b82004-08-06 18:43:09 +00001351 else if (PyString_CheckExact(v) &&
1352 PyString_CheckExact(w)) {
1353 x = string_concatenate(v, w, f, next_instr);
1354 /* string_concatenate consumed the ref to v */
1355 goto skip_decref_v;
1356 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001357 else {
1358 slow_iadd:
Thomas Wouters434d0822000-08-24 20:11:32 +00001359 x = PyNumber_InPlaceAdd(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001360 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001361 Py_DECREF(v);
Raymond Hettinger52a21b82004-08-06 18:43:09 +00001362 skip_decref_v:
Thomas Wouters434d0822000-08-24 20:11:32 +00001363 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001364 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001365 if (x != NULL) continue;
1366 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001367
Thomas Wouters434d0822000-08-24 20:11:32 +00001368 case INPLACE_SUBTRACT:
1369 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001370 v = TOP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001371 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001372 /* INLINE: int - int */
1373 register long a, b, i;
1374 a = PyInt_AS_LONG(v);
1375 b = PyInt_AS_LONG(w);
1376 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001377 if ((i^a) < 0 && (i^~b) < 0)
1378 goto slow_isub;
1379 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001380 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001381 else {
1382 slow_isub:
Thomas Wouters434d0822000-08-24 20:11:32 +00001383 x = PyNumber_InPlaceSubtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001384 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001385 Py_DECREF(v);
1386 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001387 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001388 if (x != NULL) continue;
1389 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001390
Thomas Wouters434d0822000-08-24 20:11:32 +00001391 case INPLACE_LSHIFT:
1392 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001393 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001394 x = PyNumber_InPlaceLshift(v, w);
1395 Py_DECREF(v);
1396 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001397 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001398 if (x != NULL) continue;
1399 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001400
Thomas Wouters434d0822000-08-24 20:11:32 +00001401 case INPLACE_RSHIFT:
1402 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001403 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001404 x = PyNumber_InPlaceRshift(v, w);
1405 Py_DECREF(v);
1406 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001407 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001408 if (x != NULL) continue;
1409 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001410
Thomas Wouters434d0822000-08-24 20:11:32 +00001411 case INPLACE_AND:
1412 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001413 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001414 x = PyNumber_InPlaceAnd(v, w);
1415 Py_DECREF(v);
1416 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001417 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001418 if (x != NULL) continue;
1419 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001420
Thomas Wouters434d0822000-08-24 20:11:32 +00001421 case INPLACE_XOR:
1422 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001423 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001424 x = PyNumber_InPlaceXor(v, w);
1425 Py_DECREF(v);
1426 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001427 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001428 if (x != NULL) continue;
1429 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001430
Thomas Wouters434d0822000-08-24 20:11:32 +00001431 case INPLACE_OR:
1432 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001433 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001434 x = PyNumber_InPlaceOr(v, w);
1435 Py_DECREF(v);
1436 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001437 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001438 if (x != NULL) continue;
1439 break;
1440
Guido van Rossum374a9221991-04-04 10:40:29 +00001441 case SLICE+0:
1442 case SLICE+1:
1443 case SLICE+2:
1444 case SLICE+3:
1445 if ((opcode-SLICE) & 2)
1446 w = POP();
1447 else
1448 w = NULL;
1449 if ((opcode-SLICE) & 1)
1450 v = POP();
1451 else
1452 v = NULL;
Raymond Hettinger663004b2003-01-09 15:24:30 +00001453 u = TOP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001454 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001455 Py_DECREF(u);
1456 Py_XDECREF(v);
1457 Py_XDECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001458 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001459 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001460 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001461
Guido van Rossum374a9221991-04-04 10:40:29 +00001462 case STORE_SLICE+0:
1463 case STORE_SLICE+1:
1464 case STORE_SLICE+2:
1465 case STORE_SLICE+3:
1466 if ((opcode-STORE_SLICE) & 2)
1467 w = POP();
1468 else
1469 w = NULL;
1470 if ((opcode-STORE_SLICE) & 1)
1471 v = POP();
1472 else
1473 v = NULL;
1474 u = POP();
1475 t = POP();
1476 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001477 Py_DECREF(t);
1478 Py_DECREF(u);
1479 Py_XDECREF(v);
1480 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001481 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001482 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001483
Guido van Rossum374a9221991-04-04 10:40:29 +00001484 case DELETE_SLICE+0:
1485 case DELETE_SLICE+1:
1486 case DELETE_SLICE+2:
1487 case DELETE_SLICE+3:
1488 if ((opcode-DELETE_SLICE) & 2)
1489 w = POP();
1490 else
1491 w = NULL;
1492 if ((opcode-DELETE_SLICE) & 1)
1493 v = POP();
1494 else
1495 v = NULL;
1496 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001497 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001498 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001499 Py_DECREF(u);
1500 Py_XDECREF(v);
1501 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001502 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001503 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001504
Guido van Rossum374a9221991-04-04 10:40:29 +00001505 case STORE_SUBSCR:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001506 w = TOP();
1507 v = SECOND();
1508 u = THIRD();
1509 STACKADJ(-3);
Guido van Rossum374a9221991-04-04 10:40:29 +00001510 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001511 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001512 Py_DECREF(u);
1513 Py_DECREF(v);
1514 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001515 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001516 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001517
Guido van Rossum374a9221991-04-04 10:40:29 +00001518 case DELETE_SUBSCR:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001519 w = TOP();
1520 v = SECOND();
1521 STACKADJ(-2);
Guido van Rossum374a9221991-04-04 10:40:29 +00001522 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001523 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001524 Py_DECREF(v);
1525 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001526 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001527 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001528
Guido van Rossum374a9221991-04-04 10:40:29 +00001529 case PRINT_EXPR:
1530 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001531 w = PySys_GetObject("displayhook");
1532 if (w == NULL) {
1533 PyErr_SetString(PyExc_RuntimeError,
1534 "lost sys.displayhook");
1535 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001536 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001537 }
1538 if (err == 0) {
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001539 x = PyTuple_Pack(1, v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001540 if (x == NULL)
1541 err = -1;
1542 }
1543 if (err == 0) {
1544 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001545 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001546 if (w == NULL)
1547 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001548 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001549 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001550 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001551 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001552
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001553 case PRINT_ITEM_TO:
1554 w = stream = POP();
1555 /* fall through to PRINT_ITEM */
1556
Guido van Rossum374a9221991-04-04 10:40:29 +00001557 case PRINT_ITEM:
1558 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001559 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001560 w = PySys_GetObject("stdout");
1561 if (w == NULL) {
1562 PyErr_SetString(PyExc_RuntimeError,
1563 "lost sys.stdout");
1564 err = -1;
1565 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001566 }
Neal Norwitzc5131bc2003-06-29 14:48:32 +00001567 /* PyFile_SoftSpace() can exececute arbitrary code
1568 if sys.stdout is an instance with a __getattr__.
1569 If __getattr__ raises an exception, w will
1570 be freed, so we need to prevent that temporarily. */
1571 Py_XINCREF(w);
Tim Peters8e5fd532002-03-24 19:25:00 +00001572 if (w != NULL && PyFile_SoftSpace(w, 0))
Guido van Rossumbe270261997-05-22 22:26:18 +00001573 err = PyFile_WriteString(" ", w);
1574 if (err == 0)
1575 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001576 if (err == 0) {
Tim Peters8e5fd532002-03-24 19:25:00 +00001577 /* XXX move into writeobject() ? */
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001578 if (PyString_Check(v)) {
1579 char *s = PyString_AS_STRING(v);
Martin v. Löwis66851282006-04-22 11:40:03 +00001580 Py_ssize_t len = PyString_GET_SIZE(v);
Tim Peters8e5fd532002-03-24 19:25:00 +00001581 if (len == 0 ||
1582 !isspace(Py_CHARMASK(s[len-1])) ||
1583 s[len-1] == ' ')
1584 PyFile_SoftSpace(w, 1);
Tim Peters8a5c3c72004-04-05 19:36:21 +00001585 }
Martin v. Löwis8d3ce5a2001-12-18 22:36:40 +00001586#ifdef Py_USING_UNICODE
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001587 else if (PyUnicode_Check(v)) {
1588 Py_UNICODE *s = PyUnicode_AS_UNICODE(v);
Martin v. Löwis66851282006-04-22 11:40:03 +00001589 Py_ssize_t len = PyUnicode_GET_SIZE(v);
Tim Peters8e5fd532002-03-24 19:25:00 +00001590 if (len == 0 ||
1591 !Py_UNICODE_ISSPACE(s[len-1]) ||
1592 s[len-1] == ' ')
1593 PyFile_SoftSpace(w, 1);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001594 }
Michael W. Hudsond95c8282002-05-20 13:56:11 +00001595#endif
Tim Peters8e5fd532002-03-24 19:25:00 +00001596 else
1597 PyFile_SoftSpace(w, 1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001598 }
Neal Norwitzc5131bc2003-06-29 14:48:32 +00001599 Py_XDECREF(w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001600 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001601 Py_XDECREF(stream);
1602 stream = NULL;
1603 if (err == 0)
1604 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001605 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001606
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001607 case PRINT_NEWLINE_TO:
1608 w = stream = POP();
1609 /* fall through to PRINT_NEWLINE */
1610
Guido van Rossum374a9221991-04-04 10:40:29 +00001611 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001612 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001613 w = PySys_GetObject("stdout");
1614 if (w == NULL)
1615 PyErr_SetString(PyExc_RuntimeError,
1616 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001617 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001618 if (w != NULL) {
1619 err = PyFile_WriteString("\n", w);
1620 if (err == 0)
1621 PyFile_SoftSpace(w, 0);
1622 }
1623 Py_XDECREF(stream);
1624 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001625 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001626
Thomas Wouters434d0822000-08-24 20:11:32 +00001627
1628#ifdef CASE_TOO_BIG
1629 default: switch (opcode) {
1630#endif
Guido van Rossumf10570b1995-07-07 22:53:21 +00001631 case RAISE_VARARGS:
1632 u = v = w = NULL;
1633 switch (oparg) {
1634 case 3:
1635 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001636 /* Fallthrough */
1637 case 2:
1638 v = POP(); /* value */
1639 /* Fallthrough */
1640 case 1:
1641 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001642 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001643 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001644 break;
1645 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001646 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001647 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001648 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001649 break;
1650 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001651 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001652
Guido van Rossum374a9221991-04-04 10:40:29 +00001653 case LOAD_LOCALS:
Raymond Hettinger467a6982004-04-07 11:39:21 +00001654 if ((x = f->f_locals) != NULL) {
1655 Py_INCREF(x);
1656 PUSH(x);
1657 continue;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001658 }
Raymond Hettinger467a6982004-04-07 11:39:21 +00001659 PyErr_SetString(PyExc_SystemError, "no locals");
Guido van Rossum374a9221991-04-04 10:40:29 +00001660 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001661
Guido van Rossum374a9221991-04-04 10:40:29 +00001662 case RETURN_VALUE:
1663 retval = POP();
1664 why = WHY_RETURN;
Raymond Hettinger1dd83092004-02-06 18:32:33 +00001665 goto fast_block_end;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001666
Tim Peters5ca576e2001-06-18 22:08:13 +00001667 case YIELD_VALUE:
1668 retval = POP();
Tim Peters8c963692001-06-23 05:26:56 +00001669 f->f_stacktop = stack_pointer;
Tim Peters5ca576e2001-06-18 22:08:13 +00001670 why = WHY_YIELD;
Raymond Hettinger1dd83092004-02-06 18:32:33 +00001671 goto fast_yield;
Tim Peters5ca576e2001-06-18 22:08:13 +00001672
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001673 case EXEC_STMT:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001674 w = TOP();
1675 v = SECOND();
1676 u = THIRD();
1677 STACKADJ(-3);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00001678 READ_TIMESTAMP(intr0);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001679 err = exec_statement(f, u, v, w);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00001680 READ_TIMESTAMP(intr1);
Guido van Rossumb209a111997-04-29 18:18:01 +00001681 Py_DECREF(u);
1682 Py_DECREF(v);
1683 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001684 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001685
Guido van Rossum374a9221991-04-04 10:40:29 +00001686 case POP_BLOCK:
1687 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001688 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001689 while (STACK_LEVEL() > b->b_level) {
1690 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001691 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001692 }
1693 }
Raymond Hettinger7eddd782004-04-07 14:38:08 +00001694 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001695
Guido van Rossum374a9221991-04-04 10:40:29 +00001696 case END_FINALLY:
1697 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001698 if (PyInt_Check(v)) {
Raymond Hettinger7c958652004-04-06 10:11:10 +00001699 why = (enum why_code) PyInt_AS_LONG(v);
Tim Peters8a5c3c72004-04-05 19:36:21 +00001700 assert(why != WHY_YIELD);
Raymond Hettingerc8aa08b2004-04-11 14:59:33 +00001701 if (why == WHY_RETURN ||
1702 why == WHY_CONTINUE)
Guido van Rossum374a9221991-04-04 10:40:29 +00001703 retval = POP();
1704 }
Thomas Wouterse2176022007-09-20 17:35:10 +00001705 else if (PyExceptionClass_Check(v) ||
1706 PyString_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001707 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001708 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001709 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001710 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001711 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001712 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001713 else if (v != Py_None) {
1714 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001715 "'finally' pops bad exception");
1716 why = WHY_EXCEPTION;
1717 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001718 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001719 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001720
Guido van Rossum374a9221991-04-04 10:40:29 +00001721 case BUILD_CLASS:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001722 u = TOP();
1723 v = SECOND();
1724 w = THIRD();
1725 STACKADJ(-2);
Guido van Rossum25831651993-05-19 14:50:45 +00001726 x = build_class(u, v, w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001727 SET_TOP(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001728 Py_DECREF(u);
1729 Py_DECREF(v);
1730 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001731 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001732
Guido van Rossum374a9221991-04-04 10:40:29 +00001733 case STORE_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001734 w = GETITEM(names, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001735 v = POP();
Raymond Hettinger467a6982004-04-07 11:39:21 +00001736 if ((x = f->f_locals) != NULL) {
Raymond Hettinger66bd2332004-08-02 08:30:07 +00001737 if (PyDict_CheckExact(x))
Raymond Hettinger214b1c32004-07-02 06:41:07 +00001738 err = PyDict_SetItem(x, w, v);
1739 else
1740 err = PyObject_SetItem(x, w, v);
Raymond Hettinger467a6982004-04-07 11:39:21 +00001741 Py_DECREF(v);
Raymond Hettinger7eddd782004-04-07 14:38:08 +00001742 if (err == 0) continue;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001743 break;
1744 }
Raymond Hettinger467a6982004-04-07 11:39:21 +00001745 PyErr_Format(PyExc_SystemError,
1746 "no locals found when storing %s",
1747 PyObject_REPR(w));
Guido van Rossum374a9221991-04-04 10:40:29 +00001748 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001749
Guido van Rossum374a9221991-04-04 10:40:29 +00001750 case DELETE_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001751 w = GETITEM(names, oparg);
Raymond Hettinger467a6982004-04-07 11:39:21 +00001752 if ((x = f->f_locals) != NULL) {
Raymond Hettinger214b1c32004-07-02 06:41:07 +00001753 if ((err = PyObject_DelItem(x, w)) != 0)
Raymond Hettinger467a6982004-04-07 11:39:21 +00001754 format_exc_check_arg(PyExc_NameError,
Thomas Wouterse2176022007-09-20 17:35:10 +00001755 NAME_ERROR_MSG,
1756 w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001757 break;
1758 }
Raymond Hettinger467a6982004-04-07 11:39:21 +00001759 PyErr_Format(PyExc_SystemError,
1760 "no locals when deleting %s",
1761 PyObject_REPR(w));
Guido van Rossum374a9221991-04-04 10:40:29 +00001762 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001763
Raymond Hettinger7dc52212003-03-16 20:14:44 +00001764 PREDICTED_WITH_ARG(UNPACK_SEQUENCE);
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001765 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001766 v = POP();
Thomas Wouterse2176022007-09-20 17:35:10 +00001767 if (PyTuple_CheckExact(v) &&
1768 PyTuple_GET_SIZE(v) == oparg) {
1769 PyObject **items = \
1770 ((PyTupleObject *)v)->ob_item;
Raymond Hettingerf114a3a2004-03-08 23:25:30 +00001771 while (oparg--) {
1772 w = items[oparg];
1773 Py_INCREF(w);
1774 PUSH(w);
Barry Warsawe42b18f1997-08-25 22:13:04 +00001775 }
Raymond Hettinger7eddd782004-04-07 14:38:08 +00001776 Py_DECREF(v);
1777 continue;
Thomas Wouterse2176022007-09-20 17:35:10 +00001778 } else if (PyList_CheckExact(v) &&
1779 PyList_GET_SIZE(v) == oparg) {
1780 PyObject **items = \
1781 ((PyListObject *)v)->ob_item;
Raymond Hettingerf114a3a2004-03-08 23:25:30 +00001782 while (oparg--) {
1783 w = items[oparg];
1784 Py_INCREF(w);
1785 PUSH(w);
Barry Warsawe42b18f1997-08-25 22:13:04 +00001786 }
Raymond Hettingerf114a3a2004-03-08 23:25:30 +00001787 } else if (unpack_iterable(v, oparg,
Thomas Wouterse2176022007-09-20 17:35:10 +00001788 stack_pointer + oparg)) {
Tim Petersd6d010b2001-06-21 02:49:55 +00001789 stack_pointer += oparg;
Georg Brandl5cb76c12007-03-21 09:00:39 +00001790 } else {
1791 /* unpack_iterable() raised an exception */
Barry Warsawe42b18f1997-08-25 22:13:04 +00001792 why = WHY_EXCEPTION;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001793 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001794 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001795 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001796
Guido van Rossum374a9221991-04-04 10:40:29 +00001797 case STORE_ATTR:
Skip Montanaro496e6582002-08-06 17:47:40 +00001798 w = GETITEM(names, oparg);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001799 v = TOP();
1800 u = SECOND();
1801 STACKADJ(-2);
Guido van Rossumb209a111997-04-29 18:18:01 +00001802 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1803 Py_DECREF(v);
1804 Py_DECREF(u);
Raymond Hettinger7eddd782004-04-07 14:38:08 +00001805 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001806 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001807
Guido van Rossum374a9221991-04-04 10:40:29 +00001808 case DELETE_ATTR:
Skip Montanaro496e6582002-08-06 17:47:40 +00001809 w = GETITEM(names, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001810 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001811 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1812 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001813 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001814 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001815
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001816 case STORE_GLOBAL:
Skip Montanaro496e6582002-08-06 17:47:40 +00001817 w = GETITEM(names, oparg);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001818 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001819 err = PyDict_SetItem(f->f_globals, w, v);
1820 Py_DECREF(v);
Raymond Hettinger7eddd782004-04-07 14:38:08 +00001821 if (err == 0) continue;
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001822 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001823
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001824 case DELETE_GLOBAL:
Skip Montanaro496e6582002-08-06 17:47:40 +00001825 w = GETITEM(names, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001826 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001827 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001828 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001829 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001830
Guido van Rossum374a9221991-04-04 10:40:29 +00001831 case LOAD_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001832 w = GETITEM(names, oparg);
Raymond Hettinger214b1c32004-07-02 06:41:07 +00001833 if ((v = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001834 PyErr_Format(PyExc_SystemError,
1835 "no locals when loading %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001836 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001837 break;
1838 }
Michael W. Hudsona3711f72004-08-02 14:50:43 +00001839 if (PyDict_CheckExact(v)) {
Raymond Hettinger214b1c32004-07-02 06:41:07 +00001840 x = PyDict_GetItem(v, w);
Michael W. Hudsona3711f72004-08-02 14:50:43 +00001841 Py_XINCREF(x);
1842 }
Raymond Hettinger214b1c32004-07-02 06:41:07 +00001843 else {
1844 x = PyObject_GetItem(v, w);
1845 if (x == NULL && PyErr_Occurred()) {
Thomas Wouterse2176022007-09-20 17:35:10 +00001846 if (!PyErr_ExceptionMatches(
1847 PyExc_KeyError))
Raymond Hettinger214b1c32004-07-02 06:41:07 +00001848 break;
1849 PyErr_Clear();
1850 }
1851 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001852 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001853 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001854 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001855 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001856 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001857 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001858 PyExc_NameError,
Thomas Wouterse2176022007-09-20 17:35:10 +00001859 NAME_ERROR_MSG, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001860 break;
1861 }
1862 }
Michael W. Hudsona3711f72004-08-02 14:50:43 +00001863 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001864 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001865 PUSH(x);
Raymond Hettinger467a6982004-04-07 11:39:21 +00001866 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001867
Guido van Rossum374a9221991-04-04 10:40:29 +00001868 case LOAD_GLOBAL:
Skip Montanaro496e6582002-08-06 17:47:40 +00001869 w = GETITEM(names, oparg);
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001870 if (PyString_CheckExact(w)) {
Guido van Rossumd8dbf842002-08-19 21:17:53 +00001871 /* Inline the PyDict_GetItem() calls.
1872 WARNING: this is an extreme speed hack.
1873 Do not try this at home. */
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001874 long hash = ((PyStringObject *)w)->ob_shash;
1875 if (hash != -1) {
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001876 PyDictObject *d;
Armin Rigo35f6d362006-06-01 13:19:12 +00001877 PyDictEntry *e;
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001878 d = (PyDictObject *)(f->f_globals);
Armin Rigo35f6d362006-06-01 13:19:12 +00001879 e = d->ma_lookup(d, w, hash);
1880 if (e == NULL) {
1881 x = NULL;
1882 break;
1883 }
1884 x = e->me_value;
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001885 if (x != NULL) {
1886 Py_INCREF(x);
1887 PUSH(x);
1888 continue;
1889 }
1890 d = (PyDictObject *)(f->f_builtins);
Armin Rigo35f6d362006-06-01 13:19:12 +00001891 e = d->ma_lookup(d, w, hash);
1892 if (e == NULL) {
1893 x = NULL;
1894 break;
1895 }
1896 x = e->me_value;
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001897 if (x != NULL) {
1898 Py_INCREF(x);
1899 PUSH(x);
1900 continue;
1901 }
1902 goto load_global_error;
1903 }
1904 }
1905 /* This is the un-inlined version of the code above */
Guido van Rossumb209a111997-04-29 18:18:01 +00001906 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001907 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001908 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001909 if (x == NULL) {
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001910 load_global_error:
Paul Prescode68140d2000-08-30 20:25:01 +00001911 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001912 PyExc_NameError,
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001913 GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001914 break;
1915 }
1916 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001917 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001918 PUSH(x);
Raymond Hettinger7eddd782004-04-07 14:38:08 +00001919 continue;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001920
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001921 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001922 x = GETLOCAL(oparg);
Raymond Hettinger467a6982004-04-07 11:39:21 +00001923 if (x != NULL) {
1924 SETLOCAL(oparg, NULL);
1925 continue;
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001926 }
Raymond Hettinger467a6982004-04-07 11:39:21 +00001927 format_exc_check_arg(
1928 PyExc_UnboundLocalError,
1929 UNBOUNDLOCAL_ERROR_MSG,
1930 PyTuple_GetItem(co->co_varnames, oparg)
1931 );
1932 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001933
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001934 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001935 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001936 Py_INCREF(x);
1937 PUSH(x);
Raymond Hettinger7eddd782004-04-07 14:38:08 +00001938 if (x != NULL) continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001939 break;
1940
1941 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001942 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001943 w = PyCell_Get(x);
Raymond Hettinger467a6982004-04-07 11:39:21 +00001944 if (w != NULL) {
1945 PUSH(w);
1946 continue;
Jeremy Hylton2524d692001-02-05 17:23:16 +00001947 }
Raymond Hettinger467a6982004-04-07 11:39:21 +00001948 err = -1;
1949 /* Don't stomp existing exception */
1950 if (PyErr_Occurred())
1951 break;
Richard Jonescebbefc2006-05-23 18:28:17 +00001952 if (oparg < PyTuple_GET_SIZE(co->co_cellvars)) {
1953 v = PyTuple_GET_ITEM(co->co_cellvars,
Raymond Hettinger467a6982004-04-07 11:39:21 +00001954 oparg);
1955 format_exc_check_arg(
1956 PyExc_UnboundLocalError,
1957 UNBOUNDLOCAL_ERROR_MSG,
1958 v);
1959 } else {
Thomas Wouterse2176022007-09-20 17:35:10 +00001960 v = PyTuple_GET_ITEM(co->co_freevars, oparg -
1961 PyTuple_GET_SIZE(co->co_cellvars));
1962 format_exc_check_arg(PyExc_NameError,
1963 UNBOUNDFREE_ERROR_MSG, v);
Raymond Hettinger467a6982004-04-07 11:39:21 +00001964 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001965 break;
1966
1967 case STORE_DEREF:
1968 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001969 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001970 PyCell_Set(x, w);
Jeremy Hylton30c9f392001-03-13 01:58:22 +00001971 Py_DECREF(w);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001972 continue;
1973
Guido van Rossum374a9221991-04-04 10:40:29 +00001974 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001975 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001976 if (x != NULL) {
Raymond Hettinger5bed4562004-04-10 23:34:17 +00001977 for (; --oparg >= 0;) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001978 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001979 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001980 }
1981 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001982 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001983 }
1984 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001985
Guido van Rossum374a9221991-04-04 10:40:29 +00001986 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001987 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001988 if (x != NULL) {
Raymond Hettinger5bed4562004-04-10 23:34:17 +00001989 for (; --oparg >= 0;) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001990 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001991 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001992 }
1993 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001994 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001995 }
1996 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001997
Guido van Rossum374a9221991-04-04 10:40:29 +00001998 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001999 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00002000 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002001 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00002002 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002003
Guido van Rossum374a9221991-04-04 10:40:29 +00002004 case LOAD_ATTR:
Skip Montanaro496e6582002-08-06 17:47:40 +00002005 w = GETITEM(names, oparg);
Raymond Hettinger663004b2003-01-09 15:24:30 +00002006 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002007 x = PyObject_GetAttr(v, w);
2008 Py_DECREF(v);
Raymond Hettinger663004b2003-01-09 15:24:30 +00002009 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002010 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00002011 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002012
Guido van Rossum374a9221991-04-04 10:40:29 +00002013 case COMPARE_OP:
2014 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00002015 v = TOP();
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +00002016 if (PyInt_CheckExact(w) && PyInt_CheckExact(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00002017 /* INLINE: cmp(int, int) */
2018 register long a, b;
2019 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00002020 a = PyInt_AS_LONG(v);
2021 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00002022 switch (oparg) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00002023 case PyCmp_LT: res = a < b; break;
2024 case PyCmp_LE: res = a <= b; break;
2025 case PyCmp_EQ: res = a == b; break;
2026 case PyCmp_NE: res = a != b; break;
2027 case PyCmp_GT: res = a > b; break;
2028 case PyCmp_GE: res = a >= b; break;
2029 case PyCmp_IS: res = v == w; break;
2030 case PyCmp_IS_NOT: res = v != w; break;
Guido van Rossumc12da691997-07-17 23:12:42 +00002031 default: goto slow_compare;
2032 }
2033 x = res ? Py_True : Py_False;
2034 Py_INCREF(x);
2035 }
2036 else {
2037 slow_compare:
2038 x = cmp_outcome(oparg, v, w);
2039 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002040 Py_DECREF(v);
2041 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00002042 SET_TOP(x);
Raymond Hettingerf606f872003-03-16 03:11:04 +00002043 if (x == NULL) break;
2044 PREDICT(JUMP_IF_FALSE);
2045 PREDICT(JUMP_IF_TRUE);
2046 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00002047
Guido van Rossum374a9221991-04-04 10:40:29 +00002048 case IMPORT_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00002049 w = GETITEM(names, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002050 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002051 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002052 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00002053 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002054 break;
2055 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002056 v = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00002057 u = TOP();
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002058 if (PyInt_AsLong(u) != -1 || PyErr_Occurred())
2059 w = PyTuple_Pack(5,
2060 w,
2061 f->f_globals,
2062 f->f_locals == NULL ?
2063 Py_None : f->f_locals,
2064 v,
2065 u);
2066 else
2067 w = PyTuple_Pack(4,
2068 w,
2069 f->f_globals,
2070 f->f_locals == NULL ?
2071 Py_None : f->f_locals,
2072 v);
2073 Py_DECREF(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00002074 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002075 if (w == NULL) {
Raymond Hettinger663004b2003-01-09 15:24:30 +00002076 u = POP();
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002077 x = NULL;
2078 break;
2079 }
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002080 READ_TIMESTAMP(intr0);
Guido van Rossumb209a111997-04-29 18:18:01 +00002081 x = PyEval_CallObject(x, w);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002082 READ_TIMESTAMP(intr1);
Guido van Rossumb209a111997-04-29 18:18:01 +00002083 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00002084 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002085 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00002086 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002087
Thomas Wouters52152252000-08-17 22:55:00 +00002088 case IMPORT_STAR:
2089 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002090 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002091 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002092 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00002093 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002094 break;
2095 }
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002096 READ_TIMESTAMP(intr0);
Thomas Wouters52152252000-08-17 22:55:00 +00002097 err = import_all_from(x, v);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002098 READ_TIMESTAMP(intr1);
Guido van Rossumb209a111997-04-29 18:18:01 +00002099 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00002100 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002101 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00002102 break;
Guido van Rossum25831651993-05-19 14:50:45 +00002103
Thomas Wouters52152252000-08-17 22:55:00 +00002104 case IMPORT_FROM:
Skip Montanaro496e6582002-08-06 17:47:40 +00002105 w = GETITEM(names, oparg);
Thomas Wouters52152252000-08-17 22:55:00 +00002106 v = TOP();
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002107 READ_TIMESTAMP(intr0);
Thomas Wouters52152252000-08-17 22:55:00 +00002108 x = import_from(v, w);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002109 READ_TIMESTAMP(intr1);
Thomas Wouters52152252000-08-17 22:55:00 +00002110 PUSH(x);
2111 if (x != NULL) continue;
2112 break;
2113
Guido van Rossum374a9221991-04-04 10:40:29 +00002114 case JUMP_FORWARD:
2115 JUMPBY(oparg);
Neil Schemenauerc4b570f2003-06-01 19:21:12 +00002116 goto fast_next_opcode;
Guido van Rossumac7be682001-01-17 15:42:30 +00002117
Raymond Hettingerf606f872003-03-16 03:11:04 +00002118 PREDICTED_WITH_ARG(JUMP_IF_FALSE);
Guido van Rossum374a9221991-04-04 10:40:29 +00002119 case JUMP_IF_FALSE:
Raymond Hettinger21012b82003-02-26 18:11:50 +00002120 w = TOP();
Raymond Hettingerf606f872003-03-16 03:11:04 +00002121 if (w == Py_True) {
2122 PREDICT(POP_TOP);
Neil Schemenauerc4b570f2003-06-01 19:21:12 +00002123 goto fast_next_opcode;
Raymond Hettingerf606f872003-03-16 03:11:04 +00002124 }
Raymond Hettinger21012b82003-02-26 18:11:50 +00002125 if (w == Py_False) {
2126 JUMPBY(oparg);
Neil Schemenauerc4b570f2003-06-01 19:21:12 +00002127 goto fast_next_opcode;
Raymond Hettinger21012b82003-02-26 18:11:50 +00002128 }
2129 err = PyObject_IsTrue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002130 if (err > 0)
2131 err = 0;
2132 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00002133 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002134 else
2135 break;
2136 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00002137
Raymond Hettingerf606f872003-03-16 03:11:04 +00002138 PREDICTED_WITH_ARG(JUMP_IF_TRUE);
Guido van Rossum374a9221991-04-04 10:40:29 +00002139 case JUMP_IF_TRUE:
Raymond Hettinger21012b82003-02-26 18:11:50 +00002140 w = TOP();
Raymond Hettingerf606f872003-03-16 03:11:04 +00002141 if (w == Py_False) {
2142 PREDICT(POP_TOP);
Neil Schemenauerc4b570f2003-06-01 19:21:12 +00002143 goto fast_next_opcode;
Raymond Hettingerf606f872003-03-16 03:11:04 +00002144 }
Raymond Hettinger21012b82003-02-26 18:11:50 +00002145 if (w == Py_True) {
2146 JUMPBY(oparg);
Neil Schemenauerc4b570f2003-06-01 19:21:12 +00002147 goto fast_next_opcode;
Raymond Hettinger21012b82003-02-26 18:11:50 +00002148 }
2149 err = PyObject_IsTrue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002150 if (err > 0) {
2151 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00002152 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002153 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002154 else if (err == 0)
2155 ;
2156 else
2157 break;
2158 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00002159
Raymond Hettingerfba1cfc2004-03-12 16:33:17 +00002160 PREDICTED_WITH_ARG(JUMP_ABSOLUTE);
Guido van Rossum374a9221991-04-04 10:40:29 +00002161 case JUMP_ABSOLUTE:
2162 JUMPTO(oparg);
Raymond Hettingerdc1d1ba2007-11-07 02:45:46 +00002163#if FAST_LOOPS
2164 /* Enabling this path speeds-up all while and for-loops by bypassing
2165 the per-loop checks for signals. By default, this should be turned-off
2166 because it prevents detection of a control-break in tight loops like
2167 "while 1: pass". Compile with this option turned-on when you need
2168 the speed-up and do not need break checking inside tight loops (ones
2169 that contain only instructions ending with goto fast_next_opcode).
2170 */
2171 goto fast_next_opcode;
2172#else
Neil Schemenauerca2a2f12003-05-30 23:59:44 +00002173 continue;
Raymond Hettingerdc1d1ba2007-11-07 02:45:46 +00002174#endif
Guido van Rossumac7be682001-01-17 15:42:30 +00002175
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002176 case GET_ITER:
2177 /* before: [obj]; after [getiter(obj)] */
Raymond Hettinger663004b2003-01-09 15:24:30 +00002178 v = TOP();
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002179 x = PyObject_GetIter(v);
2180 Py_DECREF(v);
2181 if (x != NULL) {
Raymond Hettinger663004b2003-01-09 15:24:30 +00002182 SET_TOP(x);
Raymond Hettinger7dc52212003-03-16 20:14:44 +00002183 PREDICT(FOR_ITER);
Guido van Rossum213c7a62001-04-23 14:08:49 +00002184 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002185 }
Raymond Hettinger8bb90a52003-01-14 12:43:10 +00002186 STACKADJ(-1);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002187 break;
2188
Raymond Hettinger7dc52212003-03-16 20:14:44 +00002189 PREDICTED_WITH_ARG(FOR_ITER);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002190 case FOR_ITER:
2191 /* before: [iter]; after: [iter, iter()] *or* [] */
2192 v = TOP();
Raymond Hettingerdb0de9e2004-03-12 08:41:36 +00002193 x = (*v->ob_type->tp_iternext)(v);
Guido van Rossum213c7a62001-04-23 14:08:49 +00002194 if (x != NULL) {
2195 PUSH(x);
Raymond Hettinger7dc52212003-03-16 20:14:44 +00002196 PREDICT(STORE_FAST);
2197 PREDICT(UNPACK_SEQUENCE);
Guido van Rossum213c7a62001-04-23 14:08:49 +00002198 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002199 }
Raymond Hettingerdb0de9e2004-03-12 08:41:36 +00002200 if (PyErr_Occurred()) {
Thomas Wouterse2176022007-09-20 17:35:10 +00002201 if (!PyErr_ExceptionMatches(
2202 PyExc_StopIteration))
Raymond Hettingerdb0de9e2004-03-12 08:41:36 +00002203 break;
2204 PyErr_Clear();
Guido van Rossum213c7a62001-04-23 14:08:49 +00002205 }
Raymond Hettingerdb0de9e2004-03-12 08:41:36 +00002206 /* iterator ended normally */
2207 x = v = POP();
2208 Py_DECREF(v);
2209 JUMPBY(oparg);
2210 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002211
Raymond Hettinger2d783e92004-03-12 09:12:22 +00002212 case BREAK_LOOP:
2213 why = WHY_BREAK;
2214 goto fast_block_end;
2215
2216 case CONTINUE_LOOP:
2217 retval = PyInt_FromLong(oparg);
Neal Norwitz02104df2006-05-19 06:31:23 +00002218 if (!retval) {
2219 x = NULL;
2220 break;
2221 }
Raymond Hettinger2d783e92004-03-12 09:12:22 +00002222 why = WHY_CONTINUE;
2223 goto fast_block_end;
2224
Guido van Rossum374a9221991-04-04 10:40:29 +00002225 case SETUP_LOOP:
2226 case SETUP_EXCEPT:
2227 case SETUP_FINALLY:
Thomas Wouterse2176022007-09-20 17:35:10 +00002228 /* NOTE: If you add any new block-setup opcodes that
2229 are not try/except/finally handlers, you may need
2230 to update the PyGen_NeedsFinalizing() function.
2231 */
Phillip J. Eby2ba96612006-04-10 17:51:05 +00002232
Guido van Rossumb209a111997-04-29 18:18:01 +00002233 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002234 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002235 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00002236
Guido van Rossumc2e20742006-02-27 22:32:47 +00002237 case WITH_CLEANUP:
2238 {
2239 /* TOP is the context.__exit__ bound method.
2240 Below that are 1-3 values indicating how/why
2241 we entered the finally clause:
2242 - SECOND = None
Guido van Rossumf6694362006-03-10 02:28:35 +00002243 - (SECOND, THIRD) = (WHY_{RETURN,CONTINUE}), retval
Guido van Rossumc2e20742006-02-27 22:32:47 +00002244 - SECOND = WHY_*; no retval below it
2245 - (SECOND, THIRD, FOURTH) = exc_info()
2246 In the last case, we must call
2247 TOP(SECOND, THIRD, FOURTH)
2248 otherwise we must call
2249 TOP(None, None, None)
Guido van Rossum1a5e21e2006-02-28 21:57:43 +00002250
2251 In addition, if the stack represents an exception,
Guido van Rossumf6694362006-03-10 02:28:35 +00002252 *and* the function call returns a 'true' value, we
2253 "zap" this information, to prevent END_FINALLY from
2254 re-raising the exception. (But non-local gotos
2255 should still be resumed.)
Guido van Rossumc2e20742006-02-27 22:32:47 +00002256 */
Tim Peters7df5e7f2006-05-26 23:14:37 +00002257
Guido van Rossumc2e20742006-02-27 22:32:47 +00002258 x = TOP();
2259 u = SECOND();
2260 if (PyInt_Check(u) || u == Py_None) {
2261 u = v = w = Py_None;
2262 }
2263 else {
2264 v = THIRD();
2265 w = FOURTH();
2266 }
Guido van Rossumf6694362006-03-10 02:28:35 +00002267 /* XXX Not the fastest way to call it... */
2268 x = PyObject_CallFunctionObjArgs(x, u, v, w, NULL);
2269 if (x == NULL)
2270 break; /* Go to error exit */
2271 if (u != Py_None && PyObject_IsTrue(x)) {
2272 /* There was an exception and a true return */
2273 Py_DECREF(x);
2274 x = TOP(); /* Again */
2275 STACKADJ(-3);
2276 Py_INCREF(Py_None);
2277 SET_TOP(Py_None);
2278 Py_DECREF(x);
2279 Py_DECREF(u);
2280 Py_DECREF(v);
2281 Py_DECREF(w);
2282 } else {
2283 /* Let END_FINALLY do its thing */
2284 Py_DECREF(x);
2285 x = POP();
2286 Py_DECREF(x);
2287 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00002288 break;
2289 }
2290
Guido van Rossumf10570b1995-07-07 22:53:21 +00002291 case CALL_FUNCTION:
Armin Rigo8817fcd2004-06-17 10:22:40 +00002292 {
2293 PyObject **sp;
Jeremy Hylton985eba52003-02-05 23:13:00 +00002294 PCALL(PCALL_ALL);
Armin Rigo8817fcd2004-06-17 10:22:40 +00002295 sp = stack_pointer;
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00002296#ifdef WITH_TSC
Armin Rigo8817fcd2004-06-17 10:22:40 +00002297 x = call_function(&sp, oparg, &intr0, &intr1);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00002298#else
Armin Rigo8817fcd2004-06-17 10:22:40 +00002299 x = call_function(&sp, oparg);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00002300#endif
Armin Rigo8817fcd2004-06-17 10:22:40 +00002301 stack_pointer = sp;
Jeremy Hyltone8c04322002-08-16 17:47:26 +00002302 PUSH(x);
2303 if (x != NULL)
2304 continue;
2305 break;
Armin Rigo8817fcd2004-06-17 10:22:40 +00002306 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002307
Jeremy Hylton76901512000-03-28 23:49:17 +00002308 case CALL_FUNCTION_VAR:
2309 case CALL_FUNCTION_KW:
2310 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00002311 {
Jeremy Hylton76901512000-03-28 23:49:17 +00002312 int na = oparg & 0xff;
2313 int nk = (oparg>>8) & 0xff;
2314 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00002315 int n = na + 2 * nk;
Armin Rigo8817fcd2004-06-17 10:22:40 +00002316 PyObject **pfunc, *func, **sp;
Jeremy Hylton985eba52003-02-05 23:13:00 +00002317 PCALL(PCALL_ALL);
Jeremy Hylton52820442001-01-03 23:52:36 +00002318 if (flags & CALL_FLAG_VAR)
2319 n++;
2320 if (flags & CALL_FLAG_KW)
2321 n++;
2322 pfunc = stack_pointer - n - 1;
2323 func = *pfunc;
Jeremy Hylton52820442001-01-03 23:52:36 +00002324
Guido van Rossumac7be682001-01-17 15:42:30 +00002325 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00002326 && PyMethod_GET_SELF(func) != NULL) {
2327 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002328 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00002329 func = PyMethod_GET_FUNCTION(func);
2330 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002331 Py_DECREF(*pfunc);
2332 *pfunc = self;
2333 na++;
2334 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00002335 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00002336 Py_INCREF(func);
Armin Rigo8817fcd2004-06-17 10:22:40 +00002337 sp = stack_pointer;
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002338 READ_TIMESTAMP(intr0);
Armin Rigo8817fcd2004-06-17 10:22:40 +00002339 x = ext_do_call(func, &sp, flags, na, nk);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002340 READ_TIMESTAMP(intr1);
Armin Rigo8817fcd2004-06-17 10:22:40 +00002341 stack_pointer = sp;
Jeremy Hylton76901512000-03-28 23:49:17 +00002342 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002343
Jeremy Hylton76901512000-03-28 23:49:17 +00002344 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00002345 w = POP();
2346 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00002347 }
2348 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002349 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002350 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00002351 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002352 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002353
Guido van Rossum681d79a1995-07-18 14:51:37 +00002354 case MAKE_FUNCTION:
2355 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00002356 x = PyFunction_New(v, f->f_globals);
2357 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002358 /* XXX Maybe this should be a separate opcode? */
2359 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002360 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002361 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002362 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002363 x = NULL;
2364 break;
2365 }
Raymond Hettinger5bed4562004-04-10 23:34:17 +00002366 while (--oparg >= 0) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002367 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002368 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002369 }
2370 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00002371 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002372 }
2373 PUSH(x);
2374 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002375
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002376 case MAKE_CLOSURE:
2377 {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002378 v = POP(); /* code object */
2379 x = PyFunction_New(v, f->f_globals);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002380 Py_DECREF(v);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002381 if (x != NULL) {
2382 v = POP();
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002383 err = PyFunction_SetClosure(x, v);
2384 Py_DECREF(v);
2385 }
2386 if (x != NULL && oparg > 0) {
2387 v = PyTuple_New(oparg);
2388 if (v == NULL) {
2389 Py_DECREF(x);
2390 x = NULL;
2391 break;
2392 }
Raymond Hettinger5bed4562004-04-10 23:34:17 +00002393 while (--oparg >= 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002394 w = POP();
2395 PyTuple_SET_ITEM(v, oparg, w);
2396 }
2397 err = PyFunction_SetDefaults(x, v);
2398 Py_DECREF(v);
2399 }
2400 PUSH(x);
2401 break;
2402 }
2403
Guido van Rossum8861b741996-07-30 16:49:37 +00002404 case BUILD_SLICE:
2405 if (oparg == 3)
2406 w = POP();
2407 else
2408 w = NULL;
2409 v = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00002410 u = TOP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002411 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002412 Py_DECREF(u);
2413 Py_DECREF(v);
2414 Py_XDECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00002415 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002416 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002417 break;
2418
Fred Drakeef8ace32000-08-24 00:32:09 +00002419 case EXTENDED_ARG:
2420 opcode = NEXTOP();
Raymond Hettinger5bed4562004-04-10 23:34:17 +00002421 oparg = oparg<<16 | NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +00002422 goto dispatch_opcode;
Guido van Rossum8861b741996-07-30 16:49:37 +00002423
Guido van Rossum374a9221991-04-04 10:40:29 +00002424 default:
2425 fprintf(stderr,
2426 "XXX lineno: %d, opcode: %d\n",
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002427 PyCode_Addr2Line(f->f_code, f->f_lasti),
2428 opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002429 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002430 why = WHY_EXCEPTION;
2431 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002432
2433#ifdef CASE_TOO_BIG
2434 }
2435#endif
2436
Guido van Rossum374a9221991-04-04 10:40:29 +00002437 } /* switch */
2438
2439 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002440
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002441 READ_TIMESTAMP(inst1);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00002442
Guido van Rossum374a9221991-04-04 10:40:29 +00002443 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002444
Guido van Rossum374a9221991-04-04 10:40:29 +00002445 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002446 if (err == 0 && x != NULL) {
2447#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002448 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002449 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002450 fprintf(stderr,
2451 "XXX undetected error\n");
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00002452 else {
2453#endif
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002454 READ_TIMESTAMP(loop1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002455 continue; /* Normal, fast path */
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00002456#ifdef CHECKEXC
2457 }
2458#endif
Guido van Rossum681d79a1995-07-18 14:51:37 +00002459 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002460 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002461 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002462 err = 0;
2463 }
2464
Guido van Rossum374a9221991-04-04 10:40:29 +00002465 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002466
Raymond Hettingerc8aa08b2004-04-11 14:59:33 +00002467 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002468 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002469 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002470 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002471 why = WHY_EXCEPTION;
2472 }
2473 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002474#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002475 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002476 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002477 if (PyErr_Occurred()) {
Jeremy Hylton904ed862003-11-05 17:29:35 +00002478 char buf[1024];
2479 sprintf(buf, "Stack unwind with exception "
2480 "set and why=%d", why);
2481 Py_FatalError(buf);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002482 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002483 }
2484#endif
2485
2486 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002487
Guido van Rossum374a9221991-04-04 10:40:29 +00002488 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002489 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002490
Fred Drake8f51f542001-10-04 14:48:42 +00002491 if (tstate->c_tracefunc != NULL)
2492 call_exc_trace(tstate->c_tracefunc,
2493 tstate->c_traceobj, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002494 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002495
Guido van Rossum374a9221991-04-04 10:40:29 +00002496 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002497
Guido van Rossum374a9221991-04-04 10:40:29 +00002498 if (why == WHY_RERAISE)
2499 why = WHY_EXCEPTION;
2500
2501 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002502
Raymond Hettinger1dd83092004-02-06 18:32:33 +00002503fast_block_end:
Tim Peters8a5c3c72004-04-05 19:36:21 +00002504 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002505 PyTryBlock *b = PyFrame_BlockPop(f);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002506
Tim Peters8a5c3c72004-04-05 19:36:21 +00002507 assert(why != WHY_YIELD);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002508 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2509 /* For a continue inside a try block,
2510 don't pop the block for the loop. */
Thomas Wouters1ee64222001-09-24 19:32:01 +00002511 PyFrame_BlockSetup(f, b->b_type, b->b_handler,
2512 b->b_level);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002513 why = WHY_NOT;
2514 JUMPTO(PyInt_AS_LONG(retval));
2515 Py_DECREF(retval);
2516 break;
2517 }
2518
Guido van Rossum374a9221991-04-04 10:40:29 +00002519 while (STACK_LEVEL() > b->b_level) {
2520 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002521 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002522 }
2523 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2524 why = WHY_NOT;
2525 JUMPTO(b->b_handler);
2526 break;
2527 }
2528 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002529 (b->b_type == SETUP_EXCEPT &&
2530 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002531 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002532 PyObject *exc, *val, *tb;
2533 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002534 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002535 val = Py_None;
2536 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002537 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002538 /* Make the raw exception data
2539 available to the handler,
2540 so a program can emulate the
2541 Python main loop. Don't do
2542 this for 'finally'. */
2543 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002544 PyErr_NormalizeException(
2545 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002546 set_exc_info(tstate,
2547 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002548 }
Jeremy Hyltonc6314892001-09-26 19:24:45 +00002549 if (tb == NULL) {
2550 Py_INCREF(Py_None);
2551 PUSH(Py_None);
2552 } else
2553 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002554 PUSH(val);
2555 PUSH(exc);
2556 }
2557 else {
Raymond Hettinger06032cb2004-04-06 09:37:35 +00002558 if (why & (WHY_RETURN | WHY_CONTINUE))
Guido van Rossum374a9221991-04-04 10:40:29 +00002559 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002560 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002561 PUSH(v);
2562 }
2563 why = WHY_NOT;
2564 JUMPTO(b->b_handler);
2565 break;
2566 }
2567 } /* unwind stack */
2568
2569 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002570
Guido van Rossum374a9221991-04-04 10:40:29 +00002571 if (why != WHY_NOT)
2572 break;
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002573 READ_TIMESTAMP(loop1);
Guido van Rossumac7be682001-01-17 15:42:30 +00002574
Guido van Rossum374a9221991-04-04 10:40:29 +00002575 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002576
Tim Peters8a5c3c72004-04-05 19:36:21 +00002577 assert(why != WHY_YIELD);
2578 /* Pop remaining stack entries. */
2579 while (!EMPTY()) {
2580 v = POP();
2581 Py_XDECREF(v);
Guido van Rossum35974fb2001-12-06 21:28:18 +00002582 }
2583
Tim Peters8a5c3c72004-04-05 19:36:21 +00002584 if (why != WHY_RETURN)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002585 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002586
Raymond Hettinger1dd83092004-02-06 18:32:33 +00002587fast_yield:
Fred Drake9e3ad782001-07-03 23:39:52 +00002588 if (tstate->use_tracing) {
Barry Warsawe2eca0b2005-08-15 18:14:19 +00002589 if (tstate->c_tracefunc) {
2590 if (why == WHY_RETURN || why == WHY_YIELD) {
2591 if (call_trace(tstate->c_tracefunc,
2592 tstate->c_traceobj, f,
2593 PyTrace_RETURN, retval)) {
2594 Py_XDECREF(retval);
2595 retval = NULL;
2596 why = WHY_EXCEPTION;
2597 }
2598 }
2599 else if (why == WHY_EXCEPTION) {
2600 call_trace_protected(tstate->c_tracefunc,
2601 tstate->c_traceobj, f,
Armin Rigo1c2d7e52005-09-20 18:34:01 +00002602 PyTrace_RETURN, NULL);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002603 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002604 }
Fred Drake8f51f542001-10-04 14:48:42 +00002605 if (tstate->c_profilefunc) {
Fred Drake4ec5d562001-10-04 19:26:43 +00002606 if (why == WHY_EXCEPTION)
2607 call_trace_protected(tstate->c_profilefunc,
2608 tstate->c_profileobj, f,
Armin Rigo1c2d7e52005-09-20 18:34:01 +00002609 PyTrace_RETURN, NULL);
Fred Drake4ec5d562001-10-04 19:26:43 +00002610 else if (call_trace(tstate->c_profilefunc,
2611 tstate->c_profileobj, f,
2612 PyTrace_RETURN, retval)) {
Fred Drake9e3ad782001-07-03 23:39:52 +00002613 Py_XDECREF(retval);
2614 retval = NULL;
2615 why = WHY_EXCEPTION;
2616 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002617 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002618 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002619
Tim Peters7df5e7f2006-05-26 23:14:37 +00002620 if (tstate->frame->f_exc_type != NULL)
2621 reset_exc_info(tstate);
2622 else {
2623 assert(tstate->frame->f_exc_value == NULL);
2624 assert(tstate->frame->f_exc_traceback == NULL);
2625 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00002626
Tim Peters5ca576e2001-06-18 22:08:13 +00002627 /* pop frame */
Thomas Woutersae406c62007-09-19 17:27:43 +00002628exit_eval_frame:
Armin Rigo2b3eb402003-10-28 12:05:48 +00002629 Py_LeaveRecursiveCall();
Guido van Rossuma027efa1997-05-05 20:56:21 +00002630 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00002631
Guido van Rossum96a42c81992-01-12 02:29:51 +00002632 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002633}
2634
Guido van Rossumc2e20742006-02-27 22:32:47 +00002635/* This is gonna seem *real weird*, but if you put some other code between
Martin v. Löwis8d97e332004-06-27 15:43:12 +00002636 PyEval_EvalFrame() and PyEval_EvalCodeEx() you will need to adjust
Guido van Rossumc2e20742006-02-27 22:32:47 +00002637 the test in the if statements in Misc/gdbinit (pystack and pystackv). */
Skip Montanaro786ea6b2004-03-01 15:44:05 +00002638
Tim Peters6d6c1a32001-08-02 04:15:00 +00002639PyObject *
2640PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals,
Tim Peters5ca576e2001-06-18 22:08:13 +00002641 PyObject **args, int argcount, PyObject **kws, int kwcount,
2642 PyObject **defs, int defcount, PyObject *closure)
2643{
2644 register PyFrameObject *f;
2645 register PyObject *retval = NULL;
2646 register PyObject **fastlocals, **freevars;
2647 PyThreadState *tstate = PyThreadState_GET();
2648 PyObject *x, *u;
2649
2650 if (globals == NULL) {
Tim Peters8a5c3c72004-04-05 19:36:21 +00002651 PyErr_SetString(PyExc_SystemError,
Jeremy Hylton910d7d42001-08-12 21:52:24 +00002652 "PyEval_EvalCodeEx: NULL globals");
Tim Peters5ca576e2001-06-18 22:08:13 +00002653 return NULL;
2654 }
2655
Neal Norwitzdf6a6492006-08-13 18:10:10 +00002656 assert(tstate != NULL);
Jeremy Hylton985eba52003-02-05 23:13:00 +00002657 assert(globals != NULL);
2658 f = PyFrame_New(tstate, co, globals, locals);
Tim Peters5ca576e2001-06-18 22:08:13 +00002659 if (f == NULL)
2660 return NULL;
2661
2662 fastlocals = f->f_localsplus;
Richard Jonescebbefc2006-05-23 18:28:17 +00002663 freevars = f->f_localsplus + co->co_nlocals;
Tim Peters5ca576e2001-06-18 22:08:13 +00002664
2665 if (co->co_argcount > 0 ||
2666 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
2667 int i;
2668 int n = argcount;
2669 PyObject *kwdict = NULL;
2670 if (co->co_flags & CO_VARKEYWORDS) {
2671 kwdict = PyDict_New();
2672 if (kwdict == NULL)
2673 goto fail;
2674 i = co->co_argcount;
2675 if (co->co_flags & CO_VARARGS)
2676 i++;
2677 SETLOCAL(i, kwdict);
2678 }
2679 if (argcount > co->co_argcount) {
2680 if (!(co->co_flags & CO_VARARGS)) {
2681 PyErr_Format(PyExc_TypeError,
2682 "%.200s() takes %s %d "
2683 "%sargument%s (%d given)",
2684 PyString_AsString(co->co_name),
2685 defcount ? "at most" : "exactly",
2686 co->co_argcount,
2687 kwcount ? "non-keyword " : "",
2688 co->co_argcount == 1 ? "" : "s",
2689 argcount);
2690 goto fail;
2691 }
2692 n = co->co_argcount;
2693 }
2694 for (i = 0; i < n; i++) {
2695 x = args[i];
2696 Py_INCREF(x);
2697 SETLOCAL(i, x);
2698 }
2699 if (co->co_flags & CO_VARARGS) {
2700 u = PyTuple_New(argcount - n);
2701 if (u == NULL)
2702 goto fail;
2703 SETLOCAL(co->co_argcount, u);
2704 for (i = n; i < argcount; i++) {
2705 x = args[i];
2706 Py_INCREF(x);
2707 PyTuple_SET_ITEM(u, i-n, x);
2708 }
2709 }
2710 for (i = 0; i < kwcount; i++) {
2711 PyObject *keyword = kws[2*i];
2712 PyObject *value = kws[2*i + 1];
2713 int j;
2714 if (keyword == NULL || !PyString_Check(keyword)) {
2715 PyErr_Format(PyExc_TypeError,
2716 "%.200s() keywords must be strings",
2717 PyString_AsString(co->co_name));
2718 goto fail;
2719 }
2720 /* XXX slow -- speed up using dictionary? */
2721 for (j = 0; j < co->co_argcount; j++) {
2722 PyObject *nm = PyTuple_GET_ITEM(
2723 co->co_varnames, j);
2724 int cmp = PyObject_RichCompareBool(
2725 keyword, nm, Py_EQ);
2726 if (cmp > 0)
2727 break;
2728 else if (cmp < 0)
2729 goto fail;
2730 }
2731 /* Check errors from Compare */
2732 if (PyErr_Occurred())
2733 goto fail;
2734 if (j >= co->co_argcount) {
2735 if (kwdict == NULL) {
2736 PyErr_Format(PyExc_TypeError,
2737 "%.200s() got an unexpected "
2738 "keyword argument '%.400s'",
2739 PyString_AsString(co->co_name),
2740 PyString_AsString(keyword));
2741 goto fail;
2742 }
2743 PyDict_SetItem(kwdict, keyword, value);
2744 }
2745 else {
2746 if (GETLOCAL(j) != NULL) {
2747 PyErr_Format(PyExc_TypeError,
2748 "%.200s() got multiple "
2749 "values for keyword "
2750 "argument '%.400s'",
2751 PyString_AsString(co->co_name),
2752 PyString_AsString(keyword));
2753 goto fail;
2754 }
2755 Py_INCREF(value);
2756 SETLOCAL(j, value);
2757 }
2758 }
2759 if (argcount < co->co_argcount) {
2760 int m = co->co_argcount - defcount;
2761 for (i = argcount; i < m; i++) {
2762 if (GETLOCAL(i) == NULL) {
2763 PyErr_Format(PyExc_TypeError,
2764 "%.200s() takes %s %d "
2765 "%sargument%s (%d given)",
2766 PyString_AsString(co->co_name),
2767 ((co->co_flags & CO_VARARGS) ||
2768 defcount) ? "at least"
2769 : "exactly",
2770 m, kwcount ? "non-keyword " : "",
2771 m == 1 ? "" : "s", i);
2772 goto fail;
2773 }
2774 }
2775 if (n > m)
2776 i = n - m;
2777 else
2778 i = 0;
2779 for (; i < defcount; i++) {
2780 if (GETLOCAL(m+i) == NULL) {
2781 PyObject *def = defs[i];
2782 Py_INCREF(def);
2783 SETLOCAL(m+i, def);
2784 }
2785 }
2786 }
2787 }
2788 else {
2789 if (argcount > 0 || kwcount > 0) {
2790 PyErr_Format(PyExc_TypeError,
2791 "%.200s() takes no arguments (%d given)",
2792 PyString_AsString(co->co_name),
2793 argcount + kwcount);
2794 goto fail;
2795 }
2796 }
2797 /* Allocate and initialize storage for cell vars, and copy free
2798 vars into frame. This isn't too efficient right now. */
Richard Jonescebbefc2006-05-23 18:28:17 +00002799 if (PyTuple_GET_SIZE(co->co_cellvars)) {
Neal Norwitz245ce8d2006-06-12 02:16:10 +00002800 int i, j, nargs, found;
Tim Peters5ca576e2001-06-18 22:08:13 +00002801 char *cellname, *argname;
2802 PyObject *c;
2803
2804 nargs = co->co_argcount;
2805 if (co->co_flags & CO_VARARGS)
2806 nargs++;
2807 if (co->co_flags & CO_VARKEYWORDS)
2808 nargs++;
2809
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002810 /* Initialize each cell var, taking into account
2811 cell vars that are initialized from arguments.
2812
2813 Should arrange for the compiler to put cellvars
2814 that are arguments at the beginning of the cellvars
2815 list so that we can march over it more efficiently?
2816 */
Richard Jonescebbefc2006-05-23 18:28:17 +00002817 for (i = 0; i < PyTuple_GET_SIZE(co->co_cellvars); ++i) {
Tim Peters5ca576e2001-06-18 22:08:13 +00002818 cellname = PyString_AS_STRING(
2819 PyTuple_GET_ITEM(co->co_cellvars, i));
2820 found = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002821 for (j = 0; j < nargs; j++) {
Tim Peters5ca576e2001-06-18 22:08:13 +00002822 argname = PyString_AS_STRING(
2823 PyTuple_GET_ITEM(co->co_varnames, j));
2824 if (strcmp(cellname, argname) == 0) {
2825 c = PyCell_New(GETLOCAL(j));
2826 if (c == NULL)
2827 goto fail;
Richard Jonescebbefc2006-05-23 18:28:17 +00002828 GETLOCAL(co->co_nlocals + i) = c;
Tim Peters5ca576e2001-06-18 22:08:13 +00002829 found = 1;
2830 break;
2831 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002832 }
2833 if (found == 0) {
2834 c = PyCell_New(NULL);
2835 if (c == NULL)
2836 goto fail;
Richard Jonescebbefc2006-05-23 18:28:17 +00002837 SETLOCAL(co->co_nlocals + i, c);
Tim Peters5ca576e2001-06-18 22:08:13 +00002838 }
2839 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002840 }
Richard Jonescebbefc2006-05-23 18:28:17 +00002841 if (PyTuple_GET_SIZE(co->co_freevars)) {
Tim Peters5ca576e2001-06-18 22:08:13 +00002842 int i;
Richard Jonescebbefc2006-05-23 18:28:17 +00002843 for (i = 0; i < PyTuple_GET_SIZE(co->co_freevars); ++i) {
Tim Peters5ca576e2001-06-18 22:08:13 +00002844 PyObject *o = PyTuple_GET_ITEM(closure, i);
2845 Py_INCREF(o);
Richard Jonescebbefc2006-05-23 18:28:17 +00002846 freevars[PyTuple_GET_SIZE(co->co_cellvars) + i] = o;
Tim Peters5ca576e2001-06-18 22:08:13 +00002847 }
2848 }
2849
Tim Peters5ca576e2001-06-18 22:08:13 +00002850 if (co->co_flags & CO_GENERATOR) {
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002851 /* Don't need to keep the reference to f_back, it will be set
2852 * when the generator is resumed. */
Tim Peters5ba58662001-07-16 02:29:45 +00002853 Py_XDECREF(f->f_back);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002854 f->f_back = NULL;
2855
Jeremy Hylton985eba52003-02-05 23:13:00 +00002856 PCALL(PCALL_GENERATOR);
2857
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002858 /* Create a new generator that owns the ready to run frame
2859 * and return that as the value. */
Martin v. Löwise440e472004-06-01 15:22:42 +00002860 return PyGen_New(f);
Tim Peters5ca576e2001-06-18 22:08:13 +00002861 }
2862
Thomas Woutersae406c62007-09-19 17:27:43 +00002863 retval = PyEval_EvalFrameEx(f,0);
Tim Peters5ca576e2001-06-18 22:08:13 +00002864
Thomas Woutersae406c62007-09-19 17:27:43 +00002865fail: /* Jump here from prelude on failure */
Tim Peters5ca576e2001-06-18 22:08:13 +00002866
Tim Petersb13680b2001-11-27 23:29:29 +00002867 /* decref'ing the frame can cause __del__ methods to get invoked,
2868 which can call back into Python. While we're done with the
2869 current Python frame (f), the associated C stack is still in use,
2870 so recursion_depth must be boosted for the duration.
2871 */
2872 assert(tstate != NULL);
2873 ++tstate->recursion_depth;
Thomas Woutersae406c62007-09-19 17:27:43 +00002874 Py_DECREF(f);
Tim Petersb13680b2001-11-27 23:29:29 +00002875 --tstate->recursion_depth;
Tim Peters5ca576e2001-06-18 22:08:13 +00002876 return retval;
2877}
2878
2879
Guido van Rossumc9fbb722003-03-01 03:36:33 +00002880/* Implementation notes for set_exc_info() and reset_exc_info():
2881
2882- Below, 'exc_ZZZ' stands for 'exc_type', 'exc_value' and
2883 'exc_traceback'. These always travel together.
2884
2885- tstate->curexc_ZZZ is the "hot" exception that is set by
2886 PyErr_SetString(), cleared by PyErr_Clear(), and so on.
2887
2888- Once an exception is caught by an except clause, it is transferred
2889 from tstate->curexc_ZZZ to tstate->exc_ZZZ, from which sys.exc_info()
2890 can pick it up. This is the primary task of set_exc_info().
Tim Peters7df5e7f2006-05-26 23:14:37 +00002891 XXX That can't be right: set_exc_info() doesn't look at tstate->curexc_ZZZ.
Guido van Rossumc9fbb722003-03-01 03:36:33 +00002892
2893- Now let me explain the complicated dance with frame->f_exc_ZZZ.
2894
2895 Long ago, when none of this existed, there were just a few globals:
2896 one set corresponding to the "hot" exception, and one set
2897 corresponding to sys.exc_ZZZ. (Actually, the latter weren't C
2898 globals; they were simply stored as sys.exc_ZZZ. For backwards
2899 compatibility, they still are!) The problem was that in code like
2900 this:
2901
2902 try:
2903 "something that may fail"
2904 except "some exception":
2905 "do something else first"
2906 "print the exception from sys.exc_ZZZ."
2907
2908 if "do something else first" invoked something that raised and caught
2909 an exception, sys.exc_ZZZ were overwritten. That was a frequent
2910 cause of subtle bugs. I fixed this by changing the semantics as
2911 follows:
2912
2913 - Within one frame, sys.exc_ZZZ will hold the last exception caught
2914 *in that frame*.
2915
2916 - But initially, and as long as no exception is caught in a given
2917 frame, sys.exc_ZZZ will hold the last exception caught in the
2918 previous frame (or the frame before that, etc.).
2919
2920 The first bullet fixed the bug in the above example. The second
2921 bullet was for backwards compatibility: it was (and is) common to
2922 have a function that is called when an exception is caught, and to
2923 have that function access the caught exception via sys.exc_ZZZ.
2924 (Example: traceback.print_exc()).
2925
2926 At the same time I fixed the problem that sys.exc_ZZZ weren't
2927 thread-safe, by introducing sys.exc_info() which gets it from tstate;
2928 but that's really a separate improvement.
2929
2930 The reset_exc_info() function in ceval.c restores the tstate->exc_ZZZ
2931 variables to what they were before the current frame was called. The
2932 set_exc_info() function saves them on the frame so that
2933 reset_exc_info() can restore them. The invariant is that
2934 frame->f_exc_ZZZ is NULL iff the current frame never caught an
2935 exception (where "catching" an exception applies only to successful
2936 except clauses); and if the current frame ever caught an exception,
2937 frame->f_exc_ZZZ is the exception that was stored in tstate->exc_ZZZ
2938 at the start of the current frame.
2939
2940*/
2941
Fredrik Lundh7a830892006-05-27 10:39:48 +00002942static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002943set_exc_info(PyThreadState *tstate,
2944 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002945{
Tim Peters7df5e7f2006-05-26 23:14:37 +00002946 PyFrameObject *frame = tstate->frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002947 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002948
Tim Peters7df5e7f2006-05-26 23:14:37 +00002949 assert(type != NULL);
2950 assert(frame != NULL);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002951 if (frame->f_exc_type == NULL) {
Tim Peters7df5e7f2006-05-26 23:14:37 +00002952 assert(frame->f_exc_value == NULL);
2953 assert(frame->f_exc_traceback == NULL);
2954 /* This frame didn't catch an exception before. */
2955 /* Save previous exception of this thread in this frame. */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002956 if (tstate->exc_type == NULL) {
Tim Peters7df5e7f2006-05-26 23:14:37 +00002957 /* XXX Why is this set to Py_None? */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002958 Py_INCREF(Py_None);
2959 tstate->exc_type = Py_None;
2960 }
Tim Peters7df5e7f2006-05-26 23:14:37 +00002961 Py_INCREF(tstate->exc_type);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002962 Py_XINCREF(tstate->exc_value);
2963 Py_XINCREF(tstate->exc_traceback);
2964 frame->f_exc_type = tstate->exc_type;
2965 frame->f_exc_value = tstate->exc_value;
2966 frame->f_exc_traceback = tstate->exc_traceback;
2967 }
Tim Peters7df5e7f2006-05-26 23:14:37 +00002968 /* Set new exception for this thread. */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002969 tmp_type = tstate->exc_type;
2970 tmp_value = tstate->exc_value;
2971 tmp_tb = tstate->exc_traceback;
Tim Peters7df5e7f2006-05-26 23:14:37 +00002972 Py_INCREF(type);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002973 Py_XINCREF(value);
2974 Py_XINCREF(tb);
2975 tstate->exc_type = type;
2976 tstate->exc_value = value;
2977 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002978 Py_XDECREF(tmp_type);
2979 Py_XDECREF(tmp_value);
2980 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002981 /* For b/w compatibility */
2982 PySys_SetObject("exc_type", type);
2983 PySys_SetObject("exc_value", value);
2984 PySys_SetObject("exc_traceback", tb);
2985}
2986
Fredrik Lundh7a830892006-05-27 10:39:48 +00002987static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002988reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002989{
2990 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002991 PyObject *tmp_type, *tmp_value, *tmp_tb;
Tim Peters7df5e7f2006-05-26 23:14:37 +00002992
2993 /* It's a precondition that the thread state's frame caught an
2994 * exception -- verify in a debug build.
2995 */
2996 assert(tstate != NULL);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002997 frame = tstate->frame;
Tim Peters7df5e7f2006-05-26 23:14:37 +00002998 assert(frame != NULL);
2999 assert(frame->f_exc_type != NULL);
3000
3001 /* Copy the frame's exception info back to the thread state. */
3002 tmp_type = tstate->exc_type;
3003 tmp_value = tstate->exc_value;
3004 tmp_tb = tstate->exc_traceback;
3005 Py_INCREF(frame->f_exc_type);
3006 Py_XINCREF(frame->f_exc_value);
3007 Py_XINCREF(frame->f_exc_traceback);
3008 tstate->exc_type = frame->f_exc_type;
3009 tstate->exc_value = frame->f_exc_value;
3010 tstate->exc_traceback = frame->f_exc_traceback;
3011 Py_XDECREF(tmp_type);
3012 Py_XDECREF(tmp_value);
3013 Py_XDECREF(tmp_tb);
3014
3015 /* For b/w compatibility */
3016 PySys_SetObject("exc_type", frame->f_exc_type);
3017 PySys_SetObject("exc_value", frame->f_exc_value);
3018 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
3019
3020 /* Clear the frame's exception info. */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00003021 tmp_type = frame->f_exc_type;
3022 tmp_value = frame->f_exc_value;
3023 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003024 frame->f_exc_type = NULL;
3025 frame->f_exc_value = NULL;
3026 frame->f_exc_traceback = NULL;
Tim Peters7df5e7f2006-05-26 23:14:37 +00003027 Py_DECREF(tmp_type);
Guido van Rossumdf4c3081997-05-20 17:06:11 +00003028 Py_XDECREF(tmp_value);
3029 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00003030}
3031
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003032/* Logic for the raise statement (too complicated for inlining).
3033 This *consumes* a reference count to each of its arguments. */
Fredrik Lundh7a830892006-05-27 10:39:48 +00003034static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003035do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003036{
Guido van Rossumd295f121998-04-09 21:39:57 +00003037 if (type == NULL) {
3038 /* Reraise */
Nicholas Bastine5662ae2004-03-24 22:22:12 +00003039 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossumd295f121998-04-09 21:39:57 +00003040 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
3041 value = tstate->exc_value;
3042 tb = tstate->exc_traceback;
3043 Py_XINCREF(type);
3044 Py_XINCREF(value);
3045 Py_XINCREF(tb);
3046 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003047
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003048 /* We support the following forms of raise:
3049 raise <class>, <classinstance>
3050 raise <class>, <argument tuple>
3051 raise <class>, None
3052 raise <class>, <argument>
3053 raise <classinstance>, None
3054 raise <string>, <object>
3055 raise <string>, None
3056
3057 An omitted second argument is the same as None.
3058
3059 In addition, raise <tuple>, <anything> is the same as
3060 raising the tuple's first item (and it better have one!);
3061 this rule is applied recursively.
3062
3063 Finally, an optional third argument can be supplied, which
3064 gives the traceback to be substituted (useful when
3065 re-raising an exception after examining it). */
3066
3067 /* First, check the traceback argument, replacing None with
3068 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00003069 if (tb == Py_None) {
3070 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003071 tb = NULL;
3072 }
3073 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003074 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003075 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003076 goto raise_error;
3077 }
3078
3079 /* Next, replace a missing value with None */
3080 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003081 value = Py_None;
3082 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003083 }
3084
3085 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00003086 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
3087 PyObject *tmp = type;
3088 type = PyTuple_GET_ITEM(type, 0);
3089 Py_INCREF(type);
3090 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003091 }
3092
Brett Cannon129bd522007-01-30 21:34:36 +00003093 if (PyExceptionClass_Check(type))
Barry Warsaw4249f541997-08-22 21:26:19 +00003094 PyErr_NormalizeException(&type, &value, &tb);
3095
Brett Cannonbf364092006-03-01 04:25:17 +00003096 else if (PyExceptionInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003097 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00003098 if (value != Py_None) {
3099 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003100 "instance exception may not have a separate value");
3101 goto raise_error;
3102 }
3103 else {
3104 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00003105 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003106 value = type;
Brett Cannonbf364092006-03-01 04:25:17 +00003107 type = PyExceptionInstance_Class(type);
Guido van Rossumb209a111997-04-29 18:18:01 +00003108 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003109 }
3110 }
3111 else {
3112 /* Not something you can raise. You get an exception
3113 anyway, just not what you specified :-) */
Jeremy Hylton960d9482001-04-27 02:25:33 +00003114 PyErr_Format(PyExc_TypeError,
Brett Cannon129bd522007-01-30 21:34:36 +00003115 "exceptions must be classes or instances, not %s",
Neal Norwitz37aa0662003-01-10 15:31:15 +00003116 type->ob_type->tp_name);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003117 goto raise_error;
3118 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003119 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003120 if (tb == NULL)
3121 return WHY_EXCEPTION;
3122 else
3123 return WHY_RERAISE;
3124 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00003125 Py_XDECREF(value);
3126 Py_XDECREF(type);
3127 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003128 return WHY_EXCEPTION;
3129}
3130
Tim Petersd6d010b2001-06-21 02:49:55 +00003131/* Iterate v argcnt times and store the results on the stack (via decreasing
3132 sp). Return 1 for success, 0 if error. */
3133
Fredrik Lundh7a830892006-05-27 10:39:48 +00003134static int
Tim Petersd6d010b2001-06-21 02:49:55 +00003135unpack_iterable(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00003136{
Tim Petersd6d010b2001-06-21 02:49:55 +00003137 int i = 0;
3138 PyObject *it; /* iter(v) */
Barry Warsawe42b18f1997-08-25 22:13:04 +00003139 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00003140
Tim Petersd6d010b2001-06-21 02:49:55 +00003141 assert(v != NULL);
3142
3143 it = PyObject_GetIter(v);
3144 if (it == NULL)
3145 goto Error;
3146
3147 for (; i < argcnt; i++) {
3148 w = PyIter_Next(it);
3149 if (w == NULL) {
3150 /* Iterator done, via error or exhaustion. */
3151 if (!PyErr_Occurred()) {
3152 PyErr_Format(PyExc_ValueError,
3153 "need more than %d value%s to unpack",
3154 i, i == 1 ? "" : "s");
3155 }
3156 goto Error;
Barry Warsawe42b18f1997-08-25 22:13:04 +00003157 }
3158 *--sp = w;
3159 }
Tim Petersd6d010b2001-06-21 02:49:55 +00003160
3161 /* We better have exhausted the iterator now. */
3162 w = PyIter_Next(it);
3163 if (w == NULL) {
3164 if (PyErr_Occurred())
3165 goto Error;
3166 Py_DECREF(it);
3167 return 1;
Barry Warsawe42b18f1997-08-25 22:13:04 +00003168 }
Guido van Rossumbb8f59a2001-12-03 19:33:25 +00003169 Py_DECREF(w);
Tim Petersd6d010b2001-06-21 02:49:55 +00003170 PyErr_SetString(PyExc_ValueError, "too many values to unpack");
Barry Warsawe42b18f1997-08-25 22:13:04 +00003171 /* fall through */
Tim Petersd6d010b2001-06-21 02:49:55 +00003172Error:
Barry Warsaw91010551997-08-25 22:30:51 +00003173 for (; i > 0; i--, sp++)
3174 Py_DECREF(*sp);
Tim Petersd6d010b2001-06-21 02:49:55 +00003175 Py_XDECREF(it);
Barry Warsawe42b18f1997-08-25 22:13:04 +00003176 return 0;
3177}
3178
3179
Guido van Rossum96a42c81992-01-12 02:29:51 +00003180#ifdef LLTRACE
Fredrik Lundh7a830892006-05-27 10:39:48 +00003181static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003182prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003183{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003184 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00003185 if (PyObject_Print(v, stdout, 0) != 0)
3186 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00003187 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00003188 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003189}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003190#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003191
Fredrik Lundh7a830892006-05-27 10:39:48 +00003192static void
Fred Drake5755ce62001-06-27 19:19:46 +00003193call_exc_trace(Py_tracefunc func, PyObject *self, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003194{
Guido van Rossumb209a111997-04-29 18:18:01 +00003195 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003196 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00003197 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00003198 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003199 value = Py_None;
3200 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00003201 }
Raymond Hettinger8ae46892003-10-12 19:09:37 +00003202 arg = PyTuple_Pack(3, type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003203 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003204 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003205 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003206 }
Fred Drake5755ce62001-06-27 19:19:46 +00003207 err = call_trace(func, self, f, PyTrace_EXCEPTION, arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00003208 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003209 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00003210 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003211 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00003212 Py_XDECREF(type);
3213 Py_XDECREF(value);
3214 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003215 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003216}
3217
Amaury Forgeot d'Arc0d75f092007-11-13 21:54:28 +00003218static int
Fred Drake4ec5d562001-10-04 19:26:43 +00003219call_trace_protected(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003220 int what, PyObject *arg)
Fred Drake4ec5d562001-10-04 19:26:43 +00003221{
3222 PyObject *type, *value, *traceback;
3223 int err;
3224 PyErr_Fetch(&type, &value, &traceback);
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003225 err = call_trace(func, obj, frame, what, arg);
Fred Drake4ec5d562001-10-04 19:26:43 +00003226 if (err == 0)
Amaury Forgeot d'Arc0d75f092007-11-13 21:54:28 +00003227 {
Fred Drake4ec5d562001-10-04 19:26:43 +00003228 PyErr_Restore(type, value, traceback);
Amaury Forgeot d'Arc0d75f092007-11-13 21:54:28 +00003229 return 0;
3230 }
Fred Drake4ec5d562001-10-04 19:26:43 +00003231 else {
3232 Py_XDECREF(type);
3233 Py_XDECREF(value);
3234 Py_XDECREF(traceback);
Amaury Forgeot d'Arc0d75f092007-11-13 21:54:28 +00003235 return -1;
Fred Drake4ec5d562001-10-04 19:26:43 +00003236 }
3237}
3238
Fredrik Lundh7a830892006-05-27 10:39:48 +00003239static int
Fred Drake5755ce62001-06-27 19:19:46 +00003240call_trace(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
3241 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00003242{
Fred Drake5755ce62001-06-27 19:19:46 +00003243 register PyThreadState *tstate = frame->f_tstate;
3244 int result;
3245 if (tstate->tracing)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003246 return 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003247 tstate->tracing++;
Fred Drake9e3ad782001-07-03 23:39:52 +00003248 tstate->use_tracing = 0;
Fred Drake5755ce62001-06-27 19:19:46 +00003249 result = func(obj, frame, what, arg);
Fred Drake9e3ad782001-07-03 23:39:52 +00003250 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
3251 || (tstate->c_profilefunc != NULL));
Guido van Rossuma027efa1997-05-05 20:56:21 +00003252 tstate->tracing--;
Fred Drake5755ce62001-06-27 19:19:46 +00003253 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00003254}
3255
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00003256PyObject *
3257_PyEval_CallTracing(PyObject *func, PyObject *args)
3258{
3259 PyFrameObject *frame = PyEval_GetFrame();
3260 PyThreadState *tstate = frame->f_tstate;
3261 int save_tracing = tstate->tracing;
3262 int save_use_tracing = tstate->use_tracing;
3263 PyObject *result;
3264
3265 tstate->tracing = 0;
3266 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
3267 || (tstate->c_profilefunc != NULL));
3268 result = PyObject_Call(func, args, NULL);
3269 tstate->tracing = save_tracing;
3270 tstate->use_tracing = save_use_tracing;
3271 return result;
3272}
3273
Fredrik Lundh7a830892006-05-27 10:39:48 +00003274static int
Tim Peters8a5c3c72004-04-05 19:36:21 +00003275maybe_call_line_trace(Py_tracefunc func, PyObject *obj,
Armin Rigobf57a142004-03-22 19:24:58 +00003276 PyFrameObject *frame, int *instr_lb, int *instr_ub,
3277 int *instr_prev)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003278{
Michael W. Hudson006c7522002-11-08 13:08:46 +00003279 int result = 0;
3280
Jeremy Hyltona4ebc132006-04-18 14:47:00 +00003281 /* If the last instruction executed isn't in the current
3282 instruction window, reset the window. If the last
3283 instruction happens to fall at the start of a line or if it
3284 represents a jump backwards, call the trace function.
3285 */
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00003286 if ((frame->f_lasti < *instr_lb || frame->f_lasti >= *instr_ub)) {
Thomas Woutersae406c62007-09-19 17:27:43 +00003287 int line;
3288 PyAddrPair bounds;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003289
Thomas Woutersae406c62007-09-19 17:27:43 +00003290 line = PyCode_CheckLineNumber(frame->f_code, frame->f_lasti,
3291 &bounds);
3292 if (line >= 0) {
Michael W. Hudson02ff6a92002-09-11 15:36:32 +00003293 frame->f_lineno = line;
Tim Peters8a5c3c72004-04-05 19:36:21 +00003294 result = call_trace(func, obj, frame,
Michael W. Hudson006c7522002-11-08 13:08:46 +00003295 PyTrace_LINE, Py_None);
Thomas Woutersae406c62007-09-19 17:27:43 +00003296 }
3297 *instr_lb = bounds.ap_lower;
3298 *instr_ub = bounds.ap_upper;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003299 }
Armin Rigobf57a142004-03-22 19:24:58 +00003300 else if (frame->f_lasti <= *instr_prev) {
Jeremy Hyltona4ebc132006-04-18 14:47:00 +00003301 result = call_trace(func, obj, frame, PyTrace_LINE, Py_None);
Armin Rigobf57a142004-03-22 19:24:58 +00003302 }
3303 *instr_prev = frame->f_lasti;
Michael W. Hudson006c7522002-11-08 13:08:46 +00003304 return result;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003305}
3306
Fred Drake5755ce62001-06-27 19:19:46 +00003307void
3308PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00003309{
Nicholas Bastine5662ae2004-03-24 22:22:12 +00003310 PyThreadState *tstate = PyThreadState_GET();
Fred Drake5755ce62001-06-27 19:19:46 +00003311 PyObject *temp = tstate->c_profileobj;
3312 Py_XINCREF(arg);
3313 tstate->c_profilefunc = NULL;
3314 tstate->c_profileobj = NULL;
Brett Cannon55fa66d2005-06-25 07:07:35 +00003315 /* Must make sure that tracing is not ignored if 'temp' is freed */
Fred Drake9e3ad782001-07-03 23:39:52 +00003316 tstate->use_tracing = tstate->c_tracefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00003317 Py_XDECREF(temp);
3318 tstate->c_profilefunc = func;
3319 tstate->c_profileobj = arg;
Brett Cannon55fa66d2005-06-25 07:07:35 +00003320 /* Flag that tracing or profiling is turned on */
Fred Drake9e3ad782001-07-03 23:39:52 +00003321 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
Fred Drake5755ce62001-06-27 19:19:46 +00003322}
3323
3324void
3325PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
3326{
Nicholas Bastine5662ae2004-03-24 22:22:12 +00003327 PyThreadState *tstate = PyThreadState_GET();
Fred Drake5755ce62001-06-27 19:19:46 +00003328 PyObject *temp = tstate->c_traceobj;
3329 Py_XINCREF(arg);
3330 tstate->c_tracefunc = NULL;
3331 tstate->c_traceobj = NULL;
Brett Cannon55fa66d2005-06-25 07:07:35 +00003332 /* Must make sure that profiling is not ignored if 'temp' is freed */
Fred Drake9e3ad782001-07-03 23:39:52 +00003333 tstate->use_tracing = tstate->c_profilefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00003334 Py_XDECREF(temp);
3335 tstate->c_tracefunc = func;
3336 tstate->c_traceobj = arg;
Brett Cannon55fa66d2005-06-25 07:07:35 +00003337 /* Flag that tracing or profiling is turned on */
Fred Drake9e3ad782001-07-03 23:39:52 +00003338 tstate->use_tracing = ((func != NULL)
3339 || (tstate->c_profilefunc != NULL));
Fred Draked0838392001-06-16 21:02:31 +00003340}
3341
Guido van Rossumb209a111997-04-29 18:18:01 +00003342PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003343PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00003344{
Guido van Rossum6297a7a2003-02-19 15:53:17 +00003345 PyFrameObject *current_frame = PyEval_GetFrame();
Guido van Rossum6135a871995-01-09 17:53:26 +00003346 if (current_frame == NULL)
Nicholas Bastine5662ae2004-03-24 22:22:12 +00003347 return PyThreadState_GET()->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00003348 else
3349 return current_frame->f_builtins;
3350}
3351
Guido van Rossumb209a111997-04-29 18:18:01 +00003352PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003353PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00003354{
Guido van Rossum6297a7a2003-02-19 15:53:17 +00003355 PyFrameObject *current_frame = PyEval_GetFrame();
Guido van Rossum5b722181993-03-30 17:46:03 +00003356 if (current_frame == NULL)
3357 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00003358 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00003359 return current_frame->f_locals;
3360}
3361
Guido van Rossumb209a111997-04-29 18:18:01 +00003362PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003363PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003364{
Guido van Rossum6297a7a2003-02-19 15:53:17 +00003365 PyFrameObject *current_frame = PyEval_GetFrame();
Guido van Rossum3f5da241990-12-20 15:06:42 +00003366 if (current_frame == NULL)
3367 return NULL;
3368 else
3369 return current_frame->f_globals;
3370}
3371
Guido van Rossum6297a7a2003-02-19 15:53:17 +00003372PyFrameObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003373PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00003374{
Nicholas Bastine5662ae2004-03-24 22:22:12 +00003375 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossum6297a7a2003-02-19 15:53:17 +00003376 return _PyThreadState_GetFrame(tstate);
Guido van Rossume59214e1994-08-30 08:01:59 +00003377}
3378
Guido van Rossum6135a871995-01-09 17:53:26 +00003379int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003380PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00003381{
Guido van Rossum6297a7a2003-02-19 15:53:17 +00003382 PyFrameObject *current_frame = PyEval_GetFrame();
Neal Norwitzb9845e72006-06-12 02:11:18 +00003383 return current_frame == NULL ? 0 : PyFrame_IsRestricted(current_frame);
Guido van Rossum6135a871995-01-09 17:53:26 +00003384}
3385
Guido van Rossumbe270261997-05-22 22:26:18 +00003386int
Tim Peters5ba58662001-07-16 02:29:45 +00003387PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
Jeremy Hylton061d1062001-03-22 02:32:48 +00003388{
Guido van Rossum6297a7a2003-02-19 15:53:17 +00003389 PyFrameObject *current_frame = PyEval_GetFrame();
Just van Rossum3aaf42c2003-02-10 08:21:10 +00003390 int result = cf->cf_flags != 0;
Tim Peters5ba58662001-07-16 02:29:45 +00003391
3392 if (current_frame != NULL) {
3393 const int codeflags = current_frame->f_code->co_flags;
Tim Peterse2c18e92001-08-17 20:47:47 +00003394 const int compilerflags = codeflags & PyCF_MASK;
3395 if (compilerflags) {
Tim Peters5ba58662001-07-16 02:29:45 +00003396 result = 1;
Tim Peterse2c18e92001-08-17 20:47:47 +00003397 cf->cf_flags |= compilerflags;
Tim Peters5ba58662001-07-16 02:29:45 +00003398 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00003399#if 0 /* future keyword */
Martin v. Löwis7198a522002-01-01 19:59:11 +00003400 if (codeflags & CO_GENERATOR_ALLOWED) {
3401 result = 1;
3402 cf->cf_flags |= CO_GENERATOR_ALLOWED;
3403 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00003404#endif
Tim Peters5ba58662001-07-16 02:29:45 +00003405 }
3406 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00003407}
3408
3409int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003410Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003411{
Guido van Rossumb209a111997-04-29 18:18:01 +00003412 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00003413 if (f == NULL)
3414 return 0;
3415 if (!PyFile_SoftSpace(f, 0))
3416 return 0;
3417 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003418}
3419
Guido van Rossum3f5da241990-12-20 15:06:42 +00003420
Guido van Rossum681d79a1995-07-18 14:51:37 +00003421/* External interface to call any callable object.
3422 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003423
Guido van Rossumd7ed6831997-08-30 15:02:50 +00003424#undef PyEval_CallObject
3425/* for backward compatibility: export this interface */
3426
Guido van Rossumb209a111997-04-29 18:18:01 +00003427PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003428PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003429{
Guido van Rossumb209a111997-04-29 18:18:01 +00003430 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003431}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00003432#define PyEval_CallObject(func,arg) \
3433 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00003434
Guido van Rossumb209a111997-04-29 18:18:01 +00003435PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003436PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003437{
Jeremy Hylton52820442001-01-03 23:52:36 +00003438 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003439
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00003440 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003441 arg = PyTuple_New(0);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00003442 if (arg == NULL)
3443 return NULL;
3444 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003445 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003446 PyErr_SetString(PyExc_TypeError,
3447 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00003448 return NULL;
3449 }
3450 else
Guido van Rossumb209a111997-04-29 18:18:01 +00003451 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003452
Guido van Rossumb209a111997-04-29 18:18:01 +00003453 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003454 PyErr_SetString(PyExc_TypeError,
3455 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00003456 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00003457 return NULL;
3458 }
3459
Tim Peters6d6c1a32001-08-02 04:15:00 +00003460 result = PyObject_Call(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00003461 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00003462 return result;
3463}
3464
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00003465const char *
Tim Peters6d6c1a32001-08-02 04:15:00 +00003466PyEval_GetFuncName(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003467{
3468 if (PyMethod_Check(func))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003469 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003470 else if (PyFunction_Check(func))
3471 return PyString_AsString(((PyFunctionObject*)func)->func_name);
3472 else if (PyCFunction_Check(func))
3473 return ((PyCFunctionObject*)func)->m_ml->ml_name;
3474 else if (PyClass_Check(func))
3475 return PyString_AsString(((PyClassObject*)func)->cl_name);
3476 else if (PyInstance_Check(func)) {
3477 return PyString_AsString(
3478 ((PyInstanceObject*)func)->in_class->cl_name);
3479 } else {
3480 return func->ob_type->tp_name;
3481 }
3482}
3483
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00003484const char *
Tim Peters6d6c1a32001-08-02 04:15:00 +00003485PyEval_GetFuncDesc(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003486{
3487 if (PyMethod_Check(func))
3488 return "()";
3489 else if (PyFunction_Check(func))
3490 return "()";
3491 else if (PyCFunction_Check(func))
3492 return "()";
3493 else if (PyClass_Check(func))
3494 return " constructor";
3495 else if (PyInstance_Check(func)) {
3496 return " instance";
3497 } else {
3498 return " object";
3499 }
3500}
3501
Fredrik Lundh7a830892006-05-27 10:39:48 +00003502static void
Jeremy Hylton192690e2002-08-16 18:36:11 +00003503err_args(PyObject *func, int flags, int nargs)
3504{
3505 if (flags & METH_NOARGS)
Tim Peters8a5c3c72004-04-05 19:36:21 +00003506 PyErr_Format(PyExc_TypeError,
Guido van Rossum86c659a2002-08-23 14:11:35 +00003507 "%.200s() takes no arguments (%d given)",
Tim Peters8a5c3c72004-04-05 19:36:21 +00003508 ((PyCFunctionObject *)func)->m_ml->ml_name,
Jeremy Hylton192690e2002-08-16 18:36:11 +00003509 nargs);
3510 else
Tim Peters8a5c3c72004-04-05 19:36:21 +00003511 PyErr_Format(PyExc_TypeError,
Guido van Rossum86c659a2002-08-23 14:11:35 +00003512 "%.200s() takes exactly one argument (%d given)",
Tim Peters8a5c3c72004-04-05 19:36:21 +00003513 ((PyCFunctionObject *)func)->m_ml->ml_name,
Jeremy Hylton192690e2002-08-16 18:36:11 +00003514 nargs);
3515}
3516
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003517#define C_TRACE(x, call) \
Nicholas Bastind858a772004-06-25 23:31:06 +00003518if (tstate->use_tracing && tstate->c_profilefunc) { \
3519 if (call_trace(tstate->c_profilefunc, \
3520 tstate->c_profileobj, \
3521 tstate->frame, PyTrace_C_CALL, \
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003522 func)) { \
3523 x = NULL; \
3524 } \
3525 else { \
3526 x = call; \
3527 if (tstate->c_profilefunc != NULL) { \
3528 if (x == NULL) { \
3529 call_trace_protected(tstate->c_profilefunc, \
3530 tstate->c_profileobj, \
3531 tstate->frame, PyTrace_C_EXCEPTION, \
3532 func); \
3533 /* XXX should pass (type, value, tb) */ \
3534 } else { \
3535 if (call_trace(tstate->c_profilefunc, \
3536 tstate->c_profileobj, \
3537 tstate->frame, PyTrace_C_RETURN, \
3538 func)) { \
3539 Py_DECREF(x); \
3540 x = NULL; \
3541 } \
3542 } \
Nicholas Bastinc69ebe82004-03-24 21:57:10 +00003543 } \
Nicholas Bastind858a772004-06-25 23:31:06 +00003544 } \
3545} else { \
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003546 x = call; \
Nicholas Bastinc69ebe82004-03-24 21:57:10 +00003547 }
3548
Fredrik Lundh7a830892006-05-27 10:39:48 +00003549static PyObject *
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00003550call_function(PyObject ***pp_stack, int oparg
3551#ifdef WITH_TSC
3552 , uint64* pintr0, uint64* pintr1
3553#endif
3554 )
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003555{
3556 int na = oparg & 0xff;
3557 int nk = (oparg>>8) & 0xff;
3558 int n = na + 2 * nk;
3559 PyObject **pfunc = (*pp_stack) - n - 1;
3560 PyObject *func = *pfunc;
3561 PyObject *x, *w;
3562
Jeremy Hylton985eba52003-02-05 23:13:00 +00003563 /* Always dispatch PyCFunction first, because these are
3564 presumed to be the most frequent callable object.
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003565 */
3566 if (PyCFunction_Check(func) && nk == 0) {
3567 int flags = PyCFunction_GET_FLAGS(func);
Nicholas Bastind858a772004-06-25 23:31:06 +00003568 PyThreadState *tstate = PyThreadState_GET();
Raymond Hettingera7f56bc2004-06-26 04:34:33 +00003569
3570 PCALL(PCALL_CFUNCTION);
Jeremy Hylton192690e2002-08-16 18:36:11 +00003571 if (flags & (METH_NOARGS | METH_O)) {
3572 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3573 PyObject *self = PyCFunction_GET_SELF(func);
Nicholas Bastinc69ebe82004-03-24 21:57:10 +00003574 if (flags & METH_NOARGS && na == 0) {
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003575 C_TRACE(x, (*meth)(self,NULL));
Nicholas Bastinc69ebe82004-03-24 21:57:10 +00003576 }
Jeremy Hylton192690e2002-08-16 18:36:11 +00003577 else if (flags & METH_O && na == 1) {
3578 PyObject *arg = EXT_POP(*pp_stack);
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003579 C_TRACE(x, (*meth)(self,arg));
Jeremy Hylton192690e2002-08-16 18:36:11 +00003580 Py_DECREF(arg);
3581 }
3582 else {
3583 err_args(func, flags, na);
3584 x = NULL;
3585 }
3586 }
3587 else {
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003588 PyObject *callargs;
3589 callargs = load_args(pp_stack, na);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00003590 READ_TIMESTAMP(*pintr0);
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003591 C_TRACE(x, PyCFunction_Call(func,callargs,NULL));
Michael W. Hudson75eabd22005-01-18 15:56:11 +00003592 READ_TIMESTAMP(*pintr1);
Tim Peters8a5c3c72004-04-05 19:36:21 +00003593 Py_XDECREF(callargs);
3594 }
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003595 } else {
3596 if (PyMethod_Check(func) && PyMethod_GET_SELF(func) != NULL) {
3597 /* optimize access to bound methods */
3598 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton985eba52003-02-05 23:13:00 +00003599 PCALL(PCALL_METHOD);
3600 PCALL(PCALL_BOUND_METHOD);
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003601 Py_INCREF(self);
3602 func = PyMethod_GET_FUNCTION(func);
3603 Py_INCREF(func);
3604 Py_DECREF(*pfunc);
3605 *pfunc = self;
3606 na++;
3607 n++;
3608 } else
3609 Py_INCREF(func);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00003610 READ_TIMESTAMP(*pintr0);
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003611 if (PyFunction_Check(func))
3612 x = fast_function(func, pp_stack, n, na, nk);
Tim Peters8a5c3c72004-04-05 19:36:21 +00003613 else
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003614 x = do_call(func, pp_stack, na, nk);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00003615 READ_TIMESTAMP(*pintr1);
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003616 Py_DECREF(func);
3617 }
Tim Peters8a5c3c72004-04-05 19:36:21 +00003618
Armin Rigod34fa522006-03-28 19:10:40 +00003619 /* Clear the stack of the function object. Also removes
3620 the arguments in case they weren't consumed already
3621 (fast_function() and err_args() leave them on the stack).
Thomas Wouters7f597322006-03-01 05:32:33 +00003622 */
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003623 while ((*pp_stack) > pfunc) {
3624 w = EXT_POP(*pp_stack);
3625 Py_DECREF(w);
Jeremy Hylton985eba52003-02-05 23:13:00 +00003626 PCALL(PCALL_POP);
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003627 }
3628 return x;
3629}
3630
Jeremy Hylton192690e2002-08-16 18:36:11 +00003631/* The fast_function() function optimize calls for which no argument
Jeremy Hylton52820442001-01-03 23:52:36 +00003632 tuple is necessary; the objects are passed directly from the stack.
Jeremy Hylton985eba52003-02-05 23:13:00 +00003633 For the simplest case -- a function that takes only positional
3634 arguments and is called with only positional arguments -- it
3635 inlines the most primitive frame setup code from
3636 PyEval_EvalCodeEx(), which vastly reduces the checks that must be
3637 done before evaluating the frame.
Jeremy Hylton52820442001-01-03 23:52:36 +00003638*/
3639
Fredrik Lundh7a830892006-05-27 10:39:48 +00003640static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00003641fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00003642{
Jeremy Hylton985eba52003-02-05 23:13:00 +00003643 PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003644 PyObject *globals = PyFunction_GET_GLOBALS(func);
3645 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
3646 PyObject **d = NULL;
3647 int nd = 0;
3648
Jeremy Hylton985eba52003-02-05 23:13:00 +00003649 PCALL(PCALL_FUNCTION);
3650 PCALL(PCALL_FAST_FUNCTION);
Raymond Hettinger40174c32003-05-31 07:04:16 +00003651 if (argdefs == NULL && co->co_argcount == n && nk==0 &&
Jeremy Hylton985eba52003-02-05 23:13:00 +00003652 co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) {
3653 PyFrameObject *f;
3654 PyObject *retval = NULL;
3655 PyThreadState *tstate = PyThreadState_GET();
3656 PyObject **fastlocals, **stack;
3657 int i;
3658
3659 PCALL(PCALL_FASTER_FUNCTION);
3660 assert(globals != NULL);
3661 /* XXX Perhaps we should create a specialized
3662 PyFrame_New() that doesn't take locals, but does
3663 take builtins without sanity checking them.
3664 */
Neal Norwitzdf6a6492006-08-13 18:10:10 +00003665 assert(tstate != NULL);
Jeremy Hylton985eba52003-02-05 23:13:00 +00003666 f = PyFrame_New(tstate, co, globals, NULL);
3667 if (f == NULL)
3668 return NULL;
3669
3670 fastlocals = f->f_localsplus;
3671 stack = (*pp_stack) - n;
3672
3673 for (i = 0; i < n; i++) {
3674 Py_INCREF(*stack);
3675 fastlocals[i] = *stack++;
3676 }
Phillip J. Eby0d6615f2005-08-02 00:46:46 +00003677 retval = PyEval_EvalFrameEx(f,0);
Jeremy Hylton985eba52003-02-05 23:13:00 +00003678 ++tstate->recursion_depth;
3679 Py_DECREF(f);
3680 --tstate->recursion_depth;
3681 return retval;
3682 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003683 if (argdefs != NULL) {
3684 d = &PyTuple_GET_ITEM(argdefs, 0);
Martin v. Löwis68192102007-07-21 06:55:02 +00003685 nd = Py_Size(argdefs);
Jeremy Hylton52820442001-01-03 23:52:36 +00003686 }
Jeremy Hylton985eba52003-02-05 23:13:00 +00003687 return PyEval_EvalCodeEx(co, globals,
3688 (PyObject *)NULL, (*pp_stack)-n, na,
3689 (*pp_stack)-2*nk, nk, d, nd,
3690 PyFunction_GET_CLOSURE(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00003691}
3692
Fredrik Lundh7a830892006-05-27 10:39:48 +00003693static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00003694update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
3695 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00003696{
3697 PyObject *kwdict = NULL;
3698 if (orig_kwdict == NULL)
3699 kwdict = PyDict_New();
3700 else {
3701 kwdict = PyDict_Copy(orig_kwdict);
3702 Py_DECREF(orig_kwdict);
3703 }
3704 if (kwdict == NULL)
3705 return NULL;
Raymond Hettinger5bed4562004-04-10 23:34:17 +00003706 while (--nk >= 0) {
Jeremy Hylton52820442001-01-03 23:52:36 +00003707 int err;
3708 PyObject *value = EXT_POP(*pp_stack);
3709 PyObject *key = EXT_POP(*pp_stack);
3710 if (PyDict_GetItem(kwdict, key) != NULL) {
Thomas Woutersae406c62007-09-19 17:27:43 +00003711 PyErr_Format(PyExc_TypeError,
3712 "%.200s%s got multiple values "
3713 "for keyword argument '%.200s'",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003714 PyEval_GetFuncName(func),
3715 PyEval_GetFuncDesc(func),
Jeremy Hylton512a2372001-04-11 13:52:29 +00003716 PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00003717 Py_DECREF(key);
3718 Py_DECREF(value);
3719 Py_DECREF(kwdict);
3720 return NULL;
3721 }
3722 err = PyDict_SetItem(kwdict, key, value);
3723 Py_DECREF(key);
3724 Py_DECREF(value);
3725 if (err) {
3726 Py_DECREF(kwdict);
3727 return NULL;
3728 }
3729 }
3730 return kwdict;
3731}
3732
Fredrik Lundh7a830892006-05-27 10:39:48 +00003733static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00003734update_star_args(int nstack, int nstar, PyObject *stararg,
3735 PyObject ***pp_stack)
3736{
3737 PyObject *callargs, *w;
3738
3739 callargs = PyTuple_New(nstack + nstar);
3740 if (callargs == NULL) {
3741 return NULL;
3742 }
3743 if (nstar) {
3744 int i;
3745 for (i = 0; i < nstar; i++) {
3746 PyObject *a = PyTuple_GET_ITEM(stararg, i);
3747 Py_INCREF(a);
3748 PyTuple_SET_ITEM(callargs, nstack + i, a);
3749 }
3750 }
Raymond Hettinger5bed4562004-04-10 23:34:17 +00003751 while (--nstack >= 0) {
Jeremy Hylton52820442001-01-03 23:52:36 +00003752 w = EXT_POP(*pp_stack);
3753 PyTuple_SET_ITEM(callargs, nstack, w);
3754 }
3755 return callargs;
3756}
3757
Fredrik Lundh7a830892006-05-27 10:39:48 +00003758static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00003759load_args(PyObject ***pp_stack, int na)
3760{
3761 PyObject *args = PyTuple_New(na);
3762 PyObject *w;
3763
3764 if (args == NULL)
3765 return NULL;
Raymond Hettinger5bed4562004-04-10 23:34:17 +00003766 while (--na >= 0) {
Jeremy Hylton52820442001-01-03 23:52:36 +00003767 w = EXT_POP(*pp_stack);
3768 PyTuple_SET_ITEM(args, na, w);
3769 }
3770 return args;
3771}
3772
Fredrik Lundh7a830892006-05-27 10:39:48 +00003773static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00003774do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
3775{
3776 PyObject *callargs = NULL;
3777 PyObject *kwdict = NULL;
3778 PyObject *result = NULL;
3779
3780 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003781 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003782 if (kwdict == NULL)
3783 goto call_fail;
3784 }
3785 callargs = load_args(pp_stack, na);
3786 if (callargs == NULL)
3787 goto call_fail;
Jeremy Hylton985eba52003-02-05 23:13:00 +00003788#ifdef CALL_PROFILE
3789 /* At this point, we have to look at the type of func to
3790 update the call stats properly. Do it here so as to avoid
3791 exposing the call stats machinery outside ceval.c
3792 */
3793 if (PyFunction_Check(func))
3794 PCALL(PCALL_FUNCTION);
3795 else if (PyMethod_Check(func))
3796 PCALL(PCALL_METHOD);
3797 else if (PyType_Check(func))
3798 PCALL(PCALL_TYPE);
3799 else
3800 PCALL(PCALL_OTHER);
3801#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +00003802 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003803 call_fail:
3804 Py_XDECREF(callargs);
3805 Py_XDECREF(kwdict);
3806 return result;
3807}
3808
Fredrik Lundh7a830892006-05-27 10:39:48 +00003809static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00003810ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3811{
3812 int nstar = 0;
3813 PyObject *callargs = NULL;
3814 PyObject *stararg = NULL;
3815 PyObject *kwdict = NULL;
3816 PyObject *result = NULL;
3817
3818 if (flags & CALL_FLAG_KW) {
3819 kwdict = EXT_POP(*pp_stack);
Georg Brandl2134e752007-05-21 20:34:16 +00003820 if (!PyDict_Check(kwdict)) {
3821 PyObject *d;
3822 d = PyDict_New();
3823 if (d == NULL)
3824 goto ext_call_fail;
3825 if (PyDict_Update(d, kwdict) != 0) {
3826 Py_DECREF(d);
3827 /* PyDict_Update raises attribute
3828 * error (percolated from an attempt
3829 * to get 'keys' attribute) instead of
3830 * a type error if its second argument
3831 * is not a mapping.
3832 */
3833 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
3834 PyErr_Format(PyExc_TypeError,
3835 "%.200s%.200s argument after ** "
3836 "must be a mapping, not %.200s",
3837 PyEval_GetFuncName(func),
3838 PyEval_GetFuncDesc(func),
3839 kwdict->ob_type->tp_name);
3840 }
3841 goto ext_call_fail;
3842 }
3843 Py_DECREF(kwdict);
3844 kwdict = d;
Jeremy Hylton52820442001-01-03 23:52:36 +00003845 }
3846 }
3847 if (flags & CALL_FLAG_VAR) {
3848 stararg = EXT_POP(*pp_stack);
3849 if (!PyTuple_Check(stararg)) {
3850 PyObject *t = NULL;
3851 t = PySequence_Tuple(stararg);
3852 if (t == NULL) {
Jeremy Hylton512a2372001-04-11 13:52:29 +00003853 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
3854 PyErr_Format(PyExc_TypeError,
Georg Brandl2134e752007-05-21 20:34:16 +00003855 "%.200s%.200s argument after * "
3856 "must be a sequence, not %200s",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003857 PyEval_GetFuncName(func),
Georg Brandl2134e752007-05-21 20:34:16 +00003858 PyEval_GetFuncDesc(func),
3859 stararg->ob_type->tp_name);
Jeremy Hylton512a2372001-04-11 13:52:29 +00003860 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003861 goto ext_call_fail;
3862 }
3863 Py_DECREF(stararg);
3864 stararg = t;
3865 }
3866 nstar = PyTuple_GET_SIZE(stararg);
3867 }
3868 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003869 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003870 if (kwdict == NULL)
3871 goto ext_call_fail;
3872 }
3873 callargs = update_star_args(na, nstar, stararg, pp_stack);
3874 if (callargs == NULL)
3875 goto ext_call_fail;
Jeremy Hylton985eba52003-02-05 23:13:00 +00003876#ifdef CALL_PROFILE
3877 /* At this point, we have to look at the type of func to
3878 update the call stats properly. Do it here so as to avoid
3879 exposing the call stats machinery outside ceval.c
3880 */
3881 if (PyFunction_Check(func))
3882 PCALL(PCALL_FUNCTION);
3883 else if (PyMethod_Check(func))
3884 PCALL(PCALL_METHOD);
3885 else if (PyType_Check(func))
3886 PCALL(PCALL_TYPE);
3887 else
3888 PCALL(PCALL_OTHER);
3889#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +00003890 result = PyObject_Call(func, callargs, kwdict);
Thomas Woutersae406c62007-09-19 17:27:43 +00003891ext_call_fail:
Jeremy Hylton52820442001-01-03 23:52:36 +00003892 Py_XDECREF(callargs);
3893 Py_XDECREF(kwdict);
3894 Py_XDECREF(stararg);
3895 return result;
3896}
3897
Guido van Rossum38fff8c2006-03-07 18:50:55 +00003898/* Extract a slice index from a PyInt or PyLong or an object with the
3899 nb_index slot defined, and store in *pi.
3900 Silently reduce values larger than PY_SSIZE_T_MAX to PY_SSIZE_T_MAX,
3901 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 +00003902 Return 0 on error, 1 on success.
Tim Peterscb479e72001-12-16 19:11:44 +00003903*/
Tim Petersb5196382001-12-16 19:44:20 +00003904/* Note: If v is NULL, return success without storing into *pi. This
3905 is because_PyEval_SliceIndex() is called by apply_slice(), which can be
3906 called by the SLICE opcode with v and/or w equal to NULL.
Tim Peterscb479e72001-12-16 19:11:44 +00003907*/
Guido van Rossum20c6add2000-05-08 14:06:50 +00003908int
Martin v. Löwis18e16552006-02-15 17:27:45 +00003909_PyEval_SliceIndex(PyObject *v, Py_ssize_t *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003910{
Tim Petersb5196382001-12-16 19:44:20 +00003911 if (v != NULL) {
Martin v. Löwisdde99d22006-02-17 15:57:41 +00003912 Py_ssize_t x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003913 if (PyInt_Check(v)) {
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00003914 /* XXX(nnorwitz): I think PyInt_AS_LONG is correct,
3915 however, it looks like it should be AsSsize_t.
3916 There should be a comment here explaining why.
3917 */
3918 x = PyInt_AS_LONG(v);
Tim Peters7df5e7f2006-05-26 23:14:37 +00003919 }
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00003920 else if (PyIndex_Check(v)) {
3921 x = PyNumber_AsSsize_t(v, NULL);
Guido van Rossum38fff8c2006-03-07 18:50:55 +00003922 if (x == -1 && PyErr_Occurred())
3923 return 0;
3924 }
3925 else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003926 PyErr_SetString(PyExc_TypeError,
Guido van Rossum38fff8c2006-03-07 18:50:55 +00003927 "slice indices must be integers or "
3928 "None or have an __index__ method");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003929 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003930 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003931 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003932 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003933 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003934}
3935
Guido van Rossum38fff8c2006-03-07 18:50:55 +00003936#undef ISINDEX
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00003937#define ISINDEX(x) ((x) == NULL || \
3938 PyInt_Check(x) || PyLong_Check(x) || PyIndex_Check(x))
Guido van Rossum50d756e2001-08-18 17:43:36 +00003939
Fredrik Lundh7a830892006-05-27 10:39:48 +00003940static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003941apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003942{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003943 PyTypeObject *tp = u->ob_type;
3944 PySequenceMethods *sq = tp->tp_as_sequence;
3945
Guido van Rossum38fff8c2006-03-07 18:50:55 +00003946 if (sq && sq->sq_slice && ISINDEX(v) && ISINDEX(w)) {
Martin v. Löwisdde99d22006-02-17 15:57:41 +00003947 Py_ssize_t ilow = 0, ihigh = PY_SSIZE_T_MAX;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003948 if (!_PyEval_SliceIndex(v, &ilow))
3949 return NULL;
3950 if (!_PyEval_SliceIndex(w, &ihigh))
3951 return NULL;
3952 return PySequence_GetSlice(u, ilow, ihigh);
3953 }
3954 else {
3955 PyObject *slice = PySlice_New(v, w, NULL);
Guido van Rossum354797c2001-12-03 19:45:06 +00003956 if (slice != NULL) {
3957 PyObject *res = PyObject_GetItem(u, slice);
3958 Py_DECREF(slice);
3959 return res;
3960 }
Guido van Rossum50d756e2001-08-18 17:43:36 +00003961 else
3962 return NULL;
3963 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003964}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003965
Fredrik Lundh7a830892006-05-27 10:39:48 +00003966static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003967assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3968 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003969{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003970 PyTypeObject *tp = u->ob_type;
3971 PySequenceMethods *sq = tp->tp_as_sequence;
3972
Georg Brandl0fca97a2007-03-05 22:28:08 +00003973 if (sq && sq->sq_ass_slice && ISINDEX(v) && ISINDEX(w)) {
Martin v. Löwisdde99d22006-02-17 15:57:41 +00003974 Py_ssize_t ilow = 0, ihigh = PY_SSIZE_T_MAX;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003975 if (!_PyEval_SliceIndex(v, &ilow))
3976 return -1;
3977 if (!_PyEval_SliceIndex(w, &ihigh))
3978 return -1;
3979 if (x == NULL)
3980 return PySequence_DelSlice(u, ilow, ihigh);
3981 else
3982 return PySequence_SetSlice(u, ilow, ihigh, x);
3983 }
3984 else {
3985 PyObject *slice = PySlice_New(v, w, NULL);
3986 if (slice != NULL) {
Guido van Rossum354797c2001-12-03 19:45:06 +00003987 int res;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003988 if (x != NULL)
Guido van Rossum354797c2001-12-03 19:45:06 +00003989 res = PyObject_SetItem(u, slice, x);
Guido van Rossum50d756e2001-08-18 17:43:36 +00003990 else
Guido van Rossum354797c2001-12-03 19:45:06 +00003991 res = PyObject_DelItem(u, slice);
3992 Py_DECREF(slice);
3993 return res;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003994 }
3995 else
3996 return -1;
3997 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003998}
3999
Fredrik Lundh7a830892006-05-27 10:39:48 +00004000static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004001cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004002{
Guido van Rossumac7be682001-01-17 15:42:30 +00004003 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004004 switch (op) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00004005 case PyCmp_IS:
Guido van Rossum3f5da241990-12-20 15:06:42 +00004006 res = (v == w);
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +00004007 break;
4008 case PyCmp_IS_NOT:
4009 res = (v != w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004010 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00004011 case PyCmp_IN:
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +00004012 res = PySequence_Contains(w, v);
4013 if (res < 0)
4014 return NULL;
4015 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00004016 case PyCmp_NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00004017 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004018 if (res < 0)
4019 return NULL;
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +00004020 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004021 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00004022 case PyCmp_EXC_MATCH:
Brett Cannon129bd522007-01-30 21:34:36 +00004023 if (PyTuple_Check(w)) {
4024 Py_ssize_t i, length;
4025 length = PyTuple_Size(w);
4026 for (i = 0; i < length; i += 1) {
4027 PyObject *exc = PyTuple_GET_ITEM(w, i);
4028 if (PyString_Check(exc)) {
4029 int ret_val;
4030 ret_val = PyErr_WarnEx(
Thomas Wouterse2176022007-09-20 17:35:10 +00004031 PyExc_DeprecationWarning,
4032 "catching of string "
4033 "exceptions is deprecated", 1);
Brett Cannon129bd522007-01-30 21:34:36 +00004034 if (ret_val == -1)
4035 return NULL;
4036 }
4037 }
4038 }
4039 else {
4040 if (PyString_Check(w)) {
4041 int ret_val;
4042 ret_val = PyErr_WarnEx(
4043 PyExc_DeprecationWarning,
4044 "catching of string "
Thomas Wouterse2176022007-09-20 17:35:10 +00004045 "exceptions is deprecated", 1);
Brett Cannon129bd522007-01-30 21:34:36 +00004046 if (ret_val == -1)
4047 return NULL;
4048 }
4049 }
Barry Warsaw4249f541997-08-22 21:26:19 +00004050 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004051 break;
4052 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00004053 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004054 }
Guido van Rossumb209a111997-04-29 18:18:01 +00004055 v = res ? Py_True : Py_False;
4056 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004057 return v;
4058}
4059
Fredrik Lundh7a830892006-05-27 10:39:48 +00004060static PyObject *
Thomas Wouters52152252000-08-17 22:55:00 +00004061import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00004062{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00004063 PyObject *x;
4064
4065 x = PyObject_GetAttr(v, name);
4066 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00004067 PyErr_Format(PyExc_ImportError,
4068 "cannot import name %.230s",
4069 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00004070 }
Thomas Wouters52152252000-08-17 22:55:00 +00004071 return x;
4072}
Guido van Rossumac7be682001-01-17 15:42:30 +00004073
Fredrik Lundh7a830892006-05-27 10:39:48 +00004074static int
Thomas Wouters52152252000-08-17 22:55:00 +00004075import_all_from(PyObject *locals, PyObject *v)
4076{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00004077 PyObject *all = PyObject_GetAttrString(v, "__all__");
4078 PyObject *dict, *name, *value;
4079 int skip_leading_underscores = 0;
4080 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00004081
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00004082 if (all == NULL) {
4083 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
4084 return -1; /* Unexpected error */
4085 PyErr_Clear();
4086 dict = PyObject_GetAttrString(v, "__dict__");
4087 if (dict == NULL) {
4088 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
4089 return -1;
4090 PyErr_SetString(PyExc_ImportError,
4091 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00004092 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00004093 }
4094 all = PyMapping_Keys(dict);
4095 Py_DECREF(dict);
4096 if (all == NULL)
4097 return -1;
4098 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00004099 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00004100
4101 for (pos = 0, err = 0; ; pos++) {
4102 name = PySequence_GetItem(all, pos);
4103 if (name == NULL) {
4104 if (!PyErr_ExceptionMatches(PyExc_IndexError))
4105 err = -1;
4106 else
4107 PyErr_Clear();
4108 break;
4109 }
4110 if (skip_leading_underscores &&
4111 PyString_Check(name) &&
4112 PyString_AS_STRING(name)[0] == '_')
4113 {
4114 Py_DECREF(name);
4115 continue;
4116 }
4117 value = PyObject_GetAttr(v, name);
4118 if (value == NULL)
4119 err = -1;
Armin Rigo70370852006-11-29 21:59:22 +00004120 else if (PyDict_CheckExact(locals))
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00004121 err = PyDict_SetItem(locals, name, value);
Armin Rigo70370852006-11-29 21:59:22 +00004122 else
4123 err = PyObject_SetItem(locals, name, value);
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00004124 Py_DECREF(name);
4125 Py_XDECREF(value);
4126 if (err != 0)
4127 break;
4128 }
4129 Py_DECREF(all);
4130 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00004131}
4132
Fredrik Lundh7a830892006-05-27 10:39:48 +00004133static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004134build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00004135{
Guido van Rossum7851eea2001-09-12 19:19:18 +00004136 PyObject *metaclass = NULL, *result, *base;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004137
4138 if (PyDict_Check(methods))
4139 metaclass = PyDict_GetItemString(methods, "__metaclass__");
Guido van Rossum7851eea2001-09-12 19:19:18 +00004140 if (metaclass != NULL)
Guido van Rossum2556f2e2001-12-06 14:09:56 +00004141 Py_INCREF(metaclass);
Guido van Rossum7851eea2001-09-12 19:19:18 +00004142 else if (PyTuple_Check(bases) && PyTuple_GET_SIZE(bases) > 0) {
4143 base = PyTuple_GET_ITEM(bases, 0);
4144 metaclass = PyObject_GetAttrString(base, "__class__");
4145 if (metaclass == NULL) {
4146 PyErr_Clear();
4147 metaclass = (PyObject *)base->ob_type;
4148 Py_INCREF(metaclass);
Guido van Rossum25831651993-05-19 14:50:45 +00004149 }
4150 }
Guido van Rossum7851eea2001-09-12 19:19:18 +00004151 else {
4152 PyObject *g = PyEval_GetGlobals();
4153 if (g != NULL && PyDict_Check(g))
4154 metaclass = PyDict_GetItemString(g, "__metaclass__");
4155 if (metaclass == NULL)
4156 metaclass = (PyObject *) &PyClass_Type;
4157 Py_INCREF(metaclass);
4158 }
Jeremy Hylton7c1e3472007-02-26 16:14:51 +00004159 result = PyObject_CallFunctionObjArgs(metaclass, name, bases, methods,
Thomas Woutersae406c62007-09-19 17:27:43 +00004160 NULL);
Guido van Rossum7851eea2001-09-12 19:19:18 +00004161 Py_DECREF(metaclass);
Raymond Hettingerf2c08302004-06-05 06:16:22 +00004162 if (result == NULL && PyErr_ExceptionMatches(PyExc_TypeError)) {
Tim Peters7df5e7f2006-05-26 23:14:37 +00004163 /* A type error here likely means that the user passed
Raymond Hettingerf2c08302004-06-05 06:16:22 +00004164 in a base that was not a class (such the random module
4165 instead of the random.random type). Help them out with
Raymond Hettingercfc31922004-09-16 16:41:57 +00004166 by augmenting the error message with more information.*/
4167
4168 PyObject *ptype, *pvalue, *ptraceback;
4169
4170 PyErr_Fetch(&ptype, &pvalue, &ptraceback);
4171 if (PyString_Check(pvalue)) {
4172 PyObject *newmsg;
4173 newmsg = PyString_FromFormat(
Jeremy Hylton7c1e3472007-02-26 16:14:51 +00004174 "Error when calling the metaclass bases\n"
Thomas Woutersae406c62007-09-19 17:27:43 +00004175 " %s",
Raymond Hettingercfc31922004-09-16 16:41:57 +00004176 PyString_AS_STRING(pvalue));
4177 if (newmsg != NULL) {
4178 Py_DECREF(pvalue);
4179 pvalue = newmsg;
4180 }
4181 }
4182 PyErr_Restore(ptype, pvalue, ptraceback);
Raymond Hettingerf2c08302004-06-05 06:16:22 +00004183 }
Guido van Rossum7851eea2001-09-12 19:19:18 +00004184 return result;
Guido van Rossum25831651993-05-19 14:50:45 +00004185}
4186
Fredrik Lundh7a830892006-05-27 10:39:48 +00004187static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004188exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
4189 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004190{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004191 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00004192 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004193 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004194
Guido van Rossumb209a111997-04-29 18:18:01 +00004195 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
4196 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004197 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00004198 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004199 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00004200 locals = PyTuple_GetItem(prog, 2);
4201 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004202 }
Guido van Rossumb209a111997-04-29 18:18:01 +00004203 if (globals == Py_None) {
4204 globals = PyEval_GetGlobals();
4205 if (locals == Py_None) {
4206 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00004207 plain = 1;
4208 }
Neal Norwitzdf6a6492006-08-13 18:10:10 +00004209 if (!globals || !locals) {
4210 PyErr_SetString(PyExc_SystemError,
4211 "globals and locals cannot be NULL");
4212 return -1;
4213 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004214 }
Guido van Rossumb209a111997-04-29 18:18:01 +00004215 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004216 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00004217 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00004218 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00004219 !PyCode_Check(prog) &&
4220 !PyFile_Check(prog)) {
4221 PyErr_SetString(PyExc_TypeError,
Guido van Rossumac7be682001-01-17 15:42:30 +00004222 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004223 return -1;
4224 }
Fred Drake661ea262000-10-24 19:57:45 +00004225 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00004226 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00004227 "exec: arg 2 must be a dictionary or None");
4228 return -1;
4229 }
Raymond Hettinger66bd2332004-08-02 08:30:07 +00004230 if (!PyMapping_Check(locals)) {
Fred Drake661ea262000-10-24 19:57:45 +00004231 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger66bd2332004-08-02 08:30:07 +00004232 "exec: arg 3 must be a mapping or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004233 return -1;
4234 }
Guido van Rossumb209a111997-04-29 18:18:01 +00004235 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00004236 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00004237 if (PyCode_Check(prog)) {
Jeremy Hylton733c8932001-12-13 19:51:56 +00004238 if (PyCode_GetNumFree((PyCodeObject *)prog) > 0) {
4239 PyErr_SetString(PyExc_TypeError,
4240 "code object passed to exec may not contain free variables");
4241 return -1;
4242 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00004243 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004244 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00004245 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00004246 FILE *fp = PyFile_AsFile(prog);
4247 char *name = PyString_AsString(PyFile_Name(prog));
Jeremy Hylton714b1122007-02-25 16:01:58 +00004248 PyCompilerFlags cf;
Thomas Woutersae406c62007-09-19 17:27:43 +00004249 if (name == NULL)
4250 return -1;
Tim Peters5ba58662001-07-16 02:29:45 +00004251 cf.cf_flags = 0;
4252 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00004253 v = PyRun_FileFlags(fp, name, Py_file_input, globals,
Tim Peters8a5c3c72004-04-05 19:36:21 +00004254 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00004255 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00004256 v = PyRun_File(fp, name, Py_file_input, globals,
Tim Peters8a5c3c72004-04-05 19:36:21 +00004257 locals);
Guido van Rossuma400d8a2000-01-12 22:45:54 +00004258 }
4259 else {
Just van Rossum3aaf42c2003-02-10 08:21:10 +00004260 PyObject *tmp = NULL;
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00004261 char *str;
Tim Peters5ba58662001-07-16 02:29:45 +00004262 PyCompilerFlags cf;
Just van Rossum3aaf42c2003-02-10 08:21:10 +00004263 cf.cf_flags = 0;
4264#ifdef Py_USING_UNICODE
4265 if (PyUnicode_Check(prog)) {
4266 tmp = PyUnicode_AsUTF8String(prog);
4267 if (tmp == NULL)
4268 return -1;
4269 prog = tmp;
4270 cf.cf_flags |= PyCF_SOURCE_IS_UTF8;
4271 }
4272#endif
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00004273 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004274 return -1;
Tim Peters5ba58662001-07-16 02:29:45 +00004275 if (PyEval_MergeCompilerFlags(&cf))
Tim Peters8a5c3c72004-04-05 19:36:21 +00004276 v = PyRun_StringFlags(str, Py_file_input, globals,
Jeremy Hyltonbc320242001-03-22 02:47:58 +00004277 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00004278 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00004279 v = PyRun_String(str, Py_file_input, globals, locals);
Just van Rossum3aaf42c2003-02-10 08:21:10 +00004280 Py_XDECREF(tmp);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004281 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00004282 if (plain)
4283 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004284 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004285 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00004286 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004287 return 0;
4288}
Guido van Rossum24c13741995-02-14 09:42:43 +00004289
Fredrik Lundh7a830892006-05-27 10:39:48 +00004290static void
Paul Prescode68140d2000-08-30 20:25:01 +00004291format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
4292{
4293 char *obj_str;
4294
4295 if (!obj)
4296 return;
4297
4298 obj_str = PyString_AsString(obj);
4299 if (!obj_str)
4300 return;
4301
4302 PyErr_Format(exc, format_str, obj_str);
4303}
Guido van Rossum950361c1997-01-24 13:49:28 +00004304
Fredrik Lundh7a830892006-05-27 10:39:48 +00004305static PyObject *
Raymond Hettinger52a21b82004-08-06 18:43:09 +00004306string_concatenate(PyObject *v, PyObject *w,
4307 PyFrameObject *f, unsigned char *next_instr)
4308{
4309 /* This function implements 'variable += expr' when both arguments
4310 are strings. */
Armin Rigo97ff0472006-08-09 15:37:26 +00004311 Py_ssize_t v_len = PyString_GET_SIZE(v);
4312 Py_ssize_t w_len = PyString_GET_SIZE(w);
4313 Py_ssize_t new_len = v_len + w_len;
4314 if (new_len < 0) {
4315 PyErr_SetString(PyExc_OverflowError,
4316 "strings are too large to concat");
4317 return NULL;
4318 }
Tim Peters7df5e7f2006-05-26 23:14:37 +00004319
Raymond Hettinger52a21b82004-08-06 18:43:09 +00004320 if (v->ob_refcnt == 2) {
4321 /* In the common case, there are 2 references to the value
4322 * stored in 'variable' when the += is performed: one on the
Thomas Wouterse2176022007-09-20 17:35:10 +00004323 * value stack (in 'v') and one still stored in the
4324 * 'variable'. We try to delete the variable now to reduce
4325 * the refcnt to 1.
Raymond Hettinger52a21b82004-08-06 18:43:09 +00004326 */
4327 switch (*next_instr) {
4328 case STORE_FAST:
4329 {
4330 int oparg = PEEKARG();
4331 PyObject **fastlocals = f->f_localsplus;
4332 if (GETLOCAL(oparg) == v)
4333 SETLOCAL(oparg, NULL);
4334 break;
4335 }
4336 case STORE_DEREF:
4337 {
Thomas Wouterse2176022007-09-20 17:35:10 +00004338 PyObject **freevars = (f->f_localsplus +
4339 f->f_code->co_nlocals);
Raymond Hettinger52a21b82004-08-06 18:43:09 +00004340 PyObject *c = freevars[PEEKARG()];
4341 if (PyCell_GET(c) == v)
4342 PyCell_Set(c, NULL);
4343 break;
4344 }
4345 case STORE_NAME:
4346 {
4347 PyObject *names = f->f_code->co_names;
4348 PyObject *name = GETITEM(names, PEEKARG());
4349 PyObject *locals = f->f_locals;
4350 if (PyDict_CheckExact(locals) &&
4351 PyDict_GetItem(locals, name) == v) {
4352 if (PyDict_DelItem(locals, name) != 0) {
4353 PyErr_Clear();
4354 }
4355 }
4356 break;
4357 }
4358 }
4359 }
4360
Armin Rigo618fbf52004-08-07 20:58:32 +00004361 if (v->ob_refcnt == 1 && !PyString_CHECK_INTERNED(v)) {
Raymond Hettinger52a21b82004-08-06 18:43:09 +00004362 /* Now we own the last reference to 'v', so we can resize it
4363 * in-place.
4364 */
Armin Rigo97ff0472006-08-09 15:37:26 +00004365 if (_PyString_Resize(&v, new_len) != 0) {
Raymond Hettinger52a21b82004-08-06 18:43:09 +00004366 /* XXX if _PyString_Resize() fails, 'v' has been
Thomas Wouterse2176022007-09-20 17:35:10 +00004367 * deallocated so it cannot be put back into
4368 * 'variable'. The MemoryError is raised when there
4369 * is no value in 'variable', which might (very
4370 * remotely) be a cause of incompatibilities.
Raymond Hettinger52a21b82004-08-06 18:43:09 +00004371 */
4372 return NULL;
4373 }
4374 /* copy 'w' into the newly allocated area of 'v' */
4375 memcpy(PyString_AS_STRING(v) + v_len,
4376 PyString_AS_STRING(w), w_len);
4377 return v;
4378 }
4379 else {
4380 /* When in-place resizing is not an option. */
4381 PyString_Concat(&v, w);
4382 return v;
4383 }
4384}
4385
Guido van Rossum950361c1997-01-24 13:49:28 +00004386#ifdef DYNAMIC_EXECUTION_PROFILE
4387
Fredrik Lundh7a830892006-05-27 10:39:48 +00004388static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004389getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00004390{
4391 int i;
4392 PyObject *l = PyList_New(256);
4393 if (l == NULL) return NULL;
4394 for (i = 0; i < 256; i++) {
4395 PyObject *x = PyInt_FromLong(a[i]);
4396 if (x == NULL) {
4397 Py_DECREF(l);
4398 return NULL;
4399 }
4400 PyList_SetItem(l, i, x);
4401 }
4402 for (i = 0; i < 256; i++)
4403 a[i] = 0;
4404 return l;
4405}
4406
4407PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004408_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00004409{
4410#ifndef DXPAIRS
4411 return getarray(dxp);
4412#else
4413 int i;
4414 PyObject *l = PyList_New(257);
4415 if (l == NULL) return NULL;
4416 for (i = 0; i < 257; i++) {
4417 PyObject *x = getarray(dxpairs[i]);
4418 if (x == NULL) {
4419 Py_DECREF(l);
4420 return NULL;
4421 }
4422 PyList_SetItem(l, i, x);
4423 }
4424 return l;
4425#endif
4426}
4427
4428#endif