blob: cea503e56faadc108a8e91b7bde76117a6dba00a [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum3f5da241990-12-20 15:06:42 +00002/* Execute compiled code */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003
Guido van Rossum681d79a1995-07-18 14:51:37 +00004/* XXX TO DO:
Guido van Rossum681d79a1995-07-18 14:51:37 +00005 XXX speed up searching for keywords by using a dictionary
Guido van Rossum681d79a1995-07-18 14:51:37 +00006 XXX document it!
7 */
8
Fredrik Lundh7a830892006-05-27 10:39:48 +00009/* enable more aggressive intra-module optimizations, where available */
Fredrik Lundh57640f52006-05-26 11:54:04 +000010#define PY_LOCAL_AGGRESSIVE
11
Guido van Rossumb209a111997-04-29 18:18:01 +000012#include "Python.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000013
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000014#include "code.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000015#include "frameobject.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000016#include "eval.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000017#include "opcode.h"
Tim Peters6d6c1a32001-08-02 04:15:00 +000018#include "structmember.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000019
Guido van Rossumc6004111993-11-05 10:22:19 +000020#include <ctype.h>
21
Tim Peters7df5e7f2006-05-26 23:14:37 +000022#ifndef WITH_TSC
Michael W. Hudson75eabd22005-01-18 15:56:11 +000023
24#define READ_TIMESTAMP(var)
25
26#else
Martin v. Löwisf30d60e2004-06-08 08:17:44 +000027
28typedef unsigned long long uint64;
29
Ezio Melottic2077b02011-03-16 12:34:31 +020030/* PowerPC support.
David Malcolm4c29e1c2011-01-06 17:39:24 +000031 "__ppc__" appears to be the preprocessor definition to detect on OS X, whereas
32 "__powerpc__" appears to be the correct one for Linux with GCC
33*/
34#if defined(__ppc__) || defined (__powerpc__)
Michael W. Hudson800ba232004-08-12 18:19:17 +000035
Michael W. Hudson75eabd22005-01-18 15:56:11 +000036#define READ_TIMESTAMP(var) ppc_getcounter(&var)
Michael W. Hudson800ba232004-08-12 18:19:17 +000037
Fredrik Lundh7a830892006-05-27 10:39:48 +000038static void
Michael W. Hudson800ba232004-08-12 18:19:17 +000039ppc_getcounter(uint64 *v)
40{
Antoine Pitrouc83ea132010-05-09 14:46:46 +000041 register unsigned long tbu, tb, tbu2;
Michael W. Hudson800ba232004-08-12 18:19:17 +000042
43 loop:
Antoine Pitrouc83ea132010-05-09 14:46:46 +000044 asm volatile ("mftbu %0" : "=r" (tbu) );
45 asm volatile ("mftb %0" : "=r" (tb) );
46 asm volatile ("mftbu %0" : "=r" (tbu2));
47 if (__builtin_expect(tbu != tbu2, 0)) goto loop;
Michael W. Hudson800ba232004-08-12 18:19:17 +000048
Antoine Pitrouc83ea132010-05-09 14:46:46 +000049 /* The slightly peculiar way of writing the next lines is
50 compiled better by GCC than any other way I tried. */
51 ((long*)(v))[0] = tbu;
52 ((long*)(v))[1] = tb;
Michael W. Hudson800ba232004-08-12 18:19:17 +000053}
54
Mark Dickinson504a1512009-10-31 10:11:28 +000055#elif defined(__i386__)
56
57/* this is for linux/x86 (and probably any other GCC/x86 combo) */
Michael W. Hudson800ba232004-08-12 18:19:17 +000058
Michael W. Hudson75eabd22005-01-18 15:56:11 +000059#define READ_TIMESTAMP(val) \
60 __asm__ __volatile__("rdtsc" : "=A" (val))
Michael W. Hudson800ba232004-08-12 18:19:17 +000061
Mark Dickinson504a1512009-10-31 10:11:28 +000062#elif defined(__x86_64__)
63
64/* for gcc/x86_64, the "A" constraint in DI mode means *either* rax *or* rdx;
65 not edx:eax as it does for i386. Since rdtsc puts its result in edx:eax
66 even in 64-bit mode, we need to use "a" and "d" for the lower and upper
67 32-bit pieces of the result. */
68
Victor Stinner2b565bb2014-12-12 13:19:00 +010069#define READ_TIMESTAMP(val) do { \
70 unsigned int h, l; \
71 __asm__ __volatile__("rdtsc" : "=a" (l), "=d" (h)); \
72 (val) = ((uint64)l) | (((uint64)h) << 32); \
73 } while(0)
Mark Dickinson504a1512009-10-31 10:11:28 +000074
75
76#else
77
78#error "Don't know how to implement timestamp counter for this architecture"
79
Michael W. Hudson800ba232004-08-12 18:19:17 +000080#endif
81
Tim Peters7df5e7f2006-05-26 23:14:37 +000082void dump_tsc(int opcode, int ticked, uint64 inst0, uint64 inst1,
Antoine Pitrouc83ea132010-05-09 14:46:46 +000083 uint64 loop0, uint64 loop1, uint64 intr0, uint64 intr1)
Martin v. Löwisf30d60e2004-06-08 08:17:44 +000084{
Antoine Pitrouc83ea132010-05-09 14:46:46 +000085 uint64 intr, inst, loop;
86 PyThreadState *tstate = PyThreadState_Get();
87 if (!tstate->interp->tscdump)
88 return;
89 intr = intr1 - intr0;
90 inst = inst1 - inst0 - intr;
91 loop = loop1 - loop0 - intr;
92 fprintf(stderr, "opcode=%03d t=%d inst=%06lld loop=%06lld\n",
Stefan Krah7ff78252010-06-23 18:12:09 +000093 opcode, ticked, inst, loop);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +000094}
Michael W. Hudson800ba232004-08-12 18:19:17 +000095
Martin v. Löwisf30d60e2004-06-08 08:17:44 +000096#endif
97
Guido van Rossum04691fc1992-08-12 15:35:34 +000098/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000099/* #define CASE_TOO_BIG 1 */
Guido van Rossum04691fc1992-08-12 15:35:34 +0000100
Guido van Rossum408027e1996-12-30 16:17:54 +0000101#ifdef Py_DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +0000102/* For debugging the interpreter: */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000103#define LLTRACE 1 /* Low-level trace feature */
104#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000105#endif
106
Jeremy Hylton52820442001-01-03 23:52:36 +0000107typedef PyObject *(*callproc)(PyObject *, PyObject *, PyObject *);
Guido van Rossum5b722181993-03-30 17:46:03 +0000108
Guido van Rossum374a9221991-04-04 10:40:29 +0000109/* Forward declarations */
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000110#ifdef WITH_TSC
Fredrik Lundh7a830892006-05-27 10:39:48 +0000111static PyObject * call_function(PyObject ***, int, uint64*, uint64*);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000112#else
Fredrik Lundh7a830892006-05-27 10:39:48 +0000113static PyObject * call_function(PyObject ***, int);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000114#endif
Fredrik Lundh7a830892006-05-27 10:39:48 +0000115static PyObject * fast_function(PyObject *, PyObject ***, int, int, int);
116static PyObject * do_call(PyObject *, PyObject ***, int, int);
117static PyObject * ext_do_call(PyObject *, PyObject ***, int, int, int);
Thomas Wouterse2176022007-09-20 17:35:10 +0000118static PyObject * update_keyword_args(PyObject *, int, PyObject ***,
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000119 PyObject *);
Fredrik Lundh7a830892006-05-27 10:39:48 +0000120static PyObject * update_star_args(int, int, PyObject *, PyObject ***);
121static PyObject * load_args(PyObject ***, int);
Jeremy Hylton52820442001-01-03 23:52:36 +0000122#define CALL_FLAG_VAR 1
123#define CALL_FLAG_KW 2
124
Guido van Rossum0a066c01992-03-27 17:29:15 +0000125#ifdef LLTRACE
Fredrik Lundh1b949402006-05-26 12:01:49 +0000126static int lltrace;
Fredrik Lundh7a830892006-05-27 10:39:48 +0000127static int prtrace(PyObject *, char *);
Guido van Rossum0a066c01992-03-27 17:29:15 +0000128#endif
Fredrik Lundh7a830892006-05-27 10:39:48 +0000129static int call_trace(Py_tracefunc, PyObject *, PyFrameObject *,
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000130 int, PyObject *);
Amaury Forgeot d'Arc0d75f092007-11-13 21:54:28 +0000131static int call_trace_protected(Py_tracefunc, PyObject *,
Stefan Krah7ff78252010-06-23 18:12:09 +0000132 PyFrameObject *, int, PyObject *);
Fredrik Lundh7a830892006-05-27 10:39:48 +0000133static void call_exc_trace(Py_tracefunc, PyObject *, PyFrameObject *);
134static int maybe_call_line_trace(Py_tracefunc, PyObject *,
Stefan Krah7ff78252010-06-23 18:12:09 +0000135 PyFrameObject *, int *, int *, int *);
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000136
Fredrik Lundh7a830892006-05-27 10:39:48 +0000137static PyObject * apply_slice(PyObject *, PyObject *, PyObject *);
138static int assign_slice(PyObject *, PyObject *,
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000139 PyObject *, PyObject *);
Fredrik Lundh7a830892006-05-27 10:39:48 +0000140static PyObject * cmp_outcome(int, PyObject *, PyObject *);
141static PyObject * import_from(PyObject *, PyObject *);
142static int import_all_from(PyObject *, PyObject *);
143static PyObject * build_class(PyObject *, PyObject *, PyObject *);
144static int exec_statement(PyFrameObject *,
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000145 PyObject *, PyObject *, PyObject *);
Fredrik Lundh7a830892006-05-27 10:39:48 +0000146static void set_exc_info(PyThreadState *, PyObject *, PyObject *, PyObject *);
147static void reset_exc_info(PyThreadState *);
148static void format_exc_check_arg(PyObject *, char *, PyObject *);
149static PyObject * string_concatenate(PyObject *, PyObject *,
Stefan Krah7ff78252010-06-23 18:12:09 +0000150 PyFrameObject *, unsigned char *);
Benjamin Petersone18ef192009-01-20 14:21:16 +0000151static PyObject * kwd_as_string(PyObject *);
Benjamin Peterson1880d8b2009-05-25 13:13:44 +0000152static PyObject * special_lookup(PyObject *, char *, PyObject **);
Guido van Rossum374a9221991-04-04 10:40:29 +0000153
Paul Prescode68140d2000-08-30 20:25:01 +0000154#define NAME_ERROR_MSG \
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000155 "name '%.200s' is not defined"
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000156#define GLOBAL_NAME_ERROR_MSG \
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000157 "global name '%.200s' is not defined"
Paul Prescode68140d2000-08-30 20:25:01 +0000158#define UNBOUNDLOCAL_ERROR_MSG \
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000159 "local variable '%.200s' referenced before assignment"
Jeremy Hyltonc76770c2001-04-13 16:51:46 +0000160#define UNBOUNDFREE_ERROR_MSG \
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000161 "free variable '%.200s' referenced before assignment" \
162 " in enclosing scope"
Guido van Rossum374a9221991-04-04 10:40:29 +0000163
Guido van Rossum950361c1997-01-24 13:49:28 +0000164/* Dynamic execution profile */
165#ifdef DYNAMIC_EXECUTION_PROFILE
166#ifdef DXPAIRS
167static long dxpairs[257][256];
168#define dxp dxpairs[256]
169#else
170static long dxp[256];
171#endif
172#endif
173
Jeremy Hylton985eba52003-02-05 23:13:00 +0000174/* Function call profile */
175#ifdef CALL_PROFILE
176#define PCALL_NUM 11
177static int pcall[PCALL_NUM];
178
179#define PCALL_ALL 0
180#define PCALL_FUNCTION 1
181#define PCALL_FAST_FUNCTION 2
182#define PCALL_FASTER_FUNCTION 3
183#define PCALL_METHOD 4
184#define PCALL_BOUND_METHOD 5
185#define PCALL_CFUNCTION 6
186#define PCALL_TYPE 7
187#define PCALL_GENERATOR 8
188#define PCALL_OTHER 9
189#define PCALL_POP 10
190
191/* Notes about the statistics
192
193 PCALL_FAST stats
194
195 FAST_FUNCTION means no argument tuple needs to be created.
196 FASTER_FUNCTION means that the fast-path frame setup code is used.
197
198 If there is a method call where the call can be optimized by changing
199 the argument tuple and calling the function directly, it gets recorded
200 twice.
201
202 As a result, the relationship among the statistics appears to be
203 PCALL_ALL == PCALL_FUNCTION + PCALL_METHOD - PCALL_BOUND_METHOD +
204 PCALL_CFUNCTION + PCALL_TYPE + PCALL_GENERATOR + PCALL_OTHER
205 PCALL_FUNCTION > PCALL_FAST_FUNCTION > PCALL_FASTER_FUNCTION
206 PCALL_METHOD > PCALL_BOUND_METHOD
207*/
208
209#define PCALL(POS) pcall[POS]++
210
211PyObject *
212PyEval_GetCallStats(PyObject *self)
213{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000214 return Py_BuildValue("iiiiiiiiiii",
215 pcall[0], pcall[1], pcall[2], pcall[3],
216 pcall[4], pcall[5], pcall[6], pcall[7],
217 pcall[8], pcall[9], pcall[10]);
Jeremy Hylton985eba52003-02-05 23:13:00 +0000218}
219#else
220#define PCALL(O)
221
222PyObject *
223PyEval_GetCallStats(PyObject *self)
224{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000225 Py_INCREF(Py_None);
226 return Py_None;
Jeremy Hylton985eba52003-02-05 23:13:00 +0000227}
228#endif
229
Tim Peters5ca576e2001-06-18 22:08:13 +0000230
Guido van Rossume59214e1994-08-30 08:01:59 +0000231#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000232
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +0000233#ifdef HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000234#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +0000235#endif
Guido van Rossum49b56061998-10-01 20:42:43 +0000236#include "pythread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000237
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000238static PyThread_type_lock interpreter_lock = 0; /* This is the GIL */
Kristján Valur Jónsson0e919382009-01-09 20:31:26 +0000239static PyThread_type_lock pending_lock = 0; /* for pending calls */
Guido van Rossuma9672091994-09-14 13:31:22 +0000240static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000241
Tim Peters7f468f22004-10-11 02:40:51 +0000242int
243PyEval_ThreadsInitialized(void)
244{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000245 return interpreter_lock != 0;
Tim Peters7f468f22004-10-11 02:40:51 +0000246}
247
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000248void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000249PyEval_InitThreads(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000250{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000251 if (interpreter_lock)
252 return;
253 interpreter_lock = PyThread_allocate_lock();
254 PyThread_acquire_lock(interpreter_lock, 1);
255 main_thread = PyThread_get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000256}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000257
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000258void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000259PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000260{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000261 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000262}
263
264void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000265PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000266{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000267 PyThread_release_lock(interpreter_lock);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000268}
269
270void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000271PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000272{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000273 if (tstate == NULL)
274 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
275 /* Check someone has called PyEval_InitThreads() to create the lock */
276 assert(interpreter_lock);
277 PyThread_acquire_lock(interpreter_lock, 1);
278 if (PyThreadState_Swap(tstate) != NULL)
279 Py_FatalError(
280 "PyEval_AcquireThread: non-NULL old thread state");
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000281}
282
283void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000284PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000285{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000286 if (tstate == NULL)
287 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
288 if (PyThreadState_Swap(NULL) != tstate)
289 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
290 PyThread_release_lock(interpreter_lock);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000291}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000292
293/* This function is called from PyOS_AfterFork to ensure that newly
294 created child processes don't hold locks referring to threads which
295 are not running in the child process. (This could also be done using
296 pthread_atfork mechanism, at least for the pthreads implementation.) */
297
298void
299PyEval_ReInitThreads(void)
300{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000301 PyObject *threading, *result;
302 PyThreadState *tstate;
Jesse Noller5e62ca42008-07-16 20:03:47 +0000303
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000304 if (!interpreter_lock)
305 return;
306 /*XXX Can't use PyThread_free_lock here because it does too
307 much error-checking. Doing this cleanly would require
308 adding a new function to each thread_*.h. Instead, just
309 create a new lock and waste a little bit of memory */
310 interpreter_lock = PyThread_allocate_lock();
311 pending_lock = PyThread_allocate_lock();
312 PyThread_acquire_lock(interpreter_lock, 1);
313 main_thread = PyThread_get_thread_ident();
Jesse Noller5e62ca42008-07-16 20:03:47 +0000314
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000315 /* Update the threading module with the new state.
316 */
317 tstate = PyThreadState_GET();
318 threading = PyMapping_GetItemString(tstate->interp->modules,
319 "threading");
320 if (threading == NULL) {
321 /* threading not imported */
322 PyErr_Clear();
323 return;
324 }
325 result = PyObject_CallMethod(threading, "_after_fork", NULL);
326 if (result == NULL)
327 PyErr_WriteUnraisable(threading);
328 else
329 Py_DECREF(result);
330 Py_DECREF(threading);
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000331}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000332#endif
333
Guido van Rossumff4949e1992-08-05 19:58:53 +0000334/* Functions save_thread and restore_thread are always defined so
335 dynamically loaded modules needn't be compiled separately for use
336 with and without threads: */
337
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000338PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000339PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000340{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000341 PyThreadState *tstate = PyThreadState_Swap(NULL);
342 if (tstate == NULL)
343 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000344#ifdef WITH_THREAD
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000345 if (interpreter_lock)
346 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000347#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000348 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000349}
350
351void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000352PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000353{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000354 if (tstate == NULL)
355 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000356#ifdef WITH_THREAD
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000357 if (interpreter_lock) {
358 int err = errno;
359 PyThread_acquire_lock(interpreter_lock, 1);
360 errno = err;
361 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000362#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000363 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000364}
365
366
Guido van Rossuma9672091994-09-14 13:31:22 +0000367/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
368 signal handlers or Mac I/O completion routines) can schedule calls
369 to a function to be called synchronously.
370 The synchronous function is called with one void* argument.
371 It should return 0 for success or -1 for failure -- failure should
372 be accompanied by an exception.
373
374 If registry succeeds, the registry function returns 0; if it fails
375 (e.g. due to too many pending calls) it returns -1 (without setting
376 an exception condition).
377
378 Note that because registry may occur from within signal handlers,
379 or other asynchronous events, calling malloc() is unsafe!
380
381#ifdef WITH_THREAD
382 Any thread can schedule pending calls, but only the main thread
383 will execute them.
Kristján Valur Jónsson0e919382009-01-09 20:31:26 +0000384 There is no facility to schedule calls to a particular thread, but
385 that should be easy to change, should that ever be required. In
386 that case, the static variables here should go into the python
387 threadstate.
Guido van Rossuma9672091994-09-14 13:31:22 +0000388#endif
Kristján Valur Jónsson0e919382009-01-09 20:31:26 +0000389*/
Guido van Rossuma9672091994-09-14 13:31:22 +0000390
Kristján Valur Jónsson0e919382009-01-09 20:31:26 +0000391#ifdef WITH_THREAD
392
393/* The WITH_THREAD implementation is thread-safe. It allows
394 scheduling to be made from any thread, and even from an executing
395 callback.
396 */
397
398#define NPENDINGCALLS 32
399static struct {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000400 int (*func)(void *);
401 void *arg;
Kristján Valur Jónsson0e919382009-01-09 20:31:26 +0000402} pendingcalls[NPENDINGCALLS];
403static int pendingfirst = 0;
404static int pendinglast = 0;
405static volatile int pendingcalls_to_do = 1; /* trigger initialization of lock */
406static char pendingbusy = 0;
407
408int
409Py_AddPendingCall(int (*func)(void *), void *arg)
410{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000411 int i, j, result=0;
412 PyThread_type_lock lock = pending_lock;
Kristján Valur Jónsson0e919382009-01-09 20:31:26 +0000413
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000414 /* try a few times for the lock. Since this mechanism is used
415 * for signal handling (on the main thread), there is a (slim)
416 * chance that a signal is delivered on the same thread while we
417 * hold the lock during the Py_MakePendingCalls() function.
418 * This avoids a deadlock in that case.
419 * Note that signals can be delivered on any thread. In particular,
420 * on Windows, a SIGINT is delivered on a system-created worker
421 * thread.
422 * We also check for lock being NULL, in the unlikely case that
423 * this function is called before any bytecode evaluation takes place.
424 */
425 if (lock != NULL) {
426 for (i = 0; i<100; i++) {
427 if (PyThread_acquire_lock(lock, NOWAIT_LOCK))
428 break;
429 }
430 if (i == 100)
431 return -1;
432 }
433
434 i = pendinglast;
435 j = (i + 1) % NPENDINGCALLS;
436 if (j == pendingfirst) {
437 result = -1; /* Queue full */
438 } else {
439 pendingcalls[i].func = func;
440 pendingcalls[i].arg = arg;
441 pendinglast = j;
442 }
443 /* signal main loop */
444 _Py_Ticker = 0;
445 pendingcalls_to_do = 1;
446 if (lock != NULL)
447 PyThread_release_lock(lock);
448 return result;
Kristján Valur Jónsson0e919382009-01-09 20:31:26 +0000449}
450
451int
452Py_MakePendingCalls(void)
453{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000454 int i;
455 int r = 0;
Kristján Valur Jónsson0e919382009-01-09 20:31:26 +0000456
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000457 if (!pending_lock) {
458 /* initial allocation of the lock */
459 pending_lock = PyThread_allocate_lock();
460 if (pending_lock == NULL)
461 return -1;
462 }
Kristján Valur Jónsson0e919382009-01-09 20:31:26 +0000463
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000464 /* only service pending calls on main thread */
465 if (main_thread && PyThread_get_thread_ident() != main_thread)
466 return 0;
467 /* don't perform recursive pending calls */
468 if (pendingbusy)
469 return 0;
470 pendingbusy = 1;
471 /* perform a bounded number of calls, in case of recursion */
472 for (i=0; i<NPENDINGCALLS; i++) {
473 int j;
474 int (*func)(void *);
475 void *arg = NULL;
476
477 /* pop one item off the queue while holding the lock */
478 PyThread_acquire_lock(pending_lock, WAIT_LOCK);
479 j = pendingfirst;
480 if (j == pendinglast) {
481 func = NULL; /* Queue empty */
482 } else {
483 func = pendingcalls[j].func;
484 arg = pendingcalls[j].arg;
485 pendingfirst = (j + 1) % NPENDINGCALLS;
486 }
487 pendingcalls_to_do = pendingfirst != pendinglast;
488 PyThread_release_lock(pending_lock);
489 /* having released the lock, perform the callback */
490 if (func == NULL)
491 break;
492 r = func(arg);
493 if (r)
494 break;
495 }
496 pendingbusy = 0;
497 return r;
Kristján Valur Jónsson0e919382009-01-09 20:31:26 +0000498}
499
500#else /* if ! defined WITH_THREAD */
501
502/*
503 WARNING! ASYNCHRONOUSLY EXECUTING CODE!
504 This code is used for signal handling in python that isn't built
505 with WITH_THREAD.
506 Don't use this implementation when Py_AddPendingCalls() can happen
507 on a different thread!
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000508
Guido van Rossuma9672091994-09-14 13:31:22 +0000509 There are two possible race conditions:
Kristján Valur Jónsson0e919382009-01-09 20:31:26 +0000510 (1) nested asynchronous calls to Py_AddPendingCall()
511 (2) AddPendingCall() calls made while pending calls are being processed.
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000512
Kristján Valur Jónsson0e919382009-01-09 20:31:26 +0000513 (1) is very unlikely because typically signal delivery
514 is blocked during signal handling. So it should be impossible.
515 (2) is a real possibility.
Guido van Rossuma9672091994-09-14 13:31:22 +0000516 The current code is safe against (2), but not against (1).
517 The safety against (2) is derived from the fact that only one
Kristján Valur Jónsson0e919382009-01-09 20:31:26 +0000518 thread is present, interrupted by signals, and that the critical
519 section is protected with the "busy" variable. On Windows, which
520 delivers SIGINT on a system thread, this does not hold and therefore
521 Windows really shouldn't use this version.
522 The two threads could theoretically wiggle around the "busy" variable.
Guido van Rossuma027efa1997-05-05 20:56:21 +0000523*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000524
Guido van Rossuma9672091994-09-14 13:31:22 +0000525#define NPENDINGCALLS 32
526static struct {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000527 int (*func)(void *);
528 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000529} pendingcalls[NPENDINGCALLS];
530static volatile int pendingfirst = 0;
531static volatile int pendinglast = 0;
Kristján Valur Jónsson0e919382009-01-09 20:31:26 +0000532static volatile int pendingcalls_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000533
534int
Thomas Wouters334fb892000-07-25 12:56:38 +0000535Py_AddPendingCall(int (*func)(void *), void *arg)
Guido van Rossuma9672091994-09-14 13:31:22 +0000536{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000537 static volatile int busy = 0;
538 int i, j;
539 /* XXX Begin critical section */
540 if (busy)
541 return -1;
542 busy = 1;
543 i = pendinglast;
544 j = (i + 1) % NPENDINGCALLS;
545 if (j == pendingfirst) {
546 busy = 0;
547 return -1; /* Queue full */
548 }
549 pendingcalls[i].func = func;
550 pendingcalls[i].arg = arg;
551 pendinglast = j;
Skip Montanarod581d772002-09-03 20:10:45 +0000552
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000553 _Py_Ticker = 0;
554 pendingcalls_to_do = 1; /* Signal main loop */
555 busy = 0;
556 /* XXX End critical section */
557 return 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000558}
559
Guido van Rossum180d7b41994-09-29 09:45:57 +0000560int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000561Py_MakePendingCalls(void)
Guido van Rossuma9672091994-09-14 13:31:22 +0000562{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000563 static int busy = 0;
564 if (busy)
565 return 0;
566 busy = 1;
567 pendingcalls_to_do = 0;
568 for (;;) {
569 int i;
570 int (*func)(void *);
571 void *arg;
572 i = pendingfirst;
573 if (i == pendinglast)
574 break; /* Queue empty */
575 func = pendingcalls[i].func;
576 arg = pendingcalls[i].arg;
577 pendingfirst = (i + 1) % NPENDINGCALLS;
578 if (func(arg) < 0) {
579 busy = 0;
580 pendingcalls_to_do = 1; /* We're not done yet */
581 return -1;
582 }
583 }
584 busy = 0;
585 return 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000586}
587
Kristján Valur Jónsson0e919382009-01-09 20:31:26 +0000588#endif /* WITH_THREAD */
589
Guido van Rossuma9672091994-09-14 13:31:22 +0000590
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000591/* The interpreter's recursion limit */
592
Hye-Shik Changb6fa2812005-04-04 15:49:02 +0000593#ifndef Py_DEFAULT_RECURSION_LIMIT
594#define Py_DEFAULT_RECURSION_LIMIT 1000
595#endif
596static int recursion_limit = Py_DEFAULT_RECURSION_LIMIT;
597int _Py_CheckRecursionLimit = Py_DEFAULT_RECURSION_LIMIT;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000598
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000599int
600Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000601{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000602 return recursion_limit;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000603}
604
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000605void
606Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000607{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000608 recursion_limit = new_limit;
609 _Py_CheckRecursionLimit = recursion_limit;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000610}
611
Armin Rigo2b3eb402003-10-28 12:05:48 +0000612/* the macro Py_EnterRecursiveCall() only calls _Py_CheckRecursiveCall()
613 if the recursion_depth reaches _Py_CheckRecursionLimit.
614 If USE_STACKCHECK, the macro decrements _Py_CheckRecursionLimit
615 to guarantee that _Py_CheckRecursiveCall() is regularly called.
616 Without USE_STACKCHECK, there is no need for this. */
617int
Serhiy Storchaka1670af62015-06-21 16:26:28 +0300618_Py_CheckRecursiveCall(const char *where)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000619{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000620 PyThreadState *tstate = PyThreadState_GET();
Armin Rigo2b3eb402003-10-28 12:05:48 +0000621
622#ifdef USE_STACKCHECK
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000623 if (PyOS_CheckStack()) {
624 --tstate->recursion_depth;
625 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
626 return -1;
627 }
Armin Rigo2b3eb402003-10-28 12:05:48 +0000628#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000629 if (tstate->recursion_depth > recursion_limit) {
630 --tstate->recursion_depth;
631 PyErr_Format(PyExc_RuntimeError,
632 "maximum recursion depth exceeded%s",
633 where);
634 return -1;
635 }
636 _Py_CheckRecursionLimit = recursion_limit;
637 return 0;
Armin Rigo2b3eb402003-10-28 12:05:48 +0000638}
639
Guido van Rossum374a9221991-04-04 10:40:29 +0000640/* Status code for main loop (reason for stack unwind) */
Raymond Hettinger7c958652004-04-06 10:11:10 +0000641enum why_code {
Stefan Krah7ff78252010-06-23 18:12:09 +0000642 WHY_NOT = 0x0001, /* No error */
643 WHY_EXCEPTION = 0x0002, /* Exception occurred */
644 WHY_RERAISE = 0x0004, /* Exception re-raised by 'finally' */
645 WHY_RETURN = 0x0008, /* 'return' statement */
646 WHY_BREAK = 0x0010, /* 'break' statement */
647 WHY_CONTINUE = 0x0020, /* 'continue' statement */
648 WHY_YIELD = 0x0040 /* 'yield' operator */
Raymond Hettinger7c958652004-04-06 10:11:10 +0000649};
Guido van Rossum374a9221991-04-04 10:40:29 +0000650
Fredrik Lundh7a830892006-05-27 10:39:48 +0000651static enum why_code do_raise(PyObject *, PyObject *, PyObject *);
652static int unpack_iterable(PyObject *, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000653
Jeffrey Yasskinfd8a1ec2008-12-03 06:46:45 +0000654/* Records whether tracing is on for any thread. Counts the number of
655 threads for which tstate->c_tracefunc is non-NULL, so if the value
656 is 0, we know we don't have to check this thread's c_tracefunc.
657 This speeds up the if statement in PyEval_EvalFrameEx() after
658 fast_next_opcode*/
659static int _Py_TracingPossible = 0;
660
Skip Montanarod581d772002-09-03 20:10:45 +0000661/* for manipulating the thread switch and periodic "stuff" - used to be
662 per thread, now just a pair o' globals */
Skip Montanaro99dba272002-09-03 20:19:06 +0000663int _Py_CheckInterval = 100;
Kristján Valur Jónsson0e919382009-01-09 20:31:26 +0000664volatile int _Py_Ticker = 0; /* so that we hit a "tick" first thing */
Guido van Rossum374a9221991-04-04 10:40:29 +0000665
Guido van Rossumb209a111997-04-29 18:18:01 +0000666PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000667PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000668{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000669 return PyEval_EvalCodeEx(co,
670 globals, locals,
671 (PyObject **)NULL, 0,
672 (PyObject **)NULL, 0,
673 (PyObject **)NULL, 0,
674 NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000675}
676
677
678/* Interpreter main loop */
679
Martin v. Löwis8d97e332004-06-27 15:43:12 +0000680PyObject *
Phillip J. Eby0d6615f2005-08-02 00:46:46 +0000681PyEval_EvalFrame(PyFrameObject *f) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000682 /* This is for backward compatibility with extension modules that
683 used this API; core interpreter code should call
684 PyEval_EvalFrameEx() */
685 return PyEval_EvalFrameEx(f, 0);
Phillip J. Eby0d6615f2005-08-02 00:46:46 +0000686}
687
688PyObject *
Anthony Baxtera863d332006-04-11 07:43:46 +0000689PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
Guido van Rossum374a9221991-04-04 10:40:29 +0000690{
Benjamin Peterson2c992a02015-05-28 12:45:31 -0500691#ifdef DYNAMIC_EXECUTION_PROFILE
692 #undef USE_COMPUTED_GOTOS
693#endif
694#ifdef HAVE_COMPUTED_GOTOS
695 #ifndef USE_COMPUTED_GOTOS
696 #define USE_COMPUTED_GOTOS 1
697 #endif
698#else
699 #if defined(USE_COMPUTED_GOTOS) && USE_COMPUTED_GOTOS
700 #error "Computed gotos are not supported on this compiler."
701 #endif
702 #undef USE_COMPUTED_GOTOS
703 #define USE_COMPUTED_GOTOS 0
704#endif
705#if USE_COMPUTED_GOTOS
706/* Import the static jump table */
707#include "opcode_targets.h"
708
709 /* This macro is used when several opcodes defer to the same implementation
710 (e.g. SETUP_LOOP, SETUP_FINALLY) */
711#define TARGET_WITH_IMPL(op, impl) \
Benjamin Peterson14462d42015-08-19 20:38:39 -0700712 TARGET_##op: \
713 opcode = op; \
714 oparg = NEXTARG(); \
715 case op: \
716 goto impl; \
Benjamin Peterson2c992a02015-05-28 12:45:31 -0500717
718#define TARGET_WITH_IMPL_NOARG(op, impl) \
Benjamin Peterson14462d42015-08-19 20:38:39 -0700719 TARGET_##op: \
720 opcode = op; \
721 case op: \
722 goto impl; \
Benjamin Peterson2c992a02015-05-28 12:45:31 -0500723
724#define TARGET_NOARG(op) \
Benjamin Peterson14462d42015-08-19 20:38:39 -0700725 TARGET_##op: \
726 opcode = op; \
727 case op:\
Benjamin Peterson2c992a02015-05-28 12:45:31 -0500728
729#define TARGET(op) \
Benjamin Peterson14462d42015-08-19 20:38:39 -0700730 TARGET_##op: \
731 opcode = op; \
732 oparg = NEXTARG(); \
733 case op:\
Benjamin Peterson2c992a02015-05-28 12:45:31 -0500734
735
736#define DISPATCH() \
Benjamin Peterson14462d42015-08-19 20:38:39 -0700737 { \
738 int _tick = _Py_Ticker - 1; \
739 _Py_Ticker = _tick; \
740 if (_tick >= 0) { \
741 FAST_DISPATCH(); \
742 } \
743 continue; \
744 }
Benjamin Peterson2c992a02015-05-28 12:45:31 -0500745
746#ifdef LLTRACE
747#define FAST_DISPATCH() \
Benjamin Peterson14462d42015-08-19 20:38:39 -0700748 { \
749 if (!lltrace && !_Py_TracingPossible) { \
750 f->f_lasti = INSTR_OFFSET(); \
751 goto *opcode_targets[*next_instr++]; \
752 } \
753 goto fast_next_opcode; \
754 }
Benjamin Peterson2c992a02015-05-28 12:45:31 -0500755#else
756#define FAST_DISPATCH() { \
Benjamin Peterson14462d42015-08-19 20:38:39 -0700757 if (!_Py_TracingPossible) { \
758 f->f_lasti = INSTR_OFFSET(); \
759 goto *opcode_targets[*next_instr++]; \
760 } \
761 goto fast_next_opcode;\
Benjamin Peterson2c992a02015-05-28 12:45:31 -0500762}
763#endif
764
765#else
766#define TARGET(op) \
Benjamin Peterson14462d42015-08-19 20:38:39 -0700767 case op:
Benjamin Peterson2c992a02015-05-28 12:45:31 -0500768#define TARGET_WITH_IMPL(op, impl) \
Benjamin Peterson14462d42015-08-19 20:38:39 -0700769 /* silence compiler warnings about `impl` unused */ \
770 if (0) goto impl; \
771 case op:\
Benjamin Peterson2c992a02015-05-28 12:45:31 -0500772
773#define TARGET_NOARG(op) \
Benjamin Peterson14462d42015-08-19 20:38:39 -0700774 case op:\
Benjamin Peterson2c992a02015-05-28 12:45:31 -0500775
776#define TARGET_WITH_IMPL_NOARG(op, impl) \
Benjamin Peterson14462d42015-08-19 20:38:39 -0700777 if (0) goto impl; \
778 case op:\
Benjamin Peterson2c992a02015-05-28 12:45:31 -0500779
780#define DISPATCH() continue
781#define FAST_DISPATCH() goto fast_next_opcode
782#endif
783
784
Guido van Rossum950361c1997-01-24 13:49:28 +0000785#ifdef DXPAIRS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000786 int lastopcode = 0;
Guido van Rossum950361c1997-01-24 13:49:28 +0000787#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000788 register PyObject **stack_pointer; /* Next free slot in value stack */
789 register unsigned char *next_instr;
790 register int opcode; /* Current opcode */
791 register int oparg; /* Current opcode argument, if any */
792 register enum why_code why; /* Reason for block stack unwind */
793 register int err; /* Error status -- nonzero if error */
794 register PyObject *x; /* Result object -- NULL if error */
795 register PyObject *v; /* Temporary objects popped off stack */
796 register PyObject *w;
797 register PyObject *u;
798 register PyObject *t;
799 register PyObject *stream = NULL; /* for PRINT opcodes */
800 register PyObject **fastlocals, **freevars;
801 PyObject *retval = NULL; /* Return value */
802 PyThreadState *tstate = PyThreadState_GET();
803 PyCodeObject *co;
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000804
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000805 /* when tracing we set things up so that
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000806
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000807 not (instr_lb <= current_bytecode_offset < instr_ub)
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000808
Antoine Pitrouc83ea132010-05-09 14:46:46 +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 Pitrouc83ea132010-05-09 14:46:46 +0000814 unsigned char *first_instr;
815 PyObject *names;
816 PyObject *consts;
Neal Norwitz5f5153e2005-10-21 04:28:38 +0000817#if defined(Py_DEBUG) || defined(LLTRACE)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000818 /* Make it easier to find out where we are with a debugger */
819 char *filename;
Guido van Rossum99bec951992-09-03 20:29:45 +0000820#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000821
Neal Norwitza81d2202002-07-14 00:27:26 +0000822/* Tuple access macros */
823
824#ifndef Py_DEBUG
825#define GETITEM(v, i) PyTuple_GET_ITEM((PyTupleObject *)(v), (i))
826#else
827#define GETITEM(v, i) PyTuple_GetItem((v), (i))
828#endif
829
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000830#ifdef WITH_TSC
831/* Use Pentium timestamp counter to mark certain events:
832 inst0 -- beginning of switch statement for opcode dispatch
833 inst1 -- end of switch statement (may be skipped)
834 loop0 -- the top of the mainloop
Tim Peters7df5e7f2006-05-26 23:14:37 +0000835 loop1 -- place where control returns again to top of mainloop
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000836 (may be skipped)
837 intr1 -- beginning of long interruption
838 intr2 -- end of long interruption
839
840 Many opcodes call out to helper C functions. In some cases, the
841 time in those functions should be counted towards the time for the
842 opcode, but not in all cases. For example, a CALL_FUNCTION opcode
843 calls another Python function; there's no point in charge all the
844 bytecode executed by the called function to the caller.
845
846 It's hard to make a useful judgement statically. In the presence
847 of operator overloading, it's impossible to tell if a call will
848 execute new Python code or not.
849
850 It's a case-by-case judgement. I'll use intr1 for the following
851 cases:
852
853 EXEC_STMT
854 IMPORT_STAR
855 IMPORT_FROM
856 CALL_FUNCTION (and friends)
857
858 */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000859 uint64 inst0, inst1, loop0, loop1, intr0 = 0, intr1 = 0;
860 int ticked = 0;
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000861
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000862 READ_TIMESTAMP(inst0);
863 READ_TIMESTAMP(inst1);
864 READ_TIMESTAMP(loop0);
865 READ_TIMESTAMP(loop1);
Michael W. Hudson800ba232004-08-12 18:19:17 +0000866
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000867 /* shut up the compiler */
868 opcode = 0;
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000869#endif
870
Guido van Rossum374a9221991-04-04 10:40:29 +0000871/* Code access macros */
872
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000873#define INSTR_OFFSET() ((int)(next_instr - first_instr))
874#define NEXTOP() (*next_instr++)
875#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
876#define PEEKARG() ((next_instr[2]<<8) + next_instr[1])
877#define JUMPTO(x) (next_instr = first_instr + (x))
878#define JUMPBY(x) (next_instr += (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000879
Raymond Hettingerf606f872003-03-16 03:11:04 +0000880/* OpCode prediction macros
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000881 Some opcodes tend to come in pairs thus making it possible to
882 predict the second code when the first is run. For example,
883 GET_ITER is often followed by FOR_ITER. And FOR_ITER is often
884 followed by STORE_FAST or UNPACK_SEQUENCE.
Raymond Hettingerf606f872003-03-16 03:11:04 +0000885
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000886 Verifying the prediction costs a single high-speed test of a register
887 variable against a constant. If the pairing was good, then the
888 processor's own internal branch predication has a high likelihood of
889 success, resulting in a nearly zero-overhead transition to the
890 next opcode. A successful prediction saves a trip through the eval-loop
891 including its two unpredictable branches, the HAS_ARG test and the
892 switch-case. Combined with the processor's internal branch prediction,
893 a successful PREDICT has the effect of making the two opcodes run as if
894 they were a single new opcode with the bodies combined.
Raymond Hettingerf606f872003-03-16 03:11:04 +0000895
Raymond Hettingerafae11e2008-07-05 02:11:55 +0000896 If collecting opcode statistics, your choices are to either keep the
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000897 predictions turned-on and interpret the results as if some opcodes
898 had been combined or turn-off predictions so that the opcode frequency
899 counter updates for both opcodes.
Raymond Hettingerf606f872003-03-16 03:11:04 +0000900*/
901
Benjamin Peterson2c992a02015-05-28 12:45:31 -0500902
Benjamin Petersoncc06dbf2015-06-01 18:24:31 -0500903#if defined(DYNAMIC_EXECUTION_PROFILE) || USE_COMPUTED_GOTOS
904#define PREDICT(op) if (0) goto PRED_##op
905#define PREDICTED(op) PRED_##op:
906#define PREDICTED_WITH_ARG(op) PRED_##op:
Raymond Hettingera7216982004-02-08 19:59:27 +0000907#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000908#define PREDICT(op) if (*next_instr == op) goto PRED_##op
Benjamin Peterson2c992a02015-05-28 12:45:31 -0500909#define PREDICTED(op) PRED_##op: next_instr++
Benjamin Peterson2c992a02015-05-28 12:45:31 -0500910#define PREDICTED_WITH_ARG(op) PRED_##op: oparg = PEEKARG(); next_instr += 3
911#endif
Benjamin Peterson2c992a02015-05-28 12:45:31 -0500912
Raymond Hettingerf606f872003-03-16 03:11:04 +0000913
Guido van Rossum374a9221991-04-04 10:40:29 +0000914/* Stack manipulation macros */
915
Martin v. Löwis18e16552006-02-15 17:27:45 +0000916/* The stack can grow at most MAXINT deep, as co_nlocals and
917 co_stacksize are ints. */
Stefan Krah7ff78252010-06-23 18:12:09 +0000918#define STACK_LEVEL() ((int)(stack_pointer - f->f_valuestack))
919#define EMPTY() (STACK_LEVEL() == 0)
920#define TOP() (stack_pointer[-1])
921#define SECOND() (stack_pointer[-2])
922#define THIRD() (stack_pointer[-3])
923#define FOURTH() (stack_pointer[-4])
924#define PEEK(n) (stack_pointer[-(n)])
925#define SET_TOP(v) (stack_pointer[-1] = (v))
926#define SET_SECOND(v) (stack_pointer[-2] = (v))
927#define SET_THIRD(v) (stack_pointer[-3] = (v))
928#define SET_FOURTH(v) (stack_pointer[-4] = (v))
929#define SET_VALUE(n, v) (stack_pointer[-(n)] = (v))
930#define BASIC_STACKADJ(n) (stack_pointer += n)
931#define BASIC_PUSH(v) (*stack_pointer++ = (v))
932#define BASIC_POP() (*--stack_pointer)
Guido van Rossum374a9221991-04-04 10:40:29 +0000933
Guido van Rossum96a42c81992-01-12 02:29:51 +0000934#ifdef LLTRACE
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000935#define PUSH(v) { (void)(BASIC_PUSH(v), \
Stefan Krah7ff78252010-06-23 18:12:09 +0000936 lltrace && prtrace(TOP(), "push")); \
937 assert(STACK_LEVEL() <= co->co_stacksize); }
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000938#define POP() ((void)(lltrace && prtrace(TOP(), "pop")), \
Stefan Krah7ff78252010-06-23 18:12:09 +0000939 BASIC_POP())
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000940#define STACKADJ(n) { (void)(BASIC_STACKADJ(n), \
Stefan Krah7ff78252010-06-23 18:12:09 +0000941 lltrace && prtrace(TOP(), "stackadj")); \
942 assert(STACK_LEVEL() <= co->co_stacksize); }
Christian Heimes52729ac2007-12-14 02:33:57 +0000943#define EXT_POP(STACK_POINTER) ((void)(lltrace && \
Stefan Krah7ff78252010-06-23 18:12:09 +0000944 prtrace((STACK_POINTER)[-1], "ext_pop")), \
945 *--(STACK_POINTER))
Guido van Rossum374a9221991-04-04 10:40:29 +0000946#else
Stefan Krah7ff78252010-06-23 18:12:09 +0000947#define PUSH(v) BASIC_PUSH(v)
948#define POP() BASIC_POP()
949#define STACKADJ(n) BASIC_STACKADJ(n)
Guido van Rossumc2e20742006-02-27 22:32:47 +0000950#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
Guido van Rossum374a9221991-04-04 10:40:29 +0000951#endif
952
Guido van Rossum681d79a1995-07-18 14:51:37 +0000953/* Local variable macros */
954
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000955#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumcfbf1a32002-03-28 20:17:52 +0000956
957/* The SETLOCAL() macro must not DECREF the local variable in-place and
958 then store the new value; it must copy the old value to a temporary
959 value, then store the new value, and then DECREF the temporary value.
960 This is because it is possible that during the DECREF the frame is
961 accessed by other code (e.g. a __del__ method or gc.collect()) and the
962 variable would be pointing to already-freed memory. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000963#define SETLOCAL(i, value) do { PyObject *tmp = GETLOCAL(i); \
Stefan Krah7ff78252010-06-23 18:12:09 +0000964 GETLOCAL(i) = value; \
965 Py_XDECREF(tmp); } while (0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000966
Guido van Rossuma027efa1997-05-05 20:56:21 +0000967/* Start of code */
968
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000969 if (f == NULL)
970 return NULL;
Tim Peters5ca576e2001-06-18 22:08:13 +0000971
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000972 /* push frame */
973 if (Py_EnterRecursiveCall(""))
974 return NULL;
Guido van Rossum8861b741996-07-30 16:49:37 +0000975
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000976 tstate->frame = f;
Tim Peters5ca576e2001-06-18 22:08:13 +0000977
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000978 if (tstate->use_tracing) {
979 if (tstate->c_tracefunc != NULL) {
980 /* tstate->c_tracefunc, if defined, is a
981 function that will be called on *every* entry
982 to a code block. Its return value, if not
983 None, is a function that will be called at
984 the start of each executed line of code.
985 (Actually, the function must return itself
986 in order to continue tracing.) The trace
987 functions are called with three arguments:
988 a pointer to the current frame, a string
989 indicating why the function is called, and
990 an argument which depends on the situation.
991 The global trace function is also called
992 whenever an exception is detected. */
993 if (call_trace_protected(tstate->c_tracefunc,
994 tstate->c_traceobj,
995 f, PyTrace_CALL, Py_None)) {
996 /* Trace function raised an error */
997 goto exit_eval_frame;
998 }
999 }
1000 if (tstate->c_profilefunc != NULL) {
1001 /* Similar for c_profilefunc, except it needn't
1002 return itself and isn't called for "line" events */
1003 if (call_trace_protected(tstate->c_profilefunc,
1004 tstate->c_profileobj,
1005 f, PyTrace_CALL, Py_None)) {
1006 /* Profile function raised an error */
1007 goto exit_eval_frame;
1008 }
1009 }
1010 }
Neil Schemenauer6c0f2002001-09-04 19:03:35 +00001011
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001012 co = f->f_code;
1013 names = co->co_names;
1014 consts = co->co_consts;
1015 fastlocals = f->f_localsplus;
1016 freevars = f->f_localsplus + co->co_nlocals;
1017 first_instr = (unsigned char*) PyString_AS_STRING(co->co_code);
1018 /* An explanation is in order for the next line.
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001019
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001020 f->f_lasti now refers to the index of the last instruction
1021 executed. You might think this was obvious from the name, but
1022 this wasn't always true before 2.3! PyFrame_New now sets
1023 f->f_lasti to -1 (i.e. the index *before* the first instruction)
1024 and YIELD_VALUE doesn't fiddle with f_lasti any more. So this
1025 does work. Promise.
Raymond Hettinger4bd97d42007-01-06 01:14:41 +00001026
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001027 When the PREDICT() macros are enabled, some opcode pairs follow in
1028 direct succession without updating f->f_lasti. A successful
1029 prediction effectively links the two codes together as if they
1030 were a single new opcode; accordingly,f->f_lasti will point to
1031 the first code in the pair (for instance, GET_ITER followed by
1032 FOR_ITER is effectively a single opcode and f->f_lasti will point
1033 at to the beginning of the combined pair.)
1034 */
1035 next_instr = first_instr + f->f_lasti + 1;
1036 stack_pointer = f->f_stacktop;
1037 assert(stack_pointer != NULL);
1038 f->f_stacktop = NULL; /* remains NULL unless yield suspends frame */
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001039
Tim Peters5ca576e2001-06-18 22:08:13 +00001040#ifdef LLTRACE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001041 lltrace = PyDict_GetItemString(f->f_globals, "__lltrace__") != NULL;
Tim Peters5ca576e2001-06-18 22:08:13 +00001042#endif
Neal Norwitz5f5153e2005-10-21 04:28:38 +00001043#if defined(Py_DEBUG) || defined(LLTRACE)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001044 filename = PyString_AsString(co->co_filename);
Tim Peters5ca576e2001-06-18 22:08:13 +00001045#endif
Guido van Rossumac7be682001-01-17 15:42:30 +00001046
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001047 why = WHY_NOT;
1048 err = 0;
1049 x = Py_None; /* Not a reference, just anything non-NULL */
1050 w = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00001051
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001052 if (throwflag) { /* support for generator.throw() */
1053 why = WHY_EXCEPTION;
1054 goto on_error;
1055 }
Tim Peters7df5e7f2006-05-26 23:14:37 +00001056
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001057 for (;;) {
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00001058#ifdef WITH_TSC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001059 if (inst1 == 0) {
1060 /* Almost surely, the opcode executed a break
1061 or a continue, preventing inst1 from being set
1062 on the way out of the loop.
1063 */
1064 READ_TIMESTAMP(inst1);
1065 loop1 = inst1;
1066 }
1067 dump_tsc(opcode, ticked, inst0, inst1, loop0, loop1,
1068 intr0, intr1);
1069 ticked = 0;
1070 inst1 = 0;
1071 intr0 = 0;
1072 intr1 = 0;
1073 READ_TIMESTAMP(loop0);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00001074#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001075 assert(stack_pointer >= f->f_valuestack); /* else underflow */
1076 assert(STACK_LEVEL() <= co->co_stacksize); /* else overflow */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001077
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001078 /* Do periodic things. Doing this every time through
1079 the loop would add too much overhead, so we do it
1080 only every Nth instruction. We also do it if
1081 ``pendingcalls_to_do'' is set, i.e. when an asynchronous
1082 event needs attention (e.g. a signal handler or
1083 async I/O handler); see Py_AddPendingCall() and
1084 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +00001085
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001086 if (--_Py_Ticker < 0) {
1087 if (*next_instr == SETUP_FINALLY) {
1088 /* Make the last opcode before
Ezio Melottic2077b02011-03-16 12:34:31 +02001089 a try: finally: block uninterruptible. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001090 goto fast_next_opcode;
1091 }
1092 _Py_Ticker = _Py_CheckInterval;
1093 tstate->tick_counter++;
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00001094#ifdef WITH_TSC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001095 ticked = 1;
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00001096#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001097 if (pendingcalls_to_do) {
1098 if (Py_MakePendingCalls() < 0) {
1099 why = WHY_EXCEPTION;
1100 goto on_error;
1101 }
1102 if (pendingcalls_to_do)
1103 /* MakePendingCalls() didn't succeed.
1104 Force early re-execution of this
1105 "periodic" code, possibly after
1106 a thread switch */
1107 _Py_Ticker = 0;
1108 }
Guido van Rossume59214e1994-08-30 08:01:59 +00001109#ifdef WITH_THREAD
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001110 if (interpreter_lock) {
1111 /* Give another thread a chance */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001112
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001113 if (PyThreadState_Swap(NULL) != tstate)
1114 Py_FatalError("ceval: tstate mix-up");
1115 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001116
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001117 /* Other threads may run now */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001118
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001119 PyThread_acquire_lock(interpreter_lock, 1);
Benjamin Peterson1c78e6d2014-06-16 22:59:07 -07001120
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001121 if (PyThreadState_Swap(tstate) != NULL)
1122 Py_FatalError("ceval: orphan tstate");
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +00001123
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001124 /* Check for thread interrupts */
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +00001125
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001126 if (tstate->async_exc != NULL) {
1127 x = tstate->async_exc;
1128 tstate->async_exc = NULL;
1129 PyErr_SetNone(x);
1130 Py_DECREF(x);
1131 why = WHY_EXCEPTION;
1132 goto on_error;
1133 }
1134 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001135#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001136 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001137
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001138 fast_next_opcode:
1139 f->f_lasti = INSTR_OFFSET();
Guido van Rossumac7be682001-01-17 15:42:30 +00001140
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001141 /* line-by-line tracing support */
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001142
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001143 if (_Py_TracingPossible &&
1144 tstate->c_tracefunc != NULL && !tstate->tracing) {
1145 /* see maybe_call_line_trace
1146 for expository comments */
1147 f->f_stacktop = stack_pointer;
Tim Peters8a5c3c72004-04-05 19:36:21 +00001148
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001149 err = maybe_call_line_trace(tstate->c_tracefunc,
1150 tstate->c_traceobj,
1151 f, &instr_lb, &instr_ub,
1152 &instr_prev);
1153 /* Reload possibly changed frame fields */
1154 JUMPTO(f->f_lasti);
1155 if (f->f_stacktop != NULL) {
1156 stack_pointer = f->f_stacktop;
1157 f->f_stacktop = NULL;
1158 }
1159 if (err) {
1160 /* trace function raised an exception */
1161 goto on_error;
1162 }
1163 }
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001164
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001165 /* Extract opcode and argument */
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001166
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001167 opcode = NEXTOP();
1168 oparg = 0; /* allows oparg to be stored in a register because
1169 it doesn't have to be remembered across a full loop */
1170 if (HAS_ARG(opcode))
1171 oparg = NEXTARG();
Stefan Krah7ff78252010-06-23 18:12:09 +00001172 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +00001173#ifdef DYNAMIC_EXECUTION_PROFILE
1174#ifdef DXPAIRS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001175 dxpairs[lastopcode][opcode]++;
1176 lastopcode = opcode;
Guido van Rossum950361c1997-01-24 13:49:28 +00001177#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001178 dxp[opcode]++;
Guido van Rossum950361c1997-01-24 13:49:28 +00001179#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001180
Guido van Rossum96a42c81992-01-12 02:29:51 +00001181#ifdef LLTRACE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001182 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +00001183
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001184 if (lltrace) {
1185 if (HAS_ARG(opcode)) {
1186 printf("%d: %d, %d\n",
1187 f->f_lasti, opcode, oparg);
1188 }
1189 else {
1190 printf("%d: %d\n",
1191 f->f_lasti, opcode);
1192 }
1193 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001194#endif
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001195
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001196 /* Main switch on opcode */
1197 READ_TIMESTAMP(inst0);
Jeremy Hylton52820442001-01-03 23:52:36 +00001198
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001199 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +00001200
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001201 /* BEWARE!
1202 It is essential that any operation that fails sets either
1203 x to NULL, err to nonzero, or why to anything but WHY_NOT,
1204 and that no operation that succeeds does this! */
Guido van Rossumac7be682001-01-17 15:42:30 +00001205
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001206 /* case STOP_CODE: this is an error! */
Guido van Rossumac7be682001-01-17 15:42:30 +00001207
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001208 TARGET_NOARG(NOP)
Benjamin Peterson14462d42015-08-19 20:38:39 -07001209 {
1210 FAST_DISPATCH();
1211 }
Raymond Hettinger9c18e812004-06-21 16:31:15 +00001212
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001213 TARGET(LOAD_FAST)
1214 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001215 x = GETLOCAL(oparg);
1216 if (x != NULL) {
1217 Py_INCREF(x);
1218 PUSH(x);
Benjamin Peterson14462d42015-08-19 20:38:39 -07001219 FAST_DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001220 }
1221 format_exc_check_arg(PyExc_UnboundLocalError,
1222 UNBOUNDLOCAL_ERROR_MSG,
1223 PyTuple_GetItem(co->co_varnames, oparg));
1224 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001225 }
Neil Schemenauer63543862002-02-17 19:10:14 +00001226
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001227 TARGET(LOAD_CONST)
1228 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001229 x = GETITEM(consts, oparg);
1230 Py_INCREF(x);
1231 PUSH(x);
Benjamin Peterson14462d42015-08-19 20:38:39 -07001232 FAST_DISPATCH();
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001233 }
Neil Schemenauer63543862002-02-17 19:10:14 +00001234
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001235 PREDICTED_WITH_ARG(STORE_FAST);
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001236 TARGET(STORE_FAST)
1237 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001238 v = POP();
1239 SETLOCAL(oparg, v);
Benjamin Peterson14462d42015-08-19 20:38:39 -07001240 FAST_DISPATCH();
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001241 }
Neil Schemenauer63543862002-02-17 19:10:14 +00001242
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001243 TARGET_NOARG(POP_TOP)
1244 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001245 v = POP();
1246 Py_DECREF(v);
Benjamin Peterson14462d42015-08-19 20:38:39 -07001247 FAST_DISPATCH();
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001248 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001249
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001250 TARGET_NOARG(ROT_TWO)
1251 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001252 v = TOP();
1253 w = SECOND();
1254 SET_TOP(w);
1255 SET_SECOND(v);
Benjamin Peterson14462d42015-08-19 20:38:39 -07001256 FAST_DISPATCH();
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001257 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001258
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001259 TARGET_NOARG(ROT_THREE)
1260 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001261 v = TOP();
1262 w = SECOND();
1263 x = THIRD();
1264 SET_TOP(w);
1265 SET_SECOND(x);
1266 SET_THIRD(v);
Benjamin Peterson14462d42015-08-19 20:38:39 -07001267 FAST_DISPATCH();
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001268 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001269
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001270 TARGET_NOARG(ROT_FOUR)
Benjamin Peterson14462d42015-08-19 20:38:39 -07001271 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001272 u = TOP();
1273 v = SECOND();
1274 w = THIRD();
1275 x = FOURTH();
1276 SET_TOP(v);
1277 SET_SECOND(w);
1278 SET_THIRD(x);
1279 SET_FOURTH(u);
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001280 FAST_DISPATCH();
Benjamin Peterson14462d42015-08-19 20:38:39 -07001281 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001282
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001283
1284 TARGET_NOARG(DUP_TOP)
1285 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001286 v = TOP();
1287 Py_INCREF(v);
1288 PUSH(v);
Benjamin Peterson14462d42015-08-19 20:38:39 -07001289 FAST_DISPATCH();
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001290 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001291
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001292
1293 TARGET(DUP_TOPX)
1294 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001295 if (oparg == 2) {
1296 x = TOP();
1297 Py_INCREF(x);
1298 w = SECOND();
1299 Py_INCREF(w);
1300 STACKADJ(2);
1301 SET_TOP(x);
1302 SET_SECOND(w);
Benjamin Peterson14462d42015-08-19 20:38:39 -07001303 FAST_DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001304 } else if (oparg == 3) {
1305 x = TOP();
1306 Py_INCREF(x);
1307 w = SECOND();
1308 Py_INCREF(w);
1309 v = THIRD();
1310 Py_INCREF(v);
1311 STACKADJ(3);
1312 SET_TOP(x);
1313 SET_SECOND(w);
1314 SET_THIRD(v);
Benjamin Peterson14462d42015-08-19 20:38:39 -07001315 FAST_DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001316 }
1317 Py_FatalError("invalid argument to DUP_TOPX"
1318 " (bytecode corruption?)");
1319 /* Never returns, so don't bother to set why. */
1320 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001321 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001322
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001323 TARGET_NOARG(UNARY_POSITIVE)
1324 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001325 v = TOP();
1326 x = PyNumber_Positive(v);
1327 Py_DECREF(v);
1328 SET_TOP(x);
Benjamin Peterson14462d42015-08-19 20:38:39 -07001329 if (x != NULL) DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001330 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001331 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001332
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001333 TARGET_NOARG( UNARY_NEGATIVE)
1334 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001335 v = TOP();
1336 x = PyNumber_Negative(v);
1337 Py_DECREF(v);
1338 SET_TOP(x);
Benjamin Peterson14462d42015-08-19 20:38:39 -07001339 if (x != NULL) DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001340 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001341 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001342
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001343 TARGET_NOARG(UNARY_NOT)
1344 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001345 v = TOP();
1346 err = PyObject_IsTrue(v);
1347 Py_DECREF(v);
1348 if (err == 0) {
1349 Py_INCREF(Py_True);
1350 SET_TOP(Py_True);
Benjamin Peterson14462d42015-08-19 20:38:39 -07001351 DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001352 }
1353 else if (err > 0) {
1354 Py_INCREF(Py_False);
1355 SET_TOP(Py_False);
1356 err = 0;
Benjamin Peterson14462d42015-08-19 20:38:39 -07001357 DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001358 }
1359 STACKADJ(-1);
1360 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001361 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001362
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001363 TARGET_NOARG(UNARY_CONVERT)
1364 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001365 v = TOP();
1366 x = PyObject_Repr(v);
1367 Py_DECREF(v);
1368 SET_TOP(x);
Benjamin Peterson14462d42015-08-19 20:38:39 -07001369 if (x != NULL) DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001370 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001371 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001372
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001373 TARGET_NOARG(UNARY_INVERT)
1374 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001375 v = TOP();
1376 x = PyNumber_Invert(v);
1377 Py_DECREF(v);
1378 SET_TOP(x);
Benjamin Peterson14462d42015-08-19 20:38:39 -07001379 if (x != NULL) DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001380 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001381 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001382
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001383 TARGET_NOARG(BINARY_POWER)
1384 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001385 w = POP();
1386 v = TOP();
1387 x = PyNumber_Power(v, w, Py_None);
1388 Py_DECREF(v);
1389 Py_DECREF(w);
1390 SET_TOP(x);
Benjamin Peterson14462d42015-08-19 20:38:39 -07001391 if (x != NULL) DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001392 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001393 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001394
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001395 TARGET_NOARG(BINARY_MULTIPLY)
1396 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001397 w = POP();
1398 v = TOP();
1399 x = PyNumber_Multiply(v, w);
1400 Py_DECREF(v);
1401 Py_DECREF(w);
1402 SET_TOP(x);
Benjamin Peterson14462d42015-08-19 20:38:39 -07001403 if(x!=NULL) DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001404 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001405 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001406
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001407 TARGET_NOARG(BINARY_DIVIDE)
1408 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001409 if (!_Py_QnewFlag) {
1410 w = POP();
1411 v = TOP();
1412 x = PyNumber_Divide(v, w);
1413 Py_DECREF(v);
1414 Py_DECREF(w);
1415 SET_TOP(x);
Benjamin Peterson14462d42015-08-19 20:38:39 -07001416 if (x != NULL) DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001417 break;
1418 }
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001419 }
1420 /* -Qnew is in effect: fall through to BINARY_TRUE_DIVIDE */
1421 TARGET_NOARG(BINARY_TRUE_DIVIDE)
1422 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001423 w = POP();
1424 v = TOP();
1425 x = PyNumber_TrueDivide(v, w);
1426 Py_DECREF(v);
1427 Py_DECREF(w);
1428 SET_TOP(x);
Benjamin Peterson14462d42015-08-19 20:38:39 -07001429 if (x != NULL) DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001430 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001431 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001432
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001433 TARGET_NOARG(BINARY_FLOOR_DIVIDE)
1434 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001435 w = POP();
1436 v = TOP();
1437 x = PyNumber_FloorDivide(v, w);
1438 Py_DECREF(v);
1439 Py_DECREF(w);
1440 SET_TOP(x);
Benjamin Peterson14462d42015-08-19 20:38:39 -07001441 if (x != NULL) DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001442 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001443 }
Guido van Rossum4668b002001-08-08 05:00:18 +00001444
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001445 TARGET_NOARG(BINARY_MODULO)
1446 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001447 w = POP();
1448 v = TOP();
Xiang Zhangb4f0e982017-03-01 14:28:14 +08001449 if (PyString_CheckExact(v)
1450 && (!PyString_Check(w) || PyString_CheckExact(w))) {
1451 /* fast path; string formatting, but not if the RHS is a str subclass
1452 (see issue28598) */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001453 x = PyString_Format(v, w);
Xiang Zhangb4f0e982017-03-01 14:28:14 +08001454 } else {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001455 x = PyNumber_Remainder(v, w);
Xiang Zhangb4f0e982017-03-01 14:28:14 +08001456 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001457 Py_DECREF(v);
1458 Py_DECREF(w);
1459 SET_TOP(x);
Benjamin Peterson14462d42015-08-19 20:38:39 -07001460 if (x != NULL) DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001461 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001462 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001463
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001464 TARGET_NOARG(BINARY_ADD)
1465 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001466 w = POP();
1467 v = TOP();
1468 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
1469 /* INLINE: int + int */
1470 register long a, b, i;
1471 a = PyInt_AS_LONG(v);
1472 b = PyInt_AS_LONG(w);
1473 /* cast to avoid undefined behaviour
1474 on overflow */
1475 i = (long)((unsigned long)a + b);
1476 if ((i^a) < 0 && (i^b) < 0)
1477 goto slow_add;
1478 x = PyInt_FromLong(i);
1479 }
1480 else if (PyString_CheckExact(v) &&
1481 PyString_CheckExact(w)) {
1482 x = string_concatenate(v, w, f, next_instr);
1483 /* string_concatenate consumed the ref to v */
1484 goto skip_decref_vx;
1485 }
1486 else {
1487 slow_add:
1488 x = PyNumber_Add(v, w);
1489 }
1490 Py_DECREF(v);
1491 skip_decref_vx:
1492 Py_DECREF(w);
1493 SET_TOP(x);
Benjamin Peterson14462d42015-08-19 20:38:39 -07001494 if (x != NULL) DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001495 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001496 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001497
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001498 TARGET_NOARG(BINARY_SUBTRACT)
1499 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001500 w = POP();
1501 v = TOP();
1502 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
1503 /* INLINE: int - int */
1504 register long a, b, i;
1505 a = PyInt_AS_LONG(v);
1506 b = PyInt_AS_LONG(w);
1507 /* cast to avoid undefined behaviour
1508 on overflow */
1509 i = (long)((unsigned long)a - b);
1510 if ((i^a) < 0 && (i^~b) < 0)
1511 goto slow_sub;
1512 x = PyInt_FromLong(i);
1513 }
1514 else {
1515 slow_sub:
1516 x = PyNumber_Subtract(v, w);
1517 }
1518 Py_DECREF(v);
1519 Py_DECREF(w);
1520 SET_TOP(x);
Benjamin Peterson14462d42015-08-19 20:38:39 -07001521 if (x != NULL) DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001522 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001523 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001524
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001525 TARGET_NOARG(BINARY_SUBSCR)
1526 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001527 w = POP();
1528 v = TOP();
1529 if (PyList_CheckExact(v) && PyInt_CheckExact(w)) {
1530 /* INLINE: list[int] */
1531 Py_ssize_t i = PyInt_AsSsize_t(w);
1532 if (i < 0)
1533 i += PyList_GET_SIZE(v);
1534 if (i >= 0 && i < PyList_GET_SIZE(v)) {
1535 x = PyList_GET_ITEM(v, i);
1536 Py_INCREF(x);
1537 }
1538 else
1539 goto slow_get;
1540 }
1541 else
1542 slow_get:
1543 x = PyObject_GetItem(v, w);
1544 Py_DECREF(v);
1545 Py_DECREF(w);
1546 SET_TOP(x);
Benjamin Peterson14462d42015-08-19 20:38:39 -07001547 if (x != NULL) DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001548 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001549 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001550
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001551 TARGET_NOARG(BINARY_LSHIFT)
1552 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001553 w = POP();
1554 v = TOP();
1555 x = PyNumber_Lshift(v, w);
1556 Py_DECREF(v);
1557 Py_DECREF(w);
1558 SET_TOP(x);
Benjamin Peterson14462d42015-08-19 20:38:39 -07001559 if (x != NULL) DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001560 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001561 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001562
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001563 TARGET_NOARG(BINARY_RSHIFT)
1564 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001565 w = POP();
1566 v = TOP();
1567 x = PyNumber_Rshift(v, w);
1568 Py_DECREF(v);
1569 Py_DECREF(w);
1570 SET_TOP(x);
Benjamin Peterson14462d42015-08-19 20:38:39 -07001571 if (x != NULL) DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001572 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001573 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001574
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001575 TARGET_NOARG(BINARY_AND)
1576 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001577 w = POP();
1578 v = TOP();
1579 x = PyNumber_And(v, w);
1580 Py_DECREF(v);
1581 Py_DECREF(w);
1582 SET_TOP(x);
Benjamin Peterson14462d42015-08-19 20:38:39 -07001583 if (x != NULL) DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001584 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001585 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001586
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001587 TARGET_NOARG(BINARY_XOR)
1588 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001589 w = POP();
1590 v = TOP();
1591 x = PyNumber_Xor(v, w);
1592 Py_DECREF(v);
1593 Py_DECREF(w);
1594 SET_TOP(x);
Benjamin Peterson14462d42015-08-19 20:38:39 -07001595 if (x != NULL) DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001596 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001597 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001598
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001599 TARGET_NOARG(BINARY_OR)
1600 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001601 w = POP();
1602 v = TOP();
1603 x = PyNumber_Or(v, w);
1604 Py_DECREF(v);
1605 Py_DECREF(w);
1606 SET_TOP(x);
Benjamin Peterson14462d42015-08-19 20:38:39 -07001607 if (x != NULL) DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001608 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001609 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001610
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001611 TARGET(LIST_APPEND)
1612 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001613 w = POP();
1614 v = PEEK(oparg);
1615 err = PyList_Append(v, w);
1616 Py_DECREF(w);
1617 if (err == 0) {
1618 PREDICT(JUMP_ABSOLUTE);
Benjamin Peterson14462d42015-08-19 20:38:39 -07001619 DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001620 }
1621 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001622 }
Raymond Hettingerdd80f762004-03-07 07:31:06 +00001623
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001624 TARGET(SET_ADD)
1625 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001626 w = POP();
1627 v = stack_pointer[-oparg];
1628 err = PySet_Add(v, w);
1629 Py_DECREF(w);
1630 if (err == 0) {
1631 PREDICT(JUMP_ABSOLUTE);
Benjamin Peterson14462d42015-08-19 20:38:39 -07001632 DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001633 }
1634 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001635 }
Alexandre Vassalottib6465472010-01-11 22:36:12 +00001636
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001637 TARGET_NOARG(INPLACE_POWER)
1638 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001639 w = POP();
1640 v = TOP();
1641 x = PyNumber_InPlacePower(v, w, Py_None);
1642 Py_DECREF(v);
1643 Py_DECREF(w);
1644 SET_TOP(x);
Benjamin Peterson14462d42015-08-19 20:38:39 -07001645 if (x != NULL) DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001646 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001647 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001648
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001649 TARGET_NOARG(INPLACE_MULTIPLY)
1650 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001651 w = POP();
1652 v = TOP();
1653 x = PyNumber_InPlaceMultiply(v, w);
1654 Py_DECREF(v);
1655 Py_DECREF(w);
1656 SET_TOP(x);
Benjamin Peterson14462d42015-08-19 20:38:39 -07001657 if (x != NULL) DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001658 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001659 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001660
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001661 TARGET_NOARG(INPLACE_DIVIDE)
1662 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001663 if (!_Py_QnewFlag) {
1664 w = POP();
1665 v = TOP();
1666 x = PyNumber_InPlaceDivide(v, w);
1667 Py_DECREF(v);
1668 Py_DECREF(w);
1669 SET_TOP(x);
Benjamin Peterson14462d42015-08-19 20:38:39 -07001670 if (x != NULL) DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001671 break;
1672 }
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001673 }
Stefan Krah7ff78252010-06-23 18:12:09 +00001674 /* -Qnew is in effect: fall through to
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001675 INPLACE_TRUE_DIVIDE */
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001676 TARGET_NOARG(INPLACE_TRUE_DIVIDE)
1677 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001678 w = POP();
1679 v = TOP();
1680 x = PyNumber_InPlaceTrueDivide(v, w);
1681 Py_DECREF(v);
1682 Py_DECREF(w);
1683 SET_TOP(x);
Benjamin Peterson14462d42015-08-19 20:38:39 -07001684 if (x != NULL) DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001685 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001686 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001687
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001688 TARGET_NOARG(INPLACE_FLOOR_DIVIDE)
1689 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001690 w = POP();
1691 v = TOP();
1692 x = PyNumber_InPlaceFloorDivide(v, w);
1693 Py_DECREF(v);
1694 Py_DECREF(w);
1695 SET_TOP(x);
Benjamin Peterson14462d42015-08-19 20:38:39 -07001696 if (x != NULL) DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001697 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001698 }
Guido van Rossum4668b002001-08-08 05:00:18 +00001699
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001700 TARGET_NOARG(INPLACE_MODULO)
1701 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001702 w = POP();
1703 v = TOP();
1704 x = PyNumber_InPlaceRemainder(v, w);
1705 Py_DECREF(v);
1706 Py_DECREF(w);
1707 SET_TOP(x);
Benjamin Peterson14462d42015-08-19 20:38:39 -07001708 if (x != NULL) DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001709 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001710 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001711
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001712 TARGET_NOARG(INPLACE_ADD)
1713 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001714 w = POP();
1715 v = TOP();
1716 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
1717 /* INLINE: int + int */
1718 register long a, b, i;
1719 a = PyInt_AS_LONG(v);
1720 b = PyInt_AS_LONG(w);
1721 i = a + b;
1722 if ((i^a) < 0 && (i^b) < 0)
1723 goto slow_iadd;
1724 x = PyInt_FromLong(i);
1725 }
1726 else if (PyString_CheckExact(v) &&
1727 PyString_CheckExact(w)) {
1728 x = string_concatenate(v, w, f, next_instr);
1729 /* string_concatenate consumed the ref to v */
1730 goto skip_decref_v;
1731 }
1732 else {
1733 slow_iadd:
1734 x = PyNumber_InPlaceAdd(v, w);
1735 }
1736 Py_DECREF(v);
1737 skip_decref_v:
1738 Py_DECREF(w);
1739 SET_TOP(x);
Benjamin Peterson14462d42015-08-19 20:38:39 -07001740 if (x != NULL) DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001741 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001742 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001743
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001744 TARGET_NOARG(INPLACE_SUBTRACT)
1745 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001746 w = POP();
1747 v = TOP();
1748 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
1749 /* INLINE: int - int */
1750 register long a, b, i;
1751 a = PyInt_AS_LONG(v);
1752 b = PyInt_AS_LONG(w);
1753 i = a - b;
1754 if ((i^a) < 0 && (i^~b) < 0)
1755 goto slow_isub;
1756 x = PyInt_FromLong(i);
1757 }
1758 else {
1759 slow_isub:
1760 x = PyNumber_InPlaceSubtract(v, w);
1761 }
1762 Py_DECREF(v);
1763 Py_DECREF(w);
1764 SET_TOP(x);
Benjamin Peterson14462d42015-08-19 20:38:39 -07001765 if (x != NULL) DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001766 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001767 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001768
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001769 TARGET_NOARG(INPLACE_LSHIFT)
1770 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001771 w = POP();
1772 v = TOP();
1773 x = PyNumber_InPlaceLshift(v, w);
1774 Py_DECREF(v);
1775 Py_DECREF(w);
1776 SET_TOP(x);
Benjamin Peterson14462d42015-08-19 20:38:39 -07001777 if (x != NULL) DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001778 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001779 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001780
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001781 TARGET_NOARG(INPLACE_RSHIFT)
1782 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001783 w = POP();
1784 v = TOP();
1785 x = PyNumber_InPlaceRshift(v, w);
1786 Py_DECREF(v);
1787 Py_DECREF(w);
1788 SET_TOP(x);
Benjamin Peterson14462d42015-08-19 20:38:39 -07001789 if (x != NULL) DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001790 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001791 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001792
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001793 TARGET_NOARG(INPLACE_AND)
1794 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001795 w = POP();
1796 v = TOP();
1797 x = PyNumber_InPlaceAnd(v, w);
1798 Py_DECREF(v);
1799 Py_DECREF(w);
1800 SET_TOP(x);
Benjamin Peterson14462d42015-08-19 20:38:39 -07001801 if (x != NULL) DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001802 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001803 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001804
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001805 TARGET_NOARG(INPLACE_XOR)
1806 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001807 w = POP();
1808 v = TOP();
1809 x = PyNumber_InPlaceXor(v, w);
1810 Py_DECREF(v);
1811 Py_DECREF(w);
1812 SET_TOP(x);
Benjamin Peterson14462d42015-08-19 20:38:39 -07001813 if (x != NULL) DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001814 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001815 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001816
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001817 TARGET_NOARG(INPLACE_OR)
1818 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001819 w = POP();
1820 v = TOP();
1821 x = PyNumber_InPlaceOr(v, w);
1822 Py_DECREF(v);
1823 Py_DECREF(w);
1824 SET_TOP(x);
Benjamin Peterson14462d42015-08-19 20:38:39 -07001825 if (x != NULL) DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001826 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001827 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001828
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001829
1830
1831 TARGET_WITH_IMPL_NOARG(SLICE, _slice)
1832 TARGET_WITH_IMPL_NOARG(SLICE_1, _slice)
Benjamin Peterson14462d42015-08-19 20:38:39 -07001833 TARGET_WITH_IMPL_NOARG(SLICE_2, _slice)
1834 TARGET_WITH_IMPL_NOARG(SLICE_3, _slice)
1835 _slice:
1836 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001837 if ((opcode-SLICE) & 2)
1838 w = POP();
1839 else
1840 w = NULL;
1841 if ((opcode-SLICE) & 1)
1842 v = POP();
1843 else
1844 v = NULL;
1845 u = TOP();
1846 x = apply_slice(u, v, w);
1847 Py_DECREF(u);
1848 Py_XDECREF(v);
1849 Py_XDECREF(w);
1850 SET_TOP(x);
Benjamin Peterson14462d42015-08-19 20:38:39 -07001851 if (x != NULL) DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001852 break;
Benjamin Peterson14462d42015-08-19 20:38:39 -07001853 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001854
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001855
1856 TARGET_WITH_IMPL_NOARG(STORE_SLICE, _store_slice)
1857 TARGET_WITH_IMPL_NOARG(STORE_SLICE_1, _store_slice)
Benjamin Peterson14462d42015-08-19 20:38:39 -07001858 TARGET_WITH_IMPL_NOARG(STORE_SLICE_2, _store_slice)
1859 TARGET_WITH_IMPL_NOARG(STORE_SLICE_3, _store_slice)
1860 _store_slice:
1861 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001862 if ((opcode-STORE_SLICE) & 2)
1863 w = POP();
1864 else
1865 w = NULL;
1866 if ((opcode-STORE_SLICE) & 1)
1867 v = POP();
1868 else
1869 v = NULL;
1870 u = POP();
1871 t = POP();
1872 err = assign_slice(u, v, w, t); /* u[v:w] = t */
1873 Py_DECREF(t);
1874 Py_DECREF(u);
1875 Py_XDECREF(v);
1876 Py_XDECREF(w);
Benjamin Peterson14462d42015-08-19 20:38:39 -07001877 if (err == 0) DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001878 break;
Benjamin Peterson14462d42015-08-19 20:38:39 -07001879 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001880
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001881
1882 TARGET_WITH_IMPL_NOARG(DELETE_SLICE, _delete_slice)
1883 TARGET_WITH_IMPL_NOARG(DELETE_SLICE_1, _delete_slice)
Benjamin Peterson14462d42015-08-19 20:38:39 -07001884 TARGET_WITH_IMPL_NOARG(DELETE_SLICE_2, _delete_slice)
1885 TARGET_WITH_IMPL_NOARG(DELETE_SLICE_3, _delete_slice)
1886 _delete_slice:
1887 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001888 if ((opcode-DELETE_SLICE) & 2)
1889 w = POP();
1890 else
1891 w = NULL;
1892 if ((opcode-DELETE_SLICE) & 1)
1893 v = POP();
1894 else
1895 v = NULL;
1896 u = POP();
1897 err = assign_slice(u, v, w, (PyObject *)NULL);
1898 /* del u[v:w] */
1899 Py_DECREF(u);
1900 Py_XDECREF(v);
1901 Py_XDECREF(w);
Benjamin Peterson14462d42015-08-19 20:38:39 -07001902 if (err == 0) DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001903 break;
Benjamin Peterson14462d42015-08-19 20:38:39 -07001904 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001905
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001906 TARGET_NOARG(STORE_SUBSCR)
1907 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001908 w = TOP();
1909 v = SECOND();
1910 u = THIRD();
1911 STACKADJ(-3);
1912 /* v[w] = u */
1913 err = PyObject_SetItem(v, w, u);
1914 Py_DECREF(u);
1915 Py_DECREF(v);
1916 Py_DECREF(w);
Benjamin Peterson14462d42015-08-19 20:38:39 -07001917 if (err == 0) DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001918 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001919 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001920
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001921 TARGET_NOARG(DELETE_SUBSCR)
1922 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001923 w = TOP();
1924 v = SECOND();
1925 STACKADJ(-2);
1926 /* del v[w] */
1927 err = PyObject_DelItem(v, w);
1928 Py_DECREF(v);
1929 Py_DECREF(w);
Benjamin Peterson14462d42015-08-19 20:38:39 -07001930 if (err == 0) DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001931 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001932 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001933
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001934 TARGET_NOARG(PRINT_EXPR)
1935 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001936 v = POP();
1937 w = PySys_GetObject("displayhook");
1938 if (w == NULL) {
1939 PyErr_SetString(PyExc_RuntimeError,
1940 "lost sys.displayhook");
1941 err = -1;
1942 x = NULL;
1943 }
1944 if (err == 0) {
1945 x = PyTuple_Pack(1, v);
1946 if (x == NULL)
1947 err = -1;
1948 }
1949 if (err == 0) {
1950 w = PyEval_CallObject(w, x);
1951 Py_XDECREF(w);
1952 if (w == NULL)
1953 err = -1;
1954 }
1955 Py_DECREF(v);
1956 Py_XDECREF(x);
1957 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001958 }
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001959
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001960 TARGET_NOARG(PRINT_ITEM_TO)
1961 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001962 w = stream = POP();
1963 /* fall through to PRINT_ITEM */
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001964 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001965
Benjamin Peterson2c992a02015-05-28 12:45:31 -05001966 TARGET_NOARG(PRINT_ITEM)
1967 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001968 v = POP();
1969 if (stream == NULL || stream == Py_None) {
1970 w = PySys_GetObject("stdout");
1971 if (w == NULL) {
1972 PyErr_SetString(PyExc_RuntimeError,
1973 "lost sys.stdout");
1974 err = -1;
1975 }
1976 }
1977 /* PyFile_SoftSpace() can exececute arbitrary code
1978 if sys.stdout is an instance with a __getattr__.
1979 If __getattr__ raises an exception, w will
1980 be freed, so we need to prevent that temporarily. */
1981 Py_XINCREF(w);
1982 if (w != NULL && PyFile_SoftSpace(w, 0))
1983 err = PyFile_WriteString(" ", w);
1984 if (err == 0)
1985 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
1986 if (err == 0) {
1987 /* XXX move into writeobject() ? */
1988 if (PyString_Check(v)) {
Stefan Krah7ff78252010-06-23 18:12:09 +00001989 char *s = PyString_AS_STRING(v);
1990 Py_ssize_t len = PyString_GET_SIZE(v);
1991 if (len == 0 ||
1992 !isspace(Py_CHARMASK(s[len-1])) ||
1993 s[len-1] == ' ')
1994 PyFile_SoftSpace(w, 1);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001995 }
Martin v. Löwis8d3ce5a2001-12-18 22:36:40 +00001996#ifdef Py_USING_UNICODE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001997 else if (PyUnicode_Check(v)) {
Stefan Krah7ff78252010-06-23 18:12:09 +00001998 Py_UNICODE *s = PyUnicode_AS_UNICODE(v);
1999 Py_ssize_t len = PyUnicode_GET_SIZE(v);
2000 if (len == 0 ||
2001 !Py_UNICODE_ISSPACE(s[len-1]) ||
2002 s[len-1] == ' ')
2003 PyFile_SoftSpace(w, 1);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002004 }
Michael W. Hudsond95c8282002-05-20 13:56:11 +00002005#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002006 else
Stefan Krah7ff78252010-06-23 18:12:09 +00002007 PyFile_SoftSpace(w, 1);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002008 }
2009 Py_XDECREF(w);
2010 Py_DECREF(v);
2011 Py_XDECREF(stream);
2012 stream = NULL;
Benjamin Peterson14462d42015-08-19 20:38:39 -07002013 if (err == 0) DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002014 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002015 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002016
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002017 TARGET_NOARG(PRINT_NEWLINE_TO)
2018 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002019 w = stream = POP();
2020 /* fall through to PRINT_NEWLINE */
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002021 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00002022
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002023 TARGET_NOARG(PRINT_NEWLINE)
2024 {
Benjamin Peterson14462d42015-08-19 20:38:39 -07002025 if (stream == NULL || stream == Py_None)
2026 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002027 w = PySys_GetObject("stdout");
2028 if (w == NULL) {
2029 PyErr_SetString(PyExc_RuntimeError,
2030 "lost sys.stdout");
2031 why = WHY_EXCEPTION;
2032 }
2033 }
2034 if (w != NULL) {
2035 /* w.write() may replace sys.stdout, so we
2036 * have to keep our reference to it */
2037 Py_INCREF(w);
2038 err = PyFile_WriteString("\n", w);
2039 if (err == 0)
2040 PyFile_SoftSpace(w, 0);
2041 Py_DECREF(w);
2042 }
2043 Py_XDECREF(stream);
2044 stream = NULL;
2045 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002046 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002047
2048#ifdef CASE_TOO_BIG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002049 default: switch (opcode) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002050#endif
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002051
2052 TARGET(RAISE_VARARGS)
Benjamin Peterson14462d42015-08-19 20:38:39 -07002053 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002054 u = v = w = NULL;
2055 switch (oparg) {
2056 case 3:
2057 u = POP(); /* traceback */
2058 /* Fallthrough */
2059 case 2:
2060 v = POP(); /* value */
2061 /* Fallthrough */
2062 case 1:
2063 w = POP(); /* exc */
2064 case 0: /* Fallthrough */
2065 why = do_raise(w, v, u);
2066 break;
2067 default:
2068 PyErr_SetString(PyExc_SystemError,
2069 "bad RAISE_VARARGS oparg");
2070 why = WHY_EXCEPTION;
2071 break;
2072 }
2073 break;
Benjamin Peterson14462d42015-08-19 20:38:39 -07002074 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002075
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002076 TARGET_NOARG(LOAD_LOCALS)
2077 {
Benjamin Peterson14462d42015-08-19 20:38:39 -07002078 if ((x = f->f_locals) != NULL)
2079 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002080 Py_INCREF(x);
2081 PUSH(x);
Benjamin Peterson14462d42015-08-19 20:38:39 -07002082 DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002083 }
2084 PyErr_SetString(PyExc_SystemError, "no locals");
2085 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002086 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002087
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002088 TARGET_NOARG(RETURN_VALUE)
2089 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002090 retval = POP();
2091 why = WHY_RETURN;
2092 goto fast_block_end;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002093 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002094
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002095 TARGET_NOARG(YIELD_VALUE)
2096 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002097 retval = POP();
2098 f->f_stacktop = stack_pointer;
2099 why = WHY_YIELD;
2100 goto fast_yield;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002101 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002102
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002103 TARGET_NOARG(EXEC_STMT)
2104 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002105 w = TOP();
2106 v = SECOND();
2107 u = THIRD();
2108 STACKADJ(-3);
2109 READ_TIMESTAMP(intr0);
2110 err = exec_statement(f, u, v, w);
2111 READ_TIMESTAMP(intr1);
2112 Py_DECREF(u);
2113 Py_DECREF(v);
2114 Py_DECREF(w);
2115 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002116 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002117
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002118 TARGET_NOARG(POP_BLOCK)
2119 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002120 {
2121 PyTryBlock *b = PyFrame_BlockPop(f);
2122 while (STACK_LEVEL() > b->b_level) {
2123 v = POP();
2124 Py_DECREF(v);
2125 }
2126 }
Benjamin Peterson14462d42015-08-19 20:38:39 -07002127 DISPATCH();
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002128 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002129
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002130 PREDICTED(END_FINALLY);
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002131 TARGET_NOARG(END_FINALLY)
2132 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002133 v = POP();
2134 if (PyInt_Check(v)) {
2135 why = (enum why_code) PyInt_AS_LONG(v);
2136 assert(why != WHY_YIELD);
2137 if (why == WHY_RETURN ||
2138 why == WHY_CONTINUE)
2139 retval = POP();
2140 }
2141 else if (PyExceptionClass_Check(v) ||
2142 PyString_Check(v)) {
2143 w = POP();
2144 u = POP();
2145 PyErr_Restore(v, w, u);
2146 why = WHY_RERAISE;
2147 break;
2148 }
2149 else if (v != Py_None) {
2150 PyErr_SetString(PyExc_SystemError,
2151 "'finally' pops bad exception");
2152 why = WHY_EXCEPTION;
2153 }
2154 Py_DECREF(v);
2155 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002156 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002157
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002158 TARGET_NOARG(BUILD_CLASS)
2159 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002160 u = TOP();
2161 v = SECOND();
2162 w = THIRD();
2163 STACKADJ(-2);
2164 x = build_class(u, v, w);
2165 SET_TOP(x);
2166 Py_DECREF(u);
2167 Py_DECREF(v);
2168 Py_DECREF(w);
2169 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002170 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002171
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002172 TARGET(STORE_NAME)
2173 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002174 w = GETITEM(names, oparg);
2175 v = POP();
2176 if ((x = f->f_locals) != NULL) {
2177 if (PyDict_CheckExact(x))
2178 err = PyDict_SetItem(x, w, v);
2179 else
2180 err = PyObject_SetItem(x, w, v);
2181 Py_DECREF(v);
Benjamin Peterson14462d42015-08-19 20:38:39 -07002182 if (err == 0) DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002183 break;
2184 }
Serhiy Storchakaa86c0912014-11-19 00:11:05 +02002185 t = PyObject_Repr(w);
2186 if (t == NULL)
2187 break;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002188 PyErr_Format(PyExc_SystemError,
2189 "no locals found when storing %s",
Serhiy Storchakaa86c0912014-11-19 00:11:05 +02002190 PyString_AS_STRING(t));
2191 Py_DECREF(t);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002192 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002193 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002194
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002195 TARGET(DELETE_NAME)
2196 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002197 w = GETITEM(names, oparg);
2198 if ((x = f->f_locals) != NULL) {
2199 if ((err = PyObject_DelItem(x, w)) != 0)
2200 format_exc_check_arg(PyExc_NameError,
2201 NAME_ERROR_MSG,
2202 w);
2203 break;
2204 }
Serhiy Storchakaa86c0912014-11-19 00:11:05 +02002205 t = PyObject_Repr(w);
2206 if (t == NULL)
2207 break;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002208 PyErr_Format(PyExc_SystemError,
2209 "no locals when deleting %s",
Serhiy Storchakaa86c0912014-11-19 00:11:05 +02002210 PyString_AS_STRING(w));
2211 Py_DECREF(t);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002212 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002213 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00002214
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002215 PREDICTED_WITH_ARG(UNPACK_SEQUENCE);
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002216 TARGET(UNPACK_SEQUENCE)
2217 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002218 v = POP();
2219 if (PyTuple_CheckExact(v) &&
2220 PyTuple_GET_SIZE(v) == oparg) {
2221 PyObject **items = \
2222 ((PyTupleObject *)v)->ob_item;
2223 while (oparg--) {
2224 w = items[oparg];
2225 Py_INCREF(w);
2226 PUSH(w);
2227 }
2228 Py_DECREF(v);
Benjamin Peterson14462d42015-08-19 20:38:39 -07002229 DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002230 } else if (PyList_CheckExact(v) &&
2231 PyList_GET_SIZE(v) == oparg) {
2232 PyObject **items = \
2233 ((PyListObject *)v)->ob_item;
2234 while (oparg--) {
2235 w = items[oparg];
2236 Py_INCREF(w);
2237 PUSH(w);
2238 }
2239 } else if (unpack_iterable(v, oparg,
2240 stack_pointer + oparg)) {
2241 STACKADJ(oparg);
2242 } else {
2243 /* unpack_iterable() raised an exception */
2244 why = WHY_EXCEPTION;
2245 }
2246 Py_DECREF(v);
2247 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002248 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002249
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002250
2251 TARGET(STORE_ATTR)
2252 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002253 w = GETITEM(names, oparg);
2254 v = TOP();
2255 u = SECOND();
2256 STACKADJ(-2);
2257 err = PyObject_SetAttr(v, w, u); /* v.w = u */
2258 Py_DECREF(v);
2259 Py_DECREF(u);
Benjamin Peterson14462d42015-08-19 20:38:39 -07002260 if (err == 0) DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002261 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002262 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002263
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002264 TARGET(DELETE_ATTR)
2265 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002266 w = GETITEM(names, oparg);
2267 v = POP();
2268 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
2269 /* del v.w */
2270 Py_DECREF(v);
2271 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002272 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002273
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002274
2275 TARGET(STORE_GLOBAL)
2276 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002277 w = GETITEM(names, oparg);
2278 v = POP();
2279 err = PyDict_SetItem(f->f_globals, w, v);
2280 Py_DECREF(v);
Benjamin Peterson14462d42015-08-19 20:38:39 -07002281 if (err == 0) DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002282 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002283 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002284
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002285 TARGET(DELETE_GLOBAL)
2286 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002287 w = GETITEM(names, oparg);
2288 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
2289 format_exc_check_arg(
2290 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
2291 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002292 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002293
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002294 TARGET(LOAD_NAME)
2295 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002296 w = GETITEM(names, oparg);
2297 if ((v = f->f_locals) == NULL) {
Serhiy Storchakaa86c0912014-11-19 00:11:05 +02002298 why = WHY_EXCEPTION;
2299 t = PyObject_Repr(w);
2300 if (t == NULL)
2301 break;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002302 PyErr_Format(PyExc_SystemError,
2303 "no locals when loading %s",
Serhiy Storchakaa86c0912014-11-19 00:11:05 +02002304 PyString_AS_STRING(w));
2305 Py_DECREF(t);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002306 break;
2307 }
2308 if (PyDict_CheckExact(v)) {
2309 x = PyDict_GetItem(v, w);
2310 Py_XINCREF(x);
2311 }
2312 else {
2313 x = PyObject_GetItem(v, w);
2314 if (x == NULL && PyErr_Occurred()) {
2315 if (!PyErr_ExceptionMatches(
2316 PyExc_KeyError))
2317 break;
2318 PyErr_Clear();
2319 }
2320 }
2321 if (x == NULL) {
2322 x = PyDict_GetItem(f->f_globals, w);
2323 if (x == NULL) {
2324 x = PyDict_GetItem(f->f_builtins, w);
2325 if (x == NULL) {
2326 format_exc_check_arg(
2327 PyExc_NameError,
2328 NAME_ERROR_MSG, w);
2329 break;
2330 }
2331 }
2332 Py_INCREF(x);
2333 }
2334 PUSH(x);
Benjamin Peterson14462d42015-08-19 20:38:39 -07002335 DISPATCH();
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002336 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002337
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002338 TARGET(LOAD_GLOBAL)
2339 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002340 w = GETITEM(names, oparg);
2341 if (PyString_CheckExact(w)) {
2342 /* Inline the PyDict_GetItem() calls.
2343 WARNING: this is an extreme speed hack.
2344 Do not try this at home. */
2345 long hash = ((PyStringObject *)w)->ob_shash;
2346 if (hash != -1) {
2347 PyDictObject *d;
2348 PyDictEntry *e;
2349 d = (PyDictObject *)(f->f_globals);
2350 e = d->ma_lookup(d, w, hash);
2351 if (e == NULL) {
2352 x = NULL;
2353 break;
2354 }
2355 x = e->me_value;
2356 if (x != NULL) {
2357 Py_INCREF(x);
2358 PUSH(x);
Benjamin Peterson14462d42015-08-19 20:38:39 -07002359 DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002360 }
2361 d = (PyDictObject *)(f->f_builtins);
2362 e = d->ma_lookup(d, w, hash);
2363 if (e == NULL) {
2364 x = NULL;
2365 break;
2366 }
2367 x = e->me_value;
2368 if (x != NULL) {
2369 Py_INCREF(x);
2370 PUSH(x);
Benjamin Peterson14462d42015-08-19 20:38:39 -07002371 DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002372 }
2373 goto load_global_error;
2374 }
2375 }
2376 /* This is the un-inlined version of the code above */
2377 x = PyDict_GetItem(f->f_globals, w);
2378 if (x == NULL) {
2379 x = PyDict_GetItem(f->f_builtins, w);
2380 if (x == NULL) {
2381 load_global_error:
2382 format_exc_check_arg(
2383 PyExc_NameError,
2384 GLOBAL_NAME_ERROR_MSG, w);
2385 break;
2386 }
2387 }
2388 Py_INCREF(x);
2389 PUSH(x);
Benjamin Peterson14462d42015-08-19 20:38:39 -07002390 DISPATCH();
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002391 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002392
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002393 TARGET(DELETE_FAST)
2394 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002395 x = GETLOCAL(oparg);
2396 if (x != NULL) {
2397 SETLOCAL(oparg, NULL);
Benjamin Peterson14462d42015-08-19 20:38:39 -07002398 DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002399 }
2400 format_exc_check_arg(
2401 PyExc_UnboundLocalError,
2402 UNBOUNDLOCAL_ERROR_MSG,
2403 PyTuple_GetItem(co->co_varnames, oparg)
2404 );
2405 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002406 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002407
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002408 TARGET(LOAD_CLOSURE)
2409 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002410 x = freevars[oparg];
2411 Py_INCREF(x);
2412 PUSH(x);
Benjamin Peterson14462d42015-08-19 20:38:39 -07002413 if (x != NULL) DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002414 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002415 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002416
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002417 TARGET(LOAD_DEREF)
2418 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002419 x = freevars[oparg];
2420 w = PyCell_Get(x);
2421 if (w != NULL) {
2422 PUSH(w);
Benjamin Peterson14462d42015-08-19 20:38:39 -07002423 DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002424 }
2425 err = -1;
2426 /* Don't stomp existing exception */
2427 if (PyErr_Occurred())
2428 break;
2429 if (oparg < PyTuple_GET_SIZE(co->co_cellvars)) {
2430 v = PyTuple_GET_ITEM(co->co_cellvars,
Stefan Krah7ff78252010-06-23 18:12:09 +00002431 oparg);
2432 format_exc_check_arg(
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002433 PyExc_UnboundLocalError,
2434 UNBOUNDLOCAL_ERROR_MSG,
2435 v);
2436 } else {
2437 v = PyTuple_GET_ITEM(co->co_freevars, oparg -
2438 PyTuple_GET_SIZE(co->co_cellvars));
2439 format_exc_check_arg(PyExc_NameError,
2440 UNBOUNDFREE_ERROR_MSG, v);
2441 }
2442 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002443 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002444
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002445 TARGET(STORE_DEREF)
2446 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002447 w = POP();
2448 x = freevars[oparg];
2449 PyCell_Set(x, w);
2450 Py_DECREF(w);
Benjamin Peterson14462d42015-08-19 20:38:39 -07002451 DISPATCH();
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002452 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002453
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002454 TARGET(BUILD_TUPLE)
2455 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002456 x = PyTuple_New(oparg);
2457 if (x != NULL) {
2458 for (; --oparg >= 0;) {
2459 w = POP();
2460 PyTuple_SET_ITEM(x, oparg, w);
2461 }
2462 PUSH(x);
Benjamin Peterson14462d42015-08-19 20:38:39 -07002463 DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002464 }
2465 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002466 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002467
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002468 TARGET(BUILD_LIST)
2469 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002470 x = PyList_New(oparg);
2471 if (x != NULL) {
2472 for (; --oparg >= 0;) {
2473 w = POP();
2474 PyList_SET_ITEM(x, oparg, w);
2475 }
2476 PUSH(x);
Benjamin Peterson14462d42015-08-19 20:38:39 -07002477 DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002478 }
2479 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002480 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002481
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002482 TARGET(BUILD_SET)
2483 {
Raymond Hettingere62a6942016-09-08 15:25:19 -07002484 int i;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002485 x = PySet_New(NULL);
2486 if (x != NULL) {
Raymond Hettingere62a6942016-09-08 15:25:19 -07002487 for (i = oparg; i > 0; i--) {
2488 w = PEEK(i);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002489 if (err == 0)
2490 err = PySet_Add(x, w);
2491 Py_DECREF(w);
2492 }
Raymond Hettingere62a6942016-09-08 15:25:19 -07002493 STACKADJ(-oparg);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002494 if (err != 0) {
2495 Py_DECREF(x);
2496 break;
2497 }
2498 PUSH(x);
Benjamin Peterson14462d42015-08-19 20:38:39 -07002499 DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002500 }
2501 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002502 }
Alexandre Vassalottiee936a22010-01-09 23:35:54 +00002503
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002504 TARGET(BUILD_MAP)
2505 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002506 x = _PyDict_NewPresized((Py_ssize_t)oparg);
2507 PUSH(x);
Benjamin Peterson14462d42015-08-19 20:38:39 -07002508 if (x != NULL) DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002509 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002510 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002511
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002512 TARGET_NOARG(STORE_MAP)
2513 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002514 w = TOP(); /* key */
2515 u = SECOND(); /* value */
2516 v = THIRD(); /* dict */
2517 STACKADJ(-2);
2518 assert (PyDict_CheckExact(v));
2519 err = PyDict_SetItem(v, w, u); /* v[w] = u */
2520 Py_DECREF(u);
2521 Py_DECREF(w);
Benjamin Peterson14462d42015-08-19 20:38:39 -07002522 if (err == 0) DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002523 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002524 }
Raymond Hettingereffde122007-12-18 18:26:18 +00002525
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002526 TARGET(MAP_ADD)
2527 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002528 w = TOP(); /* key */
2529 u = SECOND(); /* value */
2530 STACKADJ(-2);
2531 v = stack_pointer[-oparg]; /* dict */
2532 assert (PyDict_CheckExact(v));
2533 err = PyDict_SetItem(v, w, u); /* v[w] = u */
2534 Py_DECREF(u);
2535 Py_DECREF(w);
2536 if (err == 0) {
2537 PREDICT(JUMP_ABSOLUTE);
Benjamin Peterson14462d42015-08-19 20:38:39 -07002538 DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002539 }
2540 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002541 }
Alexandre Vassalottib6465472010-01-11 22:36:12 +00002542
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002543 TARGET(LOAD_ATTR)
2544 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002545 w = GETITEM(names, oparg);
2546 v = TOP();
2547 x = PyObject_GetAttr(v, w);
2548 Py_DECREF(v);
2549 SET_TOP(x);
Benjamin Peterson14462d42015-08-19 20:38:39 -07002550 if (x != NULL) DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002551 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002552 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002553
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002554 TARGET(COMPARE_OP)
2555 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002556 w = POP();
2557 v = TOP();
2558 if (PyInt_CheckExact(w) && PyInt_CheckExact(v)) {
2559 /* INLINE: cmp(int, int) */
2560 register long a, b;
2561 register int res;
2562 a = PyInt_AS_LONG(v);
2563 b = PyInt_AS_LONG(w);
2564 switch (oparg) {
2565 case PyCmp_LT: res = a < b; break;
2566 case PyCmp_LE: res = a <= b; break;
2567 case PyCmp_EQ: res = a == b; break;
2568 case PyCmp_NE: res = a != b; break;
2569 case PyCmp_GT: res = a > b; break;
2570 case PyCmp_GE: res = a >= b; break;
2571 case PyCmp_IS: res = v == w; break;
2572 case PyCmp_IS_NOT: res = v != w; break;
2573 default: goto slow_compare;
2574 }
2575 x = res ? Py_True : Py_False;
2576 Py_INCREF(x);
2577 }
2578 else {
2579 slow_compare:
2580 x = cmp_outcome(oparg, v, w);
2581 }
2582 Py_DECREF(v);
2583 Py_DECREF(w);
2584 SET_TOP(x);
2585 if (x == NULL) break;
2586 PREDICT(POP_JUMP_IF_FALSE);
2587 PREDICT(POP_JUMP_IF_TRUE);
Benjamin Peterson14462d42015-08-19 20:38:39 -07002588 DISPATCH();
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002589 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002590
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002591 TARGET(IMPORT_NAME)
2592 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002593 w = GETITEM(names, oparg);
2594 x = PyDict_GetItemString(f->f_builtins, "__import__");
2595 if (x == NULL) {
2596 PyErr_SetString(PyExc_ImportError,
2597 "__import__ not found");
2598 break;
2599 }
2600 Py_INCREF(x);
2601 v = POP();
2602 u = TOP();
2603 if (PyInt_AsLong(u) != -1 || PyErr_Occurred())
2604 w = PyTuple_Pack(5,
2605 w,
2606 f->f_globals,
2607 f->f_locals == NULL ?
2608 Py_None : f->f_locals,
2609 v,
2610 u);
2611 else
2612 w = PyTuple_Pack(4,
2613 w,
2614 f->f_globals,
2615 f->f_locals == NULL ?
2616 Py_None : f->f_locals,
2617 v);
2618 Py_DECREF(v);
2619 Py_DECREF(u);
2620 if (w == NULL) {
2621 u = POP();
2622 Py_DECREF(x);
2623 x = NULL;
2624 break;
2625 }
2626 READ_TIMESTAMP(intr0);
2627 v = x;
2628 x = PyEval_CallObject(v, w);
2629 Py_DECREF(v);
2630 READ_TIMESTAMP(intr1);
2631 Py_DECREF(w);
2632 SET_TOP(x);
Benjamin Peterson14462d42015-08-19 20:38:39 -07002633 if (x != NULL) DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002634 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002635 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002636
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002637 TARGET_NOARG(IMPORT_STAR)
2638 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002639 v = POP();
2640 PyFrame_FastToLocals(f);
2641 if ((x = f->f_locals) == NULL) {
2642 PyErr_SetString(PyExc_SystemError,
2643 "no locals found during 'import *'");
Serhiy Storchaka9fbb65e2017-03-08 13:44:33 +02002644 Py_DECREF(v);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002645 break;
2646 }
2647 READ_TIMESTAMP(intr0);
2648 err = import_all_from(x, v);
2649 READ_TIMESTAMP(intr1);
2650 PyFrame_LocalsToFast(f, 0);
2651 Py_DECREF(v);
Benjamin Peterson14462d42015-08-19 20:38:39 -07002652 if (err == 0) DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002653 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002654 }
Guido van Rossum25831651993-05-19 14:50:45 +00002655
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002656 TARGET(IMPORT_FROM)
2657 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002658 w = GETITEM(names, oparg);
2659 v = TOP();
2660 READ_TIMESTAMP(intr0);
2661 x = import_from(v, w);
2662 READ_TIMESTAMP(intr1);
2663 PUSH(x);
Benjamin Peterson14462d42015-08-19 20:38:39 -07002664 if (x != NULL) DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002665 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002666 }
Thomas Wouters52152252000-08-17 22:55:00 +00002667
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002668 TARGET(JUMP_FORWARD)
2669 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002670 JUMPBY(oparg);
Benjamin Peterson14462d42015-08-19 20:38:39 -07002671 FAST_DISPATCH();
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002672 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002673
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002674 PREDICTED_WITH_ARG(POP_JUMP_IF_FALSE);
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002675 TARGET(POP_JUMP_IF_FALSE)
2676 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002677 w = POP();
2678 if (w == Py_True) {
2679 Py_DECREF(w);
Benjamin Peterson14462d42015-08-19 20:38:39 -07002680 FAST_DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002681 }
2682 if (w == Py_False) {
2683 Py_DECREF(w);
2684 JUMPTO(oparg);
Benjamin Peterson14462d42015-08-19 20:38:39 -07002685 FAST_DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002686 }
2687 err = PyObject_IsTrue(w);
2688 Py_DECREF(w);
2689 if (err > 0)
2690 err = 0;
2691 else if (err == 0)
2692 JUMPTO(oparg);
2693 else
2694 break;
Benjamin Peterson14462d42015-08-19 20:38:39 -07002695 DISPATCH();
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002696 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002697
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002698 PREDICTED_WITH_ARG(POP_JUMP_IF_TRUE);
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002699 TARGET(POP_JUMP_IF_TRUE)
2700 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002701 w = POP();
2702 if (w == Py_False) {
2703 Py_DECREF(w);
Benjamin Peterson14462d42015-08-19 20:38:39 -07002704 FAST_DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002705 }
2706 if (w == Py_True) {
2707 Py_DECREF(w);
2708 JUMPTO(oparg);
Benjamin Peterson14462d42015-08-19 20:38:39 -07002709 FAST_DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002710 }
2711 err = PyObject_IsTrue(w);
2712 Py_DECREF(w);
2713 if (err > 0) {
2714 err = 0;
2715 JUMPTO(oparg);
2716 }
2717 else if (err == 0)
2718 ;
2719 else
2720 break;
Benjamin Peterson14462d42015-08-19 20:38:39 -07002721 DISPATCH();
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002722 }
Jeffrey Yasskin68d68522009-02-28 19:03:21 +00002723
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002724 TARGET(JUMP_IF_FALSE_OR_POP)
2725 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002726 w = TOP();
2727 if (w == Py_True) {
2728 STACKADJ(-1);
2729 Py_DECREF(w);
Benjamin Peterson14462d42015-08-19 20:38:39 -07002730 FAST_DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002731 }
2732 if (w == Py_False) {
2733 JUMPTO(oparg);
Benjamin Peterson14462d42015-08-19 20:38:39 -07002734 FAST_DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002735 }
2736 err = PyObject_IsTrue(w);
2737 if (err > 0) {
2738 STACKADJ(-1);
2739 Py_DECREF(w);
2740 err = 0;
2741 }
2742 else if (err == 0)
2743 JUMPTO(oparg);
2744 else
2745 break;
Benjamin Peterson14462d42015-08-19 20:38:39 -07002746 DISPATCH();
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002747 }
Jeffrey Yasskin68d68522009-02-28 19:03:21 +00002748
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002749 TARGET(JUMP_IF_TRUE_OR_POP)
2750 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002751 w = TOP();
2752 if (w == Py_False) {
2753 STACKADJ(-1);
2754 Py_DECREF(w);
Benjamin Peterson14462d42015-08-19 20:38:39 -07002755 FAST_DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002756 }
2757 if (w == Py_True) {
2758 JUMPTO(oparg);
Benjamin Peterson14462d42015-08-19 20:38:39 -07002759 FAST_DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002760 }
2761 err = PyObject_IsTrue(w);
2762 if (err > 0) {
2763 err = 0;
2764 JUMPTO(oparg);
2765 }
2766 else if (err == 0) {
2767 STACKADJ(-1);
2768 Py_DECREF(w);
2769 }
2770 else
2771 break;
Benjamin Peterson14462d42015-08-19 20:38:39 -07002772 DISPATCH();
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002773 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002774
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002775 PREDICTED_WITH_ARG(JUMP_ABSOLUTE);
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002776 TARGET(JUMP_ABSOLUTE)
2777 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002778 JUMPTO(oparg);
Raymond Hettingerdc1d1ba2007-11-07 02:45:46 +00002779#if FAST_LOOPS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002780 /* Enabling this path speeds-up all while and for-loops by bypassing
2781 the per-loop checks for signals. By default, this should be turned-off
2782 because it prevents detection of a control-break in tight loops like
2783 "while 1: pass". Compile with this option turned-on when you need
2784 the speed-up and do not need break checking inside tight loops (ones
2785 that contain only instructions ending with goto fast_next_opcode).
2786 */
2787 goto fast_next_opcode;
Raymond Hettingerdc1d1ba2007-11-07 02:45:46 +00002788#else
Benjamin Peterson14462d42015-08-19 20:38:39 -07002789 DISPATCH();
Raymond Hettingerdc1d1ba2007-11-07 02:45:46 +00002790#endif
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002791 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002792
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002793 TARGET_NOARG(GET_ITER)
2794 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002795 /* before: [obj]; after [getiter(obj)] */
2796 v = TOP();
2797 x = PyObject_GetIter(v);
2798 Py_DECREF(v);
2799 if (x != NULL) {
2800 SET_TOP(x);
2801 PREDICT(FOR_ITER);
Benjamin Peterson14462d42015-08-19 20:38:39 -07002802 DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002803 }
2804 STACKADJ(-1);
2805 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002806 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002807
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002808 PREDICTED_WITH_ARG(FOR_ITER);
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002809 TARGET(FOR_ITER)
2810 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002811 /* before: [iter]; after: [iter, iter()] *or* [] */
2812 v = TOP();
2813 x = (*v->ob_type->tp_iternext)(v);
2814 if (x != NULL) {
2815 PUSH(x);
2816 PREDICT(STORE_FAST);
2817 PREDICT(UNPACK_SEQUENCE);
Benjamin Peterson14462d42015-08-19 20:38:39 -07002818 DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002819 }
2820 if (PyErr_Occurred()) {
2821 if (!PyErr_ExceptionMatches(
2822 PyExc_StopIteration))
2823 break;
2824 PyErr_Clear();
2825 }
2826 /* iterator ended normally */
2827 x = v = POP();
2828 Py_DECREF(v);
2829 JUMPBY(oparg);
Benjamin Peterson14462d42015-08-19 20:38:39 -07002830 DISPATCH();
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002831 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002832
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002833 TARGET_NOARG(BREAK_LOOP)
2834 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002835 why = WHY_BREAK;
2836 goto fast_block_end;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002837 }
Raymond Hettinger2d783e92004-03-12 09:12:22 +00002838
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002839 TARGET(CONTINUE_LOOP)
2840 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002841 retval = PyInt_FromLong(oparg);
2842 if (!retval) {
2843 x = NULL;
2844 break;
2845 }
2846 why = WHY_CONTINUE;
2847 goto fast_block_end;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002848 }
Raymond Hettinger2d783e92004-03-12 09:12:22 +00002849
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002850 TARGET_WITH_IMPL(SETUP_LOOP, _setup_finally)
2851 TARGET_WITH_IMPL(SETUP_EXCEPT, _setup_finally)
Benjamin Peterson14462d42015-08-19 20:38:39 -07002852 TARGET(SETUP_FINALLY)
2853 _setup_finally:
2854 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002855 /* NOTE: If you add any new block-setup opcodes that
2856 are not try/except/finally handlers, you may need
2857 to update the PyGen_NeedsFinalizing() function.
2858 */
Phillip J. Eby2ba96612006-04-10 17:51:05 +00002859
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002860 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
2861 STACK_LEVEL());
Benjamin Peterson14462d42015-08-19 20:38:39 -07002862 DISPATCH();
2863 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002864
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002865
2866
2867 TARGET(SETUP_WITH)
2868 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002869 {
2870 static PyObject *exit, *enter;
2871 w = TOP();
2872 x = special_lookup(w, "__exit__", &exit);
2873 if (!x)
2874 break;
2875 SET_TOP(x);
2876 u = special_lookup(w, "__enter__", &enter);
2877 Py_DECREF(w);
2878 if (!u) {
2879 x = NULL;
2880 break;
2881 }
2882 x = PyObject_CallFunctionObjArgs(u, NULL);
2883 Py_DECREF(u);
2884 if (!x)
2885 break;
2886 /* Setup a finally block (SETUP_WITH as a block is
2887 equivalent to SETUP_FINALLY except it normalizes
2888 the exception) before pushing the result of
2889 __enter__ on the stack. */
2890 PyFrame_BlockSetup(f, SETUP_WITH, INSTR_OFFSET() + oparg,
2891 STACK_LEVEL());
Benjamin Peterson1880d8b2009-05-25 13:13:44 +00002892
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002893 PUSH(x);
Benjamin Peterson14462d42015-08-19 20:38:39 -07002894 DISPATCH();
2895 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002896 }
Benjamin Peterson1880d8b2009-05-25 13:13:44 +00002897
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002898 TARGET_NOARG(WITH_CLEANUP)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002899 {
2900 /* At the top of the stack are 1-3 values indicating
2901 how/why we entered the finally clause:
2902 - TOP = None
2903 - (TOP, SECOND) = (WHY_{RETURN,CONTINUE}), retval
2904 - TOP = WHY_*; no retval below it
2905 - (TOP, SECOND, THIRD) = exc_info()
2906 Below them is EXIT, the context.__exit__ bound method.
2907 In the last case, we must call
2908 EXIT(TOP, SECOND, THIRD)
2909 otherwise we must call
2910 EXIT(None, None, None)
Nick Coghlan7af53be2008-03-07 14:13:28 +00002911
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002912 In all cases, we remove EXIT from the stack, leaving
2913 the rest in the same order.
Guido van Rossum1a5e21e2006-02-28 21:57:43 +00002914
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002915 In addition, if the stack represents an exception,
2916 *and* the function call returns a 'true' value, we
2917 "zap" this information, to prevent END_FINALLY from
2918 re-raising the exception. (But non-local gotos
2919 should still be resumed.)
2920 */
Tim Peters7df5e7f2006-05-26 23:14:37 +00002921
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002922 PyObject *exit_func;
Nick Coghlan7af53be2008-03-07 14:13:28 +00002923
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002924 u = POP();
2925 if (u == Py_None) {
2926 exit_func = TOP();
2927 SET_TOP(u);
2928 v = w = Py_None;
2929 }
2930 else if (PyInt_Check(u)) {
2931 switch(PyInt_AS_LONG(u)) {
2932 case WHY_RETURN:
2933 case WHY_CONTINUE:
2934 /* Retval in TOP. */
2935 exit_func = SECOND();
2936 SET_SECOND(TOP());
2937 SET_TOP(u);
2938 break;
2939 default:
2940 exit_func = TOP();
2941 SET_TOP(u);
2942 break;
2943 }
2944 u = v = w = Py_None;
2945 }
2946 else {
2947 v = TOP();
2948 w = SECOND();
2949 exit_func = THIRD();
2950 SET_TOP(u);
2951 SET_SECOND(v);
2952 SET_THIRD(w);
2953 }
2954 /* XXX Not the fastest way to call it... */
2955 x = PyObject_CallFunctionObjArgs(exit_func, u, v, w,
2956 NULL);
2957 Py_DECREF(exit_func);
2958 if (x == NULL)
2959 break; /* Go to error exit */
Amaury Forgeot d'Arcad9b5992008-12-10 23:22:49 +00002960
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002961 if (u != Py_None)
2962 err = PyObject_IsTrue(x);
2963 else
2964 err = 0;
2965 Py_DECREF(x);
Amaury Forgeot d'Arcad9b5992008-12-10 23:22:49 +00002966
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002967 if (err < 0)
2968 break; /* Go to error exit */
2969 else if (err > 0) {
2970 err = 0;
2971 /* There was an exception and a true return */
2972 STACKADJ(-2);
2973 Py_INCREF(Py_None);
2974 SET_TOP(Py_None);
2975 Py_DECREF(u);
2976 Py_DECREF(v);
2977 Py_DECREF(w);
2978 } else {
2979 /* The stack was rearranged to remove EXIT
2980 above. Let END_FINALLY do its thing */
2981 }
2982 PREDICT(END_FINALLY);
2983 break;
2984 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00002985
Benjamin Peterson2c992a02015-05-28 12:45:31 -05002986 TARGET(CALL_FUNCTION)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002987 {
2988 PyObject **sp;
2989 PCALL(PCALL_ALL);
2990 sp = stack_pointer;
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00002991#ifdef WITH_TSC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002992 x = call_function(&sp, oparg, &intr0, &intr1);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00002993#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002994 x = call_function(&sp, oparg);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00002995#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002996 stack_pointer = sp;
2997 PUSH(x);
Benjamin Peterson14462d42015-08-19 20:38:39 -07002998 if (x != NULL) DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002999 break;
3000 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003001
Benjamin Peterson2c992a02015-05-28 12:45:31 -05003002 TARGET_WITH_IMPL(CALL_FUNCTION_VAR, _call_function_var_kw)
3003 TARGET_WITH_IMPL(CALL_FUNCTION_KW, _call_function_var_kw)
Benjamin Peterson14462d42015-08-19 20:38:39 -07003004 TARGET(CALL_FUNCTION_VAR_KW)
3005 _call_function_var_kw:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003006 {
3007 int na = oparg & 0xff;
3008 int nk = (oparg>>8) & 0xff;
3009 int flags = (opcode - CALL_FUNCTION) & 3;
3010 int n = na + 2 * nk;
3011 PyObject **pfunc, *func, **sp;
3012 PCALL(PCALL_ALL);
3013 if (flags & CALL_FLAG_VAR)
3014 n++;
3015 if (flags & CALL_FLAG_KW)
3016 n++;
3017 pfunc = stack_pointer - n - 1;
3018 func = *pfunc;
Jeremy Hylton52820442001-01-03 23:52:36 +00003019
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003020 if (PyMethod_Check(func)
Stefan Krah7ff78252010-06-23 18:12:09 +00003021 && PyMethod_GET_SELF(func) != NULL) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003022 PyObject *self = PyMethod_GET_SELF(func);
3023 Py_INCREF(self);
3024 func = PyMethod_GET_FUNCTION(func);
3025 Py_INCREF(func);
3026 Py_DECREF(*pfunc);
3027 *pfunc = self;
3028 na++;
3029 } else
3030 Py_INCREF(func);
3031 sp = stack_pointer;
3032 READ_TIMESTAMP(intr0);
3033 x = ext_do_call(func, &sp, flags, na, nk);
3034 READ_TIMESTAMP(intr1);
3035 stack_pointer = sp;
3036 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003037
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003038 while (stack_pointer > pfunc) {
3039 w = POP();
3040 Py_DECREF(w);
3041 }
3042 PUSH(x);
Benjamin Peterson14462d42015-08-19 20:38:39 -07003043 if (x != NULL) DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003044 break;
3045 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003046
Benjamin Peterson2c992a02015-05-28 12:45:31 -05003047
3048 TARGET(MAKE_FUNCTION)
3049 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003050 v = POP(); /* code object */
3051 x = PyFunction_New(v, f->f_globals);
3052 Py_DECREF(v);
3053 /* XXX Maybe this should be a separate opcode? */
3054 if (x != NULL && oparg > 0) {
3055 v = PyTuple_New(oparg);
3056 if (v == NULL) {
3057 Py_DECREF(x);
3058 x = NULL;
3059 break;
3060 }
3061 while (--oparg >= 0) {
3062 w = POP();
3063 PyTuple_SET_ITEM(v, oparg, w);
3064 }
3065 err = PyFunction_SetDefaults(x, v);
3066 Py_DECREF(v);
3067 }
3068 PUSH(x);
3069 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05003070 }
Guido van Rossum8861b741996-07-30 16:49:37 +00003071
Benjamin Peterson2c992a02015-05-28 12:45:31 -05003072 TARGET(MAKE_CLOSURE)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003073 {
3074 v = POP(); /* code object */
3075 x = PyFunction_New(v, f->f_globals);
3076 Py_DECREF(v);
3077 if (x != NULL) {
3078 v = POP();
3079 if (PyFunction_SetClosure(x, v) != 0) {
3080 /* Can't happen unless bytecode is corrupt. */
3081 why = WHY_EXCEPTION;
3082 }
3083 Py_DECREF(v);
3084 }
3085 if (x != NULL && oparg > 0) {
3086 v = PyTuple_New(oparg);
3087 if (v == NULL) {
3088 Py_DECREF(x);
3089 x = NULL;
3090 break;
3091 }
3092 while (--oparg >= 0) {
3093 w = POP();
3094 PyTuple_SET_ITEM(v, oparg, w);
3095 }
3096 if (PyFunction_SetDefaults(x, v) != 0) {
3097 /* Can't happen unless
3098 PyFunction_SetDefaults changes. */
3099 why = WHY_EXCEPTION;
3100 }
3101 Py_DECREF(v);
3102 }
3103 PUSH(x);
3104 break;
3105 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003106
Benjamin Peterson2c992a02015-05-28 12:45:31 -05003107 TARGET(BUILD_SLICE)
3108 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003109 if (oparg == 3)
3110 w = POP();
3111 else
3112 w = NULL;
3113 v = POP();
3114 u = TOP();
3115 x = PySlice_New(u, v, w);
3116 Py_DECREF(u);
3117 Py_DECREF(v);
3118 Py_XDECREF(w);
3119 SET_TOP(x);
Benjamin Peterson14462d42015-08-19 20:38:39 -07003120 if (x != NULL) DISPATCH();
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003121 break;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05003122 }
Guido van Rossum8861b741996-07-30 16:49:37 +00003123
Benjamin Peterson2c992a02015-05-28 12:45:31 -05003124 TARGET(EXTENDED_ARG)
3125 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003126 opcode = NEXTOP();
3127 oparg = oparg<<16 | NEXTARG();
3128 goto dispatch_opcode;
Benjamin Peterson2c992a02015-05-28 12:45:31 -05003129 }
Guido van Rossum8861b741996-07-30 16:49:37 +00003130
Benjamin Peterson2c992a02015-05-28 12:45:31 -05003131#if USE_COMPUTED_GOTOS
3132 _unknown_opcode:
3133#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003134 default:
3135 fprintf(stderr,
3136 "XXX lineno: %d, opcode: %d\n",
3137 PyFrame_GetLineNumber(f),
3138 opcode);
3139 PyErr_SetString(PyExc_SystemError, "unknown opcode");
3140 why = WHY_EXCEPTION;
3141 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00003142
3143#ifdef CASE_TOO_BIG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003144 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00003145#endif
3146
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003147 } /* switch */
Guido van Rossum374a9221991-04-04 10:40:29 +00003148
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003149 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00003150
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003151 READ_TIMESTAMP(inst1);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00003152
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003153 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00003154
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003155 if (why == WHY_NOT) {
3156 if (err == 0 && x != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003157#ifdef CHECKEXC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003158 /* This check is expensive! */
3159 if (PyErr_Occurred())
3160 fprintf(stderr,
3161 "XXX undetected error\n");
3162 else {
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00003163#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003164 READ_TIMESTAMP(loop1);
3165 continue; /* Normal, fast path */
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00003166#ifdef CHECKEXC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003167 }
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00003168#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003169 }
3170 why = WHY_EXCEPTION;
3171 x = Py_None;
3172 err = 0;
3173 }
Guido van Rossum374a9221991-04-04 10:40:29 +00003174
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003175 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00003176
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003177 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
3178 if (!PyErr_Occurred()) {
3179 PyErr_SetString(PyExc_SystemError,
3180 "error return without exception set");
3181 why = WHY_EXCEPTION;
3182 }
3183 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00003184#ifdef CHECKEXC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003185 else {
3186 /* This check is expensive! */
3187 if (PyErr_Occurred()) {
3188 char buf[128];
3189 sprintf(buf, "Stack unwind with exception "
3190 "set and why=%d", why);
3191 Py_FatalError(buf);
3192 }
3193 }
Guido van Rossum374a9221991-04-04 10:40:29 +00003194#endif
3195
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003196 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00003197
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003198 if (why == WHY_EXCEPTION) {
3199 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00003200
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003201 if (tstate->c_tracefunc != NULL)
3202 call_exc_trace(tstate->c_tracefunc,
3203 tstate->c_traceobj, f);
3204 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003205
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003206 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00003207
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003208 if (why == WHY_RERAISE)
3209 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00003210
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003211 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00003212
Raymond Hettinger1dd83092004-02-06 18:32:33 +00003213fast_block_end:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003214 while (why != WHY_NOT && f->f_iblock > 0) {
3215 /* Peek at the current block. */
3216 PyTryBlock *b = &f->f_blockstack[f->f_iblock - 1];
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003217
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003218 assert(why != WHY_YIELD);
3219 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
3220 why = WHY_NOT;
3221 JUMPTO(PyInt_AS_LONG(retval));
3222 Py_DECREF(retval);
3223 break;
3224 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003225
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003226 /* Now we have to pop the block. */
3227 f->f_iblock--;
Benjamin Peterson4a3cf192009-07-01 23:45:19 +00003228
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003229 while (STACK_LEVEL() > b->b_level) {
3230 v = POP();
3231 Py_XDECREF(v);
3232 }
3233 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
3234 why = WHY_NOT;
3235 JUMPTO(b->b_handler);
3236 break;
3237 }
3238 if (b->b_type == SETUP_FINALLY ||
3239 (b->b_type == SETUP_EXCEPT &&
3240 why == WHY_EXCEPTION) ||
3241 b->b_type == SETUP_WITH) {
3242 if (why == WHY_EXCEPTION) {
3243 PyObject *exc, *val, *tb;
3244 PyErr_Fetch(&exc, &val, &tb);
3245 if (val == NULL) {
3246 val = Py_None;
3247 Py_INCREF(val);
3248 }
3249 /* Make the raw exception data
3250 available to the handler,
3251 so a program can emulate the
3252 Python main loop. Don't do
3253 this for 'finally'. */
3254 if (b->b_type == SETUP_EXCEPT ||
3255 b->b_type == SETUP_WITH) {
3256 PyErr_NormalizeException(
3257 &exc, &val, &tb);
3258 set_exc_info(tstate,
3259 exc, val, tb);
3260 }
3261 if (tb == NULL) {
3262 Py_INCREF(Py_None);
3263 PUSH(Py_None);
3264 } else
3265 PUSH(tb);
3266 PUSH(val);
3267 PUSH(exc);
3268 }
3269 else {
3270 if (why & (WHY_RETURN | WHY_CONTINUE))
3271 PUSH(retval);
3272 v = PyInt_FromLong((long)why);
3273 PUSH(v);
3274 }
3275 why = WHY_NOT;
3276 JUMPTO(b->b_handler);
3277 break;
3278 }
3279 } /* unwind stack */
Guido van Rossum374a9221991-04-04 10:40:29 +00003280
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003281 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00003282
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003283 if (why != WHY_NOT)
3284 break;
3285 READ_TIMESTAMP(loop1);
Guido van Rossumac7be682001-01-17 15:42:30 +00003286
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003287 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00003288
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003289 assert(why != WHY_YIELD);
3290 /* Pop remaining stack entries. */
3291 while (!EMPTY()) {
3292 v = POP();
3293 Py_XDECREF(v);
3294 }
Guido van Rossum35974fb2001-12-06 21:28:18 +00003295
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003296 if (why != WHY_RETURN)
3297 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00003298
Raymond Hettinger1dd83092004-02-06 18:32:33 +00003299fast_yield:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003300 if (tstate->use_tracing) {
3301 if (tstate->c_tracefunc) {
3302 if (why == WHY_RETURN || why == WHY_YIELD) {
3303 if (call_trace(tstate->c_tracefunc,
3304 tstate->c_traceobj, f,
3305 PyTrace_RETURN, retval)) {
3306 Py_XDECREF(retval);
3307 retval = NULL;
3308 why = WHY_EXCEPTION;
3309 }
3310 }
3311 else if (why == WHY_EXCEPTION) {
3312 call_trace_protected(tstate->c_tracefunc,
3313 tstate->c_traceobj, f,
3314 PyTrace_RETURN, NULL);
3315 }
3316 }
3317 if (tstate->c_profilefunc) {
3318 if (why == WHY_EXCEPTION)
3319 call_trace_protected(tstate->c_profilefunc,
3320 tstate->c_profileobj, f,
3321 PyTrace_RETURN, NULL);
3322 else if (call_trace(tstate->c_profilefunc,
3323 tstate->c_profileobj, f,
3324 PyTrace_RETURN, retval)) {
3325 Py_XDECREF(retval);
3326 retval = NULL;
3327 why = WHY_EXCEPTION;
3328 }
3329 }
3330 }
Guido van Rossuma4240131997-01-21 21:18:36 +00003331
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003332 if (tstate->frame->f_exc_type != NULL)
3333 reset_exc_info(tstate);
3334 else {
3335 assert(tstate->frame->f_exc_value == NULL);
3336 assert(tstate->frame->f_exc_traceback == NULL);
3337 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003338
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003339 /* pop frame */
Thomas Woutersae406c62007-09-19 17:27:43 +00003340exit_eval_frame:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003341 Py_LeaveRecursiveCall();
3342 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00003343
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003344 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00003345}
3346
Guido van Rossumc2e20742006-02-27 22:32:47 +00003347/* This is gonna seem *real weird*, but if you put some other code between
Martin v. Löwis8d97e332004-06-27 15:43:12 +00003348 PyEval_EvalFrame() and PyEval_EvalCodeEx() you will need to adjust
Guido van Rossumc2e20742006-02-27 22:32:47 +00003349 the test in the if statements in Misc/gdbinit (pystack and pystackv). */
Skip Montanaro786ea6b2004-03-01 15:44:05 +00003350
Tim Peters6d6c1a32001-08-02 04:15:00 +00003351PyObject *
3352PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003353 PyObject **args, int argcount, PyObject **kws, int kwcount,
3354 PyObject **defs, int defcount, PyObject *closure)
Tim Peters5ca576e2001-06-18 22:08:13 +00003355{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003356 register PyFrameObject *f;
3357 register PyObject *retval = NULL;
3358 register PyObject **fastlocals, **freevars;
3359 PyThreadState *tstate = PyThreadState_GET();
3360 PyObject *x, *u;
Tim Peters5ca576e2001-06-18 22:08:13 +00003361
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003362 if (globals == NULL) {
3363 PyErr_SetString(PyExc_SystemError,
3364 "PyEval_EvalCodeEx: NULL globals");
3365 return NULL;
3366 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003367
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003368 assert(tstate != NULL);
3369 assert(globals != NULL);
3370 f = PyFrame_New(tstate, co, globals, locals);
3371 if (f == NULL)
3372 return NULL;
Tim Peters5ca576e2001-06-18 22:08:13 +00003373
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003374 fastlocals = f->f_localsplus;
3375 freevars = f->f_localsplus + co->co_nlocals;
Tim Peters5ca576e2001-06-18 22:08:13 +00003376
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003377 if (co->co_argcount > 0 ||
3378 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
3379 int i;
3380 int n = argcount;
3381 PyObject *kwdict = NULL;
3382 if (co->co_flags & CO_VARKEYWORDS) {
3383 kwdict = PyDict_New();
3384 if (kwdict == NULL)
3385 goto fail;
3386 i = co->co_argcount;
3387 if (co->co_flags & CO_VARARGS)
3388 i++;
3389 SETLOCAL(i, kwdict);
3390 }
3391 if (argcount > co->co_argcount) {
3392 if (!(co->co_flags & CO_VARARGS)) {
3393 PyErr_Format(PyExc_TypeError,
3394 "%.200s() takes %s %d "
3395 "argument%s (%d given)",
3396 PyString_AsString(co->co_name),
3397 defcount ? "at most" : "exactly",
3398 co->co_argcount,
3399 co->co_argcount == 1 ? "" : "s",
Benjamin Petersonda4faba2010-09-25 03:27:12 +00003400 argcount + kwcount);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003401 goto fail;
3402 }
3403 n = co->co_argcount;
3404 }
3405 for (i = 0; i < n; i++) {
3406 x = args[i];
3407 Py_INCREF(x);
3408 SETLOCAL(i, x);
3409 }
3410 if (co->co_flags & CO_VARARGS) {
3411 u = PyTuple_New(argcount - n);
3412 if (u == NULL)
3413 goto fail;
3414 SETLOCAL(co->co_argcount, u);
3415 for (i = n; i < argcount; i++) {
3416 x = args[i];
3417 Py_INCREF(x);
3418 PyTuple_SET_ITEM(u, i-n, x);
3419 }
3420 }
3421 for (i = 0; i < kwcount; i++) {
3422 PyObject **co_varnames;
3423 PyObject *keyword = kws[2*i];
3424 PyObject *value = kws[2*i + 1];
3425 int j;
3426 if (keyword == NULL || !(PyString_Check(keyword)
Benjamin Peterson78821dd2009-01-25 17:15:10 +00003427#ifdef Py_USING_UNICODE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003428 || PyUnicode_Check(keyword)
Benjamin Peterson78821dd2009-01-25 17:15:10 +00003429#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003430 )) {
3431 PyErr_Format(PyExc_TypeError,
3432 "%.200s() keywords must be strings",
3433 PyString_AsString(co->co_name));
3434 goto fail;
3435 }
3436 /* Speed hack: do raw pointer compares. As names are
3437 normally interned this should almost always hit. */
3438 co_varnames = ((PyTupleObject *)(co->co_varnames))->ob_item;
3439 for (j = 0; j < co->co_argcount; j++) {
3440 PyObject *nm = co_varnames[j];
3441 if (nm == keyword)
3442 goto kw_found;
3443 }
3444 /* Slow fallback, just in case */
3445 for (j = 0; j < co->co_argcount; j++) {
3446 PyObject *nm = co_varnames[j];
3447 int cmp = PyObject_RichCompareBool(
3448 keyword, nm, Py_EQ);
3449 if (cmp > 0)
3450 goto kw_found;
3451 else if (cmp < 0)
3452 goto fail;
3453 }
3454 if (kwdict == NULL) {
3455 PyObject *kwd_str = kwd_as_string(keyword);
3456 if (kwd_str) {
3457 PyErr_Format(PyExc_TypeError,
3458 "%.200s() got an unexpected "
3459 "keyword argument '%.400s'",
3460 PyString_AsString(co->co_name),
3461 PyString_AsString(kwd_str));
3462 Py_DECREF(kwd_str);
3463 }
3464 goto fail;
3465 }
3466 PyDict_SetItem(kwdict, keyword, value);
3467 continue;
3468 kw_found:
3469 if (GETLOCAL(j) != NULL) {
3470 PyObject *kwd_str = kwd_as_string(keyword);
3471 if (kwd_str) {
3472 PyErr_Format(PyExc_TypeError,
3473 "%.200s() got multiple "
3474 "values for keyword "
3475 "argument '%.400s'",
3476 PyString_AsString(co->co_name),
3477 PyString_AsString(kwd_str));
3478 Py_DECREF(kwd_str);
3479 }
3480 goto fail;
3481 }
3482 Py_INCREF(value);
3483 SETLOCAL(j, value);
3484 }
3485 if (argcount < co->co_argcount) {
3486 int m = co->co_argcount - defcount;
3487 for (i = argcount; i < m; i++) {
3488 if (GETLOCAL(i) == NULL) {
3489 int j, given = 0;
3490 for (j = 0; j < co->co_argcount; j++)
3491 if (GETLOCAL(j))
3492 given++;
3493 PyErr_Format(PyExc_TypeError,
3494 "%.200s() takes %s %d "
3495 "argument%s (%d given)",
3496 PyString_AsString(co->co_name),
3497 ((co->co_flags & CO_VARARGS) ||
3498 defcount) ? "at least"
3499 : "exactly",
3500 m, m == 1 ? "" : "s", given);
3501 goto fail;
3502 }
3503 }
3504 if (n > m)
3505 i = n - m;
3506 else
3507 i = 0;
3508 for (; i < defcount; i++) {
3509 if (GETLOCAL(m+i) == NULL) {
3510 PyObject *def = defs[i];
3511 Py_INCREF(def);
3512 SETLOCAL(m+i, def);
3513 }
3514 }
3515 }
3516 }
3517 else if (argcount > 0 || kwcount > 0) {
3518 PyErr_Format(PyExc_TypeError,
3519 "%.200s() takes no arguments (%d given)",
3520 PyString_AsString(co->co_name),
3521 argcount + kwcount);
3522 goto fail;
3523 }
3524 /* Allocate and initialize storage for cell vars, and copy free
3525 vars into frame. This isn't too efficient right now. */
3526 if (PyTuple_GET_SIZE(co->co_cellvars)) {
3527 int i, j, nargs, found;
3528 char *cellname, *argname;
3529 PyObject *c;
Tim Peters5ca576e2001-06-18 22:08:13 +00003530
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003531 nargs = co->co_argcount;
3532 if (co->co_flags & CO_VARARGS)
3533 nargs++;
3534 if (co->co_flags & CO_VARKEYWORDS)
3535 nargs++;
Tim Peters5ca576e2001-06-18 22:08:13 +00003536
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003537 /* Initialize each cell var, taking into account
3538 cell vars that are initialized from arguments.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003539
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003540 Should arrange for the compiler to put cellvars
3541 that are arguments at the beginning of the cellvars
3542 list so that we can march over it more efficiently?
3543 */
3544 for (i = 0; i < PyTuple_GET_SIZE(co->co_cellvars); ++i) {
3545 cellname = PyString_AS_STRING(
3546 PyTuple_GET_ITEM(co->co_cellvars, i));
3547 found = 0;
3548 for (j = 0; j < nargs; j++) {
3549 argname = PyString_AS_STRING(
3550 PyTuple_GET_ITEM(co->co_varnames, j));
3551 if (strcmp(cellname, argname) == 0) {
3552 c = PyCell_New(GETLOCAL(j));
3553 if (c == NULL)
3554 goto fail;
3555 GETLOCAL(co->co_nlocals + i) = c;
3556 found = 1;
3557 break;
3558 }
3559 }
3560 if (found == 0) {
3561 c = PyCell_New(NULL);
3562 if (c == NULL)
3563 goto fail;
3564 SETLOCAL(co->co_nlocals + i, c);
3565 }
3566 }
3567 }
3568 if (PyTuple_GET_SIZE(co->co_freevars)) {
3569 int i;
3570 for (i = 0; i < PyTuple_GET_SIZE(co->co_freevars); ++i) {
3571 PyObject *o = PyTuple_GET_ITEM(closure, i);
3572 Py_INCREF(o);
3573 freevars[PyTuple_GET_SIZE(co->co_cellvars) + i] = o;
3574 }
3575 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003576
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003577 if (co->co_flags & CO_GENERATOR) {
3578 /* Don't need to keep the reference to f_back, it will be set
3579 * when the generator is resumed. */
Serhiy Storchaka98a97222014-02-09 13:14:04 +02003580 Py_CLEAR(f->f_back);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00003581
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003582 PCALL(PCALL_GENERATOR);
Jeremy Hylton985eba52003-02-05 23:13:00 +00003583
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003584 /* Create a new generator that owns the ready to run frame
3585 * and return that as the value. */
3586 return PyGen_New(f);
3587 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003588
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003589 retval = PyEval_EvalFrameEx(f,0);
Tim Peters5ca576e2001-06-18 22:08:13 +00003590
Thomas Woutersae406c62007-09-19 17:27:43 +00003591fail: /* Jump here from prelude on failure */
Tim Peters5ca576e2001-06-18 22:08:13 +00003592
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003593 /* decref'ing the frame can cause __del__ methods to get invoked,
3594 which can call back into Python. While we're done with the
3595 current Python frame (f), the associated C stack is still in use,
3596 so recursion_depth must be boosted for the duration.
3597 */
3598 assert(tstate != NULL);
3599 ++tstate->recursion_depth;
3600 Py_DECREF(f);
3601 --tstate->recursion_depth;
3602 return retval;
Tim Peters5ca576e2001-06-18 22:08:13 +00003603}
3604
3605
Benjamin Peterson1880d8b2009-05-25 13:13:44 +00003606static PyObject *
3607special_lookup(PyObject *o, char *meth, PyObject **cache)
3608{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003609 PyObject *res;
3610 if (PyInstance_Check(o)) {
3611 if (!*cache)
3612 return PyObject_GetAttrString(o, meth);
3613 else
3614 return PyObject_GetAttr(o, *cache);
3615 }
3616 res = _PyObject_LookupSpecial(o, meth, cache);
3617 if (res == NULL && !PyErr_Occurred()) {
3618 PyErr_SetObject(PyExc_AttributeError, *cache);
3619 return NULL;
3620 }
3621 return res;
Benjamin Peterson1880d8b2009-05-25 13:13:44 +00003622}
3623
Benjamin Peterson78821dd2009-01-25 17:15:10 +00003624
Benjamin Petersone18ef192009-01-20 14:21:16 +00003625static PyObject *
3626kwd_as_string(PyObject *kwd) {
Benjamin Peterson78821dd2009-01-25 17:15:10 +00003627#ifdef Py_USING_UNICODE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003628 if (PyString_Check(kwd)) {
Benjamin Peterson78821dd2009-01-25 17:15:10 +00003629#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003630 assert(PyString_Check(kwd));
Benjamin Peterson78821dd2009-01-25 17:15:10 +00003631#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003632 Py_INCREF(kwd);
3633 return kwd;
Benjamin Peterson78821dd2009-01-25 17:15:10 +00003634#ifdef Py_USING_UNICODE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003635 }
3636 return _PyUnicode_AsDefaultEncodedString(kwd, "replace");
Benjamin Peterson78821dd2009-01-25 17:15:10 +00003637#endif
Benjamin Petersone18ef192009-01-20 14:21:16 +00003638}
3639
3640
Guido van Rossumc9fbb722003-03-01 03:36:33 +00003641/* Implementation notes for set_exc_info() and reset_exc_info():
3642
3643- Below, 'exc_ZZZ' stands for 'exc_type', 'exc_value' and
3644 'exc_traceback'. These always travel together.
3645
3646- tstate->curexc_ZZZ is the "hot" exception that is set by
3647 PyErr_SetString(), cleared by PyErr_Clear(), and so on.
3648
3649- Once an exception is caught by an except clause, it is transferred
3650 from tstate->curexc_ZZZ to tstate->exc_ZZZ, from which sys.exc_info()
3651 can pick it up. This is the primary task of set_exc_info().
Tim Peters7df5e7f2006-05-26 23:14:37 +00003652 XXX That can't be right: set_exc_info() doesn't look at tstate->curexc_ZZZ.
Guido van Rossumc9fbb722003-03-01 03:36:33 +00003653
3654- Now let me explain the complicated dance with frame->f_exc_ZZZ.
3655
3656 Long ago, when none of this existed, there were just a few globals:
3657 one set corresponding to the "hot" exception, and one set
3658 corresponding to sys.exc_ZZZ. (Actually, the latter weren't C
3659 globals; they were simply stored as sys.exc_ZZZ. For backwards
3660 compatibility, they still are!) The problem was that in code like
3661 this:
3662
3663 try:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003664 "something that may fail"
Guido van Rossumc9fbb722003-03-01 03:36:33 +00003665 except "some exception":
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003666 "do something else first"
3667 "print the exception from sys.exc_ZZZ."
Guido van Rossumc9fbb722003-03-01 03:36:33 +00003668
3669 if "do something else first" invoked something that raised and caught
3670 an exception, sys.exc_ZZZ were overwritten. That was a frequent
3671 cause of subtle bugs. I fixed this by changing the semantics as
3672 follows:
3673
3674 - Within one frame, sys.exc_ZZZ will hold the last exception caught
3675 *in that frame*.
3676
3677 - But initially, and as long as no exception is caught in a given
3678 frame, sys.exc_ZZZ will hold the last exception caught in the
3679 previous frame (or the frame before that, etc.).
3680
3681 The first bullet fixed the bug in the above example. The second
3682 bullet was for backwards compatibility: it was (and is) common to
3683 have a function that is called when an exception is caught, and to
3684 have that function access the caught exception via sys.exc_ZZZ.
3685 (Example: traceback.print_exc()).
3686
3687 At the same time I fixed the problem that sys.exc_ZZZ weren't
3688 thread-safe, by introducing sys.exc_info() which gets it from tstate;
3689 but that's really a separate improvement.
3690
3691 The reset_exc_info() function in ceval.c restores the tstate->exc_ZZZ
3692 variables to what they were before the current frame was called. The
3693 set_exc_info() function saves them on the frame so that
3694 reset_exc_info() can restore them. The invariant is that
3695 frame->f_exc_ZZZ is NULL iff the current frame never caught an
3696 exception (where "catching" an exception applies only to successful
3697 except clauses); and if the current frame ever caught an exception,
3698 frame->f_exc_ZZZ is the exception that was stored in tstate->exc_ZZZ
3699 at the start of the current frame.
3700
3701*/
3702
Fredrik Lundh7a830892006-05-27 10:39:48 +00003703static void
Guido van Rossumac7be682001-01-17 15:42:30 +00003704set_exc_info(PyThreadState *tstate,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003705 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003706{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003707 PyFrameObject *frame = tstate->frame;
3708 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00003709
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003710 assert(type != NULL);
3711 assert(frame != NULL);
3712 if (frame->f_exc_type == NULL) {
3713 assert(frame->f_exc_value == NULL);
3714 assert(frame->f_exc_traceback == NULL);
3715 /* This frame didn't catch an exception before. */
3716 /* Save previous exception of this thread in this frame. */
3717 if (tstate->exc_type == NULL) {
3718 /* XXX Why is this set to Py_None? */
3719 Py_INCREF(Py_None);
3720 tstate->exc_type = Py_None;
3721 }
3722 Py_INCREF(tstate->exc_type);
3723 Py_XINCREF(tstate->exc_value);
3724 Py_XINCREF(tstate->exc_traceback);
3725 frame->f_exc_type = tstate->exc_type;
3726 frame->f_exc_value = tstate->exc_value;
3727 frame->f_exc_traceback = tstate->exc_traceback;
3728 }
3729 /* Set new exception for this thread. */
3730 tmp_type = tstate->exc_type;
3731 tmp_value = tstate->exc_value;
3732 tmp_tb = tstate->exc_traceback;
3733 Py_INCREF(type);
3734 Py_XINCREF(value);
3735 Py_XINCREF(tb);
3736 tstate->exc_type = type;
3737 tstate->exc_value = value;
3738 tstate->exc_traceback = tb;
3739 Py_XDECREF(tmp_type);
3740 Py_XDECREF(tmp_value);
3741 Py_XDECREF(tmp_tb);
3742 /* For b/w compatibility */
3743 PySys_SetObject("exc_type", type);
3744 PySys_SetObject("exc_value", value);
3745 PySys_SetObject("exc_traceback", tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00003746}
3747
Fredrik Lundh7a830892006-05-27 10:39:48 +00003748static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003749reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003750{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003751 PyFrameObject *frame;
3752 PyObject *tmp_type, *tmp_value, *tmp_tb;
Tim Peters7df5e7f2006-05-26 23:14:37 +00003753
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003754 /* It's a precondition that the thread state's frame caught an
3755 * exception -- verify in a debug build.
3756 */
3757 assert(tstate != NULL);
3758 frame = tstate->frame;
3759 assert(frame != NULL);
3760 assert(frame->f_exc_type != NULL);
Tim Peters7df5e7f2006-05-26 23:14:37 +00003761
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003762 /* Copy the frame's exception info back to the thread state. */
3763 tmp_type = tstate->exc_type;
3764 tmp_value = tstate->exc_value;
3765 tmp_tb = tstate->exc_traceback;
3766 Py_INCREF(frame->f_exc_type);
3767 Py_XINCREF(frame->f_exc_value);
3768 Py_XINCREF(frame->f_exc_traceback);
3769 tstate->exc_type = frame->f_exc_type;
3770 tstate->exc_value = frame->f_exc_value;
3771 tstate->exc_traceback = frame->f_exc_traceback;
3772 Py_XDECREF(tmp_type);
3773 Py_XDECREF(tmp_value);
3774 Py_XDECREF(tmp_tb);
Tim Peters7df5e7f2006-05-26 23:14:37 +00003775
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003776 /* For b/w compatibility */
3777 PySys_SetObject("exc_type", frame->f_exc_type);
3778 PySys_SetObject("exc_value", frame->f_exc_value);
3779 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
Tim Peters7df5e7f2006-05-26 23:14:37 +00003780
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003781 /* Clear the frame's exception info. */
3782 tmp_type = frame->f_exc_type;
3783 tmp_value = frame->f_exc_value;
3784 tmp_tb = frame->f_exc_traceback;
3785 frame->f_exc_type = NULL;
3786 frame->f_exc_value = NULL;
3787 frame->f_exc_traceback = NULL;
3788 Py_DECREF(tmp_type);
3789 Py_XDECREF(tmp_value);
3790 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00003791}
3792
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003793/* Logic for the raise statement (too complicated for inlining).
3794 This *consumes* a reference count to each of its arguments. */
Fredrik Lundh7a830892006-05-27 10:39:48 +00003795static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003796do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003797{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003798 if (type == NULL) {
3799 /* Reraise */
3800 PyThreadState *tstate = PyThreadState_GET();
3801 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
3802 value = tstate->exc_value;
3803 tb = tstate->exc_traceback;
3804 Py_XINCREF(type);
3805 Py_XINCREF(value);
3806 Py_XINCREF(tb);
3807 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003808
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003809 /* We support the following forms of raise:
3810 raise <class>, <classinstance>
3811 raise <class>, <argument tuple>
3812 raise <class>, None
3813 raise <class>, <argument>
3814 raise <classinstance>, None
3815 raise <string>, <object>
3816 raise <string>, None
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003817
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003818 An omitted second argument is the same as None.
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003819
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003820 In addition, raise <tuple>, <anything> is the same as
3821 raising the tuple's first item (and it better have one!);
3822 this rule is applied recursively.
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003823
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003824 Finally, an optional third argument can be supplied, which
3825 gives the traceback to be substituted (useful when
3826 re-raising an exception after examining it). */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003827
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003828 /* First, check the traceback argument, replacing None with
3829 NULL. */
3830 if (tb == Py_None) {
3831 Py_DECREF(tb);
3832 tb = NULL;
3833 }
3834 else if (tb != NULL && !PyTraceBack_Check(tb)) {
3835 PyErr_SetString(PyExc_TypeError,
3836 "raise: arg 3 must be a traceback or None");
3837 goto raise_error;
3838 }
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003839
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003840 /* Next, replace a missing value with None */
3841 if (value == NULL) {
3842 value = Py_None;
3843 Py_INCREF(value);
3844 }
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003845
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003846 /* Next, repeatedly, replace a tuple exception with its first item */
3847 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
3848 PyObject *tmp = type;
3849 type = PyTuple_GET_ITEM(type, 0);
3850 Py_INCREF(type);
3851 Py_DECREF(tmp);
3852 }
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003853
Benjamin Petersonc3349cd2011-07-15 14:15:40 -05003854 if (PyExceptionClass_Check(type)) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003855 PyErr_NormalizeException(&type, &value, &tb);
Benjamin Petersonc3349cd2011-07-15 14:15:40 -05003856 if (!PyExceptionInstance_Check(value)) {
3857 PyErr_Format(PyExc_TypeError,
3858 "calling %s() should have returned an instance of "
3859 "BaseException, not '%s'",
3860 ((PyTypeObject *)type)->tp_name,
3861 Py_TYPE(value)->tp_name);
3862 goto raise_error;
3863 }
3864 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003865 else if (PyExceptionInstance_Check(type)) {
3866 /* Raising an instance. The value should be a dummy. */
3867 if (value != Py_None) {
3868 PyErr_SetString(PyExc_TypeError,
3869 "instance exception may not have a separate value");
3870 goto raise_error;
3871 }
3872 else {
3873 /* Normalize to raise <class>, <instance> */
3874 Py_DECREF(value);
3875 value = type;
3876 type = PyExceptionInstance_Class(type);
3877 Py_INCREF(type);
3878 }
3879 }
3880 else {
3881 /* Not something you can raise. You get an exception
3882 anyway, just not what you specified :-) */
3883 PyErr_Format(PyExc_TypeError,
3884 "exceptions must be old-style classes or "
3885 "derived from BaseException, not %s",
3886 type->ob_type->tp_name);
3887 goto raise_error;
3888 }
Guido van Rossum504153d2008-03-18 04:26:48 +00003889
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003890 assert(PyExceptionClass_Check(type));
3891 if (Py_Py3kWarningFlag && PyClass_Check(type)) {
3892 if (PyErr_WarnEx(PyExc_DeprecationWarning,
3893 "exceptions must derive from BaseException "
3894 "in 3.x", 1) < 0)
3895 goto raise_error;
3896 }
Guido van Rossum504153d2008-03-18 04:26:48 +00003897
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003898 PyErr_Restore(type, value, tb);
3899 if (tb == NULL)
3900 return WHY_EXCEPTION;
3901 else
3902 return WHY_RERAISE;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003903 raise_error:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003904 Py_XDECREF(value);
3905 Py_XDECREF(type);
3906 Py_XDECREF(tb);
3907 return WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003908}
3909
Tim Petersd6d010b2001-06-21 02:49:55 +00003910/* Iterate v argcnt times and store the results on the stack (via decreasing
3911 sp). Return 1 for success, 0 if error. */
3912
Fredrik Lundh7a830892006-05-27 10:39:48 +00003913static int
Tim Petersd6d010b2001-06-21 02:49:55 +00003914unpack_iterable(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00003915{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003916 int i = 0;
3917 PyObject *it; /* iter(v) */
3918 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00003919
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003920 assert(v != NULL);
Tim Petersd6d010b2001-06-21 02:49:55 +00003921
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003922 it = PyObject_GetIter(v);
3923 if (it == NULL)
3924 goto Error;
Tim Petersd6d010b2001-06-21 02:49:55 +00003925
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003926 for (; i < argcnt; i++) {
3927 w = PyIter_Next(it);
3928 if (w == NULL) {
3929 /* Iterator done, via error or exhaustion. */
3930 if (!PyErr_Occurred()) {
3931 PyErr_Format(PyExc_ValueError,
3932 "need more than %d value%s to unpack",
3933 i, i == 1 ? "" : "s");
3934 }
3935 goto Error;
3936 }
3937 *--sp = w;
3938 }
Tim Petersd6d010b2001-06-21 02:49:55 +00003939
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003940 /* We better have exhausted the iterator now. */
3941 w = PyIter_Next(it);
3942 if (w == NULL) {
3943 if (PyErr_Occurred())
3944 goto Error;
3945 Py_DECREF(it);
3946 return 1;
3947 }
3948 Py_DECREF(w);
3949 PyErr_SetString(PyExc_ValueError, "too many values to unpack");
3950 /* fall through */
Tim Petersd6d010b2001-06-21 02:49:55 +00003951Error:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003952 for (; i > 0; i--, sp++)
3953 Py_DECREF(*sp);
3954 Py_XDECREF(it);
3955 return 0;
Barry Warsawe42b18f1997-08-25 22:13:04 +00003956}
3957
3958
Guido van Rossum96a42c81992-01-12 02:29:51 +00003959#ifdef LLTRACE
Fredrik Lundh7a830892006-05-27 10:39:48 +00003960static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003961prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003962{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003963 printf("%s ", str);
3964 if (PyObject_Print(v, stdout, 0) != 0)
3965 PyErr_Clear(); /* Don't know what else to do */
3966 printf("\n");
3967 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003968}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003969#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003970
Fredrik Lundh7a830892006-05-27 10:39:48 +00003971static void
Fred Drake5755ce62001-06-27 19:19:46 +00003972call_exc_trace(Py_tracefunc func, PyObject *self, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003973{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003974 PyObject *type, *value, *traceback, *arg;
3975 int err;
3976 PyErr_Fetch(&type, &value, &traceback);
3977 if (value == NULL) {
3978 value = Py_None;
3979 Py_INCREF(value);
3980 }
3981 arg = PyTuple_Pack(3, type, value, traceback);
3982 if (arg == NULL) {
3983 PyErr_Restore(type, value, traceback);
3984 return;
3985 }
3986 err = call_trace(func, self, f, PyTrace_EXCEPTION, arg);
3987 Py_DECREF(arg);
3988 if (err == 0)
3989 PyErr_Restore(type, value, traceback);
3990 else {
3991 Py_XDECREF(type);
3992 Py_XDECREF(value);
3993 Py_XDECREF(traceback);
3994 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003995}
3996
Amaury Forgeot d'Arc0d75f092007-11-13 21:54:28 +00003997static int
Fred Drake4ec5d562001-10-04 19:26:43 +00003998call_trace_protected(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003999 int what, PyObject *arg)
Fred Drake4ec5d562001-10-04 19:26:43 +00004000{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004001 PyObject *type, *value, *traceback;
4002 int err;
4003 PyErr_Fetch(&type, &value, &traceback);
4004 err = call_trace(func, obj, frame, what, arg);
4005 if (err == 0)
4006 {
4007 PyErr_Restore(type, value, traceback);
4008 return 0;
4009 }
4010 else {
4011 Py_XDECREF(type);
4012 Py_XDECREF(value);
4013 Py_XDECREF(traceback);
4014 return -1;
4015 }
Fred Drake4ec5d562001-10-04 19:26:43 +00004016}
4017
Fredrik Lundh7a830892006-05-27 10:39:48 +00004018static int
Fred Drake5755ce62001-06-27 19:19:46 +00004019call_trace(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004020 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00004021{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004022 register PyThreadState *tstate = frame->f_tstate;
4023 int result;
4024 if (tstate->tracing)
4025 return 0;
4026 tstate->tracing++;
4027 tstate->use_tracing = 0;
4028 result = func(obj, frame, what, arg);
4029 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
4030 || (tstate->c_profilefunc != NULL));
4031 tstate->tracing--;
4032 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00004033}
4034
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00004035PyObject *
4036_PyEval_CallTracing(PyObject *func, PyObject *args)
4037{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004038 PyFrameObject *frame = PyEval_GetFrame();
4039 PyThreadState *tstate = frame->f_tstate;
4040 int save_tracing = tstate->tracing;
4041 int save_use_tracing = tstate->use_tracing;
4042 PyObject *result;
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00004043
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004044 tstate->tracing = 0;
4045 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
4046 || (tstate->c_profilefunc != NULL));
4047 result = PyObject_Call(func, args, NULL);
4048 tstate->tracing = save_tracing;
4049 tstate->use_tracing = save_use_tracing;
4050 return result;
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00004051}
4052
Jeffrey Yasskin655d8352009-05-23 23:23:01 +00004053/* See Objects/lnotab_notes.txt for a description of how tracing works. */
Fredrik Lundh7a830892006-05-27 10:39:48 +00004054static int
Tim Peters8a5c3c72004-04-05 19:36:21 +00004055maybe_call_line_trace(Py_tracefunc func, PyObject *obj,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004056 PyFrameObject *frame, int *instr_lb, int *instr_ub,
4057 int *instr_prev)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004058{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004059 int result = 0;
4060 int line = frame->f_lineno;
Michael W. Hudson006c7522002-11-08 13:08:46 +00004061
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004062 /* If the last instruction executed isn't in the current
4063 instruction window, reset the window.
4064 */
4065 if (frame->f_lasti < *instr_lb || frame->f_lasti >= *instr_ub) {
4066 PyAddrPair bounds;
4067 line = _PyCode_CheckLineNumber(frame->f_code, frame->f_lasti,
4068 &bounds);
4069 *instr_lb = bounds.ap_lower;
4070 *instr_ub = bounds.ap_upper;
4071 }
4072 /* If the last instruction falls at the start of a line or if
4073 it represents a jump backwards, update the frame's line
4074 number and call the trace function. */
4075 if (frame->f_lasti == *instr_lb || frame->f_lasti < *instr_prev) {
4076 frame->f_lineno = line;
4077 result = call_trace(func, obj, frame, PyTrace_LINE, Py_None);
4078 }
4079 *instr_prev = frame->f_lasti;
4080 return result;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004081}
4082
Fred Drake5755ce62001-06-27 19:19:46 +00004083void
4084PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00004085{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004086 PyThreadState *tstate = PyThreadState_GET();
4087 PyObject *temp = tstate->c_profileobj;
4088 Py_XINCREF(arg);
4089 tstate->c_profilefunc = NULL;
4090 tstate->c_profileobj = NULL;
4091 /* Must make sure that tracing is not ignored if 'temp' is freed */
4092 tstate->use_tracing = tstate->c_tracefunc != NULL;
4093 Py_XDECREF(temp);
4094 tstate->c_profilefunc = func;
4095 tstate->c_profileobj = arg;
4096 /* Flag that tracing or profiling is turned on */
4097 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
Fred Drake5755ce62001-06-27 19:19:46 +00004098}
4099
4100void
4101PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
4102{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004103 PyThreadState *tstate = PyThreadState_GET();
4104 PyObject *temp = tstate->c_traceobj;
4105 _Py_TracingPossible += (func != NULL) - (tstate->c_tracefunc != NULL);
4106 Py_XINCREF(arg);
4107 tstate->c_tracefunc = NULL;
4108 tstate->c_traceobj = NULL;
4109 /* Must make sure that profiling is not ignored if 'temp' is freed */
4110 tstate->use_tracing = tstate->c_profilefunc != NULL;
4111 Py_XDECREF(temp);
4112 tstate->c_tracefunc = func;
4113 tstate->c_traceobj = arg;
4114 /* Flag that tracing or profiling is turned on */
4115 tstate->use_tracing = ((func != NULL)
4116 || (tstate->c_profilefunc != NULL));
Fred Draked0838392001-06-16 21:02:31 +00004117}
4118
Guido van Rossumb209a111997-04-29 18:18:01 +00004119PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004120PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00004121{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004122 PyFrameObject *current_frame = PyEval_GetFrame();
4123 if (current_frame == NULL)
4124 return PyThreadState_GET()->interp->builtins;
4125 else
4126 return current_frame->f_builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00004127}
4128
Guido van Rossumb209a111997-04-29 18:18:01 +00004129PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004130PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00004131{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004132 PyFrameObject *current_frame = PyEval_GetFrame();
4133 if (current_frame == NULL)
4134 return NULL;
4135 PyFrame_FastToLocals(current_frame);
4136 return current_frame->f_locals;
Guido van Rossum5b722181993-03-30 17:46:03 +00004137}
4138
Guido van Rossumb209a111997-04-29 18:18:01 +00004139PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004140PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00004141{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004142 PyFrameObject *current_frame = PyEval_GetFrame();
4143 if (current_frame == NULL)
4144 return NULL;
4145 else
4146 return current_frame->f_globals;
Guido van Rossum3f5da241990-12-20 15:06:42 +00004147}
4148
Guido van Rossum6297a7a2003-02-19 15:53:17 +00004149PyFrameObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004150PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00004151{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004152 PyThreadState *tstate = PyThreadState_GET();
4153 return _PyThreadState_GetFrame(tstate);
Guido van Rossume59214e1994-08-30 08:01:59 +00004154}
4155
Guido van Rossum6135a871995-01-09 17:53:26 +00004156int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004157PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00004158{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004159 PyFrameObject *current_frame = PyEval_GetFrame();
4160 return current_frame == NULL ? 0 : PyFrame_IsRestricted(current_frame);
Guido van Rossum6135a871995-01-09 17:53:26 +00004161}
4162
Guido van Rossumbe270261997-05-22 22:26:18 +00004163int
Tim Peters5ba58662001-07-16 02:29:45 +00004164PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
Jeremy Hylton061d1062001-03-22 02:32:48 +00004165{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004166 PyFrameObject *current_frame = PyEval_GetFrame();
4167 int result = cf->cf_flags != 0;
Tim Peters5ba58662001-07-16 02:29:45 +00004168
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004169 if (current_frame != NULL) {
4170 const int codeflags = current_frame->f_code->co_flags;
4171 const int compilerflags = codeflags & PyCF_MASK;
4172 if (compilerflags) {
4173 result = 1;
4174 cf->cf_flags |= compilerflags;
4175 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00004176#if 0 /* future keyword */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004177 if (codeflags & CO_GENERATOR_ALLOWED) {
4178 result = 1;
4179 cf->cf_flags |= CO_GENERATOR_ALLOWED;
4180 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00004181#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004182 }
4183 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00004184}
4185
4186int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004187Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004188{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004189 PyObject *f = PySys_GetObject("stdout");
4190 if (f == NULL)
4191 return 0;
4192 if (!PyFile_SoftSpace(f, 0))
4193 return 0;
4194 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004195}
4196
Guido van Rossum3f5da241990-12-20 15:06:42 +00004197
Guido van Rossum681d79a1995-07-18 14:51:37 +00004198/* External interface to call any callable object.
Antoine Pitrou76c86492010-04-01 16:42:11 +00004199 The arg must be a tuple or NULL. The kw must be a dict or NULL. */
Guido van Rossume59214e1994-08-30 08:01:59 +00004200
Guido van Rossumb209a111997-04-29 18:18:01 +00004201PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004202PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004203{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004204 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004205
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004206 if (arg == NULL) {
4207 arg = PyTuple_New(0);
4208 if (arg == NULL)
4209 return NULL;
4210 }
4211 else if (!PyTuple_Check(arg)) {
4212 PyErr_SetString(PyExc_TypeError,
4213 "argument list must be a tuple");
4214 return NULL;
4215 }
4216 else
4217 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004218
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004219 if (kw != NULL && !PyDict_Check(kw)) {
4220 PyErr_SetString(PyExc_TypeError,
4221 "keyword list must be a dictionary");
4222 Py_DECREF(arg);
4223 return NULL;
4224 }
Guido van Rossume3e61c11995-08-04 04:14:47 +00004225
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004226 result = PyObject_Call(func, arg, kw);
4227 Py_DECREF(arg);
4228 return result;
Jeremy Hylton52820442001-01-03 23:52:36 +00004229}
4230
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00004231const char *
Tim Peters6d6c1a32001-08-02 04:15:00 +00004232PyEval_GetFuncName(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00004233{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004234 if (PyMethod_Check(func))
4235 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
4236 else if (PyFunction_Check(func))
4237 return PyString_AsString(((PyFunctionObject*)func)->func_name);
4238 else if (PyCFunction_Check(func))
4239 return ((PyCFunctionObject*)func)->m_ml->ml_name;
4240 else if (PyClass_Check(func))
4241 return PyString_AsString(((PyClassObject*)func)->cl_name);
4242 else if (PyInstance_Check(func)) {
4243 return PyString_AsString(
4244 ((PyInstanceObject*)func)->in_class->cl_name);
4245 } else {
4246 return func->ob_type->tp_name;
4247 }
Jeremy Hylton512a2372001-04-11 13:52:29 +00004248}
4249
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00004250const char *
Tim Peters6d6c1a32001-08-02 04:15:00 +00004251PyEval_GetFuncDesc(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00004252{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004253 if (PyMethod_Check(func))
4254 return "()";
4255 else if (PyFunction_Check(func))
4256 return "()";
4257 else if (PyCFunction_Check(func))
4258 return "()";
4259 else if (PyClass_Check(func))
4260 return " constructor";
4261 else if (PyInstance_Check(func)) {
4262 return " instance";
4263 } else {
4264 return " object";
4265 }
Jeremy Hylton512a2372001-04-11 13:52:29 +00004266}
4267
Fredrik Lundh7a830892006-05-27 10:39:48 +00004268static void
Jeremy Hylton192690e2002-08-16 18:36:11 +00004269err_args(PyObject *func, int flags, int nargs)
4270{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004271 if (flags & METH_NOARGS)
4272 PyErr_Format(PyExc_TypeError,
4273 "%.200s() takes no arguments (%d given)",
4274 ((PyCFunctionObject *)func)->m_ml->ml_name,
4275 nargs);
4276 else
4277 PyErr_Format(PyExc_TypeError,
4278 "%.200s() takes exactly one argument (%d given)",
4279 ((PyCFunctionObject *)func)->m_ml->ml_name,
4280 nargs);
Jeremy Hylton192690e2002-08-16 18:36:11 +00004281}
4282
Armin Rigo1c2d7e52005-09-20 18:34:01 +00004283#define C_TRACE(x, call) \
Nicholas Bastind858a772004-06-25 23:31:06 +00004284if (tstate->use_tracing && tstate->c_profilefunc) { \
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004285 if (call_trace(tstate->c_profilefunc, \
4286 tstate->c_profileobj, \
4287 tstate->frame, PyTrace_C_CALL, \
4288 func)) { \
4289 x = NULL; \
4290 } \
4291 else { \
4292 x = call; \
4293 if (tstate->c_profilefunc != NULL) { \
4294 if (x == NULL) { \
4295 call_trace_protected(tstate->c_profilefunc, \
4296 tstate->c_profileobj, \
4297 tstate->frame, PyTrace_C_EXCEPTION, \
4298 func); \
4299 /* XXX should pass (type, value, tb) */ \
4300 } else { \
4301 if (call_trace(tstate->c_profilefunc, \
4302 tstate->c_profileobj, \
4303 tstate->frame, PyTrace_C_RETURN, \
4304 func)) { \
4305 Py_DECREF(x); \
4306 x = NULL; \
4307 } \
4308 } \
4309 } \
4310 } \
Nicholas Bastind858a772004-06-25 23:31:06 +00004311} else { \
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004312 x = call; \
4313 }
Nicholas Bastinc69ebe82004-03-24 21:57:10 +00004314
Fredrik Lundh7a830892006-05-27 10:39:48 +00004315static PyObject *
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00004316call_function(PyObject ***pp_stack, int oparg
4317#ifdef WITH_TSC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004318 , uint64* pintr0, uint64* pintr1
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00004319#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004320 )
Jeremy Hyltone8c04322002-08-16 17:47:26 +00004321{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004322 int na = oparg & 0xff;
4323 int nk = (oparg>>8) & 0xff;
4324 int n = na + 2 * nk;
4325 PyObject **pfunc = (*pp_stack) - n - 1;
4326 PyObject *func = *pfunc;
4327 PyObject *x, *w;
Jeremy Hyltone8c04322002-08-16 17:47:26 +00004328
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004329 /* Always dispatch PyCFunction first, because these are
4330 presumed to be the most frequent callable object.
4331 */
4332 if (PyCFunction_Check(func) && nk == 0) {
4333 int flags = PyCFunction_GET_FLAGS(func);
4334 PyThreadState *tstate = PyThreadState_GET();
Raymond Hettingera7f56bc2004-06-26 04:34:33 +00004335
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004336 PCALL(PCALL_CFUNCTION);
4337 if (flags & (METH_NOARGS | METH_O)) {
4338 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
4339 PyObject *self = PyCFunction_GET_SELF(func);
4340 if (flags & METH_NOARGS && na == 0) {
4341 C_TRACE(x, (*meth)(self,NULL));
4342 }
4343 else if (flags & METH_O && na == 1) {
4344 PyObject *arg = EXT_POP(*pp_stack);
4345 C_TRACE(x, (*meth)(self,arg));
4346 Py_DECREF(arg);
4347 }
4348 else {
4349 err_args(func, flags, na);
4350 x = NULL;
4351 }
4352 }
4353 else {
4354 PyObject *callargs;
4355 callargs = load_args(pp_stack, na);
4356 READ_TIMESTAMP(*pintr0);
4357 C_TRACE(x, PyCFunction_Call(func,callargs,NULL));
4358 READ_TIMESTAMP(*pintr1);
4359 Py_XDECREF(callargs);
4360 }
4361 } else {
4362 if (PyMethod_Check(func) && PyMethod_GET_SELF(func) != NULL) {
4363 /* optimize access to bound methods */
4364 PyObject *self = PyMethod_GET_SELF(func);
4365 PCALL(PCALL_METHOD);
4366 PCALL(PCALL_BOUND_METHOD);
4367 Py_INCREF(self);
4368 func = PyMethod_GET_FUNCTION(func);
4369 Py_INCREF(func);
Serhiy Storchaka763a61c2016-04-10 18:05:12 +03004370 Py_SETREF(*pfunc, self);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004371 na++;
4372 n++;
4373 } else
4374 Py_INCREF(func);
4375 READ_TIMESTAMP(*pintr0);
4376 if (PyFunction_Check(func))
4377 x = fast_function(func, pp_stack, n, na, nk);
4378 else
4379 x = do_call(func, pp_stack, na, nk);
4380 READ_TIMESTAMP(*pintr1);
4381 Py_DECREF(func);
4382 }
Tim Peters8a5c3c72004-04-05 19:36:21 +00004383
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004384 /* Clear the stack of the function object. Also removes
4385 the arguments in case they weren't consumed already
4386 (fast_function() and err_args() leave them on the stack).
4387 */
4388 while ((*pp_stack) > pfunc) {
4389 w = EXT_POP(*pp_stack);
4390 Py_DECREF(w);
4391 PCALL(PCALL_POP);
4392 }
4393 return x;
Jeremy Hyltone8c04322002-08-16 17:47:26 +00004394}
4395
Jeremy Hylton192690e2002-08-16 18:36:11 +00004396/* The fast_function() function optimize calls for which no argument
Jeremy Hylton52820442001-01-03 23:52:36 +00004397 tuple is necessary; the objects are passed directly from the stack.
Jeremy Hylton985eba52003-02-05 23:13:00 +00004398 For the simplest case -- a function that takes only positional
4399 arguments and is called with only positional arguments -- it
4400 inlines the most primitive frame setup code from
4401 PyEval_EvalCodeEx(), which vastly reduces the checks that must be
4402 done before evaluating the frame.
Jeremy Hylton52820442001-01-03 23:52:36 +00004403*/
4404
Fredrik Lundh7a830892006-05-27 10:39:48 +00004405static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00004406fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00004407{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004408 PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func);
4409 PyObject *globals = PyFunction_GET_GLOBALS(func);
4410 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
4411 PyObject **d = NULL;
4412 int nd = 0;
Jeremy Hylton52820442001-01-03 23:52:36 +00004413
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004414 PCALL(PCALL_FUNCTION);
4415 PCALL(PCALL_FAST_FUNCTION);
4416 if (argdefs == NULL && co->co_argcount == n && nk==0 &&
4417 co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) {
4418 PyFrameObject *f;
4419 PyObject *retval = NULL;
4420 PyThreadState *tstate = PyThreadState_GET();
4421 PyObject **fastlocals, **stack;
4422 int i;
Jeremy Hylton985eba52003-02-05 23:13:00 +00004423
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004424 PCALL(PCALL_FASTER_FUNCTION);
4425 assert(globals != NULL);
4426 /* XXX Perhaps we should create a specialized
4427 PyFrame_New() that doesn't take locals, but does
4428 take builtins without sanity checking them.
4429 */
4430 assert(tstate != NULL);
4431 f = PyFrame_New(tstate, co, globals, NULL);
4432 if (f == NULL)
4433 return NULL;
Jeremy Hylton985eba52003-02-05 23:13:00 +00004434
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004435 fastlocals = f->f_localsplus;
4436 stack = (*pp_stack) - n;
Jeremy Hylton985eba52003-02-05 23:13:00 +00004437
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004438 for (i = 0; i < n; i++) {
4439 Py_INCREF(*stack);
4440 fastlocals[i] = *stack++;
4441 }
4442 retval = PyEval_EvalFrameEx(f,0);
4443 ++tstate->recursion_depth;
4444 Py_DECREF(f);
4445 --tstate->recursion_depth;
4446 return retval;
4447 }
4448 if (argdefs != NULL) {
4449 d = &PyTuple_GET_ITEM(argdefs, 0);
4450 nd = Py_SIZE(argdefs);
4451 }
4452 return PyEval_EvalCodeEx(co, globals,
4453 (PyObject *)NULL, (*pp_stack)-n, na,
4454 (*pp_stack)-2*nk, nk, d, nd,
4455 PyFunction_GET_CLOSURE(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00004456}
4457
Fredrik Lundh7a830892006-05-27 10:39:48 +00004458static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00004459update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
4460 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00004461{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004462 PyObject *kwdict = NULL;
4463 if (orig_kwdict == NULL)
4464 kwdict = PyDict_New();
4465 else {
4466 kwdict = PyDict_Copy(orig_kwdict);
4467 Py_DECREF(orig_kwdict);
4468 }
4469 if (kwdict == NULL)
4470 return NULL;
4471 while (--nk >= 0) {
4472 int err;
4473 PyObject *value = EXT_POP(*pp_stack);
4474 PyObject *key = EXT_POP(*pp_stack);
4475 if (PyDict_GetItem(kwdict, key) != NULL) {
4476 PyErr_Format(PyExc_TypeError,
4477 "%.200s%s got multiple values "
4478 "for keyword argument '%.200s'",
4479 PyEval_GetFuncName(func),
4480 PyEval_GetFuncDesc(func),
4481 PyString_AsString(key));
4482 Py_DECREF(key);
4483 Py_DECREF(value);
4484 Py_DECREF(kwdict);
4485 return NULL;
4486 }
4487 err = PyDict_SetItem(kwdict, key, value);
4488 Py_DECREF(key);
4489 Py_DECREF(value);
4490 if (err) {
4491 Py_DECREF(kwdict);
4492 return NULL;
4493 }
4494 }
4495 return kwdict;
Jeremy Hylton52820442001-01-03 23:52:36 +00004496}
4497
Fredrik Lundh7a830892006-05-27 10:39:48 +00004498static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00004499update_star_args(int nstack, int nstar, PyObject *stararg,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004500 PyObject ***pp_stack)
Jeremy Hylton52820442001-01-03 23:52:36 +00004501{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004502 PyObject *callargs, *w;
Jeremy Hylton52820442001-01-03 23:52:36 +00004503
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004504 callargs = PyTuple_New(nstack + nstar);
4505 if (callargs == NULL) {
4506 return NULL;
4507 }
4508 if (nstar) {
4509 int i;
4510 for (i = 0; i < nstar; i++) {
4511 PyObject *a = PyTuple_GET_ITEM(stararg, i);
4512 Py_INCREF(a);
4513 PyTuple_SET_ITEM(callargs, nstack + i, a);
4514 }
4515 }
4516 while (--nstack >= 0) {
4517 w = EXT_POP(*pp_stack);
4518 PyTuple_SET_ITEM(callargs, nstack, w);
4519 }
4520 return callargs;
Jeremy Hylton52820442001-01-03 23:52:36 +00004521}
4522
Fredrik Lundh7a830892006-05-27 10:39:48 +00004523static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00004524load_args(PyObject ***pp_stack, int na)
4525{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004526 PyObject *args = PyTuple_New(na);
4527 PyObject *w;
Jeremy Hylton52820442001-01-03 23:52:36 +00004528
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004529 if (args == NULL)
4530 return NULL;
4531 while (--na >= 0) {
4532 w = EXT_POP(*pp_stack);
4533 PyTuple_SET_ITEM(args, na, w);
4534 }
4535 return args;
Jeremy Hylton52820442001-01-03 23:52:36 +00004536}
4537
Fredrik Lundh7a830892006-05-27 10:39:48 +00004538static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00004539do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
4540{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004541 PyObject *callargs = NULL;
4542 PyObject *kwdict = NULL;
4543 PyObject *result = NULL;
Jeremy Hylton52820442001-01-03 23:52:36 +00004544
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004545 if (nk > 0) {
4546 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
4547 if (kwdict == NULL)
4548 goto call_fail;
4549 }
4550 callargs = load_args(pp_stack, na);
4551 if (callargs == NULL)
4552 goto call_fail;
Jeremy Hylton985eba52003-02-05 23:13:00 +00004553#ifdef CALL_PROFILE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004554 /* At this point, we have to look at the type of func to
4555 update the call stats properly. Do it here so as to avoid
4556 exposing the call stats machinery outside ceval.c
4557 */
4558 if (PyFunction_Check(func))
4559 PCALL(PCALL_FUNCTION);
4560 else if (PyMethod_Check(func))
4561 PCALL(PCALL_METHOD);
4562 else if (PyType_Check(func))
4563 PCALL(PCALL_TYPE);
4564 else if (PyCFunction_Check(func))
4565 PCALL(PCALL_CFUNCTION);
4566 else
4567 PCALL(PCALL_OTHER);
Jeremy Hylton985eba52003-02-05 23:13:00 +00004568#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004569 if (PyCFunction_Check(func)) {
4570 PyThreadState *tstate = PyThreadState_GET();
4571 C_TRACE(result, PyCFunction_Call(func, callargs, kwdict));
4572 }
4573 else
4574 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00004575 call_fail:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004576 Py_XDECREF(callargs);
4577 Py_XDECREF(kwdict);
4578 return result;
Jeremy Hylton52820442001-01-03 23:52:36 +00004579}
4580
Fredrik Lundh7a830892006-05-27 10:39:48 +00004581static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00004582ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
4583{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004584 int nstar = 0;
4585 PyObject *callargs = NULL;
4586 PyObject *stararg = NULL;
4587 PyObject *kwdict = NULL;
4588 PyObject *result = NULL;
Jeremy Hylton52820442001-01-03 23:52:36 +00004589
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004590 if (flags & CALL_FLAG_KW) {
4591 kwdict = EXT_POP(*pp_stack);
4592 if (!PyDict_Check(kwdict)) {
4593 PyObject *d;
4594 d = PyDict_New();
4595 if (d == NULL)
4596 goto ext_call_fail;
4597 if (PyDict_Update(d, kwdict) != 0) {
4598 Py_DECREF(d);
4599 /* PyDict_Update raises attribute
4600 * error (percolated from an attempt
4601 * to get 'keys' attribute) instead of
4602 * a type error if its second argument
4603 * is not a mapping.
4604 */
4605 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
4606 PyErr_Format(PyExc_TypeError,
4607 "%.200s%.200s argument after ** "
4608 "must be a mapping, not %.200s",
4609 PyEval_GetFuncName(func),
4610 PyEval_GetFuncDesc(func),
4611 kwdict->ob_type->tp_name);
4612 }
4613 goto ext_call_fail;
4614 }
4615 Py_DECREF(kwdict);
4616 kwdict = d;
4617 }
4618 }
4619 if (flags & CALL_FLAG_VAR) {
4620 stararg = EXT_POP(*pp_stack);
4621 if (!PyTuple_Check(stararg)) {
4622 PyObject *t = NULL;
4623 t = PySequence_Tuple(stararg);
4624 if (t == NULL) {
Martin Panter0bb165e2016-01-31 06:30:56 +00004625 if (PyErr_ExceptionMatches(PyExc_TypeError) &&
4626 /* Don't mask TypeError raised from a generator */
4627 !PyGen_Check(stararg)) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004628 PyErr_Format(PyExc_TypeError,
4629 "%.200s%.200s argument after * "
Martin Panter0bb165e2016-01-31 06:30:56 +00004630 "must be an iterable, not %200s",
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004631 PyEval_GetFuncName(func),
4632 PyEval_GetFuncDesc(func),
4633 stararg->ob_type->tp_name);
4634 }
4635 goto ext_call_fail;
4636 }
4637 Py_DECREF(stararg);
4638 stararg = t;
4639 }
4640 nstar = PyTuple_GET_SIZE(stararg);
4641 }
4642 if (nk > 0) {
4643 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
4644 if (kwdict == NULL)
4645 goto ext_call_fail;
4646 }
4647 callargs = update_star_args(na, nstar, stararg, pp_stack);
4648 if (callargs == NULL)
4649 goto ext_call_fail;
Jeremy Hylton985eba52003-02-05 23:13:00 +00004650#ifdef CALL_PROFILE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004651 /* At this point, we have to look at the type of func to
4652 update the call stats properly. Do it here so as to avoid
4653 exposing the call stats machinery outside ceval.c
4654 */
4655 if (PyFunction_Check(func))
4656 PCALL(PCALL_FUNCTION);
4657 else if (PyMethod_Check(func))
4658 PCALL(PCALL_METHOD);
4659 else if (PyType_Check(func))
4660 PCALL(PCALL_TYPE);
4661 else if (PyCFunction_Check(func))
4662 PCALL(PCALL_CFUNCTION);
4663 else
4664 PCALL(PCALL_OTHER);
Jeremy Hylton985eba52003-02-05 23:13:00 +00004665#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004666 if (PyCFunction_Check(func)) {
4667 PyThreadState *tstate = PyThreadState_GET();
4668 C_TRACE(result, PyCFunction_Call(func, callargs, kwdict));
4669 }
4670 else
4671 result = PyObject_Call(func, callargs, kwdict);
Thomas Woutersae406c62007-09-19 17:27:43 +00004672ext_call_fail:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004673 Py_XDECREF(callargs);
4674 Py_XDECREF(kwdict);
4675 Py_XDECREF(stararg);
4676 return result;
Jeremy Hylton52820442001-01-03 23:52:36 +00004677}
4678
Guido van Rossum38fff8c2006-03-07 18:50:55 +00004679/* Extract a slice index from a PyInt or PyLong or an object with the
4680 nb_index slot defined, and store in *pi.
4681 Silently reduce values larger than PY_SSIZE_T_MAX to PY_SSIZE_T_MAX,
4682 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 +00004683 Return 0 on error, 1 on success.
Tim Peterscb479e72001-12-16 19:11:44 +00004684*/
Tim Petersb5196382001-12-16 19:44:20 +00004685/* Note: If v is NULL, return success without storing into *pi. This
4686 is because_PyEval_SliceIndex() is called by apply_slice(), which can be
4687 called by the SLICE opcode with v and/or w equal to NULL.
Tim Peterscb479e72001-12-16 19:11:44 +00004688*/
Guido van Rossum20c6add2000-05-08 14:06:50 +00004689int
Martin v. Löwis18e16552006-02-15 17:27:45 +00004690_PyEval_SliceIndex(PyObject *v, Py_ssize_t *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004691{
Serhiy Storchaka079f21f2017-03-30 20:32:18 +03004692 if (v != NULL && v != Py_None) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004693 Py_ssize_t x;
4694 if (PyInt_Check(v)) {
4695 /* XXX(nnorwitz): I think PyInt_AS_LONG is correct,
4696 however, it looks like it should be AsSsize_t.
4697 There should be a comment here explaining why.
4698 */
4699 x = PyInt_AS_LONG(v);
4700 }
4701 else if (PyIndex_Check(v)) {
4702 x = PyNumber_AsSsize_t(v, NULL);
4703 if (x == -1 && PyErr_Occurred())
4704 return 0;
4705 }
4706 else {
4707 PyErr_SetString(PyExc_TypeError,
4708 "slice indices must be integers or "
4709 "None or have an __index__ method");
4710 return 0;
4711 }
4712 *pi = x;
4713 }
4714 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004715}
4716
Serhiy Storchaka079f21f2017-03-30 20:32:18 +03004717int
4718_PyEval_SliceIndexNotNone(PyObject *v, Py_ssize_t *pi)
4719{
4720 Py_ssize_t x;
4721 if (PyIndex_Check(v)) {
4722 x = PyNumber_AsSsize_t(v, NULL);
4723 if (x == -1 && PyErr_Occurred())
4724 return 0;
4725 }
4726 else {
4727 PyErr_SetString(PyExc_TypeError,
4728 "slice indices must be integers or "
4729 "have an __index__ method");
4730 return 0;
4731 }
4732 *pi = x;
4733 return 1;
4734}
4735
4736
Guido van Rossum38fff8c2006-03-07 18:50:55 +00004737#undef ISINDEX
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00004738#define ISINDEX(x) ((x) == NULL || \
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004739 PyInt_Check(x) || PyLong_Check(x) || PyIndex_Check(x))
Guido van Rossum50d756e2001-08-18 17:43:36 +00004740
Fredrik Lundh7a830892006-05-27 10:39:48 +00004741static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004742apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004743{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004744 PyTypeObject *tp = u->ob_type;
4745 PySequenceMethods *sq = tp->tp_as_sequence;
Guido van Rossum50d756e2001-08-18 17:43:36 +00004746
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004747 if (sq && sq->sq_slice && ISINDEX(v) && ISINDEX(w)) {
4748 Py_ssize_t ilow = 0, ihigh = PY_SSIZE_T_MAX;
4749 if (!_PyEval_SliceIndex(v, &ilow))
4750 return NULL;
4751 if (!_PyEval_SliceIndex(w, &ihigh))
4752 return NULL;
4753 return PySequence_GetSlice(u, ilow, ihigh);
4754 }
4755 else {
4756 PyObject *slice = PySlice_New(v, w, NULL);
4757 if (slice != NULL) {
4758 PyObject *res = PyObject_GetItem(u, slice);
4759 Py_DECREF(slice);
4760 return res;
4761 }
4762 else
4763 return NULL;
4764 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004765}
Guido van Rossum3f5da241990-12-20 15:06:42 +00004766
Fredrik Lundh7a830892006-05-27 10:39:48 +00004767static int
Guido van Rossumac7be682001-01-17 15:42:30 +00004768assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004769 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004770{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004771 PyTypeObject *tp = u->ob_type;
4772 PySequenceMethods *sq = tp->tp_as_sequence;
Guido van Rossum50d756e2001-08-18 17:43:36 +00004773
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004774 if (sq && sq->sq_ass_slice && ISINDEX(v) && ISINDEX(w)) {
4775 Py_ssize_t ilow = 0, ihigh = PY_SSIZE_T_MAX;
4776 if (!_PyEval_SliceIndex(v, &ilow))
4777 return -1;
4778 if (!_PyEval_SliceIndex(w, &ihigh))
4779 return -1;
4780 if (x == NULL)
4781 return PySequence_DelSlice(u, ilow, ihigh);
4782 else
4783 return PySequence_SetSlice(u, ilow, ihigh, x);
4784 }
4785 else {
4786 PyObject *slice = PySlice_New(v, w, NULL);
4787 if (slice != NULL) {
4788 int res;
4789 if (x != NULL)
4790 res = PyObject_SetItem(u, slice, x);
4791 else
4792 res = PyObject_DelItem(u, slice);
4793 Py_DECREF(slice);
4794 return res;
4795 }
4796 else
4797 return -1;
4798 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004799}
4800
Guido van Rossum04edb522008-03-18 02:49:46 +00004801#define Py3kExceptionClass_Check(x) \
4802 (PyType_Check((x)) && \
4803 PyType_FastSubclass((PyTypeObject*)(x), Py_TPFLAGS_BASE_EXC_SUBCLASS))
4804
4805#define CANNOT_CATCH_MSG "catching classes that don't inherit from " \
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004806 "BaseException is not allowed in 3.x"
Guido van Rossum04edb522008-03-18 02:49:46 +00004807
Fredrik Lundh7a830892006-05-27 10:39:48 +00004808static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004809cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004810{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004811 int res = 0;
4812 switch (op) {
4813 case PyCmp_IS:
4814 res = (v == w);
4815 break;
4816 case PyCmp_IS_NOT:
4817 res = (v != w);
4818 break;
4819 case PyCmp_IN:
4820 res = PySequence_Contains(w, v);
4821 if (res < 0)
4822 return NULL;
4823 break;
4824 case PyCmp_NOT_IN:
4825 res = PySequence_Contains(w, v);
4826 if (res < 0)
4827 return NULL;
4828 res = !res;
4829 break;
4830 case PyCmp_EXC_MATCH:
4831 if (PyTuple_Check(w)) {
4832 Py_ssize_t i, length;
4833 length = PyTuple_Size(w);
4834 for (i = 0; i < length; i += 1) {
4835 PyObject *exc = PyTuple_GET_ITEM(w, i);
4836 if (PyString_Check(exc)) {
4837 int ret_val;
4838 ret_val = PyErr_WarnEx(
4839 PyExc_DeprecationWarning,
4840 "catching of string "
4841 "exceptions is deprecated", 1);
4842 if (ret_val < 0)
4843 return NULL;
4844 }
4845 else if (Py_Py3kWarningFlag &&
4846 !PyTuple_Check(exc) &&
4847 !Py3kExceptionClass_Check(exc))
4848 {
4849 int ret_val;
4850 ret_val = PyErr_WarnEx(
4851 PyExc_DeprecationWarning,
4852 CANNOT_CATCH_MSG, 1);
4853 if (ret_val < 0)
4854 return NULL;
4855 }
4856 }
4857 }
4858 else {
4859 if (PyString_Check(w)) {
4860 int ret_val;
4861 ret_val = PyErr_WarnEx(
4862 PyExc_DeprecationWarning,
4863 "catching of string "
4864 "exceptions is deprecated", 1);
4865 if (ret_val < 0)
4866 return NULL;
4867 }
4868 else if (Py_Py3kWarningFlag &&
4869 !PyTuple_Check(w) &&
4870 !Py3kExceptionClass_Check(w))
4871 {
4872 int ret_val;
4873 ret_val = PyErr_WarnEx(
4874 PyExc_DeprecationWarning,
4875 CANNOT_CATCH_MSG, 1);
4876 if (ret_val < 0)
4877 return NULL;
4878 }
4879 }
4880 res = PyErr_GivenExceptionMatches(v, w);
4881 break;
4882 default:
4883 return PyObject_RichCompare(v, w, op);
4884 }
4885 v = res ? Py_True : Py_False;
4886 Py_INCREF(v);
4887 return v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004888}
4889
Fredrik Lundh7a830892006-05-27 10:39:48 +00004890static PyObject *
Thomas Wouters52152252000-08-17 22:55:00 +00004891import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00004892{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004893 PyObject *x;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00004894
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004895 x = PyObject_GetAttr(v, name);
4896 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
4897 PyErr_Format(PyExc_ImportError,
4898 "cannot import name %.230s",
4899 PyString_AsString(name));
4900 }
4901 return x;
Thomas Wouters52152252000-08-17 22:55:00 +00004902}
Guido van Rossumac7be682001-01-17 15:42:30 +00004903
Fredrik Lundh7a830892006-05-27 10:39:48 +00004904static int
Thomas Wouters52152252000-08-17 22:55:00 +00004905import_all_from(PyObject *locals, PyObject *v)
4906{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004907 PyObject *all = PyObject_GetAttrString(v, "__all__");
4908 PyObject *dict, *name, *value;
4909 int skip_leading_underscores = 0;
4910 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00004911
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004912 if (all == NULL) {
4913 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
4914 return -1; /* Unexpected error */
4915 PyErr_Clear();
4916 dict = PyObject_GetAttrString(v, "__dict__");
4917 if (dict == NULL) {
4918 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
4919 return -1;
4920 PyErr_SetString(PyExc_ImportError,
4921 "from-import-* object has no __dict__ and no __all__");
4922 return -1;
4923 }
4924 all = PyMapping_Keys(dict);
4925 Py_DECREF(dict);
4926 if (all == NULL)
4927 return -1;
4928 skip_leading_underscores = 1;
4929 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00004930
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004931 for (pos = 0, err = 0; ; pos++) {
4932 name = PySequence_GetItem(all, pos);
4933 if (name == NULL) {
4934 if (!PyErr_ExceptionMatches(PyExc_IndexError))
4935 err = -1;
4936 else
4937 PyErr_Clear();
4938 break;
4939 }
4940 if (skip_leading_underscores &&
4941 PyString_Check(name) &&
4942 PyString_AS_STRING(name)[0] == '_')
4943 {
4944 Py_DECREF(name);
4945 continue;
4946 }
4947 value = PyObject_GetAttr(v, name);
4948 if (value == NULL)
4949 err = -1;
4950 else if (PyDict_CheckExact(locals))
4951 err = PyDict_SetItem(locals, name, value);
4952 else
4953 err = PyObject_SetItem(locals, name, value);
4954 Py_DECREF(name);
4955 Py_XDECREF(value);
4956 if (err != 0)
4957 break;
4958 }
4959 Py_DECREF(all);
4960 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00004961}
4962
Fredrik Lundh7a830892006-05-27 10:39:48 +00004963static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004964build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00004965{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004966 PyObject *metaclass = NULL, *result, *base;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004967
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004968 if (PyDict_Check(methods))
4969 metaclass = PyDict_GetItemString(methods, "__metaclass__");
4970 if (metaclass != NULL)
4971 Py_INCREF(metaclass);
4972 else if (PyTuple_Check(bases) && PyTuple_GET_SIZE(bases) > 0) {
4973 base = PyTuple_GET_ITEM(bases, 0);
4974 metaclass = PyObject_GetAttrString(base, "__class__");
4975 if (metaclass == NULL) {
4976 PyErr_Clear();
4977 metaclass = (PyObject *)base->ob_type;
4978 Py_INCREF(metaclass);
4979 }
4980 }
4981 else {
4982 PyObject *g = PyEval_GetGlobals();
4983 if (g != NULL && PyDict_Check(g))
4984 metaclass = PyDict_GetItemString(g, "__metaclass__");
4985 if (metaclass == NULL)
4986 metaclass = (PyObject *) &PyClass_Type;
4987 Py_INCREF(metaclass);
4988 }
4989 result = PyObject_CallFunctionObjArgs(metaclass, name, bases, methods,
4990 NULL);
4991 Py_DECREF(metaclass);
4992 if (result == NULL && PyErr_ExceptionMatches(PyExc_TypeError)) {
4993 /* A type error here likely means that the user passed
4994 in a base that was not a class (such the random module
4995 instead of the random.random type). Help them out with
4996 by augmenting the error message with more information.*/
Raymond Hettingercfc31922004-09-16 16:41:57 +00004997
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004998 PyObject *ptype, *pvalue, *ptraceback;
Raymond Hettingercfc31922004-09-16 16:41:57 +00004999
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005000 PyErr_Fetch(&ptype, &pvalue, &ptraceback);
5001 if (PyString_Check(pvalue)) {
5002 PyObject *newmsg;
5003 newmsg = PyString_FromFormat(
5004 "Error when calling the metaclass bases\n"
5005 " %s",
5006 PyString_AS_STRING(pvalue));
5007 if (newmsg != NULL) {
5008 Py_DECREF(pvalue);
5009 pvalue = newmsg;
5010 }
5011 }
5012 PyErr_Restore(ptype, pvalue, ptraceback);
5013 }
5014 return result;
Guido van Rossum25831651993-05-19 14:50:45 +00005015}
5016
Fredrik Lundh7a830892006-05-27 10:39:48 +00005017static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005018exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005019 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00005020{
Benjamin Petersond2903bd2014-08-09 19:39:36 -07005021 int n;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005022 PyObject *v;
5023 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00005024
Benjamin Petersond2903bd2014-08-09 19:39:36 -07005025 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
5026 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
5027 /* Backward compatibility hack */
5028 globals = PyTuple_GetItem(prog, 1);
5029 if (n == 3)
5030 locals = PyTuple_GetItem(prog, 2);
5031 prog = PyTuple_GetItem(prog, 0);
5032 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005033 if (globals == Py_None) {
5034 globals = PyEval_GetGlobals();
5035 if (locals == Py_None) {
5036 locals = PyEval_GetLocals();
5037 plain = 1;
5038 }
5039 if (!globals || !locals) {
5040 PyErr_SetString(PyExc_SystemError,
5041 "globals and locals cannot be NULL");
5042 return -1;
5043 }
5044 }
5045 else if (locals == Py_None)
5046 locals = globals;
5047 if (!PyString_Check(prog) &&
Benjamin Peterson78821dd2009-01-25 17:15:10 +00005048#ifdef Py_USING_UNICODE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005049 !PyUnicode_Check(prog) &&
Benjamin Peterson78821dd2009-01-25 17:15:10 +00005050#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005051 !PyCode_Check(prog) &&
5052 !PyFile_Check(prog)) {
5053 PyErr_SetString(PyExc_TypeError,
5054 "exec: arg 1 must be a string, file, or code object");
5055 return -1;
5056 }
5057 if (!PyDict_Check(globals)) {
5058 PyErr_SetString(PyExc_TypeError,
5059 "exec: arg 2 must be a dictionary or None");
5060 return -1;
5061 }
5062 if (!PyMapping_Check(locals)) {
5063 PyErr_SetString(PyExc_TypeError,
5064 "exec: arg 3 must be a mapping or None");
5065 return -1;
5066 }
5067 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
5068 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
5069 if (PyCode_Check(prog)) {
5070 if (PyCode_GetNumFree((PyCodeObject *)prog) > 0) {
5071 PyErr_SetString(PyExc_TypeError,
5072 "code object passed to exec may not contain free variables");
5073 return -1;
5074 }
5075 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
5076 }
5077 else if (PyFile_Check(prog)) {
5078 FILE *fp = PyFile_AsFile(prog);
5079 char *name = PyString_AsString(PyFile_Name(prog));
5080 PyCompilerFlags cf;
5081 if (name == NULL)
5082 return -1;
5083 cf.cf_flags = 0;
5084 if (PyEval_MergeCompilerFlags(&cf))
5085 v = PyRun_FileFlags(fp, name, Py_file_input, globals,
5086 locals, &cf);
5087 else
5088 v = PyRun_File(fp, name, Py_file_input, globals,
5089 locals);
5090 }
5091 else {
5092 PyObject *tmp = NULL;
5093 char *str;
5094 PyCompilerFlags cf;
5095 cf.cf_flags = 0;
Just van Rossum3aaf42c2003-02-10 08:21:10 +00005096#ifdef Py_USING_UNICODE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005097 if (PyUnicode_Check(prog)) {
5098 tmp = PyUnicode_AsUTF8String(prog);
5099 if (tmp == NULL)
5100 return -1;
5101 prog = tmp;
5102 cf.cf_flags |= PyCF_SOURCE_IS_UTF8;
5103 }
Just van Rossum3aaf42c2003-02-10 08:21:10 +00005104#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005105 if (PyString_AsStringAndSize(prog, &str, NULL))
5106 return -1;
5107 if (PyEval_MergeCompilerFlags(&cf))
5108 v = PyRun_StringFlags(str, Py_file_input, globals,
5109 locals, &cf);
5110 else
5111 v = PyRun_String(str, Py_file_input, globals, locals);
5112 Py_XDECREF(tmp);
5113 }
5114 if (plain)
5115 PyFrame_LocalsToFast(f, 0);
5116 if (v == NULL)
5117 return -1;
5118 Py_DECREF(v);
5119 return 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00005120}
Guido van Rossum24c13741995-02-14 09:42:43 +00005121
Fredrik Lundh7a830892006-05-27 10:39:48 +00005122static void
Paul Prescode68140d2000-08-30 20:25:01 +00005123format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
5124{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005125 char *obj_str;
Paul Prescode68140d2000-08-30 20:25:01 +00005126
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005127 if (!obj)
5128 return;
Paul Prescode68140d2000-08-30 20:25:01 +00005129
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005130 obj_str = PyString_AsString(obj);
5131 if (!obj_str)
5132 return;
Paul Prescode68140d2000-08-30 20:25:01 +00005133
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005134 PyErr_Format(exc, format_str, obj_str);
Paul Prescode68140d2000-08-30 20:25:01 +00005135}
Guido van Rossum950361c1997-01-24 13:49:28 +00005136
Fredrik Lundh7a830892006-05-27 10:39:48 +00005137static PyObject *
Raymond Hettinger52a21b82004-08-06 18:43:09 +00005138string_concatenate(PyObject *v, PyObject *w,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005139 PyFrameObject *f, unsigned char *next_instr)
Raymond Hettinger52a21b82004-08-06 18:43:09 +00005140{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005141 /* This function implements 'variable += expr' when both arguments
5142 are strings. */
5143 Py_ssize_t v_len = PyString_GET_SIZE(v);
5144 Py_ssize_t w_len = PyString_GET_SIZE(w);
5145 Py_ssize_t new_len = v_len + w_len;
5146 if (new_len < 0) {
5147 PyErr_SetString(PyExc_OverflowError,
5148 "strings are too large to concat");
5149 return NULL;
5150 }
Tim Peters7df5e7f2006-05-26 23:14:37 +00005151
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005152 if (v->ob_refcnt == 2) {
5153 /* In the common case, there are 2 references to the value
5154 * stored in 'variable' when the += is performed: one on the
5155 * value stack (in 'v') and one still stored in the
5156 * 'variable'. We try to delete the variable now to reduce
5157 * the refcnt to 1.
5158 */
5159 switch (*next_instr) {
5160 case STORE_FAST:
5161 {
5162 int oparg = PEEKARG();
5163 PyObject **fastlocals = f->f_localsplus;
5164 if (GETLOCAL(oparg) == v)
5165 SETLOCAL(oparg, NULL);
5166 break;
5167 }
5168 case STORE_DEREF:
5169 {
5170 PyObject **freevars = (f->f_localsplus +
5171 f->f_code->co_nlocals);
5172 PyObject *c = freevars[PEEKARG()];
5173 if (PyCell_GET(c) == v)
5174 PyCell_Set(c, NULL);
5175 break;
5176 }
5177 case STORE_NAME:
5178 {
5179 PyObject *names = f->f_code->co_names;
5180 PyObject *name = GETITEM(names, PEEKARG());
5181 PyObject *locals = f->f_locals;
5182 if (PyDict_CheckExact(locals) &&
5183 PyDict_GetItem(locals, name) == v) {
5184 if (PyDict_DelItem(locals, name) != 0) {
5185 PyErr_Clear();
5186 }
5187 }
5188 break;
5189 }
5190 }
5191 }
Raymond Hettinger52a21b82004-08-06 18:43:09 +00005192
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005193 if (v->ob_refcnt == 1 && !PyString_CHECK_INTERNED(v)) {
5194 /* Now we own the last reference to 'v', so we can resize it
5195 * in-place.
5196 */
5197 if (_PyString_Resize(&v, new_len) != 0) {
5198 /* XXX if _PyString_Resize() fails, 'v' has been
5199 * deallocated so it cannot be put back into
5200 * 'variable'. The MemoryError is raised when there
5201 * is no value in 'variable', which might (very
5202 * remotely) be a cause of incompatibilities.
5203 */
5204 return NULL;
5205 }
5206 /* copy 'w' into the newly allocated area of 'v' */
5207 memcpy(PyString_AS_STRING(v) + v_len,
5208 PyString_AS_STRING(w), w_len);
5209 return v;
5210 }
5211 else {
5212 /* When in-place resizing is not an option. */
5213 PyString_Concat(&v, w);
5214 return v;
5215 }
Raymond Hettinger52a21b82004-08-06 18:43:09 +00005216}
5217
Guido van Rossum950361c1997-01-24 13:49:28 +00005218#ifdef DYNAMIC_EXECUTION_PROFILE
5219
Fredrik Lundh7a830892006-05-27 10:39:48 +00005220static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005221getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00005222{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005223 int i;
5224 PyObject *l = PyList_New(256);
5225 if (l == NULL) return NULL;
5226 for (i = 0; i < 256; i++) {
5227 PyObject *x = PyInt_FromLong(a[i]);
5228 if (x == NULL) {
5229 Py_DECREF(l);
5230 return NULL;
5231 }
5232 PyList_SetItem(l, i, x);
5233 }
5234 for (i = 0; i < 256; i++)
5235 a[i] = 0;
5236 return l;
Guido van Rossum950361c1997-01-24 13:49:28 +00005237}
5238
5239PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005240_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00005241{
5242#ifndef DXPAIRS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005243 return getarray(dxp);
Guido van Rossum950361c1997-01-24 13:49:28 +00005244#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005245 int i;
5246 PyObject *l = PyList_New(257);
5247 if (l == NULL) return NULL;
5248 for (i = 0; i < 257; i++) {
5249 PyObject *x = getarray(dxpairs[i]);
5250 if (x == NULL) {
5251 Py_DECREF(l);
5252 return NULL;
5253 }
5254 PyList_SetItem(l, i, x);
5255 }
5256 return l;
Guido van Rossum950361c1997-01-24 13:49:28 +00005257#endif
5258}
5259
5260#endif