blob: fcc1c24455f0a8302d8651c2fc89c73968adf6a7 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum3f5da241990-12-20 15:06:42 +00002/* Execute compiled code */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003
Guido van Rossum681d79a1995-07-18 14:51:37 +00004/* XXX TO DO:
Guido van Rossum681d79a1995-07-18 14:51:37 +00005 XXX speed up searching for keywords by using a dictionary
Guido van Rossum681d79a1995-07-18 14:51:37 +00006 XXX document it!
7 */
8
Thomas Wouters477c8d52006-05-27 19:21:47 +00009/* enable more aggressive intra-module optimizations, where available */
10#define PY_LOCAL_AGGRESSIVE
11
Guido van Rossumb209a111997-04-29 18:18:01 +000012#include "Python.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000013
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000014#include "code.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000015#include "frameobject.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000016#include "opcode.h"
Tim Peters6d6c1a32001-08-02 04:15:00 +000017#include "structmember.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000018
Guido van Rossumc6004111993-11-05 10:22:19 +000019#include <ctype.h>
20
Thomas Wouters477c8d52006-05-27 19:21:47 +000021#ifndef WITH_TSC
Michael W. Hudson75eabd22005-01-18 15:56:11 +000022
23#define READ_TIMESTAMP(var)
24
25#else
Martin v. Löwisf30d60e2004-06-08 08:17:44 +000026
27typedef unsigned long long uint64;
28
Ezio Melotti13925002011-03-16 11:05:33 +020029/* PowerPC support.
David Malcolmf1397ad2011-01-06 17:01:36 +000030 "__ppc__" appears to be the preprocessor definition to detect on OS X, whereas
31 "__powerpc__" appears to be the correct one for Linux with GCC
32*/
33#if defined(__ppc__) || defined (__powerpc__)
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
37static void
38ppc_getcounter(uint64 *v)
39{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +020040 unsigned long tbu, tb, tbu2;
Michael W. Hudson800ba232004-08-12 18:19:17 +000041
42 loop:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000043 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;
Michael W. Hudson800ba232004-08-12 18:19:17 +000047
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000048 /* The slightly peculiar way of writing the next lines is
49 compiled better by GCC than any other way I tried. */
50 ((long*)(v))[0] = tbu;
51 ((long*)(v))[1] = tb;
Michael W. Hudson800ba232004-08-12 18:19:17 +000052}
53
Mark Dickinsona25b1312009-10-31 10:18:44 +000054#elif defined(__i386__)
55
56/* this is for linux/x86 (and probably any other GCC/x86 combo) */
Michael W. Hudson800ba232004-08-12 18:19:17 +000057
Michael W. Hudson75eabd22005-01-18 15:56:11 +000058#define READ_TIMESTAMP(val) \
59 __asm__ __volatile__("rdtsc" : "=A" (val))
Michael W. Hudson800ba232004-08-12 18:19:17 +000060
Mark Dickinsona25b1312009-10-31 10:18:44 +000061#elif defined(__x86_64__)
62
63/* for gcc/x86_64, the "A" constraint in DI mode means *either* rax *or* rdx;
64 not edx:eax as it does for i386. Since rdtsc puts its result in edx:eax
65 even in 64-bit mode, we need to use "a" and "d" for the lower and upper
66 32-bit pieces of the result. */
67
68#define READ_TIMESTAMP(val) \
69 __asm__ __volatile__("rdtsc" : \
70 "=a" (((int*)&(val))[0]), "=d" (((int*)&(val))[1]));
71
72
73#else
74
75#error "Don't know how to implement timestamp counter for this architecture"
76
Michael W. Hudson800ba232004-08-12 18:19:17 +000077#endif
78
Thomas Wouters477c8d52006-05-27 19:21:47 +000079void dump_tsc(int opcode, int ticked, uint64 inst0, uint64 inst1,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000080 uint64 loop0, uint64 loop1, uint64 intr0, uint64 intr1)
Martin v. Löwisf30d60e2004-06-08 08:17:44 +000081{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000082 uint64 intr, inst, loop;
83 PyThreadState *tstate = PyThreadState_Get();
84 if (!tstate->interp->tscdump)
85 return;
86 intr = intr1 - intr0;
87 inst = inst1 - inst0 - intr;
88 loop = loop1 - loop0 - intr;
89 fprintf(stderr, "opcode=%03d t=%d inst=%06lld loop=%06lld\n",
Stefan Krahb7e10102010-06-23 18:42:39 +000090 opcode, ticked, inst, loop);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +000091}
Michael W. Hudson800ba232004-08-12 18:19:17 +000092
Martin v. Löwisf30d60e2004-06-08 08:17:44 +000093#endif
94
Guido van Rossum04691fc1992-08-12 15:35:34 +000095/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000096/* #define CASE_TOO_BIG 1 */
Guido van Rossum04691fc1992-08-12 15:35:34 +000097
Guido van Rossum408027e1996-12-30 16:17:54 +000098#ifdef Py_DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000099/* For debugging the interpreter: */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000100#define LLTRACE 1 /* Low-level trace feature */
101#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000102#endif
103
Jeremy Hylton52820442001-01-03 23:52:36 +0000104typedef PyObject *(*callproc)(PyObject *, PyObject *, PyObject *);
Guido van Rossum5b722181993-03-30 17:46:03 +0000105
Guido van Rossum374a9221991-04-04 10:40:29 +0000106/* Forward declarations */
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000107#ifdef WITH_TSC
Thomas Wouters477c8d52006-05-27 19:21:47 +0000108static PyObject * call_function(PyObject ***, int, uint64*, uint64*);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000109#else
Thomas Wouters477c8d52006-05-27 19:21:47 +0000110static PyObject * call_function(PyObject ***, int);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000111#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000112static PyObject * fast_function(PyObject *, PyObject ***, int, int, int);
113static PyObject * do_call(PyObject *, PyObject ***, int, int);
114static PyObject * ext_do_call(PyObject *, PyObject ***, int, int, int);
Thomas Wouters8ce81f72007-09-20 18:22:40 +0000115static PyObject * update_keyword_args(PyObject *, int, PyObject ***,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000116 PyObject *);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000117static PyObject * update_star_args(int, int, PyObject *, PyObject ***);
118static PyObject * load_args(PyObject ***, int);
Jeremy Hylton52820442001-01-03 23:52:36 +0000119#define CALL_FLAG_VAR 1
120#define CALL_FLAG_KW 2
121
Guido van Rossum0a066c01992-03-27 17:29:15 +0000122#ifdef LLTRACE
Guido van Rossumc2e20742006-02-27 22:32:47 +0000123static int lltrace;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000124static int prtrace(PyObject *, char *);
Guido van Rossum0a066c01992-03-27 17:29:15 +0000125#endif
Fred Drake5755ce62001-06-27 19:19:46 +0000126static int call_trace(Py_tracefunc, PyObject *, PyFrameObject *,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000127 int, PyObject *);
Amaury Forgeot d'Arcf05149a2007-11-13 01:05:30 +0000128static int call_trace_protected(Py_tracefunc, PyObject *,
Stefan Krahb7e10102010-06-23 18:42:39 +0000129 PyFrameObject *, int, PyObject *);
Fred Drake5755ce62001-06-27 19:19:46 +0000130static void call_exc_trace(Py_tracefunc, PyObject *, PyFrameObject *);
Tim Peters8a5c3c72004-04-05 19:36:21 +0000131static int maybe_call_line_trace(Py_tracefunc, PyObject *,
Stefan Krahb7e10102010-06-23 18:42:39 +0000132 PyFrameObject *, int *, int *, int *);
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000133
Thomas Wouters477c8d52006-05-27 19:21:47 +0000134static PyObject * cmp_outcome(int, PyObject *, PyObject *);
135static PyObject * import_from(PyObject *, PyObject *);
Thomas Wouters52152252000-08-17 22:55:00 +0000136static int import_all_from(PyObject *, PyObject *);
Neal Norwitzda059e32007-08-26 05:33:45 +0000137static void format_exc_check_arg(PyObject *, const char *, PyObject *);
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +0000138static void format_exc_unbound(PyCodeObject *co, int oparg);
Victor Stinnerd2a915d2011-10-02 20:34:20 +0200139static PyObject * unicode_concatenate(PyObject *, PyObject *,
140 PyFrameObject *, unsigned char *);
Benjamin Petersonce798522012-01-22 11:24:29 -0500141static PyObject * special_lookup(PyObject *, _Py_Identifier *);
Guido van Rossum374a9221991-04-04 10:40:29 +0000142
Paul Prescode68140d2000-08-30 20:25:01 +0000143#define NAME_ERROR_MSG \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000144 "name '%.200s' is not defined"
Paul Prescode68140d2000-08-30 20:25:01 +0000145#define UNBOUNDLOCAL_ERROR_MSG \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000146 "local variable '%.200s' referenced before assignment"
Jeremy Hyltonc76770c2001-04-13 16:51:46 +0000147#define UNBOUNDFREE_ERROR_MSG \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000148 "free variable '%.200s' referenced before assignment" \
149 " in enclosing scope"
Guido van Rossum374a9221991-04-04 10:40:29 +0000150
Guido van Rossum950361c1997-01-24 13:49:28 +0000151/* Dynamic execution profile */
152#ifdef DYNAMIC_EXECUTION_PROFILE
153#ifdef DXPAIRS
154static long dxpairs[257][256];
155#define dxp dxpairs[256]
156#else
157static long dxp[256];
158#endif
159#endif
160
Jeremy Hylton985eba52003-02-05 23:13:00 +0000161/* Function call profile */
162#ifdef CALL_PROFILE
163#define PCALL_NUM 11
164static int pcall[PCALL_NUM];
165
166#define PCALL_ALL 0
167#define PCALL_FUNCTION 1
168#define PCALL_FAST_FUNCTION 2
169#define PCALL_FASTER_FUNCTION 3
170#define PCALL_METHOD 4
171#define PCALL_BOUND_METHOD 5
172#define PCALL_CFUNCTION 6
173#define PCALL_TYPE 7
174#define PCALL_GENERATOR 8
175#define PCALL_OTHER 9
176#define PCALL_POP 10
177
178/* Notes about the statistics
179
180 PCALL_FAST stats
181
182 FAST_FUNCTION means no argument tuple needs to be created.
183 FASTER_FUNCTION means that the fast-path frame setup code is used.
184
185 If there is a method call where the call can be optimized by changing
186 the argument tuple and calling the function directly, it gets recorded
187 twice.
188
189 As a result, the relationship among the statistics appears to be
190 PCALL_ALL == PCALL_FUNCTION + PCALL_METHOD - PCALL_BOUND_METHOD +
191 PCALL_CFUNCTION + PCALL_TYPE + PCALL_GENERATOR + PCALL_OTHER
192 PCALL_FUNCTION > PCALL_FAST_FUNCTION > PCALL_FASTER_FUNCTION
193 PCALL_METHOD > PCALL_BOUND_METHOD
194*/
195
196#define PCALL(POS) pcall[POS]++
197
198PyObject *
199PyEval_GetCallStats(PyObject *self)
200{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000201 return Py_BuildValue("iiiiiiiiiii",
202 pcall[0], pcall[1], pcall[2], pcall[3],
203 pcall[4], pcall[5], pcall[6], pcall[7],
204 pcall[8], pcall[9], pcall[10]);
Jeremy Hylton985eba52003-02-05 23:13:00 +0000205}
206#else
207#define PCALL(O)
208
209PyObject *
210PyEval_GetCallStats(PyObject *self)
211{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000212 Py_INCREF(Py_None);
213 return Py_None;
Jeremy Hylton985eba52003-02-05 23:13:00 +0000214}
215#endif
216
Tim Peters5ca576e2001-06-18 22:08:13 +0000217
Benjamin Petersond2be5b42010-09-10 22:47:02 +0000218#ifdef WITH_THREAD
219#define GIL_REQUEST _Py_atomic_load_relaxed(&gil_drop_request)
220#else
221#define GIL_REQUEST 0
222#endif
223
Jeffrey Yasskin39370832010-05-03 19:29:34 +0000224/* This can set eval_breaker to 0 even though gil_drop_request became
225 1. We believe this is all right because the eval loop will release
226 the GIL eventually anyway. */
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000227#define COMPUTE_EVAL_BREAKER() \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000228 _Py_atomic_store_relaxed( \
229 &eval_breaker, \
Benjamin Petersond2be5b42010-09-10 22:47:02 +0000230 GIL_REQUEST | \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000231 _Py_atomic_load_relaxed(&pendingcalls_to_do) | \
232 pending_async_exc)
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000233
Benjamin Petersond2be5b42010-09-10 22:47:02 +0000234#ifdef WITH_THREAD
235
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000236#define SET_GIL_DROP_REQUEST() \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000237 do { \
238 _Py_atomic_store_relaxed(&gil_drop_request, 1); \
239 _Py_atomic_store_relaxed(&eval_breaker, 1); \
240 } while (0)
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000241
242#define RESET_GIL_DROP_REQUEST() \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000243 do { \
244 _Py_atomic_store_relaxed(&gil_drop_request, 0); \
245 COMPUTE_EVAL_BREAKER(); \
246 } while (0)
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000247
Benjamin Petersond2be5b42010-09-10 22:47:02 +0000248#endif
249
Jeffrey Yasskin39370832010-05-03 19:29:34 +0000250/* Pending calls are only modified under pending_lock */
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000251#define SIGNAL_PENDING_CALLS() \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000252 do { \
253 _Py_atomic_store_relaxed(&pendingcalls_to_do, 1); \
254 _Py_atomic_store_relaxed(&eval_breaker, 1); \
255 } while (0)
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000256
257#define UNSIGNAL_PENDING_CALLS() \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000258 do { \
259 _Py_atomic_store_relaxed(&pendingcalls_to_do, 0); \
260 COMPUTE_EVAL_BREAKER(); \
261 } while (0)
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000262
263#define SIGNAL_ASYNC_EXC() \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000264 do { \
265 pending_async_exc = 1; \
266 _Py_atomic_store_relaxed(&eval_breaker, 1); \
267 } while (0)
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000268
269#define UNSIGNAL_ASYNC_EXC() \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000270 do { pending_async_exc = 0; COMPUTE_EVAL_BREAKER(); } while (0)
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000271
272
Guido van Rossume59214e1994-08-30 08:01:59 +0000273#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000274
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000275#ifdef HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000276#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +0000277#endif
Guido van Rossum49b56061998-10-01 20:42:43 +0000278#include "pythread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000279
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000280static PyThread_type_lock pending_lock = 0; /* for pending calls */
Guido van Rossuma9672091994-09-14 13:31:22 +0000281static long main_thread = 0;
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000282/* This single variable consolidates all requests to break out of the fast path
283 in the eval loop. */
Jeffrey Yasskin39370832010-05-03 19:29:34 +0000284static _Py_atomic_int eval_breaker = {0};
285/* Request for dropping the GIL */
286static _Py_atomic_int gil_drop_request = {0};
287/* Request for running pending calls. */
288static _Py_atomic_int pendingcalls_to_do = {0};
289/* Request for looking at the `async_exc` field of the current thread state.
290 Guarded by the GIL. */
291static int pending_async_exc = 0;
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000292
293#include "ceval_gil.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000294
Tim Peters7f468f22004-10-11 02:40:51 +0000295int
296PyEval_ThreadsInitialized(void)
297{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000298 return gil_created();
Tim Peters7f468f22004-10-11 02:40:51 +0000299}
300
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000301void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000302PyEval_InitThreads(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000303{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000304 if (gil_created())
305 return;
306 create_gil();
307 take_gil(PyThreadState_GET());
308 main_thread = PyThread_get_thread_ident();
309 if (!pending_lock)
310 pending_lock = PyThread_allocate_lock();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000311}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000312
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000313void
Antoine Pitrou1df15362010-09-13 14:16:46 +0000314_PyEval_FiniThreads(void)
315{
316 if (!gil_created())
317 return;
318 destroy_gil();
319 assert(!gil_created());
320}
321
322void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000323PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000324{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000325 PyThreadState *tstate = PyThreadState_GET();
326 if (tstate == NULL)
327 Py_FatalError("PyEval_AcquireLock: current thread state is NULL");
328 take_gil(tstate);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000329}
330
331void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000332PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000333{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000334 /* This function must succeed when the current thread state is NULL.
335 We therefore avoid PyThreadState_GET() which dumps a fatal error
336 in debug mode.
337 */
338 drop_gil((PyThreadState*)_Py_atomic_load_relaxed(
339 &_PyThreadState_Current));
Guido van Rossum25ce5661997-08-02 03:10:38 +0000340}
341
342void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000343PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000344{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000345 if (tstate == NULL)
346 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
347 /* Check someone has called PyEval_InitThreads() to create the lock */
348 assert(gil_created());
349 take_gil(tstate);
350 if (PyThreadState_Swap(tstate) != NULL)
351 Py_FatalError(
352 "PyEval_AcquireThread: non-NULL old thread state");
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000353}
354
355void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000356PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000357{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000358 if (tstate == NULL)
359 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
360 if (PyThreadState_Swap(NULL) != tstate)
361 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
362 drop_gil(tstate);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000363}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000364
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200365/* This function is called from PyOS_AfterFork to destroy all threads which are
366 * not running in the child process, and clear internal locks which might be
367 * held by those threads. (This could also be done using pthread_atfork
368 * mechanism, at least for the pthreads implementation.) */
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000369
370void
371PyEval_ReInitThreads(void)
372{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200373 _Py_IDENTIFIER(_after_fork);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000374 PyObject *threading, *result;
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200375 PyThreadState *current_tstate = PyThreadState_GET();
Jesse Nollera8513972008-07-17 16:49:17 +0000376
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000377 if (!gil_created())
378 return;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000379 recreate_gil();
380 pending_lock = PyThread_allocate_lock();
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200381 take_gil(current_tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000382 main_thread = PyThread_get_thread_ident();
Jesse Nollera8513972008-07-17 16:49:17 +0000383
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000384 /* Update the threading module with the new state.
385 */
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200386 threading = PyMapping_GetItemString(current_tstate->interp->modules,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000387 "threading");
388 if (threading == NULL) {
389 /* threading not imported */
390 PyErr_Clear();
391 return;
392 }
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200393 result = _PyObject_CallMethodId(threading, &PyId__after_fork, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000394 if (result == NULL)
395 PyErr_WriteUnraisable(threading);
396 else
397 Py_DECREF(result);
398 Py_DECREF(threading);
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200399
400 /* Destroy all threads except the current one */
401 _PyThreadState_DeleteExcept(current_tstate);
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000402}
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000403
404#else
Jeffrey Yasskin39370832010-05-03 19:29:34 +0000405static _Py_atomic_int eval_breaker = {0};
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000406static int pending_async_exc = 0;
407#endif /* WITH_THREAD */
408
409/* This function is used to signal that async exceptions are waiting to be
410 raised, therefore it is also useful in non-threaded builds. */
411
412void
413_PyEval_SignalAsyncExc(void)
414{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000415 SIGNAL_ASYNC_EXC();
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000416}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000417
Guido van Rossumff4949e1992-08-05 19:58:53 +0000418/* Functions save_thread and restore_thread are always defined so
419 dynamically loaded modules needn't be compiled separately for use
420 with and without threads: */
421
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000422PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000423PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000424{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000425 PyThreadState *tstate = PyThreadState_Swap(NULL);
426 if (tstate == NULL)
427 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000428#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000429 if (gil_created())
430 drop_gil(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000431#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000432 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000433}
434
435void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000436PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000437{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000438 if (tstate == NULL)
439 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000440#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000441 if (gil_created()) {
442 int err = errno;
443 take_gil(tstate);
Antoine Pitrou0d5e52d2011-05-04 20:02:30 +0200444 /* _Py_Finalizing is protected by the GIL */
445 if (_Py_Finalizing && tstate != _Py_Finalizing) {
446 drop_gil(tstate);
447 PyThread_exit_thread();
448 assert(0); /* unreachable */
449 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000450 errno = err;
451 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000452#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000453 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000454}
455
456
Guido van Rossuma9672091994-09-14 13:31:22 +0000457/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
458 signal handlers or Mac I/O completion routines) can schedule calls
459 to a function to be called synchronously.
460 The synchronous function is called with one void* argument.
461 It should return 0 for success or -1 for failure -- failure should
462 be accompanied by an exception.
463
464 If registry succeeds, the registry function returns 0; if it fails
465 (e.g. due to too many pending calls) it returns -1 (without setting
466 an exception condition).
467
468 Note that because registry may occur from within signal handlers,
469 or other asynchronous events, calling malloc() is unsafe!
470
471#ifdef WITH_THREAD
472 Any thread can schedule pending calls, but only the main thread
473 will execute them.
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000474 There is no facility to schedule calls to a particular thread, but
475 that should be easy to change, should that ever be required. In
476 that case, the static variables here should go into the python
477 threadstate.
Guido van Rossuma9672091994-09-14 13:31:22 +0000478#endif
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000479*/
Guido van Rossuma9672091994-09-14 13:31:22 +0000480
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000481#ifdef WITH_THREAD
482
483/* The WITH_THREAD implementation is thread-safe. It allows
484 scheduling to be made from any thread, and even from an executing
485 callback.
486 */
487
488#define NPENDINGCALLS 32
489static struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000490 int (*func)(void *);
491 void *arg;
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000492} pendingcalls[NPENDINGCALLS];
493static int pendingfirst = 0;
494static int pendinglast = 0;
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000495
496int
497Py_AddPendingCall(int (*func)(void *), void *arg)
498{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000499 int i, j, result=0;
500 PyThread_type_lock lock = pending_lock;
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000501
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000502 /* try a few times for the lock. Since this mechanism is used
503 * for signal handling (on the main thread), there is a (slim)
504 * chance that a signal is delivered on the same thread while we
505 * hold the lock during the Py_MakePendingCalls() function.
506 * This avoids a deadlock in that case.
507 * Note that signals can be delivered on any thread. In particular,
508 * on Windows, a SIGINT is delivered on a system-created worker
509 * thread.
510 * We also check for lock being NULL, in the unlikely case that
511 * this function is called before any bytecode evaluation takes place.
512 */
513 if (lock != NULL) {
514 for (i = 0; i<100; i++) {
515 if (PyThread_acquire_lock(lock, NOWAIT_LOCK))
516 break;
517 }
518 if (i == 100)
519 return -1;
520 }
521
522 i = pendinglast;
523 j = (i + 1) % NPENDINGCALLS;
524 if (j == pendingfirst) {
525 result = -1; /* Queue full */
526 } else {
527 pendingcalls[i].func = func;
528 pendingcalls[i].arg = arg;
529 pendinglast = j;
530 }
531 /* signal main loop */
532 SIGNAL_PENDING_CALLS();
533 if (lock != NULL)
534 PyThread_release_lock(lock);
535 return result;
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000536}
537
538int
539Py_MakePendingCalls(void)
540{
Charles-François Natalif23339a2011-07-23 18:15:43 +0200541 static int busy = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000542 int i;
543 int r = 0;
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000544
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000545 if (!pending_lock) {
546 /* initial allocation of the lock */
547 pending_lock = PyThread_allocate_lock();
548 if (pending_lock == NULL)
549 return -1;
550 }
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000551
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000552 /* only service pending calls on main thread */
553 if (main_thread && PyThread_get_thread_ident() != main_thread)
554 return 0;
555 /* don't perform recursive pending calls */
Charles-François Natalif23339a2011-07-23 18:15:43 +0200556 if (busy)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000557 return 0;
Charles-François Natalif23339a2011-07-23 18:15:43 +0200558 busy = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000559 /* perform a bounded number of calls, in case of recursion */
560 for (i=0; i<NPENDINGCALLS; i++) {
561 int j;
562 int (*func)(void *);
563 void *arg = NULL;
564
565 /* pop one item off the queue while holding the lock */
566 PyThread_acquire_lock(pending_lock, WAIT_LOCK);
567 j = pendingfirst;
568 if (j == pendinglast) {
569 func = NULL; /* Queue empty */
570 } else {
571 func = pendingcalls[j].func;
572 arg = pendingcalls[j].arg;
573 pendingfirst = (j + 1) % NPENDINGCALLS;
574 }
575 if (pendingfirst != pendinglast)
576 SIGNAL_PENDING_CALLS();
577 else
578 UNSIGNAL_PENDING_CALLS();
579 PyThread_release_lock(pending_lock);
580 /* having released the lock, perform the callback */
581 if (func == NULL)
582 break;
583 r = func(arg);
584 if (r)
585 break;
586 }
Charles-François Natalif23339a2011-07-23 18:15:43 +0200587 busy = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000588 return r;
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000589}
590
591#else /* if ! defined WITH_THREAD */
592
593/*
594 WARNING! ASYNCHRONOUSLY EXECUTING CODE!
595 This code is used for signal handling in python that isn't built
596 with WITH_THREAD.
597 Don't use this implementation when Py_AddPendingCalls() can happen
598 on a different thread!
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000599
Guido van Rossuma9672091994-09-14 13:31:22 +0000600 There are two possible race conditions:
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000601 (1) nested asynchronous calls to Py_AddPendingCall()
602 (2) AddPendingCall() calls made while pending calls are being processed.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000603
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000604 (1) is very unlikely because typically signal delivery
605 is blocked during signal handling. So it should be impossible.
606 (2) is a real possibility.
Guido van Rossuma9672091994-09-14 13:31:22 +0000607 The current code is safe against (2), but not against (1).
608 The safety against (2) is derived from the fact that only one
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000609 thread is present, interrupted by signals, and that the critical
610 section is protected with the "busy" variable. On Windows, which
611 delivers SIGINT on a system thread, this does not hold and therefore
612 Windows really shouldn't use this version.
613 The two threads could theoretically wiggle around the "busy" variable.
Guido van Rossuma027efa1997-05-05 20:56:21 +0000614*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000615
Guido van Rossuma9672091994-09-14 13:31:22 +0000616#define NPENDINGCALLS 32
617static struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000618 int (*func)(void *);
619 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000620} pendingcalls[NPENDINGCALLS];
621static volatile int pendingfirst = 0;
622static volatile int pendinglast = 0;
Benjamin Peterson08ec84c2010-05-30 14:49:32 +0000623static _Py_atomic_int pendingcalls_to_do = {0};
Guido van Rossuma9672091994-09-14 13:31:22 +0000624
625int
Thomas Wouters334fb892000-07-25 12:56:38 +0000626Py_AddPendingCall(int (*func)(void *), void *arg)
Guido van Rossuma9672091994-09-14 13:31:22 +0000627{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000628 static volatile int busy = 0;
629 int i, j;
630 /* XXX Begin critical section */
631 if (busy)
632 return -1;
633 busy = 1;
634 i = pendinglast;
635 j = (i + 1) % NPENDINGCALLS;
636 if (j == pendingfirst) {
637 busy = 0;
638 return -1; /* Queue full */
639 }
640 pendingcalls[i].func = func;
641 pendingcalls[i].arg = arg;
642 pendinglast = j;
Skip Montanarod581d772002-09-03 20:10:45 +0000643
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000644 SIGNAL_PENDING_CALLS();
645 busy = 0;
646 /* XXX End critical section */
647 return 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000648}
649
Guido van Rossum180d7b41994-09-29 09:45:57 +0000650int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000651Py_MakePendingCalls(void)
Guido van Rossuma9672091994-09-14 13:31:22 +0000652{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000653 static int busy = 0;
654 if (busy)
655 return 0;
656 busy = 1;
657 UNSIGNAL_PENDING_CALLS();
658 for (;;) {
659 int i;
660 int (*func)(void *);
661 void *arg;
662 i = pendingfirst;
663 if (i == pendinglast)
664 break; /* Queue empty */
665 func = pendingcalls[i].func;
666 arg = pendingcalls[i].arg;
667 pendingfirst = (i + 1) % NPENDINGCALLS;
668 if (func(arg) < 0) {
669 busy = 0;
670 SIGNAL_PENDING_CALLS(); /* We're not done yet */
671 return -1;
672 }
673 }
674 busy = 0;
675 return 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000676}
677
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000678#endif /* WITH_THREAD */
679
Guido van Rossuma9672091994-09-14 13:31:22 +0000680
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000681/* The interpreter's recursion limit */
682
Hye-Shik Changb6fa2812005-04-04 15:49:02 +0000683#ifndef Py_DEFAULT_RECURSION_LIMIT
684#define Py_DEFAULT_RECURSION_LIMIT 1000
685#endif
686static int recursion_limit = Py_DEFAULT_RECURSION_LIMIT;
687int _Py_CheckRecursionLimit = Py_DEFAULT_RECURSION_LIMIT;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000688
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000689int
690Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000691{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000692 return recursion_limit;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000693}
694
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000695void
696Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000697{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000698 recursion_limit = new_limit;
699 _Py_CheckRecursionLimit = recursion_limit;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000700}
701
Armin Rigo2b3eb402003-10-28 12:05:48 +0000702/* the macro Py_EnterRecursiveCall() only calls _Py_CheckRecursiveCall()
703 if the recursion_depth reaches _Py_CheckRecursionLimit.
704 If USE_STACKCHECK, the macro decrements _Py_CheckRecursionLimit
705 to guarantee that _Py_CheckRecursiveCall() is regularly called.
706 Without USE_STACKCHECK, there is no need for this. */
707int
708_Py_CheckRecursiveCall(char *where)
709{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000710 PyThreadState *tstate = PyThreadState_GET();
Armin Rigo2b3eb402003-10-28 12:05:48 +0000711
712#ifdef USE_STACKCHECK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000713 if (PyOS_CheckStack()) {
714 --tstate->recursion_depth;
715 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
716 return -1;
717 }
Armin Rigo2b3eb402003-10-28 12:05:48 +0000718#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000719 _Py_CheckRecursionLimit = recursion_limit;
720 if (tstate->recursion_critical)
721 /* Somebody asked that we don't check for recursion. */
722 return 0;
723 if (tstate->overflowed) {
724 if (tstate->recursion_depth > recursion_limit + 50) {
725 /* Overflowing while handling an overflow. Give up. */
726 Py_FatalError("Cannot recover from stack overflow.");
727 }
728 return 0;
729 }
730 if (tstate->recursion_depth > recursion_limit) {
731 --tstate->recursion_depth;
732 tstate->overflowed = 1;
733 PyErr_Format(PyExc_RuntimeError,
734 "maximum recursion depth exceeded%s",
735 where);
736 return -1;
737 }
738 return 0;
Armin Rigo2b3eb402003-10-28 12:05:48 +0000739}
740
Guido van Rossum374a9221991-04-04 10:40:29 +0000741/* Status code for main loop (reason for stack unwind) */
Raymond Hettinger7c958652004-04-06 10:11:10 +0000742enum why_code {
Stefan Krahb7e10102010-06-23 18:42:39 +0000743 WHY_NOT = 0x0001, /* No error */
744 WHY_EXCEPTION = 0x0002, /* Exception occurred */
Stefan Krahb7e10102010-06-23 18:42:39 +0000745 WHY_RETURN = 0x0008, /* 'return' statement */
746 WHY_BREAK = 0x0010, /* 'break' statement */
747 WHY_CONTINUE = 0x0020, /* 'continue' statement */
748 WHY_YIELD = 0x0040, /* 'yield' operator */
749 WHY_SILENCED = 0x0080 /* Exception silenced by 'with' */
Raymond Hettinger7c958652004-04-06 10:11:10 +0000750};
Guido van Rossum374a9221991-04-04 10:40:29 +0000751
Benjamin Peterson87880242011-07-03 16:48:31 -0500752static void save_exc_state(PyThreadState *, PyFrameObject *);
753static void swap_exc_state(PyThreadState *, PyFrameObject *);
754static void restore_and_clear_exc_state(PyThreadState *, PyFrameObject *);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -0400755static int do_raise(PyObject *, PyObject *);
Guido van Rossum0368b722007-05-11 16:50:42 +0000756static int unpack_iterable(PyObject *, int, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000757
Jeffrey Yasskin008d8ef2008-12-06 17:09:27 +0000758/* Records whether tracing is on for any thread. Counts the number of
759 threads for which tstate->c_tracefunc is non-NULL, so if the value
760 is 0, we know we don't have to check this thread's c_tracefunc.
761 This speeds up the if statement in PyEval_EvalFrameEx() after
762 fast_next_opcode*/
763static int _Py_TracingPossible = 0;
764
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000765
Guido van Rossum374a9221991-04-04 10:40:29 +0000766
Guido van Rossumb209a111997-04-29 18:18:01 +0000767PyObject *
Martin v. Löwis4d0d4712010-12-03 20:14:31 +0000768PyEval_EvalCode(PyObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000769{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000770 return PyEval_EvalCodeEx(co,
771 globals, locals,
772 (PyObject **)NULL, 0,
773 (PyObject **)NULL, 0,
774 (PyObject **)NULL, 0,
775 NULL, NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000776}
777
778
779/* Interpreter main loop */
780
Martin v. Löwis8d97e332004-06-27 15:43:12 +0000781PyObject *
Phillip J. Eby0d6615f2005-08-02 00:46:46 +0000782PyEval_EvalFrame(PyFrameObject *f) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000783 /* This is for backward compatibility with extension modules that
784 used this API; core interpreter code should call
785 PyEval_EvalFrameEx() */
786 return PyEval_EvalFrameEx(f, 0);
Phillip J. Eby0d6615f2005-08-02 00:46:46 +0000787}
788
789PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000790PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
Guido van Rossum374a9221991-04-04 10:40:29 +0000791{
Guido van Rossum950361c1997-01-24 13:49:28 +0000792#ifdef DXPAIRS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000793 int lastopcode = 0;
Guido van Rossum950361c1997-01-24 13:49:28 +0000794#endif
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200795 PyObject **stack_pointer; /* Next free slot in value stack */
796 unsigned char *next_instr;
797 int opcode; /* Current opcode */
798 int oparg; /* Current opcode argument, if any */
799 enum why_code why; /* Reason for block stack unwind */
800 PyObject **fastlocals, **freevars;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000801 PyObject *retval = NULL; /* Return value */
802 PyThreadState *tstate = PyThreadState_GET();
803 PyCodeObject *co;
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000804
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000805 /* when tracing we set things up so that
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000806
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000807 not (instr_lb <= current_bytecode_offset < instr_ub)
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000808
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000809 is true when the line being executed has changed. The
810 initial values are such as to make this false the first
811 time it is tested. */
812 int instr_ub = -1, instr_lb = 0, instr_prev = -1;
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000813
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000814 unsigned char *first_instr;
815 PyObject *names;
816 PyObject *consts;
Guido van Rossum374a9221991-04-04 10:40:29 +0000817
Brett Cannon368b4b72012-04-02 12:17:59 -0400818#ifdef LLTRACE
Victor Stinner3c1e4812012-03-26 22:10:51 +0200819 _Py_IDENTIFIER(__ltrace__);
Brett Cannon368b4b72012-04-02 12:17:59 -0400820#endif
Victor Stinner3c1e4812012-03-26 22:10:51 +0200821
Antoine Pitroub52ec782009-01-25 16:34:23 +0000822/* Computed GOTOs, or
823 the-optimization-commonly-but-improperly-known-as-"threaded code"
824 using gcc's labels-as-values extension
825 (http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html).
826
827 The traditional bytecode evaluation loop uses a "switch" statement, which
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000828 decent compilers will optimize as a single indirect branch instruction
Antoine Pitroub52ec782009-01-25 16:34:23 +0000829 combined with a lookup table of jump addresses. However, since the
830 indirect jump instruction is shared by all opcodes, the CPU will have a
831 hard time making the right prediction for where to jump next (actually,
832 it will be always wrong except in the uncommon case of a sequence of
833 several identical opcodes).
834
835 "Threaded code" in contrast, uses an explicit jump table and an explicit
836 indirect jump instruction at the end of each opcode. Since the jump
837 instruction is at a different address for each opcode, the CPU will make a
838 separate prediction for each of these instructions, which is equivalent to
839 predicting the second opcode of each opcode pair. These predictions have
840 a much better chance to turn out valid, especially in small bytecode loops.
841
842 A mispredicted branch on a modern CPU flushes the whole pipeline and
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000843 can cost several CPU cycles (depending on the pipeline depth),
Antoine Pitroub52ec782009-01-25 16:34:23 +0000844 and potentially many more instructions (depending on the pipeline width).
845 A correctly predicted branch, however, is nearly free.
846
847 At the time of this writing, the "threaded code" version is up to 15-20%
848 faster than the normal "switch" version, depending on the compiler and the
849 CPU architecture.
850
851 We disable the optimization if DYNAMIC_EXECUTION_PROFILE is defined,
852 because it would render the measurements invalid.
853
854
855 NOTE: care must be taken that the compiler doesn't try to "optimize" the
856 indirect jumps by sharing them between all opcodes. Such optimizations
857 can be disabled on gcc by using the -fno-gcse flag (or possibly
858 -fno-crossjumping).
859*/
860
Antoine Pitrou042b1282010-08-13 21:15:58 +0000861#ifdef DYNAMIC_EXECUTION_PROFILE
Antoine Pitroub52ec782009-01-25 16:34:23 +0000862#undef USE_COMPUTED_GOTOS
Antoine Pitrou042b1282010-08-13 21:15:58 +0000863#define USE_COMPUTED_GOTOS 0
Antoine Pitroub52ec782009-01-25 16:34:23 +0000864#endif
865
Antoine Pitrou042b1282010-08-13 21:15:58 +0000866#ifdef HAVE_COMPUTED_GOTOS
867 #ifndef USE_COMPUTED_GOTOS
868 #define USE_COMPUTED_GOTOS 1
869 #endif
870#else
871 #if defined(USE_COMPUTED_GOTOS) && USE_COMPUTED_GOTOS
872 #error "Computed gotos are not supported on this compiler."
873 #endif
874 #undef USE_COMPUTED_GOTOS
875 #define USE_COMPUTED_GOTOS 0
876#endif
877
878#if USE_COMPUTED_GOTOS
Antoine Pitroub52ec782009-01-25 16:34:23 +0000879/* Import the static jump table */
880#include "opcode_targets.h"
881
882/* This macro is used when several opcodes defer to the same implementation
883 (e.g. SETUP_LOOP, SETUP_FINALLY) */
884#define TARGET_WITH_IMPL(op, impl) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000885 TARGET_##op: \
886 opcode = op; \
887 if (HAS_ARG(op)) \
888 oparg = NEXTARG(); \
889 case op: \
890 goto impl; \
Antoine Pitroub52ec782009-01-25 16:34:23 +0000891
892#define TARGET(op) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000893 TARGET_##op: \
894 opcode = op; \
895 if (HAS_ARG(op)) \
896 oparg = NEXTARG(); \
897 case op:
Antoine Pitroub52ec782009-01-25 16:34:23 +0000898
899
900#define DISPATCH() \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000901 { \
902 if (!_Py_atomic_load_relaxed(&eval_breaker)) { \
903 FAST_DISPATCH(); \
904 } \
905 continue; \
906 }
Antoine Pitroub52ec782009-01-25 16:34:23 +0000907
908#ifdef LLTRACE
909#define FAST_DISPATCH() \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000910 { \
911 if (!lltrace && !_Py_TracingPossible) { \
912 f->f_lasti = INSTR_OFFSET(); \
913 goto *opcode_targets[*next_instr++]; \
914 } \
915 goto fast_next_opcode; \
916 }
Antoine Pitroub52ec782009-01-25 16:34:23 +0000917#else
918#define FAST_DISPATCH() \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000919 { \
920 if (!_Py_TracingPossible) { \
921 f->f_lasti = INSTR_OFFSET(); \
922 goto *opcode_targets[*next_instr++]; \
923 } \
924 goto fast_next_opcode; \
925 }
Antoine Pitroub52ec782009-01-25 16:34:23 +0000926#endif
927
928#else
929#define TARGET(op) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000930 case op:
Antoine Pitroub52ec782009-01-25 16:34:23 +0000931#define TARGET_WITH_IMPL(op, impl) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000932 /* silence compiler warnings about `impl` unused */ \
933 if (0) goto impl; \
934 case op:
Antoine Pitroub52ec782009-01-25 16:34:23 +0000935#define DISPATCH() continue
936#define FAST_DISPATCH() goto fast_next_opcode
937#endif
938
939
Neal Norwitza81d2202002-07-14 00:27:26 +0000940/* Tuple access macros */
941
942#ifndef Py_DEBUG
943#define GETITEM(v, i) PyTuple_GET_ITEM((PyTupleObject *)(v), (i))
944#else
945#define GETITEM(v, i) PyTuple_GetItem((v), (i))
946#endif
947
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000948#ifdef WITH_TSC
949/* Use Pentium timestamp counter to mark certain events:
950 inst0 -- beginning of switch statement for opcode dispatch
951 inst1 -- end of switch statement (may be skipped)
952 loop0 -- the top of the mainloop
Thomas Wouters477c8d52006-05-27 19:21:47 +0000953 loop1 -- place where control returns again to top of mainloop
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000954 (may be skipped)
955 intr1 -- beginning of long interruption
956 intr2 -- end of long interruption
957
958 Many opcodes call out to helper C functions. In some cases, the
959 time in those functions should be counted towards the time for the
960 opcode, but not in all cases. For example, a CALL_FUNCTION opcode
961 calls another Python function; there's no point in charge all the
962 bytecode executed by the called function to the caller.
963
964 It's hard to make a useful judgement statically. In the presence
965 of operator overloading, it's impossible to tell if a call will
966 execute new Python code or not.
967
968 It's a case-by-case judgement. I'll use intr1 for the following
969 cases:
970
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000971 IMPORT_STAR
972 IMPORT_FROM
973 CALL_FUNCTION (and friends)
974
975 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000976 uint64 inst0, inst1, loop0, loop1, intr0 = 0, intr1 = 0;
977 int ticked = 0;
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000978
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000979 READ_TIMESTAMP(inst0);
980 READ_TIMESTAMP(inst1);
981 READ_TIMESTAMP(loop0);
982 READ_TIMESTAMP(loop1);
Michael W. Hudson800ba232004-08-12 18:19:17 +0000983
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000984 /* shut up the compiler */
985 opcode = 0;
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000986#endif
987
Guido van Rossum374a9221991-04-04 10:40:29 +0000988/* Code access macros */
989
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000990#define INSTR_OFFSET() ((int)(next_instr - first_instr))
991#define NEXTOP() (*next_instr++)
992#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
993#define PEEKARG() ((next_instr[2]<<8) + next_instr[1])
994#define JUMPTO(x) (next_instr = first_instr + (x))
995#define JUMPBY(x) (next_instr += (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000996
Raymond Hettingerf606f872003-03-16 03:11:04 +0000997/* OpCode prediction macros
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000998 Some opcodes tend to come in pairs thus making it possible to
999 predict the second code when the first is run. For example,
1000 COMPARE_OP is often followed by JUMP_IF_FALSE or JUMP_IF_TRUE. And,
1001 those opcodes are often followed by a POP_TOP.
Raymond Hettingerf606f872003-03-16 03:11:04 +00001002
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001003 Verifying the prediction costs a single high-speed test of a register
1004 variable against a constant. If the pairing was good, then the
1005 processor's own internal branch predication has a high likelihood of
1006 success, resulting in a nearly zero-overhead transition to the
1007 next opcode. A successful prediction saves a trip through the eval-loop
1008 including its two unpredictable branches, the HAS_ARG test and the
1009 switch-case. Combined with the processor's internal branch prediction,
1010 a successful PREDICT has the effect of making the two opcodes run as if
1011 they were a single new opcode with the bodies combined.
Raymond Hettingerf606f872003-03-16 03:11:04 +00001012
Georg Brandl86b2fb92008-07-16 03:43:04 +00001013 If collecting opcode statistics, your choices are to either keep the
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001014 predictions turned-on and interpret the results as if some opcodes
1015 had been combined or turn-off predictions so that the opcode frequency
1016 counter updates for both opcodes.
Antoine Pitroub52ec782009-01-25 16:34:23 +00001017
1018 Opcode prediction is disabled with threaded code, since the latter allows
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001019 the CPU to record separate branch prediction information for each
1020 opcode.
Antoine Pitroub52ec782009-01-25 16:34:23 +00001021
Raymond Hettingerf606f872003-03-16 03:11:04 +00001022*/
1023
Antoine Pitrou042b1282010-08-13 21:15:58 +00001024#if defined(DYNAMIC_EXECUTION_PROFILE) || USE_COMPUTED_GOTOS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001025#define PREDICT(op) if (0) goto PRED_##op
1026#define PREDICTED(op) PRED_##op:
1027#define PREDICTED_WITH_ARG(op) PRED_##op:
Raymond Hettingera7216982004-02-08 19:59:27 +00001028#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001029#define PREDICT(op) if (*next_instr == op) goto PRED_##op
1030#define PREDICTED(op) PRED_##op: next_instr++
1031#define PREDICTED_WITH_ARG(op) PRED_##op: oparg = PEEKARG(); next_instr += 3
Antoine Pitroub52ec782009-01-25 16:34:23 +00001032#endif
1033
Raymond Hettingerf606f872003-03-16 03:11:04 +00001034
Guido van Rossum374a9221991-04-04 10:40:29 +00001035/* Stack manipulation macros */
1036
Martin v. Löwis18e16552006-02-15 17:27:45 +00001037/* The stack can grow at most MAXINT deep, as co_nlocals and
1038 co_stacksize are ints. */
Stefan Krahb7e10102010-06-23 18:42:39 +00001039#define STACK_LEVEL() ((int)(stack_pointer - f->f_valuestack))
1040#define EMPTY() (STACK_LEVEL() == 0)
1041#define TOP() (stack_pointer[-1])
1042#define SECOND() (stack_pointer[-2])
1043#define THIRD() (stack_pointer[-3])
1044#define FOURTH() (stack_pointer[-4])
1045#define PEEK(n) (stack_pointer[-(n)])
1046#define SET_TOP(v) (stack_pointer[-1] = (v))
1047#define SET_SECOND(v) (stack_pointer[-2] = (v))
1048#define SET_THIRD(v) (stack_pointer[-3] = (v))
1049#define SET_FOURTH(v) (stack_pointer[-4] = (v))
1050#define SET_VALUE(n, v) (stack_pointer[-(n)] = (v))
1051#define BASIC_STACKADJ(n) (stack_pointer += n)
1052#define BASIC_PUSH(v) (*stack_pointer++ = (v))
1053#define BASIC_POP() (*--stack_pointer)
Guido van Rossum374a9221991-04-04 10:40:29 +00001054
Guido van Rossum96a42c81992-01-12 02:29:51 +00001055#ifdef LLTRACE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001056#define PUSH(v) { (void)(BASIC_PUSH(v), \
Stefan Krahb7e10102010-06-23 18:42:39 +00001057 lltrace && prtrace(TOP(), "push")); \
1058 assert(STACK_LEVEL() <= co->co_stacksize); }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001059#define POP() ((void)(lltrace && prtrace(TOP(), "pop")), \
Stefan Krahb7e10102010-06-23 18:42:39 +00001060 BASIC_POP())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001061#define STACKADJ(n) { (void)(BASIC_STACKADJ(n), \
Stefan Krahb7e10102010-06-23 18:42:39 +00001062 lltrace && prtrace(TOP(), "stackadj")); \
1063 assert(STACK_LEVEL() <= co->co_stacksize); }
Christian Heimes0449f632007-12-15 01:27:15 +00001064#define EXT_POP(STACK_POINTER) ((void)(lltrace && \
Stefan Krahb7e10102010-06-23 18:42:39 +00001065 prtrace((STACK_POINTER)[-1], "ext_pop")), \
1066 *--(STACK_POINTER))
Guido van Rossum374a9221991-04-04 10:40:29 +00001067#else
Stefan Krahb7e10102010-06-23 18:42:39 +00001068#define PUSH(v) BASIC_PUSH(v)
1069#define POP() BASIC_POP()
1070#define STACKADJ(n) BASIC_STACKADJ(n)
Guido van Rossumc2e20742006-02-27 22:32:47 +00001071#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
Guido van Rossum374a9221991-04-04 10:40:29 +00001072#endif
1073
Guido van Rossum681d79a1995-07-18 14:51:37 +00001074/* Local variable macros */
1075
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001076#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumcfbf1a32002-03-28 20:17:52 +00001077
1078/* The SETLOCAL() macro must not DECREF the local variable in-place and
1079 then store the new value; it must copy the old value to a temporary
1080 value, then store the new value, and then DECREF the temporary value.
1081 This is because it is possible that during the DECREF the frame is
1082 accessed by other code (e.g. a __del__ method or gc.collect()) and the
1083 variable would be pointing to already-freed memory. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001084#define SETLOCAL(i, value) do { PyObject *tmp = GETLOCAL(i); \
Stefan Krahb7e10102010-06-23 18:42:39 +00001085 GETLOCAL(i) = value; \
1086 Py_XDECREF(tmp); } while (0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00001087
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001088
1089#define UNWIND_BLOCK(b) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001090 while (STACK_LEVEL() > (b)->b_level) { \
1091 PyObject *v = POP(); \
1092 Py_XDECREF(v); \
1093 }
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001094
1095#define UNWIND_EXCEPT_HANDLER(b) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001096 { \
1097 PyObject *type, *value, *traceback; \
1098 assert(STACK_LEVEL() >= (b)->b_level + 3); \
1099 while (STACK_LEVEL() > (b)->b_level + 3) { \
1100 value = POP(); \
1101 Py_XDECREF(value); \
1102 } \
1103 type = tstate->exc_type; \
1104 value = tstate->exc_value; \
1105 traceback = tstate->exc_traceback; \
1106 tstate->exc_type = POP(); \
1107 tstate->exc_value = POP(); \
1108 tstate->exc_traceback = POP(); \
1109 Py_XDECREF(type); \
1110 Py_XDECREF(value); \
1111 Py_XDECREF(traceback); \
1112 }
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001113
Guido van Rossuma027efa1997-05-05 20:56:21 +00001114/* Start of code */
1115
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001116 /* push frame */
1117 if (Py_EnterRecursiveCall(""))
1118 return NULL;
Guido van Rossum8861b741996-07-30 16:49:37 +00001119
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001120 tstate->frame = f;
Tim Peters5ca576e2001-06-18 22:08:13 +00001121
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001122 if (tstate->use_tracing) {
1123 if (tstate->c_tracefunc != NULL) {
1124 /* tstate->c_tracefunc, if defined, is a
1125 function that will be called on *every* entry
1126 to a code block. Its return value, if not
1127 None, is a function that will be called at
1128 the start of each executed line of code.
1129 (Actually, the function must return itself
1130 in order to continue tracing.) The trace
1131 functions are called with three arguments:
1132 a pointer to the current frame, a string
1133 indicating why the function is called, and
1134 an argument which depends on the situation.
1135 The global trace function is also called
1136 whenever an exception is detected. */
1137 if (call_trace_protected(tstate->c_tracefunc,
1138 tstate->c_traceobj,
1139 f, PyTrace_CALL, Py_None)) {
1140 /* Trace function raised an error */
1141 goto exit_eval_frame;
1142 }
1143 }
1144 if (tstate->c_profilefunc != NULL) {
1145 /* Similar for c_profilefunc, except it needn't
1146 return itself and isn't called for "line" events */
1147 if (call_trace_protected(tstate->c_profilefunc,
1148 tstate->c_profileobj,
1149 f, PyTrace_CALL, Py_None)) {
1150 /* Profile function raised an error */
1151 goto exit_eval_frame;
1152 }
1153 }
1154 }
Neil Schemenauer6c0f2002001-09-04 19:03:35 +00001155
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001156 co = f->f_code;
1157 names = co->co_names;
1158 consts = co->co_consts;
1159 fastlocals = f->f_localsplus;
1160 freevars = f->f_localsplus + co->co_nlocals;
1161 first_instr = (unsigned char*) PyBytes_AS_STRING(co->co_code);
1162 /* An explanation is in order for the next line.
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001163
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001164 f->f_lasti now refers to the index of the last instruction
1165 executed. You might think this was obvious from the name, but
1166 this wasn't always true before 2.3! PyFrame_New now sets
1167 f->f_lasti to -1 (i.e. the index *before* the first instruction)
1168 and YIELD_VALUE doesn't fiddle with f_lasti any more. So this
1169 does work. Promise.
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05001170 YIELD_FROM sets f_lasti to itself, in order to repeated yield
1171 multiple values.
Thomas Wouters902d6eb2007-01-09 23:18:33 +00001172
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001173 When the PREDICT() macros are enabled, some opcode pairs follow in
1174 direct succession without updating f->f_lasti. A successful
1175 prediction effectively links the two codes together as if they
1176 were a single new opcode; accordingly,f->f_lasti will point to
1177 the first code in the pair (for instance, GET_ITER followed by
1178 FOR_ITER is effectively a single opcode and f->f_lasti will point
1179 at to the beginning of the combined pair.)
1180 */
1181 next_instr = first_instr + f->f_lasti + 1;
1182 stack_pointer = f->f_stacktop;
1183 assert(stack_pointer != NULL);
1184 f->f_stacktop = NULL; /* remains NULL unless yield suspends frame */
Antoine Pitrou58720d62013-08-05 23:26:40 +02001185 f->f_executing = 1;
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001186
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001187 if (co->co_flags & CO_GENERATOR && !throwflag) {
1188 if (f->f_exc_type != NULL && f->f_exc_type != Py_None) {
1189 /* We were in an except handler when we left,
1190 restore the exception state which was put aside
1191 (see YIELD_VALUE). */
Benjamin Peterson87880242011-07-03 16:48:31 -05001192 swap_exc_state(tstate, f);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001193 }
Benjamin Peterson87880242011-07-03 16:48:31 -05001194 else
1195 save_exc_state(tstate, f);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001196 }
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001197
Tim Peters5ca576e2001-06-18 22:08:13 +00001198#ifdef LLTRACE
Victor Stinner3c1e4812012-03-26 22:10:51 +02001199 lltrace = _PyDict_GetItemId(f->f_globals, &PyId___ltrace__) != NULL;
Tim Peters5ca576e2001-06-18 22:08:13 +00001200#endif
Guido van Rossumac7be682001-01-17 15:42:30 +00001201
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001202 why = WHY_NOT;
Guido van Rossumac7be682001-01-17 15:42:30 +00001203
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001204 if (throwflag) /* support for generator.throw() */
1205 goto error;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001206
Victor Stinnerace47d72013-07-18 01:41:08 +02001207#ifdef Py_DEBUG
1208 /* PyEval_EvalFrameEx() must not be called with an exception set,
1209 because it may clear it (directly or indirectly) and so the
1210 caller looses its exception */
1211 assert(!PyErr_Occurred());
1212#endif
1213
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001214 for (;;) {
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00001215#ifdef WITH_TSC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001216 if (inst1 == 0) {
1217 /* Almost surely, the opcode executed a break
1218 or a continue, preventing inst1 from being set
1219 on the way out of the loop.
1220 */
1221 READ_TIMESTAMP(inst1);
1222 loop1 = inst1;
1223 }
1224 dump_tsc(opcode, ticked, inst0, inst1, loop0, loop1,
1225 intr0, intr1);
1226 ticked = 0;
1227 inst1 = 0;
1228 intr0 = 0;
1229 intr1 = 0;
1230 READ_TIMESTAMP(loop0);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00001231#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001232 assert(stack_pointer >= f->f_valuestack); /* else underflow */
1233 assert(STACK_LEVEL() <= co->co_stacksize); /* else overflow */
Victor Stinnerace47d72013-07-18 01:41:08 +02001234 assert(!PyErr_Occurred());
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001235
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001236 /* Do periodic things. Doing this every time through
1237 the loop would add too much overhead, so we do it
1238 only every Nth instruction. We also do it if
1239 ``pendingcalls_to_do'' is set, i.e. when an asynchronous
1240 event needs attention (e.g. a signal handler or
1241 async I/O handler); see Py_AddPendingCall() and
1242 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +00001243
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001244 if (_Py_atomic_load_relaxed(&eval_breaker)) {
1245 if (*next_instr == SETUP_FINALLY) {
1246 /* Make the last opcode before
Ezio Melotti13925002011-03-16 11:05:33 +02001247 a try: finally: block uninterruptible. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001248 goto fast_next_opcode;
1249 }
1250 tstate->tick_counter++;
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00001251#ifdef WITH_TSC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001252 ticked = 1;
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00001253#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001254 if (_Py_atomic_load_relaxed(&pendingcalls_to_do)) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001255 if (Py_MakePendingCalls() < 0)
1256 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001257 }
Guido van Rossume59214e1994-08-30 08:01:59 +00001258#ifdef WITH_THREAD
Benjamin Petersond2be5b42010-09-10 22:47:02 +00001259 if (_Py_atomic_load_relaxed(&gil_drop_request)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001260 /* Give another thread a chance */
1261 if (PyThreadState_Swap(NULL) != tstate)
1262 Py_FatalError("ceval: tstate mix-up");
1263 drop_gil(tstate);
1264
1265 /* Other threads may run now */
1266
1267 take_gil(tstate);
1268 if (PyThreadState_Swap(tstate) != NULL)
1269 Py_FatalError("ceval: orphan tstate");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001270 }
Benjamin Petersond2be5b42010-09-10 22:47:02 +00001271#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001272 /* Check for asynchronous exceptions. */
1273 if (tstate->async_exc != NULL) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001274 PyObject *exc = tstate->async_exc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001275 tstate->async_exc = NULL;
1276 UNSIGNAL_ASYNC_EXC();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001277 PyErr_SetNone(exc);
1278 Py_DECREF(exc);
1279 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001280 }
1281 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001282
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001283 fast_next_opcode:
1284 f->f_lasti = INSTR_OFFSET();
Guido van Rossumac7be682001-01-17 15:42:30 +00001285
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001286 /* line-by-line tracing support */
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001287
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001288 if (_Py_TracingPossible &&
Benjamin Peterson51f46162013-01-23 08:38:47 -05001289 tstate->c_tracefunc != NULL && !tstate->tracing) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001290 int err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001291 /* see maybe_call_line_trace
1292 for expository comments */
1293 f->f_stacktop = stack_pointer;
Tim Peters8a5c3c72004-04-05 19:36:21 +00001294
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001295 err = maybe_call_line_trace(tstate->c_tracefunc,
1296 tstate->c_traceobj,
1297 f, &instr_lb, &instr_ub,
1298 &instr_prev);
1299 /* Reload possibly changed frame fields */
1300 JUMPTO(f->f_lasti);
1301 if (f->f_stacktop != NULL) {
1302 stack_pointer = f->f_stacktop;
1303 f->f_stacktop = NULL;
1304 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001305 if (err)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001306 /* trace function raised an exception */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001307 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001308 }
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001309
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001310 /* Extract opcode and argument */
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001311
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001312 opcode = NEXTOP();
1313 oparg = 0; /* allows oparg to be stored in a register because
1314 it doesn't have to be remembered across a full loop */
1315 if (HAS_ARG(opcode))
1316 oparg = NEXTARG();
Stefan Krahb7e10102010-06-23 18:42:39 +00001317 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +00001318#ifdef DYNAMIC_EXECUTION_PROFILE
1319#ifdef DXPAIRS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001320 dxpairs[lastopcode][opcode]++;
1321 lastopcode = opcode;
Guido van Rossum950361c1997-01-24 13:49:28 +00001322#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001323 dxp[opcode]++;
Guido van Rossum950361c1997-01-24 13:49:28 +00001324#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001325
Guido van Rossum96a42c81992-01-12 02:29:51 +00001326#ifdef LLTRACE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001327 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +00001328
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001329 if (lltrace) {
1330 if (HAS_ARG(opcode)) {
1331 printf("%d: %d, %d\n",
1332 f->f_lasti, opcode, oparg);
1333 }
1334 else {
1335 printf("%d: %d\n",
1336 f->f_lasti, opcode);
1337 }
1338 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001339#endif
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001340
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001341 /* Main switch on opcode */
1342 READ_TIMESTAMP(inst0);
Jeremy Hylton52820442001-01-03 23:52:36 +00001343
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001344 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +00001345
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001346 /* BEWARE!
1347 It is essential that any operation that fails sets either
1348 x to NULL, err to nonzero, or why to anything but WHY_NOT,
1349 and that no operation that succeeds does this! */
Guido van Rossumac7be682001-01-17 15:42:30 +00001350
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001351 TARGET(NOP)
1352 FAST_DISPATCH();
Raymond Hettinger9c18e812004-06-21 16:31:15 +00001353
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001354 TARGET(LOAD_FAST) {
1355 PyObject *value = GETLOCAL(oparg);
1356 if (value == NULL) {
1357 format_exc_check_arg(PyExc_UnboundLocalError,
1358 UNBOUNDLOCAL_ERROR_MSG,
1359 PyTuple_GetItem(co->co_varnames, oparg));
1360 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001361 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001362 Py_INCREF(value);
1363 PUSH(value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001364 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001365 }
1366
1367 TARGET(LOAD_CONST) {
1368 PyObject *value = GETITEM(consts, oparg);
1369 Py_INCREF(value);
1370 PUSH(value);
1371 FAST_DISPATCH();
1372 }
Neil Schemenauer63543862002-02-17 19:10:14 +00001373
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001374 PREDICTED_WITH_ARG(STORE_FAST);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001375 TARGET(STORE_FAST) {
1376 PyObject *value = POP();
1377 SETLOCAL(oparg, value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001378 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001379 }
Neil Schemenauer63543862002-02-17 19:10:14 +00001380
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001381 TARGET(POP_TOP) {
1382 PyObject *value = POP();
1383 Py_DECREF(value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001384 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001385 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001386
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001387 TARGET(ROT_TWO) {
1388 PyObject *top = TOP();
1389 PyObject *second = SECOND();
1390 SET_TOP(second);
1391 SET_SECOND(top);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001392 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001393 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001394
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001395 TARGET(ROT_THREE) {
1396 PyObject *top = TOP();
1397 PyObject *second = SECOND();
1398 PyObject *third = THIRD();
1399 SET_TOP(second);
1400 SET_SECOND(third);
1401 SET_THIRD(top);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001402 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001403 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001404
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001405 TARGET(DUP_TOP) {
1406 PyObject *top = TOP();
1407 Py_INCREF(top);
1408 PUSH(top);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001409 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001410 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001411
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001412 TARGET(DUP_TOP_TWO) {
1413 PyObject *top = TOP();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001414 PyObject *second = SECOND();
Benjamin Petersonf208df32012-10-12 11:37:56 -04001415 Py_INCREF(top);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001416 Py_INCREF(second);
Antoine Pitrou74a69fa2010-09-04 18:43:52 +00001417 STACKADJ(2);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001418 SET_TOP(top);
1419 SET_SECOND(second);
Antoine Pitrou74a69fa2010-09-04 18:43:52 +00001420 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001421 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001422
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001423 TARGET(UNARY_POSITIVE) {
1424 PyObject *value = TOP();
1425 PyObject *res = PyNumber_Positive(value);
1426 Py_DECREF(value);
1427 SET_TOP(res);
1428 if (res == NULL)
1429 goto error;
1430 DISPATCH();
1431 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001432
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001433 TARGET(UNARY_NEGATIVE) {
1434 PyObject *value = TOP();
1435 PyObject *res = PyNumber_Negative(value);
1436 Py_DECREF(value);
1437 SET_TOP(res);
1438 if (res == NULL)
1439 goto error;
1440 DISPATCH();
1441 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001442
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001443 TARGET(UNARY_NOT) {
1444 PyObject *value = TOP();
1445 int err = PyObject_IsTrue(value);
1446 Py_DECREF(value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001447 if (err == 0) {
1448 Py_INCREF(Py_True);
1449 SET_TOP(Py_True);
1450 DISPATCH();
1451 }
1452 else if (err > 0) {
1453 Py_INCREF(Py_False);
1454 SET_TOP(Py_False);
1455 err = 0;
1456 DISPATCH();
1457 }
1458 STACKADJ(-1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001459 goto error;
1460 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001461
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001462 TARGET(UNARY_INVERT) {
1463 PyObject *value = TOP();
1464 PyObject *res = PyNumber_Invert(value);
1465 Py_DECREF(value);
1466 SET_TOP(res);
1467 if (res == NULL)
1468 goto error;
1469 DISPATCH();
1470 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001471
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001472 TARGET(BINARY_POWER) {
1473 PyObject *exp = POP();
1474 PyObject *base = TOP();
1475 PyObject *res = PyNumber_Power(base, exp, Py_None);
1476 Py_DECREF(base);
1477 Py_DECREF(exp);
1478 SET_TOP(res);
1479 if (res == NULL)
1480 goto error;
1481 DISPATCH();
1482 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001483
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001484 TARGET(BINARY_MULTIPLY) {
1485 PyObject *right = POP();
1486 PyObject *left = TOP();
1487 PyObject *res = PyNumber_Multiply(left, right);
1488 Py_DECREF(left);
1489 Py_DECREF(right);
1490 SET_TOP(res);
1491 if (res == NULL)
1492 goto error;
1493 DISPATCH();
1494 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001495
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001496 TARGET(BINARY_TRUE_DIVIDE) {
1497 PyObject *divisor = POP();
1498 PyObject *dividend = TOP();
1499 PyObject *quotient = PyNumber_TrueDivide(dividend, divisor);
1500 Py_DECREF(dividend);
1501 Py_DECREF(divisor);
1502 SET_TOP(quotient);
1503 if (quotient == NULL)
1504 goto error;
1505 DISPATCH();
1506 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001507
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001508 TARGET(BINARY_FLOOR_DIVIDE) {
1509 PyObject *divisor = POP();
1510 PyObject *dividend = TOP();
1511 PyObject *quotient = PyNumber_FloorDivide(dividend, divisor);
1512 Py_DECREF(dividend);
1513 Py_DECREF(divisor);
1514 SET_TOP(quotient);
1515 if (quotient == NULL)
1516 goto error;
1517 DISPATCH();
1518 }
Guido van Rossum4668b002001-08-08 05:00:18 +00001519
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001520 TARGET(BINARY_MODULO) {
1521 PyObject *divisor = POP();
1522 PyObject *dividend = TOP();
1523 PyObject *res = PyUnicode_CheckExact(dividend) ?
1524 PyUnicode_Format(dividend, divisor) :
1525 PyNumber_Remainder(dividend, divisor);
1526 Py_DECREF(divisor);
1527 Py_DECREF(dividend);
1528 SET_TOP(res);
1529 if (res == NULL)
1530 goto error;
1531 DISPATCH();
1532 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001533
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001534 TARGET(BINARY_ADD) {
1535 PyObject *right = POP();
1536 PyObject *left = TOP();
1537 PyObject *sum;
1538 if (PyUnicode_CheckExact(left) &&
1539 PyUnicode_CheckExact(right)) {
1540 sum = unicode_concatenate(left, right, f, next_instr);
Victor Stinnerd2a915d2011-10-02 20:34:20 +02001541 /* unicode_concatenate consumed the ref to v */
Victor Stinnerd2a915d2011-10-02 20:34:20 +02001542 }
1543 else {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001544 sum = PyNumber_Add(left, right);
1545 Py_DECREF(left);
Victor Stinnerd2a915d2011-10-02 20:34:20 +02001546 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001547 Py_DECREF(right);
1548 SET_TOP(sum);
1549 if (sum == NULL)
1550 goto error;
1551 DISPATCH();
1552 }
1553
1554 TARGET(BINARY_SUBTRACT) {
1555 PyObject *right = POP();
1556 PyObject *left = TOP();
1557 PyObject *diff = PyNumber_Subtract(left, right);
1558 Py_DECREF(right);
1559 Py_DECREF(left);
1560 SET_TOP(diff);
1561 if (diff == NULL)
1562 goto error;
1563 DISPATCH();
1564 }
1565
1566 TARGET(BINARY_SUBSCR) {
1567 PyObject *sub = POP();
1568 PyObject *container = TOP();
1569 PyObject *res = PyObject_GetItem(container, sub);
1570 Py_DECREF(container);
1571 Py_DECREF(sub);
1572 SET_TOP(res);
1573 if (res == NULL)
1574 goto error;
1575 DISPATCH();
1576 }
1577
1578 TARGET(BINARY_LSHIFT) {
1579 PyObject *right = POP();
1580 PyObject *left = TOP();
1581 PyObject *res = PyNumber_Lshift(left, right);
1582 Py_DECREF(left);
1583 Py_DECREF(right);
1584 SET_TOP(res);
1585 if (res == NULL)
1586 goto error;
1587 DISPATCH();
1588 }
1589
1590 TARGET(BINARY_RSHIFT) {
1591 PyObject *right = POP();
1592 PyObject *left = TOP();
1593 PyObject *res = PyNumber_Rshift(left, right);
1594 Py_DECREF(left);
1595 Py_DECREF(right);
1596 SET_TOP(res);
1597 if (res == NULL)
1598 goto error;
1599 DISPATCH();
1600 }
1601
1602 TARGET(BINARY_AND) {
1603 PyObject *right = POP();
1604 PyObject *left = TOP();
1605 PyObject *res = PyNumber_And(left, right);
1606 Py_DECREF(left);
1607 Py_DECREF(right);
1608 SET_TOP(res);
1609 if (res == NULL)
1610 goto error;
1611 DISPATCH();
1612 }
1613
1614 TARGET(BINARY_XOR) {
1615 PyObject *right = POP();
1616 PyObject *left = TOP();
1617 PyObject *res = PyNumber_Xor(left, right);
1618 Py_DECREF(left);
1619 Py_DECREF(right);
1620 SET_TOP(res);
1621 if (res == NULL)
1622 goto error;
1623 DISPATCH();
1624 }
1625
1626 TARGET(BINARY_OR) {
1627 PyObject *right = POP();
1628 PyObject *left = TOP();
1629 PyObject *res = PyNumber_Or(left, right);
1630 Py_DECREF(left);
1631 Py_DECREF(right);
1632 SET_TOP(res);
1633 if (res == NULL)
1634 goto error;
1635 DISPATCH();
1636 }
1637
1638 TARGET(LIST_APPEND) {
1639 PyObject *v = POP();
1640 PyObject *list = PEEK(oparg);
1641 int err;
1642 err = PyList_Append(list, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001643 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001644 if (err != 0)
1645 goto error;
1646 PREDICT(JUMP_ABSOLUTE);
1647 DISPATCH();
1648 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001649
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001650 TARGET(SET_ADD) {
1651 PyObject *v = POP();
1652 PyObject *set = stack_pointer[-oparg];
1653 int err;
1654 err = PySet_Add(set, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001655 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001656 if (err != 0)
1657 goto error;
1658 PREDICT(JUMP_ABSOLUTE);
1659 DISPATCH();
1660 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001661
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001662 TARGET(INPLACE_POWER) {
1663 PyObject *exp = POP();
1664 PyObject *base = TOP();
1665 PyObject *res = PyNumber_InPlacePower(base, exp, Py_None);
1666 Py_DECREF(base);
1667 Py_DECREF(exp);
1668 SET_TOP(res);
1669 if (res == NULL)
1670 goto error;
1671 DISPATCH();
1672 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001673
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001674 TARGET(INPLACE_MULTIPLY) {
1675 PyObject *right = POP();
1676 PyObject *left = TOP();
1677 PyObject *res = PyNumber_InPlaceMultiply(left, right);
1678 Py_DECREF(left);
1679 Py_DECREF(right);
1680 SET_TOP(res);
1681 if (res == NULL)
1682 goto error;
1683 DISPATCH();
1684 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001685
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001686 TARGET(INPLACE_TRUE_DIVIDE) {
1687 PyObject *divisor = POP();
1688 PyObject *dividend = TOP();
1689 PyObject *quotient = PyNumber_InPlaceTrueDivide(dividend, divisor);
1690 Py_DECREF(dividend);
1691 Py_DECREF(divisor);
1692 SET_TOP(quotient);
1693 if (quotient == NULL)
1694 goto error;
1695 DISPATCH();
1696 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001697
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001698 TARGET(INPLACE_FLOOR_DIVIDE) {
1699 PyObject *divisor = POP();
1700 PyObject *dividend = TOP();
1701 PyObject *quotient = PyNumber_InPlaceFloorDivide(dividend, divisor);
1702 Py_DECREF(dividend);
1703 Py_DECREF(divisor);
1704 SET_TOP(quotient);
1705 if (quotient == NULL)
1706 goto error;
1707 DISPATCH();
1708 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001709
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001710 TARGET(INPLACE_MODULO) {
1711 PyObject *right = POP();
1712 PyObject *left = TOP();
1713 PyObject *mod = PyNumber_InPlaceRemainder(left, right);
1714 Py_DECREF(left);
1715 Py_DECREF(right);
1716 SET_TOP(mod);
1717 if (mod == NULL)
1718 goto error;
1719 DISPATCH();
1720 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001721
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001722 TARGET(INPLACE_ADD) {
1723 PyObject *right = POP();
1724 PyObject *left = TOP();
1725 PyObject *sum;
1726 if (PyUnicode_CheckExact(left) && PyUnicode_CheckExact(right)) {
1727 sum = unicode_concatenate(left, right, f, next_instr);
Victor Stinnerd2a915d2011-10-02 20:34:20 +02001728 /* unicode_concatenate consumed the ref to v */
Victor Stinnerd2a915d2011-10-02 20:34:20 +02001729 }
1730 else {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001731 sum = PyNumber_InPlaceAdd(left, right);
1732 Py_DECREF(left);
Victor Stinnerd2a915d2011-10-02 20:34:20 +02001733 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001734 Py_DECREF(right);
1735 SET_TOP(sum);
1736 if (sum == NULL)
1737 goto error;
1738 DISPATCH();
1739 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001740
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001741 TARGET(INPLACE_SUBTRACT) {
1742 PyObject *right = POP();
1743 PyObject *left = TOP();
1744 PyObject *diff = PyNumber_InPlaceSubtract(left, right);
1745 Py_DECREF(left);
1746 Py_DECREF(right);
1747 SET_TOP(diff);
1748 if (diff == NULL)
1749 goto error;
1750 DISPATCH();
1751 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001752
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001753 TARGET(INPLACE_LSHIFT) {
1754 PyObject *right = POP();
1755 PyObject *left = TOP();
1756 PyObject *res = PyNumber_InPlaceLshift(left, right);
1757 Py_DECREF(left);
1758 Py_DECREF(right);
1759 SET_TOP(res);
1760 if (res == NULL)
1761 goto error;
1762 DISPATCH();
1763 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001764
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001765 TARGET(INPLACE_RSHIFT) {
1766 PyObject *right = POP();
1767 PyObject *left = TOP();
1768 PyObject *res = PyNumber_InPlaceRshift(left, right);
1769 Py_DECREF(left);
1770 Py_DECREF(right);
1771 SET_TOP(res);
1772 if (res == NULL)
1773 goto error;
1774 DISPATCH();
1775 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001776
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001777 TARGET(INPLACE_AND) {
1778 PyObject *right = POP();
1779 PyObject *left = TOP();
1780 PyObject *res = PyNumber_InPlaceAnd(left, right);
1781 Py_DECREF(left);
1782 Py_DECREF(right);
1783 SET_TOP(res);
1784 if (res == NULL)
1785 goto error;
1786 DISPATCH();
1787 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001788
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001789 TARGET(INPLACE_XOR) {
1790 PyObject *right = POP();
1791 PyObject *left = TOP();
1792 PyObject *res = PyNumber_InPlaceXor(left, right);
1793 Py_DECREF(left);
1794 Py_DECREF(right);
1795 SET_TOP(res);
1796 if (res == NULL)
1797 goto error;
1798 DISPATCH();
1799 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001800
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001801 TARGET(INPLACE_OR) {
1802 PyObject *right = POP();
1803 PyObject *left = TOP();
1804 PyObject *res = PyNumber_InPlaceOr(left, right);
1805 Py_DECREF(left);
1806 Py_DECREF(right);
1807 SET_TOP(res);
1808 if (res == NULL)
1809 goto error;
1810 DISPATCH();
1811 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001812
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001813 TARGET(STORE_SUBSCR) {
1814 PyObject *sub = TOP();
1815 PyObject *container = SECOND();
1816 PyObject *v = THIRD();
1817 int err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001818 STACKADJ(-3);
1819 /* v[w] = u */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001820 err = PyObject_SetItem(container, sub, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001821 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001822 Py_DECREF(container);
1823 Py_DECREF(sub);
1824 if (err != 0)
1825 goto error;
1826 DISPATCH();
1827 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001828
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001829 TARGET(DELETE_SUBSCR) {
1830 PyObject *sub = TOP();
1831 PyObject *container = SECOND();
1832 int err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001833 STACKADJ(-2);
1834 /* del v[w] */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001835 err = PyObject_DelItem(container, sub);
1836 Py_DECREF(container);
1837 Py_DECREF(sub);
1838 if (err != 0)
1839 goto error;
1840 DISPATCH();
1841 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001842
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001843 TARGET(PRINT_EXPR) {
1844 PyObject *value = POP();
1845 PyObject *hook = PySys_GetObject("displayhook");
Benjamin Petersonfe1bcb62012-10-12 11:40:01 -04001846 PyObject *res;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001847 if (hook == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001848 PyErr_SetString(PyExc_RuntimeError,
1849 "lost sys.displayhook");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001850 Py_DECREF(value);
1851 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001852 }
Benjamin Petersonfe1bcb62012-10-12 11:40:01 -04001853 res = PyObject_CallFunctionObjArgs(hook, value, NULL);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001854 Py_DECREF(value);
1855 if (res == NULL)
1856 goto error;
1857 Py_DECREF(res);
1858 DISPATCH();
1859 }
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001860
Thomas Wouters434d0822000-08-24 20:11:32 +00001861#ifdef CASE_TOO_BIG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001862 default: switch (opcode) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001863#endif
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001864 TARGET(RAISE_VARARGS) {
1865 PyObject *cause = NULL, *exc = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001866 switch (oparg) {
1867 case 2:
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001868 cause = POP(); /* cause */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001869 case 1:
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001870 exc = POP(); /* exc */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001871 case 0: /* Fallthrough */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001872 if (do_raise(exc, cause)) {
1873 why = WHY_EXCEPTION;
1874 goto fast_block_end;
1875 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001876 break;
1877 default:
1878 PyErr_SetString(PyExc_SystemError,
1879 "bad RAISE_VARARGS oparg");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001880 break;
1881 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001882 goto error;
1883 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001884
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001885 TARGET(RETURN_VALUE) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001886 retval = POP();
1887 why = WHY_RETURN;
1888 goto fast_block_end;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001889 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001890
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001891 TARGET(YIELD_FROM) {
1892 PyObject *v = POP();
1893 PyObject *reciever = TOP();
1894 int err;
1895 if (PyGen_CheckExact(reciever)) {
1896 retval = _PyGen_Send((PyGenObject *)reciever, v);
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05001897 } else {
Benjamin Peterson302e7902012-03-20 23:17:04 -04001898 _Py_IDENTIFIER(send);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001899 if (v == Py_None)
1900 retval = Py_TYPE(reciever)->tp_iternext(reciever);
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05001901 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001902 retval = _PyObject_CallMethodId(reciever, &PyId_send, "O", v);
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05001903 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001904 Py_DECREF(v);
1905 if (retval == NULL) {
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05001906 PyObject *val;
Nick Coghlanc40bc092012-06-17 15:15:49 +10001907 err = _PyGen_FetchStopIterationValue(&val);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001908 if (err < 0)
1909 goto error;
1910 Py_DECREF(reciever);
1911 SET_TOP(val);
1912 DISPATCH();
Nick Coghlan1f7ce622012-01-13 21:43:40 +10001913 }
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05001914 /* x remains on stack, retval is value to be yielded */
Nick Coghlan1f7ce622012-01-13 21:43:40 +10001915 f->f_stacktop = stack_pointer;
1916 why = WHY_YIELD;
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05001917 /* and repeat... */
1918 f->f_lasti--;
Nick Coghlan1f7ce622012-01-13 21:43:40 +10001919 goto fast_yield;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001920 }
Nick Coghlan1f7ce622012-01-13 21:43:40 +10001921
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001922 TARGET(YIELD_VALUE) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001923 retval = POP();
1924 f->f_stacktop = stack_pointer;
1925 why = WHY_YIELD;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001926 goto fast_yield;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001927 }
Tim Peters5ca576e2001-06-18 22:08:13 +00001928
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001929 TARGET(POP_EXCEPT) {
1930 PyTryBlock *b = PyFrame_BlockPop(f);
1931 if (b->b_type != EXCEPT_HANDLER) {
1932 PyErr_SetString(PyExc_SystemError,
1933 "popped block is not an except handler");
1934 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001935 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001936 UNWIND_EXCEPT_HANDLER(b);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001937 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001938 }
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001939
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001940 TARGET(POP_BLOCK) {
1941 PyTryBlock *b = PyFrame_BlockPop(f);
1942 UNWIND_BLOCK(b);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001943 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001944 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001945
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001946 PREDICTED(END_FINALLY);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001947 TARGET(END_FINALLY) {
1948 PyObject *status = POP();
1949 if (PyLong_Check(status)) {
1950 why = (enum why_code) PyLong_AS_LONG(status);
1951 assert(why != WHY_YIELD && why != WHY_EXCEPTION);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001952 if (why == WHY_RETURN ||
1953 why == WHY_CONTINUE)
1954 retval = POP();
1955 if (why == WHY_SILENCED) {
1956 /* An exception was silenced by 'with', we must
1957 manually unwind the EXCEPT_HANDLER block which was
1958 created when the exception was caught, otherwise
1959 the stack will be in an inconsistent state. */
1960 PyTryBlock *b = PyFrame_BlockPop(f);
1961 assert(b->b_type == EXCEPT_HANDLER);
1962 UNWIND_EXCEPT_HANDLER(b);
1963 why = WHY_NOT;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001964 Py_DECREF(status);
1965 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001966 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001967 Py_DECREF(status);
1968 goto fast_block_end;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001969 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001970 else if (PyExceptionClass_Check(status)) {
1971 PyObject *exc = POP();
1972 PyObject *tb = POP();
1973 PyErr_Restore(status, exc, tb);
1974 why = WHY_EXCEPTION;
1975 goto fast_block_end;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001976 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001977 else if (status != Py_None) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001978 PyErr_SetString(PyExc_SystemError,
1979 "'finally' pops bad exception");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001980 Py_DECREF(status);
1981 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001982 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001983 Py_DECREF(status);
1984 DISPATCH();
1985 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001986
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001987 TARGET(LOAD_BUILD_CLASS) {
Victor Stinner3c1e4812012-03-26 22:10:51 +02001988 _Py_IDENTIFIER(__build_class__);
Victor Stinnerb0b22422012-04-19 00:57:45 +02001989
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001990 PyObject *bc;
Victor Stinnerb0b22422012-04-19 00:57:45 +02001991 if (PyDict_CheckExact(f->f_builtins)) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001992 bc = _PyDict_GetItemId(f->f_builtins, &PyId___build_class__);
1993 if (bc == NULL) {
Victor Stinnerb0b22422012-04-19 00:57:45 +02001994 PyErr_SetString(PyExc_NameError,
1995 "__build_class__ not found");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001996 goto error;
Victor Stinnerb0b22422012-04-19 00:57:45 +02001997 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001998 Py_INCREF(bc);
Victor Stinnerb0b22422012-04-19 00:57:45 +02001999 }
2000 else {
2001 PyObject *build_class_str = _PyUnicode_FromId(&PyId___build_class__);
2002 if (build_class_str == NULL)
2003 break;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002004 bc = PyObject_GetItem(f->f_builtins, build_class_str);
2005 if (bc == NULL) {
Victor Stinnerb0b22422012-04-19 00:57:45 +02002006 if (PyErr_ExceptionMatches(PyExc_KeyError))
2007 PyErr_SetString(PyExc_NameError,
2008 "__build_class__ not found");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002009 goto error;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002010 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002011 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002012 PUSH(bc);
Benjamin Peterson00f86f22012-10-10 14:10:33 -04002013 DISPATCH();
Victor Stinner3c1e4812012-03-26 22:10:51 +02002014 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002015
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002016 TARGET(STORE_NAME) {
2017 PyObject *name = GETITEM(names, oparg);
2018 PyObject *v = POP();
2019 PyObject *ns = f->f_locals;
2020 int err;
2021 if (ns == NULL) {
2022 PyErr_Format(PyExc_SystemError,
2023 "no locals found when storing %R", name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002024 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002025 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002026 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002027 if (PyDict_CheckExact(ns))
2028 err = PyDict_SetItem(ns, name, v);
2029 else
2030 err = PyObject_SetItem(ns, name, v);
2031 Py_DECREF(v);
2032 if (err != 0)
2033 goto error;
2034 DISPATCH();
2035 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002036
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002037 TARGET(DELETE_NAME) {
2038 PyObject *name = GETITEM(names, oparg);
2039 PyObject *ns = f->f_locals;
2040 int err;
2041 if (ns == NULL) {
2042 PyErr_Format(PyExc_SystemError,
2043 "no locals when deleting %R", name);
2044 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002045 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002046 err = PyObject_DelItem(ns, name);
2047 if (err != 0) {
2048 format_exc_check_arg(PyExc_NameError,
2049 NAME_ERROR_MSG,
2050 name);
2051 goto error;
2052 }
2053 DISPATCH();
2054 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00002055
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002056 PREDICTED_WITH_ARG(UNPACK_SEQUENCE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002057 TARGET(UNPACK_SEQUENCE) {
2058 PyObject *seq = POP(), *item, **items;
2059 if (PyTuple_CheckExact(seq) &&
2060 PyTuple_GET_SIZE(seq) == oparg) {
2061 items = ((PyTupleObject *)seq)->ob_item;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002062 while (oparg--) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002063 item = items[oparg];
2064 Py_INCREF(item);
2065 PUSH(item);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002066 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002067 } else if (PyList_CheckExact(seq) &&
2068 PyList_GET_SIZE(seq) == oparg) {
2069 items = ((PyListObject *)seq)->ob_item;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002070 while (oparg--) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002071 item = items[oparg];
2072 Py_INCREF(item);
2073 PUSH(item);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002074 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002075 } else if (unpack_iterable(seq, oparg, -1,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002076 stack_pointer + oparg)) {
2077 STACKADJ(oparg);
2078 } else {
2079 /* unpack_iterable() raised an exception */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002080 Py_DECREF(seq);
2081 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002082 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002083 Py_DECREF(seq);
Benjamin Peterson00f86f22012-10-10 14:10:33 -04002084 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002085 }
Guido van Rossum0368b722007-05-11 16:50:42 +00002086
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002087 TARGET(UNPACK_EX) {
2088 int totalargs = 1 + (oparg & 0xFF) + (oparg >> 8);
2089 PyObject *seq = POP();
2090
2091 if (unpack_iterable(seq, oparg & 0xFF, oparg >> 8,
2092 stack_pointer + totalargs)) {
2093 stack_pointer += totalargs;
2094 } else {
2095 Py_DECREF(seq);
2096 goto error;
2097 }
2098 Py_DECREF(seq);
2099 DISPATCH();
2100 }
2101
2102 TARGET(STORE_ATTR) {
2103 PyObject *name = GETITEM(names, oparg);
2104 PyObject *owner = TOP();
2105 PyObject *v = SECOND();
2106 int err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002107 STACKADJ(-2);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002108 err = PyObject_SetAttr(owner, name, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002109 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002110 Py_DECREF(owner);
2111 if (err != 0)
2112 goto error;
2113 DISPATCH();
2114 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002115
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002116 TARGET(DELETE_ATTR) {
2117 PyObject *name = GETITEM(names, oparg);
2118 PyObject *owner = POP();
2119 int err;
2120 err = PyObject_SetAttr(owner, name, (PyObject *)NULL);
2121 Py_DECREF(owner);
2122 if (err != 0)
2123 goto error;
2124 DISPATCH();
2125 }
2126
2127 TARGET(STORE_GLOBAL) {
2128 PyObject *name = GETITEM(names, oparg);
2129 PyObject *v = POP();
2130 int err;
2131 err = PyDict_SetItem(f->f_globals, name, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002132 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002133 if (err != 0)
2134 goto error;
2135 DISPATCH();
2136 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002137
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002138 TARGET(DELETE_GLOBAL) {
2139 PyObject *name = GETITEM(names, oparg);
2140 int err;
2141 err = PyDict_DelItem(f->f_globals, name);
2142 if (err != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002143 format_exc_check_arg(
Ezio Melotti04a29552013-03-03 15:12:44 +02002144 PyExc_NameError, NAME_ERROR_MSG, name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002145 goto error;
Benjamin Peterson00f86f22012-10-10 14:10:33 -04002146 }
2147 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002148 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002149
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002150 TARGET(LOAD_NAME) {
2151 PyObject *name = GETITEM(names, oparg);
2152 PyObject *locals = f->f_locals;
2153 PyObject *v;
2154 if (locals == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002155 PyErr_Format(PyExc_SystemError,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002156 "no locals when loading %R", name);
2157 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002158 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002159 if (PyDict_CheckExact(locals)) {
2160 v = PyDict_GetItem(locals, name);
2161 Py_XINCREF(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002162 }
2163 else {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002164 v = PyObject_GetItem(locals, name);
2165 if (v == NULL && PyErr_Occurred()) {
Benjamin Peterson92722792012-12-15 12:51:05 -05002166 if (!PyErr_ExceptionMatches(PyExc_KeyError))
2167 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002168 PyErr_Clear();
2169 }
2170 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002171 if (v == NULL) {
2172 v = PyDict_GetItem(f->f_globals, name);
2173 Py_XINCREF(v);
2174 if (v == NULL) {
Victor Stinnerb0b22422012-04-19 00:57:45 +02002175 if (PyDict_CheckExact(f->f_builtins)) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002176 v = PyDict_GetItem(f->f_builtins, name);
2177 if (v == NULL) {
Victor Stinnerb0b22422012-04-19 00:57:45 +02002178 format_exc_check_arg(
2179 PyExc_NameError,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002180 NAME_ERROR_MSG, name);
2181 goto error;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002182 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002183 Py_INCREF(v);
Victor Stinnerb0b22422012-04-19 00:57:45 +02002184 }
2185 else {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002186 v = PyObject_GetItem(f->f_builtins, name);
2187 if (v == NULL) {
Victor Stinnerb0b22422012-04-19 00:57:45 +02002188 if (PyErr_ExceptionMatches(PyExc_KeyError))
2189 format_exc_check_arg(
2190 PyExc_NameError,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002191 NAME_ERROR_MSG, name);
2192 goto error;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002193 }
Benjamin Peterson20f9c3c2010-07-20 22:39:34 +00002194 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002195 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002196 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002197 PUSH(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002198 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002199 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002200
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002201 TARGET(LOAD_GLOBAL) {
2202 PyObject *name = GETITEM(names, oparg);
2203 PyObject *v;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002204 if (PyDict_CheckExact(f->f_globals)
2205 && PyDict_CheckExact(f->f_builtins)) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002206 v = _PyDict_LoadGlobal((PyDictObject *)f->f_globals,
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002207 (PyDictObject *)f->f_builtins,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002208 name);
2209 if (v == NULL) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002210 if (!PyErr_Occurred())
2211 format_exc_check_arg(PyExc_NameError,
Ezio Melotti04a29552013-03-03 15:12:44 +02002212 NAME_ERROR_MSG, name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002213 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002214 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002215 Py_INCREF(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002216 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002217 else {
2218 /* Slow-path if globals or builtins is not a dict */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002219 v = PyObject_GetItem(f->f_globals, name);
2220 if (v == NULL) {
2221 v = PyObject_GetItem(f->f_builtins, name);
2222 if (v == NULL) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002223 if (PyErr_ExceptionMatches(PyExc_KeyError))
2224 format_exc_check_arg(
2225 PyExc_NameError,
Ezio Melotti04a29552013-03-03 15:12:44 +02002226 NAME_ERROR_MSG, name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002227 goto error;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002228 }
2229 }
2230 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002231 PUSH(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002232 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002233 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002234
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002235 TARGET(DELETE_FAST) {
2236 PyObject *v = GETLOCAL(oparg);
2237 if (v != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002238 SETLOCAL(oparg, NULL);
2239 DISPATCH();
2240 }
2241 format_exc_check_arg(
2242 PyExc_UnboundLocalError,
2243 UNBOUNDLOCAL_ERROR_MSG,
2244 PyTuple_GetItem(co->co_varnames, oparg)
2245 );
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002246 goto error;
2247 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002248
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002249 TARGET(DELETE_DEREF) {
2250 PyObject *cell = freevars[oparg];
2251 if (PyCell_GET(cell) != NULL) {
2252 PyCell_Set(cell, NULL);
Benjamin Peterson00ebe2c2010-09-10 22:02:31 +00002253 DISPATCH();
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00002254 }
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00002255 format_exc_unbound(co, oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002256 goto error;
2257 }
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00002258
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002259 TARGET(LOAD_CLOSURE) {
2260 PyObject *cell = freevars[oparg];
2261 Py_INCREF(cell);
2262 PUSH(cell);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002263 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002264 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002265
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002266 TARGET(LOAD_CLASSDEREF) {
2267 PyObject *name, *value, *locals = f->f_locals;
Victor Stinnerd3dfd0e2013-05-16 23:48:01 +02002268 Py_ssize_t idx;
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002269 assert(locals);
2270 assert(oparg >= PyTuple_GET_SIZE(co->co_cellvars));
2271 idx = oparg - PyTuple_GET_SIZE(co->co_cellvars);
2272 assert(idx >= 0 && idx < PyTuple_GET_SIZE(co->co_freevars));
2273 name = PyTuple_GET_ITEM(co->co_freevars, idx);
2274 if (PyDict_CheckExact(locals)) {
2275 value = PyDict_GetItem(locals, name);
2276 Py_XINCREF(value);
2277 }
2278 else {
2279 value = PyObject_GetItem(locals, name);
2280 if (value == NULL && PyErr_Occurred()) {
2281 if (!PyErr_ExceptionMatches(PyExc_KeyError))
2282 goto error;
2283 PyErr_Clear();
2284 }
2285 }
2286 if (!value) {
2287 PyObject *cell = freevars[oparg];
2288 value = PyCell_GET(cell);
2289 if (value == NULL) {
2290 format_exc_unbound(co, oparg);
2291 goto error;
2292 }
2293 Py_INCREF(value);
2294 }
2295 PUSH(value);
2296 DISPATCH();
2297 }
2298
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002299 TARGET(LOAD_DEREF) {
2300 PyObject *cell = freevars[oparg];
2301 PyObject *value = PyCell_GET(cell);
2302 if (value == NULL) {
2303 format_exc_unbound(co, oparg);
2304 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002305 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002306 Py_INCREF(value);
2307 PUSH(value);
2308 DISPATCH();
2309 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002310
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002311 TARGET(STORE_DEREF) {
2312 PyObject *v = POP();
2313 PyObject *cell = freevars[oparg];
2314 PyCell_Set(cell, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002315 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002316 DISPATCH();
2317 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002318
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002319 TARGET(BUILD_TUPLE) {
2320 PyObject *tup = PyTuple_New(oparg);
2321 if (tup == NULL)
2322 goto error;
2323 while (--oparg >= 0) {
2324 PyObject *item = POP();
2325 PyTuple_SET_ITEM(tup, oparg, item);
2326 }
2327 PUSH(tup);
2328 DISPATCH();
2329 }
2330
2331 TARGET(BUILD_LIST) {
2332 PyObject *list = PyList_New(oparg);
2333 if (list == NULL)
2334 goto error;
2335 while (--oparg >= 0) {
2336 PyObject *item = POP();
2337 PyList_SET_ITEM(list, oparg, item);
2338 }
2339 PUSH(list);
2340 DISPATCH();
2341 }
2342
2343 TARGET(BUILD_SET) {
2344 PyObject *set = PySet_New(NULL);
2345 int err = 0;
2346 if (set == NULL)
2347 goto error;
2348 while (--oparg >= 0) {
2349 PyObject *item = POP();
2350 if (err == 0)
2351 err = PySet_Add(set, item);
2352 Py_DECREF(item);
2353 }
2354 if (err != 0) {
2355 Py_DECREF(set);
2356 goto error;
2357 }
2358 PUSH(set);
2359 DISPATCH();
2360 }
2361
2362 TARGET(BUILD_MAP) {
2363 PyObject *map = _PyDict_NewPresized((Py_ssize_t)oparg);
2364 if (map == NULL)
2365 goto error;
2366 PUSH(map);
2367 DISPATCH();
2368 }
2369
2370 TARGET(STORE_MAP) {
2371 PyObject *key = TOP();
2372 PyObject *value = SECOND();
2373 PyObject *map = THIRD();
2374 int err;
2375 STACKADJ(-2);
2376 assert(PyDict_CheckExact(map));
2377 err = PyDict_SetItem(map, key, value);
2378 Py_DECREF(value);
2379 Py_DECREF(key);
2380 if (err != 0)
2381 goto error;
2382 DISPATCH();
2383 }
2384
2385 TARGET(MAP_ADD) {
2386 PyObject *key = TOP();
2387 PyObject *value = SECOND();
2388 PyObject *map;
2389 int err;
2390 STACKADJ(-2);
2391 map = stack_pointer[-oparg]; /* dict */
2392 assert(PyDict_CheckExact(map));
2393 err = PyDict_SetItem(map, key, value); /* v[w] = u */
2394 Py_DECREF(value);
2395 Py_DECREF(key);
2396 if (err != 0)
2397 goto error;
2398 PREDICT(JUMP_ABSOLUTE);
2399 DISPATCH();
2400 }
2401
2402 TARGET(LOAD_ATTR) {
2403 PyObject *name = GETITEM(names, oparg);
2404 PyObject *owner = TOP();
2405 PyObject *res = PyObject_GetAttr(owner, name);
2406 Py_DECREF(owner);
2407 SET_TOP(res);
2408 if (res == NULL)
2409 goto error;
2410 DISPATCH();
2411 }
2412
2413 TARGET(COMPARE_OP) {
2414 PyObject *right = POP();
2415 PyObject *left = TOP();
2416 PyObject *res = cmp_outcome(oparg, left, right);
2417 Py_DECREF(left);
2418 Py_DECREF(right);
2419 SET_TOP(res);
2420 if (res == NULL)
2421 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002422 PREDICT(POP_JUMP_IF_FALSE);
2423 PREDICT(POP_JUMP_IF_TRUE);
2424 DISPATCH();
Victor Stinner3c1e4812012-03-26 22:10:51 +02002425 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002426
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002427 TARGET(IMPORT_NAME) {
2428 _Py_IDENTIFIER(__import__);
2429 PyObject *name = GETITEM(names, oparg);
2430 PyObject *func = _PyDict_GetItemId(f->f_builtins, &PyId___import__);
Benjamin Petersonfe1bcb62012-10-12 11:40:01 -04002431 PyObject *from, *level, *args, *res;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002432 if (func == NULL) {
2433 PyErr_SetString(PyExc_ImportError,
2434 "__import__ not found");
2435 goto error;
2436 }
2437 Py_INCREF(func);
2438 from = POP();
2439 level = TOP();
2440 if (PyLong_AsLong(level) != -1 || PyErr_Occurred())
2441 args = PyTuple_Pack(5,
2442 name,
2443 f->f_globals,
2444 f->f_locals == NULL ?
2445 Py_None : f->f_locals,
2446 from,
2447 level);
2448 else
2449 args = PyTuple_Pack(4,
2450 name,
2451 f->f_globals,
2452 f->f_locals == NULL ?
2453 Py_None : f->f_locals,
2454 from);
2455 Py_DECREF(level);
2456 Py_DECREF(from);
2457 if (args == NULL) {
2458 Py_DECREF(func);
2459 STACKADJ(-1);
2460 goto error;
2461 }
2462 READ_TIMESTAMP(intr0);
Benjamin Petersonfe1bcb62012-10-12 11:40:01 -04002463 res = PyEval_CallObject(func, args);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002464 READ_TIMESTAMP(intr1);
2465 Py_DECREF(args);
2466 Py_DECREF(func);
2467 SET_TOP(res);
2468 if (res == NULL)
2469 goto error;
2470 DISPATCH();
2471 }
2472
2473 TARGET(IMPORT_STAR) {
2474 PyObject *from = POP(), *locals;
2475 int err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002476 PyFrame_FastToLocals(f);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002477 locals = f->f_locals;
2478 if (locals == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002479 PyErr_SetString(PyExc_SystemError,
2480 "no locals found during 'import *'");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002481 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002482 }
2483 READ_TIMESTAMP(intr0);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002484 err = import_all_from(locals, from);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002485 READ_TIMESTAMP(intr1);
2486 PyFrame_LocalsToFast(f, 0);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002487 Py_DECREF(from);
2488 if (err != 0)
2489 goto error;
2490 DISPATCH();
2491 }
Guido van Rossum25831651993-05-19 14:50:45 +00002492
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002493 TARGET(IMPORT_FROM) {
2494 PyObject *name = GETITEM(names, oparg);
2495 PyObject *from = TOP();
2496 PyObject *res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002497 READ_TIMESTAMP(intr0);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002498 res = import_from(from, name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002499 READ_TIMESTAMP(intr1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002500 PUSH(res);
2501 if (res == NULL)
2502 goto error;
2503 DISPATCH();
2504 }
Thomas Wouters52152252000-08-17 22:55:00 +00002505
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002506 TARGET(JUMP_FORWARD) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002507 JUMPBY(oparg);
2508 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002509 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002510
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002511 PREDICTED_WITH_ARG(POP_JUMP_IF_FALSE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002512 TARGET(POP_JUMP_IF_FALSE) {
2513 PyObject *cond = POP();
2514 int err;
2515 if (cond == Py_True) {
2516 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002517 FAST_DISPATCH();
2518 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002519 if (cond == Py_False) {
2520 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002521 JUMPTO(oparg);
2522 FAST_DISPATCH();
2523 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002524 err = PyObject_IsTrue(cond);
2525 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002526 if (err > 0)
2527 err = 0;
2528 else if (err == 0)
2529 JUMPTO(oparg);
2530 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002531 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002532 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002533 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002534
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002535 PREDICTED_WITH_ARG(POP_JUMP_IF_TRUE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002536 TARGET(POP_JUMP_IF_TRUE) {
2537 PyObject *cond = POP();
2538 int err;
2539 if (cond == Py_False) {
2540 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002541 FAST_DISPATCH();
2542 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002543 if (cond == Py_True) {
2544 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002545 JUMPTO(oparg);
2546 FAST_DISPATCH();
2547 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002548 err = PyObject_IsTrue(cond);
2549 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002550 if (err > 0) {
2551 err = 0;
2552 JUMPTO(oparg);
2553 }
2554 else if (err == 0)
2555 ;
2556 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002557 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002558 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002559 }
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00002560
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002561 TARGET(JUMP_IF_FALSE_OR_POP) {
2562 PyObject *cond = TOP();
2563 int err;
2564 if (cond == Py_True) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002565 STACKADJ(-1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002566 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002567 FAST_DISPATCH();
2568 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002569 if (cond == Py_False) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002570 JUMPTO(oparg);
2571 FAST_DISPATCH();
2572 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002573 err = PyObject_IsTrue(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002574 if (err > 0) {
2575 STACKADJ(-1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002576 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002577 err = 0;
2578 }
2579 else if (err == 0)
2580 JUMPTO(oparg);
2581 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002582 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002583 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002584 }
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00002585
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002586 TARGET(JUMP_IF_TRUE_OR_POP) {
2587 PyObject *cond = TOP();
2588 int err;
2589 if (cond == Py_False) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002590 STACKADJ(-1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002591 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002592 FAST_DISPATCH();
2593 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002594 if (cond == Py_True) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002595 JUMPTO(oparg);
2596 FAST_DISPATCH();
2597 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002598 err = PyObject_IsTrue(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002599 if (err > 0) {
2600 err = 0;
2601 JUMPTO(oparg);
2602 }
2603 else if (err == 0) {
2604 STACKADJ(-1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002605 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002606 }
2607 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002608 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002609 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002610 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002611
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002612 PREDICTED_WITH_ARG(JUMP_ABSOLUTE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002613 TARGET(JUMP_ABSOLUTE) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002614 JUMPTO(oparg);
Guido van Rossum58da9312007-11-10 23:39:45 +00002615#if FAST_LOOPS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002616 /* Enabling this path speeds-up all while and for-loops by bypassing
2617 the per-loop checks for signals. By default, this should be turned-off
2618 because it prevents detection of a control-break in tight loops like
2619 "while 1: pass". Compile with this option turned-on when you need
2620 the speed-up and do not need break checking inside tight loops (ones
2621 that contain only instructions ending with FAST_DISPATCH).
2622 */
2623 FAST_DISPATCH();
Guido van Rossum58da9312007-11-10 23:39:45 +00002624#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002625 DISPATCH();
Guido van Rossum58da9312007-11-10 23:39:45 +00002626#endif
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002627 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002628
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002629 TARGET(GET_ITER) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002630 /* before: [obj]; after [getiter(obj)] */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002631 PyObject *iterable = TOP();
2632 PyObject *iter = PyObject_GetIter(iterable);
2633 Py_DECREF(iterable);
2634 SET_TOP(iter);
2635 if (iter == NULL)
2636 goto error;
2637 PREDICT(FOR_ITER);
2638 DISPATCH();
2639 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002640
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002641 PREDICTED_WITH_ARG(FOR_ITER);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002642 TARGET(FOR_ITER) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002643 /* before: [iter]; after: [iter, iter()] *or* [] */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002644 PyObject *iter = TOP();
2645 PyObject *next = (*iter->ob_type->tp_iternext)(iter);
2646 if (next != NULL) {
2647 PUSH(next);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002648 PREDICT(STORE_FAST);
2649 PREDICT(UNPACK_SEQUENCE);
2650 DISPATCH();
2651 }
2652 if (PyErr_Occurred()) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002653 if (!PyErr_ExceptionMatches(PyExc_StopIteration))
2654 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002655 PyErr_Clear();
2656 }
2657 /* iterator ended normally */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002658 STACKADJ(-1);
2659 Py_DECREF(iter);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002660 JUMPBY(oparg);
2661 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002662 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002663
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002664 TARGET(BREAK_LOOP) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002665 why = WHY_BREAK;
2666 goto fast_block_end;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002667 }
Raymond Hettinger2d783e92004-03-12 09:12:22 +00002668
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002669 TARGET(CONTINUE_LOOP) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002670 retval = PyLong_FromLong(oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002671 if (retval == NULL)
2672 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002673 why = WHY_CONTINUE;
2674 goto fast_block_end;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002675 }
Raymond Hettinger2d783e92004-03-12 09:12:22 +00002676
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002677 TARGET_WITH_IMPL(SETUP_LOOP, _setup_finally)
2678 TARGET_WITH_IMPL(SETUP_EXCEPT, _setup_finally)
2679 TARGET(SETUP_FINALLY)
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002680 _setup_finally: {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002681 /* NOTE: If you add any new block-setup opcodes that
2682 are not try/except/finally handlers, you may need
2683 to update the PyGen_NeedsFinalizing() function.
2684 */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002685
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002686 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
2687 STACK_LEVEL());
2688 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002689 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002690
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002691 TARGET(SETUP_WITH) {
Benjamin Petersonce798522012-01-22 11:24:29 -05002692 _Py_IDENTIFIER(__exit__);
2693 _Py_IDENTIFIER(__enter__);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002694 PyObject *mgr = TOP();
2695 PyObject *exit = special_lookup(mgr, &PyId___exit__), *enter;
2696 PyObject *res;
2697 if (exit == NULL)
2698 goto error;
2699 SET_TOP(exit);
2700 enter = special_lookup(mgr, &PyId___enter__);
2701 Py_DECREF(mgr);
2702 if (enter == NULL)
2703 goto error;
2704 res = PyObject_CallFunctionObjArgs(enter, NULL);
2705 Py_DECREF(enter);
2706 if (res == NULL)
2707 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002708 /* Setup the finally block before pushing the result
2709 of __enter__ on the stack. */
2710 PyFrame_BlockSetup(f, SETUP_FINALLY, INSTR_OFFSET() + oparg,
2711 STACK_LEVEL());
Benjamin Peterson876b2f22009-06-28 03:18:59 +00002712
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002713 PUSH(res);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002714 DISPATCH();
2715 }
Benjamin Peterson876b2f22009-06-28 03:18:59 +00002716
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002717 TARGET(WITH_CLEANUP) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002718 /* At the top of the stack are 1-3 values indicating
2719 how/why we entered the finally clause:
2720 - TOP = None
2721 - (TOP, SECOND) = (WHY_{RETURN,CONTINUE}), retval
2722 - TOP = WHY_*; no retval below it
2723 - (TOP, SECOND, THIRD) = exc_info()
2724 (FOURTH, FITH, SIXTH) = previous exception for EXCEPT_HANDLER
2725 Below them is EXIT, the context.__exit__ bound method.
2726 In the last case, we must call
2727 EXIT(TOP, SECOND, THIRD)
2728 otherwise we must call
2729 EXIT(None, None, None)
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002730
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002731 In the first two cases, we remove EXIT from the
2732 stack, leaving the rest in the same order. In the
2733 third case, we shift the bottom 3 values of the
2734 stack down, and replace the empty spot with NULL.
Guido van Rossum1a5e21e2006-02-28 21:57:43 +00002735
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002736 In addition, if the stack represents an exception,
2737 *and* the function call returns a 'true' value, we
2738 push WHY_SILENCED onto the stack. END_FINALLY will
2739 then not re-raise the exception. (But non-local
2740 gotos should still be resumed.)
2741 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002742
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002743 PyObject *exit_func;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002744 PyObject *exc = TOP(), *val = Py_None, *tb = Py_None, *res;
2745 int err;
2746 if (exc == Py_None) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002747 (void)POP();
2748 exit_func = TOP();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002749 SET_TOP(exc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002750 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002751 else if (PyLong_Check(exc)) {
2752 STACKADJ(-1);
2753 switch (PyLong_AsLong(exc)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002754 case WHY_RETURN:
2755 case WHY_CONTINUE:
2756 /* Retval in TOP. */
2757 exit_func = SECOND();
2758 SET_SECOND(TOP());
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002759 SET_TOP(exc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002760 break;
2761 default:
2762 exit_func = TOP();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002763 SET_TOP(exc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002764 break;
2765 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002766 exc = Py_None;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002767 }
2768 else {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002769 PyObject *tp2, *exc2, *tb2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002770 PyTryBlock *block;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002771 val = SECOND();
2772 tb = THIRD();
2773 tp2 = FOURTH();
2774 exc2 = PEEK(5);
2775 tb2 = PEEK(6);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002776 exit_func = PEEK(7);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002777 SET_VALUE(7, tb2);
2778 SET_VALUE(6, exc2);
2779 SET_VALUE(5, tp2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002780 /* UNWIND_EXCEPT_HANDLER will pop this off. */
2781 SET_FOURTH(NULL);
2782 /* We just shifted the stack down, so we have
2783 to tell the except handler block that the
2784 values are lower than it expects. */
2785 block = &f->f_blockstack[f->f_iblock - 1];
2786 assert(block->b_type == EXCEPT_HANDLER);
2787 block->b_level--;
2788 }
2789 /* XXX Not the fastest way to call it... */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002790 res = PyObject_CallFunctionObjArgs(exit_func, exc, val, tb, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002791 Py_DECREF(exit_func);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002792 if (res == NULL)
2793 goto error;
Amaury Forgeot d'Arc10b24e82008-12-10 23:49:33 +00002794
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002795 if (exc != Py_None)
2796 err = PyObject_IsTrue(res);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002797 else
2798 err = 0;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002799 Py_DECREF(res);
Amaury Forgeot d'Arc10b24e82008-12-10 23:49:33 +00002800
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002801 if (err < 0)
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002802 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002803 else if (err > 0) {
2804 err = 0;
2805 /* There was an exception and a True return */
2806 PUSH(PyLong_FromLong((long) WHY_SILENCED));
2807 }
2808 PREDICT(END_FINALLY);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002809 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002810 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00002811
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002812 TARGET(CALL_FUNCTION) {
2813 PyObject **sp, *res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002814 PCALL(PCALL_ALL);
2815 sp = stack_pointer;
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00002816#ifdef WITH_TSC
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002817 res = call_function(&sp, oparg, &intr0, &intr1);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00002818#else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002819 res = call_function(&sp, oparg);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00002820#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002821 stack_pointer = sp;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002822 PUSH(res);
2823 if (res == NULL)
2824 goto error;
2825 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002826 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002827
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002828 TARGET_WITH_IMPL(CALL_FUNCTION_VAR, _call_function_var_kw)
2829 TARGET_WITH_IMPL(CALL_FUNCTION_KW, _call_function_var_kw)
2830 TARGET(CALL_FUNCTION_VAR_KW)
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002831 _call_function_var_kw: {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002832 int na = oparg & 0xff;
2833 int nk = (oparg>>8) & 0xff;
2834 int flags = (opcode - CALL_FUNCTION) & 3;
2835 int n = na + 2 * nk;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002836 PyObject **pfunc, *func, **sp, *res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002837 PCALL(PCALL_ALL);
2838 if (flags & CALL_FLAG_VAR)
2839 n++;
2840 if (flags & CALL_FLAG_KW)
2841 n++;
2842 pfunc = stack_pointer - n - 1;
2843 func = *pfunc;
Jeremy Hylton52820442001-01-03 23:52:36 +00002844
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002845 if (PyMethod_Check(func)
Stefan Krahb7e10102010-06-23 18:42:39 +00002846 && PyMethod_GET_SELF(func) != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002847 PyObject *self = PyMethod_GET_SELF(func);
2848 Py_INCREF(self);
2849 func = PyMethod_GET_FUNCTION(func);
2850 Py_INCREF(func);
2851 Py_DECREF(*pfunc);
2852 *pfunc = self;
2853 na++;
Brett Cannonb94767f2011-02-22 20:15:44 +00002854 /* n++; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002855 } else
2856 Py_INCREF(func);
2857 sp = stack_pointer;
2858 READ_TIMESTAMP(intr0);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002859 res = ext_do_call(func, &sp, flags, na, nk);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002860 READ_TIMESTAMP(intr1);
2861 stack_pointer = sp;
2862 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002863
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002864 while (stack_pointer > pfunc) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002865 PyObject *o = POP();
2866 Py_DECREF(o);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002867 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002868 PUSH(res);
2869 if (res == NULL)
2870 goto error;
2871 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002872 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002873
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002874 TARGET_WITH_IMPL(MAKE_CLOSURE, _make_function)
2875 TARGET(MAKE_FUNCTION)
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002876 _make_function: {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002877 int posdefaults = oparg & 0xff;
2878 int kwdefaults = (oparg>>8) & 0xff;
2879 int num_annotations = (oparg >> 16) & 0x7fff;
Guido van Rossum4f72a782006-10-27 23:31:49 +00002880
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002881 PyObject *qualname = POP(); /* qualname */
2882 PyObject *code = POP(); /* code object */
2883 PyObject *func = PyFunction_NewWithQualName(code, f->f_globals, qualname);
2884 Py_DECREF(code);
2885 Py_DECREF(qualname);
Antoine Pitrou9a2310d2008-07-25 22:39:39 +00002886
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002887 if (func == NULL)
2888 goto error;
2889
2890 if (opcode == MAKE_CLOSURE) {
2891 PyObject *closure = POP();
2892 if (PyFunction_SetClosure(func, closure) != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002893 /* Can't happen unless bytecode is corrupt. */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002894 Py_DECREF(func);
2895 Py_DECREF(closure);
2896 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002897 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002898 Py_DECREF(closure);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002899 }
Neal Norwitzc1505362006-12-28 06:47:50 +00002900
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002901 if (num_annotations > 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002902 Py_ssize_t name_ix;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002903 PyObject *names = POP(); /* names of args with annotations */
2904 PyObject *anns = PyDict_New();
2905 if (anns == NULL) {
2906 Py_DECREF(func);
2907 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002908 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002909 name_ix = PyTuple_Size(names);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002910 assert(num_annotations == name_ix+1);
2911 while (name_ix > 0) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002912 PyObject *name, *value;
2913 int err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002914 --name_ix;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002915 name = PyTuple_GET_ITEM(names, name_ix);
2916 value = POP();
2917 err = PyDict_SetItem(anns, name, value);
2918 Py_DECREF(value);
2919 if (err != 0) {
2920 Py_DECREF(anns);
2921 Py_DECREF(func);
2922 goto error;
2923 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002924 }
Neal Norwitzc1505362006-12-28 06:47:50 +00002925
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002926 if (PyFunction_SetAnnotations(func, anns) != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002927 /* Can't happen unless
2928 PyFunction_SetAnnotations changes. */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002929 Py_DECREF(anns);
2930 Py_DECREF(func);
2931 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002932 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002933 Py_DECREF(anns);
2934 Py_DECREF(names);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002935 }
Neal Norwitzc1505362006-12-28 06:47:50 +00002936
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002937 /* XXX Maybe this should be a separate opcode? */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002938 if (kwdefaults > 0) {
2939 PyObject *defs = PyDict_New();
2940 if (defs == NULL) {
2941 Py_DECREF(func);
2942 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002943 }
2944 while (--kwdefaults >= 0) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002945 PyObject *v = POP(); /* default value */
2946 PyObject *key = POP(); /* kw only arg name */
2947 int err = PyDict_SetItem(defs, key, v);
2948 Py_DECREF(v);
2949 Py_DECREF(key);
2950 if (err != 0) {
2951 Py_DECREF(defs);
2952 Py_DECREF(func);
2953 goto error;
2954 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002955 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002956 if (PyFunction_SetKwDefaults(func, defs) != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002957 /* Can't happen unless
2958 PyFunction_SetKwDefaults changes. */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002959 Py_DECREF(func);
2960 Py_DECREF(defs);
2961 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002962 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002963 Py_DECREF(defs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002964 }
Benjamin Peterson1ef876c2013-02-10 09:29:59 -05002965 if (posdefaults > 0) {
2966 PyObject *defs = PyTuple_New(posdefaults);
2967 if (defs == NULL) {
2968 Py_DECREF(func);
2969 goto error;
2970 }
2971 while (--posdefaults >= 0)
2972 PyTuple_SET_ITEM(defs, posdefaults, POP());
2973 if (PyFunction_SetDefaults(func, defs) != 0) {
2974 /* Can't happen unless
2975 PyFunction_SetDefaults changes. */
2976 Py_DECREF(defs);
2977 Py_DECREF(func);
2978 goto error;
2979 }
2980 Py_DECREF(defs);
2981 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002982 PUSH(func);
2983 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002984 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002985
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002986 TARGET(BUILD_SLICE) {
2987 PyObject *start, *stop, *step, *slice;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002988 if (oparg == 3)
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002989 step = POP();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002990 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002991 step = NULL;
2992 stop = POP();
2993 start = TOP();
2994 slice = PySlice_New(start, stop, step);
2995 Py_DECREF(start);
2996 Py_DECREF(stop);
2997 Py_XDECREF(step);
2998 SET_TOP(slice);
2999 if (slice == NULL)
3000 goto error;
3001 DISPATCH();
3002 }
Guido van Rossum8861b741996-07-30 16:49:37 +00003003
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003004 TARGET(EXTENDED_ARG) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003005 opcode = NEXTOP();
3006 oparg = oparg<<16 | NEXTARG();
3007 goto dispatch_opcode;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003008 }
Guido van Rossum8861b741996-07-30 16:49:37 +00003009
Antoine Pitrou042b1282010-08-13 21:15:58 +00003010#if USE_COMPUTED_GOTOS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003011 _unknown_opcode:
Antoine Pitroub52ec782009-01-25 16:34:23 +00003012#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003013 default:
3014 fprintf(stderr,
3015 "XXX lineno: %d, opcode: %d\n",
3016 PyFrame_GetLineNumber(f),
3017 opcode);
3018 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003019 goto error;
Guido van Rossum04691fc1992-08-12 15:35:34 +00003020
3021#ifdef CASE_TOO_BIG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003022 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00003023#endif
3024
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003025 } /* switch */
Guido van Rossum374a9221991-04-04 10:40:29 +00003026
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003027 /* This should never be reached. Every opcode should end with DISPATCH()
3028 or goto error. */
3029 assert(0);
Guido van Rossumac7be682001-01-17 15:42:30 +00003030
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003031error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003032 READ_TIMESTAMP(inst1);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00003033
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003034 assert(why == WHY_NOT);
3035 why = WHY_EXCEPTION;
Guido van Rossumac7be682001-01-17 15:42:30 +00003036
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003037 /* Double-check exception status. */
Victor Stinner365b6932013-07-12 00:11:58 +02003038#ifdef NDEBUG
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003039 if (!PyErr_Occurred())
3040 PyErr_SetString(PyExc_SystemError,
3041 "error return without exception set");
Victor Stinner365b6932013-07-12 00:11:58 +02003042#else
3043 assert(PyErr_Occurred());
3044#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00003045
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003046 /* Log traceback info. */
3047 PyTraceBack_Here(f);
Guido van Rossumac7be682001-01-17 15:42:30 +00003048
Benjamin Peterson51f46162013-01-23 08:38:47 -05003049 if (tstate->c_tracefunc != NULL)
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003050 call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj, f);
Guido van Rossumac7be682001-01-17 15:42:30 +00003051
Raymond Hettinger1dd83092004-02-06 18:32:33 +00003052fast_block_end:
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003053 assert(why != WHY_NOT);
3054
3055 /* Unwind stacks if a (pseudo) exception occurred */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003056 while (why != WHY_NOT && f->f_iblock > 0) {
3057 /* Peek at the current block. */
3058 PyTryBlock *b = &f->f_blockstack[f->f_iblock - 1];
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003059
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003060 assert(why != WHY_YIELD);
3061 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
3062 why = WHY_NOT;
3063 JUMPTO(PyLong_AS_LONG(retval));
3064 Py_DECREF(retval);
3065 break;
3066 }
3067 /* Now we have to pop the block. */
3068 f->f_iblock--;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003069
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003070 if (b->b_type == EXCEPT_HANDLER) {
3071 UNWIND_EXCEPT_HANDLER(b);
3072 continue;
3073 }
3074 UNWIND_BLOCK(b);
3075 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
3076 why = WHY_NOT;
3077 JUMPTO(b->b_handler);
3078 break;
3079 }
3080 if (why == WHY_EXCEPTION && (b->b_type == SETUP_EXCEPT
3081 || b->b_type == SETUP_FINALLY)) {
3082 PyObject *exc, *val, *tb;
3083 int handler = b->b_handler;
3084 /* Beware, this invalidates all b->b_* fields */
3085 PyFrame_BlockSetup(f, EXCEPT_HANDLER, -1, STACK_LEVEL());
3086 PUSH(tstate->exc_traceback);
3087 PUSH(tstate->exc_value);
3088 if (tstate->exc_type != NULL) {
3089 PUSH(tstate->exc_type);
3090 }
3091 else {
3092 Py_INCREF(Py_None);
3093 PUSH(Py_None);
3094 }
3095 PyErr_Fetch(&exc, &val, &tb);
3096 /* Make the raw exception data
3097 available to the handler,
3098 so a program can emulate the
3099 Python main loop. */
3100 PyErr_NormalizeException(
3101 &exc, &val, &tb);
Victor Stinner7eab0d02013-07-15 21:16:27 +02003102 if (tb != NULL)
3103 PyException_SetTraceback(val, tb);
3104 else
3105 PyException_SetTraceback(val, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003106 Py_INCREF(exc);
3107 tstate->exc_type = exc;
3108 Py_INCREF(val);
3109 tstate->exc_value = val;
3110 tstate->exc_traceback = tb;
3111 if (tb == NULL)
3112 tb = Py_None;
3113 Py_INCREF(tb);
3114 PUSH(tb);
3115 PUSH(val);
3116 PUSH(exc);
3117 why = WHY_NOT;
3118 JUMPTO(handler);
3119 break;
3120 }
3121 if (b->b_type == SETUP_FINALLY) {
3122 if (why & (WHY_RETURN | WHY_CONTINUE))
3123 PUSH(retval);
3124 PUSH(PyLong_FromLong((long)why));
3125 why = WHY_NOT;
3126 JUMPTO(b->b_handler);
3127 break;
3128 }
3129 } /* unwind stack */
Guido van Rossum374a9221991-04-04 10:40:29 +00003130
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003131 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00003132
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003133 if (why != WHY_NOT)
3134 break;
3135 READ_TIMESTAMP(loop1);
Guido van Rossumac7be682001-01-17 15:42:30 +00003136
Victor Stinnerace47d72013-07-18 01:41:08 +02003137 assert(!PyErr_Occurred());
3138
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003139 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00003140
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003141 assert(why != WHY_YIELD);
3142 /* Pop remaining stack entries. */
3143 while (!EMPTY()) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003144 PyObject *o = POP();
3145 Py_XDECREF(o);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003146 }
Guido van Rossum35974fb2001-12-06 21:28:18 +00003147
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003148 if (why != WHY_RETURN)
3149 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00003150
Victor Stinnerace47d72013-07-18 01:41:08 +02003151 assert((retval != NULL && !PyErr_Occurred())
3152 || (retval == NULL && PyErr_Occurred()));
3153
Raymond Hettinger1dd83092004-02-06 18:32:33 +00003154fast_yield:
Benjamin Petersonac913412011-07-03 16:25:11 -05003155 if (co->co_flags & CO_GENERATOR && (why == WHY_YIELD || why == WHY_RETURN)) {
3156 /* The purpose of this block is to put aside the generator's exception
3157 state and restore that of the calling frame. If the current
3158 exception state is from the caller, we clear the exception values
3159 on the generator frame, so they are not swapped back in latter. The
3160 origin of the current exception state is determined by checking for
3161 except handler blocks, which we must be in iff a new exception
3162 state came into existence in this frame. (An uncaught exception
3163 would have why == WHY_EXCEPTION, and we wouldn't be here). */
3164 int i;
3165 for (i = 0; i < f->f_iblock; i++)
3166 if (f->f_blockstack[i].b_type == EXCEPT_HANDLER)
3167 break;
3168 if (i == f->f_iblock)
3169 /* We did not create this exception. */
Benjamin Peterson87880242011-07-03 16:48:31 -05003170 restore_and_clear_exc_state(tstate, f);
Benjamin Petersonac913412011-07-03 16:25:11 -05003171 else
Benjamin Peterson87880242011-07-03 16:48:31 -05003172 swap_exc_state(tstate, f);
Benjamin Petersonac913412011-07-03 16:25:11 -05003173 }
Benjamin Peterson83195c32011-07-03 13:44:00 -05003174
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003175 if (tstate->use_tracing) {
Benjamin Peterson51f46162013-01-23 08:38:47 -05003176 if (tstate->c_tracefunc) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003177 if (why == WHY_RETURN || why == WHY_YIELD) {
3178 if (call_trace(tstate->c_tracefunc,
3179 tstate->c_traceobj, f,
3180 PyTrace_RETURN, retval)) {
3181 Py_XDECREF(retval);
3182 retval = NULL;
3183 why = WHY_EXCEPTION;
3184 }
3185 }
3186 else if (why == WHY_EXCEPTION) {
3187 call_trace_protected(tstate->c_tracefunc,
3188 tstate->c_traceobj, f,
3189 PyTrace_RETURN, NULL);
3190 }
3191 }
3192 if (tstate->c_profilefunc) {
3193 if (why == WHY_EXCEPTION)
3194 call_trace_protected(tstate->c_profilefunc,
3195 tstate->c_profileobj, f,
3196 PyTrace_RETURN, NULL);
3197 else if (call_trace(tstate->c_profilefunc,
3198 tstate->c_profileobj, f,
3199 PyTrace_RETURN, retval)) {
3200 Py_XDECREF(retval);
3201 retval = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00003202 /* why = WHY_EXCEPTION; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003203 }
3204 }
3205 }
Guido van Rossuma4240131997-01-21 21:18:36 +00003206
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003207 /* pop frame */
Thomas Woutersce272b62007-09-19 21:19:28 +00003208exit_eval_frame:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003209 Py_LeaveRecursiveCall();
Antoine Pitrou58720d62013-08-05 23:26:40 +02003210 f->f_executing = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003211 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00003212
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003213 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00003214}
3215
Benjamin Petersonb204a422011-06-05 22:04:07 -05003216static void
Benjamin Petersone109c702011-06-24 09:37:26 -05003217format_missing(const char *kind, PyCodeObject *co, PyObject *names)
3218{
3219 int err;
3220 Py_ssize_t len = PyList_GET_SIZE(names);
3221 PyObject *name_str, *comma, *tail, *tmp;
3222
3223 assert(PyList_CheckExact(names));
3224 assert(len >= 1);
3225 /* Deal with the joys of natural language. */
3226 switch (len) {
3227 case 1:
3228 name_str = PyList_GET_ITEM(names, 0);
3229 Py_INCREF(name_str);
3230 break;
3231 case 2:
3232 name_str = PyUnicode_FromFormat("%U and %U",
3233 PyList_GET_ITEM(names, len - 2),
3234 PyList_GET_ITEM(names, len - 1));
3235 break;
3236 default:
3237 tail = PyUnicode_FromFormat(", %U, and %U",
3238 PyList_GET_ITEM(names, len - 2),
3239 PyList_GET_ITEM(names, len - 1));
Benjamin Petersond1ab6082012-06-01 11:18:22 -07003240 if (tail == NULL)
3241 return;
Benjamin Petersone109c702011-06-24 09:37:26 -05003242 /* Chop off the last two objects in the list. This shouldn't actually
3243 fail, but we can't be too careful. */
3244 err = PyList_SetSlice(names, len - 2, len, NULL);
3245 if (err == -1) {
3246 Py_DECREF(tail);
3247 return;
3248 }
3249 /* Stitch everything up into a nice comma-separated list. */
3250 comma = PyUnicode_FromString(", ");
3251 if (comma == NULL) {
3252 Py_DECREF(tail);
3253 return;
3254 }
3255 tmp = PyUnicode_Join(comma, names);
3256 Py_DECREF(comma);
3257 if (tmp == NULL) {
3258 Py_DECREF(tail);
3259 return;
3260 }
3261 name_str = PyUnicode_Concat(tmp, tail);
3262 Py_DECREF(tmp);
3263 Py_DECREF(tail);
3264 break;
3265 }
3266 if (name_str == NULL)
3267 return;
3268 PyErr_Format(PyExc_TypeError,
3269 "%U() missing %i required %s argument%s: %U",
3270 co->co_name,
3271 len,
3272 kind,
3273 len == 1 ? "" : "s",
3274 name_str);
3275 Py_DECREF(name_str);
3276}
3277
3278static void
3279missing_arguments(PyCodeObject *co, int missing, int defcount,
3280 PyObject **fastlocals)
3281{
3282 int i, j = 0;
3283 int start, end;
3284 int positional = defcount != -1;
3285 const char *kind = positional ? "positional" : "keyword-only";
3286 PyObject *missing_names;
3287
3288 /* Compute the names of the arguments that are missing. */
3289 missing_names = PyList_New(missing);
3290 if (missing_names == NULL)
3291 return;
3292 if (positional) {
3293 start = 0;
3294 end = co->co_argcount - defcount;
3295 }
3296 else {
3297 start = co->co_argcount;
3298 end = start + co->co_kwonlyargcount;
3299 }
3300 for (i = start; i < end; i++) {
3301 if (GETLOCAL(i) == NULL) {
3302 PyObject *raw = PyTuple_GET_ITEM(co->co_varnames, i);
3303 PyObject *name = PyObject_Repr(raw);
3304 if (name == NULL) {
3305 Py_DECREF(missing_names);
3306 return;
3307 }
3308 PyList_SET_ITEM(missing_names, j++, name);
3309 }
3310 }
3311 assert(j == missing);
3312 format_missing(kind, co, missing_names);
3313 Py_DECREF(missing_names);
3314}
3315
3316static void
3317too_many_positional(PyCodeObject *co, int given, int defcount, PyObject **fastlocals)
Benjamin Petersonb204a422011-06-05 22:04:07 -05003318{
3319 int plural;
3320 int kwonly_given = 0;
Benjamin Petersonb204a422011-06-05 22:04:07 -05003321 int i;
3322 PyObject *sig, *kwonly_sig;
3323
Benjamin Petersone109c702011-06-24 09:37:26 -05003324 assert((co->co_flags & CO_VARARGS) == 0);
3325 /* Count missing keyword-only args. */
Benjamin Petersonb204a422011-06-05 22:04:07 -05003326 for (i = co->co_argcount; i < co->co_argcount + co->co_kwonlyargcount; i++)
Benjamin Petersone109c702011-06-24 09:37:26 -05003327 if (GETLOCAL(i) != NULL)
Benjamin Petersonb204a422011-06-05 22:04:07 -05003328 kwonly_given++;
Benjamin Petersone109c702011-06-24 09:37:26 -05003329 if (defcount) {
3330 int atleast = co->co_argcount - defcount;
Benjamin Petersonb204a422011-06-05 22:04:07 -05003331 plural = 1;
3332 sig = PyUnicode_FromFormat("from %d to %d", atleast, co->co_argcount);
3333 }
3334 else {
3335 plural = co->co_argcount != 1;
3336 sig = PyUnicode_FromFormat("%d", co->co_argcount);
3337 }
3338 if (sig == NULL)
3339 return;
3340 if (kwonly_given) {
3341 const char *format = " positional argument%s (and %d keyword-only argument%s)";
3342 kwonly_sig = PyUnicode_FromFormat(format, given != 1 ? "s" : "", kwonly_given,
3343 kwonly_given != 1 ? "s" : "");
3344 if (kwonly_sig == NULL) {
3345 Py_DECREF(sig);
3346 return;
3347 }
3348 }
3349 else {
3350 /* This will not fail. */
3351 kwonly_sig = PyUnicode_FromString("");
Benjamin Petersone109c702011-06-24 09:37:26 -05003352 assert(kwonly_sig != NULL);
Benjamin Petersonb204a422011-06-05 22:04:07 -05003353 }
3354 PyErr_Format(PyExc_TypeError,
3355 "%U() takes %U positional argument%s but %d%U %s given",
3356 co->co_name,
3357 sig,
3358 plural ? "s" : "",
3359 given,
3360 kwonly_sig,
3361 given == 1 && !kwonly_given ? "was" : "were");
3362 Py_DECREF(sig);
3363 Py_DECREF(kwonly_sig);
3364}
3365
Guido van Rossumc2e20742006-02-27 22:32:47 +00003366/* This is gonna seem *real weird*, but if you put some other code between
Martin v. Löwis8d97e332004-06-27 15:43:12 +00003367 PyEval_EvalFrame() and PyEval_EvalCodeEx() you will need to adjust
Guido van Rossumc2e20742006-02-27 22:32:47 +00003368 the test in the if statements in Misc/gdbinit (pystack and pystackv). */
Skip Montanaro786ea6b2004-03-01 15:44:05 +00003369
Tim Peters6d6c1a32001-08-02 04:15:00 +00003370PyObject *
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00003371PyEval_EvalCodeEx(PyObject *_co, PyObject *globals, PyObject *locals,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003372 PyObject **args, int argcount, PyObject **kws, int kwcount,
3373 PyObject **defs, int defcount, PyObject *kwdefs, PyObject *closure)
Tim Peters5ca576e2001-06-18 22:08:13 +00003374{
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00003375 PyCodeObject* co = (PyCodeObject*)_co;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02003376 PyFrameObject *f;
3377 PyObject *retval = NULL;
3378 PyObject **fastlocals, **freevars;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003379 PyThreadState *tstate = PyThreadState_GET();
3380 PyObject *x, *u;
3381 int total_args = co->co_argcount + co->co_kwonlyargcount;
Benjamin Petersonb204a422011-06-05 22:04:07 -05003382 int i;
3383 int n = argcount;
3384 PyObject *kwdict = NULL;
Tim Peters5ca576e2001-06-18 22:08:13 +00003385
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003386 if (globals == NULL) {
3387 PyErr_SetString(PyExc_SystemError,
3388 "PyEval_EvalCodeEx: NULL globals");
3389 return NULL;
3390 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003391
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003392 assert(tstate != NULL);
3393 assert(globals != NULL);
3394 f = PyFrame_New(tstate, co, globals, locals);
3395 if (f == NULL)
3396 return NULL;
Tim Peters5ca576e2001-06-18 22:08:13 +00003397
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003398 fastlocals = f->f_localsplus;
3399 freevars = f->f_localsplus + co->co_nlocals;
Tim Peters5ca576e2001-06-18 22:08:13 +00003400
Benjamin Petersonb204a422011-06-05 22:04:07 -05003401 /* Parse arguments. */
3402 if (co->co_flags & CO_VARKEYWORDS) {
3403 kwdict = PyDict_New();
3404 if (kwdict == NULL)
3405 goto fail;
3406 i = total_args;
3407 if (co->co_flags & CO_VARARGS)
3408 i++;
3409 SETLOCAL(i, kwdict);
3410 }
3411 if (argcount > co->co_argcount)
3412 n = co->co_argcount;
3413 for (i = 0; i < n; i++) {
3414 x = args[i];
3415 Py_INCREF(x);
3416 SETLOCAL(i, x);
3417 }
3418 if (co->co_flags & CO_VARARGS) {
3419 u = PyTuple_New(argcount - n);
3420 if (u == NULL)
3421 goto fail;
3422 SETLOCAL(total_args, u);
3423 for (i = n; i < argcount; i++) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003424 x = args[i];
3425 Py_INCREF(x);
Benjamin Petersonb204a422011-06-05 22:04:07 -05003426 PyTuple_SET_ITEM(u, i-n, x);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003427 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05003428 }
3429 for (i = 0; i < kwcount; i++) {
3430 PyObject **co_varnames;
3431 PyObject *keyword = kws[2*i];
3432 PyObject *value = kws[2*i + 1];
3433 int j;
3434 if (keyword == NULL || !PyUnicode_Check(keyword)) {
3435 PyErr_Format(PyExc_TypeError,
3436 "%U() keywords must be strings",
3437 co->co_name);
3438 goto fail;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003439 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05003440 /* Speed hack: do raw pointer compares. As names are
3441 normally interned this should almost always hit. */
3442 co_varnames = ((PyTupleObject *)(co->co_varnames))->ob_item;
3443 for (j = 0; j < total_args; j++) {
3444 PyObject *nm = co_varnames[j];
3445 if (nm == keyword)
3446 goto kw_found;
3447 }
3448 /* Slow fallback, just in case */
3449 for (j = 0; j < total_args; j++) {
3450 PyObject *nm = co_varnames[j];
3451 int cmp = PyObject_RichCompareBool(
3452 keyword, nm, Py_EQ);
3453 if (cmp > 0)
3454 goto kw_found;
3455 else if (cmp < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003456 goto fail;
Benjamin Petersonb204a422011-06-05 22:04:07 -05003457 }
3458 if (j >= total_args && kwdict == NULL) {
3459 PyErr_Format(PyExc_TypeError,
3460 "%U() got an unexpected "
3461 "keyword argument '%S'",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003462 co->co_name,
3463 keyword);
Benjamin Petersonb204a422011-06-05 22:04:07 -05003464 goto fail;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003465 }
Christian Heimes0bd447f2013-07-20 14:48:10 +02003466 if (PyDict_SetItem(kwdict, keyword, value) == -1) {
3467 goto fail;
3468 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05003469 continue;
3470 kw_found:
3471 if (GETLOCAL(j) != NULL) {
3472 PyErr_Format(PyExc_TypeError,
3473 "%U() got multiple "
3474 "values for argument '%S'",
3475 co->co_name,
3476 keyword);
3477 goto fail;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003478 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05003479 Py_INCREF(value);
3480 SETLOCAL(j, value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003481 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05003482 if (argcount > co->co_argcount && !(co->co_flags & CO_VARARGS)) {
Benjamin Petersone109c702011-06-24 09:37:26 -05003483 too_many_positional(co, argcount, defcount, fastlocals);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003484 goto fail;
3485 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05003486 if (argcount < co->co_argcount) {
3487 int m = co->co_argcount - defcount;
Benjamin Petersone109c702011-06-24 09:37:26 -05003488 int missing = 0;
3489 for (i = argcount; i < m; i++)
3490 if (GETLOCAL(i) == NULL)
3491 missing++;
3492 if (missing) {
3493 missing_arguments(co, missing, defcount, fastlocals);
3494 goto fail;
Benjamin Petersonb204a422011-06-05 22:04:07 -05003495 }
3496 if (n > m)
3497 i = n - m;
3498 else
3499 i = 0;
3500 for (; i < defcount; i++) {
3501 if (GETLOCAL(m+i) == NULL) {
3502 PyObject *def = defs[i];
3503 Py_INCREF(def);
3504 SETLOCAL(m+i, def);
3505 }
3506 }
3507 }
3508 if (co->co_kwonlyargcount > 0) {
Benjamin Petersone109c702011-06-24 09:37:26 -05003509 int missing = 0;
Benjamin Petersonb204a422011-06-05 22:04:07 -05003510 for (i = co->co_argcount; i < total_args; i++) {
3511 PyObject *name;
3512 if (GETLOCAL(i) != NULL)
3513 continue;
3514 name = PyTuple_GET_ITEM(co->co_varnames, i);
3515 if (kwdefs != NULL) {
3516 PyObject *def = PyDict_GetItem(kwdefs, name);
3517 if (def) {
3518 Py_INCREF(def);
3519 SETLOCAL(i, def);
3520 continue;
3521 }
3522 }
Benjamin Petersone109c702011-06-24 09:37:26 -05003523 missing++;
3524 }
3525 if (missing) {
3526 missing_arguments(co, missing, -1, fastlocals);
Benjamin Petersonb204a422011-06-05 22:04:07 -05003527 goto fail;
3528 }
3529 }
3530
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003531 /* Allocate and initialize storage for cell vars, and copy free
Benjamin Peterson90037602011-06-25 22:54:45 -05003532 vars into frame. */
3533 for (i = 0; i < PyTuple_GET_SIZE(co->co_cellvars); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003534 PyObject *c;
Benjamin Peterson90037602011-06-25 22:54:45 -05003535 int arg;
3536 /* Possibly account for the cell variable being an argument. */
3537 if (co->co_cell2arg != NULL &&
Guido van Rossum6832c812013-05-10 08:47:42 -07003538 (arg = co->co_cell2arg[i]) != CO_CELL_NOT_AN_ARG) {
Benjamin Peterson90037602011-06-25 22:54:45 -05003539 c = PyCell_New(GETLOCAL(arg));
Benjamin Peterson159ae412013-05-12 18:16:06 -05003540 /* Clear the local copy. */
3541 SETLOCAL(arg, NULL);
Guido van Rossum6832c812013-05-10 08:47:42 -07003542 }
3543 else {
Benjamin Peterson90037602011-06-25 22:54:45 -05003544 c = PyCell_New(NULL);
Guido van Rossum6832c812013-05-10 08:47:42 -07003545 }
Benjamin Peterson159ae412013-05-12 18:16:06 -05003546 if (c == NULL)
3547 goto fail;
Benjamin Peterson90037602011-06-25 22:54:45 -05003548 SETLOCAL(co->co_nlocals + i, c);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003549 }
Benjamin Peterson90037602011-06-25 22:54:45 -05003550 for (i = 0; i < PyTuple_GET_SIZE(co->co_freevars); ++i) {
3551 PyObject *o = PyTuple_GET_ITEM(closure, i);
3552 Py_INCREF(o);
3553 freevars[PyTuple_GET_SIZE(co->co_cellvars) + i] = o;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003554 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003555
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003556 if (co->co_flags & CO_GENERATOR) {
3557 /* Don't need to keep the reference to f_back, it will be set
3558 * when the generator is resumed. */
3559 Py_XDECREF(f->f_back);
3560 f->f_back = NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00003561
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003562 PCALL(PCALL_GENERATOR);
Jeremy Hylton985eba52003-02-05 23:13:00 +00003563
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003564 /* Create a new generator that owns the ready to run frame
3565 * and return that as the value. */
3566 return PyGen_New(f);
3567 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003568
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003569 retval = PyEval_EvalFrameEx(f,0);
Tim Peters5ca576e2001-06-18 22:08:13 +00003570
Thomas Woutersce272b62007-09-19 21:19:28 +00003571fail: /* Jump here from prelude on failure */
Tim Peters5ca576e2001-06-18 22:08:13 +00003572
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003573 /* decref'ing the frame can cause __del__ methods to get invoked,
3574 which can call back into Python. While we're done with the
3575 current Python frame (f), the associated C stack is still in use,
3576 so recursion_depth must be boosted for the duration.
3577 */
3578 assert(tstate != NULL);
3579 ++tstate->recursion_depth;
3580 Py_DECREF(f);
3581 --tstate->recursion_depth;
3582 return retval;
Tim Peters5ca576e2001-06-18 22:08:13 +00003583}
3584
3585
Benjamin Peterson876b2f22009-06-28 03:18:59 +00003586static PyObject *
Benjamin Petersonce798522012-01-22 11:24:29 -05003587special_lookup(PyObject *o, _Py_Identifier *id)
Benjamin Peterson876b2f22009-06-28 03:18:59 +00003588{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003589 PyObject *res;
Benjamin Petersonce798522012-01-22 11:24:29 -05003590 res = _PyObject_LookupSpecial(o, id);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003591 if (res == NULL && !PyErr_Occurred()) {
Benjamin Petersonce798522012-01-22 11:24:29 -05003592 PyErr_SetObject(PyExc_AttributeError, id->object);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003593 return NULL;
3594 }
3595 return res;
Benjamin Peterson876b2f22009-06-28 03:18:59 +00003596}
3597
3598
Benjamin Peterson87880242011-07-03 16:48:31 -05003599/* These 3 functions deal with the exception state of generators. */
3600
3601static void
3602save_exc_state(PyThreadState *tstate, PyFrameObject *f)
3603{
3604 PyObject *type, *value, *traceback;
3605 Py_XINCREF(tstate->exc_type);
3606 Py_XINCREF(tstate->exc_value);
3607 Py_XINCREF(tstate->exc_traceback);
3608 type = f->f_exc_type;
3609 value = f->f_exc_value;
3610 traceback = f->f_exc_traceback;
3611 f->f_exc_type = tstate->exc_type;
3612 f->f_exc_value = tstate->exc_value;
3613 f->f_exc_traceback = tstate->exc_traceback;
3614 Py_XDECREF(type);
3615 Py_XDECREF(value);
Victor Stinnerd2a915d2011-10-02 20:34:20 +02003616 Py_XDECREF(traceback);
Benjamin Peterson87880242011-07-03 16:48:31 -05003617}
3618
3619static void
3620swap_exc_state(PyThreadState *tstate, PyFrameObject *f)
3621{
3622 PyObject *tmp;
3623 tmp = tstate->exc_type;
3624 tstate->exc_type = f->f_exc_type;
3625 f->f_exc_type = tmp;
3626 tmp = tstate->exc_value;
3627 tstate->exc_value = f->f_exc_value;
3628 f->f_exc_value = tmp;
3629 tmp = tstate->exc_traceback;
3630 tstate->exc_traceback = f->f_exc_traceback;
3631 f->f_exc_traceback = tmp;
3632}
3633
3634static void
3635restore_and_clear_exc_state(PyThreadState *tstate, PyFrameObject *f)
3636{
3637 PyObject *type, *value, *tb;
3638 type = tstate->exc_type;
3639 value = tstate->exc_value;
3640 tb = tstate->exc_traceback;
3641 tstate->exc_type = f->f_exc_type;
3642 tstate->exc_value = f->f_exc_value;
3643 tstate->exc_traceback = f->f_exc_traceback;
3644 f->f_exc_type = NULL;
3645 f->f_exc_value = NULL;
3646 f->f_exc_traceback = NULL;
3647 Py_XDECREF(type);
3648 Py_XDECREF(value);
3649 Py_XDECREF(tb);
3650}
3651
3652
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003653/* Logic for the raise statement (too complicated for inlining).
3654 This *consumes* a reference count to each of its arguments. */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003655static int
Collin Winter828f04a2007-08-31 00:04:24 +00003656do_raise(PyObject *exc, PyObject *cause)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003657{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003658 PyObject *type = NULL, *value = NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00003659
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003660 if (exc == NULL) {
3661 /* Reraise */
3662 PyThreadState *tstate = PyThreadState_GET();
3663 PyObject *tb;
3664 type = tstate->exc_type;
3665 value = tstate->exc_value;
3666 tb = tstate->exc_traceback;
3667 if (type == Py_None) {
3668 PyErr_SetString(PyExc_RuntimeError,
3669 "No active exception to reraise");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003670 return 0;
3671 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003672 Py_XINCREF(type);
3673 Py_XINCREF(value);
3674 Py_XINCREF(tb);
3675 PyErr_Restore(type, value, tb);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003676 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003677 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003678
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003679 /* We support the following forms of raise:
3680 raise
Collin Winter828f04a2007-08-31 00:04:24 +00003681 raise <instance>
3682 raise <type> */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003683
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003684 if (PyExceptionClass_Check(exc)) {
3685 type = exc;
3686 value = PyObject_CallObject(exc, NULL);
3687 if (value == NULL)
3688 goto raise_error;
Benjamin Peterson5afa03a2011-07-15 14:09:26 -05003689 if (!PyExceptionInstance_Check(value)) {
3690 PyErr_Format(PyExc_TypeError,
3691 "calling %R should have returned an instance of "
3692 "BaseException, not %R",
3693 type, Py_TYPE(value));
3694 goto raise_error;
3695 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003696 }
3697 else if (PyExceptionInstance_Check(exc)) {
3698 value = exc;
3699 type = PyExceptionInstance_Class(exc);
3700 Py_INCREF(type);
3701 }
3702 else {
3703 /* Not something you can raise. You get an exception
3704 anyway, just not what you specified :-) */
3705 Py_DECREF(exc);
3706 PyErr_SetString(PyExc_TypeError,
3707 "exceptions must derive from BaseException");
3708 goto raise_error;
3709 }
Collin Winter828f04a2007-08-31 00:04:24 +00003710
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003711 if (cause) {
3712 PyObject *fixed_cause;
3713 if (PyExceptionClass_Check(cause)) {
3714 fixed_cause = PyObject_CallObject(cause, NULL);
3715 if (fixed_cause == NULL)
3716 goto raise_error;
Benjamin Petersond5a1c442012-05-14 22:09:31 -07003717 Py_DECREF(cause);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003718 }
Benjamin Petersond5a1c442012-05-14 22:09:31 -07003719 else if (PyExceptionInstance_Check(cause)) {
3720 fixed_cause = cause;
3721 }
3722 else if (cause == Py_None) {
3723 Py_DECREF(cause);
3724 fixed_cause = NULL;
3725 }
3726 else {
3727 PyErr_SetString(PyExc_TypeError,
3728 "exception causes must derive from "
3729 "BaseException");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003730 goto raise_error;
3731 }
Benjamin Petersond5a1c442012-05-14 22:09:31 -07003732 PyException_SetCause(value, fixed_cause);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003733 }
Collin Winter828f04a2007-08-31 00:04:24 +00003734
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003735 PyErr_SetObject(type, value);
3736 /* PyErr_SetObject incref's its arguments */
3737 Py_XDECREF(value);
3738 Py_XDECREF(type);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003739 return 0;
Collin Winter828f04a2007-08-31 00:04:24 +00003740
3741raise_error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003742 Py_XDECREF(value);
3743 Py_XDECREF(type);
3744 Py_XDECREF(cause);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003745 return 0;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003746}
3747
Tim Petersd6d010b2001-06-21 02:49:55 +00003748/* Iterate v argcnt times and store the results on the stack (via decreasing
Guido van Rossum0368b722007-05-11 16:50:42 +00003749 sp). Return 1 for success, 0 if error.
Antoine Pitrou9a2310d2008-07-25 22:39:39 +00003750
Guido van Rossum0368b722007-05-11 16:50:42 +00003751 If argcntafter == -1, do a simple unpack. If it is >= 0, do an unpack
3752 with a variable target.
3753*/
Tim Petersd6d010b2001-06-21 02:49:55 +00003754
Barry Warsawe42b18f1997-08-25 22:13:04 +00003755static int
Guido van Rossum0368b722007-05-11 16:50:42 +00003756unpack_iterable(PyObject *v, int argcnt, int argcntafter, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00003757{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003758 int i = 0, j = 0;
3759 Py_ssize_t ll = 0;
3760 PyObject *it; /* iter(v) */
3761 PyObject *w;
3762 PyObject *l = NULL; /* variable list */
Guido van Rossumac7be682001-01-17 15:42:30 +00003763
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003764 assert(v != NULL);
Tim Petersd6d010b2001-06-21 02:49:55 +00003765
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003766 it = PyObject_GetIter(v);
3767 if (it == NULL)
3768 goto Error;
Tim Petersd6d010b2001-06-21 02:49:55 +00003769
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003770 for (; i < argcnt; i++) {
3771 w = PyIter_Next(it);
3772 if (w == NULL) {
3773 /* Iterator done, via error or exhaustion. */
3774 if (!PyErr_Occurred()) {
3775 PyErr_Format(PyExc_ValueError,
3776 "need more than %d value%s to unpack",
3777 i, i == 1 ? "" : "s");
3778 }
3779 goto Error;
3780 }
3781 *--sp = w;
3782 }
Tim Petersd6d010b2001-06-21 02:49:55 +00003783
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003784 if (argcntafter == -1) {
3785 /* We better have exhausted the iterator now. */
3786 w = PyIter_Next(it);
3787 if (w == NULL) {
3788 if (PyErr_Occurred())
3789 goto Error;
3790 Py_DECREF(it);
3791 return 1;
3792 }
3793 Py_DECREF(w);
Georg Brandl0310a832010-07-10 10:32:36 +00003794 PyErr_Format(PyExc_ValueError, "too many values to unpack "
3795 "(expected %d)", argcnt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003796 goto Error;
3797 }
Guido van Rossum0368b722007-05-11 16:50:42 +00003798
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003799 l = PySequence_List(it);
3800 if (l == NULL)
3801 goto Error;
3802 *--sp = l;
3803 i++;
Guido van Rossum0368b722007-05-11 16:50:42 +00003804
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003805 ll = PyList_GET_SIZE(l);
3806 if (ll < argcntafter) {
3807 PyErr_Format(PyExc_ValueError, "need more than %zd values to unpack",
3808 argcnt + ll);
3809 goto Error;
3810 }
Guido van Rossum0368b722007-05-11 16:50:42 +00003811
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003812 /* Pop the "after-variable" args off the list. */
3813 for (j = argcntafter; j > 0; j--, i++) {
3814 *--sp = PyList_GET_ITEM(l, ll - j);
3815 }
3816 /* Resize the list. */
3817 Py_SIZE(l) = ll - argcntafter;
3818 Py_DECREF(it);
3819 return 1;
Guido van Rossum0368b722007-05-11 16:50:42 +00003820
Tim Petersd6d010b2001-06-21 02:49:55 +00003821Error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003822 for (; i > 0; i--, sp++)
3823 Py_DECREF(*sp);
3824 Py_XDECREF(it);
3825 return 0;
Barry Warsawe42b18f1997-08-25 22:13:04 +00003826}
3827
3828
Guido van Rossum96a42c81992-01-12 02:29:51 +00003829#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00003830static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003831prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003832{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003833 printf("%s ", str);
3834 if (PyObject_Print(v, stdout, 0) != 0)
3835 PyErr_Clear(); /* Don't know what else to do */
3836 printf("\n");
3837 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003838}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003839#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003840
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003841static void
Fred Drake5755ce62001-06-27 19:19:46 +00003842call_exc_trace(Py_tracefunc func, PyObject *self, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003843{
Victor Stinneraaa8ed82013-07-10 13:57:55 +02003844 PyObject *type, *value, *traceback, *orig_traceback, *arg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003845 int err;
3846 PyErr_Fetch(&type, &value, &traceback);
3847 if (value == NULL) {
3848 value = Py_None;
3849 Py_INCREF(value);
3850 }
R David Murray35837612013-04-19 12:56:57 -04003851 PyErr_NormalizeException(&type, &value, &traceback);
Victor Stinneraaa8ed82013-07-10 13:57:55 +02003852 orig_traceback = traceback;
3853 if (traceback == NULL) {
3854 Py_INCREF(Py_None);
3855 traceback = Py_None;
3856 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003857 arg = PyTuple_Pack(3, type, value, traceback);
3858 if (arg == NULL) {
3859 PyErr_Restore(type, value, traceback);
3860 return;
3861 }
3862 err = call_trace(func, self, f, PyTrace_EXCEPTION, arg);
3863 Py_DECREF(arg);
3864 if (err == 0)
Victor Stinneraaa8ed82013-07-10 13:57:55 +02003865 PyErr_Restore(type, value, orig_traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003866 else {
3867 Py_XDECREF(type);
3868 Py_XDECREF(value);
Victor Stinneraaa8ed82013-07-10 13:57:55 +02003869 Py_XDECREF(orig_traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003870 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003871}
3872
Amaury Forgeot d'Arcf05149a2007-11-13 01:05:30 +00003873static int
Fred Drake4ec5d562001-10-04 19:26:43 +00003874call_trace_protected(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003875 int what, PyObject *arg)
Fred Drake4ec5d562001-10-04 19:26:43 +00003876{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003877 PyObject *type, *value, *traceback;
3878 int err;
3879 PyErr_Fetch(&type, &value, &traceback);
3880 err = call_trace(func, obj, frame, what, arg);
3881 if (err == 0)
3882 {
3883 PyErr_Restore(type, value, traceback);
3884 return 0;
3885 }
3886 else {
3887 Py_XDECREF(type);
3888 Py_XDECREF(value);
3889 Py_XDECREF(traceback);
3890 return -1;
3891 }
Fred Drake4ec5d562001-10-04 19:26:43 +00003892}
3893
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003894static int
Fred Drake5755ce62001-06-27 19:19:46 +00003895call_trace(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003896 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00003897{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02003898 PyThreadState *tstate = frame->f_tstate;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003899 int result;
3900 if (tstate->tracing)
3901 return 0;
3902 tstate->tracing++;
3903 tstate->use_tracing = 0;
3904 result = func(obj, frame, what, arg);
3905 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
3906 || (tstate->c_profilefunc != NULL));
3907 tstate->tracing--;
3908 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00003909}
3910
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00003911PyObject *
3912_PyEval_CallTracing(PyObject *func, PyObject *args)
3913{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003914 PyFrameObject *frame = PyEval_GetFrame();
3915 PyThreadState *tstate = frame->f_tstate;
3916 int save_tracing = tstate->tracing;
3917 int save_use_tracing = tstate->use_tracing;
3918 PyObject *result;
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00003919
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003920 tstate->tracing = 0;
3921 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
3922 || (tstate->c_profilefunc != NULL));
3923 result = PyObject_Call(func, args, NULL);
3924 tstate->tracing = save_tracing;
3925 tstate->use_tracing = save_use_tracing;
3926 return result;
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00003927}
3928
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003929/* See Objects/lnotab_notes.txt for a description of how tracing works. */
Michael W. Hudson006c7522002-11-08 13:08:46 +00003930static int
Tim Peters8a5c3c72004-04-05 19:36:21 +00003931maybe_call_line_trace(Py_tracefunc func, PyObject *obj,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003932 PyFrameObject *frame, int *instr_lb, int *instr_ub,
3933 int *instr_prev)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003934{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003935 int result = 0;
3936 int line = frame->f_lineno;
Michael W. Hudson006c7522002-11-08 13:08:46 +00003937
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003938 /* If the last instruction executed isn't in the current
3939 instruction window, reset the window.
3940 */
3941 if (frame->f_lasti < *instr_lb || frame->f_lasti >= *instr_ub) {
3942 PyAddrPair bounds;
3943 line = _PyCode_CheckLineNumber(frame->f_code, frame->f_lasti,
3944 &bounds);
3945 *instr_lb = bounds.ap_lower;
3946 *instr_ub = bounds.ap_upper;
3947 }
3948 /* If the last instruction falls at the start of a line or if
3949 it represents a jump backwards, update the frame's line
3950 number and call the trace function. */
3951 if (frame->f_lasti == *instr_lb || frame->f_lasti < *instr_prev) {
3952 frame->f_lineno = line;
3953 result = call_trace(func, obj, frame, PyTrace_LINE, Py_None);
3954 }
3955 *instr_prev = frame->f_lasti;
3956 return result;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003957}
3958
Fred Drake5755ce62001-06-27 19:19:46 +00003959void
3960PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00003961{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003962 PyThreadState *tstate = PyThreadState_GET();
3963 PyObject *temp = tstate->c_profileobj;
3964 Py_XINCREF(arg);
3965 tstate->c_profilefunc = NULL;
3966 tstate->c_profileobj = NULL;
3967 /* Must make sure that tracing is not ignored if 'temp' is freed */
3968 tstate->use_tracing = tstate->c_tracefunc != NULL;
3969 Py_XDECREF(temp);
3970 tstate->c_profilefunc = func;
3971 tstate->c_profileobj = arg;
3972 /* Flag that tracing or profiling is turned on */
3973 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
Fred Drake5755ce62001-06-27 19:19:46 +00003974}
3975
3976void
3977PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
3978{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003979 PyThreadState *tstate = PyThreadState_GET();
3980 PyObject *temp = tstate->c_traceobj;
3981 _Py_TracingPossible += (func != NULL) - (tstate->c_tracefunc != NULL);
3982 Py_XINCREF(arg);
3983 tstate->c_tracefunc = NULL;
3984 tstate->c_traceobj = NULL;
3985 /* Must make sure that profiling is not ignored if 'temp' is freed */
3986 tstate->use_tracing = tstate->c_profilefunc != NULL;
3987 Py_XDECREF(temp);
3988 tstate->c_tracefunc = func;
3989 tstate->c_traceobj = arg;
3990 /* Flag that tracing or profiling is turned on */
3991 tstate->use_tracing = ((func != NULL)
3992 || (tstate->c_profilefunc != NULL));
Fred Draked0838392001-06-16 21:02:31 +00003993}
3994
Guido van Rossumb209a111997-04-29 18:18:01 +00003995PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003996PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00003997{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003998 PyFrameObject *current_frame = PyEval_GetFrame();
3999 if (current_frame == NULL)
4000 return PyThreadState_GET()->interp->builtins;
4001 else
4002 return current_frame->f_builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00004003}
4004
Guido van Rossumb209a111997-04-29 18:18:01 +00004005PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004006PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00004007{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004008 PyFrameObject *current_frame = PyEval_GetFrame();
4009 if (current_frame == NULL)
4010 return NULL;
4011 PyFrame_FastToLocals(current_frame);
4012 return current_frame->f_locals;
Guido van Rossum5b722181993-03-30 17:46:03 +00004013}
4014
Guido van Rossumb209a111997-04-29 18:18:01 +00004015PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004016PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00004017{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004018 PyFrameObject *current_frame = PyEval_GetFrame();
4019 if (current_frame == NULL)
4020 return NULL;
4021 else
4022 return current_frame->f_globals;
Guido van Rossum3f5da241990-12-20 15:06:42 +00004023}
4024
Guido van Rossum6297a7a2003-02-19 15:53:17 +00004025PyFrameObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004026PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00004027{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004028 PyThreadState *tstate = PyThreadState_GET();
4029 return _PyThreadState_GetFrame(tstate);
Guido van Rossume59214e1994-08-30 08:01:59 +00004030}
4031
Guido van Rossum6135a871995-01-09 17:53:26 +00004032int
Tim Peters5ba58662001-07-16 02:29:45 +00004033PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
Jeremy Hylton061d1062001-03-22 02:32:48 +00004034{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004035 PyFrameObject *current_frame = PyEval_GetFrame();
4036 int result = cf->cf_flags != 0;
Tim Peters5ba58662001-07-16 02:29:45 +00004037
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004038 if (current_frame != NULL) {
4039 const int codeflags = current_frame->f_code->co_flags;
4040 const int compilerflags = codeflags & PyCF_MASK;
4041 if (compilerflags) {
4042 result = 1;
4043 cf->cf_flags |= compilerflags;
4044 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00004045#if 0 /* future keyword */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004046 if (codeflags & CO_GENERATOR_ALLOWED) {
4047 result = 1;
4048 cf->cf_flags |= CO_GENERATOR_ALLOWED;
4049 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00004050#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004051 }
4052 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00004053}
4054
Guido van Rossum3f5da241990-12-20 15:06:42 +00004055
Guido van Rossum681d79a1995-07-18 14:51:37 +00004056/* External interface to call any callable object.
Antoine Pitrou8689a102010-04-01 16:53:15 +00004057 The arg must be a tuple or NULL. The kw must be a dict or NULL. */
Guido van Rossume59214e1994-08-30 08:01:59 +00004058
Guido van Rossumb209a111997-04-29 18:18:01 +00004059PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004060PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004061{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004062 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004063
Victor Stinnerace47d72013-07-18 01:41:08 +02004064#ifdef Py_DEBUG
4065 /* PyEval_CallObjectWithKeywords() must not be called with an exception
4066 set, because it may clear it (directly or indirectly)
4067 and so the caller looses its exception */
4068 assert(!PyErr_Occurred());
4069#endif
4070
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004071 if (arg == NULL) {
4072 arg = PyTuple_New(0);
4073 if (arg == NULL)
4074 return NULL;
4075 }
4076 else if (!PyTuple_Check(arg)) {
4077 PyErr_SetString(PyExc_TypeError,
4078 "argument list must be a tuple");
4079 return NULL;
4080 }
4081 else
4082 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004083
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004084 if (kw != NULL && !PyDict_Check(kw)) {
4085 PyErr_SetString(PyExc_TypeError,
4086 "keyword list must be a dictionary");
4087 Py_DECREF(arg);
4088 return NULL;
4089 }
Guido van Rossume3e61c11995-08-04 04:14:47 +00004090
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004091 result = PyObject_Call(func, arg, kw);
4092 Py_DECREF(arg);
Victor Stinnerace47d72013-07-18 01:41:08 +02004093
4094 assert((result != NULL && !PyErr_Occurred())
4095 || (result == NULL && PyErr_Occurred()));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004096 return result;
Jeremy Hylton52820442001-01-03 23:52:36 +00004097}
4098
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00004099const char *
Tim Peters6d6c1a32001-08-02 04:15:00 +00004100PyEval_GetFuncName(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00004101{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004102 if (PyMethod_Check(func))
4103 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
4104 else if (PyFunction_Check(func))
4105 return _PyUnicode_AsString(((PyFunctionObject*)func)->func_name);
4106 else if (PyCFunction_Check(func))
4107 return ((PyCFunctionObject*)func)->m_ml->ml_name;
4108 else
4109 return func->ob_type->tp_name;
Jeremy Hylton512a2372001-04-11 13:52:29 +00004110}
4111
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00004112const char *
Tim Peters6d6c1a32001-08-02 04:15:00 +00004113PyEval_GetFuncDesc(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00004114{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004115 if (PyMethod_Check(func))
4116 return "()";
4117 else if (PyFunction_Check(func))
4118 return "()";
4119 else if (PyCFunction_Check(func))
4120 return "()";
4121 else
4122 return " object";
Jeremy Hylton512a2372001-04-11 13:52:29 +00004123}
4124
Neal Norwitzaddfe0c2002-11-10 14:33:26 +00004125static void
Jeremy Hylton192690e2002-08-16 18:36:11 +00004126err_args(PyObject *func, int flags, int nargs)
4127{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004128 if (flags & METH_NOARGS)
4129 PyErr_Format(PyExc_TypeError,
4130 "%.200s() takes no arguments (%d given)",
4131 ((PyCFunctionObject *)func)->m_ml->ml_name,
4132 nargs);
4133 else
4134 PyErr_Format(PyExc_TypeError,
4135 "%.200s() takes exactly one argument (%d given)",
4136 ((PyCFunctionObject *)func)->m_ml->ml_name,
4137 nargs);
Jeremy Hylton192690e2002-08-16 18:36:11 +00004138}
4139
Armin Rigo1c2d7e52005-09-20 18:34:01 +00004140#define C_TRACE(x, call) \
Nicholas Bastind858a772004-06-25 23:31:06 +00004141if (tstate->use_tracing && tstate->c_profilefunc) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004142 if (call_trace(tstate->c_profilefunc, \
4143 tstate->c_profileobj, \
4144 tstate->frame, PyTrace_C_CALL, \
4145 func)) { \
4146 x = NULL; \
4147 } \
4148 else { \
4149 x = call; \
4150 if (tstate->c_profilefunc != NULL) { \
4151 if (x == NULL) { \
4152 call_trace_protected(tstate->c_profilefunc, \
4153 tstate->c_profileobj, \
4154 tstate->frame, PyTrace_C_EXCEPTION, \
4155 func); \
4156 /* XXX should pass (type, value, tb) */ \
4157 } else { \
4158 if (call_trace(tstate->c_profilefunc, \
4159 tstate->c_profileobj, \
4160 tstate->frame, PyTrace_C_RETURN, \
4161 func)) { \
4162 Py_DECREF(x); \
4163 x = NULL; \
4164 } \
4165 } \
4166 } \
4167 } \
Nicholas Bastind858a772004-06-25 23:31:06 +00004168} else { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004169 x = call; \
4170 }
Nicholas Bastinc69ebe82004-03-24 21:57:10 +00004171
Jeremy Hyltone8c04322002-08-16 17:47:26 +00004172static PyObject *
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00004173call_function(PyObject ***pp_stack, int oparg
4174#ifdef WITH_TSC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004175 , uint64* pintr0, uint64* pintr1
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00004176#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004177 )
Jeremy Hyltone8c04322002-08-16 17:47:26 +00004178{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004179 int na = oparg & 0xff;
4180 int nk = (oparg>>8) & 0xff;
4181 int n = na + 2 * nk;
4182 PyObject **pfunc = (*pp_stack) - n - 1;
4183 PyObject *func = *pfunc;
4184 PyObject *x, *w;
Jeremy Hyltone8c04322002-08-16 17:47:26 +00004185
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004186 /* Always dispatch PyCFunction first, because these are
4187 presumed to be the most frequent callable object.
4188 */
4189 if (PyCFunction_Check(func) && nk == 0) {
4190 int flags = PyCFunction_GET_FLAGS(func);
4191 PyThreadState *tstate = PyThreadState_GET();
Raymond Hettingera7f56bc2004-06-26 04:34:33 +00004192
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004193 PCALL(PCALL_CFUNCTION);
4194 if (flags & (METH_NOARGS | METH_O)) {
4195 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
4196 PyObject *self = PyCFunction_GET_SELF(func);
4197 if (flags & METH_NOARGS && na == 0) {
4198 C_TRACE(x, (*meth)(self,NULL));
4199 }
4200 else if (flags & METH_O && na == 1) {
4201 PyObject *arg = EXT_POP(*pp_stack);
4202 C_TRACE(x, (*meth)(self,arg));
4203 Py_DECREF(arg);
4204 }
4205 else {
4206 err_args(func, flags, na);
4207 x = NULL;
4208 }
4209 }
4210 else {
4211 PyObject *callargs;
4212 callargs = load_args(pp_stack, na);
Victor Stinner0ff0f542013-07-08 22:27:42 +02004213 if (callargs != NULL) {
4214 READ_TIMESTAMP(*pintr0);
4215 C_TRACE(x, PyCFunction_Call(func,callargs,NULL));
4216 READ_TIMESTAMP(*pintr1);
4217 Py_XDECREF(callargs);
4218 }
4219 else {
4220 x = NULL;
4221 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004222 }
4223 } else {
4224 if (PyMethod_Check(func) && PyMethod_GET_SELF(func) != NULL) {
4225 /* optimize access to bound methods */
4226 PyObject *self = PyMethod_GET_SELF(func);
4227 PCALL(PCALL_METHOD);
4228 PCALL(PCALL_BOUND_METHOD);
4229 Py_INCREF(self);
4230 func = PyMethod_GET_FUNCTION(func);
4231 Py_INCREF(func);
4232 Py_DECREF(*pfunc);
4233 *pfunc = self;
4234 na++;
4235 n++;
4236 } else
4237 Py_INCREF(func);
4238 READ_TIMESTAMP(*pintr0);
4239 if (PyFunction_Check(func))
4240 x = fast_function(func, pp_stack, n, na, nk);
4241 else
4242 x = do_call(func, pp_stack, na, nk);
4243 READ_TIMESTAMP(*pintr1);
4244 Py_DECREF(func);
4245 }
Victor Stinnerf243ee42013-07-16 01:02:12 +02004246 assert((x != NULL && !PyErr_Occurred())
4247 || (x == NULL && PyErr_Occurred()));
Tim Peters8a5c3c72004-04-05 19:36:21 +00004248
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004249 /* Clear the stack of the function object. Also removes
4250 the arguments in case they weren't consumed already
4251 (fast_function() and err_args() leave them on the stack).
4252 */
4253 while ((*pp_stack) > pfunc) {
4254 w = EXT_POP(*pp_stack);
4255 Py_DECREF(w);
4256 PCALL(PCALL_POP);
4257 }
Victor Stinnerace47d72013-07-18 01:41:08 +02004258
4259 assert((x != NULL && !PyErr_Occurred())
4260 || (x == NULL && PyErr_Occurred()));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004261 return x;
Jeremy Hyltone8c04322002-08-16 17:47:26 +00004262}
4263
Jeremy Hylton192690e2002-08-16 18:36:11 +00004264/* The fast_function() function optimize calls for which no argument
Jeremy Hylton52820442001-01-03 23:52:36 +00004265 tuple is necessary; the objects are passed directly from the stack.
Jeremy Hylton985eba52003-02-05 23:13:00 +00004266 For the simplest case -- a function that takes only positional
4267 arguments and is called with only positional arguments -- it
4268 inlines the most primitive frame setup code from
4269 PyEval_EvalCodeEx(), which vastly reduces the checks that must be
4270 done before evaluating the frame.
Jeremy Hylton52820442001-01-03 23:52:36 +00004271*/
4272
4273static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00004274fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00004275{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004276 PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func);
4277 PyObject *globals = PyFunction_GET_GLOBALS(func);
4278 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
4279 PyObject *kwdefs = PyFunction_GET_KW_DEFAULTS(func);
4280 PyObject **d = NULL;
4281 int nd = 0;
Jeremy Hylton52820442001-01-03 23:52:36 +00004282
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004283 PCALL(PCALL_FUNCTION);
4284 PCALL(PCALL_FAST_FUNCTION);
4285 if (argdefs == NULL && co->co_argcount == n &&
4286 co->co_kwonlyargcount == 0 && nk==0 &&
4287 co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) {
4288 PyFrameObject *f;
4289 PyObject *retval = NULL;
4290 PyThreadState *tstate = PyThreadState_GET();
4291 PyObject **fastlocals, **stack;
4292 int i;
Jeremy Hylton985eba52003-02-05 23:13:00 +00004293
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004294 PCALL(PCALL_FASTER_FUNCTION);
4295 assert(globals != NULL);
4296 /* XXX Perhaps we should create a specialized
4297 PyFrame_New() that doesn't take locals, but does
4298 take builtins without sanity checking them.
4299 */
4300 assert(tstate != NULL);
4301 f = PyFrame_New(tstate, co, globals, NULL);
4302 if (f == NULL)
4303 return NULL;
Jeremy Hylton985eba52003-02-05 23:13:00 +00004304
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004305 fastlocals = f->f_localsplus;
4306 stack = (*pp_stack) - n;
Jeremy Hylton985eba52003-02-05 23:13:00 +00004307
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004308 for (i = 0; i < n; i++) {
4309 Py_INCREF(*stack);
4310 fastlocals[i] = *stack++;
4311 }
4312 retval = PyEval_EvalFrameEx(f,0);
4313 ++tstate->recursion_depth;
4314 Py_DECREF(f);
4315 --tstate->recursion_depth;
4316 return retval;
4317 }
4318 if (argdefs != NULL) {
4319 d = &PyTuple_GET_ITEM(argdefs, 0);
4320 nd = Py_SIZE(argdefs);
4321 }
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00004322 return PyEval_EvalCodeEx((PyObject*)co, globals,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004323 (PyObject *)NULL, (*pp_stack)-n, na,
4324 (*pp_stack)-2*nk, nk, d, nd, kwdefs,
4325 PyFunction_GET_CLOSURE(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00004326}
4327
4328static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00004329update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
4330 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00004331{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004332 PyObject *kwdict = NULL;
4333 if (orig_kwdict == NULL)
4334 kwdict = PyDict_New();
4335 else {
4336 kwdict = PyDict_Copy(orig_kwdict);
4337 Py_DECREF(orig_kwdict);
4338 }
4339 if (kwdict == NULL)
4340 return NULL;
4341 while (--nk >= 0) {
4342 int err;
4343 PyObject *value = EXT_POP(*pp_stack);
4344 PyObject *key = EXT_POP(*pp_stack);
4345 if (PyDict_GetItem(kwdict, key) != NULL) {
4346 PyErr_Format(PyExc_TypeError,
4347 "%.200s%s got multiple values "
4348 "for keyword argument '%U'",
4349 PyEval_GetFuncName(func),
4350 PyEval_GetFuncDesc(func),
4351 key);
4352 Py_DECREF(key);
4353 Py_DECREF(value);
4354 Py_DECREF(kwdict);
4355 return NULL;
4356 }
4357 err = PyDict_SetItem(kwdict, key, value);
4358 Py_DECREF(key);
4359 Py_DECREF(value);
4360 if (err) {
4361 Py_DECREF(kwdict);
4362 return NULL;
4363 }
4364 }
4365 return kwdict;
Jeremy Hylton52820442001-01-03 23:52:36 +00004366}
4367
4368static PyObject *
4369update_star_args(int nstack, int nstar, PyObject *stararg,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004370 PyObject ***pp_stack)
Jeremy Hylton52820442001-01-03 23:52:36 +00004371{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004372 PyObject *callargs, *w;
Jeremy Hylton52820442001-01-03 23:52:36 +00004373
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004374 callargs = PyTuple_New(nstack + nstar);
4375 if (callargs == NULL) {
4376 return NULL;
4377 }
4378 if (nstar) {
4379 int i;
4380 for (i = 0; i < nstar; i++) {
4381 PyObject *a = PyTuple_GET_ITEM(stararg, i);
4382 Py_INCREF(a);
4383 PyTuple_SET_ITEM(callargs, nstack + i, a);
4384 }
4385 }
4386 while (--nstack >= 0) {
4387 w = EXT_POP(*pp_stack);
4388 PyTuple_SET_ITEM(callargs, nstack, w);
4389 }
4390 return callargs;
Jeremy Hylton52820442001-01-03 23:52:36 +00004391}
4392
4393static PyObject *
4394load_args(PyObject ***pp_stack, int na)
4395{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004396 PyObject *args = PyTuple_New(na);
4397 PyObject *w;
Jeremy Hylton52820442001-01-03 23:52:36 +00004398
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004399 if (args == NULL)
4400 return NULL;
4401 while (--na >= 0) {
4402 w = EXT_POP(*pp_stack);
4403 PyTuple_SET_ITEM(args, na, w);
4404 }
4405 return args;
Jeremy Hylton52820442001-01-03 23:52:36 +00004406}
4407
4408static PyObject *
4409do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
4410{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004411 PyObject *callargs = NULL;
4412 PyObject *kwdict = NULL;
4413 PyObject *result = NULL;
Jeremy Hylton52820442001-01-03 23:52:36 +00004414
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004415 if (nk > 0) {
4416 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
4417 if (kwdict == NULL)
4418 goto call_fail;
4419 }
4420 callargs = load_args(pp_stack, na);
4421 if (callargs == NULL)
4422 goto call_fail;
Jeremy Hylton985eba52003-02-05 23:13:00 +00004423#ifdef CALL_PROFILE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004424 /* At this point, we have to look at the type of func to
4425 update the call stats properly. Do it here so as to avoid
4426 exposing the call stats machinery outside ceval.c
4427 */
4428 if (PyFunction_Check(func))
4429 PCALL(PCALL_FUNCTION);
4430 else if (PyMethod_Check(func))
4431 PCALL(PCALL_METHOD);
4432 else if (PyType_Check(func))
4433 PCALL(PCALL_TYPE);
4434 else if (PyCFunction_Check(func))
4435 PCALL(PCALL_CFUNCTION);
4436 else
4437 PCALL(PCALL_OTHER);
Jeremy Hylton985eba52003-02-05 23:13:00 +00004438#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004439 if (PyCFunction_Check(func)) {
4440 PyThreadState *tstate = PyThreadState_GET();
4441 C_TRACE(result, PyCFunction_Call(func, callargs, kwdict));
4442 }
4443 else
4444 result = PyObject_Call(func, callargs, kwdict);
Thomas Wouters7ce29ca2007-09-19 21:56:32 +00004445call_fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004446 Py_XDECREF(callargs);
4447 Py_XDECREF(kwdict);
4448 return result;
Jeremy Hylton52820442001-01-03 23:52:36 +00004449}
4450
4451static PyObject *
4452ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
4453{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004454 int nstar = 0;
4455 PyObject *callargs = NULL;
4456 PyObject *stararg = NULL;
4457 PyObject *kwdict = NULL;
4458 PyObject *result = NULL;
Jeremy Hylton52820442001-01-03 23:52:36 +00004459
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004460 if (flags & CALL_FLAG_KW) {
4461 kwdict = EXT_POP(*pp_stack);
4462 if (!PyDict_Check(kwdict)) {
4463 PyObject *d;
4464 d = PyDict_New();
4465 if (d == NULL)
4466 goto ext_call_fail;
4467 if (PyDict_Update(d, kwdict) != 0) {
4468 Py_DECREF(d);
4469 /* PyDict_Update raises attribute
4470 * error (percolated from an attempt
4471 * to get 'keys' attribute) instead of
4472 * a type error if its second argument
4473 * is not a mapping.
4474 */
4475 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
4476 PyErr_Format(PyExc_TypeError,
4477 "%.200s%.200s argument after ** "
4478 "must be a mapping, not %.200s",
4479 PyEval_GetFuncName(func),
4480 PyEval_GetFuncDesc(func),
4481 kwdict->ob_type->tp_name);
4482 }
4483 goto ext_call_fail;
4484 }
4485 Py_DECREF(kwdict);
4486 kwdict = d;
4487 }
4488 }
4489 if (flags & CALL_FLAG_VAR) {
4490 stararg = EXT_POP(*pp_stack);
4491 if (!PyTuple_Check(stararg)) {
4492 PyObject *t = NULL;
4493 t = PySequence_Tuple(stararg);
4494 if (t == NULL) {
4495 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
4496 PyErr_Format(PyExc_TypeError,
4497 "%.200s%.200s argument after * "
Victor Stinner0a5f65a2011-03-22 01:09:21 +01004498 "must be a sequence, not %.200s",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004499 PyEval_GetFuncName(func),
4500 PyEval_GetFuncDesc(func),
4501 stararg->ob_type->tp_name);
4502 }
4503 goto ext_call_fail;
4504 }
4505 Py_DECREF(stararg);
4506 stararg = t;
4507 }
4508 nstar = PyTuple_GET_SIZE(stararg);
4509 }
4510 if (nk > 0) {
4511 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
4512 if (kwdict == NULL)
4513 goto ext_call_fail;
4514 }
4515 callargs = update_star_args(na, nstar, stararg, pp_stack);
4516 if (callargs == NULL)
4517 goto ext_call_fail;
Jeremy Hylton985eba52003-02-05 23:13:00 +00004518#ifdef CALL_PROFILE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004519 /* At this point, we have to look at the type of func to
4520 update the call stats properly. Do it here so as to avoid
4521 exposing the call stats machinery outside ceval.c
4522 */
4523 if (PyFunction_Check(func))
4524 PCALL(PCALL_FUNCTION);
4525 else if (PyMethod_Check(func))
4526 PCALL(PCALL_METHOD);
4527 else if (PyType_Check(func))
4528 PCALL(PCALL_TYPE);
4529 else if (PyCFunction_Check(func))
4530 PCALL(PCALL_CFUNCTION);
4531 else
4532 PCALL(PCALL_OTHER);
Jeremy Hylton985eba52003-02-05 23:13:00 +00004533#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004534 if (PyCFunction_Check(func)) {
4535 PyThreadState *tstate = PyThreadState_GET();
4536 C_TRACE(result, PyCFunction_Call(func, callargs, kwdict));
4537 }
4538 else
4539 result = PyObject_Call(func, callargs, kwdict);
Thomas Woutersce272b62007-09-19 21:19:28 +00004540ext_call_fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004541 Py_XDECREF(callargs);
4542 Py_XDECREF(kwdict);
4543 Py_XDECREF(stararg);
Victor Stinnerf243ee42013-07-16 01:02:12 +02004544 assert((result != NULL && !PyErr_Occurred())
4545 || (result == NULL && PyErr_Occurred()));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004546 return result;
Jeremy Hylton52820442001-01-03 23:52:36 +00004547}
4548
Guido van Rossum38fff8c2006-03-07 18:50:55 +00004549/* Extract a slice index from a PyInt or PyLong or an object with the
4550 nb_index slot defined, and store in *pi.
4551 Silently reduce values larger than PY_SSIZE_T_MAX to PY_SSIZE_T_MAX,
4552 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 +00004553 Return 0 on error, 1 on success.
Tim Peterscb479e72001-12-16 19:11:44 +00004554*/
Tim Petersb5196382001-12-16 19:44:20 +00004555/* Note: If v is NULL, return success without storing into *pi. This
4556 is because_PyEval_SliceIndex() is called by apply_slice(), which can be
4557 called by the SLICE opcode with v and/or w equal to NULL.
Tim Peterscb479e72001-12-16 19:11:44 +00004558*/
Guido van Rossum20c6add2000-05-08 14:06:50 +00004559int
Martin v. Löwis18e16552006-02-15 17:27:45 +00004560_PyEval_SliceIndex(PyObject *v, Py_ssize_t *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004561{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004562 if (v != NULL) {
4563 Py_ssize_t x;
4564 if (PyIndex_Check(v)) {
4565 x = PyNumber_AsSsize_t(v, NULL);
4566 if (x == -1 && PyErr_Occurred())
4567 return 0;
4568 }
4569 else {
4570 PyErr_SetString(PyExc_TypeError,
4571 "slice indices must be integers or "
4572 "None or have an __index__ method");
4573 return 0;
4574 }
4575 *pi = x;
4576 }
4577 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004578}
4579
Guido van Rossum486364b2007-06-30 05:01:58 +00004580#define CANNOT_CATCH_MSG "catching classes that do not inherit from "\
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004581 "BaseException is not allowed"
Brett Cannonf74225d2007-02-26 21:10:16 +00004582
Guido van Rossumb209a111997-04-29 18:18:01 +00004583static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02004584cmp_outcome(int op, PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004585{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004586 int res = 0;
4587 switch (op) {
4588 case PyCmp_IS:
4589 res = (v == w);
4590 break;
4591 case PyCmp_IS_NOT:
4592 res = (v != w);
4593 break;
4594 case PyCmp_IN:
4595 res = PySequence_Contains(w, v);
4596 if (res < 0)
4597 return NULL;
4598 break;
4599 case PyCmp_NOT_IN:
4600 res = PySequence_Contains(w, v);
4601 if (res < 0)
4602 return NULL;
4603 res = !res;
4604 break;
4605 case PyCmp_EXC_MATCH:
4606 if (PyTuple_Check(w)) {
4607 Py_ssize_t i, length;
4608 length = PyTuple_Size(w);
4609 for (i = 0; i < length; i += 1) {
4610 PyObject *exc = PyTuple_GET_ITEM(w, i);
4611 if (!PyExceptionClass_Check(exc)) {
4612 PyErr_SetString(PyExc_TypeError,
4613 CANNOT_CATCH_MSG);
4614 return NULL;
4615 }
4616 }
4617 }
4618 else {
4619 if (!PyExceptionClass_Check(w)) {
4620 PyErr_SetString(PyExc_TypeError,
4621 CANNOT_CATCH_MSG);
4622 return NULL;
4623 }
4624 }
4625 res = PyErr_GivenExceptionMatches(v, w);
4626 break;
4627 default:
4628 return PyObject_RichCompare(v, w, op);
4629 }
4630 v = res ? Py_True : Py_False;
4631 Py_INCREF(v);
4632 return v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004633}
4634
Thomas Wouters52152252000-08-17 22:55:00 +00004635static PyObject *
4636import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00004637{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004638 PyObject *x;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00004639
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004640 x = PyObject_GetAttr(v, name);
4641 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Brett Cannona79e4fb2013-07-12 11:22:26 -04004642 PyErr_Format(PyExc_ImportError, "cannot import name %R", name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004643 }
4644 return x;
Thomas Wouters52152252000-08-17 22:55:00 +00004645}
Guido van Rossumac7be682001-01-17 15:42:30 +00004646
Thomas Wouters52152252000-08-17 22:55:00 +00004647static int
4648import_all_from(PyObject *locals, PyObject *v)
4649{
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02004650 _Py_IDENTIFIER(__all__);
4651 _Py_IDENTIFIER(__dict__);
4652 PyObject *all = _PyObject_GetAttrId(v, &PyId___all__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004653 PyObject *dict, *name, *value;
4654 int skip_leading_underscores = 0;
4655 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00004656
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004657 if (all == NULL) {
4658 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
4659 return -1; /* Unexpected error */
4660 PyErr_Clear();
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02004661 dict = _PyObject_GetAttrId(v, &PyId___dict__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004662 if (dict == NULL) {
4663 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
4664 return -1;
4665 PyErr_SetString(PyExc_ImportError,
4666 "from-import-* object has no __dict__ and no __all__");
4667 return -1;
4668 }
4669 all = PyMapping_Keys(dict);
4670 Py_DECREF(dict);
4671 if (all == NULL)
4672 return -1;
4673 skip_leading_underscores = 1;
4674 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00004675
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004676 for (pos = 0, err = 0; ; pos++) {
4677 name = PySequence_GetItem(all, pos);
4678 if (name == NULL) {
4679 if (!PyErr_ExceptionMatches(PyExc_IndexError))
4680 err = -1;
4681 else
4682 PyErr_Clear();
4683 break;
4684 }
4685 if (skip_leading_underscores &&
4686 PyUnicode_Check(name) &&
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02004687 PyUnicode_READY(name) != -1 &&
4688 PyUnicode_READ_CHAR(name, 0) == '_')
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004689 {
4690 Py_DECREF(name);
4691 continue;
4692 }
4693 value = PyObject_GetAttr(v, name);
4694 if (value == NULL)
4695 err = -1;
4696 else if (PyDict_CheckExact(locals))
4697 err = PyDict_SetItem(locals, name, value);
4698 else
4699 err = PyObject_SetItem(locals, name, value);
4700 Py_DECREF(name);
4701 Py_XDECREF(value);
4702 if (err != 0)
4703 break;
4704 }
4705 Py_DECREF(all);
4706 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00004707}
4708
Guido van Rossumac7be682001-01-17 15:42:30 +00004709static void
Neal Norwitzda059e32007-08-26 05:33:45 +00004710format_exc_check_arg(PyObject *exc, const char *format_str, PyObject *obj)
Paul Prescode68140d2000-08-30 20:25:01 +00004711{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004712 const char *obj_str;
Paul Prescode68140d2000-08-30 20:25:01 +00004713
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004714 if (!obj)
4715 return;
Paul Prescode68140d2000-08-30 20:25:01 +00004716
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004717 obj_str = _PyUnicode_AsString(obj);
4718 if (!obj_str)
4719 return;
Paul Prescode68140d2000-08-30 20:25:01 +00004720
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004721 PyErr_Format(exc, format_str, obj_str);
Paul Prescode68140d2000-08-30 20:25:01 +00004722}
Guido van Rossum950361c1997-01-24 13:49:28 +00004723
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00004724static void
4725format_exc_unbound(PyCodeObject *co, int oparg)
4726{
4727 PyObject *name;
4728 /* Don't stomp existing exception */
4729 if (PyErr_Occurred())
4730 return;
4731 if (oparg < PyTuple_GET_SIZE(co->co_cellvars)) {
4732 name = PyTuple_GET_ITEM(co->co_cellvars,
4733 oparg);
4734 format_exc_check_arg(
4735 PyExc_UnboundLocalError,
4736 UNBOUNDLOCAL_ERROR_MSG,
4737 name);
4738 } else {
4739 name = PyTuple_GET_ITEM(co->co_freevars, oparg -
4740 PyTuple_GET_SIZE(co->co_cellvars));
4741 format_exc_check_arg(PyExc_NameError,
4742 UNBOUNDFREE_ERROR_MSG, name);
4743 }
4744}
4745
Victor Stinnerd2a915d2011-10-02 20:34:20 +02004746static PyObject *
4747unicode_concatenate(PyObject *v, PyObject *w,
4748 PyFrameObject *f, unsigned char *next_instr)
4749{
4750 PyObject *res;
4751 if (Py_REFCNT(v) == 2) {
4752 /* In the common case, there are 2 references to the value
4753 * stored in 'variable' when the += is performed: one on the
4754 * value stack (in 'v') and one still stored in the
4755 * 'variable'. We try to delete the variable now to reduce
4756 * the refcnt to 1.
4757 */
4758 switch (*next_instr) {
4759 case STORE_FAST:
4760 {
4761 int oparg = PEEKARG();
4762 PyObject **fastlocals = f->f_localsplus;
4763 if (GETLOCAL(oparg) == v)
4764 SETLOCAL(oparg, NULL);
4765 break;
4766 }
4767 case STORE_DEREF:
4768 {
4769 PyObject **freevars = (f->f_localsplus +
4770 f->f_code->co_nlocals);
4771 PyObject *c = freevars[PEEKARG()];
4772 if (PyCell_GET(c) == v)
4773 PyCell_Set(c, NULL);
4774 break;
4775 }
4776 case STORE_NAME:
4777 {
4778 PyObject *names = f->f_code->co_names;
4779 PyObject *name = GETITEM(names, PEEKARG());
4780 PyObject *locals = f->f_locals;
4781 if (PyDict_CheckExact(locals) &&
4782 PyDict_GetItem(locals, name) == v) {
4783 if (PyDict_DelItem(locals, name) != 0) {
4784 PyErr_Clear();
4785 }
4786 }
4787 break;
4788 }
4789 }
4790 }
4791 res = v;
4792 PyUnicode_Append(&res, w);
4793 return res;
4794}
4795
Guido van Rossum950361c1997-01-24 13:49:28 +00004796#ifdef DYNAMIC_EXECUTION_PROFILE
4797
Skip Montanarof118cb12001-10-15 20:51:38 +00004798static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004799getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00004800{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004801 int i;
4802 PyObject *l = PyList_New(256);
4803 if (l == NULL) return NULL;
4804 for (i = 0; i < 256; i++) {
4805 PyObject *x = PyLong_FromLong(a[i]);
4806 if (x == NULL) {
4807 Py_DECREF(l);
4808 return NULL;
4809 }
4810 PyList_SetItem(l, i, x);
4811 }
4812 for (i = 0; i < 256; i++)
4813 a[i] = 0;
4814 return l;
Guido van Rossum950361c1997-01-24 13:49:28 +00004815}
4816
4817PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004818_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00004819{
4820#ifndef DXPAIRS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004821 return getarray(dxp);
Guido van Rossum950361c1997-01-24 13:49:28 +00004822#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004823 int i;
4824 PyObject *l = PyList_New(257);
4825 if (l == NULL) return NULL;
4826 for (i = 0; i < 257; i++) {
4827 PyObject *x = getarray(dxpairs[i]);
4828 if (x == NULL) {
4829 Py_DECREF(l);
4830 return NULL;
4831 }
4832 PyList_SetItem(l, i, x);
4833 }
4834 return l;
Guido van Rossum950361c1997-01-24 13:49:28 +00004835#endif
4836}
4837
4838#endif