blob: e8931c88820d52269dfaa0d76eae0383d57e0ef6 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum3f5da241990-12-20 15:06:42 +00002/* Execute compiled code */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003
Guido van Rossum681d79a1995-07-18 14:51:37 +00004/* XXX TO DO:
Guido van Rossum681d79a1995-07-18 14:51:37 +00005 XXX speed up searching for keywords by using a dictionary
Guido van Rossum681d79a1995-07-18 14:51:37 +00006 XXX document it!
7 */
8
Thomas Wouters477c8d52006-05-27 19:21:47 +00009/* enable more aggressive intra-module optimizations, where available */
10#define PY_LOCAL_AGGRESSIVE
11
Guido van Rossumb209a111997-04-29 18:18:01 +000012#include "Python.h"
Victor Stinner4d231bc2019-11-14 13:36:21 +010013#include "pycore_call.h"
Victor Stinner09532fe2019-05-10 23:39:09 +020014#include "pycore_ceval.h"
Inada Naoki91234a12019-06-03 21:30:58 +090015#include "pycore_code.h"
Victor Stinnerbcda8f12018-11-21 22:27:47 +010016#include "pycore_object.h"
Victor Stinner438a12d2019-05-24 17:01:38 +020017#include "pycore_pyerrors.h"
18#include "pycore_pylifecycle.h"
Victor Stinner621cebe2018-11-12 16:53:38 +010019#include "pycore_pystate.h"
Victor Stinnerec13b932018-11-25 23:56:17 +010020#include "pycore_tupleobject.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000021
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000022#include "code.h"
Benjamin Peterson025e9eb2015-05-05 20:16:41 -040023#include "dictobject.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000024#include "frameobject.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000025#include "opcode.h"
Łukasz Langaa785c872016-09-09 17:37:37 -070026#include "pydtrace.h"
Benjamin Peterson025e9eb2015-05-05 20:16:41 -040027#include "setobject.h"
Tim Peters6d6c1a32001-08-02 04:15:00 +000028#include "structmember.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000029
Guido van Rossumc6004111993-11-05 10:22:19 +000030#include <ctype.h>
31
Guido van Rossum408027e1996-12-30 16:17:54 +000032#ifdef Py_DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000033/* For debugging the interpreter: */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000034#define LLTRACE 1 /* Low-level trace feature */
35#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000036#endif
37
Victor Stinner5c75f372019-04-17 23:02:26 +020038#if !defined(Py_BUILD_CORE)
39# error "ceval.c must be build with Py_BUILD_CORE define for best performance"
40#endif
41
Guido van Rossum5b722181993-03-30 17:46:03 +000042
Guido van Rossum374a9221991-04-04 10:40:29 +000043/* Forward declarations */
Victor Stinner09532fe2019-05-10 23:39:09 +020044Py_LOCAL_INLINE(PyObject *) call_function(
45 PyThreadState *tstate, PyObject ***pp_stack,
46 Py_ssize_t oparg, PyObject *kwnames);
47static PyObject * do_call_core(
48 PyThreadState *tstate, PyObject *func,
49 PyObject *callargs, PyObject *kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +000050
Guido van Rossum0a066c01992-03-27 17:29:15 +000051#ifdef LLTRACE
Guido van Rossumc2e20742006-02-27 22:32:47 +000052static int lltrace;
Victor Stinner438a12d2019-05-24 17:01:38 +020053static int prtrace(PyThreadState *, PyObject *, const char *);
Guido van Rossum0a066c01992-03-27 17:29:15 +000054#endif
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +010055static int call_trace(Py_tracefunc, PyObject *,
56 PyThreadState *, PyFrameObject *,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000057 int, PyObject *);
Amaury Forgeot d'Arcf05149a2007-11-13 01:05:30 +000058static int call_trace_protected(Py_tracefunc, PyObject *,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +010059 PyThreadState *, PyFrameObject *,
60 int, PyObject *);
61static void call_exc_trace(Py_tracefunc, PyObject *,
62 PyThreadState *, PyFrameObject *);
Tim Peters8a5c3c72004-04-05 19:36:21 +000063static int maybe_call_line_trace(Py_tracefunc, PyObject *,
Eric Snow2ebc5ce2017-09-07 23:51:28 -060064 PyThreadState *, PyFrameObject *,
65 int *, int *, int *);
Łukasz Langaa785c872016-09-09 17:37:37 -070066static void maybe_dtrace_line(PyFrameObject *, int *, int *, int *);
67static void dtrace_function_entry(PyFrameObject *);
68static void dtrace_function_return(PyFrameObject *);
Michael W. Hudsondd32a912002-08-15 14:59:02 +000069
Victor Stinner438a12d2019-05-24 17:01:38 +020070static PyObject * cmp_outcome(PyThreadState *, int, PyObject *, PyObject *);
71static PyObject * import_name(PyThreadState *, PyFrameObject *,
72 PyObject *, PyObject *, PyObject *);
73static PyObject * import_from(PyThreadState *, PyObject *, PyObject *);
74static int import_all_from(PyThreadState *, PyObject *, PyObject *);
75static void format_exc_check_arg(PyThreadState *, PyObject *, const char *, PyObject *);
76static void format_exc_unbound(PyThreadState *tstate, PyCodeObject *co, int oparg);
77static PyObject * unicode_concatenate(PyThreadState *, PyObject *, PyObject *,
Serhiy Storchakaab874002016-09-11 13:48:15 +030078 PyFrameObject *, const _Py_CODEUNIT *);
Victor Stinner438a12d2019-05-24 17:01:38 +020079static PyObject * special_lookup(PyThreadState *, PyObject *, _Py_Identifier *);
80static int check_args_iterable(PyThreadState *, PyObject *func, PyObject *vararg);
81static void format_kwargs_error(PyThreadState *, PyObject *func, PyObject *kwargs);
Mark Shannonfee55262019-11-21 09:11:43 +000082static void format_awaitable_error(PyThreadState *, PyTypeObject *, int, int);
Guido van Rossum374a9221991-04-04 10:40:29 +000083
Paul Prescode68140d2000-08-30 20:25:01 +000084#define NAME_ERROR_MSG \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000085 "name '%.200s' is not defined"
Paul Prescode68140d2000-08-30 20:25:01 +000086#define UNBOUNDLOCAL_ERROR_MSG \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000087 "local variable '%.200s' referenced before assignment"
Jeremy Hyltonc76770c2001-04-13 16:51:46 +000088#define UNBOUNDFREE_ERROR_MSG \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000089 "free variable '%.200s' referenced before assignment" \
90 " in enclosing scope"
Guido van Rossum374a9221991-04-04 10:40:29 +000091
Guido van Rossum950361c1997-01-24 13:49:28 +000092/* Dynamic execution profile */
93#ifdef DYNAMIC_EXECUTION_PROFILE
94#ifdef DXPAIRS
95static long dxpairs[257][256];
96#define dxp dxpairs[256]
97#else
98static long dxp[256];
99#endif
100#endif
101
Inada Naoki91234a12019-06-03 21:30:58 +0900102/* per opcode cache */
Inada Naokieddef862019-06-04 07:38:10 +0900103#ifdef Py_DEBUG
104// --with-pydebug is used to find memory leak. opcache makes it harder.
105// So we disable opcache when Py_DEBUG is defined.
106// See bpo-37146
107#define OPCACHE_MIN_RUNS 0 /* disable opcache */
108#else
Inada Naoki91234a12019-06-03 21:30:58 +0900109#define OPCACHE_MIN_RUNS 1024 /* create opcache when code executed this time */
Inada Naokieddef862019-06-04 07:38:10 +0900110#endif
Inada Naoki91234a12019-06-03 21:30:58 +0900111#define OPCACHE_STATS 0 /* Enable stats */
112
113#if OPCACHE_STATS
114static size_t opcache_code_objects = 0;
115static size_t opcache_code_objects_extra_mem = 0;
116
117static size_t opcache_global_opts = 0;
118static size_t opcache_global_hits = 0;
119static size_t opcache_global_misses = 0;
120#endif
121
Victor Stinnere225beb2019-06-03 18:14:24 +0200122#define GIL_REQUEST _Py_atomic_load_relaxed(&ceval->gil_drop_request)
Inada Naoki91234a12019-06-03 21:30:58 +0900123
Jeffrey Yasskin39370832010-05-03 19:29:34 +0000124/* This can set eval_breaker to 0 even though gil_drop_request became
125 1. We believe this is all right because the eval loop will release
126 the GIL eventually anyway. */
Victor Stinnere225beb2019-06-03 18:14:24 +0200127#define COMPUTE_EVAL_BREAKER(ceval) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000128 _Py_atomic_store_relaxed( \
Victor Stinnere225beb2019-06-03 18:14:24 +0200129 &(ceval)->eval_breaker, \
130 GIL_REQUEST | \
131 _Py_atomic_load_relaxed(&(ceval)->signals_pending) | \
132 _Py_atomic_load_relaxed(&(ceval)->pending.calls_to_do) | \
133 (ceval)->pending.async_exc)
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000134
Victor Stinnere225beb2019-06-03 18:14:24 +0200135#define SET_GIL_DROP_REQUEST(ceval) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000136 do { \
Victor Stinnere225beb2019-06-03 18:14:24 +0200137 _Py_atomic_store_relaxed(&(ceval)->gil_drop_request, 1); \
138 _Py_atomic_store_relaxed(&(ceval)->eval_breaker, 1); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000139 } while (0)
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000140
Victor Stinnere225beb2019-06-03 18:14:24 +0200141#define RESET_GIL_DROP_REQUEST(ceval) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000142 do { \
Victor Stinnere225beb2019-06-03 18:14:24 +0200143 _Py_atomic_store_relaxed(&(ceval)->gil_drop_request, 0); \
144 COMPUTE_EVAL_BREAKER(ceval); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000145 } while (0)
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000146
Jeffrey Yasskin39370832010-05-03 19:29:34 +0000147/* Pending calls are only modified under pending_lock */
Victor Stinnere225beb2019-06-03 18:14:24 +0200148#define SIGNAL_PENDING_CALLS(ceval) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000149 do { \
Victor Stinnere225beb2019-06-03 18:14:24 +0200150 _Py_atomic_store_relaxed(&(ceval)->pending.calls_to_do, 1); \
151 _Py_atomic_store_relaxed(&(ceval)->eval_breaker, 1); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000152 } while (0)
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000153
Victor Stinnere225beb2019-06-03 18:14:24 +0200154#define UNSIGNAL_PENDING_CALLS(ceval) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000155 do { \
Victor Stinnere225beb2019-06-03 18:14:24 +0200156 _Py_atomic_store_relaxed(&(ceval)->pending.calls_to_do, 0); \
157 COMPUTE_EVAL_BREAKER(ceval); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000158 } while (0)
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000159
Victor Stinnere225beb2019-06-03 18:14:24 +0200160#define SIGNAL_PENDING_SIGNALS(ceval) \
Eric Snowfdf282d2019-01-11 14:26:55 -0700161 do { \
Victor Stinnere225beb2019-06-03 18:14:24 +0200162 _Py_atomic_store_relaxed(&(ceval)->signals_pending, 1); \
163 _Py_atomic_store_relaxed(&(ceval)->eval_breaker, 1); \
Eric Snowfdf282d2019-01-11 14:26:55 -0700164 } while (0)
165
Victor Stinnere225beb2019-06-03 18:14:24 +0200166#define UNSIGNAL_PENDING_SIGNALS(ceval) \
Eric Snowfdf282d2019-01-11 14:26:55 -0700167 do { \
Victor Stinnere225beb2019-06-03 18:14:24 +0200168 _Py_atomic_store_relaxed(&(ceval)->signals_pending, 0); \
169 COMPUTE_EVAL_BREAKER(ceval); \
Eric Snowfdf282d2019-01-11 14:26:55 -0700170 } while (0)
171
Victor Stinnere225beb2019-06-03 18:14:24 +0200172#define SIGNAL_ASYNC_EXC(ceval) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000173 do { \
Victor Stinnere225beb2019-06-03 18:14:24 +0200174 (ceval)->pending.async_exc = 1; \
175 _Py_atomic_store_relaxed(&(ceval)->eval_breaker, 1); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000176 } while (0)
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000177
Victor Stinnere225beb2019-06-03 18:14:24 +0200178#define UNSIGNAL_ASYNC_EXC(ceval) \
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600179 do { \
Victor Stinnere225beb2019-06-03 18:14:24 +0200180 (ceval)->pending.async_exc = 0; \
181 COMPUTE_EVAL_BREAKER(ceval); \
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600182 } while (0)
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000183
184
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000185#ifdef HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000186#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +0000187#endif
Guido van Rossum49b56061998-10-01 20:42:43 +0000188#include "pythread.h"
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000189#include "ceval_gil.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000190
Tim Peters7f468f22004-10-11 02:40:51 +0000191int
192PyEval_ThreadsInitialized(void)
193{
Victor Stinner01b1cc12019-11-20 02:27:56 +0100194 _PyRuntimeState *runtime = &_PyRuntime;
195 return gil_created(&runtime->ceval.gil);
Tim Peters7f468f22004-10-11 02:40:51 +0000196}
197
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000198void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000199PyEval_InitThreads(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000200{
Victor Stinner09532fe2019-05-10 23:39:09 +0200201 _PyRuntimeState *runtime = &_PyRuntime;
Victor Stinnere225beb2019-06-03 18:14:24 +0200202 struct _ceval_runtime_state *ceval = &runtime->ceval;
203 struct _gil_runtime_state *gil = &ceval->gil;
Victor Stinner09532fe2019-05-10 23:39:09 +0200204 if (gil_created(gil)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000205 return;
Victor Stinnera7126792019-03-19 14:19:38 +0100206 }
207
Inada Naoki001fee12019-02-20 10:00:09 +0900208 PyThread_init_thread();
Victor Stinner09532fe2019-05-10 23:39:09 +0200209 create_gil(gil);
210 PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime);
Victor Stinnere225beb2019-06-03 18:14:24 +0200211 take_gil(ceval, tstate);
Eric Snow8479a342019-03-08 23:44:33 -0700212
Victor Stinnere225beb2019-06-03 18:14:24 +0200213 struct _pending_calls *pending = &ceval->pending;
214 pending->lock = PyThread_allocate_lock();
215 if (pending->lock == NULL) {
216 Py_FatalError("Can't initialize threads for pending calls");
217 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000218}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000219
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000220void
Victor Stinnere225beb2019-06-03 18:14:24 +0200221_PyEval_FiniThreads(struct _ceval_runtime_state *ceval)
Antoine Pitrou1df15362010-09-13 14:16:46 +0000222{
Victor Stinnere225beb2019-06-03 18:14:24 +0200223 struct _gil_runtime_state *gil = &ceval->gil;
Victor Stinner09532fe2019-05-10 23:39:09 +0200224 if (!gil_created(gil)) {
Antoine Pitrou1df15362010-09-13 14:16:46 +0000225 return;
Victor Stinnera7126792019-03-19 14:19:38 +0100226 }
227
Victor Stinner09532fe2019-05-10 23:39:09 +0200228 destroy_gil(gil);
229 assert(!gil_created(gil));
Victor Stinner99fcc612019-04-29 13:04:07 +0200230
Victor Stinnere225beb2019-06-03 18:14:24 +0200231 struct _pending_calls *pending = &ceval->pending;
232 if (pending->lock != NULL) {
233 PyThread_free_lock(pending->lock);
234 pending->lock = NULL;
235 }
Antoine Pitrou1df15362010-09-13 14:16:46 +0000236}
237
Joannah Nanjekyef781d202019-04-29 04:38:45 -0400238static inline void
Victor Stinner01b1cc12019-11-20 02:27:56 +0100239exit_thread_if_finalizing(PyThreadState *tstate)
Joannah Nanjekyef781d202019-04-29 04:38:45 -0400240{
Victor Stinner01b1cc12019-11-20 02:27:56 +0100241 _PyRuntimeState *runtime = tstate->interp->runtime;
Victor Stinnere225beb2019-06-03 18:14:24 +0200242 /* _Py_Finalizing is protected by the GIL */
Victor Stinner09532fe2019-05-10 23:39:09 +0200243 if (runtime->finalizing != NULL && !_Py_CURRENTLY_FINALIZING(runtime, tstate)) {
Victor Stinnere225beb2019-06-03 18:14:24 +0200244 drop_gil(&runtime->ceval, tstate);
Joannah Nanjekyef781d202019-04-29 04:38:45 -0400245 PyThread_exit_thread();
Joannah Nanjekyef781d202019-04-29 04:38:45 -0400246 }
247}
248
Antoine Pitrou1df15362010-09-13 14:16:46 +0000249void
Inada Naoki91234a12019-06-03 21:30:58 +0900250_PyEval_Fini(void)
251{
252#if OPCACHE_STATS
253 fprintf(stderr, "-- Opcode cache number of objects = %zd\n",
254 opcache_code_objects);
255
256 fprintf(stderr, "-- Opcode cache total extra mem = %zd\n",
257 opcache_code_objects_extra_mem);
258
259 fprintf(stderr, "\n");
260
261 fprintf(stderr, "-- Opcode cache LOAD_GLOBAL hits = %zd (%d%%)\n",
262 opcache_global_hits,
263 (int) (100.0 * opcache_global_hits /
264 (opcache_global_hits + opcache_global_misses)));
265
266 fprintf(stderr, "-- Opcode cache LOAD_GLOBAL misses = %zd (%d%%)\n",
267 opcache_global_misses,
268 (int) (100.0 * opcache_global_misses /
269 (opcache_global_hits + opcache_global_misses)));
270
271 fprintf(stderr, "-- Opcode cache LOAD_GLOBAL opts = %zd\n",
272 opcache_global_opts);
273
274 fprintf(stderr, "\n");
275#endif
276}
277
278void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000279PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000280{
Victor Stinner09532fe2019-05-10 23:39:09 +0200281 _PyRuntimeState *runtime = &_PyRuntime;
Victor Stinnere225beb2019-06-03 18:14:24 +0200282 struct _ceval_runtime_state *ceval = &runtime->ceval;
Victor Stinner09532fe2019-05-10 23:39:09 +0200283 PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime);
284 if (tstate == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000285 Py_FatalError("PyEval_AcquireLock: current thread state is NULL");
Victor Stinner09532fe2019-05-10 23:39:09 +0200286 }
Victor Stinnere225beb2019-06-03 18:14:24 +0200287 take_gil(ceval, tstate);
Victor Stinner01b1cc12019-11-20 02:27:56 +0100288 exit_thread_if_finalizing(tstate);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000289}
290
291void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000292PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000293{
Victor Stinner09532fe2019-05-10 23:39:09 +0200294 _PyRuntimeState *runtime = &_PyRuntime;
Victor Stinnere225beb2019-06-03 18:14:24 +0200295 PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000296 /* This function must succeed when the current thread state is NULL.
Victor Stinner50b48572018-11-01 01:51:40 +0100297 We therefore avoid PyThreadState_Get() which dumps a fatal error
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000298 in debug mode.
299 */
Victor Stinnere225beb2019-06-03 18:14:24 +0200300 drop_gil(&runtime->ceval, tstate);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000301}
302
303void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000304PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000305{
Victor Stinner09532fe2019-05-10 23:39:09 +0200306 if (tstate == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000307 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
Victor Stinner09532fe2019-05-10 23:39:09 +0200308 }
Victor Stinnere225beb2019-06-03 18:14:24 +0200309
Victor Stinner01b1cc12019-11-20 02:27:56 +0100310 _PyRuntimeState *runtime = tstate->interp->runtime;
Victor Stinnere225beb2019-06-03 18:14:24 +0200311 struct _ceval_runtime_state *ceval = &runtime->ceval;
Victor Stinner09532fe2019-05-10 23:39:09 +0200312
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000313 /* Check someone has called PyEval_InitThreads() to create the lock */
Victor Stinnere225beb2019-06-03 18:14:24 +0200314 assert(gil_created(&ceval->gil));
315 take_gil(ceval, tstate);
Victor Stinner01b1cc12019-11-20 02:27:56 +0100316 exit_thread_if_finalizing(tstate);
Victor Stinner09532fe2019-05-10 23:39:09 +0200317 if (_PyThreadState_Swap(&runtime->gilstate, tstate) != NULL) {
318 Py_FatalError("PyEval_AcquireThread: non-NULL old thread state");
319 }
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000320}
321
322void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000323PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000324{
Victor Stinner09532fe2019-05-10 23:39:09 +0200325 if (tstate == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000326 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
Victor Stinner09532fe2019-05-10 23:39:09 +0200327 }
328
Victor Stinner01b1cc12019-11-20 02:27:56 +0100329 _PyRuntimeState *runtime = tstate->interp->runtime;
Victor Stinner09532fe2019-05-10 23:39:09 +0200330 PyThreadState *new_tstate = _PyThreadState_Swap(&runtime->gilstate, NULL);
331 if (new_tstate != tstate) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000332 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
Victor Stinner09532fe2019-05-10 23:39:09 +0200333 }
Victor Stinnere225beb2019-06-03 18:14:24 +0200334 drop_gil(&runtime->ceval, tstate);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000335}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000336
Antoine Pitrouf7ecfac2017-05-28 11:35:14 +0200337/* This function is called from PyOS_AfterFork_Child to destroy all threads
338 * which are not running in the child process, and clear internal locks
339 * which might be held by those threads.
340 */
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000341
342void
Victor Stinnerd5d9e812019-05-13 12:35:37 +0200343_PyEval_ReInitThreads(_PyRuntimeState *runtime)
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000344{
Victor Stinnere225beb2019-06-03 18:14:24 +0200345 struct _ceval_runtime_state *ceval = &runtime->ceval;
346 if (!gil_created(&ceval->gil)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000347 return;
Victor Stinner09532fe2019-05-10 23:39:09 +0200348 }
Victor Stinnere225beb2019-06-03 18:14:24 +0200349 recreate_gil(&ceval->gil);
Victor Stinner09532fe2019-05-10 23:39:09 +0200350 PyThreadState *current_tstate = _PyRuntimeState_GetThreadState(runtime);
Victor Stinnere225beb2019-06-03 18:14:24 +0200351 take_gil(ceval, current_tstate);
Eric Snow8479a342019-03-08 23:44:33 -0700352
Victor Stinnere225beb2019-06-03 18:14:24 +0200353 struct _pending_calls *pending = &ceval->pending;
Victor Stinner09532fe2019-05-10 23:39:09 +0200354 pending->lock = PyThread_allocate_lock();
355 if (pending->lock == NULL) {
Eric Snow8479a342019-03-08 23:44:33 -0700356 Py_FatalError("Can't initialize threads for pending calls");
357 }
Jesse Nollera8513972008-07-17 16:49:17 +0000358
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200359 /* Destroy all threads except the current one */
Victor Stinner0fd2c302019-06-04 03:15:09 +0200360 _PyThreadState_DeleteExcept(runtime, current_tstate);
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000361}
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000362
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000363/* This function is used to signal that async exceptions are waiting to be
Zackery Spytzeef05962018-09-29 10:07:11 -0600364 raised. */
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000365
366void
Victor Stinnere225beb2019-06-03 18:14:24 +0200367_PyEval_SignalAsyncExc(struct _ceval_runtime_state *ceval)
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000368{
Victor Stinnere225beb2019-06-03 18:14:24 +0200369 SIGNAL_ASYNC_EXC(ceval);
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000370}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000371
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000372PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000373PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000374{
Victor Stinner09532fe2019-05-10 23:39:09 +0200375 _PyRuntimeState *runtime = &_PyRuntime;
Victor Stinnere225beb2019-06-03 18:14:24 +0200376 struct _ceval_runtime_state *ceval = &runtime->ceval;
Victor Stinner09532fe2019-05-10 23:39:09 +0200377 PyThreadState *tstate = _PyThreadState_Swap(&runtime->gilstate, NULL);
378 if (tstate == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000379 Py_FatalError("PyEval_SaveThread: NULL tstate");
Victor Stinner09532fe2019-05-10 23:39:09 +0200380 }
Victor Stinnere225beb2019-06-03 18:14:24 +0200381 assert(gil_created(&ceval->gil));
382 drop_gil(ceval, tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000383 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000384}
385
386void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000387PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000388{
Victor Stinner01b1cc12019-11-20 02:27:56 +0100389 _PyRuntimeState *runtime = tstate->interp->runtime;
Victor Stinner0fd2c302019-06-04 03:15:09 +0200390 struct _ceval_runtime_state *ceval = &runtime->ceval;
391
Victor Stinner09532fe2019-05-10 23:39:09 +0200392 if (tstate == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000393 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Victor Stinner09532fe2019-05-10 23:39:09 +0200394 }
Victor Stinnere225beb2019-06-03 18:14:24 +0200395 assert(gil_created(&ceval->gil));
Victor Stinner2914bb32018-01-29 11:57:45 +0100396
397 int err = errno;
Victor Stinnere225beb2019-06-03 18:14:24 +0200398 take_gil(ceval, tstate);
Victor Stinner01b1cc12019-11-20 02:27:56 +0100399 exit_thread_if_finalizing(tstate);
Victor Stinner2914bb32018-01-29 11:57:45 +0100400 errno = err;
401
Victor Stinner09532fe2019-05-10 23:39:09 +0200402 _PyThreadState_Swap(&runtime->gilstate, tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000403}
404
405
Guido van Rossuma9672091994-09-14 13:31:22 +0000406/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
407 signal handlers or Mac I/O completion routines) can schedule calls
408 to a function to be called synchronously.
409 The synchronous function is called with one void* argument.
410 It should return 0 for success or -1 for failure -- failure should
411 be accompanied by an exception.
412
413 If registry succeeds, the registry function returns 0; if it fails
414 (e.g. due to too many pending calls) it returns -1 (without setting
415 an exception condition).
416
417 Note that because registry may occur from within signal handlers,
418 or other asynchronous events, calling malloc() is unsafe!
419
Guido van Rossuma9672091994-09-14 13:31:22 +0000420 Any thread can schedule pending calls, but only the main thread
421 will execute them.
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000422 There is no facility to schedule calls to a particular thread, but
423 that should be easy to change, should that ever be required. In
424 that case, the static variables here should go into the python
425 threadstate.
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000426*/
Guido van Rossuma9672091994-09-14 13:31:22 +0000427
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200428void
Victor Stinnere225beb2019-06-03 18:14:24 +0200429_PyEval_SignalReceived(struct _ceval_runtime_state *ceval)
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200430{
431 /* bpo-30703: Function called when the C signal handler of Python gets a
432 signal. We cannot queue a callback using Py_AddPendingCall() since
433 that function is not async-signal-safe. */
Victor Stinnere225beb2019-06-03 18:14:24 +0200434 SIGNAL_PENDING_SIGNALS(ceval);
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200435}
436
Eric Snow5be45a62019-03-08 22:47:07 -0700437/* Push one item onto the queue while holding the lock. */
438static int
Victor Stinnere225beb2019-06-03 18:14:24 +0200439_push_pending_call(struct _pending_calls *pending,
Eric Snow842a2f02019-03-15 15:47:51 -0600440 int (*func)(void *), void *arg)
Eric Snow5be45a62019-03-08 22:47:07 -0700441{
Eric Snow842a2f02019-03-15 15:47:51 -0600442 int i = pending->last;
Eric Snow5be45a62019-03-08 22:47:07 -0700443 int j = (i + 1) % NPENDINGCALLS;
Eric Snow842a2f02019-03-15 15:47:51 -0600444 if (j == pending->first) {
Eric Snow5be45a62019-03-08 22:47:07 -0700445 return -1; /* Queue full */
446 }
Eric Snow842a2f02019-03-15 15:47:51 -0600447 pending->calls[i].func = func;
448 pending->calls[i].arg = arg;
449 pending->last = j;
Eric Snow5be45a62019-03-08 22:47:07 -0700450 return 0;
451}
452
453/* Pop one item off the queue while holding the lock. */
454static void
Victor Stinnere225beb2019-06-03 18:14:24 +0200455_pop_pending_call(struct _pending_calls *pending,
Eric Snow842a2f02019-03-15 15:47:51 -0600456 int (**func)(void *), void **arg)
Eric Snow5be45a62019-03-08 22:47:07 -0700457{
Eric Snow842a2f02019-03-15 15:47:51 -0600458 int i = pending->first;
459 if (i == pending->last) {
Eric Snow5be45a62019-03-08 22:47:07 -0700460 return; /* Queue empty */
461 }
462
Eric Snow842a2f02019-03-15 15:47:51 -0600463 *func = pending->calls[i].func;
464 *arg = pending->calls[i].arg;
465 pending->first = (i + 1) % NPENDINGCALLS;
Eric Snow5be45a62019-03-08 22:47:07 -0700466}
467
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200468/* This implementation is thread-safe. It allows
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000469 scheduling to be made from any thread, and even from an executing
470 callback.
471 */
472
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000473int
Victor Stinner438a12d2019-05-24 17:01:38 +0200474_PyEval_AddPendingCall(PyThreadState *tstate,
Victor Stinnere225beb2019-06-03 18:14:24 +0200475 struct _ceval_runtime_state *ceval,
Victor Stinner09532fe2019-05-10 23:39:09 +0200476 int (*func)(void *), void *arg)
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000477{
Victor Stinnere225beb2019-06-03 18:14:24 +0200478 struct _pending_calls *pending = &ceval->pending;
Eric Snow842a2f02019-03-15 15:47:51 -0600479
480 PyThread_acquire_lock(pending->lock, WAIT_LOCK);
481 if (pending->finishing) {
482 PyThread_release_lock(pending->lock);
483
484 PyObject *exc, *val, *tb;
Victor Stinner438a12d2019-05-24 17:01:38 +0200485 _PyErr_Fetch(tstate, &exc, &val, &tb);
486 _PyErr_SetString(tstate, PyExc_SystemError,
Eric Snow842a2f02019-03-15 15:47:51 -0600487 "Py_AddPendingCall: cannot add pending calls "
488 "(Python shutting down)");
Victor Stinner438a12d2019-05-24 17:01:38 +0200489 _PyErr_Print(tstate);
490 _PyErr_Restore(tstate, exc, val, tb);
Eric Snow842a2f02019-03-15 15:47:51 -0600491 return -1;
492 }
Victor Stinnere225beb2019-06-03 18:14:24 +0200493 int result = _push_pending_call(pending, func, arg);
Eric Snow842a2f02019-03-15 15:47:51 -0600494 PyThread_release_lock(pending->lock);
Eric Snow5be45a62019-03-08 22:47:07 -0700495
Victor Stinnere225beb2019-06-03 18:14:24 +0200496 /* signal main loop */
497 SIGNAL_PENDING_CALLS(ceval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000498 return result;
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000499}
500
Victor Stinner09532fe2019-05-10 23:39:09 +0200501int
502Py_AddPendingCall(int (*func)(void *), void *arg)
503{
Victor Stinner438a12d2019-05-24 17:01:38 +0200504 _PyRuntimeState *runtime = &_PyRuntime;
505 PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime);
Victor Stinnere225beb2019-06-03 18:14:24 +0200506 return _PyEval_AddPendingCall(tstate, &runtime->ceval, func, arg);
Victor Stinner09532fe2019-05-10 23:39:09 +0200507}
508
Eric Snowfdf282d2019-01-11 14:26:55 -0700509static int
Victor Stinner09532fe2019-05-10 23:39:09 +0200510handle_signals(_PyRuntimeState *runtime)
Eric Snowfdf282d2019-01-11 14:26:55 -0700511{
Eric Snow5be45a62019-03-08 22:47:07 -0700512 /* Only handle signals on main thread. PyEval_InitThreads must
513 * have been called already.
514 */
Victor Stinner09532fe2019-05-10 23:39:09 +0200515 if (PyThread_get_thread_ident() != runtime->main_thread) {
Eric Snowfdf282d2019-01-11 14:26:55 -0700516 return 0;
517 }
Eric Snow64d6cc82019-02-23 15:40:43 -0700518 /*
519 * Ensure that the thread isn't currently running some other
520 * interpreter.
521 */
Victor Stinner09532fe2019-05-10 23:39:09 +0200522 PyInterpreterState *interp = _PyRuntimeState_GetThreadState(runtime)->interp;
523 if (interp != runtime->interpreters.main) {
Eric Snow64d6cc82019-02-23 15:40:43 -0700524 return 0;
525 }
Eric Snowfdf282d2019-01-11 14:26:55 -0700526
Victor Stinnere225beb2019-06-03 18:14:24 +0200527 struct _ceval_runtime_state *ceval = &runtime->ceval;
528 UNSIGNAL_PENDING_SIGNALS(ceval);
Eric Snow64d6cc82019-02-23 15:40:43 -0700529 if (_PyErr_CheckSignals() < 0) {
Victor Stinnere225beb2019-06-03 18:14:24 +0200530 SIGNAL_PENDING_SIGNALS(ceval); /* We're not done yet */
Eric Snowfdf282d2019-01-11 14:26:55 -0700531 return -1;
532 }
533 return 0;
534}
535
536static int
Victor Stinnere225beb2019-06-03 18:14:24 +0200537make_pending_calls(_PyRuntimeState *runtime)
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000538{
Eric Snow6a150bc2019-06-01 15:39:46 -0600539 static int busy = 0;
Eric Snowb75b1a352019-04-12 10:20:10 -0600540
Victor Stinnere225beb2019-06-03 18:14:24 +0200541 /* only service pending calls on main thread */
542 if (PyThread_get_thread_ident() != runtime->main_thread) {
543 return 0;
544 }
545
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000546 /* don't perform recursive pending calls */
Eric Snowfdf282d2019-01-11 14:26:55 -0700547 if (busy) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000548 return 0;
Eric Snowfdf282d2019-01-11 14:26:55 -0700549 }
Charles-François Natalif23339a2011-07-23 18:15:43 +0200550 busy = 1;
Victor Stinnere225beb2019-06-03 18:14:24 +0200551 struct _ceval_runtime_state *ceval = &runtime->ceval;
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200552 /* unsignal before starting to call callbacks, so that any callback
553 added in-between re-signals */
Victor Stinnere225beb2019-06-03 18:14:24 +0200554 UNSIGNAL_PENDING_CALLS(ceval);
Eric Snowfdf282d2019-01-11 14:26:55 -0700555 int res = 0;
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200556
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000557 /* perform a bounded number of calls, in case of recursion */
Victor Stinnere225beb2019-06-03 18:14:24 +0200558 struct _pending_calls *pending = &ceval->pending;
Eric Snowfdf282d2019-01-11 14:26:55 -0700559 for (int i=0; i<NPENDINGCALLS; i++) {
Eric Snow5be45a62019-03-08 22:47:07 -0700560 int (*func)(void *) = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000561 void *arg = NULL;
562
563 /* pop one item off the queue while holding the lock */
Eric Snow842a2f02019-03-15 15:47:51 -0600564 PyThread_acquire_lock(pending->lock, WAIT_LOCK);
Victor Stinnere225beb2019-06-03 18:14:24 +0200565 _pop_pending_call(pending, &func, &arg);
Eric Snow842a2f02019-03-15 15:47:51 -0600566 PyThread_release_lock(pending->lock);
Eric Snow5be45a62019-03-08 22:47:07 -0700567
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100568 /* having released the lock, perform the callback */
Eric Snow5be45a62019-03-08 22:47:07 -0700569 if (func == NULL) {
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100570 break;
Eric Snow5be45a62019-03-08 22:47:07 -0700571 }
Eric Snowfdf282d2019-01-11 14:26:55 -0700572 res = func(arg);
573 if (res) {
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200574 goto error;
575 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000576 }
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200577
Charles-François Natalif23339a2011-07-23 18:15:43 +0200578 busy = 0;
Eric Snowfdf282d2019-01-11 14:26:55 -0700579 return res;
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200580
581error:
582 busy = 0;
Victor Stinnere225beb2019-06-03 18:14:24 +0200583 SIGNAL_PENDING_CALLS(ceval);
Eric Snowfdf282d2019-01-11 14:26:55 -0700584 return res;
585}
586
Eric Snow842a2f02019-03-15 15:47:51 -0600587void
Victor Stinner2b1df452020-01-13 18:46:59 +0100588_Py_FinishPendingCalls(PyThreadState *tstate)
Eric Snow842a2f02019-03-15 15:47:51 -0600589{
Eric Snow842a2f02019-03-15 15:47:51 -0600590 assert(PyGILState_Check());
591
Victor Stinner2b1df452020-01-13 18:46:59 +0100592 _PyRuntimeState *runtime = tstate->interp->runtime;
Victor Stinnere225beb2019-06-03 18:14:24 +0200593 struct _pending_calls *pending = &runtime->ceval.pending;
Victor Stinner09532fe2019-05-10 23:39:09 +0200594
Eric Snow842a2f02019-03-15 15:47:51 -0600595 PyThread_acquire_lock(pending->lock, WAIT_LOCK);
596 pending->finishing = 1;
597 PyThread_release_lock(pending->lock);
598
599 if (!_Py_atomic_load_relaxed(&(pending->calls_to_do))) {
600 return;
601 }
602
Victor Stinnere225beb2019-06-03 18:14:24 +0200603 if (make_pending_calls(runtime) < 0) {
604 PyObject *exc, *val, *tb;
605 _PyErr_Fetch(tstate, &exc, &val, &tb);
606 PyErr_BadInternalCall();
607 _PyErr_ChainExceptions(exc, val, tb);
608 _PyErr_Print(tstate);
Eric Snow842a2f02019-03-15 15:47:51 -0600609 }
610}
611
Eric Snowfdf282d2019-01-11 14:26:55 -0700612/* Py_MakePendingCalls() is a simple wrapper for the sake
613 of backward-compatibility. */
614int
615Py_MakePendingCalls(void)
616{
617 assert(PyGILState_Check());
618
619 /* Python signal handler doesn't really queue a callback: it only signals
620 that a signal was received, see _PyEval_SignalReceived(). */
Victor Stinner09532fe2019-05-10 23:39:09 +0200621 _PyRuntimeState *runtime = &_PyRuntime;
622 int res = handle_signals(runtime);
Eric Snowfdf282d2019-01-11 14:26:55 -0700623 if (res != 0) {
624 return res;
625 }
626
Victor Stinnere225beb2019-06-03 18:14:24 +0200627 res = make_pending_calls(runtime);
Eric Snowb75b1a352019-04-12 10:20:10 -0600628 if (res != 0) {
629 return res;
630 }
631
632 return 0;
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000633}
634
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000635/* The interpreter's recursion limit */
636
Hye-Shik Changb6fa2812005-04-04 15:49:02 +0000637#ifndef Py_DEFAULT_RECURSION_LIMIT
638#define Py_DEFAULT_RECURSION_LIMIT 1000
639#endif
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600640
Eric Snow05351c12017-09-05 21:43:08 -0700641int _Py_CheckRecursionLimit = Py_DEFAULT_RECURSION_LIMIT;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000642
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600643void
Victor Stinnere225beb2019-06-03 18:14:24 +0200644_PyEval_Initialize(struct _ceval_runtime_state *state)
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600645{
Victor Stinnere225beb2019-06-03 18:14:24 +0200646 state->recursion_limit = Py_DEFAULT_RECURSION_LIMIT;
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600647 _Py_CheckRecursionLimit = Py_DEFAULT_RECURSION_LIMIT;
Victor Stinnere225beb2019-06-03 18:14:24 +0200648 _gil_initialize(&state->gil);
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600649}
650
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000651int
652Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000653{
Victor Stinner01b1cc12019-11-20 02:27:56 +0100654 struct _ceval_runtime_state *ceval = &_PyRuntime.ceval;
655 return ceval->recursion_limit;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000656}
657
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000658void
659Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000660{
Victor Stinnere225beb2019-06-03 18:14:24 +0200661 struct _ceval_runtime_state *ceval = &_PyRuntime.ceval;
662 ceval->recursion_limit = new_limit;
663 _Py_CheckRecursionLimit = ceval->recursion_limit;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000664}
665
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100666/* The function _Py_EnterRecursiveCall() only calls _Py_CheckRecursiveCall()
Armin Rigo2b3eb402003-10-28 12:05:48 +0000667 if the recursion_depth reaches _Py_CheckRecursionLimit.
668 If USE_STACKCHECK, the macro decrements _Py_CheckRecursionLimit
669 to guarantee that _Py_CheckRecursiveCall() is regularly called.
670 Without USE_STACKCHECK, there is no need for this. */
671int
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100672_Py_CheckRecursiveCall(PyThreadState *tstate, const char *where)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000673{
Victor Stinner01b1cc12019-11-20 02:27:56 +0100674 _PyRuntimeState *runtime = tstate->interp->runtime;
Victor Stinner09532fe2019-05-10 23:39:09 +0200675 int recursion_limit = runtime->ceval.recursion_limit;
Armin Rigo2b3eb402003-10-28 12:05:48 +0000676
677#ifdef USE_STACKCHECK
pdox18967932017-10-25 23:03:01 -0700678 tstate->stackcheck_counter = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000679 if (PyOS_CheckStack()) {
680 --tstate->recursion_depth;
Victor Stinner438a12d2019-05-24 17:01:38 +0200681 _PyErr_SetString(tstate, PyExc_MemoryError, "Stack overflow");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000682 return -1;
683 }
pdox18967932017-10-25 23:03:01 -0700684 /* Needed for ABI backwards-compatibility (see bpo-31857) */
Eric Snow05351c12017-09-05 21:43:08 -0700685 _Py_CheckRecursionLimit = recursion_limit;
pdox18967932017-10-25 23:03:01 -0700686#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000687 if (tstate->recursion_critical)
688 /* Somebody asked that we don't check for recursion. */
689 return 0;
690 if (tstate->overflowed) {
691 if (tstate->recursion_depth > recursion_limit + 50) {
692 /* Overflowing while handling an overflow. Give up. */
693 Py_FatalError("Cannot recover from stack overflow.");
694 }
695 return 0;
696 }
697 if (tstate->recursion_depth > recursion_limit) {
698 --tstate->recursion_depth;
699 tstate->overflowed = 1;
Victor Stinner438a12d2019-05-24 17:01:38 +0200700 _PyErr_Format(tstate, PyExc_RecursionError,
701 "maximum recursion depth exceeded%s",
702 where);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000703 return -1;
704 }
705 return 0;
Armin Rigo2b3eb402003-10-28 12:05:48 +0000706}
707
Victor Stinner09532fe2019-05-10 23:39:09 +0200708static int do_raise(PyThreadState *tstate, PyObject *exc, PyObject *cause);
Victor Stinner438a12d2019-05-24 17:01:38 +0200709static int unpack_iterable(PyThreadState *, PyObject *, int, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000710
Victor Stinnere225beb2019-06-03 18:14:24 +0200711#define _Py_TracingPossible(ceval) ((ceval)->tracing_possible)
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000712
Guido van Rossum374a9221991-04-04 10:40:29 +0000713
Guido van Rossumb209a111997-04-29 18:18:01 +0000714PyObject *
Martin v. Löwis4d0d4712010-12-03 20:14:31 +0000715PyEval_EvalCode(PyObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000716{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000717 return PyEval_EvalCodeEx(co,
718 globals, locals,
719 (PyObject **)NULL, 0,
720 (PyObject **)NULL, 0,
721 (PyObject **)NULL, 0,
722 NULL, NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000723}
724
725
726/* Interpreter main loop */
727
Martin v. Löwis8d97e332004-06-27 15:43:12 +0000728PyObject *
Victor Stinnerb9e68122019-11-14 12:20:46 +0100729PyEval_EvalFrame(PyFrameObject *f)
730{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000731 /* This is for backward compatibility with extension modules that
732 used this API; core interpreter code should call
733 PyEval_EvalFrameEx() */
Victor Stinnerb9e68122019-11-14 12:20:46 +0100734 PyThreadState *tstate = _PyThreadState_GET();
735 return _PyEval_EvalFrame(tstate, f, 0);
Phillip J. Eby0d6615f2005-08-02 00:46:46 +0000736}
737
738PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000739PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
Guido van Rossum374a9221991-04-04 10:40:29 +0000740{
Victor Stinnerb9e68122019-11-14 12:20:46 +0100741 PyThreadState *tstate = _PyThreadState_GET();
742 return _PyEval_EvalFrame(tstate, f, throwflag);
Brett Cannon3cebf932016-09-05 15:33:46 -0700743}
744
Victor Stinnerc6944e72016-11-11 02:13:35 +0100745PyObject* _Py_HOT_FUNCTION
Brett Cannon3cebf932016-09-05 15:33:46 -0700746_PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag)
747{
Guido van Rossum950361c1997-01-24 13:49:28 +0000748#ifdef DXPAIRS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000749 int lastopcode = 0;
Guido van Rossum950361c1997-01-24 13:49:28 +0000750#endif
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200751 PyObject **stack_pointer; /* Next free slot in value stack */
Serhiy Storchakaab874002016-09-11 13:48:15 +0300752 const _Py_CODEUNIT *next_instr;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200753 int opcode; /* Current opcode */
754 int oparg; /* Current opcode argument, if any */
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200755 PyObject **fastlocals, **freevars;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000756 PyObject *retval = NULL; /* Return value */
Victor Stinner09532fe2019-05-10 23:39:09 +0200757 _PyRuntimeState * const runtime = &_PyRuntime;
758 PyThreadState * const tstate = _PyRuntimeState_GetThreadState(runtime);
Victor Stinnere225beb2019-06-03 18:14:24 +0200759 struct _ceval_runtime_state * const ceval = &runtime->ceval;
760 _Py_atomic_int * const eval_breaker = &ceval->eval_breaker;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000761 PyCodeObject *co;
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000762
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000763 /* when tracing we set things up so that
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000764
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000765 not (instr_lb <= current_bytecode_offset < instr_ub)
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000766
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000767 is true when the line being executed has changed. The
768 initial values are such as to make this false the first
769 time it is tested. */
770 int instr_ub = -1, instr_lb = 0, instr_prev = -1;
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000771
Serhiy Storchakaab874002016-09-11 13:48:15 +0300772 const _Py_CODEUNIT *first_instr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000773 PyObject *names;
774 PyObject *consts;
Inada Naoki91234a12019-06-03 21:30:58 +0900775 _PyOpcache *co_opcache;
Guido van Rossum374a9221991-04-04 10:40:29 +0000776
Brett Cannon368b4b72012-04-02 12:17:59 -0400777#ifdef LLTRACE
Victor Stinner3c1e4812012-03-26 22:10:51 +0200778 _Py_IDENTIFIER(__ltrace__);
Brett Cannon368b4b72012-04-02 12:17:59 -0400779#endif
Victor Stinner3c1e4812012-03-26 22:10:51 +0200780
Antoine Pitroub52ec782009-01-25 16:34:23 +0000781/* Computed GOTOs, or
782 the-optimization-commonly-but-improperly-known-as-"threaded code"
783 using gcc's labels-as-values extension
784 (http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html).
785
786 The traditional bytecode evaluation loop uses a "switch" statement, which
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000787 decent compilers will optimize as a single indirect branch instruction
Antoine Pitroub52ec782009-01-25 16:34:23 +0000788 combined with a lookup table of jump addresses. However, since the
789 indirect jump instruction is shared by all opcodes, the CPU will have a
790 hard time making the right prediction for where to jump next (actually,
791 it will be always wrong except in the uncommon case of a sequence of
792 several identical opcodes).
793
794 "Threaded code" in contrast, uses an explicit jump table and an explicit
795 indirect jump instruction at the end of each opcode. Since the jump
796 instruction is at a different address for each opcode, the CPU will make a
797 separate prediction for each of these instructions, which is equivalent to
798 predicting the second opcode of each opcode pair. These predictions have
799 a much better chance to turn out valid, especially in small bytecode loops.
800
801 A mispredicted branch on a modern CPU flushes the whole pipeline and
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000802 can cost several CPU cycles (depending on the pipeline depth),
Antoine Pitroub52ec782009-01-25 16:34:23 +0000803 and potentially many more instructions (depending on the pipeline width).
804 A correctly predicted branch, however, is nearly free.
805
806 At the time of this writing, the "threaded code" version is up to 15-20%
807 faster than the normal "switch" version, depending on the compiler and the
808 CPU architecture.
809
810 We disable the optimization if DYNAMIC_EXECUTION_PROFILE is defined,
811 because it would render the measurements invalid.
812
813
814 NOTE: care must be taken that the compiler doesn't try to "optimize" the
815 indirect jumps by sharing them between all opcodes. Such optimizations
816 can be disabled on gcc by using the -fno-gcse flag (or possibly
817 -fno-crossjumping).
818*/
819
Antoine Pitrou042b1282010-08-13 21:15:58 +0000820#ifdef DYNAMIC_EXECUTION_PROFILE
Antoine Pitroub52ec782009-01-25 16:34:23 +0000821#undef USE_COMPUTED_GOTOS
Antoine Pitrou042b1282010-08-13 21:15:58 +0000822#define USE_COMPUTED_GOTOS 0
Antoine Pitroub52ec782009-01-25 16:34:23 +0000823#endif
824
Antoine Pitrou042b1282010-08-13 21:15:58 +0000825#ifdef HAVE_COMPUTED_GOTOS
826 #ifndef USE_COMPUTED_GOTOS
827 #define USE_COMPUTED_GOTOS 1
828 #endif
829#else
830 #if defined(USE_COMPUTED_GOTOS) && USE_COMPUTED_GOTOS
831 #error "Computed gotos are not supported on this compiler."
832 #endif
833 #undef USE_COMPUTED_GOTOS
834 #define USE_COMPUTED_GOTOS 0
835#endif
836
837#if USE_COMPUTED_GOTOS
Antoine Pitroub52ec782009-01-25 16:34:23 +0000838/* Import the static jump table */
839#include "opcode_targets.h"
840
Antoine Pitroub52ec782009-01-25 16:34:23 +0000841#define TARGET(op) \
Benjamin Petersonddd19492018-09-16 22:38:02 -0700842 op: \
843 TARGET_##op
Antoine Pitroub52ec782009-01-25 16:34:23 +0000844
Antoine Pitroub52ec782009-01-25 16:34:23 +0000845#ifdef LLTRACE
846#define FAST_DISPATCH() \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000847 { \
Victor Stinnere225beb2019-06-03 18:14:24 +0200848 if (!lltrace && !_Py_TracingPossible(ceval) && !PyDTrace_LINE_ENABLED()) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000849 f->f_lasti = INSTR_OFFSET(); \
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +0300850 NEXTOPARG(); \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +0300851 goto *opcode_targets[opcode]; \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000852 } \
853 goto fast_next_opcode; \
854 }
Antoine Pitroub52ec782009-01-25 16:34:23 +0000855#else
856#define FAST_DISPATCH() \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000857 { \
Victor Stinnere225beb2019-06-03 18:14:24 +0200858 if (!_Py_TracingPossible(ceval) && !PyDTrace_LINE_ENABLED()) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000859 f->f_lasti = INSTR_OFFSET(); \
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +0300860 NEXTOPARG(); \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +0300861 goto *opcode_targets[opcode]; \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000862 } \
863 goto fast_next_opcode; \
864 }
Antoine Pitroub52ec782009-01-25 16:34:23 +0000865#endif
866
Victor Stinner09532fe2019-05-10 23:39:09 +0200867#define DISPATCH() \
868 { \
869 if (!_Py_atomic_load_relaxed(eval_breaker)) { \
870 FAST_DISPATCH(); \
871 } \
872 continue; \
873 }
874
Antoine Pitroub52ec782009-01-25 16:34:23 +0000875#else
Benjamin Petersonddd19492018-09-16 22:38:02 -0700876#define TARGET(op) op
Antoine Pitroub52ec782009-01-25 16:34:23 +0000877#define FAST_DISPATCH() goto fast_next_opcode
Victor Stinner09532fe2019-05-10 23:39:09 +0200878#define DISPATCH() continue
Antoine Pitroub52ec782009-01-25 16:34:23 +0000879#endif
880
881
Neal Norwitza81d2202002-07-14 00:27:26 +0000882/* Tuple access macros */
883
884#ifndef Py_DEBUG
885#define GETITEM(v, i) PyTuple_GET_ITEM((PyTupleObject *)(v), (i))
886#else
887#define GETITEM(v, i) PyTuple_GetItem((v), (i))
888#endif
889
Guido van Rossum374a9221991-04-04 10:40:29 +0000890/* Code access macros */
891
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +0300892/* The integer overflow is checked by an assertion below. */
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600893#define INSTR_OFFSET() \
894 (sizeof(_Py_CODEUNIT) * (int)(next_instr - first_instr))
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +0300895#define NEXTOPARG() do { \
Serhiy Storchakaab874002016-09-11 13:48:15 +0300896 _Py_CODEUNIT word = *next_instr; \
897 opcode = _Py_OPCODE(word); \
898 oparg = _Py_OPARG(word); \
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +0300899 next_instr++; \
900 } while (0)
Serhiy Storchakaab874002016-09-11 13:48:15 +0300901#define JUMPTO(x) (next_instr = first_instr + (x) / sizeof(_Py_CODEUNIT))
902#define JUMPBY(x) (next_instr += (x) / sizeof(_Py_CODEUNIT))
Guido van Rossum374a9221991-04-04 10:40:29 +0000903
Raymond Hettingerf606f872003-03-16 03:11:04 +0000904/* OpCode prediction macros
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000905 Some opcodes tend to come in pairs thus making it possible to
906 predict the second code when the first is run. For example,
Serhiy Storchakada9c5132016-06-27 18:58:57 +0300907 COMPARE_OP is often followed by POP_JUMP_IF_FALSE or POP_JUMP_IF_TRUE.
Raymond Hettingerf606f872003-03-16 03:11:04 +0000908
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000909 Verifying the prediction costs a single high-speed test of a register
910 variable against a constant. If the pairing was good, then the
911 processor's own internal branch predication has a high likelihood of
912 success, resulting in a nearly zero-overhead transition to the
913 next opcode. A successful prediction saves a trip through the eval-loop
Serhiy Storchakab0f80b02016-05-24 09:15:14 +0300914 including its unpredictable switch-case branch. Combined with the
915 processor's internal branch prediction, a successful PREDICT has the
916 effect of making the two opcodes run as if they were a single new opcode
917 with the bodies combined.
Raymond Hettingerf606f872003-03-16 03:11:04 +0000918
Georg Brandl86b2fb92008-07-16 03:43:04 +0000919 If collecting opcode statistics, your choices are to either keep the
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000920 predictions turned-on and interpret the results as if some opcodes
921 had been combined or turn-off predictions so that the opcode frequency
922 counter updates for both opcodes.
Antoine Pitroub52ec782009-01-25 16:34:23 +0000923
924 Opcode prediction is disabled with threaded code, since the latter allows
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000925 the CPU to record separate branch prediction information for each
926 opcode.
Antoine Pitroub52ec782009-01-25 16:34:23 +0000927
Raymond Hettingerf606f872003-03-16 03:11:04 +0000928*/
929
Antoine Pitrou042b1282010-08-13 21:15:58 +0000930#if defined(DYNAMIC_EXECUTION_PROFILE) || USE_COMPUTED_GOTOS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000931#define PREDICT(op) if (0) goto PRED_##op
Raymond Hettingera7216982004-02-08 19:59:27 +0000932#else
Serhiy Storchakab0f80b02016-05-24 09:15:14 +0300933#define PREDICT(op) \
934 do{ \
Serhiy Storchakaab874002016-09-11 13:48:15 +0300935 _Py_CODEUNIT word = *next_instr; \
936 opcode = _Py_OPCODE(word); \
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +0300937 if (opcode == op){ \
Serhiy Storchakaab874002016-09-11 13:48:15 +0300938 oparg = _Py_OPARG(word); \
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +0300939 next_instr++; \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +0300940 goto PRED_##op; \
941 } \
942 } while(0)
Antoine Pitroub52ec782009-01-25 16:34:23 +0000943#endif
Serhiy Storchakab0f80b02016-05-24 09:15:14 +0300944#define PREDICTED(op) PRED_##op:
Antoine Pitroub52ec782009-01-25 16:34:23 +0000945
Raymond Hettingerf606f872003-03-16 03:11:04 +0000946
Guido van Rossum374a9221991-04-04 10:40:29 +0000947/* Stack manipulation macros */
948
Martin v. Löwis18e16552006-02-15 17:27:45 +0000949/* The stack can grow at most MAXINT deep, as co_nlocals and
950 co_stacksize are ints. */
Stefan Krahb7e10102010-06-23 18:42:39 +0000951#define STACK_LEVEL() ((int)(stack_pointer - f->f_valuestack))
952#define EMPTY() (STACK_LEVEL() == 0)
953#define TOP() (stack_pointer[-1])
954#define SECOND() (stack_pointer[-2])
955#define THIRD() (stack_pointer[-3])
956#define FOURTH() (stack_pointer[-4])
957#define PEEK(n) (stack_pointer[-(n)])
958#define SET_TOP(v) (stack_pointer[-1] = (v))
959#define SET_SECOND(v) (stack_pointer[-2] = (v))
960#define SET_THIRD(v) (stack_pointer[-3] = (v))
961#define SET_FOURTH(v) (stack_pointer[-4] = (v))
962#define SET_VALUE(n, v) (stack_pointer[-(n)] = (v))
963#define BASIC_STACKADJ(n) (stack_pointer += n)
964#define BASIC_PUSH(v) (*stack_pointer++ = (v))
965#define BASIC_POP() (*--stack_pointer)
Guido van Rossum374a9221991-04-04 10:40:29 +0000966
Guido van Rossum96a42c81992-01-12 02:29:51 +0000967#ifdef LLTRACE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000968#define PUSH(v) { (void)(BASIC_PUSH(v), \
Victor Stinner438a12d2019-05-24 17:01:38 +0200969 lltrace && prtrace(tstate, TOP(), "push")); \
Stefan Krahb7e10102010-06-23 18:42:39 +0000970 assert(STACK_LEVEL() <= co->co_stacksize); }
Victor Stinner438a12d2019-05-24 17:01:38 +0200971#define POP() ((void)(lltrace && prtrace(tstate, TOP(), "pop")), \
Stefan Krahb7e10102010-06-23 18:42:39 +0000972 BASIC_POP())
costypetrisor8ed317f2018-07-31 20:55:14 +0000973#define STACK_GROW(n) do { \
974 assert(n >= 0); \
975 (void)(BASIC_STACKADJ(n), \
Victor Stinner438a12d2019-05-24 17:01:38 +0200976 lltrace && prtrace(tstate, TOP(), "stackadj")); \
costypetrisor8ed317f2018-07-31 20:55:14 +0000977 assert(STACK_LEVEL() <= co->co_stacksize); \
978 } while (0)
979#define STACK_SHRINK(n) do { \
980 assert(n >= 0); \
Victor Stinner438a12d2019-05-24 17:01:38 +0200981 (void)(lltrace && prtrace(tstate, TOP(), "stackadj")); \
costypetrisor8ed317f2018-07-31 20:55:14 +0000982 (void)(BASIC_STACKADJ(-n)); \
983 assert(STACK_LEVEL() <= co->co_stacksize); \
984 } while (0)
Christian Heimes0449f632007-12-15 01:27:15 +0000985#define EXT_POP(STACK_POINTER) ((void)(lltrace && \
Victor Stinner438a12d2019-05-24 17:01:38 +0200986 prtrace(tstate, (STACK_POINTER)[-1], "ext_pop")), \
Stefan Krahb7e10102010-06-23 18:42:39 +0000987 *--(STACK_POINTER))
Guido van Rossum374a9221991-04-04 10:40:29 +0000988#else
Stefan Krahb7e10102010-06-23 18:42:39 +0000989#define PUSH(v) BASIC_PUSH(v)
990#define POP() BASIC_POP()
costypetrisor8ed317f2018-07-31 20:55:14 +0000991#define STACK_GROW(n) BASIC_STACKADJ(n)
992#define STACK_SHRINK(n) BASIC_STACKADJ(-n)
Guido van Rossumc2e20742006-02-27 22:32:47 +0000993#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
Guido van Rossum374a9221991-04-04 10:40:29 +0000994#endif
995
Guido van Rossum681d79a1995-07-18 14:51:37 +0000996/* Local variable macros */
997
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000998#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumcfbf1a32002-03-28 20:17:52 +0000999
1000/* The SETLOCAL() macro must not DECREF the local variable in-place and
1001 then store the new value; it must copy the old value to a temporary
1002 value, then store the new value, and then DECREF the temporary value.
1003 This is because it is possible that during the DECREF the frame is
1004 accessed by other code (e.g. a __del__ method or gc.collect()) and the
1005 variable would be pointing to already-freed memory. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001006#define SETLOCAL(i, value) do { PyObject *tmp = GETLOCAL(i); \
Stefan Krahb7e10102010-06-23 18:42:39 +00001007 GETLOCAL(i) = value; \
1008 Py_XDECREF(tmp); } while (0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00001009
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001010
1011#define UNWIND_BLOCK(b) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001012 while (STACK_LEVEL() > (b)->b_level) { \
1013 PyObject *v = POP(); \
1014 Py_XDECREF(v); \
1015 }
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001016
1017#define UNWIND_EXCEPT_HANDLER(b) \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001018 do { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001019 PyObject *type, *value, *traceback; \
Mark Shannonae3087c2017-10-22 22:41:51 +01001020 _PyErr_StackItem *exc_info; \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001021 assert(STACK_LEVEL() >= (b)->b_level + 3); \
1022 while (STACK_LEVEL() > (b)->b_level + 3) { \
1023 value = POP(); \
1024 Py_XDECREF(value); \
1025 } \
Mark Shannonae3087c2017-10-22 22:41:51 +01001026 exc_info = tstate->exc_info; \
1027 type = exc_info->exc_type; \
1028 value = exc_info->exc_value; \
1029 traceback = exc_info->exc_traceback; \
1030 exc_info->exc_type = POP(); \
1031 exc_info->exc_value = POP(); \
1032 exc_info->exc_traceback = POP(); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001033 Py_XDECREF(type); \
1034 Py_XDECREF(value); \
1035 Py_XDECREF(traceback); \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001036 } while(0)
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001037
Inada Naoki91234a12019-06-03 21:30:58 +09001038 /* macros for opcode cache */
1039#define OPCACHE_CHECK() \
1040 do { \
1041 co_opcache = NULL; \
1042 if (co->co_opcache != NULL) { \
1043 unsigned char co_opt_offset = \
1044 co->co_opcache_map[next_instr - first_instr]; \
1045 if (co_opt_offset > 0) { \
1046 assert(co_opt_offset <= co->co_opcache_size); \
1047 co_opcache = &co->co_opcache[co_opt_offset - 1]; \
1048 assert(co_opcache != NULL); \
Inada Naoki91234a12019-06-03 21:30:58 +09001049 } \
1050 } \
1051 } while (0)
1052
1053#if OPCACHE_STATS
1054
1055#define OPCACHE_STAT_GLOBAL_HIT() \
1056 do { \
1057 if (co->co_opcache != NULL) opcache_global_hits++; \
1058 } while (0)
1059
1060#define OPCACHE_STAT_GLOBAL_MISS() \
1061 do { \
1062 if (co->co_opcache != NULL) opcache_global_misses++; \
1063 } while (0)
1064
1065#define OPCACHE_STAT_GLOBAL_OPT() \
1066 do { \
1067 if (co->co_opcache != NULL) opcache_global_opts++; \
1068 } while (0)
1069
1070#else /* OPCACHE_STATS */
1071
1072#define OPCACHE_STAT_GLOBAL_HIT()
1073#define OPCACHE_STAT_GLOBAL_MISS()
1074#define OPCACHE_STAT_GLOBAL_OPT()
1075
1076#endif
1077
Guido van Rossuma027efa1997-05-05 20:56:21 +00001078/* Start of code */
1079
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001080 /* push frame */
Victor Stinnerbe434dc2019-11-05 00:51:22 +01001081 if (_Py_EnterRecursiveCall(tstate, "")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001082 return NULL;
Victor Stinnerbe434dc2019-11-05 00:51:22 +01001083 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001084
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001085 tstate->frame = f;
Tim Peters5ca576e2001-06-18 22:08:13 +00001086
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001087 if (tstate->use_tracing) {
1088 if (tstate->c_tracefunc != NULL) {
1089 /* tstate->c_tracefunc, if defined, is a
1090 function that will be called on *every* entry
1091 to a code block. Its return value, if not
1092 None, is a function that will be called at
1093 the start of each executed line of code.
1094 (Actually, the function must return itself
1095 in order to continue tracing.) The trace
1096 functions are called with three arguments:
1097 a pointer to the current frame, a string
1098 indicating why the function is called, and
1099 an argument which depends on the situation.
1100 The global trace function is also called
1101 whenever an exception is detected. */
1102 if (call_trace_protected(tstate->c_tracefunc,
1103 tstate->c_traceobj,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01001104 tstate, f, PyTrace_CALL, Py_None)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001105 /* Trace function raised an error */
1106 goto exit_eval_frame;
1107 }
1108 }
1109 if (tstate->c_profilefunc != NULL) {
1110 /* Similar for c_profilefunc, except it needn't
1111 return itself and isn't called for "line" events */
1112 if (call_trace_protected(tstate->c_profilefunc,
1113 tstate->c_profileobj,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01001114 tstate, f, PyTrace_CALL, Py_None)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001115 /* Profile function raised an error */
1116 goto exit_eval_frame;
1117 }
1118 }
1119 }
Neil Schemenauer6c0f2002001-09-04 19:03:35 +00001120
Łukasz Langaa785c872016-09-09 17:37:37 -07001121 if (PyDTrace_FUNCTION_ENTRY_ENABLED())
1122 dtrace_function_entry(f);
1123
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001124 co = f->f_code;
1125 names = co->co_names;
1126 consts = co->co_consts;
1127 fastlocals = f->f_localsplus;
1128 freevars = f->f_localsplus + co->co_nlocals;
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001129 assert(PyBytes_Check(co->co_code));
1130 assert(PyBytes_GET_SIZE(co->co_code) <= INT_MAX);
Serhiy Storchakaab874002016-09-11 13:48:15 +03001131 assert(PyBytes_GET_SIZE(co->co_code) % sizeof(_Py_CODEUNIT) == 0);
1132 assert(_Py_IS_ALIGNED(PyBytes_AS_STRING(co->co_code), sizeof(_Py_CODEUNIT)));
1133 first_instr = (_Py_CODEUNIT *) PyBytes_AS_STRING(co->co_code);
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001134 /*
1135 f->f_lasti refers to the index of the last instruction,
1136 unless it's -1 in which case next_instr should be first_instr.
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001137
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001138 YIELD_FROM sets f_lasti to itself, in order to repeatedly yield
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05001139 multiple values.
Thomas Wouters902d6eb2007-01-09 23:18:33 +00001140
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001141 When the PREDICT() macros are enabled, some opcode pairs follow in
1142 direct succession without updating f->f_lasti. A successful
1143 prediction effectively links the two codes together as if they
1144 were a single new opcode; accordingly,f->f_lasti will point to
1145 the first code in the pair (for instance, GET_ITER followed by
1146 FOR_ITER is effectively a single opcode and f->f_lasti will point
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001147 to the beginning of the combined pair.)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001148 */
Serhiy Storchakaab874002016-09-11 13:48:15 +03001149 assert(f->f_lasti >= -1);
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001150 next_instr = first_instr;
1151 if (f->f_lasti >= 0) {
Serhiy Storchakaab874002016-09-11 13:48:15 +03001152 assert(f->f_lasti % sizeof(_Py_CODEUNIT) == 0);
1153 next_instr += f->f_lasti / sizeof(_Py_CODEUNIT) + 1;
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001154 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001155 stack_pointer = f->f_stacktop;
1156 assert(stack_pointer != NULL);
1157 f->f_stacktop = NULL; /* remains NULL unless yield suspends frame */
Antoine Pitrou58720d62013-08-05 23:26:40 +02001158 f->f_executing = 1;
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001159
Inada Naoki91234a12019-06-03 21:30:58 +09001160 if (co->co_opcache_flag < OPCACHE_MIN_RUNS) {
1161 co->co_opcache_flag++;
1162 if (co->co_opcache_flag == OPCACHE_MIN_RUNS) {
1163 if (_PyCode_InitOpcache(co) < 0) {
1164 return NULL;
1165 }
1166#if OPCACHE_STATS
1167 opcache_code_objects_extra_mem +=
1168 PyBytes_Size(co->co_code) / sizeof(_Py_CODEUNIT) +
1169 sizeof(_PyOpcache) * co->co_opcache_size;
1170 opcache_code_objects++;
1171#endif
1172 }
1173 }
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001174
Tim Peters5ca576e2001-06-18 22:08:13 +00001175#ifdef LLTRACE
Victor Stinner3c1e4812012-03-26 22:10:51 +02001176 lltrace = _PyDict_GetItemId(f->f_globals, &PyId___ltrace__) != NULL;
Tim Peters5ca576e2001-06-18 22:08:13 +00001177#endif
Guido van Rossumac7be682001-01-17 15:42:30 +00001178
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001179 if (throwflag) /* support for generator.throw() */
1180 goto error;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001181
Victor Stinnerace47d72013-07-18 01:41:08 +02001182#ifdef Py_DEBUG
1183 /* PyEval_EvalFrameEx() must not be called with an exception set,
Victor Stinnera8cb5152017-01-18 14:12:51 +01001184 because it can clear it (directly or indirectly) and so the
Martin Panter9955a372015-10-07 10:26:23 +00001185 caller loses its exception */
Victor Stinner438a12d2019-05-24 17:01:38 +02001186 assert(!_PyErr_Occurred(tstate));
Victor Stinnerace47d72013-07-18 01:41:08 +02001187#endif
1188
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001189main_loop:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001190 for (;;) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001191 assert(stack_pointer >= f->f_valuestack); /* else underflow */
1192 assert(STACK_LEVEL() <= co->co_stacksize); /* else overflow */
Victor Stinner438a12d2019-05-24 17:01:38 +02001193 assert(!_PyErr_Occurred(tstate));
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001194
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001195 /* Do periodic things. Doing this every time through
1196 the loop would add too much overhead, so we do it
1197 only every Nth instruction. We also do it if
1198 ``pendingcalls_to_do'' is set, i.e. when an asynchronous
1199 event needs attention (e.g. a signal handler or
1200 async I/O handler); see Py_AddPendingCall() and
1201 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +00001202
Eric Snow7bda9de2019-03-08 17:25:54 -07001203 if (_Py_atomic_load_relaxed(eval_breaker)) {
Serhiy Storchaka3f4d90d2018-07-09 15:40:14 +03001204 opcode = _Py_OPCODE(*next_instr);
1205 if (opcode == SETUP_FINALLY ||
1206 opcode == SETUP_WITH ||
1207 opcode == BEFORE_ASYNC_WITH ||
1208 opcode == YIELD_FROM) {
1209 /* Few cases where we skip running signal handlers and other
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07001210 pending calls:
Serhiy Storchaka3f4d90d2018-07-09 15:40:14 +03001211 - If we're about to enter the 'with:'. It will prevent
1212 emitting a resource warning in the common idiom
1213 'with open(path) as file:'.
1214 - If we're about to enter the 'async with:'.
1215 - If we're about to enter the 'try:' of a try/finally (not
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07001216 *very* useful, but might help in some cases and it's
1217 traditional)
1218 - If we're resuming a chain of nested 'yield from' or
1219 'await' calls, then each frame is parked with YIELD_FROM
1220 as its next opcode. If the user hit control-C we want to
1221 wait until we've reached the innermost frame before
1222 running the signal handler and raising KeyboardInterrupt
1223 (see bpo-30039).
1224 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001225 goto fast_next_opcode;
1226 }
Eric Snowfdf282d2019-01-11 14:26:55 -07001227
Victor Stinnere225beb2019-06-03 18:14:24 +02001228 if (_Py_atomic_load_relaxed(&ceval->signals_pending)) {
Victor Stinner09532fe2019-05-10 23:39:09 +02001229 if (handle_signals(runtime) != 0) {
Eric Snowfdf282d2019-01-11 14:26:55 -07001230 goto error;
1231 }
1232 }
Victor Stinnere225beb2019-06-03 18:14:24 +02001233 if (_Py_atomic_load_relaxed(&ceval->pending.calls_to_do)) {
1234 if (make_pending_calls(runtime) != 0) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001235 goto error;
Eric Snowfdf282d2019-01-11 14:26:55 -07001236 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001237 }
Eric Snowfdf282d2019-01-11 14:26:55 -07001238
Victor Stinnere225beb2019-06-03 18:14:24 +02001239 if (_Py_atomic_load_relaxed(&ceval->gil_drop_request)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001240 /* Give another thread a chance */
Victor Stinner09532fe2019-05-10 23:39:09 +02001241 if (_PyThreadState_Swap(&runtime->gilstate, NULL) != tstate) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001242 Py_FatalError("ceval: tstate mix-up");
Victor Stinner09532fe2019-05-10 23:39:09 +02001243 }
Victor Stinnere225beb2019-06-03 18:14:24 +02001244 drop_gil(ceval, tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001245
1246 /* Other threads may run now */
1247
Victor Stinnere225beb2019-06-03 18:14:24 +02001248 take_gil(ceval, tstate);
Benjamin Peterson17548dd2014-06-16 22:59:07 -07001249
1250 /* Check if we should make a quick exit. */
Victor Stinner01b1cc12019-11-20 02:27:56 +01001251 exit_thread_if_finalizing(tstate);
Benjamin Peterson17548dd2014-06-16 22:59:07 -07001252
Victor Stinner09532fe2019-05-10 23:39:09 +02001253 if (_PyThreadState_Swap(&runtime->gilstate, tstate) != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001254 Py_FatalError("ceval: orphan tstate");
Victor Stinner09532fe2019-05-10 23:39:09 +02001255 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001256 }
1257 /* Check for asynchronous exceptions. */
1258 if (tstate->async_exc != NULL) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001259 PyObject *exc = tstate->async_exc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001260 tstate->async_exc = NULL;
Victor Stinnere225beb2019-06-03 18:14:24 +02001261 UNSIGNAL_ASYNC_EXC(ceval);
Victor Stinner438a12d2019-05-24 17:01:38 +02001262 _PyErr_SetNone(tstate, exc);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001263 Py_DECREF(exc);
1264 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001265 }
1266 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001267
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001268 fast_next_opcode:
1269 f->f_lasti = INSTR_OFFSET();
Guido van Rossumac7be682001-01-17 15:42:30 +00001270
Łukasz Langaa785c872016-09-09 17:37:37 -07001271 if (PyDTrace_LINE_ENABLED())
1272 maybe_dtrace_line(f, &instr_lb, &instr_ub, &instr_prev);
1273
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001274 /* line-by-line tracing support */
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001275
Victor Stinnere225beb2019-06-03 18:14:24 +02001276 if (_Py_TracingPossible(ceval) &&
Benjamin Peterson51f46162013-01-23 08:38:47 -05001277 tstate->c_tracefunc != NULL && !tstate->tracing) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001278 int err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001279 /* see maybe_call_line_trace
1280 for expository comments */
1281 f->f_stacktop = stack_pointer;
Tim Peters8a5c3c72004-04-05 19:36:21 +00001282
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001283 err = maybe_call_line_trace(tstate->c_tracefunc,
1284 tstate->c_traceobj,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01001285 tstate, f,
1286 &instr_lb, &instr_ub, &instr_prev);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001287 /* Reload possibly changed frame fields */
1288 JUMPTO(f->f_lasti);
1289 if (f->f_stacktop != NULL) {
1290 stack_pointer = f->f_stacktop;
1291 f->f_stacktop = NULL;
1292 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001293 if (err)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001294 /* trace function raised an exception */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001295 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001296 }
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001297
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001298 /* Extract opcode and argument */
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001299
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001300 NEXTOPARG();
Stefan Krahb7e10102010-06-23 18:42:39 +00001301 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +00001302#ifdef DYNAMIC_EXECUTION_PROFILE
1303#ifdef DXPAIRS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001304 dxpairs[lastopcode][opcode]++;
1305 lastopcode = opcode;
Guido van Rossum950361c1997-01-24 13:49:28 +00001306#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001307 dxp[opcode]++;
Guido van Rossum950361c1997-01-24 13:49:28 +00001308#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001309
Guido van Rossum96a42c81992-01-12 02:29:51 +00001310#ifdef LLTRACE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001311 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +00001312
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001313 if (lltrace) {
1314 if (HAS_ARG(opcode)) {
1315 printf("%d: %d, %d\n",
1316 f->f_lasti, opcode, oparg);
1317 }
1318 else {
1319 printf("%d: %d\n",
1320 f->f_lasti, opcode);
1321 }
1322 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001323#endif
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001324
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001325 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +00001326
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001327 /* BEWARE!
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001328 It is essential that any operation that fails must goto error
1329 and that all operation that succeed call [FAST_]DISPATCH() ! */
Guido van Rossumac7be682001-01-17 15:42:30 +00001330
Benjamin Petersonddd19492018-09-16 22:38:02 -07001331 case TARGET(NOP): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001332 FAST_DISPATCH();
Benjamin Petersonddd19492018-09-16 22:38:02 -07001333 }
Raymond Hettinger9c18e812004-06-21 16:31:15 +00001334
Benjamin Petersonddd19492018-09-16 22:38:02 -07001335 case TARGET(LOAD_FAST): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001336 PyObject *value = GETLOCAL(oparg);
1337 if (value == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02001338 format_exc_check_arg(tstate, PyExc_UnboundLocalError,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001339 UNBOUNDLOCAL_ERROR_MSG,
1340 PyTuple_GetItem(co->co_varnames, oparg));
1341 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001342 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001343 Py_INCREF(value);
1344 PUSH(value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001345 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001346 }
1347
Benjamin Petersonddd19492018-09-16 22:38:02 -07001348 case TARGET(LOAD_CONST): {
1349 PREDICTED(LOAD_CONST);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001350 PyObject *value = GETITEM(consts, oparg);
1351 Py_INCREF(value);
1352 PUSH(value);
1353 FAST_DISPATCH();
1354 }
Neil Schemenauer63543862002-02-17 19:10:14 +00001355
Benjamin Petersonddd19492018-09-16 22:38:02 -07001356 case TARGET(STORE_FAST): {
1357 PREDICTED(STORE_FAST);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001358 PyObject *value = POP();
1359 SETLOCAL(oparg, value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001360 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001361 }
Neil Schemenauer63543862002-02-17 19:10:14 +00001362
Benjamin Petersonddd19492018-09-16 22:38:02 -07001363 case TARGET(POP_TOP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001364 PyObject *value = POP();
1365 Py_DECREF(value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001366 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001367 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001368
Benjamin Petersonddd19492018-09-16 22:38:02 -07001369 case TARGET(ROT_TWO): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001370 PyObject *top = TOP();
1371 PyObject *second = SECOND();
1372 SET_TOP(second);
1373 SET_SECOND(top);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001374 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001375 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001376
Benjamin Petersonddd19492018-09-16 22:38:02 -07001377 case TARGET(ROT_THREE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001378 PyObject *top = TOP();
1379 PyObject *second = SECOND();
1380 PyObject *third = THIRD();
1381 SET_TOP(second);
1382 SET_SECOND(third);
1383 SET_THIRD(top);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001384 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001385 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001386
Benjamin Petersonddd19492018-09-16 22:38:02 -07001387 case TARGET(ROT_FOUR): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001388 PyObject *top = TOP();
1389 PyObject *second = SECOND();
1390 PyObject *third = THIRD();
1391 PyObject *fourth = FOURTH();
1392 SET_TOP(second);
1393 SET_SECOND(third);
1394 SET_THIRD(fourth);
1395 SET_FOURTH(top);
1396 FAST_DISPATCH();
1397 }
1398
Benjamin Petersonddd19492018-09-16 22:38:02 -07001399 case TARGET(DUP_TOP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001400 PyObject *top = TOP();
1401 Py_INCREF(top);
1402 PUSH(top);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001403 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001404 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001405
Benjamin Petersonddd19492018-09-16 22:38:02 -07001406 case TARGET(DUP_TOP_TWO): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001407 PyObject *top = TOP();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001408 PyObject *second = SECOND();
Benjamin Petersonf208df32012-10-12 11:37:56 -04001409 Py_INCREF(top);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001410 Py_INCREF(second);
costypetrisor8ed317f2018-07-31 20:55:14 +00001411 STACK_GROW(2);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001412 SET_TOP(top);
1413 SET_SECOND(second);
Antoine Pitrou74a69fa2010-09-04 18:43:52 +00001414 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001415 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001416
Benjamin Petersonddd19492018-09-16 22:38:02 -07001417 case TARGET(UNARY_POSITIVE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001418 PyObject *value = TOP();
1419 PyObject *res = PyNumber_Positive(value);
1420 Py_DECREF(value);
1421 SET_TOP(res);
1422 if (res == NULL)
1423 goto error;
1424 DISPATCH();
1425 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001426
Benjamin Petersonddd19492018-09-16 22:38:02 -07001427 case TARGET(UNARY_NEGATIVE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001428 PyObject *value = TOP();
1429 PyObject *res = PyNumber_Negative(value);
1430 Py_DECREF(value);
1431 SET_TOP(res);
1432 if (res == NULL)
1433 goto error;
1434 DISPATCH();
1435 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001436
Benjamin Petersonddd19492018-09-16 22:38:02 -07001437 case TARGET(UNARY_NOT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001438 PyObject *value = TOP();
1439 int err = PyObject_IsTrue(value);
1440 Py_DECREF(value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001441 if (err == 0) {
1442 Py_INCREF(Py_True);
1443 SET_TOP(Py_True);
1444 DISPATCH();
1445 }
1446 else if (err > 0) {
1447 Py_INCREF(Py_False);
1448 SET_TOP(Py_False);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001449 DISPATCH();
1450 }
costypetrisor8ed317f2018-07-31 20:55:14 +00001451 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001452 goto error;
1453 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001454
Benjamin Petersonddd19492018-09-16 22:38:02 -07001455 case TARGET(UNARY_INVERT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001456 PyObject *value = TOP();
1457 PyObject *res = PyNumber_Invert(value);
1458 Py_DECREF(value);
1459 SET_TOP(res);
1460 if (res == NULL)
1461 goto error;
1462 DISPATCH();
1463 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001464
Benjamin Petersonddd19492018-09-16 22:38:02 -07001465 case TARGET(BINARY_POWER): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001466 PyObject *exp = POP();
1467 PyObject *base = TOP();
1468 PyObject *res = PyNumber_Power(base, exp, Py_None);
1469 Py_DECREF(base);
1470 Py_DECREF(exp);
1471 SET_TOP(res);
1472 if (res == NULL)
1473 goto error;
1474 DISPATCH();
1475 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001476
Benjamin Petersonddd19492018-09-16 22:38:02 -07001477 case TARGET(BINARY_MULTIPLY): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001478 PyObject *right = POP();
1479 PyObject *left = TOP();
1480 PyObject *res = PyNumber_Multiply(left, right);
1481 Py_DECREF(left);
1482 Py_DECREF(right);
1483 SET_TOP(res);
1484 if (res == NULL)
1485 goto error;
1486 DISPATCH();
1487 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001488
Benjamin Petersonddd19492018-09-16 22:38:02 -07001489 case TARGET(BINARY_MATRIX_MULTIPLY): {
Benjamin Petersond51374e2014-04-09 23:55:56 -04001490 PyObject *right = POP();
1491 PyObject *left = TOP();
1492 PyObject *res = PyNumber_MatrixMultiply(left, right);
1493 Py_DECREF(left);
1494 Py_DECREF(right);
1495 SET_TOP(res);
1496 if (res == NULL)
1497 goto error;
1498 DISPATCH();
1499 }
1500
Benjamin Petersonddd19492018-09-16 22:38:02 -07001501 case TARGET(BINARY_TRUE_DIVIDE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001502 PyObject *divisor = POP();
1503 PyObject *dividend = TOP();
1504 PyObject *quotient = PyNumber_TrueDivide(dividend, divisor);
1505 Py_DECREF(dividend);
1506 Py_DECREF(divisor);
1507 SET_TOP(quotient);
1508 if (quotient == NULL)
1509 goto error;
1510 DISPATCH();
1511 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001512
Benjamin Petersonddd19492018-09-16 22:38:02 -07001513 case TARGET(BINARY_FLOOR_DIVIDE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001514 PyObject *divisor = POP();
1515 PyObject *dividend = TOP();
1516 PyObject *quotient = PyNumber_FloorDivide(dividend, divisor);
1517 Py_DECREF(dividend);
1518 Py_DECREF(divisor);
1519 SET_TOP(quotient);
1520 if (quotient == NULL)
1521 goto error;
1522 DISPATCH();
1523 }
Guido van Rossum4668b002001-08-08 05:00:18 +00001524
Benjamin Petersonddd19492018-09-16 22:38:02 -07001525 case TARGET(BINARY_MODULO): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001526 PyObject *divisor = POP();
1527 PyObject *dividend = TOP();
Martijn Pietersd7e64332017-02-23 13:38:04 +00001528 PyObject *res;
1529 if (PyUnicode_CheckExact(dividend) && (
1530 !PyUnicode_Check(divisor) || PyUnicode_CheckExact(divisor))) {
1531 // fast path; string formatting, but not if the RHS is a str subclass
1532 // (see issue28598)
1533 res = PyUnicode_Format(dividend, divisor);
1534 } else {
1535 res = PyNumber_Remainder(dividend, divisor);
1536 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001537 Py_DECREF(divisor);
1538 Py_DECREF(dividend);
1539 SET_TOP(res);
1540 if (res == NULL)
1541 goto error;
1542 DISPATCH();
1543 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001544
Benjamin Petersonddd19492018-09-16 22:38:02 -07001545 case TARGET(BINARY_ADD): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001546 PyObject *right = POP();
1547 PyObject *left = TOP();
1548 PyObject *sum;
Victor Stinnerd65f42a2016-10-20 12:18:10 +02001549 /* NOTE(haypo): Please don't try to micro-optimize int+int on
1550 CPython using bytecode, it is simply worthless.
1551 See http://bugs.python.org/issue21955 and
1552 http://bugs.python.org/issue10044 for the discussion. In short,
1553 no patch shown any impact on a realistic benchmark, only a minor
1554 speedup on microbenchmarks. */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001555 if (PyUnicode_CheckExact(left) &&
1556 PyUnicode_CheckExact(right)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02001557 sum = unicode_concatenate(tstate, left, right, f, next_instr);
Martin Panter95f53c12016-07-18 08:23:26 +00001558 /* unicode_concatenate consumed the ref to left */
Victor Stinnerd2a915d2011-10-02 20:34:20 +02001559 }
1560 else {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001561 sum = PyNumber_Add(left, right);
1562 Py_DECREF(left);
Victor Stinnerd2a915d2011-10-02 20:34:20 +02001563 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001564 Py_DECREF(right);
1565 SET_TOP(sum);
1566 if (sum == NULL)
1567 goto error;
1568 DISPATCH();
1569 }
1570
Benjamin Petersonddd19492018-09-16 22:38:02 -07001571 case TARGET(BINARY_SUBTRACT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001572 PyObject *right = POP();
1573 PyObject *left = TOP();
1574 PyObject *diff = PyNumber_Subtract(left, right);
1575 Py_DECREF(right);
1576 Py_DECREF(left);
1577 SET_TOP(diff);
1578 if (diff == NULL)
1579 goto error;
1580 DISPATCH();
1581 }
1582
Benjamin Petersonddd19492018-09-16 22:38:02 -07001583 case TARGET(BINARY_SUBSCR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001584 PyObject *sub = POP();
1585 PyObject *container = TOP();
1586 PyObject *res = PyObject_GetItem(container, sub);
1587 Py_DECREF(container);
1588 Py_DECREF(sub);
1589 SET_TOP(res);
1590 if (res == NULL)
1591 goto error;
1592 DISPATCH();
1593 }
1594
Benjamin Petersonddd19492018-09-16 22:38:02 -07001595 case TARGET(BINARY_LSHIFT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001596 PyObject *right = POP();
1597 PyObject *left = TOP();
1598 PyObject *res = PyNumber_Lshift(left, right);
1599 Py_DECREF(left);
1600 Py_DECREF(right);
1601 SET_TOP(res);
1602 if (res == NULL)
1603 goto error;
1604 DISPATCH();
1605 }
1606
Benjamin Petersonddd19492018-09-16 22:38:02 -07001607 case TARGET(BINARY_RSHIFT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001608 PyObject *right = POP();
1609 PyObject *left = TOP();
1610 PyObject *res = PyNumber_Rshift(left, right);
1611 Py_DECREF(left);
1612 Py_DECREF(right);
1613 SET_TOP(res);
1614 if (res == NULL)
1615 goto error;
1616 DISPATCH();
1617 }
1618
Benjamin Petersonddd19492018-09-16 22:38:02 -07001619 case TARGET(BINARY_AND): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001620 PyObject *right = POP();
1621 PyObject *left = TOP();
1622 PyObject *res = PyNumber_And(left, right);
1623 Py_DECREF(left);
1624 Py_DECREF(right);
1625 SET_TOP(res);
1626 if (res == NULL)
1627 goto error;
1628 DISPATCH();
1629 }
1630
Benjamin Petersonddd19492018-09-16 22:38:02 -07001631 case TARGET(BINARY_XOR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001632 PyObject *right = POP();
1633 PyObject *left = TOP();
1634 PyObject *res = PyNumber_Xor(left, right);
1635 Py_DECREF(left);
1636 Py_DECREF(right);
1637 SET_TOP(res);
1638 if (res == NULL)
1639 goto error;
1640 DISPATCH();
1641 }
1642
Benjamin Petersonddd19492018-09-16 22:38:02 -07001643 case TARGET(BINARY_OR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001644 PyObject *right = POP();
1645 PyObject *left = TOP();
1646 PyObject *res = PyNumber_Or(left, right);
1647 Py_DECREF(left);
1648 Py_DECREF(right);
1649 SET_TOP(res);
1650 if (res == NULL)
1651 goto error;
1652 DISPATCH();
1653 }
1654
Benjamin Petersonddd19492018-09-16 22:38:02 -07001655 case TARGET(LIST_APPEND): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001656 PyObject *v = POP();
1657 PyObject *list = PEEK(oparg);
1658 int err;
1659 err = PyList_Append(list, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001660 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001661 if (err != 0)
1662 goto error;
1663 PREDICT(JUMP_ABSOLUTE);
1664 DISPATCH();
1665 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001666
Benjamin Petersonddd19492018-09-16 22:38:02 -07001667 case TARGET(SET_ADD): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001668 PyObject *v = POP();
Raymond Hettinger41862222016-10-15 19:03:06 -07001669 PyObject *set = PEEK(oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001670 int err;
1671 err = PySet_Add(set, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001672 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001673 if (err != 0)
1674 goto error;
1675 PREDICT(JUMP_ABSOLUTE);
1676 DISPATCH();
1677 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001678
Benjamin Petersonddd19492018-09-16 22:38:02 -07001679 case TARGET(INPLACE_POWER): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001680 PyObject *exp = POP();
1681 PyObject *base = TOP();
1682 PyObject *res = PyNumber_InPlacePower(base, exp, Py_None);
1683 Py_DECREF(base);
1684 Py_DECREF(exp);
1685 SET_TOP(res);
1686 if (res == NULL)
1687 goto error;
1688 DISPATCH();
1689 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001690
Benjamin Petersonddd19492018-09-16 22:38:02 -07001691 case TARGET(INPLACE_MULTIPLY): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001692 PyObject *right = POP();
1693 PyObject *left = TOP();
1694 PyObject *res = PyNumber_InPlaceMultiply(left, right);
1695 Py_DECREF(left);
1696 Py_DECREF(right);
1697 SET_TOP(res);
1698 if (res == NULL)
1699 goto error;
1700 DISPATCH();
1701 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001702
Benjamin Petersonddd19492018-09-16 22:38:02 -07001703 case TARGET(INPLACE_MATRIX_MULTIPLY): {
Benjamin Petersond51374e2014-04-09 23:55:56 -04001704 PyObject *right = POP();
1705 PyObject *left = TOP();
1706 PyObject *res = PyNumber_InPlaceMatrixMultiply(left, right);
1707 Py_DECREF(left);
1708 Py_DECREF(right);
1709 SET_TOP(res);
1710 if (res == NULL)
1711 goto error;
1712 DISPATCH();
1713 }
1714
Benjamin Petersonddd19492018-09-16 22:38:02 -07001715 case TARGET(INPLACE_TRUE_DIVIDE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001716 PyObject *divisor = POP();
1717 PyObject *dividend = TOP();
1718 PyObject *quotient = PyNumber_InPlaceTrueDivide(dividend, divisor);
1719 Py_DECREF(dividend);
1720 Py_DECREF(divisor);
1721 SET_TOP(quotient);
1722 if (quotient == NULL)
1723 goto error;
1724 DISPATCH();
1725 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001726
Benjamin Petersonddd19492018-09-16 22:38:02 -07001727 case TARGET(INPLACE_FLOOR_DIVIDE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001728 PyObject *divisor = POP();
1729 PyObject *dividend = TOP();
1730 PyObject *quotient = PyNumber_InPlaceFloorDivide(dividend, divisor);
1731 Py_DECREF(dividend);
1732 Py_DECREF(divisor);
1733 SET_TOP(quotient);
1734 if (quotient == NULL)
1735 goto error;
1736 DISPATCH();
1737 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001738
Benjamin Petersonddd19492018-09-16 22:38:02 -07001739 case TARGET(INPLACE_MODULO): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001740 PyObject *right = POP();
1741 PyObject *left = TOP();
1742 PyObject *mod = PyNumber_InPlaceRemainder(left, right);
1743 Py_DECREF(left);
1744 Py_DECREF(right);
1745 SET_TOP(mod);
1746 if (mod == NULL)
1747 goto error;
1748 DISPATCH();
1749 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001750
Benjamin Petersonddd19492018-09-16 22:38:02 -07001751 case TARGET(INPLACE_ADD): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001752 PyObject *right = POP();
1753 PyObject *left = TOP();
1754 PyObject *sum;
1755 if (PyUnicode_CheckExact(left) && PyUnicode_CheckExact(right)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02001756 sum = unicode_concatenate(tstate, left, right, f, next_instr);
Martin Panter95f53c12016-07-18 08:23:26 +00001757 /* unicode_concatenate consumed the ref to left */
Victor Stinnerd2a915d2011-10-02 20:34:20 +02001758 }
1759 else {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001760 sum = PyNumber_InPlaceAdd(left, right);
1761 Py_DECREF(left);
Victor Stinnerd2a915d2011-10-02 20:34:20 +02001762 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001763 Py_DECREF(right);
1764 SET_TOP(sum);
1765 if (sum == NULL)
1766 goto error;
1767 DISPATCH();
1768 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001769
Benjamin Petersonddd19492018-09-16 22:38:02 -07001770 case TARGET(INPLACE_SUBTRACT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001771 PyObject *right = POP();
1772 PyObject *left = TOP();
1773 PyObject *diff = PyNumber_InPlaceSubtract(left, right);
1774 Py_DECREF(left);
1775 Py_DECREF(right);
1776 SET_TOP(diff);
1777 if (diff == NULL)
1778 goto error;
1779 DISPATCH();
1780 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001781
Benjamin Petersonddd19492018-09-16 22:38:02 -07001782 case TARGET(INPLACE_LSHIFT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001783 PyObject *right = POP();
1784 PyObject *left = TOP();
1785 PyObject *res = PyNumber_InPlaceLshift(left, right);
1786 Py_DECREF(left);
1787 Py_DECREF(right);
1788 SET_TOP(res);
1789 if (res == NULL)
1790 goto error;
1791 DISPATCH();
1792 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001793
Benjamin Petersonddd19492018-09-16 22:38:02 -07001794 case TARGET(INPLACE_RSHIFT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001795 PyObject *right = POP();
1796 PyObject *left = TOP();
1797 PyObject *res = PyNumber_InPlaceRshift(left, right);
1798 Py_DECREF(left);
1799 Py_DECREF(right);
1800 SET_TOP(res);
1801 if (res == NULL)
1802 goto error;
1803 DISPATCH();
1804 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001805
Benjamin Petersonddd19492018-09-16 22:38:02 -07001806 case TARGET(INPLACE_AND): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001807 PyObject *right = POP();
1808 PyObject *left = TOP();
1809 PyObject *res = PyNumber_InPlaceAnd(left, right);
1810 Py_DECREF(left);
1811 Py_DECREF(right);
1812 SET_TOP(res);
1813 if (res == NULL)
1814 goto error;
1815 DISPATCH();
1816 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001817
Benjamin Petersonddd19492018-09-16 22:38:02 -07001818 case TARGET(INPLACE_XOR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001819 PyObject *right = POP();
1820 PyObject *left = TOP();
1821 PyObject *res = PyNumber_InPlaceXor(left, right);
1822 Py_DECREF(left);
1823 Py_DECREF(right);
1824 SET_TOP(res);
1825 if (res == NULL)
1826 goto error;
1827 DISPATCH();
1828 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001829
Benjamin Petersonddd19492018-09-16 22:38:02 -07001830 case TARGET(INPLACE_OR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001831 PyObject *right = POP();
1832 PyObject *left = TOP();
1833 PyObject *res = PyNumber_InPlaceOr(left, right);
1834 Py_DECREF(left);
1835 Py_DECREF(right);
1836 SET_TOP(res);
1837 if (res == NULL)
1838 goto error;
1839 DISPATCH();
1840 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001841
Benjamin Petersonddd19492018-09-16 22:38:02 -07001842 case TARGET(STORE_SUBSCR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001843 PyObject *sub = TOP();
1844 PyObject *container = SECOND();
1845 PyObject *v = THIRD();
1846 int err;
costypetrisor8ed317f2018-07-31 20:55:14 +00001847 STACK_SHRINK(3);
Martin Panter95f53c12016-07-18 08:23:26 +00001848 /* container[sub] = v */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001849 err = PyObject_SetItem(container, sub, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001850 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001851 Py_DECREF(container);
1852 Py_DECREF(sub);
1853 if (err != 0)
1854 goto error;
1855 DISPATCH();
1856 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001857
Benjamin Petersonddd19492018-09-16 22:38:02 -07001858 case TARGET(DELETE_SUBSCR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001859 PyObject *sub = TOP();
1860 PyObject *container = SECOND();
1861 int err;
costypetrisor8ed317f2018-07-31 20:55:14 +00001862 STACK_SHRINK(2);
Martin Panter95f53c12016-07-18 08:23:26 +00001863 /* del container[sub] */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001864 err = PyObject_DelItem(container, sub);
1865 Py_DECREF(container);
1866 Py_DECREF(sub);
1867 if (err != 0)
1868 goto error;
1869 DISPATCH();
1870 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001871
Benjamin Petersonddd19492018-09-16 22:38:02 -07001872 case TARGET(PRINT_EXPR): {
Victor Stinnercab75e32013-11-06 22:38:37 +01001873 _Py_IDENTIFIER(displayhook);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001874 PyObject *value = POP();
Victor Stinnercab75e32013-11-06 22:38:37 +01001875 PyObject *hook = _PySys_GetObjectId(&PyId_displayhook);
Benjamin Petersonfe1bcb62012-10-12 11:40:01 -04001876 PyObject *res;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001877 if (hook == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02001878 _PyErr_SetString(tstate, PyExc_RuntimeError,
1879 "lost sys.displayhook");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001880 Py_DECREF(value);
1881 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001882 }
Jeroen Demeyer196a5302019-07-04 12:31:34 +02001883 res = _PyObject_CallOneArg(hook, value);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001884 Py_DECREF(value);
1885 if (res == NULL)
1886 goto error;
1887 Py_DECREF(res);
1888 DISPATCH();
1889 }
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001890
Benjamin Petersonddd19492018-09-16 22:38:02 -07001891 case TARGET(RAISE_VARARGS): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001892 PyObject *cause = NULL, *exc = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001893 switch (oparg) {
1894 case 2:
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001895 cause = POP(); /* cause */
Stefan Krahf432a322017-08-21 13:09:59 +02001896 /* fall through */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001897 case 1:
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001898 exc = POP(); /* exc */
Stefan Krahf432a322017-08-21 13:09:59 +02001899 /* fall through */
1900 case 0:
Victor Stinner09532fe2019-05-10 23:39:09 +02001901 if (do_raise(tstate, exc, cause)) {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001902 goto exception_unwind;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001903 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001904 break;
1905 default:
Victor Stinner438a12d2019-05-24 17:01:38 +02001906 _PyErr_SetString(tstate, PyExc_SystemError,
1907 "bad RAISE_VARARGS oparg");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001908 break;
1909 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001910 goto error;
1911 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001912
Benjamin Petersonddd19492018-09-16 22:38:02 -07001913 case TARGET(RETURN_VALUE): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001914 retval = POP();
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001915 assert(f->f_iblock == 0);
Mark Shannone7c9f4a2020-01-13 12:51:26 +00001916 assert(EMPTY());
1917 goto exiting;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001918 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001919
Benjamin Petersonddd19492018-09-16 22:38:02 -07001920 case TARGET(GET_AITER): {
Yury Selivanov6ef05902015-05-28 11:21:31 -04001921 unaryfunc getter = NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04001922 PyObject *iter = NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04001923 PyObject *obj = TOP();
1924 PyTypeObject *type = Py_TYPE(obj);
1925
Yury Selivanova6f6edb2016-06-09 15:08:31 -04001926 if (type->tp_as_async != NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04001927 getter = type->tp_as_async->am_aiter;
Yury Selivanova6f6edb2016-06-09 15:08:31 -04001928 }
Yury Selivanov75445082015-05-11 22:57:16 -04001929
1930 if (getter != NULL) {
1931 iter = (*getter)(obj);
1932 Py_DECREF(obj);
1933 if (iter == NULL) {
1934 SET_TOP(NULL);
1935 goto error;
1936 }
1937 }
1938 else {
1939 SET_TOP(NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02001940 _PyErr_Format(tstate, PyExc_TypeError,
1941 "'async for' requires an object with "
1942 "__aiter__ method, got %.100s",
1943 type->tp_name);
Yury Selivanov75445082015-05-11 22:57:16 -04001944 Py_DECREF(obj);
1945 goto error;
1946 }
1947
Yury Selivanovfaa135a2017-10-06 02:08:57 -04001948 if (Py_TYPE(iter)->tp_as_async == NULL ||
1949 Py_TYPE(iter)->tp_as_async->am_anext == NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04001950
Yury Selivanov398ff912017-03-02 22:20:00 -05001951 SET_TOP(NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02001952 _PyErr_Format(tstate, PyExc_TypeError,
1953 "'async for' received an object from __aiter__ "
1954 "that does not implement __anext__: %.100s",
1955 Py_TYPE(iter)->tp_name);
Yury Selivanov75445082015-05-11 22:57:16 -04001956 Py_DECREF(iter);
1957 goto error;
Yury Selivanova6f6edb2016-06-09 15:08:31 -04001958 }
1959
Yury Selivanovfaa135a2017-10-06 02:08:57 -04001960 SET_TOP(iter);
Yury Selivanov75445082015-05-11 22:57:16 -04001961 DISPATCH();
1962 }
1963
Benjamin Petersonddd19492018-09-16 22:38:02 -07001964 case TARGET(GET_ANEXT): {
Yury Selivanov6ef05902015-05-28 11:21:31 -04001965 unaryfunc getter = NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04001966 PyObject *next_iter = NULL;
1967 PyObject *awaitable = NULL;
1968 PyObject *aiter = TOP();
1969 PyTypeObject *type = Py_TYPE(aiter);
1970
Yury Selivanoveb636452016-09-08 22:01:51 -07001971 if (PyAsyncGen_CheckExact(aiter)) {
1972 awaitable = type->tp_as_async->am_anext(aiter);
1973 if (awaitable == NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04001974 goto error;
1975 }
Yury Selivanoveb636452016-09-08 22:01:51 -07001976 } else {
1977 if (type->tp_as_async != NULL){
1978 getter = type->tp_as_async->am_anext;
1979 }
Yury Selivanov75445082015-05-11 22:57:16 -04001980
Yury Selivanoveb636452016-09-08 22:01:51 -07001981 if (getter != NULL) {
1982 next_iter = (*getter)(aiter);
1983 if (next_iter == NULL) {
1984 goto error;
1985 }
1986 }
1987 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02001988 _PyErr_Format(tstate, PyExc_TypeError,
1989 "'async for' requires an iterator with "
1990 "__anext__ method, got %.100s",
1991 type->tp_name);
Yury Selivanoveb636452016-09-08 22:01:51 -07001992 goto error;
1993 }
Yury Selivanov75445082015-05-11 22:57:16 -04001994
Yury Selivanoveb636452016-09-08 22:01:51 -07001995 awaitable = _PyCoro_GetAwaitableIter(next_iter);
1996 if (awaitable == NULL) {
Yury Selivanov398ff912017-03-02 22:20:00 -05001997 _PyErr_FormatFromCause(
Yury Selivanoveb636452016-09-08 22:01:51 -07001998 PyExc_TypeError,
1999 "'async for' received an invalid object "
2000 "from __anext__: %.100s",
2001 Py_TYPE(next_iter)->tp_name);
2002
2003 Py_DECREF(next_iter);
2004 goto error;
2005 } else {
2006 Py_DECREF(next_iter);
2007 }
2008 }
Yury Selivanov75445082015-05-11 22:57:16 -04002009
2010 PUSH(awaitable);
Serhiy Storchakada9c5132016-06-27 18:58:57 +03002011 PREDICT(LOAD_CONST);
Yury Selivanov75445082015-05-11 22:57:16 -04002012 DISPATCH();
2013 }
2014
Benjamin Petersonddd19492018-09-16 22:38:02 -07002015 case TARGET(GET_AWAITABLE): {
2016 PREDICTED(GET_AWAITABLE);
Yury Selivanov75445082015-05-11 22:57:16 -04002017 PyObject *iterable = TOP();
Yury Selivanov5376ba92015-06-22 12:19:30 -04002018 PyObject *iter = _PyCoro_GetAwaitableIter(iterable);
Yury Selivanov75445082015-05-11 22:57:16 -04002019
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03002020 if (iter == NULL) {
Mark Shannonfee55262019-11-21 09:11:43 +00002021 int opcode_at_minus_3 = 0;
2022 if ((next_instr - first_instr) > 2) {
2023 opcode_at_minus_3 = _Py_OPCODE(next_instr[-3]);
2024 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002025 format_awaitable_error(tstate, Py_TYPE(iterable),
Mark Shannonfee55262019-11-21 09:11:43 +00002026 opcode_at_minus_3,
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03002027 _Py_OPCODE(next_instr[-2]));
2028 }
2029
Yury Selivanov75445082015-05-11 22:57:16 -04002030 Py_DECREF(iterable);
2031
Yury Selivanovc724bae2016-03-02 11:30:46 -05002032 if (iter != NULL && PyCoro_CheckExact(iter)) {
2033 PyObject *yf = _PyGen_yf((PyGenObject*)iter);
2034 if (yf != NULL) {
2035 /* `iter` is a coroutine object that is being
2036 awaited, `yf` is a pointer to the current awaitable
2037 being awaited on. */
2038 Py_DECREF(yf);
2039 Py_CLEAR(iter);
Victor Stinner438a12d2019-05-24 17:01:38 +02002040 _PyErr_SetString(tstate, PyExc_RuntimeError,
2041 "coroutine is being awaited already");
Yury Selivanovc724bae2016-03-02 11:30:46 -05002042 /* The code below jumps to `error` if `iter` is NULL. */
2043 }
2044 }
2045
Yury Selivanov75445082015-05-11 22:57:16 -04002046 SET_TOP(iter); /* Even if it's NULL */
2047
2048 if (iter == NULL) {
2049 goto error;
2050 }
2051
Serhiy Storchakada9c5132016-06-27 18:58:57 +03002052 PREDICT(LOAD_CONST);
Yury Selivanov75445082015-05-11 22:57:16 -04002053 DISPATCH();
2054 }
2055
Benjamin Petersonddd19492018-09-16 22:38:02 -07002056 case TARGET(YIELD_FROM): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002057 PyObject *v = POP();
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07002058 PyObject *receiver = TOP();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002059 int err;
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07002060 if (PyGen_CheckExact(receiver) || PyCoro_CheckExact(receiver)) {
2061 retval = _PyGen_Send((PyGenObject *)receiver, v);
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05002062 } else {
Benjamin Peterson302e7902012-03-20 23:17:04 -04002063 _Py_IDENTIFIER(send);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002064 if (v == Py_None)
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07002065 retval = Py_TYPE(receiver)->tp_iternext(receiver);
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05002066 else
Jeroen Demeyer59ad1102019-07-11 10:59:05 +02002067 retval = _PyObject_CallMethodIdOneArg(receiver, &PyId_send, v);
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05002068 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002069 Py_DECREF(v);
2070 if (retval == NULL) {
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05002071 PyObject *val;
Guido van Rossum8820c232013-11-21 11:30:06 -08002072 if (tstate->c_tracefunc != NULL
Victor Stinner438a12d2019-05-24 17:01:38 +02002073 && _PyErr_ExceptionMatches(tstate, PyExc_StopIteration))
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01002074 call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj, tstate, f);
Nick Coghlanc40bc092012-06-17 15:15:49 +10002075 err = _PyGen_FetchStopIterationValue(&val);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002076 if (err < 0)
2077 goto error;
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07002078 Py_DECREF(receiver);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002079 SET_TOP(val);
2080 DISPATCH();
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002081 }
Martin Panter95f53c12016-07-18 08:23:26 +00002082 /* receiver remains on stack, retval is value to be yielded */
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002083 f->f_stacktop = stack_pointer;
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05002084 /* and repeat... */
Victor Stinnerf7d199f2016-11-24 22:33:01 +01002085 assert(f->f_lasti >= (int)sizeof(_Py_CODEUNIT));
Serhiy Storchakaab874002016-09-11 13:48:15 +03002086 f->f_lasti -= sizeof(_Py_CODEUNIT);
Mark Shannone7c9f4a2020-01-13 12:51:26 +00002087 goto exiting;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002088 }
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002089
Benjamin Petersonddd19492018-09-16 22:38:02 -07002090 case TARGET(YIELD_VALUE): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002091 retval = POP();
Yury Selivanoveb636452016-09-08 22:01:51 -07002092
2093 if (co->co_flags & CO_ASYNC_GENERATOR) {
2094 PyObject *w = _PyAsyncGenValueWrapperNew(retval);
2095 Py_DECREF(retval);
2096 if (w == NULL) {
2097 retval = NULL;
2098 goto error;
2099 }
2100 retval = w;
2101 }
2102
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002103 f->f_stacktop = stack_pointer;
Mark Shannone7c9f4a2020-01-13 12:51:26 +00002104 goto exiting;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002105 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002106
Benjamin Petersonddd19492018-09-16 22:38:02 -07002107 case TARGET(POP_EXCEPT): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002108 PyObject *type, *value, *traceback;
2109 _PyErr_StackItem *exc_info;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002110 PyTryBlock *b = PyFrame_BlockPop(f);
2111 if (b->b_type != EXCEPT_HANDLER) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002112 _PyErr_SetString(tstate, PyExc_SystemError,
2113 "popped block is not an except handler");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002114 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002115 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002116 assert(STACK_LEVEL() >= (b)->b_level + 3 &&
2117 STACK_LEVEL() <= (b)->b_level + 4);
2118 exc_info = tstate->exc_info;
2119 type = exc_info->exc_type;
2120 value = exc_info->exc_value;
2121 traceback = exc_info->exc_traceback;
2122 exc_info->exc_type = POP();
2123 exc_info->exc_value = POP();
2124 exc_info->exc_traceback = POP();
2125 Py_XDECREF(type);
2126 Py_XDECREF(value);
2127 Py_XDECREF(traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002128 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002129 }
Benjamin Petersoneec3d712008-06-11 15:59:43 +00002130
Benjamin Petersonddd19492018-09-16 22:38:02 -07002131 case TARGET(POP_BLOCK): {
2132 PREDICTED(POP_BLOCK);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002133 PyFrame_BlockPop(f);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002134 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002135 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002136
Mark Shannonfee55262019-11-21 09:11:43 +00002137 case TARGET(RERAISE): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002138 PyObject *exc = POP();
Mark Shannonfee55262019-11-21 09:11:43 +00002139 PyObject *val = POP();
2140 PyObject *tb = POP();
2141 assert(PyExceptionClass_Check(exc));
2142 PyErr_Restore(exc, val, tb);
2143 goto exception_unwind;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002144 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002145
Benjamin Petersonddd19492018-09-16 22:38:02 -07002146 case TARGET(END_ASYNC_FOR): {
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002147 PyObject *exc = POP();
2148 assert(PyExceptionClass_Check(exc));
2149 if (PyErr_GivenExceptionMatches(exc, PyExc_StopAsyncIteration)) {
2150 PyTryBlock *b = PyFrame_BlockPop(f);
2151 assert(b->b_type == EXCEPT_HANDLER);
2152 Py_DECREF(exc);
2153 UNWIND_EXCEPT_HANDLER(b);
2154 Py_DECREF(POP());
2155 JUMPBY(oparg);
2156 FAST_DISPATCH();
2157 }
2158 else {
2159 PyObject *val = POP();
2160 PyObject *tb = POP();
Victor Stinner438a12d2019-05-24 17:01:38 +02002161 _PyErr_Restore(tstate, exc, val, tb);
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002162 goto exception_unwind;
2163 }
2164 }
2165
Zackery Spytzce6a0702019-08-25 03:44:09 -06002166 case TARGET(LOAD_ASSERTION_ERROR): {
2167 PyObject *value = PyExc_AssertionError;
2168 Py_INCREF(value);
2169 PUSH(value);
2170 FAST_DISPATCH();
2171 }
2172
Benjamin Petersonddd19492018-09-16 22:38:02 -07002173 case TARGET(LOAD_BUILD_CLASS): {
Victor Stinner3c1e4812012-03-26 22:10:51 +02002174 _Py_IDENTIFIER(__build_class__);
Victor Stinnerb0b22422012-04-19 00:57:45 +02002175
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002176 PyObject *bc;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002177 if (PyDict_CheckExact(f->f_builtins)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002178 bc = _PyDict_GetItemIdWithError(f->f_builtins, &PyId___build_class__);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002179 if (bc == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002180 if (!_PyErr_Occurred(tstate)) {
2181 _PyErr_SetString(tstate, PyExc_NameError,
2182 "__build_class__ not found");
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002183 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002184 goto error;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002185 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002186 Py_INCREF(bc);
Victor Stinnerb0b22422012-04-19 00:57:45 +02002187 }
2188 else {
2189 PyObject *build_class_str = _PyUnicode_FromId(&PyId___build_class__);
2190 if (build_class_str == NULL)
Serhiy Storchaka70b72f02016-11-08 23:12:46 +02002191 goto error;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002192 bc = PyObject_GetItem(f->f_builtins, build_class_str);
2193 if (bc == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002194 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError))
2195 _PyErr_SetString(tstate, PyExc_NameError,
2196 "__build_class__ not found");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002197 goto error;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002198 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002199 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002200 PUSH(bc);
Benjamin Peterson00f86f22012-10-10 14:10:33 -04002201 DISPATCH();
Victor Stinner3c1e4812012-03-26 22:10:51 +02002202 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002203
Benjamin Petersonddd19492018-09-16 22:38:02 -07002204 case TARGET(STORE_NAME): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002205 PyObject *name = GETITEM(names, oparg);
2206 PyObject *v = POP();
2207 PyObject *ns = f->f_locals;
2208 int err;
2209 if (ns == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002210 _PyErr_Format(tstate, PyExc_SystemError,
2211 "no locals found when storing %R", name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002212 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002213 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002214 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002215 if (PyDict_CheckExact(ns))
2216 err = PyDict_SetItem(ns, name, v);
2217 else
2218 err = PyObject_SetItem(ns, name, v);
2219 Py_DECREF(v);
2220 if (err != 0)
2221 goto error;
2222 DISPATCH();
2223 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002224
Benjamin Petersonddd19492018-09-16 22:38:02 -07002225 case TARGET(DELETE_NAME): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002226 PyObject *name = GETITEM(names, oparg);
2227 PyObject *ns = f->f_locals;
2228 int err;
2229 if (ns == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002230 _PyErr_Format(tstate, PyExc_SystemError,
2231 "no locals when deleting %R", name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002232 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002233 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002234 err = PyObject_DelItem(ns, name);
2235 if (err != 0) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002236 format_exc_check_arg(tstate, PyExc_NameError,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002237 NAME_ERROR_MSG,
2238 name);
2239 goto error;
2240 }
2241 DISPATCH();
2242 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00002243
Benjamin Petersonddd19492018-09-16 22:38:02 -07002244 case TARGET(UNPACK_SEQUENCE): {
2245 PREDICTED(UNPACK_SEQUENCE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002246 PyObject *seq = POP(), *item, **items;
2247 if (PyTuple_CheckExact(seq) &&
2248 PyTuple_GET_SIZE(seq) == oparg) {
2249 items = ((PyTupleObject *)seq)->ob_item;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002250 while (oparg--) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002251 item = items[oparg];
2252 Py_INCREF(item);
2253 PUSH(item);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002254 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002255 } else if (PyList_CheckExact(seq) &&
2256 PyList_GET_SIZE(seq) == oparg) {
2257 items = ((PyListObject *)seq)->ob_item;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002258 while (oparg--) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002259 item = items[oparg];
2260 Py_INCREF(item);
2261 PUSH(item);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002262 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002263 } else if (unpack_iterable(tstate, seq, oparg, -1,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002264 stack_pointer + oparg)) {
costypetrisor8ed317f2018-07-31 20:55:14 +00002265 STACK_GROW(oparg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002266 } else {
2267 /* unpack_iterable() raised an exception */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002268 Py_DECREF(seq);
2269 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002270 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002271 Py_DECREF(seq);
Benjamin Peterson00f86f22012-10-10 14:10:33 -04002272 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002273 }
Guido van Rossum0368b722007-05-11 16:50:42 +00002274
Benjamin Petersonddd19492018-09-16 22:38:02 -07002275 case TARGET(UNPACK_EX): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002276 int totalargs = 1 + (oparg & 0xFF) + (oparg >> 8);
2277 PyObject *seq = POP();
2278
Victor Stinner438a12d2019-05-24 17:01:38 +02002279 if (unpack_iterable(tstate, seq, oparg & 0xFF, oparg >> 8,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002280 stack_pointer + totalargs)) {
2281 stack_pointer += totalargs;
2282 } else {
2283 Py_DECREF(seq);
2284 goto error;
2285 }
2286 Py_DECREF(seq);
2287 DISPATCH();
2288 }
2289
Benjamin Petersonddd19492018-09-16 22:38:02 -07002290 case TARGET(STORE_ATTR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002291 PyObject *name = GETITEM(names, oparg);
2292 PyObject *owner = TOP();
2293 PyObject *v = SECOND();
2294 int err;
costypetrisor8ed317f2018-07-31 20:55:14 +00002295 STACK_SHRINK(2);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002296 err = PyObject_SetAttr(owner, name, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002297 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002298 Py_DECREF(owner);
2299 if (err != 0)
2300 goto error;
2301 DISPATCH();
2302 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002303
Benjamin Petersonddd19492018-09-16 22:38:02 -07002304 case TARGET(DELETE_ATTR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002305 PyObject *name = GETITEM(names, oparg);
2306 PyObject *owner = POP();
2307 int err;
2308 err = PyObject_SetAttr(owner, name, (PyObject *)NULL);
2309 Py_DECREF(owner);
2310 if (err != 0)
2311 goto error;
2312 DISPATCH();
2313 }
2314
Benjamin Petersonddd19492018-09-16 22:38:02 -07002315 case TARGET(STORE_GLOBAL): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002316 PyObject *name = GETITEM(names, oparg);
2317 PyObject *v = POP();
2318 int err;
2319 err = PyDict_SetItem(f->f_globals, name, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002320 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002321 if (err != 0)
2322 goto error;
2323 DISPATCH();
2324 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002325
Benjamin Petersonddd19492018-09-16 22:38:02 -07002326 case TARGET(DELETE_GLOBAL): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002327 PyObject *name = GETITEM(names, oparg);
2328 int err;
2329 err = PyDict_DelItem(f->f_globals, name);
2330 if (err != 0) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002331 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
2332 format_exc_check_arg(tstate, PyExc_NameError,
2333 NAME_ERROR_MSG, name);
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002334 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002335 goto error;
Benjamin Peterson00f86f22012-10-10 14:10:33 -04002336 }
2337 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002338 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002339
Benjamin Petersonddd19492018-09-16 22:38:02 -07002340 case TARGET(LOAD_NAME): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002341 PyObject *name = GETITEM(names, oparg);
2342 PyObject *locals = f->f_locals;
2343 PyObject *v;
2344 if (locals == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002345 _PyErr_Format(tstate, PyExc_SystemError,
2346 "no locals when loading %R", name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002347 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002348 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002349 if (PyDict_CheckExact(locals)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002350 v = PyDict_GetItemWithError(locals, name);
2351 if (v != NULL) {
2352 Py_INCREF(v);
2353 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002354 else if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002355 goto error;
2356 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002357 }
2358 else {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002359 v = PyObject_GetItem(locals, name);
Victor Stinnere20310f2015-11-05 13:56:58 +01002360 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002361 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError))
Benjamin Peterson92722792012-12-15 12:51:05 -05002362 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02002363 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002364 }
2365 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002366 if (v == NULL) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002367 v = PyDict_GetItemWithError(f->f_globals, name);
2368 if (v != NULL) {
2369 Py_INCREF(v);
2370 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002371 else if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002372 goto error;
2373 }
2374 else {
Victor Stinnerb0b22422012-04-19 00:57:45 +02002375 if (PyDict_CheckExact(f->f_builtins)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002376 v = PyDict_GetItemWithError(f->f_builtins, name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002377 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002378 if (!_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002379 format_exc_check_arg(
Victor Stinner438a12d2019-05-24 17:01:38 +02002380 tstate, PyExc_NameError,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002381 NAME_ERROR_MSG, name);
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002382 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002383 goto error;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002384 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002385 Py_INCREF(v);
Victor Stinnerb0b22422012-04-19 00:57:45 +02002386 }
2387 else {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002388 v = PyObject_GetItem(f->f_builtins, name);
2389 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002390 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Victor Stinnerb0b22422012-04-19 00:57:45 +02002391 format_exc_check_arg(
Victor Stinner438a12d2019-05-24 17:01:38 +02002392 tstate, PyExc_NameError,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002393 NAME_ERROR_MSG, name);
Victor Stinner438a12d2019-05-24 17:01:38 +02002394 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002395 goto error;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002396 }
Benjamin Peterson20f9c3c2010-07-20 22:39:34 +00002397 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002398 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002399 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002400 PUSH(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002401 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002402 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002403
Benjamin Petersonddd19492018-09-16 22:38:02 -07002404 case TARGET(LOAD_GLOBAL): {
Inada Naoki91234a12019-06-03 21:30:58 +09002405 PyObject *name;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002406 PyObject *v;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002407 if (PyDict_CheckExact(f->f_globals)
Victor Stinnerb4efc962015-11-20 09:24:02 +01002408 && PyDict_CheckExact(f->f_builtins))
2409 {
Inada Naoki91234a12019-06-03 21:30:58 +09002410 OPCACHE_CHECK();
2411 if (co_opcache != NULL && co_opcache->optimized > 0) {
2412 _PyOpcache_LoadGlobal *lg = &co_opcache->u.lg;
2413
2414 if (lg->globals_ver ==
2415 ((PyDictObject *)f->f_globals)->ma_version_tag
2416 && lg->builtins_ver ==
2417 ((PyDictObject *)f->f_builtins)->ma_version_tag)
2418 {
2419 PyObject *ptr = lg->ptr;
2420 OPCACHE_STAT_GLOBAL_HIT();
2421 assert(ptr != NULL);
2422 Py_INCREF(ptr);
2423 PUSH(ptr);
2424 DISPATCH();
2425 }
2426 }
2427
2428 name = GETITEM(names, oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002429 v = _PyDict_LoadGlobal((PyDictObject *)f->f_globals,
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002430 (PyDictObject *)f->f_builtins,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002431 name);
2432 if (v == NULL) {
Victor Stinnerb4efc962015-11-20 09:24:02 +01002433 if (!_PyErr_OCCURRED()) {
2434 /* _PyDict_LoadGlobal() returns NULL without raising
2435 * an exception if the key doesn't exist */
Victor Stinner438a12d2019-05-24 17:01:38 +02002436 format_exc_check_arg(tstate, PyExc_NameError,
Ezio Melotti04a29552013-03-03 15:12:44 +02002437 NAME_ERROR_MSG, name);
Victor Stinnerb4efc962015-11-20 09:24:02 +01002438 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002439 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002440 }
Inada Naoki91234a12019-06-03 21:30:58 +09002441
2442 if (co_opcache != NULL) {
2443 _PyOpcache_LoadGlobal *lg = &co_opcache->u.lg;
2444
2445 if (co_opcache->optimized == 0) {
2446 /* Wasn't optimized before. */
2447 OPCACHE_STAT_GLOBAL_OPT();
2448 } else {
2449 OPCACHE_STAT_GLOBAL_MISS();
2450 }
2451
2452 co_opcache->optimized = 1;
2453 lg->globals_ver =
2454 ((PyDictObject *)f->f_globals)->ma_version_tag;
2455 lg->builtins_ver =
2456 ((PyDictObject *)f->f_builtins)->ma_version_tag;
2457 lg->ptr = v; /* borrowed */
2458 }
2459
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002460 Py_INCREF(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002461 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002462 else {
2463 /* Slow-path if globals or builtins is not a dict */
Victor Stinnerb4efc962015-11-20 09:24:02 +01002464
2465 /* namespace 1: globals */
Inada Naoki91234a12019-06-03 21:30:58 +09002466 name = GETITEM(names, oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002467 v = PyObject_GetItem(f->f_globals, name);
2468 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002469 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Victor Stinner60a1d3c2015-11-05 13:55:20 +01002470 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02002471 }
2472 _PyErr_Clear(tstate);
Victor Stinner60a1d3c2015-11-05 13:55:20 +01002473
Victor Stinnerb4efc962015-11-20 09:24:02 +01002474 /* namespace 2: builtins */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002475 v = PyObject_GetItem(f->f_builtins, name);
2476 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002477 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002478 format_exc_check_arg(
Victor Stinner438a12d2019-05-24 17:01:38 +02002479 tstate, PyExc_NameError,
Ezio Melotti04a29552013-03-03 15:12:44 +02002480 NAME_ERROR_MSG, name);
Victor Stinner438a12d2019-05-24 17:01:38 +02002481 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002482 goto error;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002483 }
2484 }
2485 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002486 PUSH(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002487 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002488 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002489
Benjamin Petersonddd19492018-09-16 22:38:02 -07002490 case TARGET(DELETE_FAST): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002491 PyObject *v = GETLOCAL(oparg);
2492 if (v != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002493 SETLOCAL(oparg, NULL);
2494 DISPATCH();
2495 }
2496 format_exc_check_arg(
Victor Stinner438a12d2019-05-24 17:01:38 +02002497 tstate, PyExc_UnboundLocalError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002498 UNBOUNDLOCAL_ERROR_MSG,
2499 PyTuple_GetItem(co->co_varnames, oparg)
2500 );
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002501 goto error;
2502 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002503
Benjamin Petersonddd19492018-09-16 22:38:02 -07002504 case TARGET(DELETE_DEREF): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002505 PyObject *cell = freevars[oparg];
Raymond Hettingerc32f9db2016-11-12 04:10:35 -05002506 PyObject *oldobj = PyCell_GET(cell);
2507 if (oldobj != NULL) {
2508 PyCell_SET(cell, NULL);
2509 Py_DECREF(oldobj);
Benjamin Peterson00ebe2c2010-09-10 22:02:31 +00002510 DISPATCH();
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00002511 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002512 format_exc_unbound(tstate, co, oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002513 goto error;
2514 }
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00002515
Benjamin Petersonddd19492018-09-16 22:38:02 -07002516 case TARGET(LOAD_CLOSURE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002517 PyObject *cell = freevars[oparg];
2518 Py_INCREF(cell);
2519 PUSH(cell);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002520 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002521 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002522
Benjamin Petersonddd19492018-09-16 22:38:02 -07002523 case TARGET(LOAD_CLASSDEREF): {
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002524 PyObject *name, *value, *locals = f->f_locals;
Victor Stinnerd3dfd0e2013-05-16 23:48:01 +02002525 Py_ssize_t idx;
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002526 assert(locals);
2527 assert(oparg >= PyTuple_GET_SIZE(co->co_cellvars));
2528 idx = oparg - PyTuple_GET_SIZE(co->co_cellvars);
2529 assert(idx >= 0 && idx < PyTuple_GET_SIZE(co->co_freevars));
2530 name = PyTuple_GET_ITEM(co->co_freevars, idx);
2531 if (PyDict_CheckExact(locals)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002532 value = PyDict_GetItemWithError(locals, name);
2533 if (value != NULL) {
2534 Py_INCREF(value);
2535 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002536 else if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002537 goto error;
2538 }
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002539 }
2540 else {
2541 value = PyObject_GetItem(locals, name);
Victor Stinnere20310f2015-11-05 13:56:58 +01002542 if (value == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002543 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002544 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02002545 }
2546 _PyErr_Clear(tstate);
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002547 }
2548 }
2549 if (!value) {
2550 PyObject *cell = freevars[oparg];
2551 value = PyCell_GET(cell);
2552 if (value == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002553 format_exc_unbound(tstate, co, oparg);
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002554 goto error;
2555 }
2556 Py_INCREF(value);
2557 }
2558 PUSH(value);
2559 DISPATCH();
2560 }
2561
Benjamin Petersonddd19492018-09-16 22:38:02 -07002562 case TARGET(LOAD_DEREF): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002563 PyObject *cell = freevars[oparg];
2564 PyObject *value = PyCell_GET(cell);
2565 if (value == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002566 format_exc_unbound(tstate, co, oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002567 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002568 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002569 Py_INCREF(value);
2570 PUSH(value);
2571 DISPATCH();
2572 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002573
Benjamin Petersonddd19492018-09-16 22:38:02 -07002574 case TARGET(STORE_DEREF): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002575 PyObject *v = POP();
2576 PyObject *cell = freevars[oparg];
Raymond Hettingerb2b15432016-11-11 04:32:11 -08002577 PyObject *oldobj = PyCell_GET(cell);
2578 PyCell_SET(cell, v);
2579 Py_XDECREF(oldobj);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002580 DISPATCH();
2581 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002582
Benjamin Petersonddd19492018-09-16 22:38:02 -07002583 case TARGET(BUILD_STRING): {
Serhiy Storchakaea525a22016-09-06 22:07:53 +03002584 PyObject *str;
2585 PyObject *empty = PyUnicode_New(0, 0);
2586 if (empty == NULL) {
2587 goto error;
2588 }
2589 str = _PyUnicode_JoinArray(empty, stack_pointer - oparg, oparg);
2590 Py_DECREF(empty);
2591 if (str == NULL)
2592 goto error;
2593 while (--oparg >= 0) {
2594 PyObject *item = POP();
2595 Py_DECREF(item);
2596 }
2597 PUSH(str);
2598 DISPATCH();
2599 }
2600
Benjamin Petersonddd19492018-09-16 22:38:02 -07002601 case TARGET(BUILD_TUPLE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002602 PyObject *tup = PyTuple_New(oparg);
2603 if (tup == NULL)
2604 goto error;
2605 while (--oparg >= 0) {
2606 PyObject *item = POP();
2607 PyTuple_SET_ITEM(tup, oparg, item);
2608 }
2609 PUSH(tup);
2610 DISPATCH();
2611 }
2612
Benjamin Petersonddd19492018-09-16 22:38:02 -07002613 case TARGET(BUILD_LIST): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002614 PyObject *list = PyList_New(oparg);
2615 if (list == NULL)
2616 goto error;
2617 while (--oparg >= 0) {
2618 PyObject *item = POP();
2619 PyList_SET_ITEM(list, oparg, item);
2620 }
2621 PUSH(list);
2622 DISPATCH();
2623 }
2624
Benjamin Petersonddd19492018-09-16 22:38:02 -07002625 case TARGET(BUILD_TUPLE_UNPACK_WITH_CALL):
2626 case TARGET(BUILD_TUPLE_UNPACK):
2627 case TARGET(BUILD_LIST_UNPACK): {
Serhiy Storchaka73442852016-10-02 10:33:46 +03002628 int convert_to_tuple = opcode != BUILD_LIST_UNPACK;
Victor Stinner74319ae2016-08-25 00:04:09 +02002629 Py_ssize_t i;
Serhiy Storchakab7281052016-09-12 00:52:40 +03002630 PyObject *sum = PyList_New(0);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002631 PyObject *return_value;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07002632
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002633 if (sum == NULL)
2634 goto error;
2635
2636 for (i = oparg; i > 0; i--) {
2637 PyObject *none_val;
2638
2639 none_val = _PyList_Extend((PyListObject *)sum, PEEK(i));
2640 if (none_val == NULL) {
Serhiy Storchaka73442852016-10-02 10:33:46 +03002641 if (opcode == BUILD_TUPLE_UNPACK_WITH_CALL &&
Victor Stinner438a12d2019-05-24 17:01:38 +02002642 _PyErr_ExceptionMatches(tstate, PyExc_TypeError))
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03002643 {
Victor Stinner438a12d2019-05-24 17:01:38 +02002644 check_args_iterable(tstate, PEEK(1 + oparg), PEEK(i));
Serhiy Storchaka73442852016-10-02 10:33:46 +03002645 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002646 Py_DECREF(sum);
2647 goto error;
2648 }
2649 Py_DECREF(none_val);
2650 }
2651
2652 if (convert_to_tuple) {
2653 return_value = PyList_AsTuple(sum);
2654 Py_DECREF(sum);
2655 if (return_value == NULL)
2656 goto error;
2657 }
2658 else {
2659 return_value = sum;
2660 }
2661
2662 while (oparg--)
2663 Py_DECREF(POP());
2664 PUSH(return_value);
2665 DISPATCH();
2666 }
2667
Benjamin Petersonddd19492018-09-16 22:38:02 -07002668 case TARGET(BUILD_SET): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002669 PyObject *set = PySet_New(NULL);
2670 int err = 0;
Raymond Hettinger4c483ad2016-09-08 14:45:40 -07002671 int i;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002672 if (set == NULL)
2673 goto error;
Raymond Hettinger4c483ad2016-09-08 14:45:40 -07002674 for (i = oparg; i > 0; i--) {
2675 PyObject *item = PEEK(i);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002676 if (err == 0)
2677 err = PySet_Add(set, item);
2678 Py_DECREF(item);
2679 }
costypetrisor8ed317f2018-07-31 20:55:14 +00002680 STACK_SHRINK(oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002681 if (err != 0) {
2682 Py_DECREF(set);
2683 goto error;
2684 }
2685 PUSH(set);
2686 DISPATCH();
2687 }
2688
Benjamin Petersonddd19492018-09-16 22:38:02 -07002689 case TARGET(BUILD_SET_UNPACK): {
Victor Stinner74319ae2016-08-25 00:04:09 +02002690 Py_ssize_t i;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002691 PyObject *sum = PySet_New(NULL);
2692 if (sum == NULL)
2693 goto error;
2694
2695 for (i = oparg; i > 0; i--) {
2696 if (_PySet_Update(sum, PEEK(i)) < 0) {
2697 Py_DECREF(sum);
2698 goto error;
2699 }
2700 }
2701
2702 while (oparg--)
2703 Py_DECREF(POP());
2704 PUSH(sum);
2705 DISPATCH();
2706 }
2707
Benjamin Petersonddd19492018-09-16 22:38:02 -07002708 case TARGET(BUILD_MAP): {
Victor Stinner74319ae2016-08-25 00:04:09 +02002709 Py_ssize_t i;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002710 PyObject *map = _PyDict_NewPresized((Py_ssize_t)oparg);
2711 if (map == NULL)
2712 goto error;
Benjamin Petersond5d77aa2015-07-05 10:37:25 -05002713 for (i = oparg; i > 0; i--) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002714 int err;
Benjamin Petersond5d77aa2015-07-05 10:37:25 -05002715 PyObject *key = PEEK(2*i);
2716 PyObject *value = PEEK(2*i - 1);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002717 err = PyDict_SetItem(map, key, value);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002718 if (err != 0) {
2719 Py_DECREF(map);
2720 goto error;
2721 }
2722 }
Benjamin Petersond5d77aa2015-07-05 10:37:25 -05002723
2724 while (oparg--) {
2725 Py_DECREF(POP());
2726 Py_DECREF(POP());
2727 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002728 PUSH(map);
2729 DISPATCH();
2730 }
2731
Benjamin Petersonddd19492018-09-16 22:38:02 -07002732 case TARGET(SETUP_ANNOTATIONS): {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002733 _Py_IDENTIFIER(__annotations__);
2734 int err;
2735 PyObject *ann_dict;
2736 if (f->f_locals == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002737 _PyErr_Format(tstate, PyExc_SystemError,
2738 "no locals found when setting up annotations");
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002739 goto error;
2740 }
2741 /* check if __annotations__ in locals()... */
2742 if (PyDict_CheckExact(f->f_locals)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002743 ann_dict = _PyDict_GetItemIdWithError(f->f_locals,
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002744 &PyId___annotations__);
2745 if (ann_dict == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002746 if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002747 goto error;
2748 }
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002749 /* ...if not, create a new one */
2750 ann_dict = PyDict_New();
2751 if (ann_dict == NULL) {
2752 goto error;
2753 }
2754 err = _PyDict_SetItemId(f->f_locals,
2755 &PyId___annotations__, ann_dict);
2756 Py_DECREF(ann_dict);
2757 if (err != 0) {
2758 goto error;
2759 }
2760 }
2761 }
2762 else {
2763 /* do the same if locals() is not a dict */
2764 PyObject *ann_str = _PyUnicode_FromId(&PyId___annotations__);
2765 if (ann_str == NULL) {
Serhiy Storchaka4678b2f2016-11-08 23:13:36 +02002766 goto error;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002767 }
2768 ann_dict = PyObject_GetItem(f->f_locals, ann_str);
2769 if (ann_dict == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002770 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002771 goto error;
2772 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002773 _PyErr_Clear(tstate);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002774 ann_dict = PyDict_New();
2775 if (ann_dict == NULL) {
2776 goto error;
2777 }
2778 err = PyObject_SetItem(f->f_locals, ann_str, ann_dict);
2779 Py_DECREF(ann_dict);
2780 if (err != 0) {
2781 goto error;
2782 }
2783 }
2784 else {
2785 Py_DECREF(ann_dict);
2786 }
2787 }
2788 DISPATCH();
2789 }
2790
Benjamin Petersonddd19492018-09-16 22:38:02 -07002791 case TARGET(BUILD_CONST_KEY_MAP): {
Victor Stinner74319ae2016-08-25 00:04:09 +02002792 Py_ssize_t i;
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03002793 PyObject *map;
2794 PyObject *keys = TOP();
2795 if (!PyTuple_CheckExact(keys) ||
2796 PyTuple_GET_SIZE(keys) != (Py_ssize_t)oparg) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002797 _PyErr_SetString(tstate, PyExc_SystemError,
2798 "bad BUILD_CONST_KEY_MAP keys argument");
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03002799 goto error;
2800 }
2801 map = _PyDict_NewPresized((Py_ssize_t)oparg);
2802 if (map == NULL) {
2803 goto error;
2804 }
2805 for (i = oparg; i > 0; i--) {
2806 int err;
2807 PyObject *key = PyTuple_GET_ITEM(keys, oparg - i);
2808 PyObject *value = PEEK(i + 1);
2809 err = PyDict_SetItem(map, key, value);
2810 if (err != 0) {
2811 Py_DECREF(map);
2812 goto error;
2813 }
2814 }
2815
2816 Py_DECREF(POP());
2817 while (oparg--) {
2818 Py_DECREF(POP());
2819 }
2820 PUSH(map);
2821 DISPATCH();
2822 }
2823
Benjamin Petersonddd19492018-09-16 22:38:02 -07002824 case TARGET(BUILD_MAP_UNPACK): {
Victor Stinner74319ae2016-08-25 00:04:09 +02002825 Py_ssize_t i;
Serhiy Storchakab7281052016-09-12 00:52:40 +03002826 PyObject *sum = PyDict_New();
Victor Stinnerf9b760f2016-09-09 10:17:08 -07002827 if (sum == NULL)
2828 goto error;
2829
2830 for (i = oparg; i > 0; i--) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002831 PyObject *arg = PEEK(i);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002832 if (PyDict_Update(sum, arg) < 0) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002833 if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) {
2834 _PyErr_Format(tstate, PyExc_TypeError,
2835 "'%.200s' object is not a mapping",
2836 arg->ob_type->tp_name);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002837 }
2838 Py_DECREF(sum);
2839 goto error;
2840 }
2841 }
2842
Victor Stinnerf9b760f2016-09-09 10:17:08 -07002843 while (oparg--)
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002844 Py_DECREF(POP());
2845 PUSH(sum);
2846 DISPATCH();
2847 }
2848
Benjamin Petersonddd19492018-09-16 22:38:02 -07002849 case TARGET(BUILD_MAP_UNPACK_WITH_CALL): {
Serhiy Storchakae036ef82016-10-02 11:06:43 +03002850 Py_ssize_t i;
2851 PyObject *sum = PyDict_New();
2852 if (sum == NULL)
2853 goto error;
2854
2855 for (i = oparg; i > 0; i--) {
2856 PyObject *arg = PEEK(i);
2857 if (_PyDict_MergeEx(sum, arg, 2) < 0) {
Serhiy Storchakae036ef82016-10-02 11:06:43 +03002858 Py_DECREF(sum);
Victor Stinner438a12d2019-05-24 17:01:38 +02002859 format_kwargs_error(tstate, PEEK(2 + oparg), arg);
Serhiy Storchakae036ef82016-10-02 11:06:43 +03002860 goto error;
2861 }
2862 }
2863
2864 while (oparg--)
2865 Py_DECREF(POP());
2866 PUSH(sum);
Brandt Bucherf185a732019-09-28 17:12:49 -07002867 PREDICT(CALL_FUNCTION_EX);
Serhiy Storchakae036ef82016-10-02 11:06:43 +03002868 DISPATCH();
2869 }
2870
Benjamin Petersonddd19492018-09-16 22:38:02 -07002871 case TARGET(MAP_ADD): {
Jörn Heisslerc8a35412019-06-22 16:40:55 +02002872 PyObject *value = TOP();
2873 PyObject *key = SECOND();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002874 PyObject *map;
2875 int err;
costypetrisor8ed317f2018-07-31 20:55:14 +00002876 STACK_SHRINK(2);
Raymond Hettinger41862222016-10-15 19:03:06 -07002877 map = PEEK(oparg); /* dict */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002878 assert(PyDict_CheckExact(map));
Martin Panter95f53c12016-07-18 08:23:26 +00002879 err = PyDict_SetItem(map, key, value); /* map[key] = value */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002880 Py_DECREF(value);
2881 Py_DECREF(key);
2882 if (err != 0)
2883 goto error;
2884 PREDICT(JUMP_ABSOLUTE);
2885 DISPATCH();
2886 }
2887
Benjamin Petersonddd19492018-09-16 22:38:02 -07002888 case TARGET(LOAD_ATTR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002889 PyObject *name = GETITEM(names, oparg);
2890 PyObject *owner = TOP();
2891 PyObject *res = PyObject_GetAttr(owner, name);
2892 Py_DECREF(owner);
2893 SET_TOP(res);
2894 if (res == NULL)
2895 goto error;
2896 DISPATCH();
2897 }
2898
Benjamin Petersonddd19492018-09-16 22:38:02 -07002899 case TARGET(COMPARE_OP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002900 PyObject *right = POP();
2901 PyObject *left = TOP();
Victor Stinner438a12d2019-05-24 17:01:38 +02002902 PyObject *res = cmp_outcome(tstate, oparg, left, right);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002903 Py_DECREF(left);
2904 Py_DECREF(right);
2905 SET_TOP(res);
2906 if (res == NULL)
2907 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002908 PREDICT(POP_JUMP_IF_FALSE);
2909 PREDICT(POP_JUMP_IF_TRUE);
2910 DISPATCH();
Victor Stinner3c1e4812012-03-26 22:10:51 +02002911 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002912
Benjamin Petersonddd19492018-09-16 22:38:02 -07002913 case TARGET(IMPORT_NAME): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002914 PyObject *name = GETITEM(names, oparg);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03002915 PyObject *fromlist = POP();
2916 PyObject *level = TOP();
2917 PyObject *res;
Victor Stinner438a12d2019-05-24 17:01:38 +02002918 res = import_name(tstate, f, name, fromlist, level);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03002919 Py_DECREF(level);
2920 Py_DECREF(fromlist);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002921 SET_TOP(res);
2922 if (res == NULL)
2923 goto error;
2924 DISPATCH();
2925 }
2926
Benjamin Petersonddd19492018-09-16 22:38:02 -07002927 case TARGET(IMPORT_STAR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002928 PyObject *from = POP(), *locals;
2929 int err;
Matthias Bussonnier160edb42017-02-25 21:58:05 -08002930 if (PyFrame_FastToLocalsWithError(f) < 0) {
2931 Py_DECREF(from);
Victor Stinner41bb43a2013-10-29 01:19:37 +01002932 goto error;
Matthias Bussonnier160edb42017-02-25 21:58:05 -08002933 }
Victor Stinner41bb43a2013-10-29 01:19:37 +01002934
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002935 locals = f->f_locals;
2936 if (locals == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002937 _PyErr_SetString(tstate, PyExc_SystemError,
2938 "no locals found during 'import *'");
Matthias Bussonnier160edb42017-02-25 21:58:05 -08002939 Py_DECREF(from);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002940 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002941 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002942 err = import_all_from(tstate, locals, from);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002943 PyFrame_LocalsToFast(f, 0);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002944 Py_DECREF(from);
2945 if (err != 0)
2946 goto error;
2947 DISPATCH();
2948 }
Guido van Rossum25831651993-05-19 14:50:45 +00002949
Benjamin Petersonddd19492018-09-16 22:38:02 -07002950 case TARGET(IMPORT_FROM): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002951 PyObject *name = GETITEM(names, oparg);
2952 PyObject *from = TOP();
2953 PyObject *res;
Victor Stinner438a12d2019-05-24 17:01:38 +02002954 res = import_from(tstate, from, name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002955 PUSH(res);
2956 if (res == NULL)
2957 goto error;
2958 DISPATCH();
2959 }
Thomas Wouters52152252000-08-17 22:55:00 +00002960
Benjamin Petersonddd19492018-09-16 22:38:02 -07002961 case TARGET(JUMP_FORWARD): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002962 JUMPBY(oparg);
2963 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002964 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002965
Benjamin Petersonddd19492018-09-16 22:38:02 -07002966 case TARGET(POP_JUMP_IF_FALSE): {
2967 PREDICTED(POP_JUMP_IF_FALSE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002968 PyObject *cond = POP();
2969 int err;
2970 if (cond == Py_True) {
2971 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002972 FAST_DISPATCH();
2973 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002974 if (cond == Py_False) {
2975 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002976 JUMPTO(oparg);
2977 FAST_DISPATCH();
2978 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002979 err = PyObject_IsTrue(cond);
2980 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002981 if (err > 0)
Adrian Wielgosik50c28502017-06-23 13:35:41 -07002982 ;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002983 else if (err == 0)
2984 JUMPTO(oparg);
2985 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002986 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002987 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002988 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002989
Benjamin Petersonddd19492018-09-16 22:38:02 -07002990 case TARGET(POP_JUMP_IF_TRUE): {
2991 PREDICTED(POP_JUMP_IF_TRUE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002992 PyObject *cond = POP();
2993 int err;
2994 if (cond == Py_False) {
2995 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002996 FAST_DISPATCH();
2997 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002998 if (cond == Py_True) {
2999 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003000 JUMPTO(oparg);
3001 FAST_DISPATCH();
3002 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003003 err = PyObject_IsTrue(cond);
3004 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003005 if (err > 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003006 JUMPTO(oparg);
3007 }
3008 else if (err == 0)
3009 ;
3010 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003011 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003012 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003013 }
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00003014
Benjamin Petersonddd19492018-09-16 22:38:02 -07003015 case TARGET(JUMP_IF_FALSE_OR_POP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003016 PyObject *cond = TOP();
3017 int err;
3018 if (cond == Py_True) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003019 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003020 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003021 FAST_DISPATCH();
3022 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003023 if (cond == Py_False) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003024 JUMPTO(oparg);
3025 FAST_DISPATCH();
3026 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003027 err = PyObject_IsTrue(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003028 if (err > 0) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003029 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003030 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003031 }
3032 else if (err == 0)
3033 JUMPTO(oparg);
3034 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003035 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003036 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003037 }
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00003038
Benjamin Petersonddd19492018-09-16 22:38:02 -07003039 case TARGET(JUMP_IF_TRUE_OR_POP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003040 PyObject *cond = TOP();
3041 int err;
3042 if (cond == Py_False) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003043 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003044 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003045 FAST_DISPATCH();
3046 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003047 if (cond == Py_True) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003048 JUMPTO(oparg);
3049 FAST_DISPATCH();
3050 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003051 err = PyObject_IsTrue(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003052 if (err > 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003053 JUMPTO(oparg);
3054 }
3055 else if (err == 0) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003056 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003057 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003058 }
3059 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003060 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003061 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003062 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003063
Benjamin Petersonddd19492018-09-16 22:38:02 -07003064 case TARGET(JUMP_ABSOLUTE): {
3065 PREDICTED(JUMP_ABSOLUTE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003066 JUMPTO(oparg);
Guido van Rossum58da9312007-11-10 23:39:45 +00003067#if FAST_LOOPS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003068 /* Enabling this path speeds-up all while and for-loops by bypassing
3069 the per-loop checks for signals. By default, this should be turned-off
3070 because it prevents detection of a control-break in tight loops like
3071 "while 1: pass". Compile with this option turned-on when you need
3072 the speed-up and do not need break checking inside tight loops (ones
3073 that contain only instructions ending with FAST_DISPATCH).
3074 */
3075 FAST_DISPATCH();
Guido van Rossum58da9312007-11-10 23:39:45 +00003076#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003077 DISPATCH();
Guido van Rossum58da9312007-11-10 23:39:45 +00003078#endif
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003079 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003080
Benjamin Petersonddd19492018-09-16 22:38:02 -07003081 case TARGET(GET_ITER): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003082 /* before: [obj]; after [getiter(obj)] */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003083 PyObject *iterable = TOP();
Yury Selivanov5376ba92015-06-22 12:19:30 -04003084 PyObject *iter = PyObject_GetIter(iterable);
3085 Py_DECREF(iterable);
3086 SET_TOP(iter);
3087 if (iter == NULL)
3088 goto error;
3089 PREDICT(FOR_ITER);
Serhiy Storchakada9c5132016-06-27 18:58:57 +03003090 PREDICT(CALL_FUNCTION);
Yury Selivanov5376ba92015-06-22 12:19:30 -04003091 DISPATCH();
3092 }
3093
Benjamin Petersonddd19492018-09-16 22:38:02 -07003094 case TARGET(GET_YIELD_FROM_ITER): {
Yury Selivanov5376ba92015-06-22 12:19:30 -04003095 /* before: [obj]; after [getiter(obj)] */
3096 PyObject *iterable = TOP();
Yury Selivanov75445082015-05-11 22:57:16 -04003097 PyObject *iter;
Yury Selivanov5376ba92015-06-22 12:19:30 -04003098 if (PyCoro_CheckExact(iterable)) {
3099 /* `iterable` is a coroutine */
3100 if (!(co->co_flags & (CO_COROUTINE | CO_ITERABLE_COROUTINE))) {
3101 /* and it is used in a 'yield from' expression of a
3102 regular generator. */
3103 Py_DECREF(iterable);
3104 SET_TOP(NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02003105 _PyErr_SetString(tstate, PyExc_TypeError,
3106 "cannot 'yield from' a coroutine object "
3107 "in a non-coroutine generator");
Yury Selivanov5376ba92015-06-22 12:19:30 -04003108 goto error;
3109 }
3110 }
3111 else if (!PyGen_CheckExact(iterable)) {
Yury Selivanov75445082015-05-11 22:57:16 -04003112 /* `iterable` is not a generator. */
3113 iter = PyObject_GetIter(iterable);
3114 Py_DECREF(iterable);
3115 SET_TOP(iter);
3116 if (iter == NULL)
3117 goto error;
3118 }
Serhiy Storchakada9c5132016-06-27 18:58:57 +03003119 PREDICT(LOAD_CONST);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003120 DISPATCH();
3121 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003122
Benjamin Petersonddd19492018-09-16 22:38:02 -07003123 case TARGET(FOR_ITER): {
3124 PREDICTED(FOR_ITER);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003125 /* before: [iter]; after: [iter, iter()] *or* [] */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003126 PyObject *iter = TOP();
3127 PyObject *next = (*iter->ob_type->tp_iternext)(iter);
3128 if (next != NULL) {
3129 PUSH(next);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003130 PREDICT(STORE_FAST);
3131 PREDICT(UNPACK_SEQUENCE);
3132 DISPATCH();
3133 }
Victor Stinner438a12d2019-05-24 17:01:38 +02003134 if (_PyErr_Occurred(tstate)) {
3135 if (!_PyErr_ExceptionMatches(tstate, PyExc_StopIteration)) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003136 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02003137 }
3138 else if (tstate->c_tracefunc != NULL) {
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003139 call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj, tstate, f);
Victor Stinner438a12d2019-05-24 17:01:38 +02003140 }
3141 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003142 }
3143 /* iterator ended normally */
costypetrisor8ed317f2018-07-31 20:55:14 +00003144 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003145 Py_DECREF(iter);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003146 JUMPBY(oparg);
Serhiy Storchakada9c5132016-06-27 18:58:57 +03003147 PREDICT(POP_BLOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003148 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003149 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003150
Benjamin Petersonddd19492018-09-16 22:38:02 -07003151 case TARGET(SETUP_FINALLY): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003152 PyFrame_BlockSetup(f, SETUP_FINALLY, INSTR_OFFSET() + oparg,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003153 STACK_LEVEL());
3154 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003155 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003156
Benjamin Petersonddd19492018-09-16 22:38:02 -07003157 case TARGET(BEFORE_ASYNC_WITH): {
Yury Selivanov75445082015-05-11 22:57:16 -04003158 _Py_IDENTIFIER(__aexit__);
3159 _Py_IDENTIFIER(__aenter__);
3160
3161 PyObject *mgr = TOP();
Victor Stinner438a12d2019-05-24 17:01:38 +02003162 PyObject *exit = special_lookup(tstate, mgr, &PyId___aexit__),
Yury Selivanov75445082015-05-11 22:57:16 -04003163 *enter;
3164 PyObject *res;
3165 if (exit == NULL)
3166 goto error;
3167 SET_TOP(exit);
Victor Stinner438a12d2019-05-24 17:01:38 +02003168 enter = special_lookup(tstate, mgr, &PyId___aenter__);
Yury Selivanov75445082015-05-11 22:57:16 -04003169 Py_DECREF(mgr);
3170 if (enter == NULL)
3171 goto error;
Victor Stinnerf17c3de2016-12-06 18:46:19 +01003172 res = _PyObject_CallNoArg(enter);
Yury Selivanov75445082015-05-11 22:57:16 -04003173 Py_DECREF(enter);
3174 if (res == NULL)
3175 goto error;
3176 PUSH(res);
Serhiy Storchakada9c5132016-06-27 18:58:57 +03003177 PREDICT(GET_AWAITABLE);
Yury Selivanov75445082015-05-11 22:57:16 -04003178 DISPATCH();
3179 }
3180
Benjamin Petersonddd19492018-09-16 22:38:02 -07003181 case TARGET(SETUP_ASYNC_WITH): {
Yury Selivanov75445082015-05-11 22:57:16 -04003182 PyObject *res = POP();
3183 /* Setup the finally block before pushing the result
3184 of __aenter__ on the stack. */
3185 PyFrame_BlockSetup(f, SETUP_FINALLY, INSTR_OFFSET() + oparg,
3186 STACK_LEVEL());
3187 PUSH(res);
3188 DISPATCH();
3189 }
3190
Benjamin Petersonddd19492018-09-16 22:38:02 -07003191 case TARGET(SETUP_WITH): {
Benjamin Petersonce798522012-01-22 11:24:29 -05003192 _Py_IDENTIFIER(__exit__);
3193 _Py_IDENTIFIER(__enter__);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003194 PyObject *mgr = TOP();
Victor Stinner438a12d2019-05-24 17:01:38 +02003195 PyObject *enter = special_lookup(tstate, mgr, &PyId___enter__);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003196 PyObject *res;
Victor Stinner438a12d2019-05-24 17:01:38 +02003197 if (enter == NULL) {
Raymond Hettingera3fec152016-11-21 17:24:23 -08003198 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02003199 }
3200 PyObject *exit = special_lookup(tstate, mgr, &PyId___exit__);
Raymond Hettinger64e2f9a2016-11-22 11:50:40 -08003201 if (exit == NULL) {
3202 Py_DECREF(enter);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003203 goto error;
Raymond Hettinger64e2f9a2016-11-22 11:50:40 -08003204 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003205 SET_TOP(exit);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003206 Py_DECREF(mgr);
Victor Stinnerf17c3de2016-12-06 18:46:19 +01003207 res = _PyObject_CallNoArg(enter);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003208 Py_DECREF(enter);
3209 if (res == NULL)
3210 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003211 /* Setup the finally block before pushing the result
3212 of __enter__ on the stack. */
3213 PyFrame_BlockSetup(f, SETUP_FINALLY, INSTR_OFFSET() + oparg,
3214 STACK_LEVEL());
Benjamin Peterson876b2f22009-06-28 03:18:59 +00003215
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003216 PUSH(res);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003217 DISPATCH();
3218 }
Benjamin Peterson876b2f22009-06-28 03:18:59 +00003219
Mark Shannonfee55262019-11-21 09:11:43 +00003220 case TARGET(WITH_EXCEPT_START): {
3221 /* At the top of the stack are 7 values:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003222 - (TOP, SECOND, THIRD) = exc_info()
Mark Shannonfee55262019-11-21 09:11:43 +00003223 - (FOURTH, FIFTH, SIXTH) = previous exception for EXCEPT_HANDLER
3224 - SEVENTH: the context.__exit__ bound method
3225 We call SEVENTH(TOP, SECOND, THIRD).
3226 Then we push again the TOP exception and the __exit__
3227 return value.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003228 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003229 PyObject *exit_func;
Victor Stinner842cfff2016-12-01 14:45:31 +01003230 PyObject *exc, *val, *tb, *res;
3231
Victor Stinner842cfff2016-12-01 14:45:31 +01003232 exc = TOP();
Mark Shannonfee55262019-11-21 09:11:43 +00003233 val = SECOND();
3234 tb = THIRD();
3235 assert(exc != Py_None);
3236 assert(!PyLong_Check(exc));
3237 exit_func = PEEK(7);
Jeroen Demeyer469d1a72019-07-03 12:52:21 +02003238 PyObject *stack[4] = {NULL, exc, val, tb};
3239 res = _PyObject_Vectorcall(exit_func, stack + 1,
3240 3 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003241 if (res == NULL)
3242 goto error;
Amaury Forgeot d'Arc10b24e82008-12-10 23:49:33 +00003243
Yury Selivanov75445082015-05-11 22:57:16 -04003244 PUSH(res);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003245 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003246 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00003247
Benjamin Petersonddd19492018-09-16 22:38:02 -07003248 case TARGET(LOAD_METHOD): {
Andreyb021ba52019-04-29 14:33:26 +10003249 /* Designed to work in tandem with CALL_METHOD. */
Yury Selivanovf2392132016-12-13 19:03:51 -05003250 PyObject *name = GETITEM(names, oparg);
3251 PyObject *obj = TOP();
3252 PyObject *meth = NULL;
3253
3254 int meth_found = _PyObject_GetMethod(obj, name, &meth);
3255
Yury Selivanovf2392132016-12-13 19:03:51 -05003256 if (meth == NULL) {
3257 /* Most likely attribute wasn't found. */
Yury Selivanovf2392132016-12-13 19:03:51 -05003258 goto error;
3259 }
3260
3261 if (meth_found) {
INADA Naoki015bce62017-01-16 17:23:30 +09003262 /* We can bypass temporary bound method object.
3263 meth is unbound method and obj is self.
Victor Stinnera8cb5152017-01-18 14:12:51 +01003264
INADA Naoki015bce62017-01-16 17:23:30 +09003265 meth | self | arg1 | ... | argN
3266 */
3267 SET_TOP(meth);
3268 PUSH(obj); // self
Yury Selivanovf2392132016-12-13 19:03:51 -05003269 }
3270 else {
INADA Naoki015bce62017-01-16 17:23:30 +09003271 /* meth is not an unbound method (but a regular attr, or
3272 something was returned by a descriptor protocol). Set
3273 the second element of the stack to NULL, to signal
Yury Selivanovf2392132016-12-13 19:03:51 -05003274 CALL_METHOD that it's not a method call.
INADA Naoki015bce62017-01-16 17:23:30 +09003275
3276 NULL | meth | arg1 | ... | argN
Yury Selivanovf2392132016-12-13 19:03:51 -05003277 */
INADA Naoki015bce62017-01-16 17:23:30 +09003278 SET_TOP(NULL);
Yury Selivanovf2392132016-12-13 19:03:51 -05003279 Py_DECREF(obj);
INADA Naoki015bce62017-01-16 17:23:30 +09003280 PUSH(meth);
Yury Selivanovf2392132016-12-13 19:03:51 -05003281 }
3282 DISPATCH();
3283 }
3284
Benjamin Petersonddd19492018-09-16 22:38:02 -07003285 case TARGET(CALL_METHOD): {
Yury Selivanovf2392132016-12-13 19:03:51 -05003286 /* Designed to work in tamdem with LOAD_METHOD. */
INADA Naoki015bce62017-01-16 17:23:30 +09003287 PyObject **sp, *res, *meth;
Yury Selivanovf2392132016-12-13 19:03:51 -05003288
3289 sp = stack_pointer;
3290
INADA Naoki015bce62017-01-16 17:23:30 +09003291 meth = PEEK(oparg + 2);
3292 if (meth == NULL) {
3293 /* `meth` is NULL when LOAD_METHOD thinks that it's not
3294 a method call.
Yury Selivanovf2392132016-12-13 19:03:51 -05003295
3296 Stack layout:
3297
INADA Naoki015bce62017-01-16 17:23:30 +09003298 ... | NULL | callable | arg1 | ... | argN
3299 ^- TOP()
3300 ^- (-oparg)
3301 ^- (-oparg-1)
3302 ^- (-oparg-2)
Yury Selivanovf2392132016-12-13 19:03:51 -05003303
Ville Skyttä49b27342017-08-03 09:00:59 +03003304 `callable` will be POPed by call_function.
INADA Naoki015bce62017-01-16 17:23:30 +09003305 NULL will will be POPed manually later.
Yury Selivanovf2392132016-12-13 19:03:51 -05003306 */
Victor Stinner09532fe2019-05-10 23:39:09 +02003307 res = call_function(tstate, &sp, oparg, NULL);
Yury Selivanovf2392132016-12-13 19:03:51 -05003308 stack_pointer = sp;
INADA Naoki015bce62017-01-16 17:23:30 +09003309 (void)POP(); /* POP the NULL. */
Yury Selivanovf2392132016-12-13 19:03:51 -05003310 }
3311 else {
3312 /* This is a method call. Stack layout:
3313
INADA Naoki015bce62017-01-16 17:23:30 +09003314 ... | method | self | arg1 | ... | argN
Yury Selivanovf2392132016-12-13 19:03:51 -05003315 ^- TOP()
3316 ^- (-oparg)
INADA Naoki015bce62017-01-16 17:23:30 +09003317 ^- (-oparg-1)
3318 ^- (-oparg-2)
Yury Selivanovf2392132016-12-13 19:03:51 -05003319
INADA Naoki015bce62017-01-16 17:23:30 +09003320 `self` and `method` will be POPed by call_function.
Yury Selivanovf2392132016-12-13 19:03:51 -05003321 We'll be passing `oparg + 1` to call_function, to
INADA Naoki015bce62017-01-16 17:23:30 +09003322 make it accept the `self` as a first argument.
Yury Selivanovf2392132016-12-13 19:03:51 -05003323 */
Victor Stinner09532fe2019-05-10 23:39:09 +02003324 res = call_function(tstate, &sp, oparg + 1, NULL);
Yury Selivanovf2392132016-12-13 19:03:51 -05003325 stack_pointer = sp;
3326 }
3327
3328 PUSH(res);
3329 if (res == NULL)
3330 goto error;
3331 DISPATCH();
3332 }
3333
Benjamin Petersonddd19492018-09-16 22:38:02 -07003334 case TARGET(CALL_FUNCTION): {
3335 PREDICTED(CALL_FUNCTION);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003336 PyObject **sp, *res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003337 sp = stack_pointer;
Victor Stinner09532fe2019-05-10 23:39:09 +02003338 res = call_function(tstate, &sp, oparg, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003339 stack_pointer = sp;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003340 PUSH(res);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003341 if (res == NULL) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003342 goto error;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003343 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003344 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003345 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003346
Benjamin Petersonddd19492018-09-16 22:38:02 -07003347 case TARGET(CALL_FUNCTION_KW): {
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003348 PyObject **sp, *res, *names;
3349
3350 names = POP();
Jeroen Demeyer05677862019-08-16 12:41:27 +02003351 assert(PyTuple_Check(names));
3352 assert(PyTuple_GET_SIZE(names) <= oparg);
3353 /* We assume without checking that names contains only strings */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003354 sp = stack_pointer;
Victor Stinner09532fe2019-05-10 23:39:09 +02003355 res = call_function(tstate, &sp, oparg, names);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003356 stack_pointer = sp;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003357 PUSH(res);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003358 Py_DECREF(names);
3359
3360 if (res == NULL) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003361 goto error;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003362 }
3363 DISPATCH();
3364 }
3365
Benjamin Petersonddd19492018-09-16 22:38:02 -07003366 case TARGET(CALL_FUNCTION_EX): {
Brandt Bucherf185a732019-09-28 17:12:49 -07003367 PREDICTED(CALL_FUNCTION_EX);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003368 PyObject *func, *callargs, *kwargs = NULL, *result;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003369 if (oparg & 0x01) {
3370 kwargs = POP();
Serhiy Storchakab7281052016-09-12 00:52:40 +03003371 if (!PyDict_CheckExact(kwargs)) {
3372 PyObject *d = PyDict_New();
3373 if (d == NULL)
3374 goto error;
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02003375 if (_PyDict_MergeEx(d, kwargs, 2) < 0) {
Serhiy Storchakab7281052016-09-12 00:52:40 +03003376 Py_DECREF(d);
Victor Stinner438a12d2019-05-24 17:01:38 +02003377 format_kwargs_error(tstate, SECOND(), kwargs);
Victor Stinnereece2222016-09-12 11:16:37 +02003378 Py_DECREF(kwargs);
Serhiy Storchakab7281052016-09-12 00:52:40 +03003379 goto error;
3380 }
3381 Py_DECREF(kwargs);
3382 kwargs = d;
3383 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003384 assert(PyDict_CheckExact(kwargs));
3385 }
3386 callargs = POP();
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003387 func = TOP();
Serhiy Storchaka63dc5482016-09-22 19:41:20 +03003388 if (!PyTuple_CheckExact(callargs)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003389 if (check_args_iterable(tstate, func, callargs) < 0) {
Victor Stinnereece2222016-09-12 11:16:37 +02003390 Py_DECREF(callargs);
Serhiy Storchakab7281052016-09-12 00:52:40 +03003391 goto error;
3392 }
3393 Py_SETREF(callargs, PySequence_Tuple(callargs));
3394 if (callargs == NULL) {
3395 goto error;
3396 }
3397 }
Serhiy Storchaka63dc5482016-09-22 19:41:20 +03003398 assert(PyTuple_CheckExact(callargs));
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003399
Victor Stinner09532fe2019-05-10 23:39:09 +02003400 result = do_call_core(tstate, func, callargs, kwargs);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003401 Py_DECREF(func);
3402 Py_DECREF(callargs);
3403 Py_XDECREF(kwargs);
3404
3405 SET_TOP(result);
3406 if (result == NULL) {
3407 goto error;
3408 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003409 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003410 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003411
Benjamin Petersonddd19492018-09-16 22:38:02 -07003412 case TARGET(MAKE_FUNCTION): {
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003413 PyObject *qualname = POP();
3414 PyObject *codeobj = POP();
3415 PyFunctionObject *func = (PyFunctionObject *)
3416 PyFunction_NewWithQualName(codeobj, f->f_globals, qualname);
Guido van Rossum4f72a782006-10-27 23:31:49 +00003417
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003418 Py_DECREF(codeobj);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003419 Py_DECREF(qualname);
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003420 if (func == NULL) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003421 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003422 }
Neal Norwitzc1505362006-12-28 06:47:50 +00003423
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003424 if (oparg & 0x08) {
3425 assert(PyTuple_CheckExact(TOP()));
3426 func ->func_closure = POP();
3427 }
3428 if (oparg & 0x04) {
3429 assert(PyDict_CheckExact(TOP()));
3430 func->func_annotations = POP();
3431 }
3432 if (oparg & 0x02) {
3433 assert(PyDict_CheckExact(TOP()));
3434 func->func_kwdefaults = POP();
3435 }
3436 if (oparg & 0x01) {
3437 assert(PyTuple_CheckExact(TOP()));
3438 func->func_defaults = POP();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003439 }
Neal Norwitzc1505362006-12-28 06:47:50 +00003440
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003441 PUSH((PyObject *)func);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003442 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003443 }
Guido van Rossum8861b741996-07-30 16:49:37 +00003444
Benjamin Petersonddd19492018-09-16 22:38:02 -07003445 case TARGET(BUILD_SLICE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003446 PyObject *start, *stop, *step, *slice;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003447 if (oparg == 3)
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003448 step = POP();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003449 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003450 step = NULL;
3451 stop = POP();
3452 start = TOP();
3453 slice = PySlice_New(start, stop, step);
3454 Py_DECREF(start);
3455 Py_DECREF(stop);
3456 Py_XDECREF(step);
3457 SET_TOP(slice);
3458 if (slice == NULL)
3459 goto error;
3460 DISPATCH();
3461 }
Guido van Rossum8861b741996-07-30 16:49:37 +00003462
Benjamin Petersonddd19492018-09-16 22:38:02 -07003463 case TARGET(FORMAT_VALUE): {
Eric V. Smitha78c7952015-11-03 12:45:05 -05003464 /* Handles f-string value formatting. */
3465 PyObject *result;
3466 PyObject *fmt_spec;
3467 PyObject *value;
3468 PyObject *(*conv_fn)(PyObject *);
3469 int which_conversion = oparg & FVC_MASK;
3470 int have_fmt_spec = (oparg & FVS_MASK) == FVS_HAVE_SPEC;
3471
3472 fmt_spec = have_fmt_spec ? POP() : NULL;
Eric V. Smith135d5f42016-02-05 18:23:08 -05003473 value = POP();
Eric V. Smitha78c7952015-11-03 12:45:05 -05003474
3475 /* See if any conversion is specified. */
3476 switch (which_conversion) {
Eric V. Smith9a4135e2019-05-08 16:28:48 -04003477 case FVC_NONE: conv_fn = NULL; break;
Eric V. Smitha78c7952015-11-03 12:45:05 -05003478 case FVC_STR: conv_fn = PyObject_Str; break;
3479 case FVC_REPR: conv_fn = PyObject_Repr; break;
3480 case FVC_ASCII: conv_fn = PyObject_ASCII; break;
Eric V. Smith9a4135e2019-05-08 16:28:48 -04003481 default:
Victor Stinner438a12d2019-05-24 17:01:38 +02003482 _PyErr_Format(tstate, PyExc_SystemError,
3483 "unexpected conversion flag %d",
3484 which_conversion);
Eric V. Smith9a4135e2019-05-08 16:28:48 -04003485 goto error;
Eric V. Smitha78c7952015-11-03 12:45:05 -05003486 }
3487
3488 /* If there's a conversion function, call it and replace
3489 value with that result. Otherwise, just use value,
3490 without conversion. */
Eric V. Smitheb588a12016-02-05 18:26:20 -05003491 if (conv_fn != NULL) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05003492 result = conv_fn(value);
3493 Py_DECREF(value);
Eric V. Smitheb588a12016-02-05 18:26:20 -05003494 if (result == NULL) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05003495 Py_XDECREF(fmt_spec);
3496 goto error;
3497 }
3498 value = result;
3499 }
3500
3501 /* If value is a unicode object, and there's no fmt_spec,
3502 then we know the result of format(value) is value
3503 itself. In that case, skip calling format(). I plan to
3504 move this optimization in to PyObject_Format()
3505 itself. */
3506 if (PyUnicode_CheckExact(value) && fmt_spec == NULL) {
3507 /* Do nothing, just transfer ownership to result. */
3508 result = value;
3509 } else {
3510 /* Actually call format(). */
3511 result = PyObject_Format(value, fmt_spec);
3512 Py_DECREF(value);
3513 Py_XDECREF(fmt_spec);
Eric V. Smitheb588a12016-02-05 18:26:20 -05003514 if (result == NULL) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05003515 goto error;
Eric V. Smitheb588a12016-02-05 18:26:20 -05003516 }
Eric V. Smitha78c7952015-11-03 12:45:05 -05003517 }
3518
Eric V. Smith135d5f42016-02-05 18:23:08 -05003519 PUSH(result);
Eric V. Smitha78c7952015-11-03 12:45:05 -05003520 DISPATCH();
3521 }
3522
Benjamin Petersonddd19492018-09-16 22:38:02 -07003523 case TARGET(EXTENDED_ARG): {
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03003524 int oldoparg = oparg;
3525 NEXTOPARG();
3526 oparg |= oldoparg << 8;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003527 goto dispatch_opcode;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003528 }
Guido van Rossum8861b741996-07-30 16:49:37 +00003529
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003530
Antoine Pitrou042b1282010-08-13 21:15:58 +00003531#if USE_COMPUTED_GOTOS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003532 _unknown_opcode:
Antoine Pitroub52ec782009-01-25 16:34:23 +00003533#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003534 default:
3535 fprintf(stderr,
3536 "XXX lineno: %d, opcode: %d\n",
3537 PyFrame_GetLineNumber(f),
3538 opcode);
Victor Stinner438a12d2019-05-24 17:01:38 +02003539 _PyErr_SetString(tstate, PyExc_SystemError, "unknown opcode");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003540 goto error;
Guido van Rossum04691fc1992-08-12 15:35:34 +00003541
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003542 } /* switch */
Guido van Rossum374a9221991-04-04 10:40:29 +00003543
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003544 /* This should never be reached. Every opcode should end with DISPATCH()
3545 or goto error. */
Barry Warsawb2e57942017-09-14 18:13:16 -07003546 Py_UNREACHABLE();
Guido van Rossumac7be682001-01-17 15:42:30 +00003547
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003548error:
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003549 /* Double-check exception status. */
Victor Stinner365b6932013-07-12 00:11:58 +02003550#ifdef NDEBUG
Victor Stinner438a12d2019-05-24 17:01:38 +02003551 if (!_PyErr_Occurred(tstate)) {
3552 _PyErr_SetString(tstate, PyExc_SystemError,
3553 "error return without exception set");
3554 }
Victor Stinner365b6932013-07-12 00:11:58 +02003555#else
Victor Stinner438a12d2019-05-24 17:01:38 +02003556 assert(_PyErr_Occurred(tstate));
Victor Stinner365b6932013-07-12 00:11:58 +02003557#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00003558
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003559 /* Log traceback info. */
3560 PyTraceBack_Here(f);
Guido van Rossumac7be682001-01-17 15:42:30 +00003561
Benjamin Peterson51f46162013-01-23 08:38:47 -05003562 if (tstate->c_tracefunc != NULL)
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003563 call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj,
3564 tstate, f);
Guido van Rossumac7be682001-01-17 15:42:30 +00003565
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003566exception_unwind:
3567 /* Unwind stacks if an exception occurred */
3568 while (f->f_iblock > 0) {
3569 /* Pop the current block. */
3570 PyTryBlock *b = &f->f_blockstack[--f->f_iblock];
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003571
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003572 if (b->b_type == EXCEPT_HANDLER) {
3573 UNWIND_EXCEPT_HANDLER(b);
3574 continue;
3575 }
3576 UNWIND_BLOCK(b);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003577 if (b->b_type == SETUP_FINALLY) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003578 PyObject *exc, *val, *tb;
3579 int handler = b->b_handler;
Mark Shannonae3087c2017-10-22 22:41:51 +01003580 _PyErr_StackItem *exc_info = tstate->exc_info;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003581 /* Beware, this invalidates all b->b_* fields */
3582 PyFrame_BlockSetup(f, EXCEPT_HANDLER, -1, STACK_LEVEL());
Mark Shannonae3087c2017-10-22 22:41:51 +01003583 PUSH(exc_info->exc_traceback);
3584 PUSH(exc_info->exc_value);
3585 if (exc_info->exc_type != NULL) {
3586 PUSH(exc_info->exc_type);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003587 }
3588 else {
3589 Py_INCREF(Py_None);
3590 PUSH(Py_None);
3591 }
Victor Stinner438a12d2019-05-24 17:01:38 +02003592 _PyErr_Fetch(tstate, &exc, &val, &tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003593 /* Make the raw exception data
3594 available to the handler,
3595 so a program can emulate the
3596 Python main loop. */
Victor Stinner438a12d2019-05-24 17:01:38 +02003597 _PyErr_NormalizeException(tstate, &exc, &val, &tb);
Victor Stinner7eab0d02013-07-15 21:16:27 +02003598 if (tb != NULL)
3599 PyException_SetTraceback(val, tb);
3600 else
3601 PyException_SetTraceback(val, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003602 Py_INCREF(exc);
Mark Shannonae3087c2017-10-22 22:41:51 +01003603 exc_info->exc_type = exc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003604 Py_INCREF(val);
Mark Shannonae3087c2017-10-22 22:41:51 +01003605 exc_info->exc_value = val;
3606 exc_info->exc_traceback = tb;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003607 if (tb == NULL)
3608 tb = Py_None;
3609 Py_INCREF(tb);
3610 PUSH(tb);
3611 PUSH(val);
3612 PUSH(exc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003613 JUMPTO(handler);
Pablo Galindo4c53e632020-01-10 09:24:22 +00003614 if (_Py_TracingPossible(ceval)) {
3615 int needs_new_execution_window = (f->f_lasti < instr_lb || f->f_lasti >= instr_ub);
3616 int needs_line_update = (f->f_lasti == instr_lb || f->f_lasti < instr_prev);
3617 /* Make sure that we trace line after exception if we are in a new execution
3618 * window or we don't need a line update and we are not in the first instruction
3619 * of the line. */
3620 if (needs_new_execution_window || (!needs_line_update && instr_lb > 0)) {
3621 instr_prev = INT_MAX;
3622 }
Mark Shannonfee55262019-11-21 09:11:43 +00003623 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003624 /* Resume normal execution */
3625 goto main_loop;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003626 }
3627 } /* unwind stack */
Guido van Rossum374a9221991-04-04 10:40:29 +00003628
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003629 /* End the loop as we still have an error */
3630 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003631 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00003632
Pablo Galindof00828a2019-05-09 16:52:02 +01003633 assert(retval == NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02003634 assert(_PyErr_Occurred(tstate));
Pablo Galindof00828a2019-05-09 16:52:02 +01003635
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003636 /* Pop remaining stack entries. */
3637 while (!EMPTY()) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003638 PyObject *o = POP();
3639 Py_XDECREF(o);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003640 }
Guido van Rossum35974fb2001-12-06 21:28:18 +00003641
Mark Shannone7c9f4a2020-01-13 12:51:26 +00003642exiting:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003643 if (tstate->use_tracing) {
Benjamin Peterson51f46162013-01-23 08:38:47 -05003644 if (tstate->c_tracefunc) {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003645 if (call_trace_protected(tstate->c_tracefunc, tstate->c_traceobj,
3646 tstate, f, PyTrace_RETURN, retval)) {
3647 Py_CLEAR(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003648 }
3649 }
3650 if (tstate->c_profilefunc) {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003651 if (call_trace_protected(tstate->c_profilefunc, tstate->c_profileobj,
3652 tstate, f, PyTrace_RETURN, retval)) {
Serhiy Storchaka505ff752014-02-09 13:33:53 +02003653 Py_CLEAR(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003654 }
3655 }
3656 }
Guido van Rossuma4240131997-01-21 21:18:36 +00003657
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003658 /* pop frame */
Thomas Woutersce272b62007-09-19 21:19:28 +00003659exit_eval_frame:
Łukasz Langaa785c872016-09-09 17:37:37 -07003660 if (PyDTrace_FUNCTION_RETURN_ENABLED())
3661 dtrace_function_return(f);
Victor Stinnerbe434dc2019-11-05 00:51:22 +01003662 _Py_LeaveRecursiveCall(tstate);
Antoine Pitrou58720d62013-08-05 23:26:40 +02003663 f->f_executing = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003664 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00003665
Victor Stinner17269092019-11-05 01:22:12 +01003666 return _Py_CheckFunctionResult(tstate, NULL, retval, "PyEval_EvalFrameEx");
Guido van Rossum374a9221991-04-04 10:40:29 +00003667}
3668
Benjamin Petersonb204a422011-06-05 22:04:07 -05003669static void
Victor Stinner438a12d2019-05-24 17:01:38 +02003670format_missing(PyThreadState *tstate, const char *kind,
3671 PyCodeObject *co, PyObject *names)
Benjamin Petersone109c702011-06-24 09:37:26 -05003672{
3673 int err;
3674 Py_ssize_t len = PyList_GET_SIZE(names);
3675 PyObject *name_str, *comma, *tail, *tmp;
3676
3677 assert(PyList_CheckExact(names));
3678 assert(len >= 1);
3679 /* Deal with the joys of natural language. */
3680 switch (len) {
3681 case 1:
3682 name_str = PyList_GET_ITEM(names, 0);
3683 Py_INCREF(name_str);
3684 break;
3685 case 2:
3686 name_str = PyUnicode_FromFormat("%U and %U",
3687 PyList_GET_ITEM(names, len - 2),
3688 PyList_GET_ITEM(names, len - 1));
3689 break;
3690 default:
3691 tail = PyUnicode_FromFormat(", %U, and %U",
3692 PyList_GET_ITEM(names, len - 2),
3693 PyList_GET_ITEM(names, len - 1));
Benjamin Petersond1ab6082012-06-01 11:18:22 -07003694 if (tail == NULL)
3695 return;
Benjamin Petersone109c702011-06-24 09:37:26 -05003696 /* Chop off the last two objects in the list. This shouldn't actually
3697 fail, but we can't be too careful. */
3698 err = PyList_SetSlice(names, len - 2, len, NULL);
3699 if (err == -1) {
3700 Py_DECREF(tail);
3701 return;
3702 }
3703 /* Stitch everything up into a nice comma-separated list. */
3704 comma = PyUnicode_FromString(", ");
3705 if (comma == NULL) {
3706 Py_DECREF(tail);
3707 return;
3708 }
3709 tmp = PyUnicode_Join(comma, names);
3710 Py_DECREF(comma);
3711 if (tmp == NULL) {
3712 Py_DECREF(tail);
3713 return;
3714 }
3715 name_str = PyUnicode_Concat(tmp, tail);
3716 Py_DECREF(tmp);
3717 Py_DECREF(tail);
3718 break;
3719 }
3720 if (name_str == NULL)
3721 return;
Victor Stinner438a12d2019-05-24 17:01:38 +02003722 _PyErr_Format(tstate, PyExc_TypeError,
3723 "%U() missing %i required %s argument%s: %U",
3724 co->co_name,
3725 len,
3726 kind,
3727 len == 1 ? "" : "s",
3728 name_str);
Benjamin Petersone109c702011-06-24 09:37:26 -05003729 Py_DECREF(name_str);
3730}
3731
3732static void
Victor Stinner438a12d2019-05-24 17:01:38 +02003733missing_arguments(PyThreadState *tstate, PyCodeObject *co,
3734 Py_ssize_t missing, Py_ssize_t defcount,
Benjamin Petersone109c702011-06-24 09:37:26 -05003735 PyObject **fastlocals)
3736{
Victor Stinner74319ae2016-08-25 00:04:09 +02003737 Py_ssize_t i, j = 0;
3738 Py_ssize_t start, end;
3739 int positional = (defcount != -1);
Benjamin Petersone109c702011-06-24 09:37:26 -05003740 const char *kind = positional ? "positional" : "keyword-only";
3741 PyObject *missing_names;
3742
3743 /* Compute the names of the arguments that are missing. */
3744 missing_names = PyList_New(missing);
3745 if (missing_names == NULL)
3746 return;
3747 if (positional) {
3748 start = 0;
Pablo Galindocd74e662019-06-01 18:08:04 +01003749 end = co->co_argcount - defcount;
Benjamin Petersone109c702011-06-24 09:37:26 -05003750 }
3751 else {
Pablo Galindocd74e662019-06-01 18:08:04 +01003752 start = co->co_argcount;
Benjamin Petersone109c702011-06-24 09:37:26 -05003753 end = start + co->co_kwonlyargcount;
3754 }
3755 for (i = start; i < end; i++) {
3756 if (GETLOCAL(i) == NULL) {
3757 PyObject *raw = PyTuple_GET_ITEM(co->co_varnames, i);
3758 PyObject *name = PyObject_Repr(raw);
3759 if (name == NULL) {
3760 Py_DECREF(missing_names);
3761 return;
3762 }
3763 PyList_SET_ITEM(missing_names, j++, name);
3764 }
3765 }
3766 assert(j == missing);
Victor Stinner438a12d2019-05-24 17:01:38 +02003767 format_missing(tstate, kind, co, missing_names);
Benjamin Petersone109c702011-06-24 09:37:26 -05003768 Py_DECREF(missing_names);
3769}
3770
3771static void
Victor Stinner438a12d2019-05-24 17:01:38 +02003772too_many_positional(PyThreadState *tstate, PyCodeObject *co,
3773 Py_ssize_t given, Py_ssize_t defcount,
Victor Stinner74319ae2016-08-25 00:04:09 +02003774 PyObject **fastlocals)
Benjamin Petersonb204a422011-06-05 22:04:07 -05003775{
3776 int plural;
Victor Stinner74319ae2016-08-25 00:04:09 +02003777 Py_ssize_t kwonly_given = 0;
3778 Py_ssize_t i;
Benjamin Petersonb204a422011-06-05 22:04:07 -05003779 PyObject *sig, *kwonly_sig;
Victor Stinner74319ae2016-08-25 00:04:09 +02003780 Py_ssize_t co_argcount = co->co_argcount;
Benjamin Petersonb204a422011-06-05 22:04:07 -05003781
Benjamin Petersone109c702011-06-24 09:37:26 -05003782 assert((co->co_flags & CO_VARARGS) == 0);
3783 /* Count missing keyword-only args. */
Pablo Galindocd74e662019-06-01 18:08:04 +01003784 for (i = co_argcount; i < co_argcount + co->co_kwonlyargcount; i++) {
Victor Stinner74319ae2016-08-25 00:04:09 +02003785 if (GETLOCAL(i) != NULL) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05003786 kwonly_given++;
Victor Stinner74319ae2016-08-25 00:04:09 +02003787 }
3788 }
Benjamin Petersone109c702011-06-24 09:37:26 -05003789 if (defcount) {
Pablo Galindocd74e662019-06-01 18:08:04 +01003790 Py_ssize_t atleast = co_argcount - defcount;
Benjamin Petersonb204a422011-06-05 22:04:07 -05003791 plural = 1;
Pablo Galindocd74e662019-06-01 18:08:04 +01003792 sig = PyUnicode_FromFormat("from %zd to %zd", atleast, co_argcount);
Benjamin Petersonb204a422011-06-05 22:04:07 -05003793 }
3794 else {
Pablo Galindocd74e662019-06-01 18:08:04 +01003795 plural = (co_argcount != 1);
3796 sig = PyUnicode_FromFormat("%zd", co_argcount);
Benjamin Petersonb204a422011-06-05 22:04:07 -05003797 }
3798 if (sig == NULL)
3799 return;
3800 if (kwonly_given) {
Victor Stinner74319ae2016-08-25 00:04:09 +02003801 const char *format = " positional argument%s (and %zd keyword-only argument%s)";
3802 kwonly_sig = PyUnicode_FromFormat(format,
3803 given != 1 ? "s" : "",
3804 kwonly_given,
3805 kwonly_given != 1 ? "s" : "");
Benjamin Petersonb204a422011-06-05 22:04:07 -05003806 if (kwonly_sig == NULL) {
3807 Py_DECREF(sig);
3808 return;
3809 }
3810 }
3811 else {
3812 /* This will not fail. */
3813 kwonly_sig = PyUnicode_FromString("");
Benjamin Petersone109c702011-06-24 09:37:26 -05003814 assert(kwonly_sig != NULL);
Benjamin Petersonb204a422011-06-05 22:04:07 -05003815 }
Victor Stinner438a12d2019-05-24 17:01:38 +02003816 _PyErr_Format(tstate, PyExc_TypeError,
3817 "%U() takes %U positional argument%s but %zd%U %s given",
3818 co->co_name,
3819 sig,
3820 plural ? "s" : "",
3821 given,
3822 kwonly_sig,
3823 given == 1 && !kwonly_given ? "was" : "were");
Benjamin Petersonb204a422011-06-05 22:04:07 -05003824 Py_DECREF(sig);
3825 Py_DECREF(kwonly_sig);
3826}
3827
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01003828static int
Victor Stinner438a12d2019-05-24 17:01:38 +02003829positional_only_passed_as_keyword(PyThreadState *tstate, PyCodeObject *co,
3830 Py_ssize_t kwcount, PyObject* const* kwnames)
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01003831{
3832 int posonly_conflicts = 0;
3833 PyObject* posonly_names = PyList_New(0);
3834
3835 for(int k=0; k < co->co_posonlyargcount; k++){
3836 PyObject* posonly_name = PyTuple_GET_ITEM(co->co_varnames, k);
3837
3838 for (int k2=0; k2<kwcount; k2++){
3839 /* Compare the pointers first and fallback to PyObject_RichCompareBool*/
3840 PyObject* kwname = kwnames[k2];
3841 if (kwname == posonly_name){
3842 if(PyList_Append(posonly_names, kwname) != 0) {
3843 goto fail;
3844 }
3845 posonly_conflicts++;
3846 continue;
3847 }
3848
3849 int cmp = PyObject_RichCompareBool(posonly_name, kwname, Py_EQ);
3850
3851 if ( cmp > 0) {
3852 if(PyList_Append(posonly_names, kwname) != 0) {
3853 goto fail;
3854 }
3855 posonly_conflicts++;
3856 } else if (cmp < 0) {
3857 goto fail;
3858 }
3859
3860 }
3861 }
3862 if (posonly_conflicts) {
3863 PyObject* comma = PyUnicode_FromString(", ");
3864 if (comma == NULL) {
3865 goto fail;
3866 }
3867 PyObject* error_names = PyUnicode_Join(comma, posonly_names);
3868 Py_DECREF(comma);
3869 if (error_names == NULL) {
3870 goto fail;
3871 }
Victor Stinner438a12d2019-05-24 17:01:38 +02003872 _PyErr_Format(tstate, PyExc_TypeError,
3873 "%U() got some positional-only arguments passed"
3874 " as keyword arguments: '%U'",
3875 co->co_name, error_names);
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01003876 Py_DECREF(error_names);
3877 goto fail;
3878 }
3879
3880 Py_DECREF(posonly_names);
3881 return 0;
3882
3883fail:
3884 Py_XDECREF(posonly_names);
3885 return 1;
3886
3887}
3888
Guido van Rossumc2e20742006-02-27 22:32:47 +00003889/* This is gonna seem *real weird*, but if you put some other code between
Marcel Plch3a9ccee2018-04-06 23:22:04 +02003890 PyEval_EvalFrame() and _PyEval_EvalFrameDefault() you will need to adjust
Guido van Rossumc2e20742006-02-27 22:32:47 +00003891 the test in the if statements in Misc/gdbinit (pystack and pystackv). */
Skip Montanaro786ea6b2004-03-01 15:44:05 +00003892
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01003893PyObject *
Victor Stinnerb5e170f2019-11-16 01:03:22 +01003894_PyEval_EvalCode(PyThreadState *tstate,
3895 PyObject *_co, PyObject *globals, PyObject *locals,
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02003896 PyObject *const *args, Py_ssize_t argcount,
3897 PyObject *const *kwnames, PyObject *const *kwargs,
Serhiy Storchakab7281052016-09-12 00:52:40 +03003898 Py_ssize_t kwcount, int kwstep,
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02003899 PyObject *const *defs, Py_ssize_t defcount,
Victor Stinner74319ae2016-08-25 00:04:09 +02003900 PyObject *kwdefs, PyObject *closure,
Victor Stinner40ee3012014-06-16 15:59:28 +02003901 PyObject *name, PyObject *qualname)
Tim Peters5ca576e2001-06-18 22:08:13 +00003902{
Victor Stinnerb5e170f2019-11-16 01:03:22 +01003903 assert(tstate != NULL);
3904
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00003905 PyCodeObject* co = (PyCodeObject*)_co;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02003906 PyFrameObject *f;
3907 PyObject *retval = NULL;
3908 PyObject **fastlocals, **freevars;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003909 PyObject *x, *u;
Pablo Galindocd74e662019-06-01 18:08:04 +01003910 const Py_ssize_t total_args = co->co_argcount + co->co_kwonlyargcount;
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01003911 Py_ssize_t i, j, n;
Victor Stinnerc7020012016-08-16 23:40:29 +02003912 PyObject *kwdict;
Tim Peters5ca576e2001-06-18 22:08:13 +00003913
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003914 if (globals == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003915 _PyErr_SetString(tstate, PyExc_SystemError,
3916 "PyEval_EvalCodeEx: NULL globals");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003917 return NULL;
3918 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003919
Victor Stinnerc7020012016-08-16 23:40:29 +02003920 /* Create the frame */
INADA Naoki5a625d02016-12-24 20:19:08 +09003921 f = _PyFrame_New_NoTrack(tstate, co, globals, locals);
Victor Stinnerc7020012016-08-16 23:40:29 +02003922 if (f == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003923 return NULL;
Victor Stinnerc7020012016-08-16 23:40:29 +02003924 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003925 fastlocals = f->f_localsplus;
3926 freevars = f->f_localsplus + co->co_nlocals;
Tim Peters5ca576e2001-06-18 22:08:13 +00003927
Victor Stinnerc7020012016-08-16 23:40:29 +02003928 /* Create a dictionary for keyword parameters (**kwags) */
Benjamin Petersonb204a422011-06-05 22:04:07 -05003929 if (co->co_flags & CO_VARKEYWORDS) {
3930 kwdict = PyDict_New();
3931 if (kwdict == NULL)
3932 goto fail;
3933 i = total_args;
Victor Stinnerc7020012016-08-16 23:40:29 +02003934 if (co->co_flags & CO_VARARGS) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05003935 i++;
Victor Stinnerc7020012016-08-16 23:40:29 +02003936 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05003937 SETLOCAL(i, kwdict);
3938 }
Victor Stinnerc7020012016-08-16 23:40:29 +02003939 else {
3940 kwdict = NULL;
3941 }
3942
Pablo Galindocd74e662019-06-01 18:08:04 +01003943 /* Copy all positional arguments into local variables */
3944 if (argcount > co->co_argcount) {
3945 n = co->co_argcount;
Victor Stinnerc7020012016-08-16 23:40:29 +02003946 }
3947 else {
3948 n = argcount;
3949 }
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01003950 for (j = 0; j < n; j++) {
3951 x = args[j];
3952 Py_INCREF(x);
3953 SETLOCAL(j, x);
3954 }
3955
Victor Stinnerc7020012016-08-16 23:40:29 +02003956 /* Pack other positional arguments into the *args argument */
Benjamin Petersonb204a422011-06-05 22:04:07 -05003957 if (co->co_flags & CO_VARARGS) {
Sergey Fedoseev234531b2019-02-25 21:59:12 +05003958 u = _PyTuple_FromArray(args + n, argcount - n);
Victor Stinnerc7020012016-08-16 23:40:29 +02003959 if (u == NULL) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05003960 goto fail;
Victor Stinnerc7020012016-08-16 23:40:29 +02003961 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05003962 SETLOCAL(total_args, u);
Benjamin Petersonb204a422011-06-05 22:04:07 -05003963 }
Victor Stinnerc7020012016-08-16 23:40:29 +02003964
Serhiy Storchakab7281052016-09-12 00:52:40 +03003965 /* Handle keyword arguments passed as two strided arrays */
3966 kwcount *= kwstep;
3967 for (i = 0; i < kwcount; i += kwstep) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05003968 PyObject **co_varnames;
Serhiy Storchakab7281052016-09-12 00:52:40 +03003969 PyObject *keyword = kwnames[i];
3970 PyObject *value = kwargs[i];
Victor Stinner17061a92016-08-16 23:39:42 +02003971 Py_ssize_t j;
Victor Stinnerc7020012016-08-16 23:40:29 +02003972
Benjamin Petersonb204a422011-06-05 22:04:07 -05003973 if (keyword == NULL || !PyUnicode_Check(keyword)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003974 _PyErr_Format(tstate, PyExc_TypeError,
3975 "%U() keywords must be strings",
3976 co->co_name);
Benjamin Petersonb204a422011-06-05 22:04:07 -05003977 goto fail;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003978 }
Victor Stinnerc7020012016-08-16 23:40:29 +02003979
Benjamin Petersonb204a422011-06-05 22:04:07 -05003980 /* Speed hack: do raw pointer compares. As names are
3981 normally interned this should almost always hit. */
3982 co_varnames = ((PyTupleObject *)(co->co_varnames))->ob_item;
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01003983 for (j = co->co_posonlyargcount; j < total_args; j++) {
Victor Stinner6fea7f72016-08-22 23:17:30 +02003984 PyObject *name = co_varnames[j];
3985 if (name == keyword) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05003986 goto kw_found;
Victor Stinner6fea7f72016-08-22 23:17:30 +02003987 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05003988 }
Victor Stinnerc7020012016-08-16 23:40:29 +02003989
Benjamin Petersonb204a422011-06-05 22:04:07 -05003990 /* Slow fallback, just in case */
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01003991 for (j = co->co_posonlyargcount; j < total_args; j++) {
Victor Stinner6fea7f72016-08-22 23:17:30 +02003992 PyObject *name = co_varnames[j];
3993 int cmp = PyObject_RichCompareBool( keyword, name, Py_EQ);
3994 if (cmp > 0) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05003995 goto kw_found;
Victor Stinner6fea7f72016-08-22 23:17:30 +02003996 }
3997 else if (cmp < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003998 goto fail;
Victor Stinner6fea7f72016-08-22 23:17:30 +02003999 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004000 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004001
Victor Stinner231d1f32017-01-11 02:12:06 +01004002 assert(j >= total_args);
4003 if (kwdict == NULL) {
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004004
Victor Stinner438a12d2019-05-24 17:01:38 +02004005 if (co->co_posonlyargcount
4006 && positional_only_passed_as_keyword(tstate, co,
4007 kwcount, kwnames))
4008 {
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004009 goto fail;
4010 }
4011
Victor Stinner438a12d2019-05-24 17:01:38 +02004012 _PyErr_Format(tstate, PyExc_TypeError,
4013 "%U() got an unexpected keyword argument '%S'",
4014 co->co_name, keyword);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004015 goto fail;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004016 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004017
Christian Heimes0bd447f2013-07-20 14:48:10 +02004018 if (PyDict_SetItem(kwdict, keyword, value) == -1) {
4019 goto fail;
4020 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004021 continue;
Victor Stinnerc7020012016-08-16 23:40:29 +02004022
Benjamin Petersonb204a422011-06-05 22:04:07 -05004023 kw_found:
4024 if (GETLOCAL(j) != NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004025 _PyErr_Format(tstate, PyExc_TypeError,
4026 "%U() got multiple values for argument '%S'",
4027 co->co_name, keyword);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004028 goto fail;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004029 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004030 Py_INCREF(value);
4031 SETLOCAL(j, value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004032 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004033
4034 /* Check the number of positional arguments */
Pablo Galindocd74e662019-06-01 18:08:04 +01004035 if ((argcount > co->co_argcount) && !(co->co_flags & CO_VARARGS)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004036 too_many_positional(tstate, co, argcount, defcount, fastlocals);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004037 goto fail;
4038 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004039
4040 /* Add missing positional arguments (copy default values from defs) */
Pablo Galindocd74e662019-06-01 18:08:04 +01004041 if (argcount < co->co_argcount) {
4042 Py_ssize_t m = co->co_argcount - defcount;
Victor Stinner17061a92016-08-16 23:39:42 +02004043 Py_ssize_t missing = 0;
4044 for (i = argcount; i < m; i++) {
4045 if (GETLOCAL(i) == NULL) {
Benjamin Petersone109c702011-06-24 09:37:26 -05004046 missing++;
Victor Stinner17061a92016-08-16 23:39:42 +02004047 }
4048 }
Benjamin Petersone109c702011-06-24 09:37:26 -05004049 if (missing) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004050 missing_arguments(tstate, co, missing, defcount, fastlocals);
Benjamin Petersone109c702011-06-24 09:37:26 -05004051 goto fail;
Benjamin Petersonb204a422011-06-05 22:04:07 -05004052 }
4053 if (n > m)
4054 i = n - m;
4055 else
4056 i = 0;
4057 for (; i < defcount; i++) {
4058 if (GETLOCAL(m+i) == NULL) {
4059 PyObject *def = defs[i];
4060 Py_INCREF(def);
4061 SETLOCAL(m+i, def);
4062 }
4063 }
4064 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004065
4066 /* Add missing keyword arguments (copy default values from kwdefs) */
Benjamin Petersonb204a422011-06-05 22:04:07 -05004067 if (co->co_kwonlyargcount > 0) {
Victor Stinner17061a92016-08-16 23:39:42 +02004068 Py_ssize_t missing = 0;
Pablo Galindocd74e662019-06-01 18:08:04 +01004069 for (i = co->co_argcount; i < total_args; i++) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004070 PyObject *name;
4071 if (GETLOCAL(i) != NULL)
4072 continue;
4073 name = PyTuple_GET_ITEM(co->co_varnames, i);
4074 if (kwdefs != NULL) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02004075 PyObject *def = PyDict_GetItemWithError(kwdefs, name);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004076 if (def) {
4077 Py_INCREF(def);
4078 SETLOCAL(i, def);
4079 continue;
4080 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004081 else if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02004082 goto fail;
4083 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004084 }
Benjamin Petersone109c702011-06-24 09:37:26 -05004085 missing++;
4086 }
4087 if (missing) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004088 missing_arguments(tstate, co, missing, -1, fastlocals);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004089 goto fail;
4090 }
4091 }
4092
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004093 /* Allocate and initialize storage for cell vars, and copy free
Benjamin Peterson90037602011-06-25 22:54:45 -05004094 vars into frame. */
4095 for (i = 0; i < PyTuple_GET_SIZE(co->co_cellvars); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004096 PyObject *c;
Serhiy Storchaka5bb8b912016-12-16 19:19:02 +02004097 Py_ssize_t arg;
Benjamin Peterson90037602011-06-25 22:54:45 -05004098 /* Possibly account for the cell variable being an argument. */
4099 if (co->co_cell2arg != NULL &&
Guido van Rossum6832c812013-05-10 08:47:42 -07004100 (arg = co->co_cell2arg[i]) != CO_CELL_NOT_AN_ARG) {
Benjamin Peterson90037602011-06-25 22:54:45 -05004101 c = PyCell_New(GETLOCAL(arg));
Benjamin Peterson159ae412013-05-12 18:16:06 -05004102 /* Clear the local copy. */
4103 SETLOCAL(arg, NULL);
Guido van Rossum6832c812013-05-10 08:47:42 -07004104 }
4105 else {
Benjamin Peterson90037602011-06-25 22:54:45 -05004106 c = PyCell_New(NULL);
Guido van Rossum6832c812013-05-10 08:47:42 -07004107 }
Benjamin Peterson159ae412013-05-12 18:16:06 -05004108 if (c == NULL)
4109 goto fail;
Benjamin Peterson90037602011-06-25 22:54:45 -05004110 SETLOCAL(co->co_nlocals + i, c);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004111 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004112
4113 /* Copy closure variables to free variables */
Benjamin Peterson90037602011-06-25 22:54:45 -05004114 for (i = 0; i < PyTuple_GET_SIZE(co->co_freevars); ++i) {
4115 PyObject *o = PyTuple_GET_ITEM(closure, i);
4116 Py_INCREF(o);
4117 freevars[PyTuple_GET_SIZE(co->co_cellvars) + i] = o;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004118 }
Tim Peters5ca576e2001-06-18 22:08:13 +00004119
Yury Selivanoveb636452016-09-08 22:01:51 -07004120 /* Handle generator/coroutine/asynchronous generator */
4121 if (co->co_flags & (CO_GENERATOR | CO_COROUTINE | CO_ASYNC_GENERATOR)) {
Yury Selivanov75445082015-05-11 22:57:16 -04004122 PyObject *gen;
Yury Selivanov5376ba92015-06-22 12:19:30 -04004123 int is_coro = co->co_flags & CO_COROUTINE;
Yury Selivanov94c22632015-06-04 10:16:51 -04004124
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004125 /* Don't need to keep the reference to f_back, it will be set
4126 * when the generator is resumed. */
Serhiy Storchaka505ff752014-02-09 13:33:53 +02004127 Py_CLEAR(f->f_back);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00004128
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004129 /* Create a new generator that owns the ready to run frame
4130 * and return that as the value. */
Yury Selivanov5376ba92015-06-22 12:19:30 -04004131 if (is_coro) {
4132 gen = PyCoro_New(f, name, qualname);
Yury Selivanoveb636452016-09-08 22:01:51 -07004133 } else if (co->co_flags & CO_ASYNC_GENERATOR) {
4134 gen = PyAsyncGen_New(f, name, qualname);
Yury Selivanov5376ba92015-06-22 12:19:30 -04004135 } else {
4136 gen = PyGen_NewWithQualName(f, name, qualname);
4137 }
INADA Naoki6a3cedf2016-12-26 18:01:46 +09004138 if (gen == NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04004139 return NULL;
INADA Naoki6a3cedf2016-12-26 18:01:46 +09004140 }
INADA Naoki9c157762016-12-26 18:52:46 +09004141
INADA Naoki6a3cedf2016-12-26 18:01:46 +09004142 _PyObject_GC_TRACK(f);
Yury Selivanov75445082015-05-11 22:57:16 -04004143
Yury Selivanov75445082015-05-11 22:57:16 -04004144 return gen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004145 }
Tim Peters5ca576e2001-06-18 22:08:13 +00004146
Victor Stinnerb9e68122019-11-14 12:20:46 +01004147 retval = _PyEval_EvalFrame(tstate, f, 0);
Tim Peters5ca576e2001-06-18 22:08:13 +00004148
Thomas Woutersce272b62007-09-19 21:19:28 +00004149fail: /* Jump here from prelude on failure */
Tim Peters5ca576e2001-06-18 22:08:13 +00004150
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004151 /* decref'ing the frame can cause __del__ methods to get invoked,
4152 which can call back into Python. While we're done with the
4153 current Python frame (f), the associated C stack is still in use,
4154 so recursion_depth must be boosted for the duration.
4155 */
INADA Naoki5a625d02016-12-24 20:19:08 +09004156 if (Py_REFCNT(f) > 1) {
4157 Py_DECREF(f);
4158 _PyObject_GC_TRACK(f);
4159 }
4160 else {
4161 ++tstate->recursion_depth;
4162 Py_DECREF(f);
4163 --tstate->recursion_depth;
4164 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004165 return retval;
Tim Peters5ca576e2001-06-18 22:08:13 +00004166}
4167
Victor Stinnerb5e170f2019-11-16 01:03:22 +01004168
4169PyObject *
4170_PyEval_EvalCodeWithName(PyObject *_co, PyObject *globals, PyObject *locals,
4171 PyObject *const *args, Py_ssize_t argcount,
4172 PyObject *const *kwnames, PyObject *const *kwargs,
4173 Py_ssize_t kwcount, int kwstep,
4174 PyObject *const *defs, Py_ssize_t defcount,
4175 PyObject *kwdefs, PyObject *closure,
4176 PyObject *name, PyObject *qualname)
4177{
4178 PyThreadState *tstate = _PyThreadState_GET();
4179 return _PyEval_EvalCode(tstate, _co, globals, locals,
4180 args, argcount,
4181 kwnames, kwargs,
4182 kwcount, kwstep,
4183 defs, defcount,
4184 kwdefs, closure,
4185 name, qualname);
4186}
4187
Victor Stinner40ee3012014-06-16 15:59:28 +02004188PyObject *
4189PyEval_EvalCodeEx(PyObject *_co, PyObject *globals, PyObject *locals,
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02004190 PyObject *const *args, int argcount,
4191 PyObject *const *kws, int kwcount,
4192 PyObject *const *defs, int defcount,
4193 PyObject *kwdefs, PyObject *closure)
Victor Stinner40ee3012014-06-16 15:59:28 +02004194{
4195 return _PyEval_EvalCodeWithName(_co, globals, locals,
Victor Stinner9be7e7b2016-08-19 16:11:43 +02004196 args, argcount,
Zackery Spytzc6ea8972017-07-31 08:24:37 -06004197 kws, kws != NULL ? kws + 1 : NULL,
4198 kwcount, 2,
Victor Stinner9be7e7b2016-08-19 16:11:43 +02004199 defs, defcount,
4200 kwdefs, closure,
Victor Stinner40ee3012014-06-16 15:59:28 +02004201 NULL, NULL);
4202}
Tim Peters5ca576e2001-06-18 22:08:13 +00004203
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004204static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02004205special_lookup(PyThreadState *tstate, PyObject *o, _Py_Identifier *id)
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004206{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004207 PyObject *res;
Benjamin Petersonce798522012-01-22 11:24:29 -05004208 res = _PyObject_LookupSpecial(o, id);
Victor Stinner438a12d2019-05-24 17:01:38 +02004209 if (res == NULL && !_PyErr_Occurred(tstate)) {
4210 _PyErr_SetObject(tstate, PyExc_AttributeError, id->object);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004211 return NULL;
4212 }
4213 return res;
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004214}
4215
4216
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00004217/* Logic for the raise statement (too complicated for inlining).
4218 This *consumes* a reference count to each of its arguments. */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004219static int
Victor Stinner09532fe2019-05-10 23:39:09 +02004220do_raise(PyThreadState *tstate, PyObject *exc, PyObject *cause)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00004221{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004222 PyObject *type = NULL, *value = NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00004223
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004224 if (exc == NULL) {
4225 /* Reraise */
Mark Shannonae3087c2017-10-22 22:41:51 +01004226 _PyErr_StackItem *exc_info = _PyErr_GetTopmostException(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004227 PyObject *tb;
Mark Shannonae3087c2017-10-22 22:41:51 +01004228 type = exc_info->exc_type;
4229 value = exc_info->exc_value;
4230 tb = exc_info->exc_traceback;
Victor Stinnereec93312016-08-18 18:13:10 +02004231 if (type == Py_None || type == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004232 _PyErr_SetString(tstate, PyExc_RuntimeError,
4233 "No active exception to reraise");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004234 return 0;
4235 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004236 Py_XINCREF(type);
4237 Py_XINCREF(value);
4238 Py_XINCREF(tb);
Victor Stinner438a12d2019-05-24 17:01:38 +02004239 _PyErr_Restore(tstate, type, value, tb);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004240 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004241 }
Guido van Rossumac7be682001-01-17 15:42:30 +00004242
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004243 /* We support the following forms of raise:
4244 raise
Collin Winter828f04a2007-08-31 00:04:24 +00004245 raise <instance>
4246 raise <type> */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00004247
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004248 if (PyExceptionClass_Check(exc)) {
4249 type = exc;
Victor Stinnera5ed5f02016-12-06 18:45:50 +01004250 value = _PyObject_CallNoArg(exc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004251 if (value == NULL)
4252 goto raise_error;
Benjamin Peterson5afa03a2011-07-15 14:09:26 -05004253 if (!PyExceptionInstance_Check(value)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004254 _PyErr_Format(tstate, PyExc_TypeError,
4255 "calling %R should have returned an instance of "
4256 "BaseException, not %R",
4257 type, Py_TYPE(value));
4258 goto raise_error;
Benjamin Peterson5afa03a2011-07-15 14:09:26 -05004259 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004260 }
4261 else if (PyExceptionInstance_Check(exc)) {
4262 value = exc;
4263 type = PyExceptionInstance_Class(exc);
4264 Py_INCREF(type);
4265 }
4266 else {
4267 /* Not something you can raise. You get an exception
4268 anyway, just not what you specified :-) */
4269 Py_DECREF(exc);
Victor Stinner438a12d2019-05-24 17:01:38 +02004270 _PyErr_SetString(tstate, PyExc_TypeError,
4271 "exceptions must derive from BaseException");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004272 goto raise_error;
4273 }
Collin Winter828f04a2007-08-31 00:04:24 +00004274
Serhiy Storchakac0191582016-09-27 11:37:10 +03004275 assert(type != NULL);
4276 assert(value != NULL);
4277
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004278 if (cause) {
4279 PyObject *fixed_cause;
4280 if (PyExceptionClass_Check(cause)) {
Victor Stinnera5ed5f02016-12-06 18:45:50 +01004281 fixed_cause = _PyObject_CallNoArg(cause);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004282 if (fixed_cause == NULL)
4283 goto raise_error;
Benjamin Petersond5a1c442012-05-14 22:09:31 -07004284 Py_DECREF(cause);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004285 }
Benjamin Petersond5a1c442012-05-14 22:09:31 -07004286 else if (PyExceptionInstance_Check(cause)) {
4287 fixed_cause = cause;
4288 }
4289 else if (cause == Py_None) {
4290 Py_DECREF(cause);
4291 fixed_cause = NULL;
4292 }
4293 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02004294 _PyErr_SetString(tstate, PyExc_TypeError,
4295 "exception causes must derive from "
4296 "BaseException");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004297 goto raise_error;
4298 }
Benjamin Petersond5a1c442012-05-14 22:09:31 -07004299 PyException_SetCause(value, fixed_cause);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004300 }
Collin Winter828f04a2007-08-31 00:04:24 +00004301
Victor Stinner438a12d2019-05-24 17:01:38 +02004302 _PyErr_SetObject(tstate, type, value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004303 /* PyErr_SetObject incref's its arguments */
Serhiy Storchakac0191582016-09-27 11:37:10 +03004304 Py_DECREF(value);
4305 Py_DECREF(type);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004306 return 0;
Collin Winter828f04a2007-08-31 00:04:24 +00004307
4308raise_error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004309 Py_XDECREF(value);
4310 Py_XDECREF(type);
4311 Py_XDECREF(cause);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004312 return 0;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00004313}
4314
Tim Petersd6d010b2001-06-21 02:49:55 +00004315/* Iterate v argcnt times and store the results on the stack (via decreasing
Guido van Rossum0368b722007-05-11 16:50:42 +00004316 sp). Return 1 for success, 0 if error.
Antoine Pitrou9a2310d2008-07-25 22:39:39 +00004317
Guido van Rossum0368b722007-05-11 16:50:42 +00004318 If argcntafter == -1, do a simple unpack. If it is >= 0, do an unpack
4319 with a variable target.
4320*/
Tim Petersd6d010b2001-06-21 02:49:55 +00004321
Barry Warsawe42b18f1997-08-25 22:13:04 +00004322static int
Victor Stinner438a12d2019-05-24 17:01:38 +02004323unpack_iterable(PyThreadState *tstate, PyObject *v,
4324 int argcnt, int argcntafter, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00004325{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004326 int i = 0, j = 0;
4327 Py_ssize_t ll = 0;
4328 PyObject *it; /* iter(v) */
4329 PyObject *w;
4330 PyObject *l = NULL; /* variable list */
Guido van Rossumac7be682001-01-17 15:42:30 +00004331
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004332 assert(v != NULL);
Tim Petersd6d010b2001-06-21 02:49:55 +00004333
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004334 it = PyObject_GetIter(v);
Serhiy Storchaka13a6c092017-12-26 12:30:41 +02004335 if (it == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004336 if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError) &&
Serhiy Storchaka13a6c092017-12-26 12:30:41 +02004337 v->ob_type->tp_iter == NULL && !PySequence_Check(v))
4338 {
Victor Stinner438a12d2019-05-24 17:01:38 +02004339 _PyErr_Format(tstate, PyExc_TypeError,
4340 "cannot unpack non-iterable %.200s object",
4341 v->ob_type->tp_name);
Serhiy Storchaka13a6c092017-12-26 12:30:41 +02004342 }
4343 return 0;
4344 }
Tim Petersd6d010b2001-06-21 02:49:55 +00004345
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004346 for (; i < argcnt; i++) {
4347 w = PyIter_Next(it);
4348 if (w == NULL) {
4349 /* Iterator done, via error or exhaustion. */
Victor Stinner438a12d2019-05-24 17:01:38 +02004350 if (!_PyErr_Occurred(tstate)) {
R David Murray4171bbe2015-04-15 17:08:45 -04004351 if (argcntafter == -1) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004352 _PyErr_Format(tstate, PyExc_ValueError,
4353 "not enough values to unpack "
4354 "(expected %d, got %d)",
4355 argcnt, i);
R David Murray4171bbe2015-04-15 17:08:45 -04004356 }
4357 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02004358 _PyErr_Format(tstate, PyExc_ValueError,
4359 "not enough values to unpack "
4360 "(expected at least %d, got %d)",
4361 argcnt + argcntafter, i);
R David Murray4171bbe2015-04-15 17:08:45 -04004362 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004363 }
4364 goto Error;
4365 }
4366 *--sp = w;
4367 }
Tim Petersd6d010b2001-06-21 02:49:55 +00004368
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004369 if (argcntafter == -1) {
4370 /* We better have exhausted the iterator now. */
4371 w = PyIter_Next(it);
4372 if (w == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004373 if (_PyErr_Occurred(tstate))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004374 goto Error;
4375 Py_DECREF(it);
4376 return 1;
4377 }
4378 Py_DECREF(w);
Victor Stinner438a12d2019-05-24 17:01:38 +02004379 _PyErr_Format(tstate, PyExc_ValueError,
4380 "too many values to unpack (expected %d)",
4381 argcnt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004382 goto Error;
4383 }
Guido van Rossum0368b722007-05-11 16:50:42 +00004384
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004385 l = PySequence_List(it);
4386 if (l == NULL)
4387 goto Error;
4388 *--sp = l;
4389 i++;
Guido van Rossum0368b722007-05-11 16:50:42 +00004390
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004391 ll = PyList_GET_SIZE(l);
4392 if (ll < argcntafter) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004393 _PyErr_Format(tstate, PyExc_ValueError,
R David Murray4171bbe2015-04-15 17:08:45 -04004394 "not enough values to unpack (expected at least %d, got %zd)",
4395 argcnt + argcntafter, argcnt + ll);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004396 goto Error;
4397 }
Guido van Rossum0368b722007-05-11 16:50:42 +00004398
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004399 /* Pop the "after-variable" args off the list. */
4400 for (j = argcntafter; j > 0; j--, i++) {
4401 *--sp = PyList_GET_ITEM(l, ll - j);
4402 }
4403 /* Resize the list. */
4404 Py_SIZE(l) = ll - argcntafter;
4405 Py_DECREF(it);
4406 return 1;
Guido van Rossum0368b722007-05-11 16:50:42 +00004407
Tim Petersd6d010b2001-06-21 02:49:55 +00004408Error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004409 for (; i > 0; i--, sp++)
4410 Py_DECREF(*sp);
4411 Py_XDECREF(it);
4412 return 0;
Barry Warsawe42b18f1997-08-25 22:13:04 +00004413}
4414
4415
Guido van Rossum96a42c81992-01-12 02:29:51 +00004416#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00004417static int
Victor Stinner438a12d2019-05-24 17:01:38 +02004418prtrace(PyThreadState *tstate, PyObject *v, const char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004419{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004420 printf("%s ", str);
Victor Stinner438a12d2019-05-24 17:01:38 +02004421 if (PyObject_Print(v, stdout, 0) != 0) {
4422 /* Don't know what else to do */
4423 _PyErr_Clear(tstate);
4424 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004425 printf("\n");
4426 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004427}
Guido van Rossum3f5da241990-12-20 15:06:42 +00004428#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004429
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00004430static void
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004431call_exc_trace(Py_tracefunc func, PyObject *self,
4432 PyThreadState *tstate, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00004433{
Victor Stinneraaa8ed82013-07-10 13:57:55 +02004434 PyObject *type, *value, *traceback, *orig_traceback, *arg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004435 int err;
Victor Stinner438a12d2019-05-24 17:01:38 +02004436 _PyErr_Fetch(tstate, &type, &value, &orig_traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004437 if (value == NULL) {
4438 value = Py_None;
4439 Py_INCREF(value);
4440 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004441 _PyErr_NormalizeException(tstate, &type, &value, &orig_traceback);
Antoine Pitrou89335212013-11-23 14:05:23 +01004442 traceback = (orig_traceback != NULL) ? orig_traceback : Py_None;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004443 arg = PyTuple_Pack(3, type, value, traceback);
4444 if (arg == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004445 _PyErr_Restore(tstate, type, value, orig_traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004446 return;
4447 }
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004448 err = call_trace(func, self, tstate, f, PyTrace_EXCEPTION, arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004449 Py_DECREF(arg);
Victor Stinner438a12d2019-05-24 17:01:38 +02004450 if (err == 0) {
4451 _PyErr_Restore(tstate, type, value, orig_traceback);
4452 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004453 else {
4454 Py_XDECREF(type);
4455 Py_XDECREF(value);
Victor Stinneraaa8ed82013-07-10 13:57:55 +02004456 Py_XDECREF(orig_traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004457 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00004458}
4459
Amaury Forgeot d'Arcf05149a2007-11-13 01:05:30 +00004460static int
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004461call_trace_protected(Py_tracefunc func, PyObject *obj,
4462 PyThreadState *tstate, PyFrameObject *frame,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004463 int what, PyObject *arg)
Fred Drake4ec5d562001-10-04 19:26:43 +00004464{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004465 PyObject *type, *value, *traceback;
4466 int err;
Victor Stinner438a12d2019-05-24 17:01:38 +02004467 _PyErr_Fetch(tstate, &type, &value, &traceback);
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004468 err = call_trace(func, obj, tstate, frame, what, arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004469 if (err == 0)
4470 {
Victor Stinner438a12d2019-05-24 17:01:38 +02004471 _PyErr_Restore(tstate, type, value, traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004472 return 0;
4473 }
4474 else {
4475 Py_XDECREF(type);
4476 Py_XDECREF(value);
4477 Py_XDECREF(traceback);
4478 return -1;
4479 }
Fred Drake4ec5d562001-10-04 19:26:43 +00004480}
4481
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00004482static int
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004483call_trace(Py_tracefunc func, PyObject *obj,
4484 PyThreadState *tstate, PyFrameObject *frame,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004485 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00004486{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004487 int result;
4488 if (tstate->tracing)
4489 return 0;
4490 tstate->tracing++;
4491 tstate->use_tracing = 0;
4492 result = func(obj, frame, what, arg);
4493 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
4494 || (tstate->c_profilefunc != NULL));
4495 tstate->tracing--;
4496 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00004497}
4498
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00004499PyObject *
4500_PyEval_CallTracing(PyObject *func, PyObject *args)
4501{
Victor Stinner50b48572018-11-01 01:51:40 +01004502 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004503 int save_tracing = tstate->tracing;
4504 int save_use_tracing = tstate->use_tracing;
4505 PyObject *result;
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00004506
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004507 tstate->tracing = 0;
4508 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
4509 || (tstate->c_profilefunc != NULL));
4510 result = PyObject_Call(func, args, NULL);
4511 tstate->tracing = save_tracing;
4512 tstate->use_tracing = save_use_tracing;
4513 return result;
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00004514}
4515
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00004516/* See Objects/lnotab_notes.txt for a description of how tracing works. */
Michael W. Hudson006c7522002-11-08 13:08:46 +00004517static int
Tim Peters8a5c3c72004-04-05 19:36:21 +00004518maybe_call_line_trace(Py_tracefunc func, PyObject *obj,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004519 PyThreadState *tstate, PyFrameObject *frame,
4520 int *instr_lb, int *instr_ub, int *instr_prev)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004521{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004522 int result = 0;
4523 int line = frame->f_lineno;
Michael W. Hudson006c7522002-11-08 13:08:46 +00004524
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004525 /* If the last instruction executed isn't in the current
4526 instruction window, reset the window.
4527 */
4528 if (frame->f_lasti < *instr_lb || frame->f_lasti >= *instr_ub) {
4529 PyAddrPair bounds;
4530 line = _PyCode_CheckLineNumber(frame->f_code, frame->f_lasti,
4531 &bounds);
4532 *instr_lb = bounds.ap_lower;
4533 *instr_ub = bounds.ap_upper;
4534 }
Nick Coghlan5a851672017-09-08 10:14:16 +10004535 /* If the last instruction falls at the start of a line or if it
4536 represents a jump backwards, update the frame's line number and
4537 then call the trace function if we're tracing source lines.
4538 */
4539 if ((frame->f_lasti == *instr_lb || frame->f_lasti < *instr_prev)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004540 frame->f_lineno = line;
Nick Coghlan5a851672017-09-08 10:14:16 +10004541 if (frame->f_trace_lines) {
4542 result = call_trace(func, obj, tstate, frame, PyTrace_LINE, Py_None);
4543 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004544 }
George King20faa682017-10-18 17:44:22 -07004545 /* Always emit an opcode event if we're tracing all opcodes. */
4546 if (frame->f_trace_opcodes) {
4547 result = call_trace(func, obj, tstate, frame, PyTrace_OPCODE, Py_None);
4548 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004549 *instr_prev = frame->f_lasti;
4550 return result;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004551}
4552
Fred Drake5755ce62001-06-27 19:19:46 +00004553void
4554PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00004555{
Steve Dowerb82e17e2019-05-23 08:45:22 -07004556 if (PySys_Audit("sys.setprofile", NULL) < 0) {
4557 return;
4558 }
4559
Victor Stinner50b48572018-11-01 01:51:40 +01004560 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004561 PyObject *temp = tstate->c_profileobj;
4562 Py_XINCREF(arg);
4563 tstate->c_profilefunc = NULL;
4564 tstate->c_profileobj = NULL;
4565 /* Must make sure that tracing is not ignored if 'temp' is freed */
4566 tstate->use_tracing = tstate->c_tracefunc != NULL;
4567 Py_XDECREF(temp);
4568 tstate->c_profilefunc = func;
4569 tstate->c_profileobj = arg;
4570 /* Flag that tracing or profiling is turned on */
4571 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
Fred Drake5755ce62001-06-27 19:19:46 +00004572}
4573
4574void
4575PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
4576{
Steve Dowerb82e17e2019-05-23 08:45:22 -07004577 if (PySys_Audit("sys.settrace", NULL) < 0) {
4578 return;
4579 }
4580
Victor Stinner09532fe2019-05-10 23:39:09 +02004581 _PyRuntimeState *runtime = &_PyRuntime;
4582 PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004583 PyObject *temp = tstate->c_traceobj;
Victor Stinner09532fe2019-05-10 23:39:09 +02004584 runtime->ceval.tracing_possible += (func != NULL) - (tstate->c_tracefunc != NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004585 Py_XINCREF(arg);
4586 tstate->c_tracefunc = NULL;
4587 tstate->c_traceobj = NULL;
4588 /* Must make sure that profiling is not ignored if 'temp' is freed */
4589 tstate->use_tracing = tstate->c_profilefunc != NULL;
4590 Py_XDECREF(temp);
4591 tstate->c_tracefunc = func;
4592 tstate->c_traceobj = arg;
4593 /* Flag that tracing or profiling is turned on */
4594 tstate->use_tracing = ((func != NULL)
4595 || (tstate->c_profilefunc != NULL));
Fred Draked0838392001-06-16 21:02:31 +00004596}
4597
Yury Selivanov75445082015-05-11 22:57:16 -04004598void
Victor Stinner838f2642019-06-13 22:41:23 +02004599_PyEval_SetCoroutineOriginTrackingDepth(PyThreadState *tstate, int new_depth)
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08004600{
4601 assert(new_depth >= 0);
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08004602 tstate->coroutine_origin_tracking_depth = new_depth;
4603}
4604
4605int
4606_PyEval_GetCoroutineOriginTrackingDepth(void)
4607{
Victor Stinner50b48572018-11-01 01:51:40 +01004608 PyThreadState *tstate = _PyThreadState_GET();
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08004609 return tstate->coroutine_origin_tracking_depth;
4610}
4611
4612void
Yury Selivanoveb636452016-09-08 22:01:51 -07004613_PyEval_SetAsyncGenFirstiter(PyObject *firstiter)
4614{
Victor Stinner50b48572018-11-01 01:51:40 +01004615 PyThreadState *tstate = _PyThreadState_GET();
Steve Dowerb82e17e2019-05-23 08:45:22 -07004616
4617 if (PySys_Audit("sys.set_asyncgen_hook_firstiter", NULL) < 0) {
4618 return;
4619 }
4620
Yury Selivanoveb636452016-09-08 22:01:51 -07004621 Py_XINCREF(firstiter);
4622 Py_XSETREF(tstate->async_gen_firstiter, firstiter);
4623}
4624
4625PyObject *
4626_PyEval_GetAsyncGenFirstiter(void)
4627{
Victor Stinner50b48572018-11-01 01:51:40 +01004628 PyThreadState *tstate = _PyThreadState_GET();
Yury Selivanoveb636452016-09-08 22:01:51 -07004629 return tstate->async_gen_firstiter;
4630}
4631
4632void
4633_PyEval_SetAsyncGenFinalizer(PyObject *finalizer)
4634{
Victor Stinner50b48572018-11-01 01:51:40 +01004635 PyThreadState *tstate = _PyThreadState_GET();
Steve Dowerb82e17e2019-05-23 08:45:22 -07004636
4637 if (PySys_Audit("sys.set_asyncgen_hook_finalizer", NULL) < 0) {
4638 return;
4639 }
4640
Yury Selivanoveb636452016-09-08 22:01:51 -07004641 Py_XINCREF(finalizer);
4642 Py_XSETREF(tstate->async_gen_finalizer, finalizer);
4643}
4644
4645PyObject *
4646_PyEval_GetAsyncGenFinalizer(void)
4647{
Victor Stinner50b48572018-11-01 01:51:40 +01004648 PyThreadState *tstate = _PyThreadState_GET();
Yury Selivanoveb636452016-09-08 22:01:51 -07004649 return tstate->async_gen_finalizer;
4650}
4651
Victor Stinner438a12d2019-05-24 17:01:38 +02004652static PyFrameObject *
4653_PyEval_GetFrame(PyThreadState *tstate)
4654{
Victor Stinner01b1cc12019-11-20 02:27:56 +01004655 _PyRuntimeState *runtime = tstate->interp->runtime;
4656 return runtime->gilstate.getframe(tstate);
Victor Stinner438a12d2019-05-24 17:01:38 +02004657}
4658
4659PyFrameObject *
4660PyEval_GetFrame(void)
4661{
4662 PyThreadState *tstate = _PyThreadState_GET();
4663 return _PyEval_GetFrame(tstate);
4664}
4665
Guido van Rossumb209a111997-04-29 18:18:01 +00004666PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004667PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00004668{
Victor Stinner438a12d2019-05-24 17:01:38 +02004669 PyThreadState *tstate = _PyThreadState_GET();
4670 PyFrameObject *current_frame = _PyEval_GetFrame(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004671 if (current_frame == NULL)
Victor Stinner438a12d2019-05-24 17:01:38 +02004672 return tstate->interp->builtins;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004673 else
4674 return current_frame->f_builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00004675}
4676
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02004677/* Convenience function to get a builtin from its name */
4678PyObject *
4679_PyEval_GetBuiltinId(_Py_Identifier *name)
4680{
Victor Stinner438a12d2019-05-24 17:01:38 +02004681 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02004682 PyObject *attr = _PyDict_GetItemIdWithError(PyEval_GetBuiltins(), name);
4683 if (attr) {
4684 Py_INCREF(attr);
4685 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004686 else if (!_PyErr_Occurred(tstate)) {
4687 _PyErr_SetObject(tstate, PyExc_AttributeError, _PyUnicode_FromId(name));
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02004688 }
4689 return attr;
4690}
4691
Guido van Rossumb209a111997-04-29 18:18:01 +00004692PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004693PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00004694{
Victor Stinner438a12d2019-05-24 17:01:38 +02004695 PyThreadState *tstate = _PyThreadState_GET();
4696 PyFrameObject *current_frame = _PyEval_GetFrame(tstate);
Victor Stinner41bb43a2013-10-29 01:19:37 +01004697 if (current_frame == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004698 _PyErr_SetString(tstate, PyExc_SystemError, "frame does not exist");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004699 return NULL;
Victor Stinner41bb43a2013-10-29 01:19:37 +01004700 }
4701
Victor Stinner438a12d2019-05-24 17:01:38 +02004702 if (PyFrame_FastToLocalsWithError(current_frame) < 0) {
Victor Stinner41bb43a2013-10-29 01:19:37 +01004703 return NULL;
Victor Stinner438a12d2019-05-24 17:01:38 +02004704 }
Victor Stinner41bb43a2013-10-29 01:19:37 +01004705
4706 assert(current_frame->f_locals != NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004707 return current_frame->f_locals;
Guido van Rossum5b722181993-03-30 17:46:03 +00004708}
4709
Guido van Rossumb209a111997-04-29 18:18:01 +00004710PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004711PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00004712{
Victor Stinner438a12d2019-05-24 17:01:38 +02004713 PyThreadState *tstate = _PyThreadState_GET();
4714 PyFrameObject *current_frame = _PyEval_GetFrame(tstate);
4715 if (current_frame == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004716 return NULL;
Victor Stinner438a12d2019-05-24 17:01:38 +02004717 }
Victor Stinner41bb43a2013-10-29 01:19:37 +01004718
4719 assert(current_frame->f_globals != NULL);
4720 return current_frame->f_globals;
Guido van Rossum3f5da241990-12-20 15:06:42 +00004721}
4722
Guido van Rossum6135a871995-01-09 17:53:26 +00004723int
Tim Peters5ba58662001-07-16 02:29:45 +00004724PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
Jeremy Hylton061d1062001-03-22 02:32:48 +00004725{
Victor Stinner438a12d2019-05-24 17:01:38 +02004726 PyThreadState *tstate = _PyThreadState_GET();
4727 PyFrameObject *current_frame = _PyEval_GetFrame(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004728 int result = cf->cf_flags != 0;
Tim Peters5ba58662001-07-16 02:29:45 +00004729
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004730 if (current_frame != NULL) {
4731 const int codeflags = current_frame->f_code->co_flags;
4732 const int compilerflags = codeflags & PyCF_MASK;
4733 if (compilerflags) {
4734 result = 1;
4735 cf->cf_flags |= compilerflags;
4736 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00004737#if 0 /* future keyword */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004738 if (codeflags & CO_GENERATOR_ALLOWED) {
4739 result = 1;
4740 cf->cf_flags |= CO_GENERATOR_ALLOWED;
4741 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00004742#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004743 }
4744 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00004745}
4746
Guido van Rossum3f5da241990-12-20 15:06:42 +00004747
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00004748const char *
Tim Peters6d6c1a32001-08-02 04:15:00 +00004749PyEval_GetFuncName(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00004750{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004751 if (PyMethod_Check(func))
4752 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
4753 else if (PyFunction_Check(func))
Serhiy Storchaka06515832016-11-20 09:13:07 +02004754 return PyUnicode_AsUTF8(((PyFunctionObject*)func)->func_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004755 else if (PyCFunction_Check(func))
4756 return ((PyCFunctionObject*)func)->m_ml->ml_name;
4757 else
4758 return func->ob_type->tp_name;
Jeremy Hylton512a2372001-04-11 13:52:29 +00004759}
4760
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00004761const char *
Tim Peters6d6c1a32001-08-02 04:15:00 +00004762PyEval_GetFuncDesc(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00004763{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004764 if (PyMethod_Check(func))
4765 return "()";
4766 else if (PyFunction_Check(func))
4767 return "()";
4768 else if (PyCFunction_Check(func))
4769 return "()";
4770 else
4771 return " object";
Jeremy Hylton512a2372001-04-11 13:52:29 +00004772}
4773
Armin Rigo1c2d7e52005-09-20 18:34:01 +00004774#define C_TRACE(x, call) \
Nicholas Bastind858a772004-06-25 23:31:06 +00004775if (tstate->use_tracing && tstate->c_profilefunc) { \
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004776 if (call_trace(tstate->c_profilefunc, tstate->c_profileobj, \
4777 tstate, tstate->frame, \
4778 PyTrace_C_CALL, func)) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004779 x = NULL; \
4780 } \
4781 else { \
4782 x = call; \
4783 if (tstate->c_profilefunc != NULL) { \
4784 if (x == NULL) { \
4785 call_trace_protected(tstate->c_profilefunc, \
4786 tstate->c_profileobj, \
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004787 tstate, tstate->frame, \
4788 PyTrace_C_EXCEPTION, func); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004789 /* XXX should pass (type, value, tb) */ \
4790 } else { \
4791 if (call_trace(tstate->c_profilefunc, \
4792 tstate->c_profileobj, \
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004793 tstate, tstate->frame, \
4794 PyTrace_C_RETURN, func)) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004795 Py_DECREF(x); \
4796 x = NULL; \
4797 } \
4798 } \
4799 } \
4800 } \
Nicholas Bastind858a772004-06-25 23:31:06 +00004801} else { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004802 x = call; \
4803 }
Nicholas Bastinc69ebe82004-03-24 21:57:10 +00004804
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02004805
4806static PyObject *
4807trace_call_function(PyThreadState *tstate,
4808 PyObject *func,
4809 PyObject **args, Py_ssize_t nargs,
4810 PyObject *kwnames)
4811{
4812 PyObject *x;
4813 if (PyCFunction_Check(func)) {
Jeroen Demeyer0d722f32019-07-05 14:48:24 +02004814 C_TRACE(x, _PyObject_Vectorcall(func, args, nargs, kwnames));
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02004815 return x;
4816 }
4817 else if (Py_TYPE(func) == &PyMethodDescr_Type && nargs > 0) {
4818 /* We need to create a temporary bound method as argument
4819 for profiling.
4820
4821 If nargs == 0, then this cannot work because we have no
4822 "self". In any case, the call itself would raise
4823 TypeError (foo needs an argument), so we just skip
4824 profiling. */
4825 PyObject *self = args[0];
4826 func = Py_TYPE(func)->tp_descr_get(func, self, (PyObject*)Py_TYPE(self));
4827 if (func == NULL) {
4828 return NULL;
4829 }
Jeroen Demeyer0d722f32019-07-05 14:48:24 +02004830 C_TRACE(x, _PyObject_Vectorcall(func,
4831 args+1, nargs-1,
4832 kwnames));
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02004833 Py_DECREF(func);
4834 return x;
4835 }
4836 return _PyObject_Vectorcall(func, args, nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames);
4837}
4838
Victor Stinner415c5102017-01-11 00:54:57 +01004839/* Issue #29227: Inline call_function() into _PyEval_EvalFrameDefault()
4840 to reduce the stack consumption. */
4841Py_LOCAL_INLINE(PyObject *) _Py_HOT_FUNCTION
Victor Stinner09532fe2019-05-10 23:39:09 +02004842call_function(PyThreadState *tstate, PyObject ***pp_stack, Py_ssize_t oparg, PyObject *kwnames)
Jeremy Hyltone8c04322002-08-16 17:47:26 +00004843{
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004844 PyObject **pfunc = (*pp_stack) - oparg - 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004845 PyObject *func = *pfunc;
4846 PyObject *x, *w;
Victor Stinnerd8735722016-09-09 12:36:44 -07004847 Py_ssize_t nkwargs = (kwnames == NULL) ? 0 : PyTuple_GET_SIZE(kwnames);
4848 Py_ssize_t nargs = oparg - nkwargs;
INADA Naoki5566bbb2017-02-03 07:43:03 +09004849 PyObject **stack = (*pp_stack) - nargs - nkwargs;
Jeremy Hyltone8c04322002-08-16 17:47:26 +00004850
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02004851 if (tstate->use_tracing) {
4852 x = trace_call_function(tstate, func, stack, nargs, kwnames);
INADA Naoki5566bbb2017-02-03 07:43:03 +09004853 }
Victor Stinner4a7cc882015-03-06 23:35:27 +01004854 else {
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02004855 x = _PyObject_Vectorcall(func, stack, nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004856 }
Tim Peters8a5c3c72004-04-05 19:36:21 +00004857
Victor Stinner438a12d2019-05-24 17:01:38 +02004858 assert((x != NULL) ^ (_PyErr_Occurred(tstate) != NULL));
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004859
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01004860 /* Clear the stack of the function object. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004861 while ((*pp_stack) > pfunc) {
4862 w = EXT_POP(*pp_stack);
4863 Py_DECREF(w);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004864 }
Victor Stinnerace47d72013-07-18 01:41:08 +02004865
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004866 return x;
Jeremy Hyltone8c04322002-08-16 17:47:26 +00004867}
4868
Jeremy Hylton52820442001-01-03 23:52:36 +00004869static PyObject *
Victor Stinner09532fe2019-05-10 23:39:09 +02004870do_call_core(PyThreadState *tstate, PyObject *func, PyObject *callargs, PyObject *kwdict)
Jeremy Hylton52820442001-01-03 23:52:36 +00004871{
jdemeyere89de732018-09-19 12:06:20 +02004872 PyObject *result;
4873
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004874 if (PyCFunction_Check(func)) {
Jeroen Demeyer7a6873c2019-09-11 13:01:01 +02004875 C_TRACE(result, PyObject_Call(func, callargs, kwdict));
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004876 return result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004877 }
jdemeyere89de732018-09-19 12:06:20 +02004878 else if (Py_TYPE(func) == &PyMethodDescr_Type) {
jdemeyere89de732018-09-19 12:06:20 +02004879 Py_ssize_t nargs = PyTuple_GET_SIZE(callargs);
4880 if (nargs > 0 && tstate->use_tracing) {
4881 /* We need to create a temporary bound method as argument
4882 for profiling.
4883
4884 If nargs == 0, then this cannot work because we have no
4885 "self". In any case, the call itself would raise
4886 TypeError (foo needs an argument), so we just skip
4887 profiling. */
4888 PyObject *self = PyTuple_GET_ITEM(callargs, 0);
4889 func = Py_TYPE(func)->tp_descr_get(func, self, (PyObject*)Py_TYPE(self));
4890 if (func == NULL) {
4891 return NULL;
4892 }
4893
Victor Stinner4d231bc2019-11-14 13:36:21 +01004894 C_TRACE(result, _PyObject_FastCallDictTstate(
4895 tstate, func,
4896 &_PyTuple_ITEMS(callargs)[1],
4897 nargs - 1,
4898 kwdict));
jdemeyere89de732018-09-19 12:06:20 +02004899 Py_DECREF(func);
4900 return result;
4901 }
Victor Stinner74319ae2016-08-25 00:04:09 +02004902 }
jdemeyere89de732018-09-19 12:06:20 +02004903 return PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00004904}
4905
Serhiy Storchaka483405b2015-02-17 10:14:30 +02004906/* Extract a slice index from a PyLong or an object with the
Guido van Rossum38fff8c2006-03-07 18:50:55 +00004907 nb_index slot defined, and store in *pi.
4908 Silently reduce values larger than PY_SSIZE_T_MAX to PY_SSIZE_T_MAX,
Xiang Zhang2ddf5a12017-05-10 18:19:41 +08004909 and silently boost values less than PY_SSIZE_T_MIN to PY_SSIZE_T_MIN.
Martin v. Löwisdde99d22006-02-17 15:57:41 +00004910 Return 0 on error, 1 on success.
Tim Peterscb479e72001-12-16 19:11:44 +00004911*/
Guido van Rossum20c6add2000-05-08 14:06:50 +00004912int
Martin v. Löwis18e16552006-02-15 17:27:45 +00004913_PyEval_SliceIndex(PyObject *v, Py_ssize_t *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004914{
Victor Stinner438a12d2019-05-24 17:01:38 +02004915 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03004916 if (v != Py_None) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004917 Py_ssize_t x;
4918 if (PyIndex_Check(v)) {
4919 x = PyNumber_AsSsize_t(v, NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02004920 if (x == -1 && _PyErr_Occurred(tstate))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004921 return 0;
4922 }
4923 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02004924 _PyErr_SetString(tstate, PyExc_TypeError,
4925 "slice indices must be integers or "
4926 "None or have an __index__ method");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004927 return 0;
4928 }
4929 *pi = x;
4930 }
4931 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004932}
4933
Serhiy Storchaka80ec8362017-03-19 19:37:40 +02004934int
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03004935_PyEval_SliceIndexNotNone(PyObject *v, Py_ssize_t *pi)
Serhiy Storchaka80ec8362017-03-19 19:37:40 +02004936{
Victor Stinner438a12d2019-05-24 17:01:38 +02004937 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03004938 Py_ssize_t x;
4939 if (PyIndex_Check(v)) {
4940 x = PyNumber_AsSsize_t(v, NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02004941 if (x == -1 && _PyErr_Occurred(tstate))
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03004942 return 0;
4943 }
4944 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02004945 _PyErr_SetString(tstate, PyExc_TypeError,
4946 "slice indices must be integers or "
4947 "have an __index__ method");
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03004948 return 0;
4949 }
4950 *pi = x;
4951 return 1;
Serhiy Storchaka80ec8362017-03-19 19:37:40 +02004952}
4953
4954
Guido van Rossum486364b2007-06-30 05:01:58 +00004955#define CANNOT_CATCH_MSG "catching classes that do not inherit from "\
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004956 "BaseException is not allowed"
Brett Cannonf74225d2007-02-26 21:10:16 +00004957
Guido van Rossumb209a111997-04-29 18:18:01 +00004958static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02004959cmp_outcome(PyThreadState *tstate, int op, PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004960{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004961 int res = 0;
4962 switch (op) {
4963 case PyCmp_IS:
4964 res = (v == w);
4965 break;
4966 case PyCmp_IS_NOT:
4967 res = (v != w);
4968 break;
4969 case PyCmp_IN:
4970 res = PySequence_Contains(w, v);
4971 if (res < 0)
4972 return NULL;
4973 break;
4974 case PyCmp_NOT_IN:
4975 res = PySequence_Contains(w, v);
4976 if (res < 0)
4977 return NULL;
4978 res = !res;
4979 break;
4980 case PyCmp_EXC_MATCH:
4981 if (PyTuple_Check(w)) {
4982 Py_ssize_t i, length;
4983 length = PyTuple_Size(w);
4984 for (i = 0; i < length; i += 1) {
4985 PyObject *exc = PyTuple_GET_ITEM(w, i);
4986 if (!PyExceptionClass_Check(exc)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004987 _PyErr_SetString(tstate, PyExc_TypeError,
4988 CANNOT_CATCH_MSG);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004989 return NULL;
4990 }
4991 }
4992 }
4993 else {
4994 if (!PyExceptionClass_Check(w)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004995 _PyErr_SetString(tstate, PyExc_TypeError,
4996 CANNOT_CATCH_MSG);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004997 return NULL;
4998 }
4999 }
5000 res = PyErr_GivenExceptionMatches(v, w);
5001 break;
5002 default:
5003 return PyObject_RichCompare(v, w, op);
5004 }
5005 v = res ? Py_True : Py_False;
5006 Py_INCREF(v);
5007 return v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005008}
5009
Thomas Wouters52152252000-08-17 22:55:00 +00005010static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02005011import_name(PyThreadState *tstate, PyFrameObject *f,
5012 PyObject *name, PyObject *fromlist, PyObject *level)
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005013{
5014 _Py_IDENTIFIER(__import__);
Victor Stinnerdf142fd2016-08-20 00:44:42 +02005015 PyObject *import_func, *res;
5016 PyObject* stack[5];
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005017
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02005018 import_func = _PyDict_GetItemIdWithError(f->f_builtins, &PyId___import__);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005019 if (import_func == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005020 if (!_PyErr_Occurred(tstate)) {
5021 _PyErr_SetString(tstate, PyExc_ImportError, "__import__ not found");
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02005022 }
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005023 return NULL;
5024 }
5025
5026 /* Fast path for not overloaded __import__. */
Victor Stinner438a12d2019-05-24 17:01:38 +02005027 if (import_func == tstate->interp->import_func) {
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005028 int ilevel = _PyLong_AsInt(level);
Victor Stinner438a12d2019-05-24 17:01:38 +02005029 if (ilevel == -1 && _PyErr_Occurred(tstate)) {
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005030 return NULL;
5031 }
5032 res = PyImport_ImportModuleLevelObject(
5033 name,
5034 f->f_globals,
5035 f->f_locals == NULL ? Py_None : f->f_locals,
5036 fromlist,
5037 ilevel);
5038 return res;
5039 }
5040
5041 Py_INCREF(import_func);
Victor Stinnerdf142fd2016-08-20 00:44:42 +02005042
5043 stack[0] = name;
5044 stack[1] = f->f_globals;
5045 stack[2] = f->f_locals == NULL ? Py_None : f->f_locals;
5046 stack[3] = fromlist;
5047 stack[4] = level;
Victor Stinner559bb6a2016-08-22 22:48:54 +02005048 res = _PyObject_FastCall(import_func, stack, 5);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005049 Py_DECREF(import_func);
5050 return res;
5051}
5052
5053static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02005054import_from(PyThreadState *tstate, PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00005055{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005056 PyObject *x;
Antoine Pitrou0373a102014-10-13 20:19:45 +02005057 _Py_IDENTIFIER(__name__);
Xiang Zhang4830f582017-03-21 11:13:42 +08005058 PyObject *fullmodname, *pkgname, *pkgpath, *pkgname_or_unknown, *errmsg;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00005059
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005060 if (_PyObject_LookupAttr(v, name, &x) != 0) {
Antoine Pitrou0373a102014-10-13 20:19:45 +02005061 return x;
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005062 }
Antoine Pitrou0373a102014-10-13 20:19:45 +02005063 /* Issue #17636: in case this failed because of a circular relative
5064 import, try to fallback on reading the module directly from
5065 sys.modules. */
Antoine Pitrou0373a102014-10-13 20:19:45 +02005066 pkgname = _PyObject_GetAttrId(v, &PyId___name__);
Brett Cannon3008bc02015-08-11 18:01:31 -07005067 if (pkgname == NULL) {
5068 goto error;
5069 }
Oren Milman6db70332017-09-19 14:23:01 +03005070 if (!PyUnicode_Check(pkgname)) {
5071 Py_CLEAR(pkgname);
5072 goto error;
5073 }
Antoine Pitrou0373a102014-10-13 20:19:45 +02005074 fullmodname = PyUnicode_FromFormat("%U.%U", pkgname, name);
Brett Cannon3008bc02015-08-11 18:01:31 -07005075 if (fullmodname == NULL) {
Xiang Zhang4830f582017-03-21 11:13:42 +08005076 Py_DECREF(pkgname);
Antoine Pitrou0373a102014-10-13 20:19:45 +02005077 return NULL;
Brett Cannon3008bc02015-08-11 18:01:31 -07005078 }
Eric Snow3f9eee62017-09-15 16:35:20 -06005079 x = PyImport_GetModule(fullmodname);
Antoine Pitrou0373a102014-10-13 20:19:45 +02005080 Py_DECREF(fullmodname);
Victor Stinner438a12d2019-05-24 17:01:38 +02005081 if (x == NULL && !_PyErr_Occurred(tstate)) {
Brett Cannon3008bc02015-08-11 18:01:31 -07005082 goto error;
5083 }
Matthias Bussonnier1bc15642017-02-22 07:06:50 -08005084 Py_DECREF(pkgname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005085 return x;
Brett Cannon3008bc02015-08-11 18:01:31 -07005086 error:
Matthias Bussonnierbc4bed42017-02-14 16:05:25 -08005087 pkgpath = PyModule_GetFilenameObject(v);
Matthias Bussonnier1bc15642017-02-22 07:06:50 -08005088 if (pkgname == NULL) {
5089 pkgname_or_unknown = PyUnicode_FromString("<unknown module name>");
5090 if (pkgname_or_unknown == NULL) {
5091 Py_XDECREF(pkgpath);
5092 return NULL;
5093 }
5094 } else {
5095 pkgname_or_unknown = pkgname;
5096 }
Matthias Bussonnierbc4bed42017-02-14 16:05:25 -08005097
5098 if (pkgpath == NULL || !PyUnicode_Check(pkgpath)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005099 _PyErr_Clear(tstate);
Xiang Zhang4830f582017-03-21 11:13:42 +08005100 errmsg = PyUnicode_FromFormat(
5101 "cannot import name %R from %R (unknown location)",
5102 name, pkgname_or_unknown
5103 );
Stefan Krah027b09c2019-03-25 21:50:58 +01005104 /* NULL checks for errmsg and pkgname done by PyErr_SetImportError. */
Xiang Zhang4830f582017-03-21 11:13:42 +08005105 PyErr_SetImportError(errmsg, pkgname, NULL);
5106 }
5107 else {
Anthony Sottile65366bc2019-09-09 08:17:50 -07005108 _Py_IDENTIFIER(__spec__);
5109 PyObject *spec = _PyObject_GetAttrId(v, &PyId___spec__);
Anthony Sottile65366bc2019-09-09 08:17:50 -07005110 const char *fmt =
5111 _PyModuleSpec_IsInitializing(spec) ?
5112 "cannot import name %R from partially initialized module %R "
5113 "(most likely due to a circular import) (%S)" :
5114 "cannot import name %R from %R (%S)";
5115 Py_XDECREF(spec);
5116
5117 errmsg = PyUnicode_FromFormat(fmt, name, pkgname_or_unknown, pkgpath);
Stefan Krah027b09c2019-03-25 21:50:58 +01005118 /* NULL checks for errmsg and pkgname done by PyErr_SetImportError. */
Xiang Zhang4830f582017-03-21 11:13:42 +08005119 PyErr_SetImportError(errmsg, pkgname, pkgpath);
Matthias Bussonnierbc4bed42017-02-14 16:05:25 -08005120 }
5121
Xiang Zhang4830f582017-03-21 11:13:42 +08005122 Py_XDECREF(errmsg);
Matthias Bussonnier1bc15642017-02-22 07:06:50 -08005123 Py_XDECREF(pkgname_or_unknown);
5124 Py_XDECREF(pkgpath);
Brett Cannon3008bc02015-08-11 18:01:31 -07005125 return NULL;
Thomas Wouters52152252000-08-17 22:55:00 +00005126}
Guido van Rossumac7be682001-01-17 15:42:30 +00005127
Thomas Wouters52152252000-08-17 22:55:00 +00005128static int
Victor Stinner438a12d2019-05-24 17:01:38 +02005129import_all_from(PyThreadState *tstate, PyObject *locals, PyObject *v)
Thomas Wouters52152252000-08-17 22:55:00 +00005130{
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02005131 _Py_IDENTIFIER(__all__);
5132 _Py_IDENTIFIER(__dict__);
Xiang Zhangd8b291a2018-03-24 18:39:36 +08005133 _Py_IDENTIFIER(__name__);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005134 PyObject *all, *dict, *name, *value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005135 int skip_leading_underscores = 0;
5136 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00005137
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005138 if (_PyObject_LookupAttrId(v, &PyId___all__, &all) < 0) {
5139 return -1; /* Unexpected error */
5140 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005141 if (all == NULL) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005142 if (_PyObject_LookupAttrId(v, &PyId___dict__, &dict) < 0) {
5143 return -1;
5144 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005145 if (dict == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005146 _PyErr_SetString(tstate, PyExc_ImportError,
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005147 "from-import-* object has no __dict__ and no __all__");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005148 return -1;
5149 }
5150 all = PyMapping_Keys(dict);
5151 Py_DECREF(dict);
5152 if (all == NULL)
5153 return -1;
5154 skip_leading_underscores = 1;
5155 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00005156
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005157 for (pos = 0, err = 0; ; pos++) {
5158 name = PySequence_GetItem(all, pos);
5159 if (name == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005160 if (!_PyErr_ExceptionMatches(tstate, PyExc_IndexError)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005161 err = -1;
Victor Stinner438a12d2019-05-24 17:01:38 +02005162 }
5163 else {
5164 _PyErr_Clear(tstate);
5165 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005166 break;
5167 }
Xiang Zhangd8b291a2018-03-24 18:39:36 +08005168 if (!PyUnicode_Check(name)) {
5169 PyObject *modname = _PyObject_GetAttrId(v, &PyId___name__);
5170 if (modname == NULL) {
5171 Py_DECREF(name);
5172 err = -1;
5173 break;
5174 }
5175 if (!PyUnicode_Check(modname)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005176 _PyErr_Format(tstate, PyExc_TypeError,
5177 "module __name__ must be a string, not %.100s",
5178 Py_TYPE(modname)->tp_name);
Xiang Zhangd8b291a2018-03-24 18:39:36 +08005179 }
5180 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02005181 _PyErr_Format(tstate, PyExc_TypeError,
5182 "%s in %U.%s must be str, not %.100s",
5183 skip_leading_underscores ? "Key" : "Item",
5184 modname,
5185 skip_leading_underscores ? "__dict__" : "__all__",
5186 Py_TYPE(name)->tp_name);
Xiang Zhangd8b291a2018-03-24 18:39:36 +08005187 }
5188 Py_DECREF(modname);
5189 Py_DECREF(name);
5190 err = -1;
5191 break;
5192 }
5193 if (skip_leading_underscores) {
Serhiy Storchakae3b2b4b2017-09-08 09:58:51 +03005194 if (PyUnicode_READY(name) == -1) {
5195 Py_DECREF(name);
5196 err = -1;
5197 break;
5198 }
5199 if (PyUnicode_READ_CHAR(name, 0) == '_') {
5200 Py_DECREF(name);
5201 continue;
5202 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005203 }
5204 value = PyObject_GetAttr(v, name);
5205 if (value == NULL)
5206 err = -1;
5207 else if (PyDict_CheckExact(locals))
5208 err = PyDict_SetItem(locals, name, value);
5209 else
5210 err = PyObject_SetItem(locals, name, value);
5211 Py_DECREF(name);
5212 Py_XDECREF(value);
5213 if (err != 0)
5214 break;
5215 }
5216 Py_DECREF(all);
5217 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00005218}
5219
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005220static int
Victor Stinner438a12d2019-05-24 17:01:38 +02005221check_args_iterable(PyThreadState *tstate, PyObject *func, PyObject *args)
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005222{
5223 if (args->ob_type->tp_iter == NULL && !PySequence_Check(args)) {
Jeroen Demeyerbf17d412019-11-05 16:48:04 +01005224 /* check_args_iterable() may be called with a live exception:
5225 * clear it to prevent calling _PyObject_FunctionStr() with an
5226 * exception set. */
5227 PyErr_Clear();
5228 PyObject *funcstr = _PyObject_FunctionStr(func);
5229 if (funcstr != NULL) {
5230 _PyErr_Format(tstate, PyExc_TypeError,
5231 "%U argument after * must be an iterable, not %.200s",
5232 funcstr, Py_TYPE(args)->tp_name);
5233 Py_DECREF(funcstr);
5234 }
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005235 return -1;
5236 }
5237 return 0;
5238}
5239
5240static void
Victor Stinner438a12d2019-05-24 17:01:38 +02005241format_kwargs_error(PyThreadState *tstate, PyObject *func, PyObject *kwargs)
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005242{
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005243 /* _PyDict_MergeEx raises attribute
5244 * error (percolated from an attempt
5245 * to get 'keys' attribute) instead of
5246 * a type error if its second argument
5247 * is not a mapping.
5248 */
Victor Stinner438a12d2019-05-24 17:01:38 +02005249 if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) {
Jeroen Demeyerbf17d412019-11-05 16:48:04 +01005250 PyErr_Clear();
5251 PyObject *funcstr = _PyObject_FunctionStr(func);
5252 if (funcstr != NULL) {
5253 _PyErr_Format(
5254 tstate, PyExc_TypeError,
5255 "%U argument after ** must be a mapping, not %.200s",
5256 funcstr, Py_TYPE(kwargs)->tp_name);
5257 Py_DECREF(funcstr);
5258 }
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005259 }
Victor Stinner438a12d2019-05-24 17:01:38 +02005260 else if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005261 PyObject *exc, *val, *tb;
Victor Stinner438a12d2019-05-24 17:01:38 +02005262 _PyErr_Fetch(tstate, &exc, &val, &tb);
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005263 if (val && PyTuple_Check(val) && PyTuple_GET_SIZE(val) == 1) {
Jeroen Demeyerbf17d412019-11-05 16:48:04 +01005264 PyErr_Clear();
5265 PyObject *funcstr = _PyObject_FunctionStr(func);
5266 if (funcstr != NULL) {
5267 PyObject *key = PyTuple_GET_ITEM(val, 0);
5268 _PyErr_Format(
5269 tstate, PyExc_TypeError,
5270 "%U got multiple values for keyword argument '%S'",
5271 funcstr, key);
5272 Py_DECREF(funcstr);
5273 }
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005274 Py_XDECREF(exc);
5275 Py_XDECREF(val);
5276 Py_XDECREF(tb);
5277 }
5278 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02005279 _PyErr_Restore(tstate, exc, val, tb);
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005280 }
5281 }
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005282}
5283
Guido van Rossumac7be682001-01-17 15:42:30 +00005284static void
Victor Stinner438a12d2019-05-24 17:01:38 +02005285format_exc_check_arg(PyThreadState *tstate, PyObject *exc,
5286 const char *format_str, PyObject *obj)
Paul Prescode68140d2000-08-30 20:25:01 +00005287{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005288 const char *obj_str;
Paul Prescode68140d2000-08-30 20:25:01 +00005289
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005290 if (!obj)
5291 return;
Paul Prescode68140d2000-08-30 20:25:01 +00005292
Serhiy Storchaka06515832016-11-20 09:13:07 +02005293 obj_str = PyUnicode_AsUTF8(obj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005294 if (!obj_str)
5295 return;
Paul Prescode68140d2000-08-30 20:25:01 +00005296
Victor Stinner438a12d2019-05-24 17:01:38 +02005297 _PyErr_Format(tstate, exc, format_str, obj_str);
Paul Prescode68140d2000-08-30 20:25:01 +00005298}
Guido van Rossum950361c1997-01-24 13:49:28 +00005299
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005300static void
Victor Stinner438a12d2019-05-24 17:01:38 +02005301format_exc_unbound(PyThreadState *tstate, PyCodeObject *co, int oparg)
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005302{
5303 PyObject *name;
5304 /* Don't stomp existing exception */
Victor Stinner438a12d2019-05-24 17:01:38 +02005305 if (_PyErr_Occurred(tstate))
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005306 return;
5307 if (oparg < PyTuple_GET_SIZE(co->co_cellvars)) {
5308 name = PyTuple_GET_ITEM(co->co_cellvars,
5309 oparg);
Victor Stinner438a12d2019-05-24 17:01:38 +02005310 format_exc_check_arg(tstate,
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005311 PyExc_UnboundLocalError,
5312 UNBOUNDLOCAL_ERROR_MSG,
5313 name);
5314 } else {
5315 name = PyTuple_GET_ITEM(co->co_freevars, oparg -
5316 PyTuple_GET_SIZE(co->co_cellvars));
Victor Stinner438a12d2019-05-24 17:01:38 +02005317 format_exc_check_arg(tstate, PyExc_NameError,
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005318 UNBOUNDFREE_ERROR_MSG, name);
5319 }
5320}
5321
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03005322static void
Mark Shannonfee55262019-11-21 09:11:43 +00005323format_awaitable_error(PyThreadState *tstate, PyTypeObject *type, int prevprevopcode, int prevopcode)
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03005324{
5325 if (type->tp_as_async == NULL || type->tp_as_async->am_await == NULL) {
5326 if (prevopcode == BEFORE_ASYNC_WITH) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005327 _PyErr_Format(tstate, PyExc_TypeError,
5328 "'async with' received an object from __aenter__ "
5329 "that does not implement __await__: %.100s",
5330 type->tp_name);
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03005331 }
Mark Shannonfee55262019-11-21 09:11:43 +00005332 else if (prevopcode == WITH_EXCEPT_START || (prevopcode == CALL_FUNCTION && prevprevopcode == DUP_TOP)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005333 _PyErr_Format(tstate, PyExc_TypeError,
5334 "'async with' received an object from __aexit__ "
5335 "that does not implement __await__: %.100s",
5336 type->tp_name);
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03005337 }
5338 }
5339}
5340
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005341static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02005342unicode_concatenate(PyThreadState *tstate, PyObject *v, PyObject *w,
Serhiy Storchakaab874002016-09-11 13:48:15 +03005343 PyFrameObject *f, const _Py_CODEUNIT *next_instr)
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005344{
5345 PyObject *res;
5346 if (Py_REFCNT(v) == 2) {
5347 /* In the common case, there are 2 references to the value
5348 * stored in 'variable' when the += is performed: one on the
5349 * value stack (in 'v') and one still stored in the
5350 * 'variable'. We try to delete the variable now to reduce
5351 * the refcnt to 1.
5352 */
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03005353 int opcode, oparg;
5354 NEXTOPARG();
5355 switch (opcode) {
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005356 case STORE_FAST:
5357 {
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005358 PyObject **fastlocals = f->f_localsplus;
5359 if (GETLOCAL(oparg) == v)
5360 SETLOCAL(oparg, NULL);
5361 break;
5362 }
5363 case STORE_DEREF:
5364 {
5365 PyObject **freevars = (f->f_localsplus +
5366 f->f_code->co_nlocals);
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03005367 PyObject *c = freevars[oparg];
Raymond Hettingerc32f9db2016-11-12 04:10:35 -05005368 if (PyCell_GET(c) == v) {
5369 PyCell_SET(c, NULL);
5370 Py_DECREF(v);
5371 }
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005372 break;
5373 }
5374 case STORE_NAME:
5375 {
5376 PyObject *names = f->f_code->co_names;
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03005377 PyObject *name = GETITEM(names, oparg);
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005378 PyObject *locals = f->f_locals;
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02005379 if (locals && PyDict_CheckExact(locals)) {
5380 PyObject *w = PyDict_GetItemWithError(locals, name);
5381 if ((w == v && PyDict_DelItem(locals, name) != 0) ||
Victor Stinner438a12d2019-05-24 17:01:38 +02005382 (w == NULL && _PyErr_Occurred(tstate)))
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02005383 {
5384 Py_DECREF(v);
5385 return NULL;
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005386 }
5387 }
5388 break;
5389 }
5390 }
5391 }
5392 res = v;
5393 PyUnicode_Append(&res, w);
5394 return res;
5395}
5396
Guido van Rossum950361c1997-01-24 13:49:28 +00005397#ifdef DYNAMIC_EXECUTION_PROFILE
5398
Skip Montanarof118cb12001-10-15 20:51:38 +00005399static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005400getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00005401{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005402 int i;
5403 PyObject *l = PyList_New(256);
5404 if (l == NULL) return NULL;
5405 for (i = 0; i < 256; i++) {
5406 PyObject *x = PyLong_FromLong(a[i]);
5407 if (x == NULL) {
5408 Py_DECREF(l);
5409 return NULL;
5410 }
Zackery Spytz99d56b52018-12-08 07:16:55 -07005411 PyList_SET_ITEM(l, i, x);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005412 }
5413 for (i = 0; i < 256; i++)
5414 a[i] = 0;
5415 return l;
Guido van Rossum950361c1997-01-24 13:49:28 +00005416}
5417
5418PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005419_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00005420{
5421#ifndef DXPAIRS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005422 return getarray(dxp);
Guido van Rossum950361c1997-01-24 13:49:28 +00005423#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005424 int i;
5425 PyObject *l = PyList_New(257);
5426 if (l == NULL) return NULL;
5427 for (i = 0; i < 257; i++) {
5428 PyObject *x = getarray(dxpairs[i]);
5429 if (x == NULL) {
5430 Py_DECREF(l);
5431 return NULL;
5432 }
Zackery Spytz99d56b52018-12-08 07:16:55 -07005433 PyList_SET_ITEM(l, i, x);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005434 }
5435 return l;
Guido van Rossum950361c1997-01-24 13:49:28 +00005436#endif
5437}
5438
5439#endif
Brett Cannon5c4de282016-09-07 11:16:41 -07005440
5441Py_ssize_t
5442_PyEval_RequestCodeExtraIndex(freefunc free)
5443{
Victor Stinnercaba55b2018-08-03 15:33:52 +02005444 PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE();
Brett Cannon5c4de282016-09-07 11:16:41 -07005445 Py_ssize_t new_index;
5446
Dino Viehlandf3cffd22017-06-21 14:44:36 -07005447 if (interp->co_extra_user_count == MAX_CO_EXTRA_USERS - 1) {
Brett Cannon5c4de282016-09-07 11:16:41 -07005448 return -1;
5449 }
Dino Viehlandf3cffd22017-06-21 14:44:36 -07005450 new_index = interp->co_extra_user_count++;
5451 interp->co_extra_freefuncs[new_index] = free;
Brett Cannon5c4de282016-09-07 11:16:41 -07005452 return new_index;
5453}
Łukasz Langaa785c872016-09-09 17:37:37 -07005454
5455static void
5456dtrace_function_entry(PyFrameObject *f)
5457{
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02005458 const char *filename;
5459 const char *funcname;
Łukasz Langaa785c872016-09-09 17:37:37 -07005460 int lineno;
5461
5462 filename = PyUnicode_AsUTF8(f->f_code->co_filename);
5463 funcname = PyUnicode_AsUTF8(f->f_code->co_name);
5464 lineno = PyCode_Addr2Line(f->f_code, f->f_lasti);
5465
5466 PyDTrace_FUNCTION_ENTRY(filename, funcname, lineno);
5467}
5468
5469static void
5470dtrace_function_return(PyFrameObject *f)
5471{
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02005472 const char *filename;
5473 const char *funcname;
Łukasz Langaa785c872016-09-09 17:37:37 -07005474 int lineno;
5475
5476 filename = PyUnicode_AsUTF8(f->f_code->co_filename);
5477 funcname = PyUnicode_AsUTF8(f->f_code->co_name);
5478 lineno = PyCode_Addr2Line(f->f_code, f->f_lasti);
5479
5480 PyDTrace_FUNCTION_RETURN(filename, funcname, lineno);
5481}
5482
5483/* DTrace equivalent of maybe_call_line_trace. */
5484static void
5485maybe_dtrace_line(PyFrameObject *frame,
5486 int *instr_lb, int *instr_ub, int *instr_prev)
5487{
5488 int line = frame->f_lineno;
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02005489 const char *co_filename, *co_name;
Łukasz Langaa785c872016-09-09 17:37:37 -07005490
5491 /* If the last instruction executed isn't in the current
5492 instruction window, reset the window.
5493 */
5494 if (frame->f_lasti < *instr_lb || frame->f_lasti >= *instr_ub) {
5495 PyAddrPair bounds;
5496 line = _PyCode_CheckLineNumber(frame->f_code, frame->f_lasti,
5497 &bounds);
5498 *instr_lb = bounds.ap_lower;
5499 *instr_ub = bounds.ap_upper;
5500 }
5501 /* If the last instruction falls at the start of a line or if
5502 it represents a jump backwards, update the frame's line
5503 number and call the trace function. */
5504 if (frame->f_lasti == *instr_lb || frame->f_lasti < *instr_prev) {
5505 frame->f_lineno = line;
5506 co_filename = PyUnicode_AsUTF8(frame->f_code->co_filename);
5507 if (!co_filename)
5508 co_filename = "?";
5509 co_name = PyUnicode_AsUTF8(frame->f_code->co_name);
5510 if (!co_name)
5511 co_name = "?";
5512 PyDTrace_LINE(co_filename, co_name, line);
5513 }
5514 *instr_prev = frame->f_lasti;
5515}
Victor Stinnerf4b1e3d2019-11-04 19:48:34 +01005516
5517
5518/* Implement Py_EnterRecursiveCall() and Py_LeaveRecursiveCall() as functions
5519 for the limited API. */
5520
5521#undef Py_EnterRecursiveCall
5522
5523int Py_EnterRecursiveCall(const char *where)
5524{
Victor Stinnerbe434dc2019-11-05 00:51:22 +01005525 return _Py_EnterRecursiveCall_inline(where);
Victor Stinnerf4b1e3d2019-11-04 19:48:34 +01005526}
5527
5528#undef Py_LeaveRecursiveCall
5529
5530void Py_LeaveRecursiveCall(void)
5531{
Victor Stinnerbe434dc2019-11-05 00:51:22 +01005532 _Py_LeaveRecursiveCall_inline();
Victor Stinnerf4b1e3d2019-11-04 19:48:34 +01005533}