blob: 9de925780e407267df94edf148a7b4440b1d746e [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 Stinnere560f902020-04-14 18:30:41 +020013#include "pycore_abstract.h" // _PyIndex_Check()
Victor Stinner384621c2020-06-22 17:27:35 +020014#include "pycore_call.h" // _PyObject_FastCallDictTstate()
15#include "pycore_ceval.h" // _PyEval_SignalAsyncExc()
16#include "pycore_code.h" // _PyCode_InitOpcache()
17#include "pycore_initconfig.h" // _PyStatus_OK()
18#include "pycore_object.h" // _PyObject_GC_TRACK()
19#include "pycore_pyerrors.h" // _PyErr_Fetch()
20#include "pycore_pylifecycle.h" // _PyErr_Print()
Victor Stinnere560f902020-04-14 18:30:41 +020021#include "pycore_pymem.h" // _PyMem_IsPtrFreed()
22#include "pycore_pystate.h" // _PyInterpreterState_GET()
Victor Stinner384621c2020-06-22 17:27:35 +020023#include "pycore_sysmodule.h" // _PySys_Audit()
24#include "pycore_tuple.h" // _PyTuple_ITEMS()
Guido van Rossum10dc2e81990-11-18 17:27:39 +000025
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000026#include "code.h"
Benjamin Peterson025e9eb2015-05-05 20:16:41 -040027#include "dictobject.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000028#include "frameobject.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000029#include "opcode.h"
Łukasz Langaa785c872016-09-09 17:37:37 -070030#include "pydtrace.h"
Benjamin Peterson025e9eb2015-05-05 20:16:41 -040031#include "setobject.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000032
Guido van Rossumc6004111993-11-05 10:22:19 +000033#include <ctype.h>
34
Guido van Rossum408027e1996-12-30 16:17:54 +000035#ifdef Py_DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000036/* For debugging the interpreter: */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000037#define LLTRACE 1 /* Low-level trace feature */
38#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000039#endif
40
Victor Stinner5c75f372019-04-17 23:02:26 +020041#if !defined(Py_BUILD_CORE)
42# error "ceval.c must be build with Py_BUILD_CORE define for best performance"
43#endif
44
Hai Shi46874c22020-01-30 17:20:25 -060045_Py_IDENTIFIER(__name__);
Guido van Rossum5b722181993-03-30 17:46:03 +000046
Guido van Rossum374a9221991-04-04 10:40:29 +000047/* Forward declarations */
Victor Stinner09532fe2019-05-10 23:39:09 +020048Py_LOCAL_INLINE(PyObject *) call_function(
49 PyThreadState *tstate, PyObject ***pp_stack,
50 Py_ssize_t oparg, PyObject *kwnames);
51static PyObject * do_call_core(
52 PyThreadState *tstate, PyObject *func,
53 PyObject *callargs, PyObject *kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +000054
Guido van Rossum0a066c01992-03-27 17:29:15 +000055#ifdef LLTRACE
Guido van Rossumc2e20742006-02-27 22:32:47 +000056static int lltrace;
Victor Stinner438a12d2019-05-24 17:01:38 +020057static int prtrace(PyThreadState *, PyObject *, const char *);
Guido van Rossum0a066c01992-03-27 17:29:15 +000058#endif
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +010059static int call_trace(Py_tracefunc, PyObject *,
60 PyThreadState *, PyFrameObject *,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000061 int, PyObject *);
Amaury Forgeot d'Arcf05149a2007-11-13 01:05:30 +000062static int call_trace_protected(Py_tracefunc, PyObject *,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +010063 PyThreadState *, PyFrameObject *,
64 int, PyObject *);
65static void call_exc_trace(Py_tracefunc, PyObject *,
66 PyThreadState *, PyFrameObject *);
Tim Peters8a5c3c72004-04-05 19:36:21 +000067static int maybe_call_line_trace(Py_tracefunc, PyObject *,
Eric Snow2ebc5ce2017-09-07 23:51:28 -060068 PyThreadState *, PyFrameObject *,
Mark Shannon877df852020-11-12 09:43:29 +000069 PyCodeAddressRange *, int *);
70static void maybe_dtrace_line(PyFrameObject *, PyCodeAddressRange *, int *);
Łukasz Langaa785c872016-09-09 17:37:37 -070071static void dtrace_function_entry(PyFrameObject *);
72static void dtrace_function_return(PyFrameObject *);
Michael W. Hudsondd32a912002-08-15 14:59:02 +000073
Victor Stinner438a12d2019-05-24 17:01:38 +020074static PyObject * import_name(PyThreadState *, PyFrameObject *,
75 PyObject *, PyObject *, PyObject *);
76static PyObject * import_from(PyThreadState *, PyObject *, PyObject *);
77static int import_all_from(PyThreadState *, PyObject *, PyObject *);
78static void format_exc_check_arg(PyThreadState *, PyObject *, const char *, PyObject *);
79static void format_exc_unbound(PyThreadState *tstate, PyCodeObject *co, int oparg);
80static PyObject * unicode_concatenate(PyThreadState *, PyObject *, PyObject *,
Serhiy Storchakaab874002016-09-11 13:48:15 +030081 PyFrameObject *, const _Py_CODEUNIT *);
Victor Stinner438a12d2019-05-24 17:01:38 +020082static PyObject * special_lookup(PyThreadState *, PyObject *, _Py_Identifier *);
83static int check_args_iterable(PyThreadState *, PyObject *func, PyObject *vararg);
84static void format_kwargs_error(PyThreadState *, PyObject *func, PyObject *kwargs);
Mark Shannonfee55262019-11-21 09:11:43 +000085static void format_awaitable_error(PyThreadState *, PyTypeObject *, int, int);
Guido van Rossum374a9221991-04-04 10:40:29 +000086
Paul Prescode68140d2000-08-30 20:25:01 +000087#define NAME_ERROR_MSG \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000088 "name '%.200s' is not defined"
Paul Prescode68140d2000-08-30 20:25:01 +000089#define UNBOUNDLOCAL_ERROR_MSG \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000090 "local variable '%.200s' referenced before assignment"
Jeremy Hyltonc76770c2001-04-13 16:51:46 +000091#define UNBOUNDFREE_ERROR_MSG \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000092 "free variable '%.200s' referenced before assignment" \
93 " in enclosing scope"
Guido van Rossum374a9221991-04-04 10:40:29 +000094
Guido van Rossum950361c1997-01-24 13:49:28 +000095/* Dynamic execution profile */
96#ifdef DYNAMIC_EXECUTION_PROFILE
97#ifdef DXPAIRS
98static long dxpairs[257][256];
99#define dxp dxpairs[256]
100#else
101static long dxp[256];
102#endif
103#endif
104
Inada Naoki91234a12019-06-03 21:30:58 +0900105/* per opcode cache */
Inada Naokieddef862019-06-04 07:38:10 +0900106#ifdef Py_DEBUG
107// --with-pydebug is used to find memory leak. opcache makes it harder.
108// So we disable opcache when Py_DEBUG is defined.
109// See bpo-37146
110#define OPCACHE_MIN_RUNS 0 /* disable opcache */
111#else
Inada Naoki91234a12019-06-03 21:30:58 +0900112#define OPCACHE_MIN_RUNS 1024 /* create opcache when code executed this time */
Inada Naokieddef862019-06-04 07:38:10 +0900113#endif
Pablo Galindo109826c2020-10-20 06:22:44 +0100114#define OPCODE_CACHE_MAX_TRIES 20
Inada Naoki91234a12019-06-03 21:30:58 +0900115#define OPCACHE_STATS 0 /* Enable stats */
116
117#if OPCACHE_STATS
118static size_t opcache_code_objects = 0;
119static size_t opcache_code_objects_extra_mem = 0;
120
121static size_t opcache_global_opts = 0;
122static size_t opcache_global_hits = 0;
123static size_t opcache_global_misses = 0;
Pablo Galindo109826c2020-10-20 06:22:44 +0100124
125static size_t opcache_attr_opts = 0;
126static size_t opcache_attr_hits = 0;
127static size_t opcache_attr_misses = 0;
128static size_t opcache_attr_deopts = 0;
129static size_t opcache_attr_total = 0;
Inada Naoki91234a12019-06-03 21:30:58 +0900130#endif
131
Victor Stinner5a3a71d2020-03-19 17:40:12 +0100132
Victor Stinnerda2914d2020-03-20 09:29:08 +0100133#ifndef NDEBUG
134/* Ensure that tstate is valid: sanity check for PyEval_AcquireThread() and
135 PyEval_RestoreThread(). Detect if tstate memory was freed. It can happen
136 when a thread continues to run after Python finalization, especially
137 daemon threads. */
138static int
139is_tstate_valid(PyThreadState *tstate)
140{
141 assert(!_PyMem_IsPtrFreed(tstate));
142 assert(!_PyMem_IsPtrFreed(tstate->interp));
143 return 1;
144}
145#endif
146
147
Jeffrey Yasskin39370832010-05-03 19:29:34 +0000148/* This can set eval_breaker to 0 even though gil_drop_request became
149 1. We believe this is all right because the eval loop will release
150 the GIL eventually anyway. */
Victor Stinnerda2914d2020-03-20 09:29:08 +0100151static inline void
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200152COMPUTE_EVAL_BREAKER(PyInterpreterState *interp,
Victor Stinner299b8c62020-05-05 17:40:18 +0200153 struct _ceval_runtime_state *ceval,
154 struct _ceval_state *ceval2)
Victor Stinnerda2914d2020-03-20 09:29:08 +0100155{
Victor Stinner299b8c62020-05-05 17:40:18 +0200156 _Py_atomic_store_relaxed(&ceval2->eval_breaker,
157 _Py_atomic_load_relaxed(&ceval2->gil_drop_request)
Victor Stinner0b1e3302020-05-05 16:14:31 +0200158 | (_Py_atomic_load_relaxed(&ceval->signals_pending)
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200159 && _Py_ThreadCanHandleSignals(interp))
Victor Stinner299b8c62020-05-05 17:40:18 +0200160 | (_Py_atomic_load_relaxed(&ceval2->pending.calls_to_do)
Victor Stinnerd8316882020-03-20 14:50:35 +0100161 && _Py_ThreadCanHandlePendingCalls())
Victor Stinner299b8c62020-05-05 17:40:18 +0200162 | ceval2->pending.async_exc);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100163}
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000164
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000165
Victor Stinnerda2914d2020-03-20 09:29:08 +0100166static inline void
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200167SET_GIL_DROP_REQUEST(PyInterpreterState *interp)
Victor Stinnerda2914d2020-03-20 09:29:08 +0100168{
Victor Stinner299b8c62020-05-05 17:40:18 +0200169 struct _ceval_state *ceval2 = &interp->ceval;
170 _Py_atomic_store_relaxed(&ceval2->gil_drop_request, 1);
171 _Py_atomic_store_relaxed(&ceval2->eval_breaker, 1);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100172}
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000173
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000174
Victor Stinnerda2914d2020-03-20 09:29:08 +0100175static inline void
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200176RESET_GIL_DROP_REQUEST(PyInterpreterState *interp)
Victor Stinnerda2914d2020-03-20 09:29:08 +0100177{
Victor Stinner299b8c62020-05-05 17:40:18 +0200178 struct _ceval_runtime_state *ceval = &interp->runtime->ceval;
179 struct _ceval_state *ceval2 = &interp->ceval;
180 _Py_atomic_store_relaxed(&ceval2->gil_drop_request, 0);
181 COMPUTE_EVAL_BREAKER(interp, ceval, ceval2);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100182}
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000183
Eric Snowfdf282d2019-01-11 14:26:55 -0700184
Victor Stinnerda2914d2020-03-20 09:29:08 +0100185static inline void
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200186SIGNAL_PENDING_CALLS(PyInterpreterState *interp)
Victor Stinnerda2914d2020-03-20 09:29:08 +0100187{
Victor Stinner299b8c62020-05-05 17:40:18 +0200188 struct _ceval_runtime_state *ceval = &interp->runtime->ceval;
189 struct _ceval_state *ceval2 = &interp->ceval;
190 _Py_atomic_store_relaxed(&ceval2->pending.calls_to_do, 1);
191 COMPUTE_EVAL_BREAKER(interp, ceval, ceval2);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100192}
Eric Snowfdf282d2019-01-11 14:26:55 -0700193
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000194
Victor Stinnerda2914d2020-03-20 09:29:08 +0100195static inline void
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200196UNSIGNAL_PENDING_CALLS(PyInterpreterState *interp)
Victor Stinnerda2914d2020-03-20 09:29:08 +0100197{
Victor Stinner299b8c62020-05-05 17:40:18 +0200198 struct _ceval_runtime_state *ceval = &interp->runtime->ceval;
199 struct _ceval_state *ceval2 = &interp->ceval;
200 _Py_atomic_store_relaxed(&ceval2->pending.calls_to_do, 0);
201 COMPUTE_EVAL_BREAKER(interp, ceval, ceval2);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100202}
203
204
205static inline void
Victor Stinnerd96a7a82020-11-13 14:44:42 +0100206SIGNAL_PENDING_SIGNALS(PyInterpreterState *interp, int force)
Victor Stinnerda2914d2020-03-20 09:29:08 +0100207{
Victor Stinner299b8c62020-05-05 17:40:18 +0200208 struct _ceval_runtime_state *ceval = &interp->runtime->ceval;
209 struct _ceval_state *ceval2 = &interp->ceval;
Victor Stinner0b1e3302020-05-05 16:14:31 +0200210 _Py_atomic_store_relaxed(&ceval->signals_pending, 1);
Victor Stinnerd96a7a82020-11-13 14:44:42 +0100211 if (force) {
212 _Py_atomic_store_relaxed(&ceval2->eval_breaker, 1);
213 }
214 else {
215 /* eval_breaker is not set to 1 if thread_can_handle_signals() is false */
216 COMPUTE_EVAL_BREAKER(interp, ceval, ceval2);
217 }
Victor Stinnerda2914d2020-03-20 09:29:08 +0100218}
219
220
221static inline void
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200222UNSIGNAL_PENDING_SIGNALS(PyInterpreterState *interp)
Victor Stinnerda2914d2020-03-20 09:29:08 +0100223{
Victor Stinner299b8c62020-05-05 17:40:18 +0200224 struct _ceval_runtime_state *ceval = &interp->runtime->ceval;
225 struct _ceval_state *ceval2 = &interp->ceval;
Victor Stinner0b1e3302020-05-05 16:14:31 +0200226 _Py_atomic_store_relaxed(&ceval->signals_pending, 0);
Victor Stinner299b8c62020-05-05 17:40:18 +0200227 COMPUTE_EVAL_BREAKER(interp, ceval, ceval2);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100228}
229
230
231static inline void
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200232SIGNAL_ASYNC_EXC(PyInterpreterState *interp)
Victor Stinnerda2914d2020-03-20 09:29:08 +0100233{
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200234 struct _ceval_state *ceval2 = &interp->ceval;
Victor Stinnerda2914d2020-03-20 09:29:08 +0100235 ceval2->pending.async_exc = 1;
236 _Py_atomic_store_relaxed(&ceval2->eval_breaker, 1);
237}
238
239
240static inline void
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200241UNSIGNAL_ASYNC_EXC(PyInterpreterState *interp)
Victor Stinnerda2914d2020-03-20 09:29:08 +0100242{
Victor Stinner299b8c62020-05-05 17:40:18 +0200243 struct _ceval_runtime_state *ceval = &interp->runtime->ceval;
244 struct _ceval_state *ceval2 = &interp->ceval;
245 ceval2->pending.async_exc = 0;
246 COMPUTE_EVAL_BREAKER(interp, ceval, ceval2);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100247}
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000248
249
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000250#ifdef HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000251#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +0000252#endif
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000253#include "ceval_gil.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000254
Victor Stinner3026cad2020-06-01 16:02:40 +0200255void _Py_NO_RETURN
256_Py_FatalError_TstateNULL(const char *func)
Victor Stinnereb4e2ae2020-03-08 11:57:45 +0100257{
Victor Stinner3026cad2020-06-01 16:02:40 +0200258 _Py_FatalErrorFunc(func,
259 "the function must be called with the GIL held, "
260 "but the GIL is released "
261 "(the current Python thread state is NULL)");
Victor Stinnereb4e2ae2020-03-08 11:57:45 +0100262}
263
Victor Stinner7be4e352020-05-05 20:27:47 +0200264#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
265int
266_PyEval_ThreadsInitialized(PyInterpreterState *interp)
267{
268 return gil_created(&interp->ceval.gil);
269}
270
271int
272PyEval_ThreadsInitialized(void)
273{
274 // Fatal error if there is no current interpreter
275 PyInterpreterState *interp = PyInterpreterState_Get();
276 return _PyEval_ThreadsInitialized(interp);
277}
278#else
Tim Peters7f468f22004-10-11 02:40:51 +0000279int
Victor Stinner175a7042020-03-10 00:37:48 +0100280_PyEval_ThreadsInitialized(_PyRuntimeState *runtime)
281{
282 return gil_created(&runtime->ceval.gil);
283}
284
285int
Tim Peters7f468f22004-10-11 02:40:51 +0000286PyEval_ThreadsInitialized(void)
287{
Victor Stinner01b1cc12019-11-20 02:27:56 +0100288 _PyRuntimeState *runtime = &_PyRuntime;
Victor Stinner175a7042020-03-10 00:37:48 +0100289 return _PyEval_ThreadsInitialized(runtime);
Tim Peters7f468f22004-10-11 02:40:51 +0000290}
Victor Stinner7be4e352020-05-05 20:27:47 +0200291#endif
Tim Peters7f468f22004-10-11 02:40:51 +0000292
Victor Stinner111e4ee2020-03-09 21:24:14 +0100293PyStatus
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200294_PyEval_InitGIL(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000295{
Victor Stinner7be4e352020-05-05 20:27:47 +0200296#ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200297 if (!_Py_IsMainInterpreter(tstate)) {
298 /* Currently, the GIL is shared by all interpreters,
299 and only the main interpreter is responsible to create
300 and destroy it. */
301 return _PyStatus_OK();
Victor Stinner111e4ee2020-03-09 21:24:14 +0100302 }
Victor Stinner7be4e352020-05-05 20:27:47 +0200303#endif
Victor Stinner111e4ee2020-03-09 21:24:14 +0100304
Victor Stinner7be4e352020-05-05 20:27:47 +0200305#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
306 struct _gil_runtime_state *gil = &tstate->interp->ceval.gil;
307#else
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200308 struct _gil_runtime_state *gil = &tstate->interp->runtime->ceval.gil;
Victor Stinner7be4e352020-05-05 20:27:47 +0200309#endif
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200310 assert(!gil_created(gil));
Victor Stinner85f5a692020-03-09 22:12:04 +0100311
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200312 PyThread_init_thread();
313 create_gil(gil);
314
315 take_gil(tstate);
316
317 assert(gil_created(gil));
Victor Stinner111e4ee2020-03-09 21:24:14 +0100318 return _PyStatus_OK();
319}
320
321void
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200322_PyEval_FiniGIL(PyThreadState *tstate)
323{
Victor Stinner7be4e352020-05-05 20:27:47 +0200324#ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200325 if (!_Py_IsMainInterpreter(tstate)) {
326 /* Currently, the GIL is shared by all interpreters,
327 and only the main interpreter is responsible to create
328 and destroy it. */
329 return;
330 }
Victor Stinner7be4e352020-05-05 20:27:47 +0200331#endif
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200332
Victor Stinner7be4e352020-05-05 20:27:47 +0200333#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
334 struct _gil_runtime_state *gil = &tstate->interp->ceval.gil;
335#else
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200336 struct _gil_runtime_state *gil = &tstate->interp->runtime->ceval.gil;
Victor Stinner7be4e352020-05-05 20:27:47 +0200337#endif
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200338 if (!gil_created(gil)) {
339 /* First Py_InitializeFromConfig() call: the GIL doesn't exist
340 yet: do nothing. */
341 return;
342 }
343
344 destroy_gil(gil);
345 assert(!gil_created(gil));
346}
347
348void
Victor Stinner111e4ee2020-03-09 21:24:14 +0100349PyEval_InitThreads(void)
350{
Victor Stinnerb4698ec2020-03-10 01:28:54 +0100351 /* Do nothing: kept for backward compatibility */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000352}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000353
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000354void
Inada Naoki91234a12019-06-03 21:30:58 +0900355_PyEval_Fini(void)
356{
357#if OPCACHE_STATS
358 fprintf(stderr, "-- Opcode cache number of objects = %zd\n",
359 opcache_code_objects);
360
361 fprintf(stderr, "-- Opcode cache total extra mem = %zd\n",
362 opcache_code_objects_extra_mem);
363
364 fprintf(stderr, "\n");
365
366 fprintf(stderr, "-- Opcode cache LOAD_GLOBAL hits = %zd (%d%%)\n",
367 opcache_global_hits,
368 (int) (100.0 * opcache_global_hits /
369 (opcache_global_hits + opcache_global_misses)));
370
371 fprintf(stderr, "-- Opcode cache LOAD_GLOBAL misses = %zd (%d%%)\n",
372 opcache_global_misses,
373 (int) (100.0 * opcache_global_misses /
374 (opcache_global_hits + opcache_global_misses)));
375
376 fprintf(stderr, "-- Opcode cache LOAD_GLOBAL opts = %zd\n",
377 opcache_global_opts);
378
379 fprintf(stderr, "\n");
Pablo Galindo109826c2020-10-20 06:22:44 +0100380
381 fprintf(stderr, "-- Opcode cache LOAD_ATTR hits = %zd (%d%%)\n",
382 opcache_attr_hits,
383 (int) (100.0 * opcache_attr_hits /
384 opcache_attr_total));
385
386 fprintf(stderr, "-- Opcode cache LOAD_ATTR misses = %zd (%d%%)\n",
387 opcache_attr_misses,
388 (int) (100.0 * opcache_attr_misses /
389 opcache_attr_total));
390
391 fprintf(stderr, "-- Opcode cache LOAD_ATTR opts = %zd\n",
392 opcache_attr_opts);
393
394 fprintf(stderr, "-- Opcode cache LOAD_ATTR deopts = %zd\n",
395 opcache_attr_deopts);
396
397 fprintf(stderr, "-- Opcode cache LOAD_ATTR total = %zd\n",
398 opcache_attr_total);
Inada Naoki91234a12019-06-03 21:30:58 +0900399#endif
400}
401
402void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000403PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000404{
Victor Stinner09532fe2019-05-10 23:39:09 +0200405 _PyRuntimeState *runtime = &_PyRuntime;
Victor Stinner09532fe2019-05-10 23:39:09 +0200406 PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime);
Victor Stinner3026cad2020-06-01 16:02:40 +0200407 _Py_EnsureTstateNotNULL(tstate);
Victor Stinnereb4e2ae2020-03-08 11:57:45 +0100408
Victor Stinner85f5a692020-03-09 22:12:04 +0100409 take_gil(tstate);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000410}
411
412void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000413PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000414{
Victor Stinner09532fe2019-05-10 23:39:09 +0200415 _PyRuntimeState *runtime = &_PyRuntime;
Victor Stinnere225beb2019-06-03 18:14:24 +0200416 PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000417 /* This function must succeed when the current thread state is NULL.
Victor Stinner50b48572018-11-01 01:51:40 +0100418 We therefore avoid PyThreadState_Get() which dumps a fatal error
Victor Stinnerda2914d2020-03-20 09:29:08 +0100419 in debug mode. */
Victor Stinner299b8c62020-05-05 17:40:18 +0200420 struct _ceval_runtime_state *ceval = &runtime->ceval;
421 struct _ceval_state *ceval2 = &tstate->interp->ceval;
422 drop_gil(ceval, ceval2, tstate);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000423}
424
425void
Victor Stinner23ef89d2020-03-18 02:26:04 +0100426_PyEval_ReleaseLock(PyThreadState *tstate)
427{
428 struct _ceval_runtime_state *ceval = &tstate->interp->runtime->ceval;
Victor Stinner0b1e3302020-05-05 16:14:31 +0200429 struct _ceval_state *ceval2 = &tstate->interp->ceval;
430 drop_gil(ceval, ceval2, tstate);
Victor Stinner23ef89d2020-03-18 02:26:04 +0100431}
432
433void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000434PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000435{
Victor Stinner3026cad2020-06-01 16:02:40 +0200436 _Py_EnsureTstateNotNULL(tstate);
Victor Stinnereb4e2ae2020-03-08 11:57:45 +0100437
Victor Stinner85f5a692020-03-09 22:12:04 +0100438 take_gil(tstate);
Victor Stinnere225beb2019-06-03 18:14:24 +0200439
Victor Stinner85f5a692020-03-09 22:12:04 +0100440 struct _gilstate_runtime_state *gilstate = &tstate->interp->runtime->gilstate;
Victor Stinnere838a932020-05-05 19:56:48 +0200441#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
442 (void)_PyThreadState_Swap(gilstate, tstate);
443#else
Victor Stinner85f5a692020-03-09 22:12:04 +0100444 if (_PyThreadState_Swap(gilstate, tstate) != NULL) {
Victor Stinner9e5d30c2020-03-07 00:54:20 +0100445 Py_FatalError("non-NULL old thread state");
Victor Stinner09532fe2019-05-10 23:39:09 +0200446 }
Victor Stinnere838a932020-05-05 19:56:48 +0200447#endif
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000448}
449
450void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000451PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000452{
Victor Stinnerda2914d2020-03-20 09:29:08 +0100453 assert(is_tstate_valid(tstate));
Victor Stinner09532fe2019-05-10 23:39:09 +0200454
Victor Stinner01b1cc12019-11-20 02:27:56 +0100455 _PyRuntimeState *runtime = tstate->interp->runtime;
Victor Stinner09532fe2019-05-10 23:39:09 +0200456 PyThreadState *new_tstate = _PyThreadState_Swap(&runtime->gilstate, NULL);
457 if (new_tstate != tstate) {
Victor Stinner9e5d30c2020-03-07 00:54:20 +0100458 Py_FatalError("wrong thread state");
Victor Stinner09532fe2019-05-10 23:39:09 +0200459 }
Victor Stinner0b1e3302020-05-05 16:14:31 +0200460 struct _ceval_runtime_state *ceval = &runtime->ceval;
461 struct _ceval_state *ceval2 = &tstate->interp->ceval;
462 drop_gil(ceval, ceval2, tstate);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000463}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000464
Dong-hee Na62f75fe2020-04-15 01:16:24 +0900465#ifdef HAVE_FORK
Antoine Pitrouf7ecfac2017-05-28 11:35:14 +0200466/* This function is called from PyOS_AfterFork_Child to destroy all threads
Victor Stinner26881c82020-06-02 15:51:37 +0200467 which are not running in the child process, and clear internal locks
468 which might be held by those threads. */
469PyStatus
Victor Stinner317bab02020-06-02 18:44:54 +0200470_PyEval_ReInitThreads(PyThreadState *tstate)
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000471{
Victor Stinner317bab02020-06-02 18:44:54 +0200472 _PyRuntimeState *runtime = tstate->interp->runtime;
Victor Stinner7be4e352020-05-05 20:27:47 +0200473
474#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
475 struct _gil_runtime_state *gil = &tstate->interp->ceval.gil;
476#else
Victor Stinner56bfdeb2020-03-18 09:26:25 +0100477 struct _gil_runtime_state *gil = &runtime->ceval.gil;
Victor Stinner7be4e352020-05-05 20:27:47 +0200478#endif
Victor Stinner56bfdeb2020-03-18 09:26:25 +0100479 if (!gil_created(gil)) {
Victor Stinner26881c82020-06-02 15:51:37 +0200480 return _PyStatus_OK();
Victor Stinner09532fe2019-05-10 23:39:09 +0200481 }
Victor Stinner56bfdeb2020-03-18 09:26:25 +0100482 recreate_gil(gil);
Victor Stinner85f5a692020-03-09 22:12:04 +0100483
484 take_gil(tstate);
Eric Snow8479a342019-03-08 23:44:33 -0700485
Victor Stinner50e6e992020-03-19 02:41:21 +0100486 struct _pending_calls *pending = &tstate->interp->ceval.pending;
Dong-hee Na62f75fe2020-04-15 01:16:24 +0900487 if (_PyThread_at_fork_reinit(&pending->lock) < 0) {
Victor Stinner26881c82020-06-02 15:51:37 +0200488 return _PyStatus_ERR("Can't reinitialize pending calls lock");
Eric Snow8479a342019-03-08 23:44:33 -0700489 }
Jesse Nollera8513972008-07-17 16:49:17 +0000490
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200491 /* Destroy all threads except the current one */
Victor Stinnereb4e2ae2020-03-08 11:57:45 +0100492 _PyThreadState_DeleteExcept(runtime, tstate);
Victor Stinner26881c82020-06-02 15:51:37 +0200493 return _PyStatus_OK();
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000494}
Dong-hee Na62f75fe2020-04-15 01:16:24 +0900495#endif
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000496
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000497/* This function is used to signal that async exceptions are waiting to be
Zackery Spytzeef05962018-09-29 10:07:11 -0600498 raised. */
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000499
500void
Victor Stinner56bfdeb2020-03-18 09:26:25 +0100501_PyEval_SignalAsyncExc(PyThreadState *tstate)
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000502{
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200503 assert(is_tstate_valid(tstate));
504 SIGNAL_ASYNC_EXC(tstate->interp);
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000505}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000506
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000507PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000508PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000509{
Victor Stinner09532fe2019-05-10 23:39:09 +0200510 _PyRuntimeState *runtime = &_PyRuntime;
Victor Stinnere838a932020-05-05 19:56:48 +0200511#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
512 PyThreadState *old_tstate = _PyThreadState_GET();
513 PyThreadState *tstate = _PyThreadState_Swap(&runtime->gilstate, old_tstate);
514#else
Victor Stinner09532fe2019-05-10 23:39:09 +0200515 PyThreadState *tstate = _PyThreadState_Swap(&runtime->gilstate, NULL);
Victor Stinnere838a932020-05-05 19:56:48 +0200516#endif
Victor Stinner3026cad2020-06-01 16:02:40 +0200517 _Py_EnsureTstateNotNULL(tstate);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100518
Victor Stinner0b1e3302020-05-05 16:14:31 +0200519 struct _ceval_runtime_state *ceval = &runtime->ceval;
520 struct _ceval_state *ceval2 = &tstate->interp->ceval;
Victor Stinner7be4e352020-05-05 20:27:47 +0200521#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
522 assert(gil_created(&ceval2->gil));
523#else
Victor Stinnere225beb2019-06-03 18:14:24 +0200524 assert(gil_created(&ceval->gil));
Victor Stinner7be4e352020-05-05 20:27:47 +0200525#endif
Victor Stinner0b1e3302020-05-05 16:14:31 +0200526 drop_gil(ceval, ceval2, tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000527 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000528}
529
530void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000531PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000532{
Victor Stinner3026cad2020-06-01 16:02:40 +0200533 _Py_EnsureTstateNotNULL(tstate);
Victor Stinnereb4e2ae2020-03-08 11:57:45 +0100534
Victor Stinner85f5a692020-03-09 22:12:04 +0100535 take_gil(tstate);
Victor Stinner17c68b82020-01-30 12:20:48 +0100536
Victor Stinner85f5a692020-03-09 22:12:04 +0100537 struct _gilstate_runtime_state *gilstate = &tstate->interp->runtime->gilstate;
538 _PyThreadState_Swap(gilstate, tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000539}
540
541
Guido van Rossuma9672091994-09-14 13:31:22 +0000542/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
543 signal handlers or Mac I/O completion routines) can schedule calls
544 to a function to be called synchronously.
545 The synchronous function is called with one void* argument.
546 It should return 0 for success or -1 for failure -- failure should
547 be accompanied by an exception.
548
549 If registry succeeds, the registry function returns 0; if it fails
550 (e.g. due to too many pending calls) it returns -1 (without setting
551 an exception condition).
552
553 Note that because registry may occur from within signal handlers,
554 or other asynchronous events, calling malloc() is unsafe!
555
Guido van Rossuma9672091994-09-14 13:31:22 +0000556 Any thread can schedule pending calls, but only the main thread
557 will execute them.
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000558 There is no facility to schedule calls to a particular thread, but
559 that should be easy to change, should that ever be required. In
560 that case, the static variables here should go into the python
561 threadstate.
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000562*/
Guido van Rossuma9672091994-09-14 13:31:22 +0000563
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200564void
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200565_PyEval_SignalReceived(PyInterpreterState *interp)
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200566{
Victor Stinnerd96a7a82020-11-13 14:44:42 +0100567#ifdef MS_WINDOWS
568 // bpo-42296: On Windows, _PyEval_SignalReceived() is called from a signal
569 // handler which can run in a thread different than the Python thread, in
570 // which case _Py_ThreadCanHandleSignals() is wrong. Ignore
571 // _Py_ThreadCanHandleSignals() and always set eval_breaker to 1.
572 //
573 // The next eval_frame_handle_pending() call will call
574 // _Py_ThreadCanHandleSignals() to recompute eval_breaker.
575 int force = 1;
576#else
577 int force = 0;
578#endif
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200579 /* bpo-30703: Function called when the C signal handler of Python gets a
Victor Stinner50e6e992020-03-19 02:41:21 +0100580 signal. We cannot queue a callback using _PyEval_AddPendingCall() since
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200581 that function is not async-signal-safe. */
Victor Stinnerd96a7a82020-11-13 14:44:42 +0100582 SIGNAL_PENDING_SIGNALS(interp, force);
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200583}
584
Eric Snow5be45a62019-03-08 22:47:07 -0700585/* Push one item onto the queue while holding the lock. */
586static int
Victor Stinnere225beb2019-06-03 18:14:24 +0200587_push_pending_call(struct _pending_calls *pending,
Eric Snow842a2f02019-03-15 15:47:51 -0600588 int (*func)(void *), void *arg)
Eric Snow5be45a62019-03-08 22:47:07 -0700589{
Eric Snow842a2f02019-03-15 15:47:51 -0600590 int i = pending->last;
Eric Snow5be45a62019-03-08 22:47:07 -0700591 int j = (i + 1) % NPENDINGCALLS;
Eric Snow842a2f02019-03-15 15:47:51 -0600592 if (j == pending->first) {
Eric Snow5be45a62019-03-08 22:47:07 -0700593 return -1; /* Queue full */
594 }
Eric Snow842a2f02019-03-15 15:47:51 -0600595 pending->calls[i].func = func;
596 pending->calls[i].arg = arg;
597 pending->last = j;
Eric Snow5be45a62019-03-08 22:47:07 -0700598 return 0;
599}
600
601/* Pop one item off the queue while holding the lock. */
602static void
Victor Stinnere225beb2019-06-03 18:14:24 +0200603_pop_pending_call(struct _pending_calls *pending,
Eric Snow842a2f02019-03-15 15:47:51 -0600604 int (**func)(void *), void **arg)
Eric Snow5be45a62019-03-08 22:47:07 -0700605{
Eric Snow842a2f02019-03-15 15:47:51 -0600606 int i = pending->first;
607 if (i == pending->last) {
Eric Snow5be45a62019-03-08 22:47:07 -0700608 return; /* Queue empty */
609 }
610
Eric Snow842a2f02019-03-15 15:47:51 -0600611 *func = pending->calls[i].func;
612 *arg = pending->calls[i].arg;
613 pending->first = (i + 1) % NPENDINGCALLS;
Eric Snow5be45a62019-03-08 22:47:07 -0700614}
615
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200616/* This implementation is thread-safe. It allows
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000617 scheduling to be made from any thread, and even from an executing
618 callback.
619 */
620
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000621int
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200622_PyEval_AddPendingCall(PyInterpreterState *interp,
Victor Stinner09532fe2019-05-10 23:39:09 +0200623 int (*func)(void *), void *arg)
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000624{
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200625 struct _pending_calls *pending = &interp->ceval.pending;
Eric Snow842a2f02019-03-15 15:47:51 -0600626
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200627 /* Ensure that _PyEval_InitPendingCalls() was called
628 and that _PyEval_FiniPendingCalls() is not called yet. */
629 assert(pending->lock != NULL);
630
Eric Snow842a2f02019-03-15 15:47:51 -0600631 PyThread_acquire_lock(pending->lock, WAIT_LOCK);
Victor Stinnere225beb2019-06-03 18:14:24 +0200632 int result = _push_pending_call(pending, func, arg);
Eric Snow842a2f02019-03-15 15:47:51 -0600633 PyThread_release_lock(pending->lock);
Eric Snow5be45a62019-03-08 22:47:07 -0700634
Victor Stinnere225beb2019-06-03 18:14:24 +0200635 /* signal main loop */
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200636 SIGNAL_PENDING_CALLS(interp);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000637 return result;
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000638}
639
Victor Stinner09532fe2019-05-10 23:39:09 +0200640int
641Py_AddPendingCall(int (*func)(void *), void *arg)
642{
Victor Stinner50e6e992020-03-19 02:41:21 +0100643 /* Best-effort to support subinterpreters and calls with the GIL released.
644
645 First attempt _PyThreadState_GET() since it supports subinterpreters.
646
647 If the GIL is released, _PyThreadState_GET() returns NULL . In this
648 case, use PyGILState_GetThisThreadState() which works even if the GIL
649 is released.
650
651 Sadly, PyGILState_GetThisThreadState() doesn't support subinterpreters:
652 see bpo-10915 and bpo-15751.
653
Victor Stinner8849e592020-03-18 19:28:53 +0100654 Py_AddPendingCall() doesn't require the caller to hold the GIL. */
Victor Stinner50e6e992020-03-19 02:41:21 +0100655 PyThreadState *tstate = _PyThreadState_GET();
656 if (tstate == NULL) {
657 tstate = PyGILState_GetThisThreadState();
658 }
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200659
660 PyInterpreterState *interp;
661 if (tstate != NULL) {
662 interp = tstate->interp;
663 }
664 else {
665 /* Last resort: use the main interpreter */
666 interp = _PyRuntime.interpreters.main;
667 }
668 return _PyEval_AddPendingCall(interp, func, arg);
Victor Stinner09532fe2019-05-10 23:39:09 +0200669}
670
Eric Snowfdf282d2019-01-11 14:26:55 -0700671static int
Victor Stinnerd7fabc12020-03-18 01:56:21 +0100672handle_signals(PyThreadState *tstate)
Eric Snowfdf282d2019-01-11 14:26:55 -0700673{
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200674 assert(is_tstate_valid(tstate));
675 if (!_Py_ThreadCanHandleSignals(tstate->interp)) {
Eric Snow64d6cc82019-02-23 15:40:43 -0700676 return 0;
677 }
Eric Snowfdf282d2019-01-11 14:26:55 -0700678
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200679 UNSIGNAL_PENDING_SIGNALS(tstate->interp);
Victor Stinner72818982020-03-26 22:28:11 +0100680 if (_PyErr_CheckSignalsTstate(tstate) < 0) {
681 /* On failure, re-schedule a call to handle_signals(). */
Victor Stinnerd96a7a82020-11-13 14:44:42 +0100682 SIGNAL_PENDING_SIGNALS(tstate->interp, 0);
Eric Snowfdf282d2019-01-11 14:26:55 -0700683 return -1;
684 }
685 return 0;
686}
687
688static int
Victor Stinnerd7fabc12020-03-18 01:56:21 +0100689make_pending_calls(PyThreadState *tstate)
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000690{
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200691 assert(is_tstate_valid(tstate));
692
Victor Stinnerd8316882020-03-20 14:50:35 +0100693 /* only execute pending calls on main thread */
694 if (!_Py_ThreadCanHandlePendingCalls()) {
Victor Stinnere225beb2019-06-03 18:14:24 +0200695 return 0;
696 }
697
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000698 /* don't perform recursive pending calls */
Victor Stinnerda2914d2020-03-20 09:29:08 +0100699 static int busy = 0;
Eric Snowfdf282d2019-01-11 14:26:55 -0700700 if (busy) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000701 return 0;
Eric Snowfdf282d2019-01-11 14:26:55 -0700702 }
Charles-François Natalif23339a2011-07-23 18:15:43 +0200703 busy = 1;
Victor Stinnerda2914d2020-03-20 09:29:08 +0100704
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200705 /* unsignal before starting to call callbacks, so that any callback
706 added in-between re-signals */
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200707 UNSIGNAL_PENDING_CALLS(tstate->interp);
Eric Snowfdf282d2019-01-11 14:26:55 -0700708 int res = 0;
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200709
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000710 /* perform a bounded number of calls, in case of recursion */
Victor Stinnerda2914d2020-03-20 09:29:08 +0100711 struct _pending_calls *pending = &tstate->interp->ceval.pending;
Eric Snowfdf282d2019-01-11 14:26:55 -0700712 for (int i=0; i<NPENDINGCALLS; i++) {
Eric Snow5be45a62019-03-08 22:47:07 -0700713 int (*func)(void *) = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000714 void *arg = NULL;
715
716 /* pop one item off the queue while holding the lock */
Eric Snow842a2f02019-03-15 15:47:51 -0600717 PyThread_acquire_lock(pending->lock, WAIT_LOCK);
Victor Stinnere225beb2019-06-03 18:14:24 +0200718 _pop_pending_call(pending, &func, &arg);
Eric Snow842a2f02019-03-15 15:47:51 -0600719 PyThread_release_lock(pending->lock);
Eric Snow5be45a62019-03-08 22:47:07 -0700720
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100721 /* having released the lock, perform the callback */
Eric Snow5be45a62019-03-08 22:47:07 -0700722 if (func == NULL) {
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100723 break;
Eric Snow5be45a62019-03-08 22:47:07 -0700724 }
Eric Snowfdf282d2019-01-11 14:26:55 -0700725 res = func(arg);
726 if (res) {
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200727 goto error;
728 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000729 }
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200730
Charles-François Natalif23339a2011-07-23 18:15:43 +0200731 busy = 0;
Eric Snowfdf282d2019-01-11 14:26:55 -0700732 return res;
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200733
734error:
735 busy = 0;
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200736 SIGNAL_PENDING_CALLS(tstate->interp);
Eric Snowfdf282d2019-01-11 14:26:55 -0700737 return res;
738}
739
Eric Snow842a2f02019-03-15 15:47:51 -0600740void
Victor Stinner2b1df452020-01-13 18:46:59 +0100741_Py_FinishPendingCalls(PyThreadState *tstate)
Eric Snow842a2f02019-03-15 15:47:51 -0600742{
Eric Snow842a2f02019-03-15 15:47:51 -0600743 assert(PyGILState_Check());
744
Victor Stinner50e6e992020-03-19 02:41:21 +0100745 struct _pending_calls *pending = &tstate->interp->ceval.pending;
Victor Stinner09532fe2019-05-10 23:39:09 +0200746
Eric Snow842a2f02019-03-15 15:47:51 -0600747 if (!_Py_atomic_load_relaxed(&(pending->calls_to_do))) {
748 return;
749 }
750
Victor Stinnerd7fabc12020-03-18 01:56:21 +0100751 if (make_pending_calls(tstate) < 0) {
Victor Stinnere225beb2019-06-03 18:14:24 +0200752 PyObject *exc, *val, *tb;
753 _PyErr_Fetch(tstate, &exc, &val, &tb);
754 PyErr_BadInternalCall();
755 _PyErr_ChainExceptions(exc, val, tb);
756 _PyErr_Print(tstate);
Eric Snow842a2f02019-03-15 15:47:51 -0600757 }
758}
759
Eric Snowfdf282d2019-01-11 14:26:55 -0700760/* Py_MakePendingCalls() is a simple wrapper for the sake
761 of backward-compatibility. */
762int
763Py_MakePendingCalls(void)
764{
765 assert(PyGILState_Check());
766
Victor Stinnerd7fabc12020-03-18 01:56:21 +0100767 PyThreadState *tstate = _PyThreadState_GET();
768
Eric Snowfdf282d2019-01-11 14:26:55 -0700769 /* Python signal handler doesn't really queue a callback: it only signals
770 that a signal was received, see _PyEval_SignalReceived(). */
Victor Stinnerd7fabc12020-03-18 01:56:21 +0100771 int res = handle_signals(tstate);
Eric Snowfdf282d2019-01-11 14:26:55 -0700772 if (res != 0) {
773 return res;
774 }
775
Victor Stinnerd7fabc12020-03-18 01:56:21 +0100776 res = make_pending_calls(tstate);
Eric Snowb75b1a352019-04-12 10:20:10 -0600777 if (res != 0) {
778 return res;
779 }
780
781 return 0;
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000782}
783
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000784/* The interpreter's recursion limit */
785
Hye-Shik Changb6fa2812005-04-04 15:49:02 +0000786#ifndef Py_DEFAULT_RECURSION_LIMIT
Victor Stinner19c3ac92020-09-23 14:04:57 +0200787# define Py_DEFAULT_RECURSION_LIMIT 1000
Hye-Shik Changb6fa2812005-04-04 15:49:02 +0000788#endif
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600789
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600790void
Victor Stinnerdab84232020-03-17 18:56:44 +0100791_PyEval_InitRuntimeState(struct _ceval_runtime_state *ceval)
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600792{
Victor Stinner7be4e352020-05-05 20:27:47 +0200793#ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
Victor Stinnerdab84232020-03-17 18:56:44 +0100794 _gil_initialize(&ceval->gil);
Victor Stinner7be4e352020-05-05 20:27:47 +0200795#endif
Victor Stinnerdab84232020-03-17 18:56:44 +0100796}
797
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200798int
Victor Stinnerdab84232020-03-17 18:56:44 +0100799_PyEval_InitState(struct _ceval_state *ceval)
800{
Victor Stinner4e30ed32020-05-05 16:52:52 +0200801 ceval->recursion_limit = Py_DEFAULT_RECURSION_LIMIT;
802
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200803 struct _pending_calls *pending = &ceval->pending;
804 assert(pending->lock == NULL);
805
806 pending->lock = PyThread_allocate_lock();
807 if (pending->lock == NULL) {
808 return -1;
809 }
Victor Stinner7be4e352020-05-05 20:27:47 +0200810
811#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
812 _gil_initialize(&ceval->gil);
813#endif
814
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200815 return 0;
816}
817
818void
819_PyEval_FiniState(struct _ceval_state *ceval)
820{
821 struct _pending_calls *pending = &ceval->pending;
822 if (pending->lock != NULL) {
823 PyThread_free_lock(pending->lock);
824 pending->lock = NULL;
825 }
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600826}
827
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000828int
829Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000830{
Victor Stinner1bcc32f2020-06-10 20:08:26 +0200831 PyInterpreterState *interp = _PyInterpreterState_GET();
832 return interp->ceval.recursion_limit;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000833}
834
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000835void
836Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000837{
Victor Stinner4e30ed32020-05-05 16:52:52 +0200838 PyThreadState *tstate = _PyThreadState_GET();
839 tstate->interp->ceval.recursion_limit = new_limit;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000840}
841
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100842/* The function _Py_EnterRecursiveCall() only calls _Py_CheckRecursiveCall()
Victor Stinner19c3ac92020-09-23 14:04:57 +0200843 if the recursion_depth reaches recursion_limit.
844 If USE_STACKCHECK, the macro decrements recursion_limit
Armin Rigo2b3eb402003-10-28 12:05:48 +0000845 to guarantee that _Py_CheckRecursiveCall() is regularly called.
846 Without USE_STACKCHECK, there is no need for this. */
847int
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100848_Py_CheckRecursiveCall(PyThreadState *tstate, const char *where)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000849{
Victor Stinner4e30ed32020-05-05 16:52:52 +0200850 int recursion_limit = tstate->interp->ceval.recursion_limit;
Armin Rigo2b3eb402003-10-28 12:05:48 +0000851
852#ifdef USE_STACKCHECK
pdox18967932017-10-25 23:03:01 -0700853 tstate->stackcheck_counter = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000854 if (PyOS_CheckStack()) {
855 --tstate->recursion_depth;
Victor Stinner438a12d2019-05-24 17:01:38 +0200856 _PyErr_SetString(tstate, PyExc_MemoryError, "Stack overflow");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000857 return -1;
858 }
pdox18967932017-10-25 23:03:01 -0700859#endif
Mark Shannon4e7a69b2020-12-02 13:30:55 +0000860 if (tstate->recursion_headroom) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000861 if (tstate->recursion_depth > recursion_limit + 50) {
862 /* Overflowing while handling an overflow. Give up. */
863 Py_FatalError("Cannot recover from stack overflow.");
864 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000865 }
Mark Shannon4e7a69b2020-12-02 13:30:55 +0000866 else {
867 if (tstate->recursion_depth > recursion_limit) {
868 tstate->recursion_headroom++;
869 _PyErr_Format(tstate, PyExc_RecursionError,
870 "maximum recursion depth exceeded%s",
871 where);
872 tstate->recursion_headroom--;
873 --tstate->recursion_depth;
874 return -1;
875 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000876 }
877 return 0;
Armin Rigo2b3eb402003-10-28 12:05:48 +0000878}
879
Victor Stinner09532fe2019-05-10 23:39:09 +0200880static int do_raise(PyThreadState *tstate, PyObject *exc, PyObject *cause);
Victor Stinner438a12d2019-05-24 17:01:38 +0200881static int unpack_iterable(PyThreadState *, PyObject *, int, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000882
Victor Stinnere225beb2019-06-03 18:14:24 +0200883#define _Py_TracingPossible(ceval) ((ceval)->tracing_possible)
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000884
Guido van Rossum374a9221991-04-04 10:40:29 +0000885
Guido van Rossumb209a111997-04-29 18:18:01 +0000886PyObject *
Martin v. Löwis4d0d4712010-12-03 20:14:31 +0000887PyEval_EvalCode(PyObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000888{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000889 return PyEval_EvalCodeEx(co,
890 globals, locals,
891 (PyObject **)NULL, 0,
892 (PyObject **)NULL, 0,
893 (PyObject **)NULL, 0,
894 NULL, NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000895}
896
897
898/* Interpreter main loop */
899
Martin v. Löwis8d97e332004-06-27 15:43:12 +0000900PyObject *
Victor Stinnerb9e68122019-11-14 12:20:46 +0100901PyEval_EvalFrame(PyFrameObject *f)
902{
Victor Stinner0b72b232020-03-12 23:18:39 +0100903 /* Function kept for backward compatibility */
Victor Stinnerb9e68122019-11-14 12:20:46 +0100904 PyThreadState *tstate = _PyThreadState_GET();
905 return _PyEval_EvalFrame(tstate, f, 0);
Phillip J. Eby0d6615f2005-08-02 00:46:46 +0000906}
907
908PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000909PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
Guido van Rossum374a9221991-04-04 10:40:29 +0000910{
Victor Stinnerb9e68122019-11-14 12:20:46 +0100911 PyThreadState *tstate = _PyThreadState_GET();
912 return _PyEval_EvalFrame(tstate, f, throwflag);
Brett Cannon3cebf932016-09-05 15:33:46 -0700913}
914
Victor Stinnerda2914d2020-03-20 09:29:08 +0100915
916/* Handle signals, pending calls, GIL drop request
917 and asynchronous exception */
918static int
919eval_frame_handle_pending(PyThreadState *tstate)
920{
Victor Stinnerda2914d2020-03-20 09:29:08 +0100921 _PyRuntimeState * const runtime = &_PyRuntime;
922 struct _ceval_runtime_state *ceval = &runtime->ceval;
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200923
924 /* Pending signals */
Victor Stinner299b8c62020-05-05 17:40:18 +0200925 if (_Py_atomic_load_relaxed(&ceval->signals_pending)) {
Victor Stinnerda2914d2020-03-20 09:29:08 +0100926 if (handle_signals(tstate) != 0) {
927 return -1;
928 }
929 }
930
931 /* Pending calls */
Victor Stinner299b8c62020-05-05 17:40:18 +0200932 struct _ceval_state *ceval2 = &tstate->interp->ceval;
Victor Stinnerda2914d2020-03-20 09:29:08 +0100933 if (_Py_atomic_load_relaxed(&ceval2->pending.calls_to_do)) {
934 if (make_pending_calls(tstate) != 0) {
935 return -1;
936 }
937 }
938
939 /* GIL drop request */
Victor Stinner0b1e3302020-05-05 16:14:31 +0200940 if (_Py_atomic_load_relaxed(&ceval2->gil_drop_request)) {
Victor Stinnerda2914d2020-03-20 09:29:08 +0100941 /* Give another thread a chance */
942 if (_PyThreadState_Swap(&runtime->gilstate, NULL) != tstate) {
943 Py_FatalError("tstate mix-up");
944 }
Victor Stinner0b1e3302020-05-05 16:14:31 +0200945 drop_gil(ceval, ceval2, tstate);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100946
947 /* Other threads may run now */
948
949 take_gil(tstate);
950
Victor Stinnere838a932020-05-05 19:56:48 +0200951#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
952 (void)_PyThreadState_Swap(&runtime->gilstate, tstate);
953#else
Victor Stinnerda2914d2020-03-20 09:29:08 +0100954 if (_PyThreadState_Swap(&runtime->gilstate, tstate) != NULL) {
955 Py_FatalError("orphan tstate");
956 }
Victor Stinnere838a932020-05-05 19:56:48 +0200957#endif
Victor Stinnerda2914d2020-03-20 09:29:08 +0100958 }
959
960 /* Check for asynchronous exception. */
961 if (tstate->async_exc != NULL) {
962 PyObject *exc = tstate->async_exc;
963 tstate->async_exc = NULL;
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200964 UNSIGNAL_ASYNC_EXC(tstate->interp);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100965 _PyErr_SetNone(tstate, exc);
966 Py_DECREF(exc);
967 return -1;
968 }
969
Victor Stinnerd96a7a82020-11-13 14:44:42 +0100970#ifdef MS_WINDOWS
971 // bpo-42296: On Windows, _PyEval_SignalReceived() can be called in a
972 // different thread than the Python thread, in which case
973 // _Py_ThreadCanHandleSignals() is wrong. Recompute eval_breaker in the
974 // current Python thread with the correct _Py_ThreadCanHandleSignals()
975 // value. It prevents to interrupt the eval loop at every instruction if
976 // the current Python thread cannot handle signals (if
977 // _Py_ThreadCanHandleSignals() is false).
978 COMPUTE_EVAL_BREAKER(tstate->interp, ceval, ceval2);
979#endif
980
Victor Stinnerda2914d2020-03-20 09:29:08 +0100981 return 0;
982}
983
Victor Stinnerc6944e72016-11-11 02:13:35 +0100984PyObject* _Py_HOT_FUNCTION
Victor Stinner0b72b232020-03-12 23:18:39 +0100985_PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag)
Brett Cannon3cebf932016-09-05 15:33:46 -0700986{
Victor Stinner3026cad2020-06-01 16:02:40 +0200987 _Py_EnsureTstateNotNULL(tstate);
Victor Stinner0b72b232020-03-12 23:18:39 +0100988
Guido van Rossum950361c1997-01-24 13:49:28 +0000989#ifdef DXPAIRS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000990 int lastopcode = 0;
Guido van Rossum950361c1997-01-24 13:49:28 +0000991#endif
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200992 PyObject **stack_pointer; /* Next free slot in value stack */
Serhiy Storchakaab874002016-09-11 13:48:15 +0300993 const _Py_CODEUNIT *next_instr;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200994 int opcode; /* Current opcode */
995 int oparg; /* Current opcode argument, if any */
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200996 PyObject **fastlocals, **freevars;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000997 PyObject *retval = NULL; /* Return value */
Victor Stinnerdab84232020-03-17 18:56:44 +0100998 struct _ceval_state * const ceval2 = &tstate->interp->ceval;
Victor Stinner50e6e992020-03-19 02:41:21 +0100999 _Py_atomic_int * const eval_breaker = &ceval2->eval_breaker;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001000 PyCodeObject *co;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001001
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001002 /* when tracing we set things up so that
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001003
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001004 not (instr_lb <= current_bytecode_offset < instr_ub)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001005
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001006 is true when the line being executed has changed. The
1007 initial values are such as to make this false the first
1008 time it is tested. */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001009
Serhiy Storchakaab874002016-09-11 13:48:15 +03001010 const _Py_CODEUNIT *first_instr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001011 PyObject *names;
1012 PyObject *consts;
Inada Naoki91234a12019-06-03 21:30:58 +09001013 _PyOpcache *co_opcache;
Guido van Rossum374a9221991-04-04 10:40:29 +00001014
Brett Cannon368b4b72012-04-02 12:17:59 -04001015#ifdef LLTRACE
Victor Stinner3c1e4812012-03-26 22:10:51 +02001016 _Py_IDENTIFIER(__ltrace__);
Brett Cannon368b4b72012-04-02 12:17:59 -04001017#endif
Victor Stinner3c1e4812012-03-26 22:10:51 +02001018
Antoine Pitroub52ec782009-01-25 16:34:23 +00001019/* Computed GOTOs, or
1020 the-optimization-commonly-but-improperly-known-as-"threaded code"
1021 using gcc's labels-as-values extension
1022 (http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html).
1023
1024 The traditional bytecode evaluation loop uses a "switch" statement, which
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001025 decent compilers will optimize as a single indirect branch instruction
Antoine Pitroub52ec782009-01-25 16:34:23 +00001026 combined with a lookup table of jump addresses. However, since the
1027 indirect jump instruction is shared by all opcodes, the CPU will have a
1028 hard time making the right prediction for where to jump next (actually,
1029 it will be always wrong except in the uncommon case of a sequence of
1030 several identical opcodes).
1031
1032 "Threaded code" in contrast, uses an explicit jump table and an explicit
1033 indirect jump instruction at the end of each opcode. Since the jump
1034 instruction is at a different address for each opcode, the CPU will make a
1035 separate prediction for each of these instructions, which is equivalent to
1036 predicting the second opcode of each opcode pair. These predictions have
1037 a much better chance to turn out valid, especially in small bytecode loops.
1038
1039 A mispredicted branch on a modern CPU flushes the whole pipeline and
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001040 can cost several CPU cycles (depending on the pipeline depth),
Antoine Pitroub52ec782009-01-25 16:34:23 +00001041 and potentially many more instructions (depending on the pipeline width).
1042 A correctly predicted branch, however, is nearly free.
1043
1044 At the time of this writing, the "threaded code" version is up to 15-20%
1045 faster than the normal "switch" version, depending on the compiler and the
1046 CPU architecture.
1047
1048 We disable the optimization if DYNAMIC_EXECUTION_PROFILE is defined,
1049 because it would render the measurements invalid.
1050
1051
1052 NOTE: care must be taken that the compiler doesn't try to "optimize" the
1053 indirect jumps by sharing them between all opcodes. Such optimizations
1054 can be disabled on gcc by using the -fno-gcse flag (or possibly
1055 -fno-crossjumping).
1056*/
1057
Antoine Pitrou042b1282010-08-13 21:15:58 +00001058#ifdef DYNAMIC_EXECUTION_PROFILE
Antoine Pitroub52ec782009-01-25 16:34:23 +00001059#undef USE_COMPUTED_GOTOS
Antoine Pitrou042b1282010-08-13 21:15:58 +00001060#define USE_COMPUTED_GOTOS 0
Antoine Pitroub52ec782009-01-25 16:34:23 +00001061#endif
1062
Antoine Pitrou042b1282010-08-13 21:15:58 +00001063#ifdef HAVE_COMPUTED_GOTOS
1064 #ifndef USE_COMPUTED_GOTOS
1065 #define USE_COMPUTED_GOTOS 1
1066 #endif
1067#else
1068 #if defined(USE_COMPUTED_GOTOS) && USE_COMPUTED_GOTOS
1069 #error "Computed gotos are not supported on this compiler."
1070 #endif
1071 #undef USE_COMPUTED_GOTOS
1072 #define USE_COMPUTED_GOTOS 0
1073#endif
1074
1075#if USE_COMPUTED_GOTOS
Antoine Pitroub52ec782009-01-25 16:34:23 +00001076/* Import the static jump table */
1077#include "opcode_targets.h"
1078
Antoine Pitroub52ec782009-01-25 16:34:23 +00001079#define TARGET(op) \
Benjamin Petersonddd19492018-09-16 22:38:02 -07001080 op: \
1081 TARGET_##op
Antoine Pitroub52ec782009-01-25 16:34:23 +00001082
Antoine Pitroub52ec782009-01-25 16:34:23 +00001083#ifdef LLTRACE
1084#define FAST_DISPATCH() \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001085 { \
Victor Stinnerdab84232020-03-17 18:56:44 +01001086 if (!lltrace && !_Py_TracingPossible(ceval2) && !PyDTrace_LINE_ENABLED()) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001087 f->f_lasti = INSTR_OFFSET(); \
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001088 NEXTOPARG(); \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001089 goto *opcode_targets[opcode]; \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001090 } \
1091 goto fast_next_opcode; \
1092 }
Antoine Pitroub52ec782009-01-25 16:34:23 +00001093#else
1094#define FAST_DISPATCH() \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001095 { \
Victor Stinnerdab84232020-03-17 18:56:44 +01001096 if (!_Py_TracingPossible(ceval2) && !PyDTrace_LINE_ENABLED()) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001097 f->f_lasti = INSTR_OFFSET(); \
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001098 NEXTOPARG(); \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001099 goto *opcode_targets[opcode]; \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001100 } \
1101 goto fast_next_opcode; \
1102 }
Antoine Pitroub52ec782009-01-25 16:34:23 +00001103#endif
1104
Victor Stinner09532fe2019-05-10 23:39:09 +02001105#define DISPATCH() \
1106 { \
1107 if (!_Py_atomic_load_relaxed(eval_breaker)) { \
1108 FAST_DISPATCH(); \
1109 } \
1110 continue; \
1111 }
1112
Antoine Pitroub52ec782009-01-25 16:34:23 +00001113#else
Benjamin Petersonddd19492018-09-16 22:38:02 -07001114#define TARGET(op) op
Antoine Pitroub52ec782009-01-25 16:34:23 +00001115#define FAST_DISPATCH() goto fast_next_opcode
Victor Stinner09532fe2019-05-10 23:39:09 +02001116#define DISPATCH() continue
Antoine Pitroub52ec782009-01-25 16:34:23 +00001117#endif
1118
1119
Neal Norwitza81d2202002-07-14 00:27:26 +00001120/* Tuple access macros */
1121
1122#ifndef Py_DEBUG
1123#define GETITEM(v, i) PyTuple_GET_ITEM((PyTupleObject *)(v), (i))
1124#else
1125#define GETITEM(v, i) PyTuple_GetItem((v), (i))
1126#endif
1127
Guido van Rossum374a9221991-04-04 10:40:29 +00001128/* Code access macros */
1129
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001130/* The integer overflow is checked by an assertion below. */
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001131#define INSTR_OFFSET() \
1132 (sizeof(_Py_CODEUNIT) * (int)(next_instr - first_instr))
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001133#define NEXTOPARG() do { \
Serhiy Storchakaab874002016-09-11 13:48:15 +03001134 _Py_CODEUNIT word = *next_instr; \
1135 opcode = _Py_OPCODE(word); \
1136 oparg = _Py_OPARG(word); \
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001137 next_instr++; \
1138 } while (0)
Serhiy Storchakaab874002016-09-11 13:48:15 +03001139#define JUMPTO(x) (next_instr = first_instr + (x) / sizeof(_Py_CODEUNIT))
1140#define JUMPBY(x) (next_instr += (x) / sizeof(_Py_CODEUNIT))
Guido van Rossum374a9221991-04-04 10:40:29 +00001141
Raymond Hettingerf606f872003-03-16 03:11:04 +00001142/* OpCode prediction macros
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001143 Some opcodes tend to come in pairs thus making it possible to
1144 predict the second code when the first is run. For example,
Serhiy Storchakada9c5132016-06-27 18:58:57 +03001145 COMPARE_OP is often followed by POP_JUMP_IF_FALSE or POP_JUMP_IF_TRUE.
Raymond Hettingerf606f872003-03-16 03:11:04 +00001146
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001147 Verifying the prediction costs a single high-speed test of a register
1148 variable against a constant. If the pairing was good, then the
1149 processor's own internal branch predication has a high likelihood of
1150 success, resulting in a nearly zero-overhead transition to the
1151 next opcode. A successful prediction saves a trip through the eval-loop
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001152 including its unpredictable switch-case branch. Combined with the
1153 processor's internal branch prediction, a successful PREDICT has the
1154 effect of making the two opcodes run as if they were a single new opcode
1155 with the bodies combined.
Raymond Hettingerf606f872003-03-16 03:11:04 +00001156
Georg Brandl86b2fb92008-07-16 03:43:04 +00001157 If collecting opcode statistics, your choices are to either keep the
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001158 predictions turned-on and interpret the results as if some opcodes
1159 had been combined or turn-off predictions so that the opcode frequency
1160 counter updates for both opcodes.
Antoine Pitroub52ec782009-01-25 16:34:23 +00001161
1162 Opcode prediction is disabled with threaded code, since the latter allows
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001163 the CPU to record separate branch prediction information for each
1164 opcode.
Antoine Pitroub52ec782009-01-25 16:34:23 +00001165
Raymond Hettingerf606f872003-03-16 03:11:04 +00001166*/
1167
Denis Chernikovbaf29b22020-02-21 12:17:50 +03001168#define PREDICT_ID(op) PRED_##op
1169
Antoine Pitrou042b1282010-08-13 21:15:58 +00001170#if defined(DYNAMIC_EXECUTION_PROFILE) || USE_COMPUTED_GOTOS
Denis Chernikovbaf29b22020-02-21 12:17:50 +03001171#define PREDICT(op) if (0) goto PREDICT_ID(op)
Raymond Hettingera7216982004-02-08 19:59:27 +00001172#else
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001173#define PREDICT(op) \
Denis Chernikovbaf29b22020-02-21 12:17:50 +03001174 do { \
Serhiy Storchakaab874002016-09-11 13:48:15 +03001175 _Py_CODEUNIT word = *next_instr; \
1176 opcode = _Py_OPCODE(word); \
Denis Chernikovbaf29b22020-02-21 12:17:50 +03001177 if (opcode == op) { \
Serhiy Storchakaab874002016-09-11 13:48:15 +03001178 oparg = _Py_OPARG(word); \
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001179 next_instr++; \
Denis Chernikovbaf29b22020-02-21 12:17:50 +03001180 goto PREDICT_ID(op); \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001181 } \
1182 } while(0)
Antoine Pitroub52ec782009-01-25 16:34:23 +00001183#endif
Denis Chernikovbaf29b22020-02-21 12:17:50 +03001184#define PREDICTED(op) PREDICT_ID(op):
Antoine Pitroub52ec782009-01-25 16:34:23 +00001185
Raymond Hettingerf606f872003-03-16 03:11:04 +00001186
Guido van Rossum374a9221991-04-04 10:40:29 +00001187/* Stack manipulation macros */
1188
Martin v. Löwis18e16552006-02-15 17:27:45 +00001189/* The stack can grow at most MAXINT deep, as co_nlocals and
1190 co_stacksize are ints. */
Stefan Krahb7e10102010-06-23 18:42:39 +00001191#define STACK_LEVEL() ((int)(stack_pointer - f->f_valuestack))
1192#define EMPTY() (STACK_LEVEL() == 0)
1193#define TOP() (stack_pointer[-1])
1194#define SECOND() (stack_pointer[-2])
1195#define THIRD() (stack_pointer[-3])
1196#define FOURTH() (stack_pointer[-4])
1197#define PEEK(n) (stack_pointer[-(n)])
1198#define SET_TOP(v) (stack_pointer[-1] = (v))
1199#define SET_SECOND(v) (stack_pointer[-2] = (v))
1200#define SET_THIRD(v) (stack_pointer[-3] = (v))
1201#define SET_FOURTH(v) (stack_pointer[-4] = (v))
Stefan Krahb7e10102010-06-23 18:42:39 +00001202#define BASIC_STACKADJ(n) (stack_pointer += n)
1203#define BASIC_PUSH(v) (*stack_pointer++ = (v))
1204#define BASIC_POP() (*--stack_pointer)
Guido van Rossum374a9221991-04-04 10:40:29 +00001205
Guido van Rossum96a42c81992-01-12 02:29:51 +00001206#ifdef LLTRACE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001207#define PUSH(v) { (void)(BASIC_PUSH(v), \
Victor Stinner438a12d2019-05-24 17:01:38 +02001208 lltrace && prtrace(tstate, TOP(), "push")); \
Stefan Krahb7e10102010-06-23 18:42:39 +00001209 assert(STACK_LEVEL() <= co->co_stacksize); }
Victor Stinner438a12d2019-05-24 17:01:38 +02001210#define POP() ((void)(lltrace && prtrace(tstate, TOP(), "pop")), \
Stefan Krahb7e10102010-06-23 18:42:39 +00001211 BASIC_POP())
costypetrisor8ed317f2018-07-31 20:55:14 +00001212#define STACK_GROW(n) do { \
1213 assert(n >= 0); \
1214 (void)(BASIC_STACKADJ(n), \
Victor Stinner438a12d2019-05-24 17:01:38 +02001215 lltrace && prtrace(tstate, TOP(), "stackadj")); \
costypetrisor8ed317f2018-07-31 20:55:14 +00001216 assert(STACK_LEVEL() <= co->co_stacksize); \
1217 } while (0)
1218#define STACK_SHRINK(n) do { \
1219 assert(n >= 0); \
Victor Stinner438a12d2019-05-24 17:01:38 +02001220 (void)(lltrace && prtrace(tstate, TOP(), "stackadj")); \
costypetrisor8ed317f2018-07-31 20:55:14 +00001221 (void)(BASIC_STACKADJ(-n)); \
1222 assert(STACK_LEVEL() <= co->co_stacksize); \
1223 } while (0)
Christian Heimes0449f632007-12-15 01:27:15 +00001224#define EXT_POP(STACK_POINTER) ((void)(lltrace && \
Victor Stinner438a12d2019-05-24 17:01:38 +02001225 prtrace(tstate, (STACK_POINTER)[-1], "ext_pop")), \
Stefan Krahb7e10102010-06-23 18:42:39 +00001226 *--(STACK_POINTER))
Guido van Rossum374a9221991-04-04 10:40:29 +00001227#else
Stefan Krahb7e10102010-06-23 18:42:39 +00001228#define PUSH(v) BASIC_PUSH(v)
1229#define POP() BASIC_POP()
costypetrisor8ed317f2018-07-31 20:55:14 +00001230#define STACK_GROW(n) BASIC_STACKADJ(n)
1231#define STACK_SHRINK(n) BASIC_STACKADJ(-n)
Guido van Rossumc2e20742006-02-27 22:32:47 +00001232#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
Guido van Rossum374a9221991-04-04 10:40:29 +00001233#endif
1234
Guido van Rossum681d79a1995-07-18 14:51:37 +00001235/* Local variable macros */
1236
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001237#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumcfbf1a32002-03-28 20:17:52 +00001238
1239/* The SETLOCAL() macro must not DECREF the local variable in-place and
1240 then store the new value; it must copy the old value to a temporary
1241 value, then store the new value, and then DECREF the temporary value.
1242 This is because it is possible that during the DECREF the frame is
1243 accessed by other code (e.g. a __del__ method or gc.collect()) and the
1244 variable would be pointing to already-freed memory. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001245#define SETLOCAL(i, value) do { PyObject *tmp = GETLOCAL(i); \
Stefan Krahb7e10102010-06-23 18:42:39 +00001246 GETLOCAL(i) = value; \
1247 Py_XDECREF(tmp); } while (0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00001248
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001249
1250#define UNWIND_BLOCK(b) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001251 while (STACK_LEVEL() > (b)->b_level) { \
1252 PyObject *v = POP(); \
1253 Py_XDECREF(v); \
1254 }
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001255
1256#define UNWIND_EXCEPT_HANDLER(b) \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001257 do { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001258 PyObject *type, *value, *traceback; \
Mark Shannonae3087c2017-10-22 22:41:51 +01001259 _PyErr_StackItem *exc_info; \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001260 assert(STACK_LEVEL() >= (b)->b_level + 3); \
1261 while (STACK_LEVEL() > (b)->b_level + 3) { \
1262 value = POP(); \
1263 Py_XDECREF(value); \
1264 } \
Mark Shannonae3087c2017-10-22 22:41:51 +01001265 exc_info = tstate->exc_info; \
1266 type = exc_info->exc_type; \
1267 value = exc_info->exc_value; \
1268 traceback = exc_info->exc_traceback; \
1269 exc_info->exc_type = POP(); \
1270 exc_info->exc_value = POP(); \
1271 exc_info->exc_traceback = POP(); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001272 Py_XDECREF(type); \
1273 Py_XDECREF(value); \
1274 Py_XDECREF(traceback); \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001275 } while(0)
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001276
Inada Naoki91234a12019-06-03 21:30:58 +09001277 /* macros for opcode cache */
1278#define OPCACHE_CHECK() \
1279 do { \
1280 co_opcache = NULL; \
1281 if (co->co_opcache != NULL) { \
Pablo Galindo109826c2020-10-20 06:22:44 +01001282 unsigned char co_opcache_offset = \
Inada Naoki91234a12019-06-03 21:30:58 +09001283 co->co_opcache_map[next_instr - first_instr]; \
Pablo Galindo109826c2020-10-20 06:22:44 +01001284 if (co_opcache_offset > 0) { \
1285 assert(co_opcache_offset <= co->co_opcache_size); \
1286 co_opcache = &co->co_opcache[co_opcache_offset - 1]; \
Inada Naoki91234a12019-06-03 21:30:58 +09001287 assert(co_opcache != NULL); \
Inada Naoki91234a12019-06-03 21:30:58 +09001288 } \
1289 } \
1290 } while (0)
1291
Pablo Galindo109826c2020-10-20 06:22:44 +01001292#define OPCACHE_DEOPT() \
1293 do { \
1294 if (co_opcache != NULL) { \
1295 co_opcache->optimized = -1; \
1296 unsigned char co_opcache_offset = \
1297 co->co_opcache_map[next_instr - first_instr]; \
1298 assert(co_opcache_offset <= co->co_opcache_size); \
1299 co->co_opcache_map[co_opcache_offset] = 0; \
1300 co_opcache = NULL; \
1301 } \
1302 } while (0)
1303
1304#define OPCACHE_DEOPT_LOAD_ATTR() \
1305 do { \
1306 if (co_opcache != NULL) { \
1307 OPCACHE_STAT_ATTR_DEOPT(); \
1308 OPCACHE_DEOPT(); \
1309 } \
1310 } while (0)
1311
1312#define OPCACHE_MAYBE_DEOPT_LOAD_ATTR() \
1313 do { \
1314 if (co_opcache != NULL && --co_opcache->optimized <= 0) { \
1315 OPCACHE_DEOPT_LOAD_ATTR(); \
1316 } \
1317 } while (0)
1318
Inada Naoki91234a12019-06-03 21:30:58 +09001319#if OPCACHE_STATS
1320
1321#define OPCACHE_STAT_GLOBAL_HIT() \
1322 do { \
1323 if (co->co_opcache != NULL) opcache_global_hits++; \
1324 } while (0)
1325
1326#define OPCACHE_STAT_GLOBAL_MISS() \
1327 do { \
1328 if (co->co_opcache != NULL) opcache_global_misses++; \
1329 } while (0)
1330
1331#define OPCACHE_STAT_GLOBAL_OPT() \
1332 do { \
1333 if (co->co_opcache != NULL) opcache_global_opts++; \
1334 } while (0)
1335
Pablo Galindo109826c2020-10-20 06:22:44 +01001336#define OPCACHE_STAT_ATTR_HIT() \
1337 do { \
1338 if (co->co_opcache != NULL) opcache_attr_hits++; \
1339 } while (0)
1340
1341#define OPCACHE_STAT_ATTR_MISS() \
1342 do { \
1343 if (co->co_opcache != NULL) opcache_attr_misses++; \
1344 } while (0)
1345
1346#define OPCACHE_STAT_ATTR_OPT() \
1347 do { \
1348 if (co->co_opcache!= NULL) opcache_attr_opts++; \
1349 } while (0)
1350
1351#define OPCACHE_STAT_ATTR_DEOPT() \
1352 do { \
1353 if (co->co_opcache != NULL) opcache_attr_deopts++; \
1354 } while (0)
1355
1356#define OPCACHE_STAT_ATTR_TOTAL() \
1357 do { \
1358 if (co->co_opcache != NULL) opcache_attr_total++; \
1359 } while (0)
1360
Inada Naoki91234a12019-06-03 21:30:58 +09001361#else /* OPCACHE_STATS */
1362
1363#define OPCACHE_STAT_GLOBAL_HIT()
1364#define OPCACHE_STAT_GLOBAL_MISS()
1365#define OPCACHE_STAT_GLOBAL_OPT()
1366
Pablo Galindo109826c2020-10-20 06:22:44 +01001367#define OPCACHE_STAT_ATTR_HIT()
1368#define OPCACHE_STAT_ATTR_MISS()
1369#define OPCACHE_STAT_ATTR_OPT()
1370#define OPCACHE_STAT_ATTR_DEOPT()
1371#define OPCACHE_STAT_ATTR_TOTAL()
1372
Inada Naoki91234a12019-06-03 21:30:58 +09001373#endif
1374
Guido van Rossuma027efa1997-05-05 20:56:21 +00001375/* Start of code */
1376
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001377 /* push frame */
Victor Stinnerbe434dc2019-11-05 00:51:22 +01001378 if (_Py_EnterRecursiveCall(tstate, "")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001379 return NULL;
Victor Stinnerbe434dc2019-11-05 00:51:22 +01001380 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001381
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001382 tstate->frame = f;
Tim Peters5ca576e2001-06-18 22:08:13 +00001383
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001384 if (tstate->use_tracing) {
1385 if (tstate->c_tracefunc != NULL) {
1386 /* tstate->c_tracefunc, if defined, is a
1387 function that will be called on *every* entry
1388 to a code block. Its return value, if not
1389 None, is a function that will be called at
1390 the start of each executed line of code.
1391 (Actually, the function must return itself
1392 in order to continue tracing.) The trace
1393 functions are called with three arguments:
1394 a pointer to the current frame, a string
1395 indicating why the function is called, and
1396 an argument which depends on the situation.
1397 The global trace function is also called
1398 whenever an exception is detected. */
1399 if (call_trace_protected(tstate->c_tracefunc,
1400 tstate->c_traceobj,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01001401 tstate, f, PyTrace_CALL, Py_None)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001402 /* Trace function raised an error */
1403 goto exit_eval_frame;
1404 }
1405 }
1406 if (tstate->c_profilefunc != NULL) {
1407 /* Similar for c_profilefunc, except it needn't
1408 return itself and isn't called for "line" events */
1409 if (call_trace_protected(tstate->c_profilefunc,
1410 tstate->c_profileobj,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01001411 tstate, f, PyTrace_CALL, Py_None)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001412 /* Profile function raised an error */
1413 goto exit_eval_frame;
1414 }
1415 }
1416 }
Neil Schemenauer6c0f2002001-09-04 19:03:35 +00001417
Łukasz Langaa785c872016-09-09 17:37:37 -07001418 if (PyDTrace_FUNCTION_ENTRY_ENABLED())
1419 dtrace_function_entry(f);
1420
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001421 co = f->f_code;
Mark Shannon877df852020-11-12 09:43:29 +00001422 PyCodeAddressRange bounds;
1423 _PyCode_InitAddressRange(co, &bounds);
1424 int instr_prev = -1;
1425
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001426 names = co->co_names;
1427 consts = co->co_consts;
1428 fastlocals = f->f_localsplus;
1429 freevars = f->f_localsplus + co->co_nlocals;
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001430 assert(PyBytes_Check(co->co_code));
1431 assert(PyBytes_GET_SIZE(co->co_code) <= INT_MAX);
Serhiy Storchakaab874002016-09-11 13:48:15 +03001432 assert(PyBytes_GET_SIZE(co->co_code) % sizeof(_Py_CODEUNIT) == 0);
1433 assert(_Py_IS_ALIGNED(PyBytes_AS_STRING(co->co_code), sizeof(_Py_CODEUNIT)));
1434 first_instr = (_Py_CODEUNIT *) PyBytes_AS_STRING(co->co_code);
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001435 /*
1436 f->f_lasti refers to the index of the last instruction,
1437 unless it's -1 in which case next_instr should be first_instr.
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001438
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001439 YIELD_FROM sets f_lasti to itself, in order to repeatedly yield
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05001440 multiple values.
Thomas Wouters902d6eb2007-01-09 23:18:33 +00001441
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001442 When the PREDICT() macros are enabled, some opcode pairs follow in
1443 direct succession without updating f->f_lasti. A successful
1444 prediction effectively links the two codes together as if they
1445 were a single new opcode; accordingly,f->f_lasti will point to
1446 the first code in the pair (for instance, GET_ITER followed by
1447 FOR_ITER is effectively a single opcode and f->f_lasti will point
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001448 to the beginning of the combined pair.)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001449 */
Serhiy Storchakaab874002016-09-11 13:48:15 +03001450 assert(f->f_lasti >= -1);
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001451 next_instr = first_instr;
1452 if (f->f_lasti >= 0) {
Serhiy Storchakaab874002016-09-11 13:48:15 +03001453 assert(f->f_lasti % sizeof(_Py_CODEUNIT) == 0);
1454 next_instr += f->f_lasti / sizeof(_Py_CODEUNIT) + 1;
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001455 }
Mark Shannoncb9879b2020-07-17 11:44:23 +01001456 stack_pointer = f->f_valuestack + f->f_stackdepth;
1457 /* Set f->f_stackdepth to -1.
1458 * Update when returning or calling trace function.
1459 Having f_stackdepth <= 0 ensures that invalid
1460 values are not visible to the cycle GC.
1461 We choose -1 rather than 0 to assist debugging.
1462 */
1463 f->f_stackdepth = -1;
1464 f->f_state = FRAME_EXECUTING;
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001465
Inada Naoki91234a12019-06-03 21:30:58 +09001466 if (co->co_opcache_flag < OPCACHE_MIN_RUNS) {
1467 co->co_opcache_flag++;
1468 if (co->co_opcache_flag == OPCACHE_MIN_RUNS) {
1469 if (_PyCode_InitOpcache(co) < 0) {
Victor Stinner25104942020-04-24 02:43:18 +02001470 goto exit_eval_frame;
Inada Naoki91234a12019-06-03 21:30:58 +09001471 }
1472#if OPCACHE_STATS
1473 opcache_code_objects_extra_mem +=
1474 PyBytes_Size(co->co_code) / sizeof(_Py_CODEUNIT) +
1475 sizeof(_PyOpcache) * co->co_opcache_size;
1476 opcache_code_objects++;
1477#endif
1478 }
1479 }
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001480
Tim Peters5ca576e2001-06-18 22:08:13 +00001481#ifdef LLTRACE
Serhiy Storchakafb5db7e2020-10-26 08:43:39 +02001482 {
1483 int r = _PyDict_ContainsId(f->f_globals, &PyId___ltrace__);
1484 if (r < 0) {
1485 goto exit_eval_frame;
1486 }
1487 lltrace = r;
1488 }
Tim Peters5ca576e2001-06-18 22:08:13 +00001489#endif
Guido van Rossumac7be682001-01-17 15:42:30 +00001490
Serhiy Storchakafb5db7e2020-10-26 08:43:39 +02001491 if (throwflag) { /* support for generator.throw() */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001492 goto error;
Serhiy Storchakafb5db7e2020-10-26 08:43:39 +02001493 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001494
Victor Stinnerace47d72013-07-18 01:41:08 +02001495#ifdef Py_DEBUG
Victor Stinner0b72b232020-03-12 23:18:39 +01001496 /* _PyEval_EvalFrameDefault() must not be called with an exception set,
Victor Stinnera8cb5152017-01-18 14:12:51 +01001497 because it can clear it (directly or indirectly) and so the
Martin Panter9955a372015-10-07 10:26:23 +00001498 caller loses its exception */
Victor Stinner438a12d2019-05-24 17:01:38 +02001499 assert(!_PyErr_Occurred(tstate));
Victor Stinnerace47d72013-07-18 01:41:08 +02001500#endif
1501
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001502main_loop:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001503 for (;;) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001504 assert(stack_pointer >= f->f_valuestack); /* else underflow */
1505 assert(STACK_LEVEL() <= co->co_stacksize); /* else overflow */
Victor Stinner438a12d2019-05-24 17:01:38 +02001506 assert(!_PyErr_Occurred(tstate));
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001507
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001508 /* Do periodic things. Doing this every time through
1509 the loop would add too much overhead, so we do it
1510 only every Nth instruction. We also do it if
Chris Jerdonek4a12d122020-05-14 19:25:45 -07001511 ``pending.calls_to_do'' is set, i.e. when an asynchronous
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001512 event needs attention (e.g. a signal handler or
1513 async I/O handler); see Py_AddPendingCall() and
1514 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +00001515
Eric Snow7bda9de2019-03-08 17:25:54 -07001516 if (_Py_atomic_load_relaxed(eval_breaker)) {
Serhiy Storchaka3f4d90d2018-07-09 15:40:14 +03001517 opcode = _Py_OPCODE(*next_instr);
1518 if (opcode == SETUP_FINALLY ||
1519 opcode == SETUP_WITH ||
1520 opcode == BEFORE_ASYNC_WITH ||
1521 opcode == YIELD_FROM) {
1522 /* Few cases where we skip running signal handlers and other
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07001523 pending calls:
Serhiy Storchaka3f4d90d2018-07-09 15:40:14 +03001524 - If we're about to enter the 'with:'. It will prevent
1525 emitting a resource warning in the common idiom
1526 'with open(path) as file:'.
1527 - If we're about to enter the 'async with:'.
1528 - If we're about to enter the 'try:' of a try/finally (not
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07001529 *very* useful, but might help in some cases and it's
1530 traditional)
1531 - If we're resuming a chain of nested 'yield from' or
1532 'await' calls, then each frame is parked with YIELD_FROM
1533 as its next opcode. If the user hit control-C we want to
1534 wait until we've reached the innermost frame before
1535 running the signal handler and raising KeyboardInterrupt
1536 (see bpo-30039).
1537 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001538 goto fast_next_opcode;
1539 }
Eric Snowfdf282d2019-01-11 14:26:55 -07001540
Victor Stinnerda2914d2020-03-20 09:29:08 +01001541 if (eval_frame_handle_pending(tstate) != 0) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001542 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001543 }
1544 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001545
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001546 fast_next_opcode:
1547 f->f_lasti = INSTR_OFFSET();
Guido van Rossumac7be682001-01-17 15:42:30 +00001548
Łukasz Langaa785c872016-09-09 17:37:37 -07001549 if (PyDTrace_LINE_ENABLED())
Mark Shannon877df852020-11-12 09:43:29 +00001550 maybe_dtrace_line(f, &bounds, &instr_prev);
Łukasz Langaa785c872016-09-09 17:37:37 -07001551
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001552 /* line-by-line tracing support */
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001553
Victor Stinnerdab84232020-03-17 18:56:44 +01001554 if (_Py_TracingPossible(ceval2) &&
Benjamin Peterson51f46162013-01-23 08:38:47 -05001555 tstate->c_tracefunc != NULL && !tstate->tracing) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001556 int err;
Victor Stinnerb7d8d8d2020-09-23 14:07:16 +02001557 /* see maybe_call_line_trace()
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001558 for expository comments */
Victor Stinnerb7d8d8d2020-09-23 14:07:16 +02001559 f->f_stackdepth = (int)(stack_pointer - f->f_valuestack);
Tim Peters8a5c3c72004-04-05 19:36:21 +00001560
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001561 err = maybe_call_line_trace(tstate->c_tracefunc,
1562 tstate->c_traceobj,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01001563 tstate, f,
Mark Shannon877df852020-11-12 09:43:29 +00001564 &bounds, &instr_prev);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001565 /* Reload possibly changed frame fields */
1566 JUMPTO(f->f_lasti);
Mark Shannoncb9879b2020-07-17 11:44:23 +01001567 stack_pointer = f->f_valuestack+f->f_stackdepth;
1568 f->f_stackdepth = -1;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001569 if (err)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001570 /* trace function raised an exception */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001571 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001572 }
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001573
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001574 /* Extract opcode and argument */
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001575
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001576 NEXTOPARG();
Stefan Krahb7e10102010-06-23 18:42:39 +00001577 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +00001578#ifdef DYNAMIC_EXECUTION_PROFILE
1579#ifdef DXPAIRS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001580 dxpairs[lastopcode][opcode]++;
1581 lastopcode = opcode;
Guido van Rossum950361c1997-01-24 13:49:28 +00001582#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001583 dxp[opcode]++;
Guido van Rossum950361c1997-01-24 13:49:28 +00001584#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001585
Guido van Rossum96a42c81992-01-12 02:29:51 +00001586#ifdef LLTRACE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001587 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +00001588
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001589 if (lltrace) {
1590 if (HAS_ARG(opcode)) {
1591 printf("%d: %d, %d\n",
1592 f->f_lasti, opcode, oparg);
1593 }
1594 else {
1595 printf("%d: %d\n",
1596 f->f_lasti, opcode);
1597 }
1598 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001599#endif
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001600
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001601 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +00001602
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001603 /* BEWARE!
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001604 It is essential that any operation that fails must goto error
1605 and that all operation that succeed call [FAST_]DISPATCH() ! */
Guido van Rossumac7be682001-01-17 15:42:30 +00001606
Benjamin Petersonddd19492018-09-16 22:38:02 -07001607 case TARGET(NOP): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001608 FAST_DISPATCH();
Benjamin Petersonddd19492018-09-16 22:38:02 -07001609 }
Raymond Hettinger9c18e812004-06-21 16:31:15 +00001610
Benjamin Petersonddd19492018-09-16 22:38:02 -07001611 case TARGET(LOAD_FAST): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001612 PyObject *value = GETLOCAL(oparg);
1613 if (value == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02001614 format_exc_check_arg(tstate, PyExc_UnboundLocalError,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001615 UNBOUNDLOCAL_ERROR_MSG,
1616 PyTuple_GetItem(co->co_varnames, oparg));
1617 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001618 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001619 Py_INCREF(value);
1620 PUSH(value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001621 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001622 }
1623
Benjamin Petersonddd19492018-09-16 22:38:02 -07001624 case TARGET(LOAD_CONST): {
1625 PREDICTED(LOAD_CONST);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001626 PyObject *value = GETITEM(consts, oparg);
1627 Py_INCREF(value);
1628 PUSH(value);
1629 FAST_DISPATCH();
1630 }
Neil Schemenauer63543862002-02-17 19:10:14 +00001631
Benjamin Petersonddd19492018-09-16 22:38:02 -07001632 case TARGET(STORE_FAST): {
1633 PREDICTED(STORE_FAST);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001634 PyObject *value = POP();
1635 SETLOCAL(oparg, value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001636 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001637 }
Neil Schemenauer63543862002-02-17 19:10:14 +00001638
Benjamin Petersonddd19492018-09-16 22:38:02 -07001639 case TARGET(POP_TOP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001640 PyObject *value = POP();
1641 Py_DECREF(value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001642 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001643 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001644
Benjamin Petersonddd19492018-09-16 22:38:02 -07001645 case TARGET(ROT_TWO): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001646 PyObject *top = TOP();
1647 PyObject *second = SECOND();
1648 SET_TOP(second);
1649 SET_SECOND(top);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001650 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001651 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001652
Benjamin Petersonddd19492018-09-16 22:38:02 -07001653 case TARGET(ROT_THREE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001654 PyObject *top = TOP();
1655 PyObject *second = SECOND();
1656 PyObject *third = THIRD();
1657 SET_TOP(second);
1658 SET_SECOND(third);
1659 SET_THIRD(top);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001660 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001661 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001662
Benjamin Petersonddd19492018-09-16 22:38:02 -07001663 case TARGET(ROT_FOUR): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001664 PyObject *top = TOP();
1665 PyObject *second = SECOND();
1666 PyObject *third = THIRD();
1667 PyObject *fourth = FOURTH();
1668 SET_TOP(second);
1669 SET_SECOND(third);
1670 SET_THIRD(fourth);
1671 SET_FOURTH(top);
1672 FAST_DISPATCH();
1673 }
1674
Benjamin Petersonddd19492018-09-16 22:38:02 -07001675 case TARGET(DUP_TOP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001676 PyObject *top = TOP();
1677 Py_INCREF(top);
1678 PUSH(top);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001679 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001680 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001681
Benjamin Petersonddd19492018-09-16 22:38:02 -07001682 case TARGET(DUP_TOP_TWO): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001683 PyObject *top = TOP();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001684 PyObject *second = SECOND();
Benjamin Petersonf208df32012-10-12 11:37:56 -04001685 Py_INCREF(top);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001686 Py_INCREF(second);
costypetrisor8ed317f2018-07-31 20:55:14 +00001687 STACK_GROW(2);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001688 SET_TOP(top);
1689 SET_SECOND(second);
Antoine Pitrou74a69fa2010-09-04 18:43:52 +00001690 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001691 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001692
Benjamin Petersonddd19492018-09-16 22:38:02 -07001693 case TARGET(UNARY_POSITIVE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001694 PyObject *value = TOP();
1695 PyObject *res = PyNumber_Positive(value);
1696 Py_DECREF(value);
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(UNARY_NEGATIVE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001704 PyObject *value = TOP();
1705 PyObject *res = PyNumber_Negative(value);
1706 Py_DECREF(value);
1707 SET_TOP(res);
1708 if (res == NULL)
1709 goto error;
1710 DISPATCH();
1711 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001712
Benjamin Petersonddd19492018-09-16 22:38:02 -07001713 case TARGET(UNARY_NOT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001714 PyObject *value = TOP();
1715 int err = PyObject_IsTrue(value);
1716 Py_DECREF(value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001717 if (err == 0) {
1718 Py_INCREF(Py_True);
1719 SET_TOP(Py_True);
1720 DISPATCH();
1721 }
1722 else if (err > 0) {
1723 Py_INCREF(Py_False);
1724 SET_TOP(Py_False);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001725 DISPATCH();
1726 }
costypetrisor8ed317f2018-07-31 20:55:14 +00001727 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001728 goto error;
1729 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001730
Benjamin Petersonddd19492018-09-16 22:38:02 -07001731 case TARGET(UNARY_INVERT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001732 PyObject *value = TOP();
1733 PyObject *res = PyNumber_Invert(value);
1734 Py_DECREF(value);
1735 SET_TOP(res);
1736 if (res == NULL)
1737 goto error;
1738 DISPATCH();
1739 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001740
Benjamin Petersonddd19492018-09-16 22:38:02 -07001741 case TARGET(BINARY_POWER): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001742 PyObject *exp = POP();
1743 PyObject *base = TOP();
1744 PyObject *res = PyNumber_Power(base, exp, Py_None);
1745 Py_DECREF(base);
1746 Py_DECREF(exp);
1747 SET_TOP(res);
1748 if (res == NULL)
1749 goto error;
1750 DISPATCH();
1751 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001752
Benjamin Petersonddd19492018-09-16 22:38:02 -07001753 case TARGET(BINARY_MULTIPLY): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001754 PyObject *right = POP();
1755 PyObject *left = TOP();
1756 PyObject *res = PyNumber_Multiply(left, right);
1757 Py_DECREF(left);
1758 Py_DECREF(right);
1759 SET_TOP(res);
1760 if (res == NULL)
1761 goto error;
1762 DISPATCH();
1763 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001764
Benjamin Petersonddd19492018-09-16 22:38:02 -07001765 case TARGET(BINARY_MATRIX_MULTIPLY): {
Benjamin Petersond51374e2014-04-09 23:55:56 -04001766 PyObject *right = POP();
1767 PyObject *left = TOP();
1768 PyObject *res = PyNumber_MatrixMultiply(left, right);
1769 Py_DECREF(left);
1770 Py_DECREF(right);
1771 SET_TOP(res);
1772 if (res == NULL)
1773 goto error;
1774 DISPATCH();
1775 }
1776
Benjamin Petersonddd19492018-09-16 22:38:02 -07001777 case TARGET(BINARY_TRUE_DIVIDE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001778 PyObject *divisor = POP();
1779 PyObject *dividend = TOP();
1780 PyObject *quotient = PyNumber_TrueDivide(dividend, divisor);
1781 Py_DECREF(dividend);
1782 Py_DECREF(divisor);
1783 SET_TOP(quotient);
1784 if (quotient == NULL)
1785 goto error;
1786 DISPATCH();
1787 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001788
Benjamin Petersonddd19492018-09-16 22:38:02 -07001789 case TARGET(BINARY_FLOOR_DIVIDE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001790 PyObject *divisor = POP();
1791 PyObject *dividend = TOP();
1792 PyObject *quotient = PyNumber_FloorDivide(dividend, divisor);
1793 Py_DECREF(dividend);
1794 Py_DECREF(divisor);
1795 SET_TOP(quotient);
1796 if (quotient == NULL)
1797 goto error;
1798 DISPATCH();
1799 }
Guido van Rossum4668b002001-08-08 05:00:18 +00001800
Benjamin Petersonddd19492018-09-16 22:38:02 -07001801 case TARGET(BINARY_MODULO): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001802 PyObject *divisor = POP();
1803 PyObject *dividend = TOP();
Martijn Pietersd7e64332017-02-23 13:38:04 +00001804 PyObject *res;
1805 if (PyUnicode_CheckExact(dividend) && (
1806 !PyUnicode_Check(divisor) || PyUnicode_CheckExact(divisor))) {
1807 // fast path; string formatting, but not if the RHS is a str subclass
1808 // (see issue28598)
1809 res = PyUnicode_Format(dividend, divisor);
1810 } else {
1811 res = PyNumber_Remainder(dividend, divisor);
1812 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001813 Py_DECREF(divisor);
1814 Py_DECREF(dividend);
1815 SET_TOP(res);
1816 if (res == NULL)
1817 goto error;
1818 DISPATCH();
1819 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001820
Benjamin Petersonddd19492018-09-16 22:38:02 -07001821 case TARGET(BINARY_ADD): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001822 PyObject *right = POP();
1823 PyObject *left = TOP();
1824 PyObject *sum;
Victor Stinnerbd0a08e2020-10-01 18:57:37 +02001825 /* NOTE(vstinner): Please don't try to micro-optimize int+int on
Victor Stinnerd65f42a2016-10-20 12:18:10 +02001826 CPython using bytecode, it is simply worthless.
1827 See http://bugs.python.org/issue21955 and
1828 http://bugs.python.org/issue10044 for the discussion. In short,
1829 no patch shown any impact on a realistic benchmark, only a minor
1830 speedup on microbenchmarks. */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001831 if (PyUnicode_CheckExact(left) &&
1832 PyUnicode_CheckExact(right)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02001833 sum = unicode_concatenate(tstate, left, right, f, next_instr);
Martin Panter95f53c12016-07-18 08:23:26 +00001834 /* unicode_concatenate consumed the ref to left */
Victor Stinnerd2a915d2011-10-02 20:34:20 +02001835 }
1836 else {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001837 sum = PyNumber_Add(left, right);
1838 Py_DECREF(left);
Victor Stinnerd2a915d2011-10-02 20:34:20 +02001839 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001840 Py_DECREF(right);
1841 SET_TOP(sum);
1842 if (sum == NULL)
1843 goto error;
1844 DISPATCH();
1845 }
1846
Benjamin Petersonddd19492018-09-16 22:38:02 -07001847 case TARGET(BINARY_SUBTRACT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001848 PyObject *right = POP();
1849 PyObject *left = TOP();
1850 PyObject *diff = PyNumber_Subtract(left, right);
1851 Py_DECREF(right);
1852 Py_DECREF(left);
1853 SET_TOP(diff);
1854 if (diff == NULL)
1855 goto error;
1856 DISPATCH();
1857 }
1858
Benjamin Petersonddd19492018-09-16 22:38:02 -07001859 case TARGET(BINARY_SUBSCR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001860 PyObject *sub = POP();
1861 PyObject *container = TOP();
1862 PyObject *res = PyObject_GetItem(container, sub);
1863 Py_DECREF(container);
1864 Py_DECREF(sub);
1865 SET_TOP(res);
1866 if (res == NULL)
1867 goto error;
1868 DISPATCH();
1869 }
1870
Benjamin Petersonddd19492018-09-16 22:38:02 -07001871 case TARGET(BINARY_LSHIFT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001872 PyObject *right = POP();
1873 PyObject *left = TOP();
1874 PyObject *res = PyNumber_Lshift(left, right);
1875 Py_DECREF(left);
1876 Py_DECREF(right);
1877 SET_TOP(res);
1878 if (res == NULL)
1879 goto error;
1880 DISPATCH();
1881 }
1882
Benjamin Petersonddd19492018-09-16 22:38:02 -07001883 case TARGET(BINARY_RSHIFT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001884 PyObject *right = POP();
1885 PyObject *left = TOP();
1886 PyObject *res = PyNumber_Rshift(left, right);
1887 Py_DECREF(left);
1888 Py_DECREF(right);
1889 SET_TOP(res);
1890 if (res == NULL)
1891 goto error;
1892 DISPATCH();
1893 }
1894
Benjamin Petersonddd19492018-09-16 22:38:02 -07001895 case TARGET(BINARY_AND): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001896 PyObject *right = POP();
1897 PyObject *left = TOP();
1898 PyObject *res = PyNumber_And(left, right);
1899 Py_DECREF(left);
1900 Py_DECREF(right);
1901 SET_TOP(res);
1902 if (res == NULL)
1903 goto error;
1904 DISPATCH();
1905 }
1906
Benjamin Petersonddd19492018-09-16 22:38:02 -07001907 case TARGET(BINARY_XOR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001908 PyObject *right = POP();
1909 PyObject *left = TOP();
1910 PyObject *res = PyNumber_Xor(left, right);
1911 Py_DECREF(left);
1912 Py_DECREF(right);
1913 SET_TOP(res);
1914 if (res == NULL)
1915 goto error;
1916 DISPATCH();
1917 }
1918
Benjamin Petersonddd19492018-09-16 22:38:02 -07001919 case TARGET(BINARY_OR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001920 PyObject *right = POP();
1921 PyObject *left = TOP();
1922 PyObject *res = PyNumber_Or(left, right);
1923 Py_DECREF(left);
1924 Py_DECREF(right);
1925 SET_TOP(res);
1926 if (res == NULL)
1927 goto error;
1928 DISPATCH();
1929 }
1930
Benjamin Petersonddd19492018-09-16 22:38:02 -07001931 case TARGET(LIST_APPEND): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001932 PyObject *v = POP();
1933 PyObject *list = PEEK(oparg);
1934 int err;
1935 err = PyList_Append(list, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001936 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001937 if (err != 0)
1938 goto error;
1939 PREDICT(JUMP_ABSOLUTE);
1940 DISPATCH();
1941 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001942
Benjamin Petersonddd19492018-09-16 22:38:02 -07001943 case TARGET(SET_ADD): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001944 PyObject *v = POP();
Raymond Hettinger41862222016-10-15 19:03:06 -07001945 PyObject *set = PEEK(oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001946 int err;
1947 err = PySet_Add(set, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001948 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001949 if (err != 0)
1950 goto error;
1951 PREDICT(JUMP_ABSOLUTE);
1952 DISPATCH();
1953 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001954
Benjamin Petersonddd19492018-09-16 22:38:02 -07001955 case TARGET(INPLACE_POWER): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001956 PyObject *exp = POP();
1957 PyObject *base = TOP();
1958 PyObject *res = PyNumber_InPlacePower(base, exp, Py_None);
1959 Py_DECREF(base);
1960 Py_DECREF(exp);
1961 SET_TOP(res);
1962 if (res == NULL)
1963 goto error;
1964 DISPATCH();
1965 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001966
Benjamin Petersonddd19492018-09-16 22:38:02 -07001967 case TARGET(INPLACE_MULTIPLY): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001968 PyObject *right = POP();
1969 PyObject *left = TOP();
1970 PyObject *res = PyNumber_InPlaceMultiply(left, right);
1971 Py_DECREF(left);
1972 Py_DECREF(right);
1973 SET_TOP(res);
1974 if (res == NULL)
1975 goto error;
1976 DISPATCH();
1977 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001978
Benjamin Petersonddd19492018-09-16 22:38:02 -07001979 case TARGET(INPLACE_MATRIX_MULTIPLY): {
Benjamin Petersond51374e2014-04-09 23:55:56 -04001980 PyObject *right = POP();
1981 PyObject *left = TOP();
1982 PyObject *res = PyNumber_InPlaceMatrixMultiply(left, right);
1983 Py_DECREF(left);
1984 Py_DECREF(right);
1985 SET_TOP(res);
1986 if (res == NULL)
1987 goto error;
1988 DISPATCH();
1989 }
1990
Benjamin Petersonddd19492018-09-16 22:38:02 -07001991 case TARGET(INPLACE_TRUE_DIVIDE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001992 PyObject *divisor = POP();
1993 PyObject *dividend = TOP();
1994 PyObject *quotient = PyNumber_InPlaceTrueDivide(dividend, divisor);
1995 Py_DECREF(dividend);
1996 Py_DECREF(divisor);
1997 SET_TOP(quotient);
1998 if (quotient == NULL)
1999 goto error;
2000 DISPATCH();
2001 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002002
Benjamin Petersonddd19492018-09-16 22:38:02 -07002003 case TARGET(INPLACE_FLOOR_DIVIDE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002004 PyObject *divisor = POP();
2005 PyObject *dividend = TOP();
2006 PyObject *quotient = PyNumber_InPlaceFloorDivide(dividend, divisor);
2007 Py_DECREF(dividend);
2008 Py_DECREF(divisor);
2009 SET_TOP(quotient);
2010 if (quotient == NULL)
2011 goto error;
2012 DISPATCH();
2013 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002014
Benjamin Petersonddd19492018-09-16 22:38:02 -07002015 case TARGET(INPLACE_MODULO): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002016 PyObject *right = POP();
2017 PyObject *left = TOP();
2018 PyObject *mod = PyNumber_InPlaceRemainder(left, right);
2019 Py_DECREF(left);
2020 Py_DECREF(right);
2021 SET_TOP(mod);
2022 if (mod == NULL)
2023 goto error;
2024 DISPATCH();
2025 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002026
Benjamin Petersonddd19492018-09-16 22:38:02 -07002027 case TARGET(INPLACE_ADD): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002028 PyObject *right = POP();
2029 PyObject *left = TOP();
2030 PyObject *sum;
2031 if (PyUnicode_CheckExact(left) && PyUnicode_CheckExact(right)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002032 sum = unicode_concatenate(tstate, left, right, f, next_instr);
Martin Panter95f53c12016-07-18 08:23:26 +00002033 /* unicode_concatenate consumed the ref to left */
Victor Stinnerd2a915d2011-10-02 20:34:20 +02002034 }
2035 else {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002036 sum = PyNumber_InPlaceAdd(left, right);
2037 Py_DECREF(left);
Victor Stinnerd2a915d2011-10-02 20:34:20 +02002038 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002039 Py_DECREF(right);
2040 SET_TOP(sum);
2041 if (sum == NULL)
2042 goto error;
2043 DISPATCH();
2044 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002045
Benjamin Petersonddd19492018-09-16 22:38:02 -07002046 case TARGET(INPLACE_SUBTRACT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002047 PyObject *right = POP();
2048 PyObject *left = TOP();
2049 PyObject *diff = PyNumber_InPlaceSubtract(left, right);
2050 Py_DECREF(left);
2051 Py_DECREF(right);
2052 SET_TOP(diff);
2053 if (diff == NULL)
2054 goto error;
2055 DISPATCH();
2056 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002057
Benjamin Petersonddd19492018-09-16 22:38:02 -07002058 case TARGET(INPLACE_LSHIFT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002059 PyObject *right = POP();
2060 PyObject *left = TOP();
2061 PyObject *res = PyNumber_InPlaceLshift(left, right);
2062 Py_DECREF(left);
2063 Py_DECREF(right);
2064 SET_TOP(res);
2065 if (res == NULL)
2066 goto error;
2067 DISPATCH();
2068 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002069
Benjamin Petersonddd19492018-09-16 22:38:02 -07002070 case TARGET(INPLACE_RSHIFT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002071 PyObject *right = POP();
2072 PyObject *left = TOP();
2073 PyObject *res = PyNumber_InPlaceRshift(left, right);
2074 Py_DECREF(left);
2075 Py_DECREF(right);
2076 SET_TOP(res);
2077 if (res == NULL)
2078 goto error;
2079 DISPATCH();
2080 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002081
Benjamin Petersonddd19492018-09-16 22:38:02 -07002082 case TARGET(INPLACE_AND): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002083 PyObject *right = POP();
2084 PyObject *left = TOP();
2085 PyObject *res = PyNumber_InPlaceAnd(left, right);
2086 Py_DECREF(left);
2087 Py_DECREF(right);
2088 SET_TOP(res);
2089 if (res == NULL)
2090 goto error;
2091 DISPATCH();
2092 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002093
Benjamin Petersonddd19492018-09-16 22:38:02 -07002094 case TARGET(INPLACE_XOR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002095 PyObject *right = POP();
2096 PyObject *left = TOP();
2097 PyObject *res = PyNumber_InPlaceXor(left, right);
2098 Py_DECREF(left);
2099 Py_DECREF(right);
2100 SET_TOP(res);
2101 if (res == NULL)
2102 goto error;
2103 DISPATCH();
2104 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002105
Benjamin Petersonddd19492018-09-16 22:38:02 -07002106 case TARGET(INPLACE_OR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002107 PyObject *right = POP();
2108 PyObject *left = TOP();
2109 PyObject *res = PyNumber_InPlaceOr(left, right);
2110 Py_DECREF(left);
2111 Py_DECREF(right);
2112 SET_TOP(res);
2113 if (res == NULL)
2114 goto error;
2115 DISPATCH();
2116 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002117
Benjamin Petersonddd19492018-09-16 22:38:02 -07002118 case TARGET(STORE_SUBSCR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002119 PyObject *sub = TOP();
2120 PyObject *container = SECOND();
2121 PyObject *v = THIRD();
2122 int err;
costypetrisor8ed317f2018-07-31 20:55:14 +00002123 STACK_SHRINK(3);
Martin Panter95f53c12016-07-18 08:23:26 +00002124 /* container[sub] = v */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002125 err = PyObject_SetItem(container, sub, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002126 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002127 Py_DECREF(container);
2128 Py_DECREF(sub);
2129 if (err != 0)
2130 goto error;
2131 DISPATCH();
2132 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002133
Benjamin Petersonddd19492018-09-16 22:38:02 -07002134 case TARGET(DELETE_SUBSCR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002135 PyObject *sub = TOP();
2136 PyObject *container = SECOND();
2137 int err;
costypetrisor8ed317f2018-07-31 20:55:14 +00002138 STACK_SHRINK(2);
Martin Panter95f53c12016-07-18 08:23:26 +00002139 /* del container[sub] */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002140 err = PyObject_DelItem(container, sub);
2141 Py_DECREF(container);
2142 Py_DECREF(sub);
2143 if (err != 0)
2144 goto error;
2145 DISPATCH();
2146 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00002147
Benjamin Petersonddd19492018-09-16 22:38:02 -07002148 case TARGET(PRINT_EXPR): {
Victor Stinnercab75e32013-11-06 22:38:37 +01002149 _Py_IDENTIFIER(displayhook);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002150 PyObject *value = POP();
Victor Stinnercab75e32013-11-06 22:38:37 +01002151 PyObject *hook = _PySys_GetObjectId(&PyId_displayhook);
Benjamin Petersonfe1bcb62012-10-12 11:40:01 -04002152 PyObject *res;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002153 if (hook == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002154 _PyErr_SetString(tstate, PyExc_RuntimeError,
2155 "lost sys.displayhook");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002156 Py_DECREF(value);
2157 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002158 }
Petr Viktorinffd97532020-02-11 17:46:57 +01002159 res = PyObject_CallOneArg(hook, value);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002160 Py_DECREF(value);
2161 if (res == NULL)
2162 goto error;
2163 Py_DECREF(res);
2164 DISPATCH();
2165 }
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00002166
Benjamin Petersonddd19492018-09-16 22:38:02 -07002167 case TARGET(RAISE_VARARGS): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002168 PyObject *cause = NULL, *exc = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002169 switch (oparg) {
2170 case 2:
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002171 cause = POP(); /* cause */
Stefan Krahf432a322017-08-21 13:09:59 +02002172 /* fall through */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002173 case 1:
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002174 exc = POP(); /* exc */
Stefan Krahf432a322017-08-21 13:09:59 +02002175 /* fall through */
2176 case 0:
Victor Stinner09532fe2019-05-10 23:39:09 +02002177 if (do_raise(tstate, exc, cause)) {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002178 goto exception_unwind;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002179 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002180 break;
2181 default:
Victor Stinner438a12d2019-05-24 17:01:38 +02002182 _PyErr_SetString(tstate, PyExc_SystemError,
2183 "bad RAISE_VARARGS oparg");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002184 break;
2185 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002186 goto error;
2187 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002188
Benjamin Petersonddd19492018-09-16 22:38:02 -07002189 case TARGET(RETURN_VALUE): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002190 retval = POP();
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002191 assert(f->f_iblock == 0);
Mark Shannone7c9f4a2020-01-13 12:51:26 +00002192 assert(EMPTY());
Mark Shannoncb9879b2020-07-17 11:44:23 +01002193 f->f_state = FRAME_RETURNED;
2194 f->f_stackdepth = 0;
Mark Shannone7c9f4a2020-01-13 12:51:26 +00002195 goto exiting;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002196 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002197
Benjamin Petersonddd19492018-09-16 22:38:02 -07002198 case TARGET(GET_AITER): {
Yury Selivanov6ef05902015-05-28 11:21:31 -04002199 unaryfunc getter = NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04002200 PyObject *iter = NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04002201 PyObject *obj = TOP();
2202 PyTypeObject *type = Py_TYPE(obj);
2203
Yury Selivanova6f6edb2016-06-09 15:08:31 -04002204 if (type->tp_as_async != NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04002205 getter = type->tp_as_async->am_aiter;
Yury Selivanova6f6edb2016-06-09 15:08:31 -04002206 }
Yury Selivanov75445082015-05-11 22:57:16 -04002207
2208 if (getter != NULL) {
2209 iter = (*getter)(obj);
2210 Py_DECREF(obj);
2211 if (iter == NULL) {
2212 SET_TOP(NULL);
2213 goto error;
2214 }
2215 }
2216 else {
2217 SET_TOP(NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02002218 _PyErr_Format(tstate, PyExc_TypeError,
2219 "'async for' requires an object with "
2220 "__aiter__ method, got %.100s",
2221 type->tp_name);
Yury Selivanov75445082015-05-11 22:57:16 -04002222 Py_DECREF(obj);
2223 goto error;
2224 }
2225
Yury Selivanovfaa135a2017-10-06 02:08:57 -04002226 if (Py_TYPE(iter)->tp_as_async == NULL ||
2227 Py_TYPE(iter)->tp_as_async->am_anext == NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04002228
Yury Selivanov398ff912017-03-02 22:20:00 -05002229 SET_TOP(NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02002230 _PyErr_Format(tstate, PyExc_TypeError,
2231 "'async for' received an object from __aiter__ "
2232 "that does not implement __anext__: %.100s",
2233 Py_TYPE(iter)->tp_name);
Yury Selivanov75445082015-05-11 22:57:16 -04002234 Py_DECREF(iter);
2235 goto error;
Yury Selivanova6f6edb2016-06-09 15:08:31 -04002236 }
2237
Yury Selivanovfaa135a2017-10-06 02:08:57 -04002238 SET_TOP(iter);
Yury Selivanov75445082015-05-11 22:57:16 -04002239 DISPATCH();
2240 }
2241
Benjamin Petersonddd19492018-09-16 22:38:02 -07002242 case TARGET(GET_ANEXT): {
Yury Selivanov6ef05902015-05-28 11:21:31 -04002243 unaryfunc getter = NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04002244 PyObject *next_iter = NULL;
2245 PyObject *awaitable = NULL;
2246 PyObject *aiter = TOP();
2247 PyTypeObject *type = Py_TYPE(aiter);
2248
Yury Selivanoveb636452016-09-08 22:01:51 -07002249 if (PyAsyncGen_CheckExact(aiter)) {
2250 awaitable = type->tp_as_async->am_anext(aiter);
2251 if (awaitable == NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04002252 goto error;
2253 }
Yury Selivanoveb636452016-09-08 22:01:51 -07002254 } else {
2255 if (type->tp_as_async != NULL){
2256 getter = type->tp_as_async->am_anext;
2257 }
Yury Selivanov75445082015-05-11 22:57:16 -04002258
Yury Selivanoveb636452016-09-08 22:01:51 -07002259 if (getter != NULL) {
2260 next_iter = (*getter)(aiter);
2261 if (next_iter == NULL) {
2262 goto error;
2263 }
2264 }
2265 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02002266 _PyErr_Format(tstate, PyExc_TypeError,
2267 "'async for' requires an iterator with "
2268 "__anext__ method, got %.100s",
2269 type->tp_name);
Yury Selivanoveb636452016-09-08 22:01:51 -07002270 goto error;
2271 }
Yury Selivanov75445082015-05-11 22:57:16 -04002272
Yury Selivanoveb636452016-09-08 22:01:51 -07002273 awaitable = _PyCoro_GetAwaitableIter(next_iter);
2274 if (awaitable == NULL) {
Yury Selivanov398ff912017-03-02 22:20:00 -05002275 _PyErr_FormatFromCause(
Yury Selivanoveb636452016-09-08 22:01:51 -07002276 PyExc_TypeError,
2277 "'async for' received an invalid object "
2278 "from __anext__: %.100s",
2279 Py_TYPE(next_iter)->tp_name);
2280
2281 Py_DECREF(next_iter);
2282 goto error;
2283 } else {
2284 Py_DECREF(next_iter);
2285 }
2286 }
Yury Selivanov75445082015-05-11 22:57:16 -04002287
2288 PUSH(awaitable);
Serhiy Storchakada9c5132016-06-27 18:58:57 +03002289 PREDICT(LOAD_CONST);
Yury Selivanov75445082015-05-11 22:57:16 -04002290 DISPATCH();
2291 }
2292
Benjamin Petersonddd19492018-09-16 22:38:02 -07002293 case TARGET(GET_AWAITABLE): {
2294 PREDICTED(GET_AWAITABLE);
Yury Selivanov75445082015-05-11 22:57:16 -04002295 PyObject *iterable = TOP();
Yury Selivanov5376ba92015-06-22 12:19:30 -04002296 PyObject *iter = _PyCoro_GetAwaitableIter(iterable);
Yury Selivanov75445082015-05-11 22:57:16 -04002297
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03002298 if (iter == NULL) {
Mark Shannonfee55262019-11-21 09:11:43 +00002299 int opcode_at_minus_3 = 0;
2300 if ((next_instr - first_instr) > 2) {
2301 opcode_at_minus_3 = _Py_OPCODE(next_instr[-3]);
2302 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002303 format_awaitable_error(tstate, Py_TYPE(iterable),
Mark Shannonfee55262019-11-21 09:11:43 +00002304 opcode_at_minus_3,
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03002305 _Py_OPCODE(next_instr[-2]));
2306 }
2307
Yury Selivanov75445082015-05-11 22:57:16 -04002308 Py_DECREF(iterable);
2309
Yury Selivanovc724bae2016-03-02 11:30:46 -05002310 if (iter != NULL && PyCoro_CheckExact(iter)) {
2311 PyObject *yf = _PyGen_yf((PyGenObject*)iter);
2312 if (yf != NULL) {
2313 /* `iter` is a coroutine object that is being
2314 awaited, `yf` is a pointer to the current awaitable
2315 being awaited on. */
2316 Py_DECREF(yf);
2317 Py_CLEAR(iter);
Victor Stinner438a12d2019-05-24 17:01:38 +02002318 _PyErr_SetString(tstate, PyExc_RuntimeError,
2319 "coroutine is being awaited already");
Yury Selivanovc724bae2016-03-02 11:30:46 -05002320 /* The code below jumps to `error` if `iter` is NULL. */
2321 }
2322 }
2323
Yury Selivanov75445082015-05-11 22:57:16 -04002324 SET_TOP(iter); /* Even if it's NULL */
2325
2326 if (iter == NULL) {
2327 goto error;
2328 }
2329
Serhiy Storchakada9c5132016-06-27 18:58:57 +03002330 PREDICT(LOAD_CONST);
Yury Selivanov75445082015-05-11 22:57:16 -04002331 DISPATCH();
2332 }
2333
Benjamin Petersonddd19492018-09-16 22:38:02 -07002334 case TARGET(YIELD_FROM): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002335 PyObject *v = POP();
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07002336 PyObject *receiver = TOP();
Vladimir Matveev037245c2020-10-09 17:15:15 -07002337 PySendResult gen_status;
2338 if (tstate->c_tracefunc == NULL) {
2339 gen_status = PyIter_Send(receiver, v, &retval);
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05002340 } else {
Vladimir Matveev037245c2020-10-09 17:15:15 -07002341 _Py_IDENTIFIER(send);
2342 if (v == Py_None && PyIter_Check(receiver)) {
2343 retval = Py_TYPE(receiver)->tp_iternext(receiver);
Vladimir Matveev2b053612020-09-18 18:38:38 -07002344 }
2345 else {
Vladimir Matveev037245c2020-10-09 17:15:15 -07002346 retval = _PyObject_CallMethodIdOneArg(receiver, &PyId_send, v);
Vladimir Matveev2b053612020-09-18 18:38:38 -07002347 }
Vladimir Matveev2b053612020-09-18 18:38:38 -07002348 if (retval == NULL) {
2349 if (tstate->c_tracefunc != NULL
2350 && _PyErr_ExceptionMatches(tstate, PyExc_StopIteration))
2351 call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj, tstate, f);
2352 if (_PyGen_FetchStopIterationValue(&retval) == 0) {
2353 gen_status = PYGEN_RETURN;
2354 }
2355 else {
2356 gen_status = PYGEN_ERROR;
2357 }
2358 }
2359 else {
2360 gen_status = PYGEN_NEXT;
2361 }
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05002362 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002363 Py_DECREF(v);
Vladimir Matveev2b053612020-09-18 18:38:38 -07002364 if (gen_status == PYGEN_ERROR) {
2365 assert (retval == NULL);
2366 goto error;
2367 }
2368 if (gen_status == PYGEN_RETURN) {
2369 assert (retval != NULL);
2370
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07002371 Py_DECREF(receiver);
Vladimir Matveev2b053612020-09-18 18:38:38 -07002372 SET_TOP(retval);
2373 retval = NULL;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002374 DISPATCH();
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002375 }
Vladimir Matveev2b053612020-09-18 18:38:38 -07002376 assert (gen_status == PYGEN_NEXT);
Martin Panter95f53c12016-07-18 08:23:26 +00002377 /* receiver remains on stack, retval is value to be yielded */
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05002378 /* and repeat... */
Victor Stinnerf7d199f2016-11-24 22:33:01 +01002379 assert(f->f_lasti >= (int)sizeof(_Py_CODEUNIT));
Serhiy Storchakaab874002016-09-11 13:48:15 +03002380 f->f_lasti -= sizeof(_Py_CODEUNIT);
Mark Shannoncb9879b2020-07-17 11:44:23 +01002381 f->f_state = FRAME_SUSPENDED;
Victor Stinnerb7d8d8d2020-09-23 14:07:16 +02002382 f->f_stackdepth = (int)(stack_pointer - f->f_valuestack);
Mark Shannone7c9f4a2020-01-13 12:51:26 +00002383 goto exiting;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002384 }
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002385
Benjamin Petersonddd19492018-09-16 22:38:02 -07002386 case TARGET(YIELD_VALUE): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002387 retval = POP();
Yury Selivanoveb636452016-09-08 22:01:51 -07002388
2389 if (co->co_flags & CO_ASYNC_GENERATOR) {
2390 PyObject *w = _PyAsyncGenValueWrapperNew(retval);
2391 Py_DECREF(retval);
2392 if (w == NULL) {
2393 retval = NULL;
2394 goto error;
2395 }
2396 retval = w;
2397 }
Mark Shannoncb9879b2020-07-17 11:44:23 +01002398 f->f_state = FRAME_SUSPENDED;
Victor Stinnerb7d8d8d2020-09-23 14:07:16 +02002399 f->f_stackdepth = (int)(stack_pointer - f->f_valuestack);
Mark Shannone7c9f4a2020-01-13 12:51:26 +00002400 goto exiting;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002401 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002402
Benjamin Petersonddd19492018-09-16 22:38:02 -07002403 case TARGET(POP_EXCEPT): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002404 PyObject *type, *value, *traceback;
2405 _PyErr_StackItem *exc_info;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002406 PyTryBlock *b = PyFrame_BlockPop(f);
2407 if (b->b_type != EXCEPT_HANDLER) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002408 _PyErr_SetString(tstate, PyExc_SystemError,
2409 "popped block is not an except handler");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002410 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002411 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002412 assert(STACK_LEVEL() >= (b)->b_level + 3 &&
2413 STACK_LEVEL() <= (b)->b_level + 4);
2414 exc_info = tstate->exc_info;
2415 type = exc_info->exc_type;
2416 value = exc_info->exc_value;
2417 traceback = exc_info->exc_traceback;
2418 exc_info->exc_type = POP();
2419 exc_info->exc_value = POP();
2420 exc_info->exc_traceback = POP();
2421 Py_XDECREF(type);
2422 Py_XDECREF(value);
2423 Py_XDECREF(traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002424 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002425 }
Benjamin Petersoneec3d712008-06-11 15:59:43 +00002426
Benjamin Petersonddd19492018-09-16 22:38:02 -07002427 case TARGET(POP_BLOCK): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002428 PyFrame_BlockPop(f);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002429 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002430 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002431
Mark Shannonfee55262019-11-21 09:11:43 +00002432 case TARGET(RERAISE): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002433 PyObject *exc = POP();
Mark Shannonfee55262019-11-21 09:11:43 +00002434 PyObject *val = POP();
2435 PyObject *tb = POP();
2436 assert(PyExceptionClass_Check(exc));
Victor Stinner61f4db82020-01-28 03:37:45 +01002437 _PyErr_Restore(tstate, exc, val, tb);
Mark Shannonfee55262019-11-21 09:11:43 +00002438 goto exception_unwind;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002439 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002440
Benjamin Petersonddd19492018-09-16 22:38:02 -07002441 case TARGET(END_ASYNC_FOR): {
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002442 PyObject *exc = POP();
2443 assert(PyExceptionClass_Check(exc));
2444 if (PyErr_GivenExceptionMatches(exc, PyExc_StopAsyncIteration)) {
2445 PyTryBlock *b = PyFrame_BlockPop(f);
2446 assert(b->b_type == EXCEPT_HANDLER);
2447 Py_DECREF(exc);
2448 UNWIND_EXCEPT_HANDLER(b);
2449 Py_DECREF(POP());
2450 JUMPBY(oparg);
2451 FAST_DISPATCH();
2452 }
2453 else {
2454 PyObject *val = POP();
2455 PyObject *tb = POP();
Victor Stinner438a12d2019-05-24 17:01:38 +02002456 _PyErr_Restore(tstate, exc, val, tb);
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002457 goto exception_unwind;
2458 }
2459 }
2460
Zackery Spytzce6a0702019-08-25 03:44:09 -06002461 case TARGET(LOAD_ASSERTION_ERROR): {
2462 PyObject *value = PyExc_AssertionError;
2463 Py_INCREF(value);
2464 PUSH(value);
2465 FAST_DISPATCH();
2466 }
2467
Benjamin Petersonddd19492018-09-16 22:38:02 -07002468 case TARGET(LOAD_BUILD_CLASS): {
Victor Stinner3c1e4812012-03-26 22:10:51 +02002469 _Py_IDENTIFIER(__build_class__);
Victor Stinnerb0b22422012-04-19 00:57:45 +02002470
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002471 PyObject *bc;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002472 if (PyDict_CheckExact(f->f_builtins)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002473 bc = _PyDict_GetItemIdWithError(f->f_builtins, &PyId___build_class__);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002474 if (bc == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002475 if (!_PyErr_Occurred(tstate)) {
2476 _PyErr_SetString(tstate, PyExc_NameError,
2477 "__build_class__ not found");
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002478 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002479 goto error;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002480 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002481 Py_INCREF(bc);
Victor Stinnerb0b22422012-04-19 00:57:45 +02002482 }
2483 else {
2484 PyObject *build_class_str = _PyUnicode_FromId(&PyId___build_class__);
2485 if (build_class_str == NULL)
Serhiy Storchaka70b72f02016-11-08 23:12:46 +02002486 goto error;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002487 bc = PyObject_GetItem(f->f_builtins, build_class_str);
2488 if (bc == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002489 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError))
2490 _PyErr_SetString(tstate, PyExc_NameError,
2491 "__build_class__ not found");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002492 goto error;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002493 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002494 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002495 PUSH(bc);
Benjamin Peterson00f86f22012-10-10 14:10:33 -04002496 DISPATCH();
Victor Stinner3c1e4812012-03-26 22:10:51 +02002497 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002498
Benjamin Petersonddd19492018-09-16 22:38:02 -07002499 case TARGET(STORE_NAME): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002500 PyObject *name = GETITEM(names, oparg);
2501 PyObject *v = POP();
2502 PyObject *ns = f->f_locals;
2503 int err;
2504 if (ns == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002505 _PyErr_Format(tstate, PyExc_SystemError,
2506 "no locals found when storing %R", name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002507 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002508 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002509 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002510 if (PyDict_CheckExact(ns))
2511 err = PyDict_SetItem(ns, name, v);
2512 else
2513 err = PyObject_SetItem(ns, name, v);
2514 Py_DECREF(v);
2515 if (err != 0)
2516 goto error;
2517 DISPATCH();
2518 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002519
Benjamin Petersonddd19492018-09-16 22:38:02 -07002520 case TARGET(DELETE_NAME): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002521 PyObject *name = GETITEM(names, oparg);
2522 PyObject *ns = f->f_locals;
2523 int err;
2524 if (ns == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002525 _PyErr_Format(tstate, PyExc_SystemError,
2526 "no locals when deleting %R", name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002527 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002528 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002529 err = PyObject_DelItem(ns, name);
2530 if (err != 0) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002531 format_exc_check_arg(tstate, PyExc_NameError,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002532 NAME_ERROR_MSG,
2533 name);
2534 goto error;
2535 }
2536 DISPATCH();
2537 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00002538
Benjamin Petersonddd19492018-09-16 22:38:02 -07002539 case TARGET(UNPACK_SEQUENCE): {
2540 PREDICTED(UNPACK_SEQUENCE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002541 PyObject *seq = POP(), *item, **items;
2542 if (PyTuple_CheckExact(seq) &&
2543 PyTuple_GET_SIZE(seq) == oparg) {
2544 items = ((PyTupleObject *)seq)->ob_item;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002545 while (oparg--) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002546 item = items[oparg];
2547 Py_INCREF(item);
2548 PUSH(item);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002549 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002550 } else if (PyList_CheckExact(seq) &&
2551 PyList_GET_SIZE(seq) == oparg) {
2552 items = ((PyListObject *)seq)->ob_item;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002553 while (oparg--) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002554 item = items[oparg];
2555 Py_INCREF(item);
2556 PUSH(item);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002557 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002558 } else if (unpack_iterable(tstate, seq, oparg, -1,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002559 stack_pointer + oparg)) {
costypetrisor8ed317f2018-07-31 20:55:14 +00002560 STACK_GROW(oparg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002561 } else {
2562 /* unpack_iterable() raised an exception */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002563 Py_DECREF(seq);
2564 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002565 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002566 Py_DECREF(seq);
Benjamin Peterson00f86f22012-10-10 14:10:33 -04002567 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002568 }
Guido van Rossum0368b722007-05-11 16:50:42 +00002569
Benjamin Petersonddd19492018-09-16 22:38:02 -07002570 case TARGET(UNPACK_EX): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002571 int totalargs = 1 + (oparg & 0xFF) + (oparg >> 8);
2572 PyObject *seq = POP();
2573
Victor Stinner438a12d2019-05-24 17:01:38 +02002574 if (unpack_iterable(tstate, seq, oparg & 0xFF, oparg >> 8,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002575 stack_pointer + totalargs)) {
2576 stack_pointer += totalargs;
2577 } else {
2578 Py_DECREF(seq);
2579 goto error;
2580 }
2581 Py_DECREF(seq);
2582 DISPATCH();
2583 }
2584
Benjamin Petersonddd19492018-09-16 22:38:02 -07002585 case TARGET(STORE_ATTR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002586 PyObject *name = GETITEM(names, oparg);
2587 PyObject *owner = TOP();
2588 PyObject *v = SECOND();
2589 int err;
costypetrisor8ed317f2018-07-31 20:55:14 +00002590 STACK_SHRINK(2);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002591 err = PyObject_SetAttr(owner, name, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002592 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002593 Py_DECREF(owner);
2594 if (err != 0)
2595 goto error;
2596 DISPATCH();
2597 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002598
Benjamin Petersonddd19492018-09-16 22:38:02 -07002599 case TARGET(DELETE_ATTR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002600 PyObject *name = GETITEM(names, oparg);
2601 PyObject *owner = POP();
2602 int err;
2603 err = PyObject_SetAttr(owner, name, (PyObject *)NULL);
2604 Py_DECREF(owner);
2605 if (err != 0)
2606 goto error;
2607 DISPATCH();
2608 }
2609
Benjamin Petersonddd19492018-09-16 22:38:02 -07002610 case TARGET(STORE_GLOBAL): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002611 PyObject *name = GETITEM(names, oparg);
2612 PyObject *v = POP();
2613 int err;
2614 err = PyDict_SetItem(f->f_globals, name, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002615 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002616 if (err != 0)
2617 goto error;
2618 DISPATCH();
2619 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002620
Benjamin Petersonddd19492018-09-16 22:38:02 -07002621 case TARGET(DELETE_GLOBAL): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002622 PyObject *name = GETITEM(names, oparg);
2623 int err;
2624 err = PyDict_DelItem(f->f_globals, name);
2625 if (err != 0) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002626 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
2627 format_exc_check_arg(tstate, PyExc_NameError,
2628 NAME_ERROR_MSG, name);
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002629 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002630 goto error;
Benjamin Peterson00f86f22012-10-10 14:10:33 -04002631 }
2632 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002633 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002634
Benjamin Petersonddd19492018-09-16 22:38:02 -07002635 case TARGET(LOAD_NAME): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002636 PyObject *name = GETITEM(names, oparg);
2637 PyObject *locals = f->f_locals;
2638 PyObject *v;
2639 if (locals == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002640 _PyErr_Format(tstate, PyExc_SystemError,
2641 "no locals when loading %R", name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002642 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002643 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002644 if (PyDict_CheckExact(locals)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002645 v = PyDict_GetItemWithError(locals, name);
2646 if (v != NULL) {
2647 Py_INCREF(v);
2648 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002649 else if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002650 goto error;
2651 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002652 }
2653 else {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002654 v = PyObject_GetItem(locals, name);
Victor Stinnere20310f2015-11-05 13:56:58 +01002655 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002656 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError))
Benjamin Peterson92722792012-12-15 12:51:05 -05002657 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02002658 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002659 }
2660 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002661 if (v == NULL) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002662 v = PyDict_GetItemWithError(f->f_globals, name);
2663 if (v != NULL) {
2664 Py_INCREF(v);
2665 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002666 else if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002667 goto error;
2668 }
2669 else {
Victor Stinnerb0b22422012-04-19 00:57:45 +02002670 if (PyDict_CheckExact(f->f_builtins)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002671 v = PyDict_GetItemWithError(f->f_builtins, name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002672 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002673 if (!_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002674 format_exc_check_arg(
Victor Stinner438a12d2019-05-24 17:01:38 +02002675 tstate, PyExc_NameError,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002676 NAME_ERROR_MSG, name);
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002677 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002678 goto error;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002679 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002680 Py_INCREF(v);
Victor Stinnerb0b22422012-04-19 00:57:45 +02002681 }
2682 else {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002683 v = PyObject_GetItem(f->f_builtins, name);
2684 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002685 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Victor Stinnerb0b22422012-04-19 00:57:45 +02002686 format_exc_check_arg(
Victor Stinner438a12d2019-05-24 17:01:38 +02002687 tstate, PyExc_NameError,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002688 NAME_ERROR_MSG, name);
Victor Stinner438a12d2019-05-24 17:01:38 +02002689 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002690 goto error;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002691 }
Benjamin Peterson20f9c3c2010-07-20 22:39:34 +00002692 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002693 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002694 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002695 PUSH(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002696 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002697 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002698
Benjamin Petersonddd19492018-09-16 22:38:02 -07002699 case TARGET(LOAD_GLOBAL): {
Inada Naoki91234a12019-06-03 21:30:58 +09002700 PyObject *name;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002701 PyObject *v;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002702 if (PyDict_CheckExact(f->f_globals)
Victor Stinnerb4efc962015-11-20 09:24:02 +01002703 && PyDict_CheckExact(f->f_builtins))
2704 {
Inada Naoki91234a12019-06-03 21:30:58 +09002705 OPCACHE_CHECK();
2706 if (co_opcache != NULL && co_opcache->optimized > 0) {
2707 _PyOpcache_LoadGlobal *lg = &co_opcache->u.lg;
2708
2709 if (lg->globals_ver ==
2710 ((PyDictObject *)f->f_globals)->ma_version_tag
2711 && lg->builtins_ver ==
2712 ((PyDictObject *)f->f_builtins)->ma_version_tag)
2713 {
2714 PyObject *ptr = lg->ptr;
2715 OPCACHE_STAT_GLOBAL_HIT();
2716 assert(ptr != NULL);
2717 Py_INCREF(ptr);
2718 PUSH(ptr);
2719 DISPATCH();
2720 }
2721 }
2722
2723 name = GETITEM(names, oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002724 v = _PyDict_LoadGlobal((PyDictObject *)f->f_globals,
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002725 (PyDictObject *)f->f_builtins,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002726 name);
2727 if (v == NULL) {
Victor Stinnerb4efc962015-11-20 09:24:02 +01002728 if (!_PyErr_OCCURRED()) {
2729 /* _PyDict_LoadGlobal() returns NULL without raising
2730 * an exception if the key doesn't exist */
Victor Stinner438a12d2019-05-24 17:01:38 +02002731 format_exc_check_arg(tstate, PyExc_NameError,
Ezio Melotti04a29552013-03-03 15:12:44 +02002732 NAME_ERROR_MSG, name);
Victor Stinnerb4efc962015-11-20 09:24:02 +01002733 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002734 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002735 }
Inada Naoki91234a12019-06-03 21:30:58 +09002736
2737 if (co_opcache != NULL) {
2738 _PyOpcache_LoadGlobal *lg = &co_opcache->u.lg;
2739
2740 if (co_opcache->optimized == 0) {
2741 /* Wasn't optimized before. */
2742 OPCACHE_STAT_GLOBAL_OPT();
2743 } else {
2744 OPCACHE_STAT_GLOBAL_MISS();
2745 }
2746
2747 co_opcache->optimized = 1;
2748 lg->globals_ver =
2749 ((PyDictObject *)f->f_globals)->ma_version_tag;
2750 lg->builtins_ver =
2751 ((PyDictObject *)f->f_builtins)->ma_version_tag;
2752 lg->ptr = v; /* borrowed */
2753 }
2754
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002755 Py_INCREF(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002756 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002757 else {
2758 /* Slow-path if globals or builtins is not a dict */
Victor Stinnerb4efc962015-11-20 09:24:02 +01002759
2760 /* namespace 1: globals */
Inada Naoki91234a12019-06-03 21:30:58 +09002761 name = GETITEM(names, oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002762 v = PyObject_GetItem(f->f_globals, name);
2763 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002764 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Victor Stinner60a1d3c2015-11-05 13:55:20 +01002765 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02002766 }
2767 _PyErr_Clear(tstate);
Victor Stinner60a1d3c2015-11-05 13:55:20 +01002768
Victor Stinnerb4efc962015-11-20 09:24:02 +01002769 /* namespace 2: builtins */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002770 v = PyObject_GetItem(f->f_builtins, name);
2771 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002772 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002773 format_exc_check_arg(
Victor Stinner438a12d2019-05-24 17:01:38 +02002774 tstate, PyExc_NameError,
Ezio Melotti04a29552013-03-03 15:12:44 +02002775 NAME_ERROR_MSG, name);
Victor Stinner438a12d2019-05-24 17:01:38 +02002776 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002777 goto error;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002778 }
2779 }
2780 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002781 PUSH(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002782 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002783 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002784
Benjamin Petersonddd19492018-09-16 22:38:02 -07002785 case TARGET(DELETE_FAST): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002786 PyObject *v = GETLOCAL(oparg);
2787 if (v != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002788 SETLOCAL(oparg, NULL);
2789 DISPATCH();
2790 }
2791 format_exc_check_arg(
Victor Stinner438a12d2019-05-24 17:01:38 +02002792 tstate, PyExc_UnboundLocalError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002793 UNBOUNDLOCAL_ERROR_MSG,
2794 PyTuple_GetItem(co->co_varnames, oparg)
2795 );
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002796 goto error;
2797 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002798
Benjamin Petersonddd19492018-09-16 22:38:02 -07002799 case TARGET(DELETE_DEREF): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002800 PyObject *cell = freevars[oparg];
Raymond Hettingerc32f9db2016-11-12 04:10:35 -05002801 PyObject *oldobj = PyCell_GET(cell);
2802 if (oldobj != NULL) {
2803 PyCell_SET(cell, NULL);
2804 Py_DECREF(oldobj);
Benjamin Peterson00ebe2c2010-09-10 22:02:31 +00002805 DISPATCH();
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00002806 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002807 format_exc_unbound(tstate, co, oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002808 goto error;
2809 }
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00002810
Benjamin Petersonddd19492018-09-16 22:38:02 -07002811 case TARGET(LOAD_CLOSURE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002812 PyObject *cell = freevars[oparg];
2813 Py_INCREF(cell);
2814 PUSH(cell);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002815 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002816 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002817
Benjamin Petersonddd19492018-09-16 22:38:02 -07002818 case TARGET(LOAD_CLASSDEREF): {
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002819 PyObject *name, *value, *locals = f->f_locals;
Victor Stinnerd3dfd0e2013-05-16 23:48:01 +02002820 Py_ssize_t idx;
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002821 assert(locals);
2822 assert(oparg >= PyTuple_GET_SIZE(co->co_cellvars));
2823 idx = oparg - PyTuple_GET_SIZE(co->co_cellvars);
2824 assert(idx >= 0 && idx < PyTuple_GET_SIZE(co->co_freevars));
2825 name = PyTuple_GET_ITEM(co->co_freevars, idx);
2826 if (PyDict_CheckExact(locals)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002827 value = PyDict_GetItemWithError(locals, name);
2828 if (value != NULL) {
2829 Py_INCREF(value);
2830 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002831 else if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002832 goto error;
2833 }
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002834 }
2835 else {
2836 value = PyObject_GetItem(locals, name);
Victor Stinnere20310f2015-11-05 13:56:58 +01002837 if (value == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002838 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002839 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02002840 }
2841 _PyErr_Clear(tstate);
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002842 }
2843 }
2844 if (!value) {
2845 PyObject *cell = freevars[oparg];
2846 value = PyCell_GET(cell);
2847 if (value == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002848 format_exc_unbound(tstate, co, oparg);
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002849 goto error;
2850 }
2851 Py_INCREF(value);
2852 }
2853 PUSH(value);
2854 DISPATCH();
2855 }
2856
Benjamin Petersonddd19492018-09-16 22:38:02 -07002857 case TARGET(LOAD_DEREF): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002858 PyObject *cell = freevars[oparg];
2859 PyObject *value = PyCell_GET(cell);
2860 if (value == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002861 format_exc_unbound(tstate, co, oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002862 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002863 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002864 Py_INCREF(value);
2865 PUSH(value);
2866 DISPATCH();
2867 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002868
Benjamin Petersonddd19492018-09-16 22:38:02 -07002869 case TARGET(STORE_DEREF): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002870 PyObject *v = POP();
2871 PyObject *cell = freevars[oparg];
Raymond Hettingerb2b15432016-11-11 04:32:11 -08002872 PyObject *oldobj = PyCell_GET(cell);
2873 PyCell_SET(cell, v);
2874 Py_XDECREF(oldobj);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002875 DISPATCH();
2876 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002877
Benjamin Petersonddd19492018-09-16 22:38:02 -07002878 case TARGET(BUILD_STRING): {
Serhiy Storchakaea525a22016-09-06 22:07:53 +03002879 PyObject *str;
2880 PyObject *empty = PyUnicode_New(0, 0);
2881 if (empty == NULL) {
2882 goto error;
2883 }
2884 str = _PyUnicode_JoinArray(empty, stack_pointer - oparg, oparg);
2885 Py_DECREF(empty);
2886 if (str == NULL)
2887 goto error;
2888 while (--oparg >= 0) {
2889 PyObject *item = POP();
2890 Py_DECREF(item);
2891 }
2892 PUSH(str);
2893 DISPATCH();
2894 }
2895
Benjamin Petersonddd19492018-09-16 22:38:02 -07002896 case TARGET(BUILD_TUPLE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002897 PyObject *tup = PyTuple_New(oparg);
2898 if (tup == NULL)
2899 goto error;
2900 while (--oparg >= 0) {
2901 PyObject *item = POP();
2902 PyTuple_SET_ITEM(tup, oparg, item);
2903 }
2904 PUSH(tup);
2905 DISPATCH();
2906 }
2907
Benjamin Petersonddd19492018-09-16 22:38:02 -07002908 case TARGET(BUILD_LIST): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002909 PyObject *list = PyList_New(oparg);
2910 if (list == NULL)
2911 goto error;
2912 while (--oparg >= 0) {
2913 PyObject *item = POP();
2914 PyList_SET_ITEM(list, oparg, item);
2915 }
2916 PUSH(list);
2917 DISPATCH();
2918 }
2919
Mark Shannon13bc1392020-01-23 09:25:17 +00002920 case TARGET(LIST_TO_TUPLE): {
2921 PyObject *list = POP();
2922 PyObject *tuple = PyList_AsTuple(list);
2923 Py_DECREF(list);
2924 if (tuple == NULL) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002925 goto error;
Mark Shannon13bc1392020-01-23 09:25:17 +00002926 }
2927 PUSH(tuple);
2928 DISPATCH();
2929 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002930
Mark Shannon13bc1392020-01-23 09:25:17 +00002931 case TARGET(LIST_EXTEND): {
2932 PyObject *iterable = POP();
2933 PyObject *list = PEEK(oparg);
2934 PyObject *none_val = _PyList_Extend((PyListObject *)list, iterable);
2935 if (none_val == NULL) {
2936 if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError) &&
Victor Stinnera102ed72020-02-07 02:24:48 +01002937 (Py_TYPE(iterable)->tp_iter == NULL && !PySequence_Check(iterable)))
Mark Shannon13bc1392020-01-23 09:25:17 +00002938 {
Victor Stinner61f4db82020-01-28 03:37:45 +01002939 _PyErr_Clear(tstate);
Mark Shannon13bc1392020-01-23 09:25:17 +00002940 _PyErr_Format(tstate, PyExc_TypeError,
2941 "Value after * must be an iterable, not %.200s",
2942 Py_TYPE(iterable)->tp_name);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002943 }
Mark Shannon13bc1392020-01-23 09:25:17 +00002944 Py_DECREF(iterable);
2945 goto error;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002946 }
Mark Shannon13bc1392020-01-23 09:25:17 +00002947 Py_DECREF(none_val);
2948 Py_DECREF(iterable);
2949 DISPATCH();
2950 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002951
Mark Shannon13bc1392020-01-23 09:25:17 +00002952 case TARGET(SET_UPDATE): {
2953 PyObject *iterable = POP();
2954 PyObject *set = PEEK(oparg);
2955 int err = _PySet_Update(set, iterable);
2956 Py_DECREF(iterable);
2957 if (err < 0) {
2958 goto error;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002959 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002960 DISPATCH();
2961 }
2962
Benjamin Petersonddd19492018-09-16 22:38:02 -07002963 case TARGET(BUILD_SET): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002964 PyObject *set = PySet_New(NULL);
2965 int err = 0;
Raymond Hettinger4c483ad2016-09-08 14:45:40 -07002966 int i;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002967 if (set == NULL)
2968 goto error;
Raymond Hettinger4c483ad2016-09-08 14:45:40 -07002969 for (i = oparg; i > 0; i--) {
2970 PyObject *item = PEEK(i);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002971 if (err == 0)
2972 err = PySet_Add(set, item);
2973 Py_DECREF(item);
2974 }
costypetrisor8ed317f2018-07-31 20:55:14 +00002975 STACK_SHRINK(oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002976 if (err != 0) {
2977 Py_DECREF(set);
2978 goto error;
2979 }
2980 PUSH(set);
2981 DISPATCH();
2982 }
2983
Benjamin Petersonddd19492018-09-16 22:38:02 -07002984 case TARGET(BUILD_MAP): {
Victor Stinner74319ae2016-08-25 00:04:09 +02002985 Py_ssize_t i;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002986 PyObject *map = _PyDict_NewPresized((Py_ssize_t)oparg);
2987 if (map == NULL)
2988 goto error;
Benjamin Petersond5d77aa2015-07-05 10:37:25 -05002989 for (i = oparg; i > 0; i--) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002990 int err;
Benjamin Petersond5d77aa2015-07-05 10:37:25 -05002991 PyObject *key = PEEK(2*i);
2992 PyObject *value = PEEK(2*i - 1);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002993 err = PyDict_SetItem(map, key, value);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002994 if (err != 0) {
2995 Py_DECREF(map);
2996 goto error;
2997 }
2998 }
Benjamin Petersond5d77aa2015-07-05 10:37:25 -05002999
3000 while (oparg--) {
3001 Py_DECREF(POP());
3002 Py_DECREF(POP());
3003 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003004 PUSH(map);
3005 DISPATCH();
3006 }
3007
Benjamin Petersonddd19492018-09-16 22:38:02 -07003008 case TARGET(SETUP_ANNOTATIONS): {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003009 _Py_IDENTIFIER(__annotations__);
3010 int err;
3011 PyObject *ann_dict;
3012 if (f->f_locals == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003013 _PyErr_Format(tstate, PyExc_SystemError,
3014 "no locals found when setting up annotations");
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003015 goto error;
3016 }
3017 /* check if __annotations__ in locals()... */
3018 if (PyDict_CheckExact(f->f_locals)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02003019 ann_dict = _PyDict_GetItemIdWithError(f->f_locals,
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003020 &PyId___annotations__);
3021 if (ann_dict == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003022 if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02003023 goto error;
3024 }
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003025 /* ...if not, create a new one */
3026 ann_dict = PyDict_New();
3027 if (ann_dict == NULL) {
3028 goto error;
3029 }
3030 err = _PyDict_SetItemId(f->f_locals,
3031 &PyId___annotations__, ann_dict);
3032 Py_DECREF(ann_dict);
3033 if (err != 0) {
3034 goto error;
3035 }
3036 }
3037 }
3038 else {
3039 /* do the same if locals() is not a dict */
3040 PyObject *ann_str = _PyUnicode_FromId(&PyId___annotations__);
3041 if (ann_str == NULL) {
Serhiy Storchaka4678b2f2016-11-08 23:13:36 +02003042 goto error;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003043 }
3044 ann_dict = PyObject_GetItem(f->f_locals, ann_str);
3045 if (ann_dict == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003046 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003047 goto error;
3048 }
Victor Stinner438a12d2019-05-24 17:01:38 +02003049 _PyErr_Clear(tstate);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003050 ann_dict = PyDict_New();
3051 if (ann_dict == NULL) {
3052 goto error;
3053 }
3054 err = PyObject_SetItem(f->f_locals, ann_str, ann_dict);
3055 Py_DECREF(ann_dict);
3056 if (err != 0) {
3057 goto error;
3058 }
3059 }
3060 else {
3061 Py_DECREF(ann_dict);
3062 }
3063 }
3064 DISPATCH();
3065 }
3066
Benjamin Petersonddd19492018-09-16 22:38:02 -07003067 case TARGET(BUILD_CONST_KEY_MAP): {
Victor Stinner74319ae2016-08-25 00:04:09 +02003068 Py_ssize_t i;
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003069 PyObject *map;
3070 PyObject *keys = TOP();
3071 if (!PyTuple_CheckExact(keys) ||
3072 PyTuple_GET_SIZE(keys) != (Py_ssize_t)oparg) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003073 _PyErr_SetString(tstate, PyExc_SystemError,
3074 "bad BUILD_CONST_KEY_MAP keys argument");
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003075 goto error;
3076 }
3077 map = _PyDict_NewPresized((Py_ssize_t)oparg);
3078 if (map == NULL) {
3079 goto error;
3080 }
3081 for (i = oparg; i > 0; i--) {
3082 int err;
3083 PyObject *key = PyTuple_GET_ITEM(keys, oparg - i);
3084 PyObject *value = PEEK(i + 1);
3085 err = PyDict_SetItem(map, key, value);
3086 if (err != 0) {
3087 Py_DECREF(map);
3088 goto error;
3089 }
3090 }
3091
3092 Py_DECREF(POP());
3093 while (oparg--) {
3094 Py_DECREF(POP());
3095 }
3096 PUSH(map);
3097 DISPATCH();
3098 }
3099
Mark Shannon8a4cd702020-01-27 09:57:45 +00003100 case TARGET(DICT_UPDATE): {
3101 PyObject *update = POP();
3102 PyObject *dict = PEEK(oparg);
3103 if (PyDict_Update(dict, update) < 0) {
3104 if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) {
3105 _PyErr_Format(tstate, PyExc_TypeError,
3106 "'%.200s' object is not a mapping",
Victor Stinnera102ed72020-02-07 02:24:48 +01003107 Py_TYPE(update)->tp_name);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003108 }
Mark Shannon8a4cd702020-01-27 09:57:45 +00003109 Py_DECREF(update);
3110 goto error;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003111 }
Mark Shannon8a4cd702020-01-27 09:57:45 +00003112 Py_DECREF(update);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003113 DISPATCH();
3114 }
3115
Mark Shannon8a4cd702020-01-27 09:57:45 +00003116 case TARGET(DICT_MERGE): {
3117 PyObject *update = POP();
3118 PyObject *dict = PEEK(oparg);
3119
3120 if (_PyDict_MergeEx(dict, update, 2) < 0) {
3121 format_kwargs_error(tstate, PEEK(2 + oparg), update);
3122 Py_DECREF(update);
Serhiy Storchakae036ef82016-10-02 11:06:43 +03003123 goto error;
Serhiy Storchakae036ef82016-10-02 11:06:43 +03003124 }
Mark Shannon8a4cd702020-01-27 09:57:45 +00003125 Py_DECREF(update);
Brandt Bucherf185a732019-09-28 17:12:49 -07003126 PREDICT(CALL_FUNCTION_EX);
Serhiy Storchakae036ef82016-10-02 11:06:43 +03003127 DISPATCH();
3128 }
3129
Benjamin Petersonddd19492018-09-16 22:38:02 -07003130 case TARGET(MAP_ADD): {
Jörn Heisslerc8a35412019-06-22 16:40:55 +02003131 PyObject *value = TOP();
3132 PyObject *key = SECOND();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003133 PyObject *map;
3134 int err;
costypetrisor8ed317f2018-07-31 20:55:14 +00003135 STACK_SHRINK(2);
Raymond Hettinger41862222016-10-15 19:03:06 -07003136 map = PEEK(oparg); /* dict */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003137 assert(PyDict_CheckExact(map));
Martin Panter95f53c12016-07-18 08:23:26 +00003138 err = PyDict_SetItem(map, key, value); /* map[key] = value */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003139 Py_DECREF(value);
3140 Py_DECREF(key);
3141 if (err != 0)
3142 goto error;
3143 PREDICT(JUMP_ABSOLUTE);
3144 DISPATCH();
3145 }
3146
Benjamin Petersonddd19492018-09-16 22:38:02 -07003147 case TARGET(LOAD_ATTR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003148 PyObject *name = GETITEM(names, oparg);
3149 PyObject *owner = TOP();
Pablo Galindo109826c2020-10-20 06:22:44 +01003150
3151 PyTypeObject *type = Py_TYPE(owner);
3152 PyObject *res;
3153 PyObject **dictptr;
3154 PyObject *dict;
3155 _PyOpCodeOpt_LoadAttr *la;
3156
3157 OPCACHE_STAT_ATTR_TOTAL();
3158
3159 OPCACHE_CHECK();
3160 if (co_opcache != NULL && PyType_HasFeature(type, Py_TPFLAGS_VALID_VERSION_TAG))
3161 {
3162 if (co_opcache->optimized > 0) {
3163 /* Fast path -- cache hit makes LOAD_ATTR ~30% faster */
3164 la = &co_opcache->u.la;
3165 if (la->type == type && la->tp_version_tag == type->tp_version_tag)
3166 {
3167 assert(type->tp_dict != NULL);
3168 assert(type->tp_dictoffset > 0);
3169
3170 dictptr = (PyObject **) ((char *)owner + type->tp_dictoffset);
3171 dict = *dictptr;
3172 if (dict != NULL && PyDict_CheckExact(dict)) {
3173 Py_ssize_t hint = la->hint;
3174 Py_INCREF(dict);
3175 res = NULL;
3176 la->hint = _PyDict_GetItemHint((PyDictObject*)dict, name, hint, &res);
3177
3178 if (res != NULL) {
3179 if (la->hint == hint && hint >= 0) {
3180 /* Our hint has helped -- cache hit. */
3181 OPCACHE_STAT_ATTR_HIT();
3182 } else {
3183 /* The hint we provided didn't work.
3184 Maybe next time? */
3185 OPCACHE_MAYBE_DEOPT_LOAD_ATTR();
3186 }
3187
3188 Py_INCREF(res);
3189 SET_TOP(res);
3190 Py_DECREF(owner);
3191 Py_DECREF(dict);
3192 DISPATCH();
3193 } else {
3194 // This attribute can be missing sometimes -- we
3195 // don't want to optimize this lookup.
3196 OPCACHE_DEOPT_LOAD_ATTR();
3197 Py_DECREF(dict);
3198 }
3199 } else {
3200 // There is no dict, or __dict__ doesn't satisfy PyDict_CheckExact
3201 OPCACHE_DEOPT_LOAD_ATTR();
3202 }
3203 } else {
3204 // The type of the object has either been updated,
3205 // or is different. Maybe it will stabilize?
3206 OPCACHE_MAYBE_DEOPT_LOAD_ATTR();
3207 }
3208
3209 OPCACHE_STAT_ATTR_MISS();
3210 }
3211
3212 if (co_opcache != NULL && /* co_opcache can be NULL after a DEOPT() call. */
3213 type->tp_getattro == PyObject_GenericGetAttr)
3214 {
Pablo Galindo109826c2020-10-20 06:22:44 +01003215 Py_ssize_t ret;
3216
3217 if (type->tp_dictoffset > 0) {
3218 if (type->tp_dict == NULL) {
3219 if (PyType_Ready(type) < 0) {
3220 Py_DECREF(owner);
3221 SET_TOP(NULL);
3222 goto error;
3223 }
3224 }
Pablo Galindo80449f22020-11-05 09:23:15 +00003225 if (_PyType_Lookup(type, name) == NULL) {
Pablo Galindo109826c2020-10-20 06:22:44 +01003226 dictptr = (PyObject **) ((char *)owner + type->tp_dictoffset);
3227 dict = *dictptr;
3228
3229 if (dict != NULL && PyDict_CheckExact(dict)) {
3230 Py_INCREF(dict);
3231 res = NULL;
3232 ret = _PyDict_GetItemHint((PyDictObject*)dict, name, -1, &res);
3233 if (res != NULL) {
3234 Py_INCREF(res);
3235 Py_DECREF(dict);
3236 Py_DECREF(owner);
3237 SET_TOP(res);
3238
3239 if (co_opcache->optimized == 0) {
3240 // First time we optimize this opcode. */
3241 OPCACHE_STAT_ATTR_OPT();
3242 co_opcache->optimized = OPCODE_CACHE_MAX_TRIES;
3243 }
3244
3245 la = &co_opcache->u.la;
3246 la->type = type;
3247 la->tp_version_tag = type->tp_version_tag;
3248 la->hint = ret;
3249
3250 DISPATCH();
3251 }
3252 Py_DECREF(dict);
3253 } else {
3254 // There is no dict, or __dict__ doesn't satisfy PyDict_CheckExact
3255 OPCACHE_DEOPT_LOAD_ATTR();
3256 }
3257 } else {
3258 // We failed to find an attribute without a data-like descriptor
3259 OPCACHE_DEOPT_LOAD_ATTR();
3260 }
3261 } else {
3262 // The object's class does not have a tp_dictoffset we can use
3263 OPCACHE_DEOPT_LOAD_ATTR();
3264 }
3265 } else if (type->tp_getattro != PyObject_GenericGetAttr) {
3266 OPCACHE_DEOPT_LOAD_ATTR();
3267 }
3268 }
3269
3270 /* slow path */
3271 res = PyObject_GetAttr(owner, name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003272 Py_DECREF(owner);
3273 SET_TOP(res);
3274 if (res == NULL)
3275 goto error;
3276 DISPATCH();
3277 }
3278
Benjamin Petersonddd19492018-09-16 22:38:02 -07003279 case TARGET(COMPARE_OP): {
Mark Shannon9af0e472020-01-14 10:12:45 +00003280 assert(oparg <= Py_GE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003281 PyObject *right = POP();
3282 PyObject *left = TOP();
Mark Shannon9af0e472020-01-14 10:12:45 +00003283 PyObject *res = PyObject_RichCompare(left, right, oparg);
3284 SET_TOP(res);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003285 Py_DECREF(left);
3286 Py_DECREF(right);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003287 if (res == NULL)
3288 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003289 PREDICT(POP_JUMP_IF_FALSE);
3290 PREDICT(POP_JUMP_IF_TRUE);
3291 DISPATCH();
Victor Stinner3c1e4812012-03-26 22:10:51 +02003292 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003293
Mark Shannon9af0e472020-01-14 10:12:45 +00003294 case TARGET(IS_OP): {
3295 PyObject *right = POP();
3296 PyObject *left = TOP();
3297 int res = (left == right)^oparg;
3298 PyObject *b = res ? Py_True : Py_False;
3299 Py_INCREF(b);
3300 SET_TOP(b);
3301 Py_DECREF(left);
3302 Py_DECREF(right);
3303 PREDICT(POP_JUMP_IF_FALSE);
3304 PREDICT(POP_JUMP_IF_TRUE);
3305 FAST_DISPATCH();
3306 }
3307
3308 case TARGET(CONTAINS_OP): {
3309 PyObject *right = POP();
3310 PyObject *left = POP();
3311 int res = PySequence_Contains(right, left);
3312 Py_DECREF(left);
3313 Py_DECREF(right);
3314 if (res < 0) {
3315 goto error;
3316 }
3317 PyObject *b = (res^oparg) ? Py_True : Py_False;
3318 Py_INCREF(b);
3319 PUSH(b);
3320 PREDICT(POP_JUMP_IF_FALSE);
3321 PREDICT(POP_JUMP_IF_TRUE);
3322 FAST_DISPATCH();
3323 }
3324
3325#define CANNOT_CATCH_MSG "catching classes that do not inherit from "\
3326 "BaseException is not allowed"
3327
3328 case TARGET(JUMP_IF_NOT_EXC_MATCH): {
3329 PyObject *right = POP();
3330 PyObject *left = POP();
3331 if (PyTuple_Check(right)) {
3332 Py_ssize_t i, length;
3333 length = PyTuple_GET_SIZE(right);
3334 for (i = 0; i < length; i++) {
3335 PyObject *exc = PyTuple_GET_ITEM(right, i);
3336 if (!PyExceptionClass_Check(exc)) {
3337 _PyErr_SetString(tstate, PyExc_TypeError,
3338 CANNOT_CATCH_MSG);
3339 Py_DECREF(left);
3340 Py_DECREF(right);
3341 goto error;
3342 }
3343 }
3344 }
3345 else {
3346 if (!PyExceptionClass_Check(right)) {
3347 _PyErr_SetString(tstate, PyExc_TypeError,
3348 CANNOT_CATCH_MSG);
3349 Py_DECREF(left);
3350 Py_DECREF(right);
3351 goto error;
3352 }
3353 }
3354 int res = PyErr_GivenExceptionMatches(left, right);
3355 Py_DECREF(left);
3356 Py_DECREF(right);
3357 if (res > 0) {
3358 /* Exception matches -- Do nothing */;
3359 }
3360 else if (res == 0) {
3361 JUMPTO(oparg);
3362 }
3363 else {
3364 goto error;
3365 }
3366 DISPATCH();
3367 }
3368
Benjamin Petersonddd19492018-09-16 22:38:02 -07003369 case TARGET(IMPORT_NAME): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003370 PyObject *name = GETITEM(names, oparg);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03003371 PyObject *fromlist = POP();
3372 PyObject *level = TOP();
3373 PyObject *res;
Victor Stinner438a12d2019-05-24 17:01:38 +02003374 res = import_name(tstate, f, name, fromlist, level);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03003375 Py_DECREF(level);
3376 Py_DECREF(fromlist);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003377 SET_TOP(res);
3378 if (res == NULL)
3379 goto error;
3380 DISPATCH();
3381 }
3382
Benjamin Petersonddd19492018-09-16 22:38:02 -07003383 case TARGET(IMPORT_STAR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003384 PyObject *from = POP(), *locals;
3385 int err;
Matthias Bussonnier160edb42017-02-25 21:58:05 -08003386 if (PyFrame_FastToLocalsWithError(f) < 0) {
3387 Py_DECREF(from);
Victor Stinner41bb43a2013-10-29 01:19:37 +01003388 goto error;
Matthias Bussonnier160edb42017-02-25 21:58:05 -08003389 }
Victor Stinner41bb43a2013-10-29 01:19:37 +01003390
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003391 locals = f->f_locals;
3392 if (locals == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003393 _PyErr_SetString(tstate, PyExc_SystemError,
3394 "no locals found during 'import *'");
Matthias Bussonnier160edb42017-02-25 21:58:05 -08003395 Py_DECREF(from);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003396 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003397 }
Victor Stinner438a12d2019-05-24 17:01:38 +02003398 err = import_all_from(tstate, locals, from);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003399 PyFrame_LocalsToFast(f, 0);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003400 Py_DECREF(from);
3401 if (err != 0)
3402 goto error;
3403 DISPATCH();
3404 }
Guido van Rossum25831651993-05-19 14:50:45 +00003405
Benjamin Petersonddd19492018-09-16 22:38:02 -07003406 case TARGET(IMPORT_FROM): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003407 PyObject *name = GETITEM(names, oparg);
3408 PyObject *from = TOP();
3409 PyObject *res;
Victor Stinner438a12d2019-05-24 17:01:38 +02003410 res = import_from(tstate, from, name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003411 PUSH(res);
3412 if (res == NULL)
3413 goto error;
3414 DISPATCH();
3415 }
Thomas Wouters52152252000-08-17 22:55:00 +00003416
Benjamin Petersonddd19492018-09-16 22:38:02 -07003417 case TARGET(JUMP_FORWARD): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003418 JUMPBY(oparg);
3419 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003420 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003421
Benjamin Petersonddd19492018-09-16 22:38:02 -07003422 case TARGET(POP_JUMP_IF_FALSE): {
3423 PREDICTED(POP_JUMP_IF_FALSE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003424 PyObject *cond = POP();
3425 int err;
3426 if (cond == Py_True) {
3427 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003428 FAST_DISPATCH();
3429 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003430 if (cond == Py_False) {
3431 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003432 JUMPTO(oparg);
3433 FAST_DISPATCH();
3434 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003435 err = PyObject_IsTrue(cond);
3436 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003437 if (err > 0)
Adrian Wielgosik50c28502017-06-23 13:35:41 -07003438 ;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003439 else if (err == 0)
3440 JUMPTO(oparg);
3441 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003442 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003443 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003444 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003445
Benjamin Petersonddd19492018-09-16 22:38:02 -07003446 case TARGET(POP_JUMP_IF_TRUE): {
3447 PREDICTED(POP_JUMP_IF_TRUE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003448 PyObject *cond = POP();
3449 int err;
3450 if (cond == Py_False) {
3451 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003452 FAST_DISPATCH();
3453 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003454 if (cond == Py_True) {
3455 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003456 JUMPTO(oparg);
3457 FAST_DISPATCH();
3458 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003459 err = PyObject_IsTrue(cond);
3460 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003461 if (err > 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003462 JUMPTO(oparg);
3463 }
3464 else if (err == 0)
3465 ;
3466 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003467 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003468 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003469 }
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00003470
Benjamin Petersonddd19492018-09-16 22:38:02 -07003471 case TARGET(JUMP_IF_FALSE_OR_POP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003472 PyObject *cond = TOP();
3473 int err;
3474 if (cond == Py_True) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003475 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003476 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003477 FAST_DISPATCH();
3478 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003479 if (cond == Py_False) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003480 JUMPTO(oparg);
3481 FAST_DISPATCH();
3482 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003483 err = PyObject_IsTrue(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003484 if (err > 0) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003485 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003486 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003487 }
3488 else if (err == 0)
3489 JUMPTO(oparg);
3490 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003491 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003492 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003493 }
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00003494
Benjamin Petersonddd19492018-09-16 22:38:02 -07003495 case TARGET(JUMP_IF_TRUE_OR_POP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003496 PyObject *cond = TOP();
3497 int err;
3498 if (cond == Py_False) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003499 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003500 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003501 FAST_DISPATCH();
3502 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003503 if (cond == Py_True) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003504 JUMPTO(oparg);
3505 FAST_DISPATCH();
3506 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003507 err = PyObject_IsTrue(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003508 if (err > 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003509 JUMPTO(oparg);
3510 }
3511 else if (err == 0) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003512 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003513 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003514 }
3515 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003516 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003517 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003518 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003519
Benjamin Petersonddd19492018-09-16 22:38:02 -07003520 case TARGET(JUMP_ABSOLUTE): {
3521 PREDICTED(JUMP_ABSOLUTE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003522 JUMPTO(oparg);
Guido van Rossum58da9312007-11-10 23:39:45 +00003523#if FAST_LOOPS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003524 /* Enabling this path speeds-up all while and for-loops by bypassing
3525 the per-loop checks for signals. By default, this should be turned-off
3526 because it prevents detection of a control-break in tight loops like
3527 "while 1: pass". Compile with this option turned-on when you need
3528 the speed-up and do not need break checking inside tight loops (ones
3529 that contain only instructions ending with FAST_DISPATCH).
3530 */
3531 FAST_DISPATCH();
Guido van Rossum58da9312007-11-10 23:39:45 +00003532#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003533 DISPATCH();
Guido van Rossum58da9312007-11-10 23:39:45 +00003534#endif
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003535 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003536
Benjamin Petersonddd19492018-09-16 22:38:02 -07003537 case TARGET(GET_ITER): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003538 /* before: [obj]; after [getiter(obj)] */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003539 PyObject *iterable = TOP();
Yury Selivanov5376ba92015-06-22 12:19:30 -04003540 PyObject *iter = PyObject_GetIter(iterable);
3541 Py_DECREF(iterable);
3542 SET_TOP(iter);
3543 if (iter == NULL)
3544 goto error;
3545 PREDICT(FOR_ITER);
Serhiy Storchakada9c5132016-06-27 18:58:57 +03003546 PREDICT(CALL_FUNCTION);
Yury Selivanov5376ba92015-06-22 12:19:30 -04003547 DISPATCH();
3548 }
3549
Benjamin Petersonddd19492018-09-16 22:38:02 -07003550 case TARGET(GET_YIELD_FROM_ITER): {
Yury Selivanov5376ba92015-06-22 12:19:30 -04003551 /* before: [obj]; after [getiter(obj)] */
3552 PyObject *iterable = TOP();
Yury Selivanov75445082015-05-11 22:57:16 -04003553 PyObject *iter;
Yury Selivanov5376ba92015-06-22 12:19:30 -04003554 if (PyCoro_CheckExact(iterable)) {
3555 /* `iterable` is a coroutine */
3556 if (!(co->co_flags & (CO_COROUTINE | CO_ITERABLE_COROUTINE))) {
3557 /* and it is used in a 'yield from' expression of a
3558 regular generator. */
3559 Py_DECREF(iterable);
3560 SET_TOP(NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02003561 _PyErr_SetString(tstate, PyExc_TypeError,
3562 "cannot 'yield from' a coroutine object "
3563 "in a non-coroutine generator");
Yury Selivanov5376ba92015-06-22 12:19:30 -04003564 goto error;
3565 }
3566 }
3567 else if (!PyGen_CheckExact(iterable)) {
Yury Selivanov75445082015-05-11 22:57:16 -04003568 /* `iterable` is not a generator. */
3569 iter = PyObject_GetIter(iterable);
3570 Py_DECREF(iterable);
3571 SET_TOP(iter);
3572 if (iter == NULL)
3573 goto error;
3574 }
Serhiy Storchakada9c5132016-06-27 18:58:57 +03003575 PREDICT(LOAD_CONST);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003576 DISPATCH();
3577 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003578
Benjamin Petersonddd19492018-09-16 22:38:02 -07003579 case TARGET(FOR_ITER): {
3580 PREDICTED(FOR_ITER);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003581 /* before: [iter]; after: [iter, iter()] *or* [] */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003582 PyObject *iter = TOP();
Victor Stinnera102ed72020-02-07 02:24:48 +01003583 PyObject *next = (*Py_TYPE(iter)->tp_iternext)(iter);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003584 if (next != NULL) {
3585 PUSH(next);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003586 PREDICT(STORE_FAST);
3587 PREDICT(UNPACK_SEQUENCE);
3588 DISPATCH();
3589 }
Victor Stinner438a12d2019-05-24 17:01:38 +02003590 if (_PyErr_Occurred(tstate)) {
3591 if (!_PyErr_ExceptionMatches(tstate, PyExc_StopIteration)) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003592 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02003593 }
3594 else if (tstate->c_tracefunc != NULL) {
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003595 call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj, tstate, f);
Victor Stinner438a12d2019-05-24 17:01:38 +02003596 }
3597 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003598 }
3599 /* iterator ended normally */
costypetrisor8ed317f2018-07-31 20:55:14 +00003600 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003601 Py_DECREF(iter);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003602 JUMPBY(oparg);
3603 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003604 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003605
Benjamin Petersonddd19492018-09-16 22:38:02 -07003606 case TARGET(SETUP_FINALLY): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003607 PyFrame_BlockSetup(f, SETUP_FINALLY, INSTR_OFFSET() + oparg,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003608 STACK_LEVEL());
3609 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003610 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003611
Benjamin Petersonddd19492018-09-16 22:38:02 -07003612 case TARGET(BEFORE_ASYNC_WITH): {
Yury Selivanov75445082015-05-11 22:57:16 -04003613 _Py_IDENTIFIER(__aenter__);
Géry Ogam1d1b97a2020-01-14 12:58:29 +01003614 _Py_IDENTIFIER(__aexit__);
Yury Selivanov75445082015-05-11 22:57:16 -04003615 PyObject *mgr = TOP();
Géry Ogam1d1b97a2020-01-14 12:58:29 +01003616 PyObject *enter = special_lookup(tstate, mgr, &PyId___aenter__);
Yury Selivanov75445082015-05-11 22:57:16 -04003617 PyObject *res;
Géry Ogam1d1b97a2020-01-14 12:58:29 +01003618 if (enter == NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04003619 goto error;
Géry Ogam1d1b97a2020-01-14 12:58:29 +01003620 }
3621 PyObject *exit = special_lookup(tstate, mgr, &PyId___aexit__);
3622 if (exit == NULL) {
3623 Py_DECREF(enter);
3624 goto error;
3625 }
Yury Selivanov75445082015-05-11 22:57:16 -04003626 SET_TOP(exit);
Yury Selivanov75445082015-05-11 22:57:16 -04003627 Py_DECREF(mgr);
Victor Stinnerf17c3de2016-12-06 18:46:19 +01003628 res = _PyObject_CallNoArg(enter);
Yury Selivanov75445082015-05-11 22:57:16 -04003629 Py_DECREF(enter);
3630 if (res == NULL)
3631 goto error;
3632 PUSH(res);
Serhiy Storchakada9c5132016-06-27 18:58:57 +03003633 PREDICT(GET_AWAITABLE);
Yury Selivanov75445082015-05-11 22:57:16 -04003634 DISPATCH();
3635 }
3636
Benjamin Petersonddd19492018-09-16 22:38:02 -07003637 case TARGET(SETUP_ASYNC_WITH): {
Yury Selivanov75445082015-05-11 22:57:16 -04003638 PyObject *res = POP();
3639 /* Setup the finally block before pushing the result
3640 of __aenter__ on the stack. */
3641 PyFrame_BlockSetup(f, SETUP_FINALLY, INSTR_OFFSET() + oparg,
3642 STACK_LEVEL());
3643 PUSH(res);
3644 DISPATCH();
3645 }
3646
Benjamin Petersonddd19492018-09-16 22:38:02 -07003647 case TARGET(SETUP_WITH): {
Benjamin Petersonce798522012-01-22 11:24:29 -05003648 _Py_IDENTIFIER(__enter__);
Géry Ogam1d1b97a2020-01-14 12:58:29 +01003649 _Py_IDENTIFIER(__exit__);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003650 PyObject *mgr = TOP();
Victor Stinner438a12d2019-05-24 17:01:38 +02003651 PyObject *enter = special_lookup(tstate, mgr, &PyId___enter__);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003652 PyObject *res;
Victor Stinner438a12d2019-05-24 17:01:38 +02003653 if (enter == NULL) {
Raymond Hettingera3fec152016-11-21 17:24:23 -08003654 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02003655 }
3656 PyObject *exit = special_lookup(tstate, mgr, &PyId___exit__);
Raymond Hettinger64e2f9a2016-11-22 11:50:40 -08003657 if (exit == NULL) {
3658 Py_DECREF(enter);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003659 goto error;
Raymond Hettinger64e2f9a2016-11-22 11:50:40 -08003660 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003661 SET_TOP(exit);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003662 Py_DECREF(mgr);
Victor Stinnerf17c3de2016-12-06 18:46:19 +01003663 res = _PyObject_CallNoArg(enter);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003664 Py_DECREF(enter);
3665 if (res == NULL)
3666 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003667 /* Setup the finally block before pushing the result
3668 of __enter__ on the stack. */
3669 PyFrame_BlockSetup(f, SETUP_FINALLY, INSTR_OFFSET() + oparg,
3670 STACK_LEVEL());
Benjamin Peterson876b2f22009-06-28 03:18:59 +00003671
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003672 PUSH(res);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003673 DISPATCH();
3674 }
Benjamin Peterson876b2f22009-06-28 03:18:59 +00003675
Mark Shannonfee55262019-11-21 09:11:43 +00003676 case TARGET(WITH_EXCEPT_START): {
3677 /* At the top of the stack are 7 values:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003678 - (TOP, SECOND, THIRD) = exc_info()
Mark Shannonfee55262019-11-21 09:11:43 +00003679 - (FOURTH, FIFTH, SIXTH) = previous exception for EXCEPT_HANDLER
3680 - SEVENTH: the context.__exit__ bound method
3681 We call SEVENTH(TOP, SECOND, THIRD).
3682 Then we push again the TOP exception and the __exit__
3683 return value.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003684 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003685 PyObject *exit_func;
Victor Stinner842cfff2016-12-01 14:45:31 +01003686 PyObject *exc, *val, *tb, *res;
3687
Victor Stinner842cfff2016-12-01 14:45:31 +01003688 exc = TOP();
Mark Shannonfee55262019-11-21 09:11:43 +00003689 val = SECOND();
3690 tb = THIRD();
3691 assert(exc != Py_None);
3692 assert(!PyLong_Check(exc));
3693 exit_func = PEEK(7);
Jeroen Demeyer469d1a72019-07-03 12:52:21 +02003694 PyObject *stack[4] = {NULL, exc, val, tb};
Petr Viktorinffd97532020-02-11 17:46:57 +01003695 res = PyObject_Vectorcall(exit_func, stack + 1,
Jeroen Demeyer469d1a72019-07-03 12:52:21 +02003696 3 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003697 if (res == NULL)
3698 goto error;
Amaury Forgeot d'Arc10b24e82008-12-10 23:49:33 +00003699
Yury Selivanov75445082015-05-11 22:57:16 -04003700 PUSH(res);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003701 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003702 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00003703
Benjamin Petersonddd19492018-09-16 22:38:02 -07003704 case TARGET(LOAD_METHOD): {
Andreyb021ba52019-04-29 14:33:26 +10003705 /* Designed to work in tandem with CALL_METHOD. */
Yury Selivanovf2392132016-12-13 19:03:51 -05003706 PyObject *name = GETITEM(names, oparg);
3707 PyObject *obj = TOP();
3708 PyObject *meth = NULL;
3709
3710 int meth_found = _PyObject_GetMethod(obj, name, &meth);
3711
Yury Selivanovf2392132016-12-13 19:03:51 -05003712 if (meth == NULL) {
3713 /* Most likely attribute wasn't found. */
Yury Selivanovf2392132016-12-13 19:03:51 -05003714 goto error;
3715 }
3716
3717 if (meth_found) {
INADA Naoki015bce62017-01-16 17:23:30 +09003718 /* We can bypass temporary bound method object.
3719 meth is unbound method and obj is self.
Victor Stinnera8cb5152017-01-18 14:12:51 +01003720
INADA Naoki015bce62017-01-16 17:23:30 +09003721 meth | self | arg1 | ... | argN
3722 */
3723 SET_TOP(meth);
3724 PUSH(obj); // self
Yury Selivanovf2392132016-12-13 19:03:51 -05003725 }
3726 else {
INADA Naoki015bce62017-01-16 17:23:30 +09003727 /* meth is not an unbound method (but a regular attr, or
3728 something was returned by a descriptor protocol). Set
3729 the second element of the stack to NULL, to signal
Yury Selivanovf2392132016-12-13 19:03:51 -05003730 CALL_METHOD that it's not a method call.
INADA Naoki015bce62017-01-16 17:23:30 +09003731
3732 NULL | meth | arg1 | ... | argN
Yury Selivanovf2392132016-12-13 19:03:51 -05003733 */
INADA Naoki015bce62017-01-16 17:23:30 +09003734 SET_TOP(NULL);
Yury Selivanovf2392132016-12-13 19:03:51 -05003735 Py_DECREF(obj);
INADA Naoki015bce62017-01-16 17:23:30 +09003736 PUSH(meth);
Yury Selivanovf2392132016-12-13 19:03:51 -05003737 }
3738 DISPATCH();
3739 }
3740
Benjamin Petersonddd19492018-09-16 22:38:02 -07003741 case TARGET(CALL_METHOD): {
Yury Selivanovf2392132016-12-13 19:03:51 -05003742 /* Designed to work in tamdem with LOAD_METHOD. */
INADA Naoki015bce62017-01-16 17:23:30 +09003743 PyObject **sp, *res, *meth;
Yury Selivanovf2392132016-12-13 19:03:51 -05003744
3745 sp = stack_pointer;
3746
INADA Naoki015bce62017-01-16 17:23:30 +09003747 meth = PEEK(oparg + 2);
3748 if (meth == NULL) {
3749 /* `meth` is NULL when LOAD_METHOD thinks that it's not
3750 a method call.
Yury Selivanovf2392132016-12-13 19:03:51 -05003751
3752 Stack layout:
3753
INADA Naoki015bce62017-01-16 17:23:30 +09003754 ... | NULL | callable | arg1 | ... | argN
3755 ^- TOP()
3756 ^- (-oparg)
3757 ^- (-oparg-1)
3758 ^- (-oparg-2)
Yury Selivanovf2392132016-12-13 19:03:51 -05003759
Ville Skyttä49b27342017-08-03 09:00:59 +03003760 `callable` will be POPed by call_function.
INADA Naoki015bce62017-01-16 17:23:30 +09003761 NULL will will be POPed manually later.
Yury Selivanovf2392132016-12-13 19:03:51 -05003762 */
Victor Stinner09532fe2019-05-10 23:39:09 +02003763 res = call_function(tstate, &sp, oparg, NULL);
Yury Selivanovf2392132016-12-13 19:03:51 -05003764 stack_pointer = sp;
INADA Naoki015bce62017-01-16 17:23:30 +09003765 (void)POP(); /* POP the NULL. */
Yury Selivanovf2392132016-12-13 19:03:51 -05003766 }
3767 else {
3768 /* This is a method call. Stack layout:
3769
INADA Naoki015bce62017-01-16 17:23:30 +09003770 ... | method | self | arg1 | ... | argN
Yury Selivanovf2392132016-12-13 19:03:51 -05003771 ^- TOP()
3772 ^- (-oparg)
INADA Naoki015bce62017-01-16 17:23:30 +09003773 ^- (-oparg-1)
3774 ^- (-oparg-2)
Yury Selivanovf2392132016-12-13 19:03:51 -05003775
INADA Naoki015bce62017-01-16 17:23:30 +09003776 `self` and `method` will be POPed by call_function.
Yury Selivanovf2392132016-12-13 19:03:51 -05003777 We'll be passing `oparg + 1` to call_function, to
INADA Naoki015bce62017-01-16 17:23:30 +09003778 make it accept the `self` as a first argument.
Yury Selivanovf2392132016-12-13 19:03:51 -05003779 */
Victor Stinner09532fe2019-05-10 23:39:09 +02003780 res = call_function(tstate, &sp, oparg + 1, NULL);
Yury Selivanovf2392132016-12-13 19:03:51 -05003781 stack_pointer = sp;
3782 }
3783
3784 PUSH(res);
3785 if (res == NULL)
3786 goto error;
3787 DISPATCH();
3788 }
3789
Benjamin Petersonddd19492018-09-16 22:38:02 -07003790 case TARGET(CALL_FUNCTION): {
3791 PREDICTED(CALL_FUNCTION);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003792 PyObject **sp, *res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003793 sp = stack_pointer;
Victor Stinner09532fe2019-05-10 23:39:09 +02003794 res = call_function(tstate, &sp, oparg, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003795 stack_pointer = sp;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003796 PUSH(res);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003797 if (res == NULL) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003798 goto error;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003799 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003800 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003801 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003802
Benjamin Petersonddd19492018-09-16 22:38:02 -07003803 case TARGET(CALL_FUNCTION_KW): {
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003804 PyObject **sp, *res, *names;
3805
3806 names = POP();
Jeroen Demeyer05677862019-08-16 12:41:27 +02003807 assert(PyTuple_Check(names));
3808 assert(PyTuple_GET_SIZE(names) <= oparg);
3809 /* We assume without checking that names contains only strings */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003810 sp = stack_pointer;
Victor Stinner09532fe2019-05-10 23:39:09 +02003811 res = call_function(tstate, &sp, oparg, names);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003812 stack_pointer = sp;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003813 PUSH(res);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003814 Py_DECREF(names);
3815
3816 if (res == NULL) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003817 goto error;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003818 }
3819 DISPATCH();
3820 }
3821
Benjamin Petersonddd19492018-09-16 22:38:02 -07003822 case TARGET(CALL_FUNCTION_EX): {
Brandt Bucherf185a732019-09-28 17:12:49 -07003823 PREDICTED(CALL_FUNCTION_EX);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003824 PyObject *func, *callargs, *kwargs = NULL, *result;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003825 if (oparg & 0x01) {
3826 kwargs = POP();
Serhiy Storchakab7281052016-09-12 00:52:40 +03003827 if (!PyDict_CheckExact(kwargs)) {
3828 PyObject *d = PyDict_New();
3829 if (d == NULL)
3830 goto error;
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02003831 if (_PyDict_MergeEx(d, kwargs, 2) < 0) {
Serhiy Storchakab7281052016-09-12 00:52:40 +03003832 Py_DECREF(d);
Victor Stinner438a12d2019-05-24 17:01:38 +02003833 format_kwargs_error(tstate, SECOND(), kwargs);
Victor Stinnereece2222016-09-12 11:16:37 +02003834 Py_DECREF(kwargs);
Serhiy Storchakab7281052016-09-12 00:52:40 +03003835 goto error;
3836 }
3837 Py_DECREF(kwargs);
3838 kwargs = d;
3839 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003840 assert(PyDict_CheckExact(kwargs));
3841 }
3842 callargs = POP();
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003843 func = TOP();
Serhiy Storchaka63dc5482016-09-22 19:41:20 +03003844 if (!PyTuple_CheckExact(callargs)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003845 if (check_args_iterable(tstate, func, callargs) < 0) {
Victor Stinnereece2222016-09-12 11:16:37 +02003846 Py_DECREF(callargs);
Serhiy Storchakab7281052016-09-12 00:52:40 +03003847 goto error;
3848 }
3849 Py_SETREF(callargs, PySequence_Tuple(callargs));
3850 if (callargs == NULL) {
3851 goto error;
3852 }
3853 }
Serhiy Storchaka63dc5482016-09-22 19:41:20 +03003854 assert(PyTuple_CheckExact(callargs));
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003855
Victor Stinner09532fe2019-05-10 23:39:09 +02003856 result = do_call_core(tstate, func, callargs, kwargs);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003857 Py_DECREF(func);
3858 Py_DECREF(callargs);
3859 Py_XDECREF(kwargs);
3860
3861 SET_TOP(result);
3862 if (result == NULL) {
3863 goto error;
3864 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003865 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003866 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003867
Benjamin Petersonddd19492018-09-16 22:38:02 -07003868 case TARGET(MAKE_FUNCTION): {
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003869 PyObject *qualname = POP();
3870 PyObject *codeobj = POP();
3871 PyFunctionObject *func = (PyFunctionObject *)
3872 PyFunction_NewWithQualName(codeobj, f->f_globals, qualname);
Guido van Rossum4f72a782006-10-27 23:31:49 +00003873
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003874 Py_DECREF(codeobj);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003875 Py_DECREF(qualname);
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003876 if (func == NULL) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003877 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003878 }
Neal Norwitzc1505362006-12-28 06:47:50 +00003879
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003880 if (oparg & 0x08) {
3881 assert(PyTuple_CheckExact(TOP()));
3882 func ->func_closure = POP();
3883 }
3884 if (oparg & 0x04) {
Yurii Karabas73019792020-11-25 12:43:18 +02003885 assert(PyTuple_CheckExact(TOP()));
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003886 func->func_annotations = POP();
3887 }
3888 if (oparg & 0x02) {
3889 assert(PyDict_CheckExact(TOP()));
3890 func->func_kwdefaults = POP();
3891 }
3892 if (oparg & 0x01) {
3893 assert(PyTuple_CheckExact(TOP()));
3894 func->func_defaults = POP();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003895 }
Neal Norwitzc1505362006-12-28 06:47:50 +00003896
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003897 PUSH((PyObject *)func);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003898 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003899 }
Guido van Rossum8861b741996-07-30 16:49:37 +00003900
Benjamin Petersonddd19492018-09-16 22:38:02 -07003901 case TARGET(BUILD_SLICE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003902 PyObject *start, *stop, *step, *slice;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003903 if (oparg == 3)
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003904 step = POP();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003905 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003906 step = NULL;
3907 stop = POP();
3908 start = TOP();
3909 slice = PySlice_New(start, stop, step);
3910 Py_DECREF(start);
3911 Py_DECREF(stop);
3912 Py_XDECREF(step);
3913 SET_TOP(slice);
3914 if (slice == NULL)
3915 goto error;
3916 DISPATCH();
3917 }
Guido van Rossum8861b741996-07-30 16:49:37 +00003918
Benjamin Petersonddd19492018-09-16 22:38:02 -07003919 case TARGET(FORMAT_VALUE): {
Eric V. Smitha78c7952015-11-03 12:45:05 -05003920 /* Handles f-string value formatting. */
3921 PyObject *result;
3922 PyObject *fmt_spec;
3923 PyObject *value;
3924 PyObject *(*conv_fn)(PyObject *);
3925 int which_conversion = oparg & FVC_MASK;
3926 int have_fmt_spec = (oparg & FVS_MASK) == FVS_HAVE_SPEC;
3927
3928 fmt_spec = have_fmt_spec ? POP() : NULL;
Eric V. Smith135d5f42016-02-05 18:23:08 -05003929 value = POP();
Eric V. Smitha78c7952015-11-03 12:45:05 -05003930
3931 /* See if any conversion is specified. */
3932 switch (which_conversion) {
Eric V. Smith9a4135e2019-05-08 16:28:48 -04003933 case FVC_NONE: conv_fn = NULL; break;
Eric V. Smitha78c7952015-11-03 12:45:05 -05003934 case FVC_STR: conv_fn = PyObject_Str; break;
3935 case FVC_REPR: conv_fn = PyObject_Repr; break;
3936 case FVC_ASCII: conv_fn = PyObject_ASCII; break;
Eric V. Smith9a4135e2019-05-08 16:28:48 -04003937 default:
Victor Stinner438a12d2019-05-24 17:01:38 +02003938 _PyErr_Format(tstate, PyExc_SystemError,
3939 "unexpected conversion flag %d",
3940 which_conversion);
Eric V. Smith9a4135e2019-05-08 16:28:48 -04003941 goto error;
Eric V. Smitha78c7952015-11-03 12:45:05 -05003942 }
3943
3944 /* If there's a conversion function, call it and replace
3945 value with that result. Otherwise, just use value,
3946 without conversion. */
Eric V. Smitheb588a12016-02-05 18:26:20 -05003947 if (conv_fn != NULL) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05003948 result = conv_fn(value);
3949 Py_DECREF(value);
Eric V. Smitheb588a12016-02-05 18:26:20 -05003950 if (result == NULL) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05003951 Py_XDECREF(fmt_spec);
3952 goto error;
3953 }
3954 value = result;
3955 }
3956
3957 /* If value is a unicode object, and there's no fmt_spec,
3958 then we know the result of format(value) is value
3959 itself. In that case, skip calling format(). I plan to
3960 move this optimization in to PyObject_Format()
3961 itself. */
3962 if (PyUnicode_CheckExact(value) && fmt_spec == NULL) {
3963 /* Do nothing, just transfer ownership to result. */
3964 result = value;
3965 } else {
3966 /* Actually call format(). */
3967 result = PyObject_Format(value, fmt_spec);
3968 Py_DECREF(value);
3969 Py_XDECREF(fmt_spec);
Eric V. Smitheb588a12016-02-05 18:26:20 -05003970 if (result == NULL) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05003971 goto error;
Eric V. Smitheb588a12016-02-05 18:26:20 -05003972 }
Eric V. Smitha78c7952015-11-03 12:45:05 -05003973 }
3974
Eric V. Smith135d5f42016-02-05 18:23:08 -05003975 PUSH(result);
Eric V. Smitha78c7952015-11-03 12:45:05 -05003976 DISPATCH();
3977 }
3978
Benjamin Petersonddd19492018-09-16 22:38:02 -07003979 case TARGET(EXTENDED_ARG): {
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03003980 int oldoparg = oparg;
3981 NEXTOPARG();
3982 oparg |= oldoparg << 8;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003983 goto dispatch_opcode;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003984 }
Guido van Rossum8861b741996-07-30 16:49:37 +00003985
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003986
Antoine Pitrou042b1282010-08-13 21:15:58 +00003987#if USE_COMPUTED_GOTOS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003988 _unknown_opcode:
Antoine Pitroub52ec782009-01-25 16:34:23 +00003989#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003990 default:
3991 fprintf(stderr,
3992 "XXX lineno: %d, opcode: %d\n",
3993 PyFrame_GetLineNumber(f),
3994 opcode);
Victor Stinner438a12d2019-05-24 17:01:38 +02003995 _PyErr_SetString(tstate, PyExc_SystemError, "unknown opcode");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003996 goto error;
Guido van Rossum04691fc1992-08-12 15:35:34 +00003997
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003998 } /* switch */
Guido van Rossum374a9221991-04-04 10:40:29 +00003999
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004000 /* This should never be reached. Every opcode should end with DISPATCH()
4001 or goto error. */
Barry Warsawb2e57942017-09-14 18:13:16 -07004002 Py_UNREACHABLE();
Guido van Rossumac7be682001-01-17 15:42:30 +00004003
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004004error:
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004005 /* Double-check exception status. */
Victor Stinner365b6932013-07-12 00:11:58 +02004006#ifdef NDEBUG
Victor Stinner438a12d2019-05-24 17:01:38 +02004007 if (!_PyErr_Occurred(tstate)) {
4008 _PyErr_SetString(tstate, PyExc_SystemError,
4009 "error return without exception set");
4010 }
Victor Stinner365b6932013-07-12 00:11:58 +02004011#else
Victor Stinner438a12d2019-05-24 17:01:38 +02004012 assert(_PyErr_Occurred(tstate));
Victor Stinner365b6932013-07-12 00:11:58 +02004013#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00004014
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004015 /* Log traceback info. */
4016 PyTraceBack_Here(f);
Guido van Rossumac7be682001-01-17 15:42:30 +00004017
Mark Shannoncb9879b2020-07-17 11:44:23 +01004018 if (tstate->c_tracefunc != NULL) {
4019 /* Make sure state is set to FRAME_EXECUTING for tracing */
4020 assert(f->f_state == FRAME_EXECUTING);
4021 f->f_state = FRAME_UNWINDING;
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004022 call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj,
4023 tstate, f);
Mark Shannoncb9879b2020-07-17 11:44:23 +01004024 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004025exception_unwind:
Mark Shannoncb9879b2020-07-17 11:44:23 +01004026 f->f_state = FRAME_UNWINDING;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004027 /* Unwind stacks if an exception occurred */
4028 while (f->f_iblock > 0) {
4029 /* Pop the current block. */
4030 PyTryBlock *b = &f->f_blockstack[--f->f_iblock];
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004031
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004032 if (b->b_type == EXCEPT_HANDLER) {
4033 UNWIND_EXCEPT_HANDLER(b);
4034 continue;
4035 }
4036 UNWIND_BLOCK(b);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004037 if (b->b_type == SETUP_FINALLY) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004038 PyObject *exc, *val, *tb;
4039 int handler = b->b_handler;
Mark Shannonae3087c2017-10-22 22:41:51 +01004040 _PyErr_StackItem *exc_info = tstate->exc_info;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004041 /* Beware, this invalidates all b->b_* fields */
4042 PyFrame_BlockSetup(f, EXCEPT_HANDLER, -1, STACK_LEVEL());
Mark Shannonae3087c2017-10-22 22:41:51 +01004043 PUSH(exc_info->exc_traceback);
4044 PUSH(exc_info->exc_value);
4045 if (exc_info->exc_type != NULL) {
4046 PUSH(exc_info->exc_type);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004047 }
4048 else {
4049 Py_INCREF(Py_None);
4050 PUSH(Py_None);
4051 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004052 _PyErr_Fetch(tstate, &exc, &val, &tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004053 /* Make the raw exception data
4054 available to the handler,
4055 so a program can emulate the
4056 Python main loop. */
Victor Stinner438a12d2019-05-24 17:01:38 +02004057 _PyErr_NormalizeException(tstate, &exc, &val, &tb);
Victor Stinner7eab0d02013-07-15 21:16:27 +02004058 if (tb != NULL)
4059 PyException_SetTraceback(val, tb);
4060 else
4061 PyException_SetTraceback(val, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004062 Py_INCREF(exc);
Mark Shannonae3087c2017-10-22 22:41:51 +01004063 exc_info->exc_type = exc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004064 Py_INCREF(val);
Mark Shannonae3087c2017-10-22 22:41:51 +01004065 exc_info->exc_value = val;
4066 exc_info->exc_traceback = tb;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004067 if (tb == NULL)
4068 tb = Py_None;
4069 Py_INCREF(tb);
4070 PUSH(tb);
4071 PUSH(val);
4072 PUSH(exc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004073 JUMPTO(handler);
Victor Stinnerdab84232020-03-17 18:56:44 +01004074 if (_Py_TracingPossible(ceval2)) {
Mark Shannon877df852020-11-12 09:43:29 +00004075 instr_prev = INT_MAX;
Mark Shannonfee55262019-11-21 09:11:43 +00004076 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004077 /* Resume normal execution */
Mark Shannoncb9879b2020-07-17 11:44:23 +01004078 f->f_state = FRAME_EXECUTING;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004079 goto main_loop;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004080 }
4081 } /* unwind stack */
Guido van Rossum374a9221991-04-04 10:40:29 +00004082
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004083 /* End the loop as we still have an error */
4084 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004085 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00004086
Pablo Galindof00828a2019-05-09 16:52:02 +01004087 assert(retval == NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02004088 assert(_PyErr_Occurred(tstate));
Pablo Galindof00828a2019-05-09 16:52:02 +01004089
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004090 /* Pop remaining stack entries. */
4091 while (!EMPTY()) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004092 PyObject *o = POP();
4093 Py_XDECREF(o);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004094 }
Mark Shannoncb9879b2020-07-17 11:44:23 +01004095 f->f_stackdepth = 0;
4096 f->f_state = FRAME_RAISED;
Mark Shannone7c9f4a2020-01-13 12:51:26 +00004097exiting:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004098 if (tstate->use_tracing) {
Benjamin Peterson51f46162013-01-23 08:38:47 -05004099 if (tstate->c_tracefunc) {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004100 if (call_trace_protected(tstate->c_tracefunc, tstate->c_traceobj,
4101 tstate, f, PyTrace_RETURN, retval)) {
4102 Py_CLEAR(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004103 }
4104 }
4105 if (tstate->c_profilefunc) {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004106 if (call_trace_protected(tstate->c_profilefunc, tstate->c_profileobj,
4107 tstate, f, PyTrace_RETURN, retval)) {
Serhiy Storchaka505ff752014-02-09 13:33:53 +02004108 Py_CLEAR(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004109 }
4110 }
4111 }
Guido van Rossuma4240131997-01-21 21:18:36 +00004112
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004113 /* pop frame */
Thomas Woutersce272b62007-09-19 21:19:28 +00004114exit_eval_frame:
Łukasz Langaa785c872016-09-09 17:37:37 -07004115 if (PyDTrace_FUNCTION_RETURN_ENABLED())
4116 dtrace_function_return(f);
Victor Stinnerbe434dc2019-11-05 00:51:22 +01004117 _Py_LeaveRecursiveCall(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004118 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00004119
Victor Stinner0b72b232020-03-12 23:18:39 +01004120 return _Py_CheckFunctionResult(tstate, NULL, retval, __func__);
Guido van Rossum374a9221991-04-04 10:40:29 +00004121}
4122
Benjamin Petersonb204a422011-06-05 22:04:07 -05004123static void
Victor Stinner438a12d2019-05-24 17:01:38 +02004124format_missing(PyThreadState *tstate, const char *kind,
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004125 PyCodeObject *co, PyObject *names, PyObject *qualname)
Benjamin Petersone109c702011-06-24 09:37:26 -05004126{
4127 int err;
4128 Py_ssize_t len = PyList_GET_SIZE(names);
4129 PyObject *name_str, *comma, *tail, *tmp;
4130
4131 assert(PyList_CheckExact(names));
4132 assert(len >= 1);
4133 /* Deal with the joys of natural language. */
4134 switch (len) {
4135 case 1:
4136 name_str = PyList_GET_ITEM(names, 0);
4137 Py_INCREF(name_str);
4138 break;
4139 case 2:
4140 name_str = PyUnicode_FromFormat("%U and %U",
4141 PyList_GET_ITEM(names, len - 2),
4142 PyList_GET_ITEM(names, len - 1));
4143 break;
4144 default:
4145 tail = PyUnicode_FromFormat(", %U, and %U",
4146 PyList_GET_ITEM(names, len - 2),
4147 PyList_GET_ITEM(names, len - 1));
Benjamin Petersond1ab6082012-06-01 11:18:22 -07004148 if (tail == NULL)
4149 return;
Benjamin Petersone109c702011-06-24 09:37:26 -05004150 /* Chop off the last two objects in the list. This shouldn't actually
4151 fail, but we can't be too careful. */
4152 err = PyList_SetSlice(names, len - 2, len, NULL);
4153 if (err == -1) {
4154 Py_DECREF(tail);
4155 return;
4156 }
4157 /* Stitch everything up into a nice comma-separated list. */
4158 comma = PyUnicode_FromString(", ");
4159 if (comma == NULL) {
4160 Py_DECREF(tail);
4161 return;
4162 }
4163 tmp = PyUnicode_Join(comma, names);
4164 Py_DECREF(comma);
4165 if (tmp == NULL) {
4166 Py_DECREF(tail);
4167 return;
4168 }
4169 name_str = PyUnicode_Concat(tmp, tail);
4170 Py_DECREF(tmp);
4171 Py_DECREF(tail);
4172 break;
4173 }
4174 if (name_str == NULL)
4175 return;
Victor Stinner438a12d2019-05-24 17:01:38 +02004176 _PyErr_Format(tstate, PyExc_TypeError,
4177 "%U() missing %i required %s argument%s: %U",
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004178 qualname,
Victor Stinner438a12d2019-05-24 17:01:38 +02004179 len,
4180 kind,
4181 len == 1 ? "" : "s",
4182 name_str);
Benjamin Petersone109c702011-06-24 09:37:26 -05004183 Py_DECREF(name_str);
4184}
4185
4186static void
Victor Stinner438a12d2019-05-24 17:01:38 +02004187missing_arguments(PyThreadState *tstate, PyCodeObject *co,
4188 Py_ssize_t missing, Py_ssize_t defcount,
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004189 PyObject **fastlocals, PyObject *qualname)
Benjamin Petersone109c702011-06-24 09:37:26 -05004190{
Victor Stinner74319ae2016-08-25 00:04:09 +02004191 Py_ssize_t i, j = 0;
4192 Py_ssize_t start, end;
4193 int positional = (defcount != -1);
Benjamin Petersone109c702011-06-24 09:37:26 -05004194 const char *kind = positional ? "positional" : "keyword-only";
4195 PyObject *missing_names;
4196
4197 /* Compute the names of the arguments that are missing. */
4198 missing_names = PyList_New(missing);
4199 if (missing_names == NULL)
4200 return;
4201 if (positional) {
4202 start = 0;
Pablo Galindocd74e662019-06-01 18:08:04 +01004203 end = co->co_argcount - defcount;
Benjamin Petersone109c702011-06-24 09:37:26 -05004204 }
4205 else {
Pablo Galindocd74e662019-06-01 18:08:04 +01004206 start = co->co_argcount;
Benjamin Petersone109c702011-06-24 09:37:26 -05004207 end = start + co->co_kwonlyargcount;
4208 }
4209 for (i = start; i < end; i++) {
4210 if (GETLOCAL(i) == NULL) {
4211 PyObject *raw = PyTuple_GET_ITEM(co->co_varnames, i);
4212 PyObject *name = PyObject_Repr(raw);
4213 if (name == NULL) {
4214 Py_DECREF(missing_names);
4215 return;
4216 }
4217 PyList_SET_ITEM(missing_names, j++, name);
4218 }
4219 }
4220 assert(j == missing);
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004221 format_missing(tstate, kind, co, missing_names, qualname);
Benjamin Petersone109c702011-06-24 09:37:26 -05004222 Py_DECREF(missing_names);
4223}
4224
4225static void
Victor Stinner438a12d2019-05-24 17:01:38 +02004226too_many_positional(PyThreadState *tstate, PyCodeObject *co,
4227 Py_ssize_t given, Py_ssize_t defcount,
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004228 PyObject **fastlocals, PyObject *qualname)
Benjamin Petersonb204a422011-06-05 22:04:07 -05004229{
4230 int plural;
Victor Stinner74319ae2016-08-25 00:04:09 +02004231 Py_ssize_t kwonly_given = 0;
4232 Py_ssize_t i;
Benjamin Petersonb204a422011-06-05 22:04:07 -05004233 PyObject *sig, *kwonly_sig;
Victor Stinner74319ae2016-08-25 00:04:09 +02004234 Py_ssize_t co_argcount = co->co_argcount;
Benjamin Petersonb204a422011-06-05 22:04:07 -05004235
Benjamin Petersone109c702011-06-24 09:37:26 -05004236 assert((co->co_flags & CO_VARARGS) == 0);
4237 /* Count missing keyword-only args. */
Pablo Galindocd74e662019-06-01 18:08:04 +01004238 for (i = co_argcount; i < co_argcount + co->co_kwonlyargcount; i++) {
Victor Stinner74319ae2016-08-25 00:04:09 +02004239 if (GETLOCAL(i) != NULL) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004240 kwonly_given++;
Victor Stinner74319ae2016-08-25 00:04:09 +02004241 }
4242 }
Benjamin Petersone109c702011-06-24 09:37:26 -05004243 if (defcount) {
Pablo Galindocd74e662019-06-01 18:08:04 +01004244 Py_ssize_t atleast = co_argcount - defcount;
Benjamin Petersonb204a422011-06-05 22:04:07 -05004245 plural = 1;
Pablo Galindocd74e662019-06-01 18:08:04 +01004246 sig = PyUnicode_FromFormat("from %zd to %zd", atleast, co_argcount);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004247 }
4248 else {
Pablo Galindocd74e662019-06-01 18:08:04 +01004249 plural = (co_argcount != 1);
4250 sig = PyUnicode_FromFormat("%zd", co_argcount);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004251 }
4252 if (sig == NULL)
4253 return;
4254 if (kwonly_given) {
Victor Stinner74319ae2016-08-25 00:04:09 +02004255 const char *format = " positional argument%s (and %zd keyword-only argument%s)";
4256 kwonly_sig = PyUnicode_FromFormat(format,
4257 given != 1 ? "s" : "",
4258 kwonly_given,
4259 kwonly_given != 1 ? "s" : "");
Benjamin Petersonb204a422011-06-05 22:04:07 -05004260 if (kwonly_sig == NULL) {
4261 Py_DECREF(sig);
4262 return;
4263 }
4264 }
4265 else {
4266 /* This will not fail. */
4267 kwonly_sig = PyUnicode_FromString("");
Benjamin Petersone109c702011-06-24 09:37:26 -05004268 assert(kwonly_sig != NULL);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004269 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004270 _PyErr_Format(tstate, PyExc_TypeError,
4271 "%U() takes %U positional argument%s but %zd%U %s given",
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004272 qualname,
Victor Stinner438a12d2019-05-24 17:01:38 +02004273 sig,
4274 plural ? "s" : "",
4275 given,
4276 kwonly_sig,
4277 given == 1 && !kwonly_given ? "was" : "were");
Benjamin Petersonb204a422011-06-05 22:04:07 -05004278 Py_DECREF(sig);
4279 Py_DECREF(kwonly_sig);
4280}
4281
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004282static int
Victor Stinner438a12d2019-05-24 17:01:38 +02004283positional_only_passed_as_keyword(PyThreadState *tstate, PyCodeObject *co,
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004284 Py_ssize_t kwcount, PyObject* const* kwnames,
4285 PyObject *qualname)
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004286{
4287 int posonly_conflicts = 0;
4288 PyObject* posonly_names = PyList_New(0);
4289
4290 for(int k=0; k < co->co_posonlyargcount; k++){
4291 PyObject* posonly_name = PyTuple_GET_ITEM(co->co_varnames, k);
4292
4293 for (int k2=0; k2<kwcount; k2++){
4294 /* Compare the pointers first and fallback to PyObject_RichCompareBool*/
4295 PyObject* kwname = kwnames[k2];
4296 if (kwname == posonly_name){
4297 if(PyList_Append(posonly_names, kwname) != 0) {
4298 goto fail;
4299 }
4300 posonly_conflicts++;
4301 continue;
4302 }
4303
4304 int cmp = PyObject_RichCompareBool(posonly_name, kwname, Py_EQ);
4305
4306 if ( cmp > 0) {
4307 if(PyList_Append(posonly_names, kwname) != 0) {
4308 goto fail;
4309 }
4310 posonly_conflicts++;
4311 } else if (cmp < 0) {
4312 goto fail;
4313 }
4314
4315 }
4316 }
4317 if (posonly_conflicts) {
4318 PyObject* comma = PyUnicode_FromString(", ");
4319 if (comma == NULL) {
4320 goto fail;
4321 }
4322 PyObject* error_names = PyUnicode_Join(comma, posonly_names);
4323 Py_DECREF(comma);
4324 if (error_names == NULL) {
4325 goto fail;
4326 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004327 _PyErr_Format(tstate, PyExc_TypeError,
4328 "%U() got some positional-only arguments passed"
4329 " as keyword arguments: '%U'",
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004330 qualname, error_names);
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004331 Py_DECREF(error_names);
4332 goto fail;
4333 }
4334
4335 Py_DECREF(posonly_names);
4336 return 0;
4337
4338fail:
4339 Py_XDECREF(posonly_names);
4340 return 1;
4341
4342}
4343
Guido van Rossumc2e20742006-02-27 22:32:47 +00004344/* This is gonna seem *real weird*, but if you put some other code between
Marcel Plch3a9ccee2018-04-06 23:22:04 +02004345 PyEval_EvalFrame() and _PyEval_EvalFrameDefault() you will need to adjust
Guido van Rossumc2e20742006-02-27 22:32:47 +00004346 the test in the if statements in Misc/gdbinit (pystack and pystackv). */
Skip Montanaro786ea6b2004-03-01 15:44:05 +00004347
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01004348PyObject *
Victor Stinnerb5e170f2019-11-16 01:03:22 +01004349_PyEval_EvalCode(PyThreadState *tstate,
4350 PyObject *_co, PyObject *globals, PyObject *locals,
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02004351 PyObject *const *args, Py_ssize_t argcount,
4352 PyObject *const *kwnames, PyObject *const *kwargs,
Serhiy Storchakab7281052016-09-12 00:52:40 +03004353 Py_ssize_t kwcount, int kwstep,
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02004354 PyObject *const *defs, Py_ssize_t defcount,
Victor Stinner74319ae2016-08-25 00:04:09 +02004355 PyObject *kwdefs, PyObject *closure,
Victor Stinner40ee3012014-06-16 15:59:28 +02004356 PyObject *name, PyObject *qualname)
Tim Peters5ca576e2001-06-18 22:08:13 +00004357{
Victor Stinnerda2914d2020-03-20 09:29:08 +01004358 assert(is_tstate_valid(tstate));
Victor Stinnerb5e170f2019-11-16 01:03:22 +01004359
Victor Stinner232dda62020-06-04 15:19:02 +02004360 PyCodeObject *co = (PyCodeObject*)_co;
4361
4362 if (!name) {
4363 name = co->co_name;
4364 }
4365 assert(name != NULL);
4366 assert(PyUnicode_Check(name));
4367
4368 if (!qualname) {
4369 qualname = name;
4370 }
4371 assert(qualname != NULL);
4372 assert(PyUnicode_Check(qualname));
4373
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02004374 PyObject *retval = NULL;
Pablo Galindocd74e662019-06-01 18:08:04 +01004375 const Py_ssize_t total_args = co->co_argcount + co->co_kwonlyargcount;
Tim Peters5ca576e2001-06-18 22:08:13 +00004376
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004377 if (globals == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004378 _PyErr_SetString(tstate, PyExc_SystemError,
4379 "PyEval_EvalCodeEx: NULL globals");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004380 return NULL;
4381 }
Tim Peters5ca576e2001-06-18 22:08:13 +00004382
Victor Stinnerc7020012016-08-16 23:40:29 +02004383 /* Create the frame */
Victor Stinner232dda62020-06-04 15:19:02 +02004384 PyFrameObject *f = _PyFrame_New_NoTrack(tstate, co, globals, locals);
Victor Stinnerc7020012016-08-16 23:40:29 +02004385 if (f == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004386 return NULL;
Victor Stinnerc7020012016-08-16 23:40:29 +02004387 }
Victor Stinner232dda62020-06-04 15:19:02 +02004388 PyObject **fastlocals = f->f_localsplus;
4389 PyObject **freevars = f->f_localsplus + co->co_nlocals;
Tim Peters5ca576e2001-06-18 22:08:13 +00004390
Victor Stinnerc7020012016-08-16 23:40:29 +02004391 /* Create a dictionary for keyword parameters (**kwags) */
Victor Stinner232dda62020-06-04 15:19:02 +02004392 PyObject *kwdict;
4393 Py_ssize_t i;
Benjamin Petersonb204a422011-06-05 22:04:07 -05004394 if (co->co_flags & CO_VARKEYWORDS) {
4395 kwdict = PyDict_New();
4396 if (kwdict == NULL)
4397 goto fail;
4398 i = total_args;
Victor Stinnerc7020012016-08-16 23:40:29 +02004399 if (co->co_flags & CO_VARARGS) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004400 i++;
Victor Stinnerc7020012016-08-16 23:40:29 +02004401 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004402 SETLOCAL(i, kwdict);
4403 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004404 else {
4405 kwdict = NULL;
4406 }
4407
Pablo Galindocd74e662019-06-01 18:08:04 +01004408 /* Copy all positional arguments into local variables */
Victor Stinner232dda62020-06-04 15:19:02 +02004409 Py_ssize_t j, n;
Pablo Galindocd74e662019-06-01 18:08:04 +01004410 if (argcount > co->co_argcount) {
4411 n = co->co_argcount;
Victor Stinnerc7020012016-08-16 23:40:29 +02004412 }
4413 else {
4414 n = argcount;
4415 }
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004416 for (j = 0; j < n; j++) {
Victor Stinner232dda62020-06-04 15:19:02 +02004417 PyObject *x = args[j];
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004418 Py_INCREF(x);
4419 SETLOCAL(j, x);
4420 }
4421
Victor Stinnerc7020012016-08-16 23:40:29 +02004422 /* Pack other positional arguments into the *args argument */
Benjamin Petersonb204a422011-06-05 22:04:07 -05004423 if (co->co_flags & CO_VARARGS) {
Victor Stinner232dda62020-06-04 15:19:02 +02004424 PyObject *u = _PyTuple_FromArray(args + n, argcount - n);
Victor Stinnerc7020012016-08-16 23:40:29 +02004425 if (u == NULL) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004426 goto fail;
Victor Stinnerc7020012016-08-16 23:40:29 +02004427 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004428 SETLOCAL(total_args, u);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004429 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004430
Serhiy Storchakab7281052016-09-12 00:52:40 +03004431 /* Handle keyword arguments passed as two strided arrays */
4432 kwcount *= kwstep;
4433 for (i = 0; i < kwcount; i += kwstep) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004434 PyObject **co_varnames;
Serhiy Storchakab7281052016-09-12 00:52:40 +03004435 PyObject *keyword = kwnames[i];
4436 PyObject *value = kwargs[i];
Victor Stinner17061a92016-08-16 23:39:42 +02004437 Py_ssize_t j;
Victor Stinnerc7020012016-08-16 23:40:29 +02004438
Benjamin Petersonb204a422011-06-05 22:04:07 -05004439 if (keyword == NULL || !PyUnicode_Check(keyword)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004440 _PyErr_Format(tstate, PyExc_TypeError,
4441 "%U() keywords must be strings",
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004442 qualname);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004443 goto fail;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004444 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004445
Benjamin Petersonb204a422011-06-05 22:04:07 -05004446 /* Speed hack: do raw pointer compares. As names are
4447 normally interned this should almost always hit. */
4448 co_varnames = ((PyTupleObject *)(co->co_varnames))->ob_item;
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004449 for (j = co->co_posonlyargcount; j < total_args; j++) {
Victor Stinner232dda62020-06-04 15:19:02 +02004450 PyObject *varname = co_varnames[j];
4451 if (varname == keyword) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004452 goto kw_found;
Victor Stinner6fea7f72016-08-22 23:17:30 +02004453 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004454 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004455
Benjamin Petersonb204a422011-06-05 22:04:07 -05004456 /* Slow fallback, just in case */
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004457 for (j = co->co_posonlyargcount; j < total_args; j++) {
Victor Stinner232dda62020-06-04 15:19:02 +02004458 PyObject *varname = co_varnames[j];
4459 int cmp = PyObject_RichCompareBool( keyword, varname, Py_EQ);
Victor Stinner6fea7f72016-08-22 23:17:30 +02004460 if (cmp > 0) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004461 goto kw_found;
Victor Stinner6fea7f72016-08-22 23:17:30 +02004462 }
4463 else if (cmp < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004464 goto fail;
Victor Stinner6fea7f72016-08-22 23:17:30 +02004465 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004466 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004467
Victor Stinner231d1f32017-01-11 02:12:06 +01004468 assert(j >= total_args);
4469 if (kwdict == NULL) {
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004470
Victor Stinner438a12d2019-05-24 17:01:38 +02004471 if (co->co_posonlyargcount
4472 && positional_only_passed_as_keyword(tstate, co,
Victor Stinner232dda62020-06-04 15:19:02 +02004473 kwcount, kwnames,
4474 qualname))
Victor Stinner438a12d2019-05-24 17:01:38 +02004475 {
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004476 goto fail;
4477 }
4478
Victor Stinner438a12d2019-05-24 17:01:38 +02004479 _PyErr_Format(tstate, PyExc_TypeError,
4480 "%U() got an unexpected keyword argument '%S'",
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004481 qualname, keyword);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004482 goto fail;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004483 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004484
Christian Heimes0bd447f2013-07-20 14:48:10 +02004485 if (PyDict_SetItem(kwdict, keyword, value) == -1) {
4486 goto fail;
4487 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004488 continue;
Victor Stinnerc7020012016-08-16 23:40:29 +02004489
Benjamin Petersonb204a422011-06-05 22:04:07 -05004490 kw_found:
4491 if (GETLOCAL(j) != NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004492 _PyErr_Format(tstate, PyExc_TypeError,
4493 "%U() got multiple values for argument '%S'",
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004494 qualname, keyword);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004495 goto fail;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004496 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004497 Py_INCREF(value);
4498 SETLOCAL(j, value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004499 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004500
4501 /* Check the number of positional arguments */
Pablo Galindocd74e662019-06-01 18:08:04 +01004502 if ((argcount > co->co_argcount) && !(co->co_flags & CO_VARARGS)) {
Victor Stinner232dda62020-06-04 15:19:02 +02004503 too_many_positional(tstate, co, argcount, defcount, fastlocals,
4504 qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004505 goto fail;
4506 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004507
4508 /* Add missing positional arguments (copy default values from defs) */
Pablo Galindocd74e662019-06-01 18:08:04 +01004509 if (argcount < co->co_argcount) {
4510 Py_ssize_t m = co->co_argcount - defcount;
Victor Stinner17061a92016-08-16 23:39:42 +02004511 Py_ssize_t missing = 0;
4512 for (i = argcount; i < m; i++) {
4513 if (GETLOCAL(i) == NULL) {
Benjamin Petersone109c702011-06-24 09:37:26 -05004514 missing++;
Victor Stinner17061a92016-08-16 23:39:42 +02004515 }
4516 }
Benjamin Petersone109c702011-06-24 09:37:26 -05004517 if (missing) {
Victor Stinner232dda62020-06-04 15:19:02 +02004518 missing_arguments(tstate, co, missing, defcount, fastlocals,
4519 qualname);
Benjamin Petersone109c702011-06-24 09:37:26 -05004520 goto fail;
Benjamin Petersonb204a422011-06-05 22:04:07 -05004521 }
4522 if (n > m)
4523 i = n - m;
4524 else
4525 i = 0;
4526 for (; i < defcount; i++) {
4527 if (GETLOCAL(m+i) == NULL) {
4528 PyObject *def = defs[i];
4529 Py_INCREF(def);
4530 SETLOCAL(m+i, def);
4531 }
4532 }
4533 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004534
4535 /* Add missing keyword arguments (copy default values from kwdefs) */
Benjamin Petersonb204a422011-06-05 22:04:07 -05004536 if (co->co_kwonlyargcount > 0) {
Victor Stinner17061a92016-08-16 23:39:42 +02004537 Py_ssize_t missing = 0;
Pablo Galindocd74e662019-06-01 18:08:04 +01004538 for (i = co->co_argcount; i < total_args; i++) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004539 if (GETLOCAL(i) != NULL)
4540 continue;
Victor Stinner232dda62020-06-04 15:19:02 +02004541 PyObject *varname = PyTuple_GET_ITEM(co->co_varnames, i);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004542 if (kwdefs != NULL) {
Victor Stinner232dda62020-06-04 15:19:02 +02004543 PyObject *def = PyDict_GetItemWithError(kwdefs, varname);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004544 if (def) {
4545 Py_INCREF(def);
4546 SETLOCAL(i, def);
4547 continue;
4548 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004549 else if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02004550 goto fail;
4551 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004552 }
Benjamin Petersone109c702011-06-24 09:37:26 -05004553 missing++;
4554 }
4555 if (missing) {
Victor Stinner232dda62020-06-04 15:19:02 +02004556 missing_arguments(tstate, co, missing, -1, fastlocals,
4557 qualname);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004558 goto fail;
4559 }
4560 }
4561
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004562 /* Allocate and initialize storage for cell vars, and copy free
Benjamin Peterson90037602011-06-25 22:54:45 -05004563 vars into frame. */
4564 for (i = 0; i < PyTuple_GET_SIZE(co->co_cellvars); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004565 PyObject *c;
Serhiy Storchaka5bb8b912016-12-16 19:19:02 +02004566 Py_ssize_t arg;
Benjamin Peterson90037602011-06-25 22:54:45 -05004567 /* Possibly account for the cell variable being an argument. */
4568 if (co->co_cell2arg != NULL &&
Guido van Rossum6832c812013-05-10 08:47:42 -07004569 (arg = co->co_cell2arg[i]) != CO_CELL_NOT_AN_ARG) {
Benjamin Peterson90037602011-06-25 22:54:45 -05004570 c = PyCell_New(GETLOCAL(arg));
Benjamin Peterson159ae412013-05-12 18:16:06 -05004571 /* Clear the local copy. */
4572 SETLOCAL(arg, NULL);
Guido van Rossum6832c812013-05-10 08:47:42 -07004573 }
4574 else {
Benjamin Peterson90037602011-06-25 22:54:45 -05004575 c = PyCell_New(NULL);
Guido van Rossum6832c812013-05-10 08:47:42 -07004576 }
Benjamin Peterson159ae412013-05-12 18:16:06 -05004577 if (c == NULL)
4578 goto fail;
Benjamin Peterson90037602011-06-25 22:54:45 -05004579 SETLOCAL(co->co_nlocals + i, c);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004580 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004581
4582 /* Copy closure variables to free variables */
Benjamin Peterson90037602011-06-25 22:54:45 -05004583 for (i = 0; i < PyTuple_GET_SIZE(co->co_freevars); ++i) {
4584 PyObject *o = PyTuple_GET_ITEM(closure, i);
4585 Py_INCREF(o);
4586 freevars[PyTuple_GET_SIZE(co->co_cellvars) + i] = o;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004587 }
Tim Peters5ca576e2001-06-18 22:08:13 +00004588
Yury Selivanoveb636452016-09-08 22:01:51 -07004589 /* Handle generator/coroutine/asynchronous generator */
4590 if (co->co_flags & (CO_GENERATOR | CO_COROUTINE | CO_ASYNC_GENERATOR)) {
Yury Selivanov75445082015-05-11 22:57:16 -04004591 PyObject *gen;
Yury Selivanov5376ba92015-06-22 12:19:30 -04004592 int is_coro = co->co_flags & CO_COROUTINE;
Yury Selivanov94c22632015-06-04 10:16:51 -04004593
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004594 /* Don't need to keep the reference to f_back, it will be set
4595 * when the generator is resumed. */
Serhiy Storchaka505ff752014-02-09 13:33:53 +02004596 Py_CLEAR(f->f_back);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00004597
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004598 /* Create a new generator that owns the ready to run frame
4599 * and return that as the value. */
Yury Selivanov5376ba92015-06-22 12:19:30 -04004600 if (is_coro) {
4601 gen = PyCoro_New(f, name, qualname);
Yury Selivanoveb636452016-09-08 22:01:51 -07004602 } else if (co->co_flags & CO_ASYNC_GENERATOR) {
4603 gen = PyAsyncGen_New(f, name, qualname);
Yury Selivanov5376ba92015-06-22 12:19:30 -04004604 } else {
4605 gen = PyGen_NewWithQualName(f, name, qualname);
4606 }
INADA Naoki6a3cedf2016-12-26 18:01:46 +09004607 if (gen == NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04004608 return NULL;
INADA Naoki6a3cedf2016-12-26 18:01:46 +09004609 }
INADA Naoki9c157762016-12-26 18:52:46 +09004610
INADA Naoki6a3cedf2016-12-26 18:01:46 +09004611 _PyObject_GC_TRACK(f);
Yury Selivanov75445082015-05-11 22:57:16 -04004612
Yury Selivanov75445082015-05-11 22:57:16 -04004613 return gen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004614 }
Tim Peters5ca576e2001-06-18 22:08:13 +00004615
Victor Stinnerb9e68122019-11-14 12:20:46 +01004616 retval = _PyEval_EvalFrame(tstate, f, 0);
Tim Peters5ca576e2001-06-18 22:08:13 +00004617
Thomas Woutersce272b62007-09-19 21:19:28 +00004618fail: /* Jump here from prelude on failure */
Tim Peters5ca576e2001-06-18 22:08:13 +00004619
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004620 /* decref'ing the frame can cause __del__ methods to get invoked,
4621 which can call back into Python. While we're done with the
4622 current Python frame (f), the associated C stack is still in use,
4623 so recursion_depth must be boosted for the duration.
4624 */
INADA Naoki5a625d02016-12-24 20:19:08 +09004625 if (Py_REFCNT(f) > 1) {
4626 Py_DECREF(f);
4627 _PyObject_GC_TRACK(f);
4628 }
4629 else {
4630 ++tstate->recursion_depth;
4631 Py_DECREF(f);
4632 --tstate->recursion_depth;
4633 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004634 return retval;
Tim Peters5ca576e2001-06-18 22:08:13 +00004635}
4636
Victor Stinnerb5e170f2019-11-16 01:03:22 +01004637
4638PyObject *
4639_PyEval_EvalCodeWithName(PyObject *_co, PyObject *globals, PyObject *locals,
4640 PyObject *const *args, Py_ssize_t argcount,
4641 PyObject *const *kwnames, PyObject *const *kwargs,
4642 Py_ssize_t kwcount, int kwstep,
4643 PyObject *const *defs, Py_ssize_t defcount,
4644 PyObject *kwdefs, PyObject *closure,
4645 PyObject *name, PyObject *qualname)
4646{
4647 PyThreadState *tstate = _PyThreadState_GET();
4648 return _PyEval_EvalCode(tstate, _co, globals, locals,
4649 args, argcount,
4650 kwnames, kwargs,
4651 kwcount, kwstep,
4652 defs, defcount,
4653 kwdefs, closure,
4654 name, qualname);
4655}
4656
Victor Stinner40ee3012014-06-16 15:59:28 +02004657PyObject *
4658PyEval_EvalCodeEx(PyObject *_co, PyObject *globals, PyObject *locals,
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02004659 PyObject *const *args, int argcount,
4660 PyObject *const *kws, int kwcount,
4661 PyObject *const *defs, int defcount,
4662 PyObject *kwdefs, PyObject *closure)
Victor Stinner40ee3012014-06-16 15:59:28 +02004663{
4664 return _PyEval_EvalCodeWithName(_co, globals, locals,
Victor Stinner9be7e7b2016-08-19 16:11:43 +02004665 args, argcount,
Zackery Spytzc6ea8972017-07-31 08:24:37 -06004666 kws, kws != NULL ? kws + 1 : NULL,
4667 kwcount, 2,
Victor Stinner9be7e7b2016-08-19 16:11:43 +02004668 defs, defcount,
4669 kwdefs, closure,
Victor Stinner40ee3012014-06-16 15:59:28 +02004670 NULL, NULL);
4671}
Tim Peters5ca576e2001-06-18 22:08:13 +00004672
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004673static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02004674special_lookup(PyThreadState *tstate, PyObject *o, _Py_Identifier *id)
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004675{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004676 PyObject *res;
Benjamin Petersonce798522012-01-22 11:24:29 -05004677 res = _PyObject_LookupSpecial(o, id);
Victor Stinner438a12d2019-05-24 17:01:38 +02004678 if (res == NULL && !_PyErr_Occurred(tstate)) {
Victor Stinner4804b5b2020-05-12 01:43:38 +02004679 _PyErr_SetObject(tstate, PyExc_AttributeError, _PyUnicode_FromId(id));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004680 return NULL;
4681 }
4682 return res;
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004683}
4684
4685
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00004686/* Logic for the raise statement (too complicated for inlining).
4687 This *consumes* a reference count to each of its arguments. */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004688static int
Victor Stinner09532fe2019-05-10 23:39:09 +02004689do_raise(PyThreadState *tstate, PyObject *exc, PyObject *cause)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00004690{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004691 PyObject *type = NULL, *value = NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00004692
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004693 if (exc == NULL) {
4694 /* Reraise */
Mark Shannonae3087c2017-10-22 22:41:51 +01004695 _PyErr_StackItem *exc_info = _PyErr_GetTopmostException(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004696 PyObject *tb;
Mark Shannonae3087c2017-10-22 22:41:51 +01004697 type = exc_info->exc_type;
4698 value = exc_info->exc_value;
4699 tb = exc_info->exc_traceback;
Victor Stinnereec93312016-08-18 18:13:10 +02004700 if (type == Py_None || type == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004701 _PyErr_SetString(tstate, PyExc_RuntimeError,
4702 "No active exception to reraise");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004703 return 0;
4704 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004705 Py_XINCREF(type);
4706 Py_XINCREF(value);
4707 Py_XINCREF(tb);
Victor Stinner438a12d2019-05-24 17:01:38 +02004708 _PyErr_Restore(tstate, type, value, tb);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004709 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004710 }
Guido van Rossumac7be682001-01-17 15:42:30 +00004711
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004712 /* We support the following forms of raise:
4713 raise
Collin Winter828f04a2007-08-31 00:04:24 +00004714 raise <instance>
4715 raise <type> */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00004716
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004717 if (PyExceptionClass_Check(exc)) {
4718 type = exc;
Victor Stinnera5ed5f02016-12-06 18:45:50 +01004719 value = _PyObject_CallNoArg(exc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004720 if (value == NULL)
4721 goto raise_error;
Benjamin Peterson5afa03a2011-07-15 14:09:26 -05004722 if (!PyExceptionInstance_Check(value)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004723 _PyErr_Format(tstate, PyExc_TypeError,
4724 "calling %R should have returned an instance of "
4725 "BaseException, not %R",
4726 type, Py_TYPE(value));
4727 goto raise_error;
Benjamin Peterson5afa03a2011-07-15 14:09:26 -05004728 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004729 }
4730 else if (PyExceptionInstance_Check(exc)) {
4731 value = exc;
4732 type = PyExceptionInstance_Class(exc);
4733 Py_INCREF(type);
4734 }
4735 else {
4736 /* Not something you can raise. You get an exception
4737 anyway, just not what you specified :-) */
4738 Py_DECREF(exc);
Victor Stinner438a12d2019-05-24 17:01:38 +02004739 _PyErr_SetString(tstate, PyExc_TypeError,
4740 "exceptions must derive from BaseException");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004741 goto raise_error;
4742 }
Collin Winter828f04a2007-08-31 00:04:24 +00004743
Serhiy Storchakac0191582016-09-27 11:37:10 +03004744 assert(type != NULL);
4745 assert(value != NULL);
4746
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004747 if (cause) {
4748 PyObject *fixed_cause;
4749 if (PyExceptionClass_Check(cause)) {
Victor Stinnera5ed5f02016-12-06 18:45:50 +01004750 fixed_cause = _PyObject_CallNoArg(cause);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004751 if (fixed_cause == NULL)
4752 goto raise_error;
Benjamin Petersond5a1c442012-05-14 22:09:31 -07004753 Py_DECREF(cause);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004754 }
Benjamin Petersond5a1c442012-05-14 22:09:31 -07004755 else if (PyExceptionInstance_Check(cause)) {
4756 fixed_cause = cause;
4757 }
4758 else if (cause == Py_None) {
4759 Py_DECREF(cause);
4760 fixed_cause = NULL;
4761 }
4762 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02004763 _PyErr_SetString(tstate, PyExc_TypeError,
4764 "exception causes must derive from "
4765 "BaseException");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004766 goto raise_error;
4767 }
Benjamin Petersond5a1c442012-05-14 22:09:31 -07004768 PyException_SetCause(value, fixed_cause);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004769 }
Collin Winter828f04a2007-08-31 00:04:24 +00004770
Victor Stinner438a12d2019-05-24 17:01:38 +02004771 _PyErr_SetObject(tstate, type, value);
Victor Stinner61f4db82020-01-28 03:37:45 +01004772 /* _PyErr_SetObject incref's its arguments */
Serhiy Storchakac0191582016-09-27 11:37:10 +03004773 Py_DECREF(value);
4774 Py_DECREF(type);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004775 return 0;
Collin Winter828f04a2007-08-31 00:04:24 +00004776
4777raise_error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004778 Py_XDECREF(value);
4779 Py_XDECREF(type);
4780 Py_XDECREF(cause);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004781 return 0;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00004782}
4783
Tim Petersd6d010b2001-06-21 02:49:55 +00004784/* Iterate v argcnt times and store the results on the stack (via decreasing
Guido van Rossum0368b722007-05-11 16:50:42 +00004785 sp). Return 1 for success, 0 if error.
Antoine Pitrou9a2310d2008-07-25 22:39:39 +00004786
Guido van Rossum0368b722007-05-11 16:50:42 +00004787 If argcntafter == -1, do a simple unpack. If it is >= 0, do an unpack
4788 with a variable target.
4789*/
Tim Petersd6d010b2001-06-21 02:49:55 +00004790
Barry Warsawe42b18f1997-08-25 22:13:04 +00004791static int
Victor Stinner438a12d2019-05-24 17:01:38 +02004792unpack_iterable(PyThreadState *tstate, PyObject *v,
4793 int argcnt, int argcntafter, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00004794{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004795 int i = 0, j = 0;
4796 Py_ssize_t ll = 0;
4797 PyObject *it; /* iter(v) */
4798 PyObject *w;
4799 PyObject *l = NULL; /* variable list */
Guido van Rossumac7be682001-01-17 15:42:30 +00004800
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004801 assert(v != NULL);
Tim Petersd6d010b2001-06-21 02:49:55 +00004802
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004803 it = PyObject_GetIter(v);
Serhiy Storchaka13a6c092017-12-26 12:30:41 +02004804 if (it == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004805 if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError) &&
Victor Stinnera102ed72020-02-07 02:24:48 +01004806 Py_TYPE(v)->tp_iter == NULL && !PySequence_Check(v))
Serhiy Storchaka13a6c092017-12-26 12:30:41 +02004807 {
Victor Stinner438a12d2019-05-24 17:01:38 +02004808 _PyErr_Format(tstate, PyExc_TypeError,
4809 "cannot unpack non-iterable %.200s object",
Victor Stinnera102ed72020-02-07 02:24:48 +01004810 Py_TYPE(v)->tp_name);
Serhiy Storchaka13a6c092017-12-26 12:30:41 +02004811 }
4812 return 0;
4813 }
Tim Petersd6d010b2001-06-21 02:49:55 +00004814
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004815 for (; i < argcnt; i++) {
4816 w = PyIter_Next(it);
4817 if (w == NULL) {
4818 /* Iterator done, via error or exhaustion. */
Victor Stinner438a12d2019-05-24 17:01:38 +02004819 if (!_PyErr_Occurred(tstate)) {
R David Murray4171bbe2015-04-15 17:08:45 -04004820 if (argcntafter == -1) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004821 _PyErr_Format(tstate, PyExc_ValueError,
4822 "not enough values to unpack "
4823 "(expected %d, got %d)",
4824 argcnt, i);
R David Murray4171bbe2015-04-15 17:08:45 -04004825 }
4826 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02004827 _PyErr_Format(tstate, PyExc_ValueError,
4828 "not enough values to unpack "
4829 "(expected at least %d, got %d)",
4830 argcnt + argcntafter, i);
R David Murray4171bbe2015-04-15 17:08:45 -04004831 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004832 }
4833 goto Error;
4834 }
4835 *--sp = w;
4836 }
Tim Petersd6d010b2001-06-21 02:49:55 +00004837
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004838 if (argcntafter == -1) {
4839 /* We better have exhausted the iterator now. */
4840 w = PyIter_Next(it);
4841 if (w == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004842 if (_PyErr_Occurred(tstate))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004843 goto Error;
4844 Py_DECREF(it);
4845 return 1;
4846 }
4847 Py_DECREF(w);
Victor Stinner438a12d2019-05-24 17:01:38 +02004848 _PyErr_Format(tstate, PyExc_ValueError,
4849 "too many values to unpack (expected %d)",
4850 argcnt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004851 goto Error;
4852 }
Guido van Rossum0368b722007-05-11 16:50:42 +00004853
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004854 l = PySequence_List(it);
4855 if (l == NULL)
4856 goto Error;
4857 *--sp = l;
4858 i++;
Guido van Rossum0368b722007-05-11 16:50:42 +00004859
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004860 ll = PyList_GET_SIZE(l);
4861 if (ll < argcntafter) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004862 _PyErr_Format(tstate, PyExc_ValueError,
R David Murray4171bbe2015-04-15 17:08:45 -04004863 "not enough values to unpack (expected at least %d, got %zd)",
4864 argcnt + argcntafter, argcnt + ll);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004865 goto Error;
4866 }
Guido van Rossum0368b722007-05-11 16:50:42 +00004867
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004868 /* Pop the "after-variable" args off the list. */
4869 for (j = argcntafter; j > 0; j--, i++) {
4870 *--sp = PyList_GET_ITEM(l, ll - j);
4871 }
4872 /* Resize the list. */
Victor Stinner60ac6ed2020-02-07 23:18:08 +01004873 Py_SET_SIZE(l, ll - argcntafter);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004874 Py_DECREF(it);
4875 return 1;
Guido van Rossum0368b722007-05-11 16:50:42 +00004876
Tim Petersd6d010b2001-06-21 02:49:55 +00004877Error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004878 for (; i > 0; i--, sp++)
4879 Py_DECREF(*sp);
4880 Py_XDECREF(it);
4881 return 0;
Barry Warsawe42b18f1997-08-25 22:13:04 +00004882}
4883
4884
Guido van Rossum96a42c81992-01-12 02:29:51 +00004885#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00004886static int
Victor Stinner438a12d2019-05-24 17:01:38 +02004887prtrace(PyThreadState *tstate, PyObject *v, const char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004888{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004889 printf("%s ", str);
Victor Stinner438a12d2019-05-24 17:01:38 +02004890 if (PyObject_Print(v, stdout, 0) != 0) {
4891 /* Don't know what else to do */
4892 _PyErr_Clear(tstate);
4893 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004894 printf("\n");
4895 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004896}
Guido van Rossum3f5da241990-12-20 15:06:42 +00004897#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004898
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00004899static void
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004900call_exc_trace(Py_tracefunc func, PyObject *self,
4901 PyThreadState *tstate, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00004902{
Victor Stinneraaa8ed82013-07-10 13:57:55 +02004903 PyObject *type, *value, *traceback, *orig_traceback, *arg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004904 int err;
Victor Stinner438a12d2019-05-24 17:01:38 +02004905 _PyErr_Fetch(tstate, &type, &value, &orig_traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004906 if (value == NULL) {
4907 value = Py_None;
4908 Py_INCREF(value);
4909 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004910 _PyErr_NormalizeException(tstate, &type, &value, &orig_traceback);
Antoine Pitrou89335212013-11-23 14:05:23 +01004911 traceback = (orig_traceback != NULL) ? orig_traceback : Py_None;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004912 arg = PyTuple_Pack(3, type, value, traceback);
4913 if (arg == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004914 _PyErr_Restore(tstate, type, value, orig_traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004915 return;
4916 }
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004917 err = call_trace(func, self, tstate, f, PyTrace_EXCEPTION, arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004918 Py_DECREF(arg);
Victor Stinner438a12d2019-05-24 17:01:38 +02004919 if (err == 0) {
4920 _PyErr_Restore(tstate, type, value, orig_traceback);
4921 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004922 else {
4923 Py_XDECREF(type);
4924 Py_XDECREF(value);
Victor Stinneraaa8ed82013-07-10 13:57:55 +02004925 Py_XDECREF(orig_traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004926 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00004927}
4928
Amaury Forgeot d'Arcf05149a2007-11-13 01:05:30 +00004929static int
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004930call_trace_protected(Py_tracefunc func, PyObject *obj,
4931 PyThreadState *tstate, PyFrameObject *frame,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004932 int what, PyObject *arg)
Fred Drake4ec5d562001-10-04 19:26:43 +00004933{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004934 PyObject *type, *value, *traceback;
4935 int err;
Victor Stinner438a12d2019-05-24 17:01:38 +02004936 _PyErr_Fetch(tstate, &type, &value, &traceback);
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004937 err = call_trace(func, obj, tstate, frame, what, arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004938 if (err == 0)
4939 {
Victor Stinner438a12d2019-05-24 17:01:38 +02004940 _PyErr_Restore(tstate, type, value, traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004941 return 0;
4942 }
4943 else {
4944 Py_XDECREF(type);
4945 Py_XDECREF(value);
4946 Py_XDECREF(traceback);
4947 return -1;
4948 }
Fred Drake4ec5d562001-10-04 19:26:43 +00004949}
4950
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00004951static int
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004952call_trace(Py_tracefunc func, PyObject *obj,
4953 PyThreadState *tstate, PyFrameObject *frame,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004954 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00004955{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004956 int result;
4957 if (tstate->tracing)
4958 return 0;
4959 tstate->tracing++;
4960 tstate->use_tracing = 0;
4961 result = func(obj, frame, what, arg);
4962 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
4963 || (tstate->c_profilefunc != NULL));
4964 tstate->tracing--;
4965 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00004966}
4967
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00004968PyObject *
4969_PyEval_CallTracing(PyObject *func, PyObject *args)
4970{
Victor Stinner50b48572018-11-01 01:51:40 +01004971 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004972 int save_tracing = tstate->tracing;
4973 int save_use_tracing = tstate->use_tracing;
4974 PyObject *result;
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00004975
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004976 tstate->tracing = 0;
4977 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
4978 || (tstate->c_profilefunc != NULL));
4979 result = PyObject_Call(func, args, NULL);
4980 tstate->tracing = save_tracing;
4981 tstate->use_tracing = save_use_tracing;
4982 return result;
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00004983}
4984
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00004985/* See Objects/lnotab_notes.txt for a description of how tracing works. */
Michael W. Hudson006c7522002-11-08 13:08:46 +00004986static int
Tim Peters8a5c3c72004-04-05 19:36:21 +00004987maybe_call_line_trace(Py_tracefunc func, PyObject *obj,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004988 PyThreadState *tstate, PyFrameObject *frame,
Mark Shannon877df852020-11-12 09:43:29 +00004989 PyCodeAddressRange *bounds, int *instr_prev)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004990{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004991 int result = 0;
4992 int line = frame->f_lineno;
Michael W. Hudson006c7522002-11-08 13:08:46 +00004993
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004994 /* If the last instruction executed isn't in the current
4995 instruction window, reset the window.
4996 */
Mark Shannon877df852020-11-12 09:43:29 +00004997 line = _PyCode_CheckLineNumber(frame->f_lasti, bounds);
Nick Coghlan5a851672017-09-08 10:14:16 +10004998 /* If the last instruction falls at the start of a line or if it
4999 represents a jump backwards, update the frame's line number and
5000 then call the trace function if we're tracing source lines.
5001 */
Mark Shannon877df852020-11-12 09:43:29 +00005002 if ((line != frame->f_lineno || frame->f_lasti < *instr_prev)) {
5003 if (line != -1) {
5004 frame->f_lineno = line;
5005 if (frame->f_trace_lines) {
5006 result = call_trace(func, obj, tstate, frame, PyTrace_LINE, Py_None);
5007 }
Nick Coghlan5a851672017-09-08 10:14:16 +10005008 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005009 }
George King20faa682017-10-18 17:44:22 -07005010 /* Always emit an opcode event if we're tracing all opcodes. */
5011 if (frame->f_trace_opcodes) {
5012 result = call_trace(func, obj, tstate, frame, PyTrace_OPCODE, Py_None);
5013 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005014 *instr_prev = frame->f_lasti;
5015 return result;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00005016}
5017
Victor Stinner309d7cc2020-03-13 16:39:12 +01005018int
5019_PyEval_SetProfile(PyThreadState *tstate, Py_tracefunc func, PyObject *arg)
5020{
Victor Stinnerda2914d2020-03-20 09:29:08 +01005021 assert(is_tstate_valid(tstate));
Victor Stinner309d7cc2020-03-13 16:39:12 +01005022 /* The caller must hold the GIL */
5023 assert(PyGILState_Check());
5024
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005025 /* Call _PySys_Audit() in the context of the current thread state,
Victor Stinner309d7cc2020-03-13 16:39:12 +01005026 even if tstate is not the current thread state. */
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005027 PyThreadState *current_tstate = _PyThreadState_GET();
5028 if (_PySys_Audit(current_tstate, "sys.setprofile", NULL) < 0) {
Victor Stinner309d7cc2020-03-13 16:39:12 +01005029 return -1;
5030 }
5031
5032 PyObject *profileobj = tstate->c_profileobj;
5033
5034 tstate->c_profilefunc = NULL;
5035 tstate->c_profileobj = NULL;
5036 /* Must make sure that tracing is not ignored if 'profileobj' is freed */
5037 tstate->use_tracing = tstate->c_tracefunc != NULL;
5038 Py_XDECREF(profileobj);
5039
5040 Py_XINCREF(arg);
5041 tstate->c_profileobj = arg;
5042 tstate->c_profilefunc = func;
5043
5044 /* Flag that tracing or profiling is turned on */
5045 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
5046 return 0;
5047}
5048
Fred Drake5755ce62001-06-27 19:19:46 +00005049void
5050PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00005051{
Victor Stinner309d7cc2020-03-13 16:39:12 +01005052 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerf6a58502020-03-16 17:41:44 +01005053 if (_PyEval_SetProfile(tstate, func, arg) < 0) {
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005054 /* Log _PySys_Audit() error */
Victor Stinnerf6a58502020-03-16 17:41:44 +01005055 _PyErr_WriteUnraisableMsg("in PyEval_SetProfile", NULL);
5056 }
Victor Stinner309d7cc2020-03-13 16:39:12 +01005057}
5058
5059int
5060_PyEval_SetTrace(PyThreadState *tstate, Py_tracefunc func, PyObject *arg)
5061{
Victor Stinnerda2914d2020-03-20 09:29:08 +01005062 assert(is_tstate_valid(tstate));
Victor Stinner309d7cc2020-03-13 16:39:12 +01005063 /* The caller must hold the GIL */
5064 assert(PyGILState_Check());
5065
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005066 /* Call _PySys_Audit() in the context of the current thread state,
Victor Stinner309d7cc2020-03-13 16:39:12 +01005067 even if tstate is not the current thread state. */
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005068 PyThreadState *current_tstate = _PyThreadState_GET();
5069 if (_PySys_Audit(current_tstate, "sys.settrace", NULL) < 0) {
Victor Stinner309d7cc2020-03-13 16:39:12 +01005070 return -1;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005071 }
5072
Victor Stinnerda2914d2020-03-20 09:29:08 +01005073 struct _ceval_state *ceval2 = &tstate->interp->ceval;
Victor Stinner309d7cc2020-03-13 16:39:12 +01005074 PyObject *traceobj = tstate->c_traceobj;
Victor Stinnerda2914d2020-03-20 09:29:08 +01005075 ceval2->tracing_possible += (func != NULL) - (tstate->c_tracefunc != NULL);
Victor Stinner309d7cc2020-03-13 16:39:12 +01005076
5077 tstate->c_tracefunc = NULL;
5078 tstate->c_traceobj = NULL;
5079 /* Must make sure that profiling is not ignored if 'traceobj' is freed */
5080 tstate->use_tracing = (tstate->c_profilefunc != NULL);
5081 Py_XDECREF(traceobj);
5082
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005083 Py_XINCREF(arg);
Victor Stinner309d7cc2020-03-13 16:39:12 +01005084 tstate->c_traceobj = arg;
5085 tstate->c_tracefunc = func;
5086
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005087 /* Flag that tracing or profiling is turned on */
Victor Stinner309d7cc2020-03-13 16:39:12 +01005088 tstate->use_tracing = ((func != NULL)
5089 || (tstate->c_profilefunc != NULL));
5090
5091 return 0;
Fred Drake5755ce62001-06-27 19:19:46 +00005092}
5093
5094void
5095PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
5096{
Victor Stinner309d7cc2020-03-13 16:39:12 +01005097 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerf6a58502020-03-16 17:41:44 +01005098 if (_PyEval_SetTrace(tstate, func, arg) < 0) {
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005099 /* Log _PySys_Audit() error */
Victor Stinnerf6a58502020-03-16 17:41:44 +01005100 _PyErr_WriteUnraisableMsg("in PyEval_SetTrace", NULL);
5101 }
Fred Draked0838392001-06-16 21:02:31 +00005102}
5103
Victor Stinner309d7cc2020-03-13 16:39:12 +01005104
Yury Selivanov75445082015-05-11 22:57:16 -04005105void
Victor Stinner838f2642019-06-13 22:41:23 +02005106_PyEval_SetCoroutineOriginTrackingDepth(PyThreadState *tstate, int new_depth)
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08005107{
5108 assert(new_depth >= 0);
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08005109 tstate->coroutine_origin_tracking_depth = new_depth;
5110}
5111
5112int
5113_PyEval_GetCoroutineOriginTrackingDepth(void)
5114{
Victor Stinner50b48572018-11-01 01:51:40 +01005115 PyThreadState *tstate = _PyThreadState_GET();
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08005116 return tstate->coroutine_origin_tracking_depth;
5117}
5118
Zackery Spytz79ceccd2020-03-26 06:11:13 -06005119int
Yury Selivanoveb636452016-09-08 22:01:51 -07005120_PyEval_SetAsyncGenFirstiter(PyObject *firstiter)
5121{
Victor Stinner50b48572018-11-01 01:51:40 +01005122 PyThreadState *tstate = _PyThreadState_GET();
Steve Dowerb82e17e2019-05-23 08:45:22 -07005123
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005124 if (_PySys_Audit(tstate, "sys.set_asyncgen_hook_firstiter", NULL) < 0) {
Zackery Spytz79ceccd2020-03-26 06:11:13 -06005125 return -1;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005126 }
5127
Yury Selivanoveb636452016-09-08 22:01:51 -07005128 Py_XINCREF(firstiter);
5129 Py_XSETREF(tstate->async_gen_firstiter, firstiter);
Zackery Spytz79ceccd2020-03-26 06:11:13 -06005130 return 0;
Yury Selivanoveb636452016-09-08 22:01:51 -07005131}
5132
5133PyObject *
5134_PyEval_GetAsyncGenFirstiter(void)
5135{
Victor Stinner50b48572018-11-01 01:51:40 +01005136 PyThreadState *tstate = _PyThreadState_GET();
Yury Selivanoveb636452016-09-08 22:01:51 -07005137 return tstate->async_gen_firstiter;
5138}
5139
Zackery Spytz79ceccd2020-03-26 06:11:13 -06005140int
Yury Selivanoveb636452016-09-08 22:01:51 -07005141_PyEval_SetAsyncGenFinalizer(PyObject *finalizer)
5142{
Victor Stinner50b48572018-11-01 01:51:40 +01005143 PyThreadState *tstate = _PyThreadState_GET();
Steve Dowerb82e17e2019-05-23 08:45:22 -07005144
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005145 if (_PySys_Audit(tstate, "sys.set_asyncgen_hook_finalizer", NULL) < 0) {
Zackery Spytz79ceccd2020-03-26 06:11:13 -06005146 return -1;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005147 }
5148
Yury Selivanoveb636452016-09-08 22:01:51 -07005149 Py_XINCREF(finalizer);
5150 Py_XSETREF(tstate->async_gen_finalizer, finalizer);
Zackery Spytz79ceccd2020-03-26 06:11:13 -06005151 return 0;
Yury Selivanoveb636452016-09-08 22:01:51 -07005152}
5153
5154PyObject *
5155_PyEval_GetAsyncGenFinalizer(void)
5156{
Victor Stinner50b48572018-11-01 01:51:40 +01005157 PyThreadState *tstate = _PyThreadState_GET();
Yury Selivanoveb636452016-09-08 22:01:51 -07005158 return tstate->async_gen_finalizer;
5159}
5160
Victor Stinner438a12d2019-05-24 17:01:38 +02005161PyFrameObject *
5162PyEval_GetFrame(void)
5163{
5164 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner6723e932020-03-20 17:46:56 +01005165 return tstate->frame;
Victor Stinner438a12d2019-05-24 17:01:38 +02005166}
5167
Guido van Rossumb209a111997-04-29 18:18:01 +00005168PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005169PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00005170{
Victor Stinner438a12d2019-05-24 17:01:38 +02005171 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner6723e932020-03-20 17:46:56 +01005172 PyFrameObject *current_frame = tstate->frame;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005173 if (current_frame == NULL)
Victor Stinner438a12d2019-05-24 17:01:38 +02005174 return tstate->interp->builtins;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005175 else
5176 return current_frame->f_builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00005177}
5178
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02005179/* Convenience function to get a builtin from its name */
5180PyObject *
5181_PyEval_GetBuiltinId(_Py_Identifier *name)
5182{
Victor Stinner438a12d2019-05-24 17:01:38 +02005183 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02005184 PyObject *attr = _PyDict_GetItemIdWithError(PyEval_GetBuiltins(), name);
5185 if (attr) {
5186 Py_INCREF(attr);
5187 }
Victor Stinner438a12d2019-05-24 17:01:38 +02005188 else if (!_PyErr_Occurred(tstate)) {
5189 _PyErr_SetObject(tstate, PyExc_AttributeError, _PyUnicode_FromId(name));
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02005190 }
5191 return attr;
5192}
5193
Guido van Rossumb209a111997-04-29 18:18:01 +00005194PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005195PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00005196{
Victor Stinner438a12d2019-05-24 17:01:38 +02005197 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner6723e932020-03-20 17:46:56 +01005198 PyFrameObject *current_frame = tstate->frame;
Victor Stinner41bb43a2013-10-29 01:19:37 +01005199 if (current_frame == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005200 _PyErr_SetString(tstate, PyExc_SystemError, "frame does not exist");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005201 return NULL;
Victor Stinner41bb43a2013-10-29 01:19:37 +01005202 }
5203
Victor Stinner438a12d2019-05-24 17:01:38 +02005204 if (PyFrame_FastToLocalsWithError(current_frame) < 0) {
Victor Stinner41bb43a2013-10-29 01:19:37 +01005205 return NULL;
Victor Stinner438a12d2019-05-24 17:01:38 +02005206 }
Victor Stinner41bb43a2013-10-29 01:19:37 +01005207
5208 assert(current_frame->f_locals != NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005209 return current_frame->f_locals;
Guido van Rossum5b722181993-03-30 17:46:03 +00005210}
5211
Guido van Rossumb209a111997-04-29 18:18:01 +00005212PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005213PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00005214{
Victor Stinner438a12d2019-05-24 17:01:38 +02005215 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner6723e932020-03-20 17:46:56 +01005216 PyFrameObject *current_frame = tstate->frame;
Victor Stinner438a12d2019-05-24 17:01:38 +02005217 if (current_frame == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005218 return NULL;
Victor Stinner438a12d2019-05-24 17:01:38 +02005219 }
Victor Stinner41bb43a2013-10-29 01:19:37 +01005220
5221 assert(current_frame->f_globals != NULL);
5222 return current_frame->f_globals;
Guido van Rossum3f5da241990-12-20 15:06:42 +00005223}
5224
Guido van Rossum6135a871995-01-09 17:53:26 +00005225int
Tim Peters5ba58662001-07-16 02:29:45 +00005226PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
Jeremy Hylton061d1062001-03-22 02:32:48 +00005227{
Victor Stinner438a12d2019-05-24 17:01:38 +02005228 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner6723e932020-03-20 17:46:56 +01005229 PyFrameObject *current_frame = tstate->frame;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005230 int result = cf->cf_flags != 0;
Tim Peters5ba58662001-07-16 02:29:45 +00005231
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005232 if (current_frame != NULL) {
5233 const int codeflags = current_frame->f_code->co_flags;
5234 const int compilerflags = codeflags & PyCF_MASK;
5235 if (compilerflags) {
5236 result = 1;
5237 cf->cf_flags |= compilerflags;
5238 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00005239#if 0 /* future keyword */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005240 if (codeflags & CO_GENERATOR_ALLOWED) {
5241 result = 1;
5242 cf->cf_flags |= CO_GENERATOR_ALLOWED;
5243 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00005244#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005245 }
5246 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00005247}
5248
Guido van Rossum3f5da241990-12-20 15:06:42 +00005249
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00005250const char *
Tim Peters6d6c1a32001-08-02 04:15:00 +00005251PyEval_GetFuncName(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00005252{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005253 if (PyMethod_Check(func))
5254 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
5255 else if (PyFunction_Check(func))
Serhiy Storchaka06515832016-11-20 09:13:07 +02005256 return PyUnicode_AsUTF8(((PyFunctionObject*)func)->func_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005257 else if (PyCFunction_Check(func))
5258 return ((PyCFunctionObject*)func)->m_ml->ml_name;
5259 else
Victor Stinnera102ed72020-02-07 02:24:48 +01005260 return Py_TYPE(func)->tp_name;
Jeremy Hylton512a2372001-04-11 13:52:29 +00005261}
5262
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00005263const char *
Tim Peters6d6c1a32001-08-02 04:15:00 +00005264PyEval_GetFuncDesc(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00005265{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005266 if (PyMethod_Check(func))
5267 return "()";
5268 else if (PyFunction_Check(func))
5269 return "()";
5270 else if (PyCFunction_Check(func))
5271 return "()";
5272 else
5273 return " object";
Jeremy Hylton512a2372001-04-11 13:52:29 +00005274}
5275
Armin Rigo1c2d7e52005-09-20 18:34:01 +00005276#define C_TRACE(x, call) \
Nicholas Bastind858a772004-06-25 23:31:06 +00005277if (tstate->use_tracing && tstate->c_profilefunc) { \
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005278 if (call_trace(tstate->c_profilefunc, tstate->c_profileobj, \
5279 tstate, tstate->frame, \
5280 PyTrace_C_CALL, func)) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005281 x = NULL; \
5282 } \
5283 else { \
5284 x = call; \
5285 if (tstate->c_profilefunc != NULL) { \
5286 if (x == NULL) { \
5287 call_trace_protected(tstate->c_profilefunc, \
5288 tstate->c_profileobj, \
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005289 tstate, tstate->frame, \
5290 PyTrace_C_EXCEPTION, func); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005291 /* XXX should pass (type, value, tb) */ \
5292 } else { \
5293 if (call_trace(tstate->c_profilefunc, \
5294 tstate->c_profileobj, \
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005295 tstate, tstate->frame, \
5296 PyTrace_C_RETURN, func)) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005297 Py_DECREF(x); \
5298 x = NULL; \
5299 } \
5300 } \
5301 } \
5302 } \
Nicholas Bastind858a772004-06-25 23:31:06 +00005303} else { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005304 x = call; \
5305 }
Nicholas Bastinc69ebe82004-03-24 21:57:10 +00005306
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005307
5308static PyObject *
5309trace_call_function(PyThreadState *tstate,
5310 PyObject *func,
5311 PyObject **args, Py_ssize_t nargs,
5312 PyObject *kwnames)
5313{
5314 PyObject *x;
scoder4c9ea092020-05-12 16:12:41 +02005315 if (PyCFunction_CheckExact(func) || PyCMethod_CheckExact(func)) {
Petr Viktorinffd97532020-02-11 17:46:57 +01005316 C_TRACE(x, PyObject_Vectorcall(func, args, nargs, kwnames));
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005317 return x;
5318 }
Andy Lesterdffe4c02020-03-04 07:15:20 -06005319 else if (Py_IS_TYPE(func, &PyMethodDescr_Type) && nargs > 0) {
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005320 /* We need to create a temporary bound method as argument
5321 for profiling.
5322
5323 If nargs == 0, then this cannot work because we have no
5324 "self". In any case, the call itself would raise
5325 TypeError (foo needs an argument), so we just skip
5326 profiling. */
5327 PyObject *self = args[0];
5328 func = Py_TYPE(func)->tp_descr_get(func, self, (PyObject*)Py_TYPE(self));
5329 if (func == NULL) {
5330 return NULL;
5331 }
Petr Viktorinffd97532020-02-11 17:46:57 +01005332 C_TRACE(x, PyObject_Vectorcall(func,
Jeroen Demeyer0d722f32019-07-05 14:48:24 +02005333 args+1, nargs-1,
5334 kwnames));
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005335 Py_DECREF(func);
5336 return x;
5337 }
Petr Viktorinffd97532020-02-11 17:46:57 +01005338 return PyObject_Vectorcall(func, args, nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames);
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005339}
5340
Victor Stinner415c5102017-01-11 00:54:57 +01005341/* Issue #29227: Inline call_function() into _PyEval_EvalFrameDefault()
5342 to reduce the stack consumption. */
5343Py_LOCAL_INLINE(PyObject *) _Py_HOT_FUNCTION
Victor Stinner09532fe2019-05-10 23:39:09 +02005344call_function(PyThreadState *tstate, PyObject ***pp_stack, Py_ssize_t oparg, PyObject *kwnames)
Jeremy Hyltone8c04322002-08-16 17:47:26 +00005345{
Victor Stinnerf9b760f2016-09-09 10:17:08 -07005346 PyObject **pfunc = (*pp_stack) - oparg - 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005347 PyObject *func = *pfunc;
5348 PyObject *x, *w;
Victor Stinnerd8735722016-09-09 12:36:44 -07005349 Py_ssize_t nkwargs = (kwnames == NULL) ? 0 : PyTuple_GET_SIZE(kwnames);
5350 Py_ssize_t nargs = oparg - nkwargs;
INADA Naoki5566bbb2017-02-03 07:43:03 +09005351 PyObject **stack = (*pp_stack) - nargs - nkwargs;
Jeremy Hyltone8c04322002-08-16 17:47:26 +00005352
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005353 if (tstate->use_tracing) {
5354 x = trace_call_function(tstate, func, stack, nargs, kwnames);
INADA Naoki5566bbb2017-02-03 07:43:03 +09005355 }
Victor Stinner4a7cc882015-03-06 23:35:27 +01005356 else {
Petr Viktorinffd97532020-02-11 17:46:57 +01005357 x = PyObject_Vectorcall(func, stack, nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005358 }
Tim Peters8a5c3c72004-04-05 19:36:21 +00005359
Victor Stinner438a12d2019-05-24 17:01:38 +02005360 assert((x != NULL) ^ (_PyErr_Occurred(tstate) != NULL));
Victor Stinnerf9b760f2016-09-09 10:17:08 -07005361
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01005362 /* Clear the stack of the function object. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005363 while ((*pp_stack) > pfunc) {
5364 w = EXT_POP(*pp_stack);
5365 Py_DECREF(w);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005366 }
Victor Stinnerace47d72013-07-18 01:41:08 +02005367
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005368 return x;
Jeremy Hyltone8c04322002-08-16 17:47:26 +00005369}
5370
Jeremy Hylton52820442001-01-03 23:52:36 +00005371static PyObject *
Victor Stinner09532fe2019-05-10 23:39:09 +02005372do_call_core(PyThreadState *tstate, PyObject *func, PyObject *callargs, PyObject *kwdict)
Jeremy Hylton52820442001-01-03 23:52:36 +00005373{
jdemeyere89de732018-09-19 12:06:20 +02005374 PyObject *result;
5375
scoder4c9ea092020-05-12 16:12:41 +02005376 if (PyCFunction_CheckExact(func) || PyCMethod_CheckExact(func)) {
Jeroen Demeyer7a6873c2019-09-11 13:01:01 +02005377 C_TRACE(result, PyObject_Call(func, callargs, kwdict));
Victor Stinnerf9b760f2016-09-09 10:17:08 -07005378 return result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005379 }
Andy Lesterdffe4c02020-03-04 07:15:20 -06005380 else if (Py_IS_TYPE(func, &PyMethodDescr_Type)) {
jdemeyere89de732018-09-19 12:06:20 +02005381 Py_ssize_t nargs = PyTuple_GET_SIZE(callargs);
5382 if (nargs > 0 && tstate->use_tracing) {
5383 /* We need to create a temporary bound method as argument
5384 for profiling.
5385
5386 If nargs == 0, then this cannot work because we have no
5387 "self". In any case, the call itself would raise
5388 TypeError (foo needs an argument), so we just skip
5389 profiling. */
5390 PyObject *self = PyTuple_GET_ITEM(callargs, 0);
5391 func = Py_TYPE(func)->tp_descr_get(func, self, (PyObject*)Py_TYPE(self));
5392 if (func == NULL) {
5393 return NULL;
5394 }
5395
Victor Stinner4d231bc2019-11-14 13:36:21 +01005396 C_TRACE(result, _PyObject_FastCallDictTstate(
5397 tstate, func,
5398 &_PyTuple_ITEMS(callargs)[1],
5399 nargs - 1,
5400 kwdict));
jdemeyere89de732018-09-19 12:06:20 +02005401 Py_DECREF(func);
5402 return result;
5403 }
Victor Stinner74319ae2016-08-25 00:04:09 +02005404 }
jdemeyere89de732018-09-19 12:06:20 +02005405 return PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00005406}
5407
Serhiy Storchaka483405b2015-02-17 10:14:30 +02005408/* Extract a slice index from a PyLong or an object with the
Guido van Rossum38fff8c2006-03-07 18:50:55 +00005409 nb_index slot defined, and store in *pi.
5410 Silently reduce values larger than PY_SSIZE_T_MAX to PY_SSIZE_T_MAX,
Xiang Zhang2ddf5a12017-05-10 18:19:41 +08005411 and silently boost values less than PY_SSIZE_T_MIN to PY_SSIZE_T_MIN.
Martin v. Löwisdde99d22006-02-17 15:57:41 +00005412 Return 0 on error, 1 on success.
Tim Peterscb479e72001-12-16 19:11:44 +00005413*/
Guido van Rossum20c6add2000-05-08 14:06:50 +00005414int
Martin v. Löwis18e16552006-02-15 17:27:45 +00005415_PyEval_SliceIndex(PyObject *v, Py_ssize_t *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005416{
Victor Stinner438a12d2019-05-24 17:01:38 +02005417 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005418 if (v != Py_None) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005419 Py_ssize_t x;
Victor Stinnera15e2602020-04-08 02:01:56 +02005420 if (_PyIndex_Check(v)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005421 x = PyNumber_AsSsize_t(v, NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02005422 if (x == -1 && _PyErr_Occurred(tstate))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005423 return 0;
5424 }
5425 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02005426 _PyErr_SetString(tstate, PyExc_TypeError,
5427 "slice indices must be integers or "
5428 "None or have an __index__ method");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005429 return 0;
5430 }
5431 *pi = x;
5432 }
5433 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005434}
5435
Serhiy Storchaka80ec8362017-03-19 19:37:40 +02005436int
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005437_PyEval_SliceIndexNotNone(PyObject *v, Py_ssize_t *pi)
Serhiy Storchaka80ec8362017-03-19 19:37:40 +02005438{
Victor Stinner438a12d2019-05-24 17:01:38 +02005439 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005440 Py_ssize_t x;
Victor Stinnera15e2602020-04-08 02:01:56 +02005441 if (_PyIndex_Check(v)) {
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005442 x = PyNumber_AsSsize_t(v, NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02005443 if (x == -1 && _PyErr_Occurred(tstate))
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005444 return 0;
5445 }
5446 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02005447 _PyErr_SetString(tstate, PyExc_TypeError,
5448 "slice indices must be integers or "
5449 "have an __index__ method");
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005450 return 0;
5451 }
5452 *pi = x;
5453 return 1;
Serhiy Storchaka80ec8362017-03-19 19:37:40 +02005454}
5455
Thomas Wouters52152252000-08-17 22:55:00 +00005456static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02005457import_name(PyThreadState *tstate, PyFrameObject *f,
5458 PyObject *name, PyObject *fromlist, PyObject *level)
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005459{
5460 _Py_IDENTIFIER(__import__);
Victor Stinnerdf142fd2016-08-20 00:44:42 +02005461 PyObject *import_func, *res;
5462 PyObject* stack[5];
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005463
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02005464 import_func = _PyDict_GetItemIdWithError(f->f_builtins, &PyId___import__);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005465 if (import_func == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005466 if (!_PyErr_Occurred(tstate)) {
5467 _PyErr_SetString(tstate, PyExc_ImportError, "__import__ not found");
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02005468 }
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005469 return NULL;
5470 }
5471
5472 /* Fast path for not overloaded __import__. */
Victor Stinner438a12d2019-05-24 17:01:38 +02005473 if (import_func == tstate->interp->import_func) {
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005474 int ilevel = _PyLong_AsInt(level);
Victor Stinner438a12d2019-05-24 17:01:38 +02005475 if (ilevel == -1 && _PyErr_Occurred(tstate)) {
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005476 return NULL;
5477 }
5478 res = PyImport_ImportModuleLevelObject(
5479 name,
5480 f->f_globals,
5481 f->f_locals == NULL ? Py_None : f->f_locals,
5482 fromlist,
5483 ilevel);
5484 return res;
5485 }
5486
5487 Py_INCREF(import_func);
Victor Stinnerdf142fd2016-08-20 00:44:42 +02005488
5489 stack[0] = name;
5490 stack[1] = f->f_globals;
5491 stack[2] = f->f_locals == NULL ? Py_None : f->f_locals;
5492 stack[3] = fromlist;
5493 stack[4] = level;
Victor Stinner559bb6a2016-08-22 22:48:54 +02005494 res = _PyObject_FastCall(import_func, stack, 5);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005495 Py_DECREF(import_func);
5496 return res;
5497}
5498
5499static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02005500import_from(PyThreadState *tstate, PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00005501{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005502 PyObject *x;
Xiang Zhang4830f582017-03-21 11:13:42 +08005503 PyObject *fullmodname, *pkgname, *pkgpath, *pkgname_or_unknown, *errmsg;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00005504
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005505 if (_PyObject_LookupAttr(v, name, &x) != 0) {
Antoine Pitrou0373a102014-10-13 20:19:45 +02005506 return x;
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005507 }
Antoine Pitrou0373a102014-10-13 20:19:45 +02005508 /* Issue #17636: in case this failed because of a circular relative
5509 import, try to fallback on reading the module directly from
5510 sys.modules. */
Antoine Pitrou0373a102014-10-13 20:19:45 +02005511 pkgname = _PyObject_GetAttrId(v, &PyId___name__);
Brett Cannon3008bc02015-08-11 18:01:31 -07005512 if (pkgname == NULL) {
5513 goto error;
5514 }
Oren Milman6db70332017-09-19 14:23:01 +03005515 if (!PyUnicode_Check(pkgname)) {
5516 Py_CLEAR(pkgname);
5517 goto error;
5518 }
Antoine Pitrou0373a102014-10-13 20:19:45 +02005519 fullmodname = PyUnicode_FromFormat("%U.%U", pkgname, name);
Brett Cannon3008bc02015-08-11 18:01:31 -07005520 if (fullmodname == NULL) {
Xiang Zhang4830f582017-03-21 11:13:42 +08005521 Py_DECREF(pkgname);
Antoine Pitrou0373a102014-10-13 20:19:45 +02005522 return NULL;
Brett Cannon3008bc02015-08-11 18:01:31 -07005523 }
Eric Snow3f9eee62017-09-15 16:35:20 -06005524 x = PyImport_GetModule(fullmodname);
Antoine Pitrou0373a102014-10-13 20:19:45 +02005525 Py_DECREF(fullmodname);
Victor Stinner438a12d2019-05-24 17:01:38 +02005526 if (x == NULL && !_PyErr_Occurred(tstate)) {
Brett Cannon3008bc02015-08-11 18:01:31 -07005527 goto error;
5528 }
Matthias Bussonnier1bc15642017-02-22 07:06:50 -08005529 Py_DECREF(pkgname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005530 return x;
Brett Cannon3008bc02015-08-11 18:01:31 -07005531 error:
Matthias Bussonnierbc4bed42017-02-14 16:05:25 -08005532 pkgpath = PyModule_GetFilenameObject(v);
Matthias Bussonnier1bc15642017-02-22 07:06:50 -08005533 if (pkgname == NULL) {
5534 pkgname_or_unknown = PyUnicode_FromString("<unknown module name>");
5535 if (pkgname_or_unknown == NULL) {
5536 Py_XDECREF(pkgpath);
5537 return NULL;
5538 }
5539 } else {
5540 pkgname_or_unknown = pkgname;
5541 }
Matthias Bussonnierbc4bed42017-02-14 16:05:25 -08005542
5543 if (pkgpath == NULL || !PyUnicode_Check(pkgpath)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005544 _PyErr_Clear(tstate);
Xiang Zhang4830f582017-03-21 11:13:42 +08005545 errmsg = PyUnicode_FromFormat(
5546 "cannot import name %R from %R (unknown location)",
5547 name, pkgname_or_unknown
5548 );
Stefan Krah027b09c2019-03-25 21:50:58 +01005549 /* NULL checks for errmsg and pkgname done by PyErr_SetImportError. */
Xiang Zhang4830f582017-03-21 11:13:42 +08005550 PyErr_SetImportError(errmsg, pkgname, NULL);
5551 }
5552 else {
Anthony Sottile65366bc2019-09-09 08:17:50 -07005553 _Py_IDENTIFIER(__spec__);
5554 PyObject *spec = _PyObject_GetAttrId(v, &PyId___spec__);
Anthony Sottile65366bc2019-09-09 08:17:50 -07005555 const char *fmt =
5556 _PyModuleSpec_IsInitializing(spec) ?
5557 "cannot import name %R from partially initialized module %R "
5558 "(most likely due to a circular import) (%S)" :
5559 "cannot import name %R from %R (%S)";
5560 Py_XDECREF(spec);
5561
5562 errmsg = PyUnicode_FromFormat(fmt, name, pkgname_or_unknown, pkgpath);
Stefan Krah027b09c2019-03-25 21:50:58 +01005563 /* NULL checks for errmsg and pkgname done by PyErr_SetImportError. */
Xiang Zhang4830f582017-03-21 11:13:42 +08005564 PyErr_SetImportError(errmsg, pkgname, pkgpath);
Matthias Bussonnierbc4bed42017-02-14 16:05:25 -08005565 }
5566
Xiang Zhang4830f582017-03-21 11:13:42 +08005567 Py_XDECREF(errmsg);
Matthias Bussonnier1bc15642017-02-22 07:06:50 -08005568 Py_XDECREF(pkgname_or_unknown);
5569 Py_XDECREF(pkgpath);
Brett Cannon3008bc02015-08-11 18:01:31 -07005570 return NULL;
Thomas Wouters52152252000-08-17 22:55:00 +00005571}
Guido van Rossumac7be682001-01-17 15:42:30 +00005572
Thomas Wouters52152252000-08-17 22:55:00 +00005573static int
Victor Stinner438a12d2019-05-24 17:01:38 +02005574import_all_from(PyThreadState *tstate, PyObject *locals, PyObject *v)
Thomas Wouters52152252000-08-17 22:55:00 +00005575{
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02005576 _Py_IDENTIFIER(__all__);
5577 _Py_IDENTIFIER(__dict__);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005578 PyObject *all, *dict, *name, *value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005579 int skip_leading_underscores = 0;
5580 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00005581
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005582 if (_PyObject_LookupAttrId(v, &PyId___all__, &all) < 0) {
5583 return -1; /* Unexpected error */
5584 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005585 if (all == NULL) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005586 if (_PyObject_LookupAttrId(v, &PyId___dict__, &dict) < 0) {
5587 return -1;
5588 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005589 if (dict == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005590 _PyErr_SetString(tstate, PyExc_ImportError,
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005591 "from-import-* object has no __dict__ and no __all__");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005592 return -1;
5593 }
5594 all = PyMapping_Keys(dict);
5595 Py_DECREF(dict);
5596 if (all == NULL)
5597 return -1;
5598 skip_leading_underscores = 1;
5599 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00005600
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005601 for (pos = 0, err = 0; ; pos++) {
5602 name = PySequence_GetItem(all, pos);
5603 if (name == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005604 if (!_PyErr_ExceptionMatches(tstate, PyExc_IndexError)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005605 err = -1;
Victor Stinner438a12d2019-05-24 17:01:38 +02005606 }
5607 else {
5608 _PyErr_Clear(tstate);
5609 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005610 break;
5611 }
Xiang Zhangd8b291a2018-03-24 18:39:36 +08005612 if (!PyUnicode_Check(name)) {
5613 PyObject *modname = _PyObject_GetAttrId(v, &PyId___name__);
5614 if (modname == NULL) {
5615 Py_DECREF(name);
5616 err = -1;
5617 break;
5618 }
5619 if (!PyUnicode_Check(modname)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005620 _PyErr_Format(tstate, PyExc_TypeError,
5621 "module __name__ must be a string, not %.100s",
5622 Py_TYPE(modname)->tp_name);
Xiang Zhangd8b291a2018-03-24 18:39:36 +08005623 }
5624 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02005625 _PyErr_Format(tstate, PyExc_TypeError,
5626 "%s in %U.%s must be str, not %.100s",
5627 skip_leading_underscores ? "Key" : "Item",
5628 modname,
5629 skip_leading_underscores ? "__dict__" : "__all__",
5630 Py_TYPE(name)->tp_name);
Xiang Zhangd8b291a2018-03-24 18:39:36 +08005631 }
5632 Py_DECREF(modname);
5633 Py_DECREF(name);
5634 err = -1;
5635 break;
5636 }
5637 if (skip_leading_underscores) {
Serhiy Storchakae3b2b4b2017-09-08 09:58:51 +03005638 if (PyUnicode_READY(name) == -1) {
5639 Py_DECREF(name);
5640 err = -1;
5641 break;
5642 }
5643 if (PyUnicode_READ_CHAR(name, 0) == '_') {
5644 Py_DECREF(name);
5645 continue;
5646 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005647 }
5648 value = PyObject_GetAttr(v, name);
5649 if (value == NULL)
5650 err = -1;
5651 else if (PyDict_CheckExact(locals))
5652 err = PyDict_SetItem(locals, name, value);
5653 else
5654 err = PyObject_SetItem(locals, name, value);
5655 Py_DECREF(name);
5656 Py_XDECREF(value);
5657 if (err != 0)
5658 break;
5659 }
5660 Py_DECREF(all);
5661 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00005662}
5663
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005664static int
Victor Stinner438a12d2019-05-24 17:01:38 +02005665check_args_iterable(PyThreadState *tstate, PyObject *func, PyObject *args)
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005666{
Victor Stinnera102ed72020-02-07 02:24:48 +01005667 if (Py_TYPE(args)->tp_iter == NULL && !PySequence_Check(args)) {
Jeroen Demeyerbf17d412019-11-05 16:48:04 +01005668 /* check_args_iterable() may be called with a live exception:
5669 * clear it to prevent calling _PyObject_FunctionStr() with an
5670 * exception set. */
Victor Stinner61f4db82020-01-28 03:37:45 +01005671 _PyErr_Clear(tstate);
Jeroen Demeyerbf17d412019-11-05 16:48:04 +01005672 PyObject *funcstr = _PyObject_FunctionStr(func);
5673 if (funcstr != NULL) {
5674 _PyErr_Format(tstate, PyExc_TypeError,
5675 "%U argument after * must be an iterable, not %.200s",
5676 funcstr, Py_TYPE(args)->tp_name);
5677 Py_DECREF(funcstr);
5678 }
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005679 return -1;
5680 }
5681 return 0;
5682}
5683
5684static void
Victor Stinner438a12d2019-05-24 17:01:38 +02005685format_kwargs_error(PyThreadState *tstate, PyObject *func, PyObject *kwargs)
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005686{
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005687 /* _PyDict_MergeEx raises attribute
5688 * error (percolated from an attempt
5689 * to get 'keys' attribute) instead of
5690 * a type error if its second argument
5691 * is not a mapping.
5692 */
Victor Stinner438a12d2019-05-24 17:01:38 +02005693 if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) {
Victor Stinner61f4db82020-01-28 03:37:45 +01005694 _PyErr_Clear(tstate);
Jeroen Demeyerbf17d412019-11-05 16:48:04 +01005695 PyObject *funcstr = _PyObject_FunctionStr(func);
5696 if (funcstr != NULL) {
5697 _PyErr_Format(
5698 tstate, PyExc_TypeError,
5699 "%U argument after ** must be a mapping, not %.200s",
5700 funcstr, Py_TYPE(kwargs)->tp_name);
5701 Py_DECREF(funcstr);
5702 }
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005703 }
Victor Stinner438a12d2019-05-24 17:01:38 +02005704 else if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005705 PyObject *exc, *val, *tb;
Victor Stinner438a12d2019-05-24 17:01:38 +02005706 _PyErr_Fetch(tstate, &exc, &val, &tb);
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005707 if (val && PyTuple_Check(val) && PyTuple_GET_SIZE(val) == 1) {
Victor Stinner61f4db82020-01-28 03:37:45 +01005708 _PyErr_Clear(tstate);
Jeroen Demeyerbf17d412019-11-05 16:48:04 +01005709 PyObject *funcstr = _PyObject_FunctionStr(func);
5710 if (funcstr != NULL) {
5711 PyObject *key = PyTuple_GET_ITEM(val, 0);
5712 _PyErr_Format(
5713 tstate, PyExc_TypeError,
5714 "%U got multiple values for keyword argument '%S'",
5715 funcstr, key);
5716 Py_DECREF(funcstr);
5717 }
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005718 Py_XDECREF(exc);
5719 Py_XDECREF(val);
5720 Py_XDECREF(tb);
5721 }
5722 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02005723 _PyErr_Restore(tstate, exc, val, tb);
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005724 }
5725 }
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005726}
5727
Guido van Rossumac7be682001-01-17 15:42:30 +00005728static void
Victor Stinner438a12d2019-05-24 17:01:38 +02005729format_exc_check_arg(PyThreadState *tstate, PyObject *exc,
5730 const char *format_str, PyObject *obj)
Paul Prescode68140d2000-08-30 20:25:01 +00005731{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005732 const char *obj_str;
Paul Prescode68140d2000-08-30 20:25:01 +00005733
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005734 if (!obj)
5735 return;
Paul Prescode68140d2000-08-30 20:25:01 +00005736
Serhiy Storchaka06515832016-11-20 09:13:07 +02005737 obj_str = PyUnicode_AsUTF8(obj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005738 if (!obj_str)
5739 return;
Paul Prescode68140d2000-08-30 20:25:01 +00005740
Victor Stinner438a12d2019-05-24 17:01:38 +02005741 _PyErr_Format(tstate, exc, format_str, obj_str);
Paul Prescode68140d2000-08-30 20:25:01 +00005742}
Guido van Rossum950361c1997-01-24 13:49:28 +00005743
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005744static void
Victor Stinner438a12d2019-05-24 17:01:38 +02005745format_exc_unbound(PyThreadState *tstate, PyCodeObject *co, int oparg)
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005746{
5747 PyObject *name;
5748 /* Don't stomp existing exception */
Victor Stinner438a12d2019-05-24 17:01:38 +02005749 if (_PyErr_Occurred(tstate))
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005750 return;
5751 if (oparg < PyTuple_GET_SIZE(co->co_cellvars)) {
5752 name = PyTuple_GET_ITEM(co->co_cellvars,
5753 oparg);
Victor Stinner438a12d2019-05-24 17:01:38 +02005754 format_exc_check_arg(tstate,
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005755 PyExc_UnboundLocalError,
5756 UNBOUNDLOCAL_ERROR_MSG,
5757 name);
5758 } else {
5759 name = PyTuple_GET_ITEM(co->co_freevars, oparg -
5760 PyTuple_GET_SIZE(co->co_cellvars));
Victor Stinner438a12d2019-05-24 17:01:38 +02005761 format_exc_check_arg(tstate, PyExc_NameError,
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005762 UNBOUNDFREE_ERROR_MSG, name);
5763 }
5764}
5765
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03005766static void
Mark Shannonfee55262019-11-21 09:11:43 +00005767format_awaitable_error(PyThreadState *tstate, PyTypeObject *type, int prevprevopcode, int prevopcode)
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03005768{
5769 if (type->tp_as_async == NULL || type->tp_as_async->am_await == NULL) {
5770 if (prevopcode == BEFORE_ASYNC_WITH) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005771 _PyErr_Format(tstate, PyExc_TypeError,
5772 "'async with' received an object from __aenter__ "
5773 "that does not implement __await__: %.100s",
5774 type->tp_name);
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03005775 }
Mark Shannonfee55262019-11-21 09:11:43 +00005776 else if (prevopcode == WITH_EXCEPT_START || (prevopcode == CALL_FUNCTION && prevprevopcode == DUP_TOP)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005777 _PyErr_Format(tstate, PyExc_TypeError,
5778 "'async with' received an object from __aexit__ "
5779 "that does not implement __await__: %.100s",
5780 type->tp_name);
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03005781 }
5782 }
5783}
5784
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005785static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02005786unicode_concatenate(PyThreadState *tstate, PyObject *v, PyObject *w,
Serhiy Storchakaab874002016-09-11 13:48:15 +03005787 PyFrameObject *f, const _Py_CODEUNIT *next_instr)
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005788{
5789 PyObject *res;
5790 if (Py_REFCNT(v) == 2) {
5791 /* In the common case, there are 2 references to the value
5792 * stored in 'variable' when the += is performed: one on the
5793 * value stack (in 'v') and one still stored in the
5794 * 'variable'. We try to delete the variable now to reduce
5795 * the refcnt to 1.
5796 */
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03005797 int opcode, oparg;
5798 NEXTOPARG();
5799 switch (opcode) {
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005800 case STORE_FAST:
5801 {
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005802 PyObject **fastlocals = f->f_localsplus;
5803 if (GETLOCAL(oparg) == v)
5804 SETLOCAL(oparg, NULL);
5805 break;
5806 }
5807 case STORE_DEREF:
5808 {
5809 PyObject **freevars = (f->f_localsplus +
5810 f->f_code->co_nlocals);
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03005811 PyObject *c = freevars[oparg];
Raymond Hettingerc32f9db2016-11-12 04:10:35 -05005812 if (PyCell_GET(c) == v) {
5813 PyCell_SET(c, NULL);
5814 Py_DECREF(v);
5815 }
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005816 break;
5817 }
5818 case STORE_NAME:
5819 {
5820 PyObject *names = f->f_code->co_names;
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03005821 PyObject *name = GETITEM(names, oparg);
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005822 PyObject *locals = f->f_locals;
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02005823 if (locals && PyDict_CheckExact(locals)) {
5824 PyObject *w = PyDict_GetItemWithError(locals, name);
5825 if ((w == v && PyDict_DelItem(locals, name) != 0) ||
Victor Stinner438a12d2019-05-24 17:01:38 +02005826 (w == NULL && _PyErr_Occurred(tstate)))
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02005827 {
5828 Py_DECREF(v);
5829 return NULL;
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005830 }
5831 }
5832 break;
5833 }
5834 }
5835 }
5836 res = v;
5837 PyUnicode_Append(&res, w);
5838 return res;
5839}
5840
Guido van Rossum950361c1997-01-24 13:49:28 +00005841#ifdef DYNAMIC_EXECUTION_PROFILE
5842
Skip Montanarof118cb12001-10-15 20:51:38 +00005843static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005844getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00005845{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005846 int i;
5847 PyObject *l = PyList_New(256);
5848 if (l == NULL) return NULL;
5849 for (i = 0; i < 256; i++) {
5850 PyObject *x = PyLong_FromLong(a[i]);
5851 if (x == NULL) {
5852 Py_DECREF(l);
5853 return NULL;
5854 }
Zackery Spytz99d56b52018-12-08 07:16:55 -07005855 PyList_SET_ITEM(l, i, x);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005856 }
5857 for (i = 0; i < 256; i++)
5858 a[i] = 0;
5859 return l;
Guido van Rossum950361c1997-01-24 13:49:28 +00005860}
5861
5862PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005863_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00005864{
5865#ifndef DXPAIRS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005866 return getarray(dxp);
Guido van Rossum950361c1997-01-24 13:49:28 +00005867#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005868 int i;
5869 PyObject *l = PyList_New(257);
5870 if (l == NULL) return NULL;
5871 for (i = 0; i < 257; i++) {
5872 PyObject *x = getarray(dxpairs[i]);
5873 if (x == NULL) {
5874 Py_DECREF(l);
5875 return NULL;
5876 }
Zackery Spytz99d56b52018-12-08 07:16:55 -07005877 PyList_SET_ITEM(l, i, x);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005878 }
5879 return l;
Guido van Rossum950361c1997-01-24 13:49:28 +00005880#endif
5881}
5882
5883#endif
Brett Cannon5c4de282016-09-07 11:16:41 -07005884
5885Py_ssize_t
5886_PyEval_RequestCodeExtraIndex(freefunc free)
5887{
Victor Stinner81a7be32020-04-14 15:14:01 +02005888 PyInterpreterState *interp = _PyInterpreterState_GET();
Brett Cannon5c4de282016-09-07 11:16:41 -07005889 Py_ssize_t new_index;
5890
Dino Viehlandf3cffd22017-06-21 14:44:36 -07005891 if (interp->co_extra_user_count == MAX_CO_EXTRA_USERS - 1) {
Brett Cannon5c4de282016-09-07 11:16:41 -07005892 return -1;
5893 }
Dino Viehlandf3cffd22017-06-21 14:44:36 -07005894 new_index = interp->co_extra_user_count++;
5895 interp->co_extra_freefuncs[new_index] = free;
Brett Cannon5c4de282016-09-07 11:16:41 -07005896 return new_index;
5897}
Łukasz Langaa785c872016-09-09 17:37:37 -07005898
5899static void
5900dtrace_function_entry(PyFrameObject *f)
5901{
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02005902 const char *filename;
5903 const char *funcname;
Łukasz Langaa785c872016-09-09 17:37:37 -07005904 int lineno;
5905
Victor Stinner6d86a232020-04-29 00:56:58 +02005906 PyCodeObject *code = f->f_code;
5907 filename = PyUnicode_AsUTF8(code->co_filename);
5908 funcname = PyUnicode_AsUTF8(code->co_name);
5909 lineno = PyCode_Addr2Line(code, f->f_lasti);
Łukasz Langaa785c872016-09-09 17:37:37 -07005910
Andy Lestere6be9b52020-02-11 20:28:35 -06005911 PyDTrace_FUNCTION_ENTRY(filename, funcname, lineno);
Łukasz Langaa785c872016-09-09 17:37:37 -07005912}
5913
5914static void
5915dtrace_function_return(PyFrameObject *f)
5916{
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02005917 const char *filename;
5918 const char *funcname;
Łukasz Langaa785c872016-09-09 17:37:37 -07005919 int lineno;
5920
Victor Stinner6d86a232020-04-29 00:56:58 +02005921 PyCodeObject *code = f->f_code;
5922 filename = PyUnicode_AsUTF8(code->co_filename);
5923 funcname = PyUnicode_AsUTF8(code->co_name);
5924 lineno = PyCode_Addr2Line(code, f->f_lasti);
Łukasz Langaa785c872016-09-09 17:37:37 -07005925
Andy Lestere6be9b52020-02-11 20:28:35 -06005926 PyDTrace_FUNCTION_RETURN(filename, funcname, lineno);
Łukasz Langaa785c872016-09-09 17:37:37 -07005927}
5928
5929/* DTrace equivalent of maybe_call_line_trace. */
5930static void
5931maybe_dtrace_line(PyFrameObject *frame,
Mark Shannon877df852020-11-12 09:43:29 +00005932 PyCodeAddressRange *bounds, int *instr_prev)
Łukasz Langaa785c872016-09-09 17:37:37 -07005933{
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02005934 const char *co_filename, *co_name;
Łukasz Langaa785c872016-09-09 17:37:37 -07005935
5936 /* If the last instruction executed isn't in the current
5937 instruction window, reset the window.
5938 */
Mark Shannon877df852020-11-12 09:43:29 +00005939 int line = _PyCode_CheckLineNumber(frame->f_lasti, bounds);
Łukasz Langaa785c872016-09-09 17:37:37 -07005940 /* If the last instruction falls at the start of a line or if
5941 it represents a jump backwards, update the frame's line
5942 number and call the trace function. */
Mark Shannon877df852020-11-12 09:43:29 +00005943 if (line != frame->f_lineno || frame->f_lasti < *instr_prev) {
5944 if (line != -1) {
5945 frame->f_lineno = line;
5946 co_filename = PyUnicode_AsUTF8(frame->f_code->co_filename);
5947 if (!co_filename)
5948 co_filename = "?";
5949 co_name = PyUnicode_AsUTF8(frame->f_code->co_name);
5950 if (!co_name)
5951 co_name = "?";
5952 PyDTrace_LINE(co_filename, co_name, line);
5953 }
Łukasz Langaa785c872016-09-09 17:37:37 -07005954 }
5955 *instr_prev = frame->f_lasti;
5956}
Victor Stinnerf4b1e3d2019-11-04 19:48:34 +01005957
5958
5959/* Implement Py_EnterRecursiveCall() and Py_LeaveRecursiveCall() as functions
5960 for the limited API. */
5961
5962#undef Py_EnterRecursiveCall
5963
5964int Py_EnterRecursiveCall(const char *where)
5965{
Victor Stinnerbe434dc2019-11-05 00:51:22 +01005966 return _Py_EnterRecursiveCall_inline(where);
Victor Stinnerf4b1e3d2019-11-04 19:48:34 +01005967}
5968
5969#undef Py_LeaveRecursiveCall
5970
5971void Py_LeaveRecursiveCall(void)
5972{
Victor Stinnerbe434dc2019-11-05 00:51:22 +01005973 _Py_LeaveRecursiveCall_inline();
Victor Stinnerf4b1e3d2019-11-04 19:48:34 +01005974}