blob: fde08a64e24a564de59cc03bf56b1cf87b48f755 [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 */
db3l131d5512021-03-03 22:09:48 -050010/* affects both release and debug builds - see bpo-43271 */
Thomas Wouters477c8d52006-05-27 19:21:47 +000011#define PY_LOCAL_AGGRESSIVE
12
Guido van Rossumb209a111997-04-29 18:18:01 +000013#include "Python.h"
Victor Stinnere560f902020-04-14 18:30:41 +020014#include "pycore_abstract.h" // _PyIndex_Check()
Victor Stinner384621c2020-06-22 17:27:35 +020015#include "pycore_call.h" // _PyObject_FastCallDictTstate()
16#include "pycore_ceval.h" // _PyEval_SignalAsyncExc()
17#include "pycore_code.h" // _PyCode_InitOpcache()
18#include "pycore_initconfig.h" // _PyStatus_OK()
19#include "pycore_object.h" // _PyObject_GC_TRACK()
20#include "pycore_pyerrors.h" // _PyErr_Fetch()
21#include "pycore_pylifecycle.h" // _PyErr_Print()
Victor Stinnere560f902020-04-14 18:30:41 +020022#include "pycore_pymem.h" // _PyMem_IsPtrFreed()
23#include "pycore_pystate.h" // _PyInterpreterState_GET()
Victor Stinner384621c2020-06-22 17:27:35 +020024#include "pycore_sysmodule.h" // _PySys_Audit()
25#include "pycore_tuple.h" // _PyTuple_ITEMS()
Guido van Rossum10dc2e81990-11-18 17:27:39 +000026
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000027#include "code.h"
Benjamin Peterson025e9eb2015-05-05 20:16:41 -040028#include "dictobject.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000029#include "frameobject.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000030#include "opcode.h"
Łukasz Langaa785c872016-09-09 17:37:37 -070031#include "pydtrace.h"
Benjamin Peterson025e9eb2015-05-05 20:16:41 -040032#include "setobject.h"
Guido van Rossum5c5a9382021-01-29 18:02:29 -080033#include "structmember.h" // struct PyMemberDef, T_OFFSET_EX
Guido van Rossum10dc2e81990-11-18 17:27:39 +000034
Guido van Rossumc6004111993-11-05 10:22:19 +000035#include <ctype.h>
36
Mark Shannon8e1b4062021-03-05 14:45:50 +000037typedef struct {
38 PyCodeObject *code; // The code object for the bounds. May be NULL.
39 int instr_prev; // Only valid if code != NULL.
40 PyCodeAddressRange bounds; // Only valid if code != NULL.
41} PyTraceInfo;
42
43
Guido van Rossum408027e1996-12-30 16:17:54 +000044#ifdef Py_DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000045/* For debugging the interpreter: */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000046#define LLTRACE 1 /* Low-level trace feature */
47#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000048#endif
49
Victor Stinner5c75f372019-04-17 23:02:26 +020050#if !defined(Py_BUILD_CORE)
51# error "ceval.c must be build with Py_BUILD_CORE define for best performance"
52#endif
53
Hai Shi46874c22020-01-30 17:20:25 -060054_Py_IDENTIFIER(__name__);
Guido van Rossum5b722181993-03-30 17:46:03 +000055
Guido van Rossum374a9221991-04-04 10:40:29 +000056/* Forward declarations */
Victor Stinner09532fe2019-05-10 23:39:09 +020057Py_LOCAL_INLINE(PyObject *) call_function(
Mark Shannon8e1b4062021-03-05 14:45:50 +000058 PyThreadState *tstate, PyTraceInfo *, PyObject ***pp_stack,
Victor Stinner09532fe2019-05-10 23:39:09 +020059 Py_ssize_t oparg, PyObject *kwnames);
60static PyObject * do_call_core(
Mark Shannon8e1b4062021-03-05 14:45:50 +000061 PyThreadState *tstate, PyTraceInfo *, PyObject *func,
Victor Stinner09532fe2019-05-10 23:39:09 +020062 PyObject *callargs, PyObject *kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +000063
Guido van Rossum0a066c01992-03-27 17:29:15 +000064#ifdef LLTRACE
Guido van Rossumc2e20742006-02-27 22:32:47 +000065static int lltrace;
Victor Stinner438a12d2019-05-24 17:01:38 +020066static int prtrace(PyThreadState *, PyObject *, const char *);
Guido van Rossum0a066c01992-03-27 17:29:15 +000067#endif
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +010068static int call_trace(Py_tracefunc, PyObject *,
69 PyThreadState *, PyFrameObject *,
Mark Shannon8e1b4062021-03-05 14:45:50 +000070 PyTraceInfo *,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000071 int, PyObject *);
Amaury Forgeot d'Arcf05149a2007-11-13 01:05:30 +000072static int call_trace_protected(Py_tracefunc, PyObject *,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +010073 PyThreadState *, PyFrameObject *,
Mark Shannon8e1b4062021-03-05 14:45:50 +000074 PyTraceInfo *,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +010075 int, PyObject *);
76static void call_exc_trace(Py_tracefunc, PyObject *,
Mark Shannon86433452021-01-07 16:49:02 +000077 PyThreadState *, PyFrameObject *,
Mark Shannon8e1b4062021-03-05 14:45:50 +000078 PyTraceInfo *trace_info);
Tim Peters8a5c3c72004-04-05 19:36:21 +000079static int maybe_call_line_trace(Py_tracefunc, PyObject *,
Eric Snow2ebc5ce2017-09-07 23:51:28 -060080 PyThreadState *, PyFrameObject *,
Mark Shannon8e1b4062021-03-05 14:45:50 +000081 PyTraceInfo *);
82static void maybe_dtrace_line(PyFrameObject *, PyTraceInfo *);
Łukasz Langaa785c872016-09-09 17:37:37 -070083static void dtrace_function_entry(PyFrameObject *);
84static void dtrace_function_return(PyFrameObject *);
Michael W. Hudsondd32a912002-08-15 14:59:02 +000085
Victor Stinner438a12d2019-05-24 17:01:38 +020086static PyObject * import_name(PyThreadState *, PyFrameObject *,
87 PyObject *, PyObject *, PyObject *);
88static PyObject * import_from(PyThreadState *, PyObject *, PyObject *);
89static int import_all_from(PyThreadState *, PyObject *, PyObject *);
90static void format_exc_check_arg(PyThreadState *, PyObject *, const char *, PyObject *);
91static void format_exc_unbound(PyThreadState *tstate, PyCodeObject *co, int oparg);
92static PyObject * unicode_concatenate(PyThreadState *, PyObject *, PyObject *,
Serhiy Storchakaab874002016-09-11 13:48:15 +030093 PyFrameObject *, const _Py_CODEUNIT *);
Victor Stinner438a12d2019-05-24 17:01:38 +020094static PyObject * special_lookup(PyThreadState *, PyObject *, _Py_Identifier *);
95static int check_args_iterable(PyThreadState *, PyObject *func, PyObject *vararg);
96static void format_kwargs_error(PyThreadState *, PyObject *func, PyObject *kwargs);
Mark Shannonfee55262019-11-21 09:11:43 +000097static void format_awaitable_error(PyThreadState *, PyTypeObject *, int, int);
Guido van Rossum374a9221991-04-04 10:40:29 +000098
Paul Prescode68140d2000-08-30 20:25:01 +000099#define NAME_ERROR_MSG \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000100 "name '%.200s' is not defined"
Paul Prescode68140d2000-08-30 20:25:01 +0000101#define UNBOUNDLOCAL_ERROR_MSG \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000102 "local variable '%.200s' referenced before assignment"
Jeremy Hyltonc76770c2001-04-13 16:51:46 +0000103#define UNBOUNDFREE_ERROR_MSG \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000104 "free variable '%.200s' referenced before assignment" \
105 " in enclosing scope"
Guido van Rossum374a9221991-04-04 10:40:29 +0000106
Guido van Rossum950361c1997-01-24 13:49:28 +0000107/* Dynamic execution profile */
108#ifdef DYNAMIC_EXECUTION_PROFILE
109#ifdef DXPAIRS
110static long dxpairs[257][256];
111#define dxp dxpairs[256]
112#else
113static long dxp[256];
114#endif
115#endif
116
Inada Naoki91234a12019-06-03 21:30:58 +0900117/* per opcode cache */
Pablo Galindoaf5fa132021-02-28 22:41:09 +0000118static int opcache_min_runs = 1024; /* create opcache when code executed this many times */
Pablo Galindo109826c2020-10-20 06:22:44 +0100119#define OPCODE_CACHE_MAX_TRIES 20
Inada Naoki91234a12019-06-03 21:30:58 +0900120#define OPCACHE_STATS 0 /* Enable stats */
121
Pablo Galindoaf5fa132021-02-28 22:41:09 +0000122// This function allows to deactivate the opcode cache. As different cache mechanisms may hold
123// references, this can mess with the reference leak detector functionality so the cache needs
124// to be deactivated in such scenarios to avoid false positives. See bpo-3714 for more information.
125void
126_PyEval_DeactivateOpCache(void)
127{
128 opcache_min_runs = 0;
129}
130
Inada Naoki91234a12019-06-03 21:30:58 +0900131#if OPCACHE_STATS
132static size_t opcache_code_objects = 0;
133static size_t opcache_code_objects_extra_mem = 0;
134
135static size_t opcache_global_opts = 0;
136static size_t opcache_global_hits = 0;
137static size_t opcache_global_misses = 0;
Pablo Galindo109826c2020-10-20 06:22:44 +0100138
139static size_t opcache_attr_opts = 0;
140static size_t opcache_attr_hits = 0;
141static size_t opcache_attr_misses = 0;
142static size_t opcache_attr_deopts = 0;
143static size_t opcache_attr_total = 0;
Inada Naoki91234a12019-06-03 21:30:58 +0900144#endif
145
Victor Stinner5a3a71d2020-03-19 17:40:12 +0100146
Victor Stinnerda2914d2020-03-20 09:29:08 +0100147#ifndef NDEBUG
148/* Ensure that tstate is valid: sanity check for PyEval_AcquireThread() and
149 PyEval_RestoreThread(). Detect if tstate memory was freed. It can happen
150 when a thread continues to run after Python finalization, especially
151 daemon threads. */
152static int
153is_tstate_valid(PyThreadState *tstate)
154{
155 assert(!_PyMem_IsPtrFreed(tstate));
156 assert(!_PyMem_IsPtrFreed(tstate->interp));
157 return 1;
158}
159#endif
160
161
Jeffrey Yasskin39370832010-05-03 19:29:34 +0000162/* This can set eval_breaker to 0 even though gil_drop_request became
163 1. We believe this is all right because the eval loop will release
164 the GIL eventually anyway. */
Victor Stinnerda2914d2020-03-20 09:29:08 +0100165static inline void
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200166COMPUTE_EVAL_BREAKER(PyInterpreterState *interp,
Victor Stinner299b8c62020-05-05 17:40:18 +0200167 struct _ceval_runtime_state *ceval,
168 struct _ceval_state *ceval2)
Victor Stinnerda2914d2020-03-20 09:29:08 +0100169{
Victor Stinner299b8c62020-05-05 17:40:18 +0200170 _Py_atomic_store_relaxed(&ceval2->eval_breaker,
171 _Py_atomic_load_relaxed(&ceval2->gil_drop_request)
Victor Stinner0b1e3302020-05-05 16:14:31 +0200172 | (_Py_atomic_load_relaxed(&ceval->signals_pending)
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200173 && _Py_ThreadCanHandleSignals(interp))
Victor Stinner299b8c62020-05-05 17:40:18 +0200174 | (_Py_atomic_load_relaxed(&ceval2->pending.calls_to_do)
Victor Stinnerd8316882020-03-20 14:50:35 +0100175 && _Py_ThreadCanHandlePendingCalls())
Victor Stinner299b8c62020-05-05 17:40:18 +0200176 | ceval2->pending.async_exc);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100177}
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000178
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000179
Victor Stinnerda2914d2020-03-20 09:29:08 +0100180static inline void
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200181SET_GIL_DROP_REQUEST(PyInterpreterState *interp)
Victor Stinnerda2914d2020-03-20 09:29:08 +0100182{
Victor Stinner299b8c62020-05-05 17:40:18 +0200183 struct _ceval_state *ceval2 = &interp->ceval;
184 _Py_atomic_store_relaxed(&ceval2->gil_drop_request, 1);
185 _Py_atomic_store_relaxed(&ceval2->eval_breaker, 1);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100186}
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000187
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000188
Victor Stinnerda2914d2020-03-20 09:29:08 +0100189static inline void
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200190RESET_GIL_DROP_REQUEST(PyInterpreterState *interp)
Victor Stinnerda2914d2020-03-20 09:29:08 +0100191{
Victor Stinner299b8c62020-05-05 17:40:18 +0200192 struct _ceval_runtime_state *ceval = &interp->runtime->ceval;
193 struct _ceval_state *ceval2 = &interp->ceval;
194 _Py_atomic_store_relaxed(&ceval2->gil_drop_request, 0);
195 COMPUTE_EVAL_BREAKER(interp, ceval, ceval2);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100196}
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000197
Eric Snowfdf282d2019-01-11 14:26:55 -0700198
Victor Stinnerda2914d2020-03-20 09:29:08 +0100199static inline void
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200200SIGNAL_PENDING_CALLS(PyInterpreterState *interp)
Victor Stinnerda2914d2020-03-20 09:29:08 +0100201{
Victor Stinner299b8c62020-05-05 17:40:18 +0200202 struct _ceval_runtime_state *ceval = &interp->runtime->ceval;
203 struct _ceval_state *ceval2 = &interp->ceval;
204 _Py_atomic_store_relaxed(&ceval2->pending.calls_to_do, 1);
205 COMPUTE_EVAL_BREAKER(interp, ceval, ceval2);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100206}
Eric Snowfdf282d2019-01-11 14:26:55 -0700207
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000208
Victor Stinnerda2914d2020-03-20 09:29:08 +0100209static inline void
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200210UNSIGNAL_PENDING_CALLS(PyInterpreterState *interp)
Victor Stinnerda2914d2020-03-20 09:29:08 +0100211{
Victor Stinner299b8c62020-05-05 17:40:18 +0200212 struct _ceval_runtime_state *ceval = &interp->runtime->ceval;
213 struct _ceval_state *ceval2 = &interp->ceval;
214 _Py_atomic_store_relaxed(&ceval2->pending.calls_to_do, 0);
215 COMPUTE_EVAL_BREAKER(interp, ceval, ceval2);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100216}
217
218
219static inline void
Victor Stinnerd96a7a82020-11-13 14:44:42 +0100220SIGNAL_PENDING_SIGNALS(PyInterpreterState *interp, int force)
Victor Stinnerda2914d2020-03-20 09:29:08 +0100221{
Victor Stinner299b8c62020-05-05 17:40:18 +0200222 struct _ceval_runtime_state *ceval = &interp->runtime->ceval;
223 struct _ceval_state *ceval2 = &interp->ceval;
Victor Stinner0b1e3302020-05-05 16:14:31 +0200224 _Py_atomic_store_relaxed(&ceval->signals_pending, 1);
Victor Stinnerd96a7a82020-11-13 14:44:42 +0100225 if (force) {
226 _Py_atomic_store_relaxed(&ceval2->eval_breaker, 1);
227 }
228 else {
229 /* eval_breaker is not set to 1 if thread_can_handle_signals() is false */
230 COMPUTE_EVAL_BREAKER(interp, ceval, ceval2);
231 }
Victor Stinnerda2914d2020-03-20 09:29:08 +0100232}
233
234
235static inline void
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200236UNSIGNAL_PENDING_SIGNALS(PyInterpreterState *interp)
Victor Stinnerda2914d2020-03-20 09:29:08 +0100237{
Victor Stinner299b8c62020-05-05 17:40:18 +0200238 struct _ceval_runtime_state *ceval = &interp->runtime->ceval;
239 struct _ceval_state *ceval2 = &interp->ceval;
Victor Stinner0b1e3302020-05-05 16:14:31 +0200240 _Py_atomic_store_relaxed(&ceval->signals_pending, 0);
Victor Stinner299b8c62020-05-05 17:40:18 +0200241 COMPUTE_EVAL_BREAKER(interp, ceval, ceval2);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100242}
243
244
245static inline void
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200246SIGNAL_ASYNC_EXC(PyInterpreterState *interp)
Victor Stinnerda2914d2020-03-20 09:29:08 +0100247{
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200248 struct _ceval_state *ceval2 = &interp->ceval;
Victor Stinnerda2914d2020-03-20 09:29:08 +0100249 ceval2->pending.async_exc = 1;
250 _Py_atomic_store_relaxed(&ceval2->eval_breaker, 1);
251}
252
253
254static inline void
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200255UNSIGNAL_ASYNC_EXC(PyInterpreterState *interp)
Victor Stinnerda2914d2020-03-20 09:29:08 +0100256{
Victor Stinner299b8c62020-05-05 17:40:18 +0200257 struct _ceval_runtime_state *ceval = &interp->runtime->ceval;
258 struct _ceval_state *ceval2 = &interp->ceval;
259 ceval2->pending.async_exc = 0;
260 COMPUTE_EVAL_BREAKER(interp, ceval, ceval2);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100261}
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000262
263
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000264#ifdef HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000265#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +0000266#endif
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000267#include "ceval_gil.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000268
Victor Stinner3026cad2020-06-01 16:02:40 +0200269void _Py_NO_RETURN
270_Py_FatalError_TstateNULL(const char *func)
Victor Stinnereb4e2ae2020-03-08 11:57:45 +0100271{
Victor Stinner3026cad2020-06-01 16:02:40 +0200272 _Py_FatalErrorFunc(func,
273 "the function must be called with the GIL held, "
274 "but the GIL is released "
275 "(the current Python thread state is NULL)");
Victor Stinnereb4e2ae2020-03-08 11:57:45 +0100276}
277
Victor Stinner7be4e352020-05-05 20:27:47 +0200278#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
279int
280_PyEval_ThreadsInitialized(PyInterpreterState *interp)
281{
282 return gil_created(&interp->ceval.gil);
283}
284
285int
286PyEval_ThreadsInitialized(void)
287{
288 // Fatal error if there is no current interpreter
289 PyInterpreterState *interp = PyInterpreterState_Get();
290 return _PyEval_ThreadsInitialized(interp);
291}
292#else
Tim Peters7f468f22004-10-11 02:40:51 +0000293int
Victor Stinner175a7042020-03-10 00:37:48 +0100294_PyEval_ThreadsInitialized(_PyRuntimeState *runtime)
295{
296 return gil_created(&runtime->ceval.gil);
297}
298
299int
Tim Peters7f468f22004-10-11 02:40:51 +0000300PyEval_ThreadsInitialized(void)
301{
Victor Stinner01b1cc12019-11-20 02:27:56 +0100302 _PyRuntimeState *runtime = &_PyRuntime;
Victor Stinner175a7042020-03-10 00:37:48 +0100303 return _PyEval_ThreadsInitialized(runtime);
Tim Peters7f468f22004-10-11 02:40:51 +0000304}
Victor Stinner7be4e352020-05-05 20:27:47 +0200305#endif
Tim Peters7f468f22004-10-11 02:40:51 +0000306
Victor Stinner111e4ee2020-03-09 21:24:14 +0100307PyStatus
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200308_PyEval_InitGIL(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000309{
Victor Stinner7be4e352020-05-05 20:27:47 +0200310#ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
Victor Stinner101bf692021-02-19 13:33:31 +0100311 if (!_Py_IsMainInterpreter(tstate->interp)) {
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200312 /* Currently, the GIL is shared by all interpreters,
313 and only the main interpreter is responsible to create
314 and destroy it. */
315 return _PyStatus_OK();
Victor Stinner111e4ee2020-03-09 21:24:14 +0100316 }
Victor Stinner7be4e352020-05-05 20:27:47 +0200317#endif
Victor Stinner111e4ee2020-03-09 21:24:14 +0100318
Victor Stinner7be4e352020-05-05 20:27:47 +0200319#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
320 struct _gil_runtime_state *gil = &tstate->interp->ceval.gil;
321#else
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200322 struct _gil_runtime_state *gil = &tstate->interp->runtime->ceval.gil;
Victor Stinner7be4e352020-05-05 20:27:47 +0200323#endif
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200324 assert(!gil_created(gil));
Victor Stinner85f5a692020-03-09 22:12:04 +0100325
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200326 PyThread_init_thread();
327 create_gil(gil);
328
329 take_gil(tstate);
330
331 assert(gil_created(gil));
Victor Stinner111e4ee2020-03-09 21:24:14 +0100332 return _PyStatus_OK();
333}
334
335void
Victor Stinnerbcb094b2021-02-19 15:10:45 +0100336_PyEval_FiniGIL(PyInterpreterState *interp)
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200337{
Victor Stinner7be4e352020-05-05 20:27:47 +0200338#ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
Victor Stinnerbcb094b2021-02-19 15:10:45 +0100339 if (!_Py_IsMainInterpreter(interp)) {
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200340 /* Currently, the GIL is shared by all interpreters,
341 and only the main interpreter is responsible to create
342 and destroy it. */
343 return;
344 }
Victor Stinner7be4e352020-05-05 20:27:47 +0200345#endif
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200346
Victor Stinner7be4e352020-05-05 20:27:47 +0200347#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
Victor Stinnerbcb094b2021-02-19 15:10:45 +0100348 struct _gil_runtime_state *gil = &interp->ceval.gil;
Victor Stinner7be4e352020-05-05 20:27:47 +0200349#else
Victor Stinnerbcb094b2021-02-19 15:10:45 +0100350 struct _gil_runtime_state *gil = &interp->runtime->ceval.gil;
Victor Stinner7be4e352020-05-05 20:27:47 +0200351#endif
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200352 if (!gil_created(gil)) {
353 /* First Py_InitializeFromConfig() call: the GIL doesn't exist
354 yet: do nothing. */
355 return;
356 }
357
358 destroy_gil(gil);
359 assert(!gil_created(gil));
360}
361
362void
Victor Stinner111e4ee2020-03-09 21:24:14 +0100363PyEval_InitThreads(void)
364{
Victor Stinnerb4698ec2020-03-10 01:28:54 +0100365 /* Do nothing: kept for backward compatibility */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000366}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000367
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000368void
Inada Naoki91234a12019-06-03 21:30:58 +0900369_PyEval_Fini(void)
370{
371#if OPCACHE_STATS
372 fprintf(stderr, "-- Opcode cache number of objects = %zd\n",
373 opcache_code_objects);
374
375 fprintf(stderr, "-- Opcode cache total extra mem = %zd\n",
376 opcache_code_objects_extra_mem);
377
378 fprintf(stderr, "\n");
379
380 fprintf(stderr, "-- Opcode cache LOAD_GLOBAL hits = %zd (%d%%)\n",
381 opcache_global_hits,
382 (int) (100.0 * opcache_global_hits /
383 (opcache_global_hits + opcache_global_misses)));
384
385 fprintf(stderr, "-- Opcode cache LOAD_GLOBAL misses = %zd (%d%%)\n",
386 opcache_global_misses,
387 (int) (100.0 * opcache_global_misses /
388 (opcache_global_hits + opcache_global_misses)));
389
390 fprintf(stderr, "-- Opcode cache LOAD_GLOBAL opts = %zd\n",
391 opcache_global_opts);
392
393 fprintf(stderr, "\n");
Pablo Galindo109826c2020-10-20 06:22:44 +0100394
395 fprintf(stderr, "-- Opcode cache LOAD_ATTR hits = %zd (%d%%)\n",
396 opcache_attr_hits,
397 (int) (100.0 * opcache_attr_hits /
398 opcache_attr_total));
399
400 fprintf(stderr, "-- Opcode cache LOAD_ATTR misses = %zd (%d%%)\n",
401 opcache_attr_misses,
402 (int) (100.0 * opcache_attr_misses /
403 opcache_attr_total));
404
405 fprintf(stderr, "-- Opcode cache LOAD_ATTR opts = %zd\n",
406 opcache_attr_opts);
407
408 fprintf(stderr, "-- Opcode cache LOAD_ATTR deopts = %zd\n",
409 opcache_attr_deopts);
410
411 fprintf(stderr, "-- Opcode cache LOAD_ATTR total = %zd\n",
412 opcache_attr_total);
Inada Naoki91234a12019-06-03 21:30:58 +0900413#endif
414}
415
416void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000417PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000418{
Victor Stinner09532fe2019-05-10 23:39:09 +0200419 _PyRuntimeState *runtime = &_PyRuntime;
Victor Stinner09532fe2019-05-10 23:39:09 +0200420 PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime);
Victor Stinner3026cad2020-06-01 16:02:40 +0200421 _Py_EnsureTstateNotNULL(tstate);
Victor Stinnereb4e2ae2020-03-08 11:57:45 +0100422
Victor Stinner85f5a692020-03-09 22:12:04 +0100423 take_gil(tstate);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000424}
425
426void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000427PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000428{
Victor Stinner09532fe2019-05-10 23:39:09 +0200429 _PyRuntimeState *runtime = &_PyRuntime;
Victor Stinnere225beb2019-06-03 18:14:24 +0200430 PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000431 /* This function must succeed when the current thread state is NULL.
Victor Stinner50b48572018-11-01 01:51:40 +0100432 We therefore avoid PyThreadState_Get() which dumps a fatal error
Victor Stinnerda2914d2020-03-20 09:29:08 +0100433 in debug mode. */
Victor Stinner299b8c62020-05-05 17:40:18 +0200434 struct _ceval_runtime_state *ceval = &runtime->ceval;
435 struct _ceval_state *ceval2 = &tstate->interp->ceval;
436 drop_gil(ceval, ceval2, tstate);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000437}
438
439void
Victor Stinner23ef89d2020-03-18 02:26:04 +0100440_PyEval_ReleaseLock(PyThreadState *tstate)
441{
442 struct _ceval_runtime_state *ceval = &tstate->interp->runtime->ceval;
Victor Stinner0b1e3302020-05-05 16:14:31 +0200443 struct _ceval_state *ceval2 = &tstate->interp->ceval;
444 drop_gil(ceval, ceval2, tstate);
Victor Stinner23ef89d2020-03-18 02:26:04 +0100445}
446
447void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000448PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000449{
Victor Stinner3026cad2020-06-01 16:02:40 +0200450 _Py_EnsureTstateNotNULL(tstate);
Victor Stinnereb4e2ae2020-03-08 11:57:45 +0100451
Victor Stinner85f5a692020-03-09 22:12:04 +0100452 take_gil(tstate);
Victor Stinnere225beb2019-06-03 18:14:24 +0200453
Victor Stinner85f5a692020-03-09 22:12:04 +0100454 struct _gilstate_runtime_state *gilstate = &tstate->interp->runtime->gilstate;
Victor Stinnere838a932020-05-05 19:56:48 +0200455#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
456 (void)_PyThreadState_Swap(gilstate, tstate);
457#else
Victor Stinner85f5a692020-03-09 22:12:04 +0100458 if (_PyThreadState_Swap(gilstate, tstate) != NULL) {
Victor Stinner9e5d30c2020-03-07 00:54:20 +0100459 Py_FatalError("non-NULL old thread state");
Victor Stinner09532fe2019-05-10 23:39:09 +0200460 }
Victor Stinnere838a932020-05-05 19:56:48 +0200461#endif
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000462}
463
464void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000465PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000466{
Victor Stinnerda2914d2020-03-20 09:29:08 +0100467 assert(is_tstate_valid(tstate));
Victor Stinner09532fe2019-05-10 23:39:09 +0200468
Victor Stinner01b1cc12019-11-20 02:27:56 +0100469 _PyRuntimeState *runtime = tstate->interp->runtime;
Victor Stinner09532fe2019-05-10 23:39:09 +0200470 PyThreadState *new_tstate = _PyThreadState_Swap(&runtime->gilstate, NULL);
471 if (new_tstate != tstate) {
Victor Stinner9e5d30c2020-03-07 00:54:20 +0100472 Py_FatalError("wrong thread state");
Victor Stinner09532fe2019-05-10 23:39:09 +0200473 }
Victor Stinner0b1e3302020-05-05 16:14:31 +0200474 struct _ceval_runtime_state *ceval = &runtime->ceval;
475 struct _ceval_state *ceval2 = &tstate->interp->ceval;
476 drop_gil(ceval, ceval2, tstate);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000477}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000478
Dong-hee Na62f75fe2020-04-15 01:16:24 +0900479#ifdef HAVE_FORK
Antoine Pitrouf7ecfac2017-05-28 11:35:14 +0200480/* This function is called from PyOS_AfterFork_Child to destroy all threads
Victor Stinner26881c82020-06-02 15:51:37 +0200481 which are not running in the child process, and clear internal locks
482 which might be held by those threads. */
483PyStatus
Victor Stinner317bab02020-06-02 18:44:54 +0200484_PyEval_ReInitThreads(PyThreadState *tstate)
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000485{
Victor Stinner317bab02020-06-02 18:44:54 +0200486 _PyRuntimeState *runtime = tstate->interp->runtime;
Victor Stinner7be4e352020-05-05 20:27:47 +0200487
488#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
489 struct _gil_runtime_state *gil = &tstate->interp->ceval.gil;
490#else
Victor Stinner56bfdeb2020-03-18 09:26:25 +0100491 struct _gil_runtime_state *gil = &runtime->ceval.gil;
Victor Stinner7be4e352020-05-05 20:27:47 +0200492#endif
Victor Stinner56bfdeb2020-03-18 09:26:25 +0100493 if (!gil_created(gil)) {
Victor Stinner26881c82020-06-02 15:51:37 +0200494 return _PyStatus_OK();
Victor Stinner09532fe2019-05-10 23:39:09 +0200495 }
Victor Stinner56bfdeb2020-03-18 09:26:25 +0100496 recreate_gil(gil);
Victor Stinner85f5a692020-03-09 22:12:04 +0100497
498 take_gil(tstate);
Eric Snow8479a342019-03-08 23:44:33 -0700499
Victor Stinner50e6e992020-03-19 02:41:21 +0100500 struct _pending_calls *pending = &tstate->interp->ceval.pending;
Dong-hee Na62f75fe2020-04-15 01:16:24 +0900501 if (_PyThread_at_fork_reinit(&pending->lock) < 0) {
Victor Stinner26881c82020-06-02 15:51:37 +0200502 return _PyStatus_ERR("Can't reinitialize pending calls lock");
Eric Snow8479a342019-03-08 23:44:33 -0700503 }
Jesse Nollera8513972008-07-17 16:49:17 +0000504
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200505 /* Destroy all threads except the current one */
Victor Stinnereb4e2ae2020-03-08 11:57:45 +0100506 _PyThreadState_DeleteExcept(runtime, tstate);
Victor Stinner26881c82020-06-02 15:51:37 +0200507 return _PyStatus_OK();
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000508}
Dong-hee Na62f75fe2020-04-15 01:16:24 +0900509#endif
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000510
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000511/* This function is used to signal that async exceptions are waiting to be
Zackery Spytzeef05962018-09-29 10:07:11 -0600512 raised. */
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000513
514void
Victor Stinnerbcb094b2021-02-19 15:10:45 +0100515_PyEval_SignalAsyncExc(PyInterpreterState *interp)
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000516{
Victor Stinnerbcb094b2021-02-19 15:10:45 +0100517 SIGNAL_ASYNC_EXC(interp);
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000518}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000519
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000520PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000521PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000522{
Victor Stinner09532fe2019-05-10 23:39:09 +0200523 _PyRuntimeState *runtime = &_PyRuntime;
Victor Stinnere838a932020-05-05 19:56:48 +0200524#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
525 PyThreadState *old_tstate = _PyThreadState_GET();
526 PyThreadState *tstate = _PyThreadState_Swap(&runtime->gilstate, old_tstate);
527#else
Victor Stinner09532fe2019-05-10 23:39:09 +0200528 PyThreadState *tstate = _PyThreadState_Swap(&runtime->gilstate, NULL);
Victor Stinnere838a932020-05-05 19:56:48 +0200529#endif
Victor Stinner3026cad2020-06-01 16:02:40 +0200530 _Py_EnsureTstateNotNULL(tstate);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100531
Victor Stinner0b1e3302020-05-05 16:14:31 +0200532 struct _ceval_runtime_state *ceval = &runtime->ceval;
533 struct _ceval_state *ceval2 = &tstate->interp->ceval;
Victor Stinner7be4e352020-05-05 20:27:47 +0200534#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
535 assert(gil_created(&ceval2->gil));
536#else
Victor Stinnere225beb2019-06-03 18:14:24 +0200537 assert(gil_created(&ceval->gil));
Victor Stinner7be4e352020-05-05 20:27:47 +0200538#endif
Victor Stinner0b1e3302020-05-05 16:14:31 +0200539 drop_gil(ceval, ceval2, tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000540 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000541}
542
543void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000544PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000545{
Victor Stinner3026cad2020-06-01 16:02:40 +0200546 _Py_EnsureTstateNotNULL(tstate);
Victor Stinnereb4e2ae2020-03-08 11:57:45 +0100547
Victor Stinner85f5a692020-03-09 22:12:04 +0100548 take_gil(tstate);
Victor Stinner17c68b82020-01-30 12:20:48 +0100549
Victor Stinner85f5a692020-03-09 22:12:04 +0100550 struct _gilstate_runtime_state *gilstate = &tstate->interp->runtime->gilstate;
551 _PyThreadState_Swap(gilstate, tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000552}
553
554
Guido van Rossuma9672091994-09-14 13:31:22 +0000555/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
556 signal handlers or Mac I/O completion routines) can schedule calls
557 to a function to be called synchronously.
558 The synchronous function is called with one void* argument.
559 It should return 0 for success or -1 for failure -- failure should
560 be accompanied by an exception.
561
562 If registry succeeds, the registry function returns 0; if it fails
563 (e.g. due to too many pending calls) it returns -1 (without setting
564 an exception condition).
565
566 Note that because registry may occur from within signal handlers,
567 or other asynchronous events, calling malloc() is unsafe!
568
Guido van Rossuma9672091994-09-14 13:31:22 +0000569 Any thread can schedule pending calls, but only the main thread
570 will execute them.
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000571 There is no facility to schedule calls to a particular thread, but
572 that should be easy to change, should that ever be required. In
573 that case, the static variables here should go into the python
574 threadstate.
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000575*/
Guido van Rossuma9672091994-09-14 13:31:22 +0000576
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200577void
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200578_PyEval_SignalReceived(PyInterpreterState *interp)
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200579{
Victor Stinnerd96a7a82020-11-13 14:44:42 +0100580#ifdef MS_WINDOWS
581 // bpo-42296: On Windows, _PyEval_SignalReceived() is called from a signal
582 // handler which can run in a thread different than the Python thread, in
583 // which case _Py_ThreadCanHandleSignals() is wrong. Ignore
584 // _Py_ThreadCanHandleSignals() and always set eval_breaker to 1.
585 //
586 // The next eval_frame_handle_pending() call will call
587 // _Py_ThreadCanHandleSignals() to recompute eval_breaker.
588 int force = 1;
589#else
590 int force = 0;
591#endif
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200592 /* bpo-30703: Function called when the C signal handler of Python gets a
Victor Stinner50e6e992020-03-19 02:41:21 +0100593 signal. We cannot queue a callback using _PyEval_AddPendingCall() since
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200594 that function is not async-signal-safe. */
Victor Stinnerd96a7a82020-11-13 14:44:42 +0100595 SIGNAL_PENDING_SIGNALS(interp, force);
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200596}
597
Eric Snow5be45a62019-03-08 22:47:07 -0700598/* Push one item onto the queue while holding the lock. */
599static int
Victor Stinnere225beb2019-06-03 18:14:24 +0200600_push_pending_call(struct _pending_calls *pending,
Eric Snow842a2f02019-03-15 15:47:51 -0600601 int (*func)(void *), void *arg)
Eric Snow5be45a62019-03-08 22:47:07 -0700602{
Eric Snow842a2f02019-03-15 15:47:51 -0600603 int i = pending->last;
Eric Snow5be45a62019-03-08 22:47:07 -0700604 int j = (i + 1) % NPENDINGCALLS;
Eric Snow842a2f02019-03-15 15:47:51 -0600605 if (j == pending->first) {
Eric Snow5be45a62019-03-08 22:47:07 -0700606 return -1; /* Queue full */
607 }
Eric Snow842a2f02019-03-15 15:47:51 -0600608 pending->calls[i].func = func;
609 pending->calls[i].arg = arg;
610 pending->last = j;
Eric Snow5be45a62019-03-08 22:47:07 -0700611 return 0;
612}
613
614/* Pop one item off the queue while holding the lock. */
615static void
Victor Stinnere225beb2019-06-03 18:14:24 +0200616_pop_pending_call(struct _pending_calls *pending,
Eric Snow842a2f02019-03-15 15:47:51 -0600617 int (**func)(void *), void **arg)
Eric Snow5be45a62019-03-08 22:47:07 -0700618{
Eric Snow842a2f02019-03-15 15:47:51 -0600619 int i = pending->first;
620 if (i == pending->last) {
Eric Snow5be45a62019-03-08 22:47:07 -0700621 return; /* Queue empty */
622 }
623
Eric Snow842a2f02019-03-15 15:47:51 -0600624 *func = pending->calls[i].func;
625 *arg = pending->calls[i].arg;
626 pending->first = (i + 1) % NPENDINGCALLS;
Eric Snow5be45a62019-03-08 22:47:07 -0700627}
628
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200629/* This implementation is thread-safe. It allows
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000630 scheduling to be made from any thread, and even from an executing
631 callback.
632 */
633
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000634int
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200635_PyEval_AddPendingCall(PyInterpreterState *interp,
Victor Stinner09532fe2019-05-10 23:39:09 +0200636 int (*func)(void *), void *arg)
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000637{
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200638 struct _pending_calls *pending = &interp->ceval.pending;
Eric Snow842a2f02019-03-15 15:47:51 -0600639
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200640 /* Ensure that _PyEval_InitPendingCalls() was called
641 and that _PyEval_FiniPendingCalls() is not called yet. */
642 assert(pending->lock != NULL);
643
Eric Snow842a2f02019-03-15 15:47:51 -0600644 PyThread_acquire_lock(pending->lock, WAIT_LOCK);
Victor Stinnere225beb2019-06-03 18:14:24 +0200645 int result = _push_pending_call(pending, func, arg);
Eric Snow842a2f02019-03-15 15:47:51 -0600646 PyThread_release_lock(pending->lock);
Eric Snow5be45a62019-03-08 22:47:07 -0700647
Victor Stinnere225beb2019-06-03 18:14:24 +0200648 /* signal main loop */
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200649 SIGNAL_PENDING_CALLS(interp);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000650 return result;
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000651}
652
Victor Stinner09532fe2019-05-10 23:39:09 +0200653int
654Py_AddPendingCall(int (*func)(void *), void *arg)
655{
Victor Stinner50e6e992020-03-19 02:41:21 +0100656 /* Best-effort to support subinterpreters and calls with the GIL released.
657
658 First attempt _PyThreadState_GET() since it supports subinterpreters.
659
660 If the GIL is released, _PyThreadState_GET() returns NULL . In this
661 case, use PyGILState_GetThisThreadState() which works even if the GIL
662 is released.
663
664 Sadly, PyGILState_GetThisThreadState() doesn't support subinterpreters:
665 see bpo-10915 and bpo-15751.
666
Victor Stinner8849e592020-03-18 19:28:53 +0100667 Py_AddPendingCall() doesn't require the caller to hold the GIL. */
Victor Stinner50e6e992020-03-19 02:41:21 +0100668 PyThreadState *tstate = _PyThreadState_GET();
669 if (tstate == NULL) {
670 tstate = PyGILState_GetThisThreadState();
671 }
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200672
673 PyInterpreterState *interp;
674 if (tstate != NULL) {
675 interp = tstate->interp;
676 }
677 else {
678 /* Last resort: use the main interpreter */
679 interp = _PyRuntime.interpreters.main;
680 }
681 return _PyEval_AddPendingCall(interp, func, arg);
Victor Stinner09532fe2019-05-10 23:39:09 +0200682}
683
Eric Snowfdf282d2019-01-11 14:26:55 -0700684static int
Victor Stinnerd7fabc12020-03-18 01:56:21 +0100685handle_signals(PyThreadState *tstate)
Eric Snowfdf282d2019-01-11 14:26:55 -0700686{
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200687 assert(is_tstate_valid(tstate));
688 if (!_Py_ThreadCanHandleSignals(tstate->interp)) {
Eric Snow64d6cc82019-02-23 15:40:43 -0700689 return 0;
690 }
Eric Snowfdf282d2019-01-11 14:26:55 -0700691
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200692 UNSIGNAL_PENDING_SIGNALS(tstate->interp);
Victor Stinner72818982020-03-26 22:28:11 +0100693 if (_PyErr_CheckSignalsTstate(tstate) < 0) {
694 /* On failure, re-schedule a call to handle_signals(). */
Victor Stinnerd96a7a82020-11-13 14:44:42 +0100695 SIGNAL_PENDING_SIGNALS(tstate->interp, 0);
Eric Snowfdf282d2019-01-11 14:26:55 -0700696 return -1;
697 }
698 return 0;
699}
700
701static int
Victor Stinnerbcb094b2021-02-19 15:10:45 +0100702make_pending_calls(PyInterpreterState *interp)
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000703{
Victor Stinnerd8316882020-03-20 14:50:35 +0100704 /* only execute pending calls on main thread */
705 if (!_Py_ThreadCanHandlePendingCalls()) {
Victor Stinnere225beb2019-06-03 18:14:24 +0200706 return 0;
707 }
708
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000709 /* don't perform recursive pending calls */
Victor Stinnerda2914d2020-03-20 09:29:08 +0100710 static int busy = 0;
Eric Snowfdf282d2019-01-11 14:26:55 -0700711 if (busy) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000712 return 0;
Eric Snowfdf282d2019-01-11 14:26:55 -0700713 }
Charles-François Natalif23339a2011-07-23 18:15:43 +0200714 busy = 1;
Victor Stinnerda2914d2020-03-20 09:29:08 +0100715
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200716 /* unsignal before starting to call callbacks, so that any callback
717 added in-between re-signals */
Victor Stinnerbcb094b2021-02-19 15:10:45 +0100718 UNSIGNAL_PENDING_CALLS(interp);
Eric Snowfdf282d2019-01-11 14:26:55 -0700719 int res = 0;
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200720
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000721 /* perform a bounded number of calls, in case of recursion */
Victor Stinnerbcb094b2021-02-19 15:10:45 +0100722 struct _pending_calls *pending = &interp->ceval.pending;
Eric Snowfdf282d2019-01-11 14:26:55 -0700723 for (int i=0; i<NPENDINGCALLS; i++) {
Eric Snow5be45a62019-03-08 22:47:07 -0700724 int (*func)(void *) = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000725 void *arg = NULL;
726
727 /* pop one item off the queue while holding the lock */
Eric Snow842a2f02019-03-15 15:47:51 -0600728 PyThread_acquire_lock(pending->lock, WAIT_LOCK);
Victor Stinnere225beb2019-06-03 18:14:24 +0200729 _pop_pending_call(pending, &func, &arg);
Eric Snow842a2f02019-03-15 15:47:51 -0600730 PyThread_release_lock(pending->lock);
Eric Snow5be45a62019-03-08 22:47:07 -0700731
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100732 /* having released the lock, perform the callback */
Eric Snow5be45a62019-03-08 22:47:07 -0700733 if (func == NULL) {
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100734 break;
Eric Snow5be45a62019-03-08 22:47:07 -0700735 }
Eric Snowfdf282d2019-01-11 14:26:55 -0700736 res = func(arg);
737 if (res) {
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200738 goto error;
739 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000740 }
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200741
Charles-François Natalif23339a2011-07-23 18:15:43 +0200742 busy = 0;
Eric Snowfdf282d2019-01-11 14:26:55 -0700743 return res;
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200744
745error:
746 busy = 0;
Victor Stinnerbcb094b2021-02-19 15:10:45 +0100747 SIGNAL_PENDING_CALLS(interp);
Eric Snowfdf282d2019-01-11 14:26:55 -0700748 return res;
749}
750
Eric Snow842a2f02019-03-15 15:47:51 -0600751void
Victor Stinner2b1df452020-01-13 18:46:59 +0100752_Py_FinishPendingCalls(PyThreadState *tstate)
Eric Snow842a2f02019-03-15 15:47:51 -0600753{
Eric Snow842a2f02019-03-15 15:47:51 -0600754 assert(PyGILState_Check());
Victor Stinnerbcb094b2021-02-19 15:10:45 +0100755 assert(is_tstate_valid(tstate));
Eric Snow842a2f02019-03-15 15:47:51 -0600756
Victor Stinner50e6e992020-03-19 02:41:21 +0100757 struct _pending_calls *pending = &tstate->interp->ceval.pending;
Victor Stinner09532fe2019-05-10 23:39:09 +0200758
Eric Snow842a2f02019-03-15 15:47:51 -0600759 if (!_Py_atomic_load_relaxed(&(pending->calls_to_do))) {
760 return;
761 }
762
Victor Stinnerbcb094b2021-02-19 15:10:45 +0100763 if (make_pending_calls(tstate->interp) < 0) {
Victor Stinnere225beb2019-06-03 18:14:24 +0200764 PyObject *exc, *val, *tb;
765 _PyErr_Fetch(tstate, &exc, &val, &tb);
766 PyErr_BadInternalCall();
767 _PyErr_ChainExceptions(exc, val, tb);
768 _PyErr_Print(tstate);
Eric Snow842a2f02019-03-15 15:47:51 -0600769 }
770}
771
Eric Snowfdf282d2019-01-11 14:26:55 -0700772/* Py_MakePendingCalls() is a simple wrapper for the sake
773 of backward-compatibility. */
774int
775Py_MakePendingCalls(void)
776{
777 assert(PyGILState_Check());
778
Victor Stinnerd7fabc12020-03-18 01:56:21 +0100779 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerbcb094b2021-02-19 15:10:45 +0100780 assert(is_tstate_valid(tstate));
Victor Stinnerd7fabc12020-03-18 01:56:21 +0100781
Eric Snowfdf282d2019-01-11 14:26:55 -0700782 /* Python signal handler doesn't really queue a callback: it only signals
783 that a signal was received, see _PyEval_SignalReceived(). */
Victor Stinnerd7fabc12020-03-18 01:56:21 +0100784 int res = handle_signals(tstate);
Eric Snowfdf282d2019-01-11 14:26:55 -0700785 if (res != 0) {
786 return res;
787 }
788
Victor Stinnerbcb094b2021-02-19 15:10:45 +0100789 res = make_pending_calls(tstate->interp);
Eric Snowb75b1a352019-04-12 10:20:10 -0600790 if (res != 0) {
791 return res;
792 }
793
794 return 0;
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000795}
796
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000797/* The interpreter's recursion limit */
798
Hye-Shik Changb6fa2812005-04-04 15:49:02 +0000799#ifndef Py_DEFAULT_RECURSION_LIMIT
Victor Stinner19c3ac92020-09-23 14:04:57 +0200800# define Py_DEFAULT_RECURSION_LIMIT 1000
Hye-Shik Changb6fa2812005-04-04 15:49:02 +0000801#endif
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600802
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600803void
Victor Stinnerdab84232020-03-17 18:56:44 +0100804_PyEval_InitRuntimeState(struct _ceval_runtime_state *ceval)
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600805{
Victor Stinner7be4e352020-05-05 20:27:47 +0200806#ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
Victor Stinnerdab84232020-03-17 18:56:44 +0100807 _gil_initialize(&ceval->gil);
Victor Stinner7be4e352020-05-05 20:27:47 +0200808#endif
Victor Stinnerdab84232020-03-17 18:56:44 +0100809}
810
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200811int
Victor Stinnerdab84232020-03-17 18:56:44 +0100812_PyEval_InitState(struct _ceval_state *ceval)
813{
Victor Stinner4e30ed32020-05-05 16:52:52 +0200814 ceval->recursion_limit = Py_DEFAULT_RECURSION_LIMIT;
815
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200816 struct _pending_calls *pending = &ceval->pending;
817 assert(pending->lock == NULL);
818
819 pending->lock = PyThread_allocate_lock();
820 if (pending->lock == NULL) {
821 return -1;
822 }
Victor Stinner7be4e352020-05-05 20:27:47 +0200823
824#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
825 _gil_initialize(&ceval->gil);
826#endif
827
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200828 return 0;
829}
830
831void
832_PyEval_FiniState(struct _ceval_state *ceval)
833{
834 struct _pending_calls *pending = &ceval->pending;
835 if (pending->lock != NULL) {
836 PyThread_free_lock(pending->lock);
837 pending->lock = NULL;
838 }
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600839}
840
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000841int
842Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000843{
Victor Stinner1bcc32f2020-06-10 20:08:26 +0200844 PyInterpreterState *interp = _PyInterpreterState_GET();
845 return interp->ceval.recursion_limit;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000846}
847
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000848void
849Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000850{
Victor Stinner4e30ed32020-05-05 16:52:52 +0200851 PyThreadState *tstate = _PyThreadState_GET();
852 tstate->interp->ceval.recursion_limit = new_limit;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000853}
854
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100855/* The function _Py_EnterRecursiveCall() only calls _Py_CheckRecursiveCall()
Victor Stinner19c3ac92020-09-23 14:04:57 +0200856 if the recursion_depth reaches recursion_limit.
857 If USE_STACKCHECK, the macro decrements recursion_limit
Armin Rigo2b3eb402003-10-28 12:05:48 +0000858 to guarantee that _Py_CheckRecursiveCall() is regularly called.
859 Without USE_STACKCHECK, there is no need for this. */
860int
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100861_Py_CheckRecursiveCall(PyThreadState *tstate, const char *where)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000862{
Victor Stinner4e30ed32020-05-05 16:52:52 +0200863 int recursion_limit = tstate->interp->ceval.recursion_limit;
Armin Rigo2b3eb402003-10-28 12:05:48 +0000864
865#ifdef USE_STACKCHECK
pdox18967932017-10-25 23:03:01 -0700866 tstate->stackcheck_counter = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000867 if (PyOS_CheckStack()) {
868 --tstate->recursion_depth;
Victor Stinner438a12d2019-05-24 17:01:38 +0200869 _PyErr_SetString(tstate, PyExc_MemoryError, "Stack overflow");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000870 return -1;
871 }
pdox18967932017-10-25 23:03:01 -0700872#endif
Mark Shannon4e7a69b2020-12-02 13:30:55 +0000873 if (tstate->recursion_headroom) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000874 if (tstate->recursion_depth > recursion_limit + 50) {
875 /* Overflowing while handling an overflow. Give up. */
876 Py_FatalError("Cannot recover from stack overflow.");
877 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000878 }
Mark Shannon4e7a69b2020-12-02 13:30:55 +0000879 else {
880 if (tstate->recursion_depth > recursion_limit) {
881 tstate->recursion_headroom++;
882 _PyErr_Format(tstate, PyExc_RecursionError,
883 "maximum recursion depth exceeded%s",
884 where);
885 tstate->recursion_headroom--;
886 --tstate->recursion_depth;
887 return -1;
888 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000889 }
890 return 0;
Armin Rigo2b3eb402003-10-28 12:05:48 +0000891}
892
Brandt Bucher145bf262021-02-26 14:51:55 -0800893
894// PEP 634: Structural Pattern Matching
895
896
897// Return a tuple of values corresponding to keys, with error checks for
898// duplicate/missing keys.
899static PyObject*
900match_keys(PyThreadState *tstate, PyObject *map, PyObject *keys)
901{
902 assert(PyTuple_CheckExact(keys));
903 Py_ssize_t nkeys = PyTuple_GET_SIZE(keys);
904 if (!nkeys) {
905 // No keys means no items.
906 return PyTuple_New(0);
907 }
908 PyObject *seen = NULL;
909 PyObject *dummy = NULL;
910 PyObject *values = NULL;
911 // We use the two argument form of map.get(key, default) for two reasons:
912 // - Atomically check for a key and get its value without error handling.
913 // - Don't cause key creation or resizing in dict subclasses like
914 // collections.defaultdict that define __missing__ (or similar).
915 _Py_IDENTIFIER(get);
916 PyObject *get = _PyObject_GetAttrId(map, &PyId_get);
917 if (get == NULL) {
918 goto fail;
919 }
920 seen = PySet_New(NULL);
921 if (seen == NULL) {
922 goto fail;
923 }
924 // dummy = object()
925 dummy = _PyObject_CallNoArg((PyObject *)&PyBaseObject_Type);
926 if (dummy == NULL) {
927 goto fail;
928 }
929 values = PyList_New(0);
930 if (values == NULL) {
931 goto fail;
932 }
933 for (Py_ssize_t i = 0; i < nkeys; i++) {
934 PyObject *key = PyTuple_GET_ITEM(keys, i);
935 if (PySet_Contains(seen, key) || PySet_Add(seen, key)) {
936 if (!_PyErr_Occurred(tstate)) {
937 // Seen it before!
938 _PyErr_Format(tstate, PyExc_ValueError,
939 "mapping pattern checks duplicate key (%R)", key);
940 }
941 goto fail;
942 }
943 PyObject *value = PyObject_CallFunctionObjArgs(get, key, dummy, NULL);
944 if (value == NULL) {
945 goto fail;
946 }
947 if (value == dummy) {
948 // key not in map!
949 Py_DECREF(value);
950 Py_DECREF(values);
951 // Return None:
952 Py_INCREF(Py_None);
953 values = Py_None;
954 goto done;
955 }
956 PyList_Append(values, value);
957 Py_DECREF(value);
958 }
959 Py_SETREF(values, PyList_AsTuple(values));
960 // Success:
961done:
962 Py_DECREF(get);
963 Py_DECREF(seen);
964 Py_DECREF(dummy);
965 return values;
966fail:
967 Py_XDECREF(get);
968 Py_XDECREF(seen);
969 Py_XDECREF(dummy);
970 Py_XDECREF(values);
971 return NULL;
972}
973
974// Extract a named attribute from the subject, with additional bookkeeping to
975// raise TypeErrors for repeated lookups. On failure, return NULL (with no
976// error set). Use _PyErr_Occurred(tstate) to disambiguate.
977static PyObject*
978match_class_attr(PyThreadState *tstate, PyObject *subject, PyObject *type,
979 PyObject *name, PyObject *seen)
980{
981 assert(PyUnicode_CheckExact(name));
982 assert(PySet_CheckExact(seen));
983 if (PySet_Contains(seen, name) || PySet_Add(seen, name)) {
984 if (!_PyErr_Occurred(tstate)) {
985 // Seen it before!
986 _PyErr_Format(tstate, PyExc_TypeError,
987 "%s() got multiple sub-patterns for attribute %R",
988 ((PyTypeObject*)type)->tp_name, name);
989 }
990 return NULL;
991 }
992 PyObject *attr = PyObject_GetAttr(subject, name);
993 if (attr == NULL && _PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) {
994 _PyErr_Clear(tstate);
995 }
996 return attr;
997}
998
999// On success (match), return a tuple of extracted attributes. On failure (no
1000// match), return NULL. Use _PyErr_Occurred(tstate) to disambiguate.
1001static PyObject*
1002match_class(PyThreadState *tstate, PyObject *subject, PyObject *type,
1003 Py_ssize_t nargs, PyObject *kwargs)
1004{
1005 if (!PyType_Check(type)) {
1006 const char *e = "called match pattern must be a type";
1007 _PyErr_Format(tstate, PyExc_TypeError, e);
1008 return NULL;
1009 }
1010 assert(PyTuple_CheckExact(kwargs));
1011 // First, an isinstance check:
1012 if (PyObject_IsInstance(subject, type) <= 0) {
1013 return NULL;
1014 }
1015 // So far so good:
1016 PyObject *seen = PySet_New(NULL);
1017 if (seen == NULL) {
1018 return NULL;
1019 }
1020 PyObject *attrs = PyList_New(0);
1021 if (attrs == NULL) {
1022 Py_DECREF(seen);
1023 return NULL;
1024 }
1025 // NOTE: From this point on, goto fail on failure:
1026 PyObject *match_args = NULL;
1027 // First, the positional subpatterns:
1028 if (nargs) {
1029 int match_self = 0;
1030 match_args = PyObject_GetAttrString(type, "__match_args__");
1031 if (match_args) {
1032 if (PyList_CheckExact(match_args)) {
1033 Py_SETREF(match_args, PyList_AsTuple(match_args));
1034 }
1035 if (match_args == NULL) {
1036 goto fail;
1037 }
1038 if (!PyTuple_CheckExact(match_args)) {
1039 const char *e = "%s.__match_args__ must be a list or tuple "
1040 "(got %s)";
1041 _PyErr_Format(tstate, PyExc_TypeError, e,
1042 ((PyTypeObject *)type)->tp_name,
1043 Py_TYPE(match_args)->tp_name);
1044 goto fail;
1045 }
1046 }
1047 else if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) {
1048 _PyErr_Clear(tstate);
1049 // _Py_TPFLAGS_MATCH_SELF is only acknowledged if the type does not
1050 // define __match_args__. This is natural behavior for subclasses:
1051 // it's as if __match_args__ is some "magic" value that is lost as
1052 // soon as they redefine it.
1053 match_args = PyTuple_New(0);
1054 match_self = PyType_HasFeature((PyTypeObject*)type,
1055 _Py_TPFLAGS_MATCH_SELF);
1056 }
1057 else {
1058 goto fail;
1059 }
1060 assert(PyTuple_CheckExact(match_args));
1061 Py_ssize_t allowed = match_self ? 1 : PyTuple_GET_SIZE(match_args);
1062 if (allowed < nargs) {
1063 const char *plural = (allowed == 1) ? "" : "s";
1064 _PyErr_Format(tstate, PyExc_TypeError,
1065 "%s() accepts %d positional sub-pattern%s (%d given)",
1066 ((PyTypeObject*)type)->tp_name,
1067 allowed, plural, nargs);
1068 goto fail;
1069 }
1070 if (match_self) {
1071 // Easy. Copy the subject itself, and move on to kwargs.
1072 PyList_Append(attrs, subject);
1073 }
1074 else {
1075 for (Py_ssize_t i = 0; i < nargs; i++) {
1076 PyObject *name = PyTuple_GET_ITEM(match_args, i);
1077 if (!PyUnicode_CheckExact(name)) {
1078 _PyErr_Format(tstate, PyExc_TypeError,
1079 "__match_args__ elements must be strings "
1080 "(got %s)", Py_TYPE(name)->tp_name);
1081 goto fail;
1082 }
1083 PyObject *attr = match_class_attr(tstate, subject, type, name,
1084 seen);
1085 if (attr == NULL) {
1086 goto fail;
1087 }
1088 PyList_Append(attrs, attr);
1089 Py_DECREF(attr);
1090 }
1091 }
1092 Py_CLEAR(match_args);
1093 }
1094 // Finally, the keyword subpatterns:
1095 for (Py_ssize_t i = 0; i < PyTuple_GET_SIZE(kwargs); i++) {
1096 PyObject *name = PyTuple_GET_ITEM(kwargs, i);
1097 PyObject *attr = match_class_attr(tstate, subject, type, name, seen);
1098 if (attr == NULL) {
1099 goto fail;
1100 }
1101 PyList_Append(attrs, attr);
1102 Py_DECREF(attr);
1103 }
1104 Py_SETREF(attrs, PyList_AsTuple(attrs));
1105 Py_DECREF(seen);
1106 return attrs;
1107fail:
1108 // We really don't care whether an error was raised or not... that's our
1109 // caller's problem. All we know is that the match failed.
1110 Py_XDECREF(match_args);
1111 Py_DECREF(seen);
1112 Py_DECREF(attrs);
1113 return NULL;
1114}
1115
1116
Victor Stinner09532fe2019-05-10 23:39:09 +02001117static int do_raise(PyThreadState *tstate, PyObject *exc, PyObject *cause);
Victor Stinner438a12d2019-05-24 17:01:38 +02001118static int unpack_iterable(PyThreadState *, PyObject *, int, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +00001119
Victor Stinnere225beb2019-06-03 18:14:24 +02001120#define _Py_TracingPossible(ceval) ((ceval)->tracing_possible)
Antoine Pitrou074e5ed2009-11-10 19:50:40 +00001121
Guido van Rossum374a9221991-04-04 10:40:29 +00001122
Guido van Rossumb209a111997-04-29 18:18:01 +00001123PyObject *
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00001124PyEval_EvalCode(PyObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +00001125{
Victor Stinner46496f92021-02-20 15:17:18 +01001126 PyThreadState *tstate = PyThreadState_GET();
Mark Shannon0332e562021-02-01 10:42:03 +00001127 if (locals == NULL) {
1128 locals = globals;
1129 }
Victor Stinnerfc980e02021-03-18 14:51:24 +01001130 PyObject *builtins = _PyEval_BuiltinsFromGlobals(tstate, globals); // borrowed ref
Mark Shannon0332e562021-02-01 10:42:03 +00001131 if (builtins == NULL) {
1132 return NULL;
1133 }
1134 PyFrameConstructor desc = {
1135 .fc_globals = globals,
1136 .fc_builtins = builtins,
1137 .fc_name = ((PyCodeObject *)co)->co_name,
1138 .fc_qualname = ((PyCodeObject *)co)->co_name,
1139 .fc_code = co,
1140 .fc_defaults = NULL,
1141 .fc_kwdefaults = NULL,
1142 .fc_closure = NULL
1143 };
Victor Stinner46496f92021-02-20 15:17:18 +01001144 return _PyEval_Vector(tstate, &desc, locals, NULL, 0, NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001145}
1146
1147
1148/* Interpreter main loop */
1149
Martin v. Löwis8d97e332004-06-27 15:43:12 +00001150PyObject *
Victor Stinnerb9e68122019-11-14 12:20:46 +01001151PyEval_EvalFrame(PyFrameObject *f)
1152{
Victor Stinner0b72b232020-03-12 23:18:39 +01001153 /* Function kept for backward compatibility */
Victor Stinnerb9e68122019-11-14 12:20:46 +01001154 PyThreadState *tstate = _PyThreadState_GET();
1155 return _PyEval_EvalFrame(tstate, f, 0);
Phillip J. Eby0d6615f2005-08-02 00:46:46 +00001156}
1157
1158PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001159PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
Guido van Rossum374a9221991-04-04 10:40:29 +00001160{
Victor Stinnerb9e68122019-11-14 12:20:46 +01001161 PyThreadState *tstate = _PyThreadState_GET();
1162 return _PyEval_EvalFrame(tstate, f, throwflag);
Brett Cannon3cebf932016-09-05 15:33:46 -07001163}
1164
Victor Stinnerda2914d2020-03-20 09:29:08 +01001165
1166/* Handle signals, pending calls, GIL drop request
1167 and asynchronous exception */
1168static int
1169eval_frame_handle_pending(PyThreadState *tstate)
1170{
Victor Stinnerda2914d2020-03-20 09:29:08 +01001171 _PyRuntimeState * const runtime = &_PyRuntime;
1172 struct _ceval_runtime_state *ceval = &runtime->ceval;
Victor Stinnerb54a99d2020-04-08 23:35:05 +02001173
1174 /* Pending signals */
Victor Stinner299b8c62020-05-05 17:40:18 +02001175 if (_Py_atomic_load_relaxed(&ceval->signals_pending)) {
Victor Stinnerda2914d2020-03-20 09:29:08 +01001176 if (handle_signals(tstate) != 0) {
1177 return -1;
1178 }
1179 }
1180
1181 /* Pending calls */
Victor Stinner299b8c62020-05-05 17:40:18 +02001182 struct _ceval_state *ceval2 = &tstate->interp->ceval;
Victor Stinnerda2914d2020-03-20 09:29:08 +01001183 if (_Py_atomic_load_relaxed(&ceval2->pending.calls_to_do)) {
Victor Stinnerbcb094b2021-02-19 15:10:45 +01001184 if (make_pending_calls(tstate->interp) != 0) {
Victor Stinnerda2914d2020-03-20 09:29:08 +01001185 return -1;
1186 }
1187 }
1188
1189 /* GIL drop request */
Victor Stinner0b1e3302020-05-05 16:14:31 +02001190 if (_Py_atomic_load_relaxed(&ceval2->gil_drop_request)) {
Victor Stinnerda2914d2020-03-20 09:29:08 +01001191 /* Give another thread a chance */
1192 if (_PyThreadState_Swap(&runtime->gilstate, NULL) != tstate) {
1193 Py_FatalError("tstate mix-up");
1194 }
Victor Stinner0b1e3302020-05-05 16:14:31 +02001195 drop_gil(ceval, ceval2, tstate);
Victor Stinnerda2914d2020-03-20 09:29:08 +01001196
1197 /* Other threads may run now */
1198
1199 take_gil(tstate);
1200
Victor Stinnere838a932020-05-05 19:56:48 +02001201#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
1202 (void)_PyThreadState_Swap(&runtime->gilstate, tstate);
1203#else
Victor Stinnerda2914d2020-03-20 09:29:08 +01001204 if (_PyThreadState_Swap(&runtime->gilstate, tstate) != NULL) {
1205 Py_FatalError("orphan tstate");
1206 }
Victor Stinnere838a932020-05-05 19:56:48 +02001207#endif
Victor Stinnerda2914d2020-03-20 09:29:08 +01001208 }
1209
1210 /* Check for asynchronous exception. */
1211 if (tstate->async_exc != NULL) {
1212 PyObject *exc = tstate->async_exc;
1213 tstate->async_exc = NULL;
Victor Stinnerb54a99d2020-04-08 23:35:05 +02001214 UNSIGNAL_ASYNC_EXC(tstate->interp);
Victor Stinnerda2914d2020-03-20 09:29:08 +01001215 _PyErr_SetNone(tstate, exc);
1216 Py_DECREF(exc);
1217 return -1;
1218 }
1219
Victor Stinnerd96a7a82020-11-13 14:44:42 +01001220#ifdef MS_WINDOWS
1221 // bpo-42296: On Windows, _PyEval_SignalReceived() can be called in a
1222 // different thread than the Python thread, in which case
1223 // _Py_ThreadCanHandleSignals() is wrong. Recompute eval_breaker in the
1224 // current Python thread with the correct _Py_ThreadCanHandleSignals()
1225 // value. It prevents to interrupt the eval loop at every instruction if
1226 // the current Python thread cannot handle signals (if
1227 // _Py_ThreadCanHandleSignals() is false).
1228 COMPUTE_EVAL_BREAKER(tstate->interp, ceval, ceval2);
1229#endif
1230
Victor Stinnerda2914d2020-03-20 09:29:08 +01001231 return 0;
1232}
1233
Victor Stinner3c1e4812012-03-26 22:10:51 +02001234
Antoine Pitroub52ec782009-01-25 16:34:23 +00001235/* Computed GOTOs, or
1236 the-optimization-commonly-but-improperly-known-as-"threaded code"
1237 using gcc's labels-as-values extension
1238 (http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html).
1239
1240 The traditional bytecode evaluation loop uses a "switch" statement, which
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001241 decent compilers will optimize as a single indirect branch instruction
Antoine Pitroub52ec782009-01-25 16:34:23 +00001242 combined with a lookup table of jump addresses. However, since the
1243 indirect jump instruction is shared by all opcodes, the CPU will have a
1244 hard time making the right prediction for where to jump next (actually,
1245 it will be always wrong except in the uncommon case of a sequence of
1246 several identical opcodes).
1247
1248 "Threaded code" in contrast, uses an explicit jump table and an explicit
1249 indirect jump instruction at the end of each opcode. Since the jump
1250 instruction is at a different address for each opcode, the CPU will make a
1251 separate prediction for each of these instructions, which is equivalent to
1252 predicting the second opcode of each opcode pair. These predictions have
1253 a much better chance to turn out valid, especially in small bytecode loops.
1254
1255 A mispredicted branch on a modern CPU flushes the whole pipeline and
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001256 can cost several CPU cycles (depending on the pipeline depth),
Antoine Pitroub52ec782009-01-25 16:34:23 +00001257 and potentially many more instructions (depending on the pipeline width).
1258 A correctly predicted branch, however, is nearly free.
1259
1260 At the time of this writing, the "threaded code" version is up to 15-20%
1261 faster than the normal "switch" version, depending on the compiler and the
1262 CPU architecture.
1263
1264 We disable the optimization if DYNAMIC_EXECUTION_PROFILE is defined,
1265 because it would render the measurements invalid.
1266
1267
1268 NOTE: care must be taken that the compiler doesn't try to "optimize" the
1269 indirect jumps by sharing them between all opcodes. Such optimizations
1270 can be disabled on gcc by using the -fno-gcse flag (or possibly
1271 -fno-crossjumping).
1272*/
1273
Antoine Pitrou042b1282010-08-13 21:15:58 +00001274#ifdef DYNAMIC_EXECUTION_PROFILE
Antoine Pitroub52ec782009-01-25 16:34:23 +00001275#undef USE_COMPUTED_GOTOS
Antoine Pitrou042b1282010-08-13 21:15:58 +00001276#define USE_COMPUTED_GOTOS 0
Antoine Pitroub52ec782009-01-25 16:34:23 +00001277#endif
1278
Antoine Pitrou042b1282010-08-13 21:15:58 +00001279#ifdef HAVE_COMPUTED_GOTOS
1280 #ifndef USE_COMPUTED_GOTOS
1281 #define USE_COMPUTED_GOTOS 1
1282 #endif
1283#else
1284 #if defined(USE_COMPUTED_GOTOS) && USE_COMPUTED_GOTOS
1285 #error "Computed gotos are not supported on this compiler."
1286 #endif
1287 #undef USE_COMPUTED_GOTOS
1288 #define USE_COMPUTED_GOTOS 0
1289#endif
1290
1291#if USE_COMPUTED_GOTOS
Antoine Pitroub52ec782009-01-25 16:34:23 +00001292#define TARGET(op) \
Benjamin Petersonddd19492018-09-16 22:38:02 -07001293 op: \
1294 TARGET_##op
Antoine Pitroub52ec782009-01-25 16:34:23 +00001295
Antoine Pitroub52ec782009-01-25 16:34:23 +00001296#ifdef LLTRACE
Mark Shannon4958f5d2021-03-24 17:56:12 +00001297#define DISPATCH() \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001298 { \
Victor Stinnerdab84232020-03-17 18:56:44 +01001299 if (!lltrace && !_Py_TracingPossible(ceval2) && !PyDTrace_LINE_ENABLED()) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001300 f->f_lasti = INSTR_OFFSET(); \
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001301 NEXTOPARG(); \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001302 goto *opcode_targets[opcode]; \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001303 } \
1304 goto fast_next_opcode; \
1305 }
Antoine Pitroub52ec782009-01-25 16:34:23 +00001306#else
Mark Shannon4958f5d2021-03-24 17:56:12 +00001307#define DISPATCH() \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001308 { \
Victor Stinnerdab84232020-03-17 18:56:44 +01001309 if (!_Py_TracingPossible(ceval2) && !PyDTrace_LINE_ENABLED()) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001310 f->f_lasti = INSTR_OFFSET(); \
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001311 NEXTOPARG(); \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001312 goto *opcode_targets[opcode]; \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001313 } \
1314 goto fast_next_opcode; \
1315 }
Antoine Pitroub52ec782009-01-25 16:34:23 +00001316#endif
1317
1318#else
Benjamin Petersonddd19492018-09-16 22:38:02 -07001319#define TARGET(op) op
Mark Shannon4958f5d2021-03-24 17:56:12 +00001320#define DISPATCH() goto fast_next_opcode
1321
Antoine Pitroub52ec782009-01-25 16:34:23 +00001322#endif
1323
Mark Shannon4958f5d2021-03-24 17:56:12 +00001324#define CHECK_EVAL_BREAKER() \
1325 if (_Py_atomic_load_relaxed(eval_breaker)) { \
1326 continue; \
1327 }
1328
Antoine Pitroub52ec782009-01-25 16:34:23 +00001329
Neal Norwitza81d2202002-07-14 00:27:26 +00001330/* Tuple access macros */
1331
1332#ifndef Py_DEBUG
1333#define GETITEM(v, i) PyTuple_GET_ITEM((PyTupleObject *)(v), (i))
1334#else
1335#define GETITEM(v, i) PyTuple_GetItem((v), (i))
1336#endif
1337
Guido van Rossum374a9221991-04-04 10:40:29 +00001338/* Code access macros */
1339
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001340/* The integer overflow is checked by an assertion below. */
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001341#define INSTR_OFFSET() \
1342 (sizeof(_Py_CODEUNIT) * (int)(next_instr - first_instr))
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001343#define NEXTOPARG() do { \
Serhiy Storchakaab874002016-09-11 13:48:15 +03001344 _Py_CODEUNIT word = *next_instr; \
1345 opcode = _Py_OPCODE(word); \
1346 oparg = _Py_OPARG(word); \
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001347 next_instr++; \
1348 } while (0)
Serhiy Storchakaab874002016-09-11 13:48:15 +03001349#define JUMPTO(x) (next_instr = first_instr + (x) / sizeof(_Py_CODEUNIT))
1350#define JUMPBY(x) (next_instr += (x) / sizeof(_Py_CODEUNIT))
Guido van Rossum374a9221991-04-04 10:40:29 +00001351
Raymond Hettingerf606f872003-03-16 03:11:04 +00001352/* OpCode prediction macros
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001353 Some opcodes tend to come in pairs thus making it possible to
1354 predict the second code when the first is run. For example,
Serhiy Storchakada9c5132016-06-27 18:58:57 +03001355 COMPARE_OP is often followed by POP_JUMP_IF_FALSE or POP_JUMP_IF_TRUE.
Raymond Hettingerf606f872003-03-16 03:11:04 +00001356
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001357 Verifying the prediction costs a single high-speed test of a register
1358 variable against a constant. If the pairing was good, then the
1359 processor's own internal branch predication has a high likelihood of
1360 success, resulting in a nearly zero-overhead transition to the
1361 next opcode. A successful prediction saves a trip through the eval-loop
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001362 including its unpredictable switch-case branch. Combined with the
1363 processor's internal branch prediction, a successful PREDICT has the
1364 effect of making the two opcodes run as if they were a single new opcode
1365 with the bodies combined.
Raymond Hettingerf606f872003-03-16 03:11:04 +00001366
Georg Brandl86b2fb92008-07-16 03:43:04 +00001367 If collecting opcode statistics, your choices are to either keep the
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001368 predictions turned-on and interpret the results as if some opcodes
1369 had been combined or turn-off predictions so that the opcode frequency
1370 counter updates for both opcodes.
Antoine Pitroub52ec782009-01-25 16:34:23 +00001371
1372 Opcode prediction is disabled with threaded code, since the latter allows
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001373 the CPU to record separate branch prediction information for each
1374 opcode.
Antoine Pitroub52ec782009-01-25 16:34:23 +00001375
Raymond Hettingerf606f872003-03-16 03:11:04 +00001376*/
1377
Denis Chernikovbaf29b22020-02-21 12:17:50 +03001378#define PREDICT_ID(op) PRED_##op
1379
Antoine Pitrou042b1282010-08-13 21:15:58 +00001380#if defined(DYNAMIC_EXECUTION_PROFILE) || USE_COMPUTED_GOTOS
Denis Chernikovbaf29b22020-02-21 12:17:50 +03001381#define PREDICT(op) if (0) goto PREDICT_ID(op)
Raymond Hettingera7216982004-02-08 19:59:27 +00001382#else
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001383#define PREDICT(op) \
Denis Chernikovbaf29b22020-02-21 12:17:50 +03001384 do { \
Serhiy Storchakaab874002016-09-11 13:48:15 +03001385 _Py_CODEUNIT word = *next_instr; \
1386 opcode = _Py_OPCODE(word); \
Denis Chernikovbaf29b22020-02-21 12:17:50 +03001387 if (opcode == op) { \
Serhiy Storchakaab874002016-09-11 13:48:15 +03001388 oparg = _Py_OPARG(word); \
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001389 next_instr++; \
Denis Chernikovbaf29b22020-02-21 12:17:50 +03001390 goto PREDICT_ID(op); \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001391 } \
1392 } while(0)
Antoine Pitroub52ec782009-01-25 16:34:23 +00001393#endif
Denis Chernikovbaf29b22020-02-21 12:17:50 +03001394#define PREDICTED(op) PREDICT_ID(op):
Antoine Pitroub52ec782009-01-25 16:34:23 +00001395
Raymond Hettingerf606f872003-03-16 03:11:04 +00001396
Guido van Rossum374a9221991-04-04 10:40:29 +00001397/* Stack manipulation macros */
1398
Martin v. Löwis18e16552006-02-15 17:27:45 +00001399/* The stack can grow at most MAXINT deep, as co_nlocals and
1400 co_stacksize are ints. */
Stefan Krahb7e10102010-06-23 18:42:39 +00001401#define STACK_LEVEL() ((int)(stack_pointer - f->f_valuestack))
1402#define EMPTY() (STACK_LEVEL() == 0)
1403#define TOP() (stack_pointer[-1])
1404#define SECOND() (stack_pointer[-2])
1405#define THIRD() (stack_pointer[-3])
1406#define FOURTH() (stack_pointer[-4])
1407#define PEEK(n) (stack_pointer[-(n)])
1408#define SET_TOP(v) (stack_pointer[-1] = (v))
1409#define SET_SECOND(v) (stack_pointer[-2] = (v))
1410#define SET_THIRD(v) (stack_pointer[-3] = (v))
1411#define SET_FOURTH(v) (stack_pointer[-4] = (v))
Stefan Krahb7e10102010-06-23 18:42:39 +00001412#define BASIC_STACKADJ(n) (stack_pointer += n)
1413#define BASIC_PUSH(v) (*stack_pointer++ = (v))
1414#define BASIC_POP() (*--stack_pointer)
Guido van Rossum374a9221991-04-04 10:40:29 +00001415
Guido van Rossum96a42c81992-01-12 02:29:51 +00001416#ifdef LLTRACE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001417#define PUSH(v) { (void)(BASIC_PUSH(v), \
Victor Stinner438a12d2019-05-24 17:01:38 +02001418 lltrace && prtrace(tstate, TOP(), "push")); \
Stefan Krahb7e10102010-06-23 18:42:39 +00001419 assert(STACK_LEVEL() <= co->co_stacksize); }
Victor Stinner438a12d2019-05-24 17:01:38 +02001420#define POP() ((void)(lltrace && prtrace(tstate, TOP(), "pop")), \
Stefan Krahb7e10102010-06-23 18:42:39 +00001421 BASIC_POP())
costypetrisor8ed317f2018-07-31 20:55:14 +00001422#define STACK_GROW(n) do { \
1423 assert(n >= 0); \
1424 (void)(BASIC_STACKADJ(n), \
Victor Stinner438a12d2019-05-24 17:01:38 +02001425 lltrace && prtrace(tstate, TOP(), "stackadj")); \
costypetrisor8ed317f2018-07-31 20:55:14 +00001426 assert(STACK_LEVEL() <= co->co_stacksize); \
1427 } while (0)
1428#define STACK_SHRINK(n) do { \
1429 assert(n >= 0); \
Victor Stinner438a12d2019-05-24 17:01:38 +02001430 (void)(lltrace && prtrace(tstate, TOP(), "stackadj")); \
costypetrisor8ed317f2018-07-31 20:55:14 +00001431 (void)(BASIC_STACKADJ(-n)); \
1432 assert(STACK_LEVEL() <= co->co_stacksize); \
1433 } while (0)
Christian Heimes0449f632007-12-15 01:27:15 +00001434#define EXT_POP(STACK_POINTER) ((void)(lltrace && \
Victor Stinner438a12d2019-05-24 17:01:38 +02001435 prtrace(tstate, (STACK_POINTER)[-1], "ext_pop")), \
Stefan Krahb7e10102010-06-23 18:42:39 +00001436 *--(STACK_POINTER))
Guido van Rossum374a9221991-04-04 10:40:29 +00001437#else
Stefan Krahb7e10102010-06-23 18:42:39 +00001438#define PUSH(v) BASIC_PUSH(v)
1439#define POP() BASIC_POP()
costypetrisor8ed317f2018-07-31 20:55:14 +00001440#define STACK_GROW(n) BASIC_STACKADJ(n)
1441#define STACK_SHRINK(n) BASIC_STACKADJ(-n)
Guido van Rossumc2e20742006-02-27 22:32:47 +00001442#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
Guido van Rossum374a9221991-04-04 10:40:29 +00001443#endif
1444
Guido van Rossum681d79a1995-07-18 14:51:37 +00001445/* Local variable macros */
1446
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001447#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumcfbf1a32002-03-28 20:17:52 +00001448
1449/* The SETLOCAL() macro must not DECREF the local variable in-place and
1450 then store the new value; it must copy the old value to a temporary
1451 value, then store the new value, and then DECREF the temporary value.
1452 This is because it is possible that during the DECREF the frame is
1453 accessed by other code (e.g. a __del__ method or gc.collect()) and the
1454 variable would be pointing to already-freed memory. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001455#define SETLOCAL(i, value) do { PyObject *tmp = GETLOCAL(i); \
Stefan Krahb7e10102010-06-23 18:42:39 +00001456 GETLOCAL(i) = value; \
1457 Py_XDECREF(tmp); } while (0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00001458
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001459
1460#define UNWIND_BLOCK(b) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001461 while (STACK_LEVEL() > (b)->b_level) { \
1462 PyObject *v = POP(); \
1463 Py_XDECREF(v); \
1464 }
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001465
1466#define UNWIND_EXCEPT_HANDLER(b) \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001467 do { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001468 PyObject *type, *value, *traceback; \
Mark Shannonae3087c2017-10-22 22:41:51 +01001469 _PyErr_StackItem *exc_info; \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001470 assert(STACK_LEVEL() >= (b)->b_level + 3); \
1471 while (STACK_LEVEL() > (b)->b_level + 3) { \
1472 value = POP(); \
1473 Py_XDECREF(value); \
1474 } \
Mark Shannonae3087c2017-10-22 22:41:51 +01001475 exc_info = tstate->exc_info; \
1476 type = exc_info->exc_type; \
1477 value = exc_info->exc_value; \
1478 traceback = exc_info->exc_traceback; \
1479 exc_info->exc_type = POP(); \
1480 exc_info->exc_value = POP(); \
1481 exc_info->exc_traceback = POP(); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001482 Py_XDECREF(type); \
1483 Py_XDECREF(value); \
1484 Py_XDECREF(traceback); \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001485 } while(0)
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001486
Inada Naoki91234a12019-06-03 21:30:58 +09001487 /* macros for opcode cache */
1488#define OPCACHE_CHECK() \
1489 do { \
1490 co_opcache = NULL; \
1491 if (co->co_opcache != NULL) { \
Pablo Galindo109826c2020-10-20 06:22:44 +01001492 unsigned char co_opcache_offset = \
Inada Naoki91234a12019-06-03 21:30:58 +09001493 co->co_opcache_map[next_instr - first_instr]; \
Pablo Galindo109826c2020-10-20 06:22:44 +01001494 if (co_opcache_offset > 0) { \
1495 assert(co_opcache_offset <= co->co_opcache_size); \
1496 co_opcache = &co->co_opcache[co_opcache_offset - 1]; \
Inada Naoki91234a12019-06-03 21:30:58 +09001497 assert(co_opcache != NULL); \
Inada Naoki91234a12019-06-03 21:30:58 +09001498 } \
1499 } \
1500 } while (0)
1501
Pablo Galindo109826c2020-10-20 06:22:44 +01001502#define OPCACHE_DEOPT() \
1503 do { \
1504 if (co_opcache != NULL) { \
1505 co_opcache->optimized = -1; \
1506 unsigned char co_opcache_offset = \
1507 co->co_opcache_map[next_instr - first_instr]; \
1508 assert(co_opcache_offset <= co->co_opcache_size); \
1509 co->co_opcache_map[co_opcache_offset] = 0; \
1510 co_opcache = NULL; \
1511 } \
1512 } while (0)
1513
1514#define OPCACHE_DEOPT_LOAD_ATTR() \
1515 do { \
1516 if (co_opcache != NULL) { \
1517 OPCACHE_STAT_ATTR_DEOPT(); \
1518 OPCACHE_DEOPT(); \
1519 } \
1520 } while (0)
1521
1522#define OPCACHE_MAYBE_DEOPT_LOAD_ATTR() \
1523 do { \
1524 if (co_opcache != NULL && --co_opcache->optimized <= 0) { \
1525 OPCACHE_DEOPT_LOAD_ATTR(); \
1526 } \
1527 } while (0)
1528
Inada Naoki91234a12019-06-03 21:30:58 +09001529#if OPCACHE_STATS
1530
1531#define OPCACHE_STAT_GLOBAL_HIT() \
1532 do { \
1533 if (co->co_opcache != NULL) opcache_global_hits++; \
1534 } while (0)
1535
1536#define OPCACHE_STAT_GLOBAL_MISS() \
1537 do { \
1538 if (co->co_opcache != NULL) opcache_global_misses++; \
1539 } while (0)
1540
1541#define OPCACHE_STAT_GLOBAL_OPT() \
1542 do { \
1543 if (co->co_opcache != NULL) opcache_global_opts++; \
1544 } while (0)
1545
Pablo Galindo109826c2020-10-20 06:22:44 +01001546#define OPCACHE_STAT_ATTR_HIT() \
1547 do { \
1548 if (co->co_opcache != NULL) opcache_attr_hits++; \
1549 } while (0)
1550
1551#define OPCACHE_STAT_ATTR_MISS() \
1552 do { \
1553 if (co->co_opcache != NULL) opcache_attr_misses++; \
1554 } while (0)
1555
1556#define OPCACHE_STAT_ATTR_OPT() \
1557 do { \
1558 if (co->co_opcache!= NULL) opcache_attr_opts++; \
1559 } while (0)
1560
1561#define OPCACHE_STAT_ATTR_DEOPT() \
1562 do { \
1563 if (co->co_opcache != NULL) opcache_attr_deopts++; \
1564 } while (0)
1565
1566#define OPCACHE_STAT_ATTR_TOTAL() \
1567 do { \
1568 if (co->co_opcache != NULL) opcache_attr_total++; \
1569 } while (0)
1570
Inada Naoki91234a12019-06-03 21:30:58 +09001571#else /* OPCACHE_STATS */
1572
1573#define OPCACHE_STAT_GLOBAL_HIT()
1574#define OPCACHE_STAT_GLOBAL_MISS()
1575#define OPCACHE_STAT_GLOBAL_OPT()
1576
Pablo Galindo109826c2020-10-20 06:22:44 +01001577#define OPCACHE_STAT_ATTR_HIT()
1578#define OPCACHE_STAT_ATTR_MISS()
1579#define OPCACHE_STAT_ATTR_OPT()
1580#define OPCACHE_STAT_ATTR_DEOPT()
1581#define OPCACHE_STAT_ATTR_TOTAL()
1582
Inada Naoki91234a12019-06-03 21:30:58 +09001583#endif
1584
Mark Shannond41bddd2021-03-25 12:00:30 +00001585
1586PyObject* _Py_HOT_FUNCTION
1587_PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag)
1588{
1589 _Py_EnsureTstateNotNULL(tstate);
1590
1591#if USE_COMPUTED_GOTOS
1592/* Import the static jump table */
1593#include "opcode_targets.h"
1594#endif
1595
1596#ifdef DXPAIRS
1597 int lastopcode = 0;
1598#endif
1599 PyObject **stack_pointer; /* Next free slot in value stack */
1600 const _Py_CODEUNIT *next_instr;
1601 int opcode; /* Current opcode */
1602 int oparg; /* Current opcode argument, if any */
1603 PyObject **fastlocals, **freevars;
1604 PyObject *retval = NULL; /* Return value */
1605 struct _ceval_state * const ceval2 = &tstate->interp->ceval;
1606 _Py_atomic_int * const eval_breaker = &ceval2->eval_breaker;
1607 PyCodeObject *co;
1608
1609 /* when tracing we set things up so that
1610
1611 not (instr_lb <= current_bytecode_offset < instr_ub)
1612
1613 is true when the line being executed has changed. The
1614 initial values are such as to make this false the first
1615 time it is tested. */
1616
1617 const _Py_CODEUNIT *first_instr;
1618 PyObject *names;
1619 PyObject *consts;
1620 _PyOpcache *co_opcache;
1621
1622#ifdef LLTRACE
1623 _Py_IDENTIFIER(__ltrace__);
1624#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +00001625
Victor Stinnerbe434dc2019-11-05 00:51:22 +01001626 if (_Py_EnterRecursiveCall(tstate, "")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001627 return NULL;
Victor Stinnerbe434dc2019-11-05 00:51:22 +01001628 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001629
Mark Shannon8e1b4062021-03-05 14:45:50 +00001630 PyTraceInfo trace_info;
1631 /* Mark trace_info as initialized */
1632 trace_info.code = NULL;
1633
1634 /* push frame */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001635 tstate->frame = f;
Mark Shannon86433452021-01-07 16:49:02 +00001636 co = f->f_code;
Tim Peters5ca576e2001-06-18 22:08:13 +00001637
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001638 if (tstate->use_tracing) {
1639 if (tstate->c_tracefunc != NULL) {
1640 /* tstate->c_tracefunc, if defined, is a
1641 function that will be called on *every* entry
1642 to a code block. Its return value, if not
1643 None, is a function that will be called at
1644 the start of each executed line of code.
1645 (Actually, the function must return itself
1646 in order to continue tracing.) The trace
1647 functions are called with three arguments:
1648 a pointer to the current frame, a string
1649 indicating why the function is called, and
1650 an argument which depends on the situation.
1651 The global trace function is also called
1652 whenever an exception is detected. */
1653 if (call_trace_protected(tstate->c_tracefunc,
1654 tstate->c_traceobj,
Mark Shannon8e1b4062021-03-05 14:45:50 +00001655 tstate, f, &trace_info,
Mark Shannon86433452021-01-07 16:49:02 +00001656 PyTrace_CALL, Py_None)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001657 /* Trace function raised an error */
1658 goto exit_eval_frame;
1659 }
1660 }
1661 if (tstate->c_profilefunc != NULL) {
1662 /* Similar for c_profilefunc, except it needn't
1663 return itself and isn't called for "line" events */
1664 if (call_trace_protected(tstate->c_profilefunc,
1665 tstate->c_profileobj,
Mark Shannon8e1b4062021-03-05 14:45:50 +00001666 tstate, f, &trace_info,
Mark Shannon86433452021-01-07 16:49:02 +00001667 PyTrace_CALL, Py_None)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001668 /* Profile function raised an error */
1669 goto exit_eval_frame;
1670 }
1671 }
1672 }
Neil Schemenauer6c0f2002001-09-04 19:03:35 +00001673
Łukasz Langaa785c872016-09-09 17:37:37 -07001674 if (PyDTrace_FUNCTION_ENTRY_ENABLED())
1675 dtrace_function_entry(f);
1676
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001677 names = co->co_names;
1678 consts = co->co_consts;
1679 fastlocals = f->f_localsplus;
1680 freevars = f->f_localsplus + co->co_nlocals;
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001681 assert(PyBytes_Check(co->co_code));
1682 assert(PyBytes_GET_SIZE(co->co_code) <= INT_MAX);
Serhiy Storchakaab874002016-09-11 13:48:15 +03001683 assert(PyBytes_GET_SIZE(co->co_code) % sizeof(_Py_CODEUNIT) == 0);
1684 assert(_Py_IS_ALIGNED(PyBytes_AS_STRING(co->co_code), sizeof(_Py_CODEUNIT)));
1685 first_instr = (_Py_CODEUNIT *) PyBytes_AS_STRING(co->co_code);
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001686 /*
1687 f->f_lasti refers to the index of the last instruction,
1688 unless it's -1 in which case next_instr should be first_instr.
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001689
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001690 YIELD_FROM sets f_lasti to itself, in order to repeatedly yield
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05001691 multiple values.
Thomas Wouters902d6eb2007-01-09 23:18:33 +00001692
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001693 When the PREDICT() macros are enabled, some opcode pairs follow in
1694 direct succession without updating f->f_lasti. A successful
1695 prediction effectively links the two codes together as if they
1696 were a single new opcode; accordingly,f->f_lasti will point to
1697 the first code in the pair (for instance, GET_ITER followed by
1698 FOR_ITER is effectively a single opcode and f->f_lasti will point
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001699 to the beginning of the combined pair.)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001700 */
Serhiy Storchakaab874002016-09-11 13:48:15 +03001701 assert(f->f_lasti >= -1);
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001702 next_instr = first_instr;
1703 if (f->f_lasti >= 0) {
Serhiy Storchakaab874002016-09-11 13:48:15 +03001704 assert(f->f_lasti % sizeof(_Py_CODEUNIT) == 0);
1705 next_instr += f->f_lasti / sizeof(_Py_CODEUNIT) + 1;
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001706 }
Mark Shannoncb9879b2020-07-17 11:44:23 +01001707 stack_pointer = f->f_valuestack + f->f_stackdepth;
1708 /* Set f->f_stackdepth to -1.
1709 * Update when returning or calling trace function.
1710 Having f_stackdepth <= 0 ensures that invalid
1711 values are not visible to the cycle GC.
1712 We choose -1 rather than 0 to assist debugging.
1713 */
1714 f->f_stackdepth = -1;
1715 f->f_state = FRAME_EXECUTING;
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001716
Pablo Galindoaf5fa132021-02-28 22:41:09 +00001717 if (co->co_opcache_flag < opcache_min_runs) {
Inada Naoki91234a12019-06-03 21:30:58 +09001718 co->co_opcache_flag++;
Pablo Galindoaf5fa132021-02-28 22:41:09 +00001719 if (co->co_opcache_flag == opcache_min_runs) {
Inada Naoki91234a12019-06-03 21:30:58 +09001720 if (_PyCode_InitOpcache(co) < 0) {
Victor Stinner25104942020-04-24 02:43:18 +02001721 goto exit_eval_frame;
Inada Naoki91234a12019-06-03 21:30:58 +09001722 }
1723#if OPCACHE_STATS
1724 opcache_code_objects_extra_mem +=
1725 PyBytes_Size(co->co_code) / sizeof(_Py_CODEUNIT) +
1726 sizeof(_PyOpcache) * co->co_opcache_size;
1727 opcache_code_objects++;
1728#endif
1729 }
1730 }
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001731
Tim Peters5ca576e2001-06-18 22:08:13 +00001732#ifdef LLTRACE
Serhiy Storchakafb5db7e2020-10-26 08:43:39 +02001733 {
1734 int r = _PyDict_ContainsId(f->f_globals, &PyId___ltrace__);
1735 if (r < 0) {
1736 goto exit_eval_frame;
1737 }
1738 lltrace = r;
1739 }
Tim Peters5ca576e2001-06-18 22:08:13 +00001740#endif
Guido van Rossumac7be682001-01-17 15:42:30 +00001741
Serhiy Storchakafb5db7e2020-10-26 08:43:39 +02001742 if (throwflag) { /* support for generator.throw() */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001743 goto error;
Serhiy Storchakafb5db7e2020-10-26 08:43:39 +02001744 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001745
Victor Stinnerace47d72013-07-18 01:41:08 +02001746#ifdef Py_DEBUG
Victor Stinner0b72b232020-03-12 23:18:39 +01001747 /* _PyEval_EvalFrameDefault() must not be called with an exception set,
Victor Stinnera8cb5152017-01-18 14:12:51 +01001748 because it can clear it (directly or indirectly) and so the
Martin Panter9955a372015-10-07 10:26:23 +00001749 caller loses its exception */
Victor Stinner438a12d2019-05-24 17:01:38 +02001750 assert(!_PyErr_Occurred(tstate));
Victor Stinnerace47d72013-07-18 01:41:08 +02001751#endif
1752
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001753main_loop:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001754 for (;;) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001755 assert(stack_pointer >= f->f_valuestack); /* else underflow */
1756 assert(STACK_LEVEL() <= co->co_stacksize); /* else overflow */
Victor Stinner438a12d2019-05-24 17:01:38 +02001757 assert(!_PyErr_Occurred(tstate));
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001758
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001759 /* Do periodic things. Doing this every time through
1760 the loop would add too much overhead, so we do it
1761 only every Nth instruction. We also do it if
Chris Jerdonek4a12d122020-05-14 19:25:45 -07001762 ``pending.calls_to_do'' is set, i.e. when an asynchronous
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001763 event needs attention (e.g. a signal handler or
1764 async I/O handler); see Py_AddPendingCall() and
1765 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +00001766
Eric Snow7bda9de2019-03-08 17:25:54 -07001767 if (_Py_atomic_load_relaxed(eval_breaker)) {
Serhiy Storchaka3f4d90d2018-07-09 15:40:14 +03001768 opcode = _Py_OPCODE(*next_instr);
1769 if (opcode == SETUP_FINALLY ||
1770 opcode == SETUP_WITH ||
1771 opcode == BEFORE_ASYNC_WITH ||
1772 opcode == YIELD_FROM) {
1773 /* Few cases where we skip running signal handlers and other
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07001774 pending calls:
Serhiy Storchaka3f4d90d2018-07-09 15:40:14 +03001775 - If we're about to enter the 'with:'. It will prevent
1776 emitting a resource warning in the common idiom
1777 'with open(path) as file:'.
1778 - If we're about to enter the 'async with:'.
1779 - If we're about to enter the 'try:' of a try/finally (not
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07001780 *very* useful, but might help in some cases and it's
1781 traditional)
1782 - If we're resuming a chain of nested 'yield from' or
1783 'await' calls, then each frame is parked with YIELD_FROM
1784 as its next opcode. If the user hit control-C we want to
1785 wait until we've reached the innermost frame before
1786 running the signal handler and raising KeyboardInterrupt
1787 (see bpo-30039).
1788 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001789 goto fast_next_opcode;
1790 }
Eric Snowfdf282d2019-01-11 14:26:55 -07001791
Victor Stinnerda2914d2020-03-20 09:29:08 +01001792 if (eval_frame_handle_pending(tstate) != 0) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001793 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001794 }
1795 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001796
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001797 fast_next_opcode:
1798 f->f_lasti = INSTR_OFFSET();
Guido van Rossumac7be682001-01-17 15:42:30 +00001799
Łukasz Langaa785c872016-09-09 17:37:37 -07001800 if (PyDTrace_LINE_ENABLED())
Mark Shannon8e1b4062021-03-05 14:45:50 +00001801 maybe_dtrace_line(f, &trace_info);
Łukasz Langaa785c872016-09-09 17:37:37 -07001802
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001803 /* line-by-line tracing support */
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001804
Victor Stinnerdab84232020-03-17 18:56:44 +01001805 if (_Py_TracingPossible(ceval2) &&
Benjamin Peterson51f46162013-01-23 08:38:47 -05001806 tstate->c_tracefunc != NULL && !tstate->tracing) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001807 int err;
Victor Stinnerb7d8d8d2020-09-23 14:07:16 +02001808 /* see maybe_call_line_trace()
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001809 for expository comments */
Victor Stinnerb7d8d8d2020-09-23 14:07:16 +02001810 f->f_stackdepth = (int)(stack_pointer - f->f_valuestack);
Tim Peters8a5c3c72004-04-05 19:36:21 +00001811
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001812 err = maybe_call_line_trace(tstate->c_tracefunc,
1813 tstate->c_traceobj,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01001814 tstate, f,
Mark Shannon8e1b4062021-03-05 14:45:50 +00001815 &trace_info);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001816 /* Reload possibly changed frame fields */
1817 JUMPTO(f->f_lasti);
Mark Shannoncb9879b2020-07-17 11:44:23 +01001818 stack_pointer = f->f_valuestack+f->f_stackdepth;
1819 f->f_stackdepth = -1;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001820 if (err)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001821 /* trace function raised an exception */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001822 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001823 }
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001824
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001825 /* Extract opcode and argument */
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001826
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001827 NEXTOPARG();
Stefan Krahb7e10102010-06-23 18:42:39 +00001828 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +00001829#ifdef DYNAMIC_EXECUTION_PROFILE
1830#ifdef DXPAIRS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001831 dxpairs[lastopcode][opcode]++;
1832 lastopcode = opcode;
Guido van Rossum950361c1997-01-24 13:49:28 +00001833#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001834 dxp[opcode]++;
Guido van Rossum950361c1997-01-24 13:49:28 +00001835#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001836
Guido van Rossum96a42c81992-01-12 02:29:51 +00001837#ifdef LLTRACE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001838 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +00001839
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001840 if (lltrace) {
1841 if (HAS_ARG(opcode)) {
1842 printf("%d: %d, %d\n",
1843 f->f_lasti, opcode, oparg);
1844 }
1845 else {
1846 printf("%d: %d\n",
1847 f->f_lasti, opcode);
1848 }
1849 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001850#endif
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001851
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001852 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +00001853
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001854 /* BEWARE!
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001855 It is essential that any operation that fails must goto error
1856 and that all operation that succeed call [FAST_]DISPATCH() ! */
Guido van Rossumac7be682001-01-17 15:42:30 +00001857
Benjamin Petersonddd19492018-09-16 22:38:02 -07001858 case TARGET(NOP): {
Mark Shannon4958f5d2021-03-24 17:56:12 +00001859 DISPATCH();
Benjamin Petersonddd19492018-09-16 22:38:02 -07001860 }
Raymond Hettinger9c18e812004-06-21 16:31:15 +00001861
Benjamin Petersonddd19492018-09-16 22:38:02 -07001862 case TARGET(LOAD_FAST): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001863 PyObject *value = GETLOCAL(oparg);
1864 if (value == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02001865 format_exc_check_arg(tstate, PyExc_UnboundLocalError,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001866 UNBOUNDLOCAL_ERROR_MSG,
1867 PyTuple_GetItem(co->co_varnames, oparg));
1868 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001869 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001870 Py_INCREF(value);
1871 PUSH(value);
Mark Shannon4958f5d2021-03-24 17:56:12 +00001872 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001873 }
1874
Benjamin Petersonddd19492018-09-16 22:38:02 -07001875 case TARGET(LOAD_CONST): {
1876 PREDICTED(LOAD_CONST);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001877 PyObject *value = GETITEM(consts, oparg);
1878 Py_INCREF(value);
1879 PUSH(value);
Mark Shannon4958f5d2021-03-24 17:56:12 +00001880 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001881 }
Neil Schemenauer63543862002-02-17 19:10:14 +00001882
Benjamin Petersonddd19492018-09-16 22:38:02 -07001883 case TARGET(STORE_FAST): {
1884 PREDICTED(STORE_FAST);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001885 PyObject *value = POP();
1886 SETLOCAL(oparg, value);
Mark Shannon4958f5d2021-03-24 17:56:12 +00001887 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001888 }
Neil Schemenauer63543862002-02-17 19:10:14 +00001889
Benjamin Petersonddd19492018-09-16 22:38:02 -07001890 case TARGET(POP_TOP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001891 PyObject *value = POP();
1892 Py_DECREF(value);
Mark Shannon4958f5d2021-03-24 17:56:12 +00001893 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001894 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001895
Benjamin Petersonddd19492018-09-16 22:38:02 -07001896 case TARGET(ROT_TWO): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001897 PyObject *top = TOP();
1898 PyObject *second = SECOND();
1899 SET_TOP(second);
1900 SET_SECOND(top);
Mark Shannon4958f5d2021-03-24 17:56:12 +00001901 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001902 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001903
Benjamin Petersonddd19492018-09-16 22:38:02 -07001904 case TARGET(ROT_THREE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001905 PyObject *top = TOP();
1906 PyObject *second = SECOND();
1907 PyObject *third = THIRD();
1908 SET_TOP(second);
1909 SET_SECOND(third);
1910 SET_THIRD(top);
Mark Shannon4958f5d2021-03-24 17:56:12 +00001911 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001912 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001913
Benjamin Petersonddd19492018-09-16 22:38:02 -07001914 case TARGET(ROT_FOUR): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001915 PyObject *top = TOP();
1916 PyObject *second = SECOND();
1917 PyObject *third = THIRD();
1918 PyObject *fourth = FOURTH();
1919 SET_TOP(second);
1920 SET_SECOND(third);
1921 SET_THIRD(fourth);
1922 SET_FOURTH(top);
Mark Shannon4958f5d2021-03-24 17:56:12 +00001923 DISPATCH();
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001924 }
1925
Benjamin Petersonddd19492018-09-16 22:38:02 -07001926 case TARGET(DUP_TOP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001927 PyObject *top = TOP();
1928 Py_INCREF(top);
1929 PUSH(top);
Mark Shannon4958f5d2021-03-24 17:56:12 +00001930 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001931 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001932
Benjamin Petersonddd19492018-09-16 22:38:02 -07001933 case TARGET(DUP_TOP_TWO): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001934 PyObject *top = TOP();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001935 PyObject *second = SECOND();
Benjamin Petersonf208df32012-10-12 11:37:56 -04001936 Py_INCREF(top);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001937 Py_INCREF(second);
costypetrisor8ed317f2018-07-31 20:55:14 +00001938 STACK_GROW(2);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001939 SET_TOP(top);
1940 SET_SECOND(second);
Mark Shannon4958f5d2021-03-24 17:56:12 +00001941 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001942 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001943
Benjamin Petersonddd19492018-09-16 22:38:02 -07001944 case TARGET(UNARY_POSITIVE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001945 PyObject *value = TOP();
1946 PyObject *res = PyNumber_Positive(value);
1947 Py_DECREF(value);
1948 SET_TOP(res);
1949 if (res == NULL)
1950 goto error;
1951 DISPATCH();
1952 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001953
Benjamin Petersonddd19492018-09-16 22:38:02 -07001954 case TARGET(UNARY_NEGATIVE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001955 PyObject *value = TOP();
1956 PyObject *res = PyNumber_Negative(value);
1957 Py_DECREF(value);
1958 SET_TOP(res);
1959 if (res == NULL)
1960 goto error;
1961 DISPATCH();
1962 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001963
Benjamin Petersonddd19492018-09-16 22:38:02 -07001964 case TARGET(UNARY_NOT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001965 PyObject *value = TOP();
1966 int err = PyObject_IsTrue(value);
1967 Py_DECREF(value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001968 if (err == 0) {
1969 Py_INCREF(Py_True);
1970 SET_TOP(Py_True);
1971 DISPATCH();
1972 }
1973 else if (err > 0) {
1974 Py_INCREF(Py_False);
1975 SET_TOP(Py_False);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001976 DISPATCH();
1977 }
costypetrisor8ed317f2018-07-31 20:55:14 +00001978 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001979 goto error;
1980 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001981
Benjamin Petersonddd19492018-09-16 22:38:02 -07001982 case TARGET(UNARY_INVERT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001983 PyObject *value = TOP();
1984 PyObject *res = PyNumber_Invert(value);
1985 Py_DECREF(value);
1986 SET_TOP(res);
1987 if (res == NULL)
1988 goto error;
1989 DISPATCH();
1990 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001991
Benjamin Petersonddd19492018-09-16 22:38:02 -07001992 case TARGET(BINARY_POWER): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001993 PyObject *exp = POP();
1994 PyObject *base = TOP();
1995 PyObject *res = PyNumber_Power(base, exp, Py_None);
1996 Py_DECREF(base);
1997 Py_DECREF(exp);
1998 SET_TOP(res);
1999 if (res == NULL)
2000 goto error;
2001 DISPATCH();
2002 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002003
Benjamin Petersonddd19492018-09-16 22:38:02 -07002004 case TARGET(BINARY_MULTIPLY): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002005 PyObject *right = POP();
2006 PyObject *left = TOP();
2007 PyObject *res = PyNumber_Multiply(left, right);
2008 Py_DECREF(left);
2009 Py_DECREF(right);
2010 SET_TOP(res);
2011 if (res == NULL)
2012 goto error;
2013 DISPATCH();
2014 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002015
Benjamin Petersonddd19492018-09-16 22:38:02 -07002016 case TARGET(BINARY_MATRIX_MULTIPLY): {
Benjamin Petersond51374e2014-04-09 23:55:56 -04002017 PyObject *right = POP();
2018 PyObject *left = TOP();
2019 PyObject *res = PyNumber_MatrixMultiply(left, right);
2020 Py_DECREF(left);
2021 Py_DECREF(right);
2022 SET_TOP(res);
2023 if (res == NULL)
2024 goto error;
2025 DISPATCH();
2026 }
2027
Benjamin Petersonddd19492018-09-16 22:38:02 -07002028 case TARGET(BINARY_TRUE_DIVIDE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002029 PyObject *divisor = POP();
2030 PyObject *dividend = TOP();
2031 PyObject *quotient = PyNumber_TrueDivide(dividend, divisor);
2032 Py_DECREF(dividend);
2033 Py_DECREF(divisor);
2034 SET_TOP(quotient);
2035 if (quotient == NULL)
2036 goto error;
2037 DISPATCH();
2038 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002039
Benjamin Petersonddd19492018-09-16 22:38:02 -07002040 case TARGET(BINARY_FLOOR_DIVIDE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002041 PyObject *divisor = POP();
2042 PyObject *dividend = TOP();
2043 PyObject *quotient = PyNumber_FloorDivide(dividend, divisor);
2044 Py_DECREF(dividend);
2045 Py_DECREF(divisor);
2046 SET_TOP(quotient);
2047 if (quotient == NULL)
2048 goto error;
2049 DISPATCH();
2050 }
Guido van Rossum4668b002001-08-08 05:00:18 +00002051
Benjamin Petersonddd19492018-09-16 22:38:02 -07002052 case TARGET(BINARY_MODULO): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002053 PyObject *divisor = POP();
2054 PyObject *dividend = TOP();
Martijn Pietersd7e64332017-02-23 13:38:04 +00002055 PyObject *res;
2056 if (PyUnicode_CheckExact(dividend) && (
2057 !PyUnicode_Check(divisor) || PyUnicode_CheckExact(divisor))) {
2058 // fast path; string formatting, but not if the RHS is a str subclass
2059 // (see issue28598)
2060 res = PyUnicode_Format(dividend, divisor);
2061 } else {
2062 res = PyNumber_Remainder(dividend, divisor);
2063 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002064 Py_DECREF(divisor);
2065 Py_DECREF(dividend);
2066 SET_TOP(res);
2067 if (res == NULL)
2068 goto error;
2069 DISPATCH();
2070 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002071
Benjamin Petersonddd19492018-09-16 22:38:02 -07002072 case TARGET(BINARY_ADD): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002073 PyObject *right = POP();
2074 PyObject *left = TOP();
2075 PyObject *sum;
Victor Stinnerbd0a08e2020-10-01 18:57:37 +02002076 /* NOTE(vstinner): Please don't try to micro-optimize int+int on
Victor Stinnerd65f42a2016-10-20 12:18:10 +02002077 CPython using bytecode, it is simply worthless.
2078 See http://bugs.python.org/issue21955 and
2079 http://bugs.python.org/issue10044 for the discussion. In short,
2080 no patch shown any impact on a realistic benchmark, only a minor
2081 speedup on microbenchmarks. */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002082 if (PyUnicode_CheckExact(left) &&
2083 PyUnicode_CheckExact(right)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002084 sum = unicode_concatenate(tstate, left, right, f, next_instr);
Martin Panter95f53c12016-07-18 08:23:26 +00002085 /* unicode_concatenate consumed the ref to left */
Victor Stinnerd2a915d2011-10-02 20:34:20 +02002086 }
2087 else {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002088 sum = PyNumber_Add(left, right);
2089 Py_DECREF(left);
Victor Stinnerd2a915d2011-10-02 20:34:20 +02002090 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002091 Py_DECREF(right);
2092 SET_TOP(sum);
2093 if (sum == NULL)
2094 goto error;
2095 DISPATCH();
2096 }
2097
Benjamin Petersonddd19492018-09-16 22:38:02 -07002098 case TARGET(BINARY_SUBTRACT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002099 PyObject *right = POP();
2100 PyObject *left = TOP();
2101 PyObject *diff = PyNumber_Subtract(left, right);
2102 Py_DECREF(right);
2103 Py_DECREF(left);
2104 SET_TOP(diff);
2105 if (diff == NULL)
2106 goto error;
2107 DISPATCH();
2108 }
2109
Benjamin Petersonddd19492018-09-16 22:38:02 -07002110 case TARGET(BINARY_SUBSCR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002111 PyObject *sub = POP();
2112 PyObject *container = TOP();
2113 PyObject *res = PyObject_GetItem(container, sub);
2114 Py_DECREF(container);
2115 Py_DECREF(sub);
2116 SET_TOP(res);
2117 if (res == NULL)
2118 goto error;
2119 DISPATCH();
2120 }
2121
Benjamin Petersonddd19492018-09-16 22:38:02 -07002122 case TARGET(BINARY_LSHIFT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002123 PyObject *right = POP();
2124 PyObject *left = TOP();
2125 PyObject *res = PyNumber_Lshift(left, right);
2126 Py_DECREF(left);
2127 Py_DECREF(right);
2128 SET_TOP(res);
2129 if (res == NULL)
2130 goto error;
2131 DISPATCH();
2132 }
2133
Benjamin Petersonddd19492018-09-16 22:38:02 -07002134 case TARGET(BINARY_RSHIFT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002135 PyObject *right = POP();
2136 PyObject *left = TOP();
2137 PyObject *res = PyNumber_Rshift(left, right);
2138 Py_DECREF(left);
2139 Py_DECREF(right);
2140 SET_TOP(res);
2141 if (res == NULL)
2142 goto error;
2143 DISPATCH();
2144 }
2145
Benjamin Petersonddd19492018-09-16 22:38:02 -07002146 case TARGET(BINARY_AND): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002147 PyObject *right = POP();
2148 PyObject *left = TOP();
2149 PyObject *res = PyNumber_And(left, right);
2150 Py_DECREF(left);
2151 Py_DECREF(right);
2152 SET_TOP(res);
2153 if (res == NULL)
2154 goto error;
2155 DISPATCH();
2156 }
2157
Benjamin Petersonddd19492018-09-16 22:38:02 -07002158 case TARGET(BINARY_XOR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002159 PyObject *right = POP();
2160 PyObject *left = TOP();
2161 PyObject *res = PyNumber_Xor(left, right);
2162 Py_DECREF(left);
2163 Py_DECREF(right);
2164 SET_TOP(res);
2165 if (res == NULL)
2166 goto error;
2167 DISPATCH();
2168 }
2169
Benjamin Petersonddd19492018-09-16 22:38:02 -07002170 case TARGET(BINARY_OR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002171 PyObject *right = POP();
2172 PyObject *left = TOP();
2173 PyObject *res = PyNumber_Or(left, right);
2174 Py_DECREF(left);
2175 Py_DECREF(right);
2176 SET_TOP(res);
2177 if (res == NULL)
2178 goto error;
2179 DISPATCH();
2180 }
2181
Benjamin Petersonddd19492018-09-16 22:38:02 -07002182 case TARGET(LIST_APPEND): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002183 PyObject *v = POP();
2184 PyObject *list = PEEK(oparg);
2185 int err;
2186 err = PyList_Append(list, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002187 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002188 if (err != 0)
2189 goto error;
2190 PREDICT(JUMP_ABSOLUTE);
2191 DISPATCH();
2192 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002193
Benjamin Petersonddd19492018-09-16 22:38:02 -07002194 case TARGET(SET_ADD): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002195 PyObject *v = POP();
Raymond Hettinger41862222016-10-15 19:03:06 -07002196 PyObject *set = PEEK(oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002197 int err;
2198 err = PySet_Add(set, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002199 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002200 if (err != 0)
2201 goto error;
2202 PREDICT(JUMP_ABSOLUTE);
2203 DISPATCH();
2204 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002205
Benjamin Petersonddd19492018-09-16 22:38:02 -07002206 case TARGET(INPLACE_POWER): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002207 PyObject *exp = POP();
2208 PyObject *base = TOP();
2209 PyObject *res = PyNumber_InPlacePower(base, exp, Py_None);
2210 Py_DECREF(base);
2211 Py_DECREF(exp);
2212 SET_TOP(res);
2213 if (res == NULL)
2214 goto error;
2215 DISPATCH();
2216 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002217
Benjamin Petersonddd19492018-09-16 22:38:02 -07002218 case TARGET(INPLACE_MULTIPLY): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002219 PyObject *right = POP();
2220 PyObject *left = TOP();
2221 PyObject *res = PyNumber_InPlaceMultiply(left, right);
2222 Py_DECREF(left);
2223 Py_DECREF(right);
2224 SET_TOP(res);
2225 if (res == NULL)
2226 goto error;
2227 DISPATCH();
2228 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002229
Benjamin Petersonddd19492018-09-16 22:38:02 -07002230 case TARGET(INPLACE_MATRIX_MULTIPLY): {
Benjamin Petersond51374e2014-04-09 23:55:56 -04002231 PyObject *right = POP();
2232 PyObject *left = TOP();
2233 PyObject *res = PyNumber_InPlaceMatrixMultiply(left, right);
2234 Py_DECREF(left);
2235 Py_DECREF(right);
2236 SET_TOP(res);
2237 if (res == NULL)
2238 goto error;
2239 DISPATCH();
2240 }
2241
Benjamin Petersonddd19492018-09-16 22:38:02 -07002242 case TARGET(INPLACE_TRUE_DIVIDE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002243 PyObject *divisor = POP();
2244 PyObject *dividend = TOP();
2245 PyObject *quotient = PyNumber_InPlaceTrueDivide(dividend, divisor);
2246 Py_DECREF(dividend);
2247 Py_DECREF(divisor);
2248 SET_TOP(quotient);
2249 if (quotient == NULL)
2250 goto error;
2251 DISPATCH();
2252 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002253
Benjamin Petersonddd19492018-09-16 22:38:02 -07002254 case TARGET(INPLACE_FLOOR_DIVIDE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002255 PyObject *divisor = POP();
2256 PyObject *dividend = TOP();
2257 PyObject *quotient = PyNumber_InPlaceFloorDivide(dividend, divisor);
2258 Py_DECREF(dividend);
2259 Py_DECREF(divisor);
2260 SET_TOP(quotient);
2261 if (quotient == NULL)
2262 goto error;
2263 DISPATCH();
2264 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002265
Benjamin Petersonddd19492018-09-16 22:38:02 -07002266 case TARGET(INPLACE_MODULO): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002267 PyObject *right = POP();
2268 PyObject *left = TOP();
2269 PyObject *mod = PyNumber_InPlaceRemainder(left, right);
2270 Py_DECREF(left);
2271 Py_DECREF(right);
2272 SET_TOP(mod);
2273 if (mod == NULL)
2274 goto error;
2275 DISPATCH();
2276 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002277
Benjamin Petersonddd19492018-09-16 22:38:02 -07002278 case TARGET(INPLACE_ADD): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002279 PyObject *right = POP();
2280 PyObject *left = TOP();
2281 PyObject *sum;
2282 if (PyUnicode_CheckExact(left) && PyUnicode_CheckExact(right)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002283 sum = unicode_concatenate(tstate, left, right, f, next_instr);
Martin Panter95f53c12016-07-18 08:23:26 +00002284 /* unicode_concatenate consumed the ref to left */
Victor Stinnerd2a915d2011-10-02 20:34:20 +02002285 }
2286 else {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002287 sum = PyNumber_InPlaceAdd(left, right);
2288 Py_DECREF(left);
Victor Stinnerd2a915d2011-10-02 20:34:20 +02002289 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002290 Py_DECREF(right);
2291 SET_TOP(sum);
2292 if (sum == NULL)
2293 goto error;
2294 DISPATCH();
2295 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002296
Benjamin Petersonddd19492018-09-16 22:38:02 -07002297 case TARGET(INPLACE_SUBTRACT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002298 PyObject *right = POP();
2299 PyObject *left = TOP();
2300 PyObject *diff = PyNumber_InPlaceSubtract(left, right);
2301 Py_DECREF(left);
2302 Py_DECREF(right);
2303 SET_TOP(diff);
2304 if (diff == NULL)
2305 goto error;
2306 DISPATCH();
2307 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002308
Benjamin Petersonddd19492018-09-16 22:38:02 -07002309 case TARGET(INPLACE_LSHIFT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002310 PyObject *right = POP();
2311 PyObject *left = TOP();
2312 PyObject *res = PyNumber_InPlaceLshift(left, right);
2313 Py_DECREF(left);
2314 Py_DECREF(right);
2315 SET_TOP(res);
2316 if (res == NULL)
2317 goto error;
2318 DISPATCH();
2319 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002320
Benjamin Petersonddd19492018-09-16 22:38:02 -07002321 case TARGET(INPLACE_RSHIFT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002322 PyObject *right = POP();
2323 PyObject *left = TOP();
2324 PyObject *res = PyNumber_InPlaceRshift(left, right);
2325 Py_DECREF(left);
2326 Py_DECREF(right);
2327 SET_TOP(res);
2328 if (res == NULL)
2329 goto error;
2330 DISPATCH();
2331 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002332
Benjamin Petersonddd19492018-09-16 22:38:02 -07002333 case TARGET(INPLACE_AND): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002334 PyObject *right = POP();
2335 PyObject *left = TOP();
2336 PyObject *res = PyNumber_InPlaceAnd(left, right);
2337 Py_DECREF(left);
2338 Py_DECREF(right);
2339 SET_TOP(res);
2340 if (res == NULL)
2341 goto error;
2342 DISPATCH();
2343 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002344
Benjamin Petersonddd19492018-09-16 22:38:02 -07002345 case TARGET(INPLACE_XOR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002346 PyObject *right = POP();
2347 PyObject *left = TOP();
2348 PyObject *res = PyNumber_InPlaceXor(left, right);
2349 Py_DECREF(left);
2350 Py_DECREF(right);
2351 SET_TOP(res);
2352 if (res == NULL)
2353 goto error;
2354 DISPATCH();
2355 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002356
Benjamin Petersonddd19492018-09-16 22:38:02 -07002357 case TARGET(INPLACE_OR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002358 PyObject *right = POP();
2359 PyObject *left = TOP();
2360 PyObject *res = PyNumber_InPlaceOr(left, right);
2361 Py_DECREF(left);
2362 Py_DECREF(right);
2363 SET_TOP(res);
2364 if (res == NULL)
2365 goto error;
2366 DISPATCH();
2367 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002368
Benjamin Petersonddd19492018-09-16 22:38:02 -07002369 case TARGET(STORE_SUBSCR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002370 PyObject *sub = TOP();
2371 PyObject *container = SECOND();
2372 PyObject *v = THIRD();
2373 int err;
costypetrisor8ed317f2018-07-31 20:55:14 +00002374 STACK_SHRINK(3);
Martin Panter95f53c12016-07-18 08:23:26 +00002375 /* container[sub] = v */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002376 err = PyObject_SetItem(container, sub, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002377 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002378 Py_DECREF(container);
2379 Py_DECREF(sub);
2380 if (err != 0)
2381 goto error;
2382 DISPATCH();
2383 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002384
Benjamin Petersonddd19492018-09-16 22:38:02 -07002385 case TARGET(DELETE_SUBSCR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002386 PyObject *sub = TOP();
2387 PyObject *container = SECOND();
2388 int err;
costypetrisor8ed317f2018-07-31 20:55:14 +00002389 STACK_SHRINK(2);
Martin Panter95f53c12016-07-18 08:23:26 +00002390 /* del container[sub] */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002391 err = PyObject_DelItem(container, sub);
2392 Py_DECREF(container);
2393 Py_DECREF(sub);
2394 if (err != 0)
2395 goto error;
2396 DISPATCH();
2397 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00002398
Benjamin Petersonddd19492018-09-16 22:38:02 -07002399 case TARGET(PRINT_EXPR): {
Victor Stinnercab75e32013-11-06 22:38:37 +01002400 _Py_IDENTIFIER(displayhook);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002401 PyObject *value = POP();
Victor Stinnercab75e32013-11-06 22:38:37 +01002402 PyObject *hook = _PySys_GetObjectId(&PyId_displayhook);
Benjamin Petersonfe1bcb62012-10-12 11:40:01 -04002403 PyObject *res;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002404 if (hook == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002405 _PyErr_SetString(tstate, PyExc_RuntimeError,
2406 "lost sys.displayhook");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002407 Py_DECREF(value);
2408 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002409 }
Petr Viktorinffd97532020-02-11 17:46:57 +01002410 res = PyObject_CallOneArg(hook, value);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002411 Py_DECREF(value);
2412 if (res == NULL)
2413 goto error;
2414 Py_DECREF(res);
2415 DISPATCH();
2416 }
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00002417
Benjamin Petersonddd19492018-09-16 22:38:02 -07002418 case TARGET(RAISE_VARARGS): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002419 PyObject *cause = NULL, *exc = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002420 switch (oparg) {
2421 case 2:
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002422 cause = POP(); /* cause */
Stefan Krahf432a322017-08-21 13:09:59 +02002423 /* fall through */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002424 case 1:
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002425 exc = POP(); /* exc */
Stefan Krahf432a322017-08-21 13:09:59 +02002426 /* fall through */
2427 case 0:
Victor Stinner09532fe2019-05-10 23:39:09 +02002428 if (do_raise(tstate, exc, cause)) {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002429 goto exception_unwind;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002430 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002431 break;
2432 default:
Victor Stinner438a12d2019-05-24 17:01:38 +02002433 _PyErr_SetString(tstate, PyExc_SystemError,
2434 "bad RAISE_VARARGS oparg");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002435 break;
2436 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002437 goto error;
2438 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002439
Benjamin Petersonddd19492018-09-16 22:38:02 -07002440 case TARGET(RETURN_VALUE): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002441 retval = POP();
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002442 assert(f->f_iblock == 0);
Mark Shannone7c9f4a2020-01-13 12:51:26 +00002443 assert(EMPTY());
Mark Shannoncb9879b2020-07-17 11:44:23 +01002444 f->f_state = FRAME_RETURNED;
2445 f->f_stackdepth = 0;
Mark Shannone7c9f4a2020-01-13 12:51:26 +00002446 goto exiting;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002447 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002448
Benjamin Petersonddd19492018-09-16 22:38:02 -07002449 case TARGET(GET_AITER): {
Yury Selivanov6ef05902015-05-28 11:21:31 -04002450 unaryfunc getter = NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04002451 PyObject *iter = NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04002452 PyObject *obj = TOP();
2453 PyTypeObject *type = Py_TYPE(obj);
2454
Yury Selivanova6f6edb2016-06-09 15:08:31 -04002455 if (type->tp_as_async != NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04002456 getter = type->tp_as_async->am_aiter;
Yury Selivanova6f6edb2016-06-09 15:08:31 -04002457 }
Yury Selivanov75445082015-05-11 22:57:16 -04002458
2459 if (getter != NULL) {
2460 iter = (*getter)(obj);
2461 Py_DECREF(obj);
2462 if (iter == NULL) {
2463 SET_TOP(NULL);
2464 goto error;
2465 }
2466 }
2467 else {
2468 SET_TOP(NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02002469 _PyErr_Format(tstate, PyExc_TypeError,
2470 "'async for' requires an object with "
2471 "__aiter__ method, got %.100s",
2472 type->tp_name);
Yury Selivanov75445082015-05-11 22:57:16 -04002473 Py_DECREF(obj);
2474 goto error;
2475 }
2476
Yury Selivanovfaa135a2017-10-06 02:08:57 -04002477 if (Py_TYPE(iter)->tp_as_async == NULL ||
2478 Py_TYPE(iter)->tp_as_async->am_anext == NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04002479
Yury Selivanov398ff912017-03-02 22:20:00 -05002480 SET_TOP(NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02002481 _PyErr_Format(tstate, PyExc_TypeError,
2482 "'async for' received an object from __aiter__ "
2483 "that does not implement __anext__: %.100s",
2484 Py_TYPE(iter)->tp_name);
Yury Selivanov75445082015-05-11 22:57:16 -04002485 Py_DECREF(iter);
2486 goto error;
Yury Selivanova6f6edb2016-06-09 15:08:31 -04002487 }
2488
Yury Selivanovfaa135a2017-10-06 02:08:57 -04002489 SET_TOP(iter);
Yury Selivanov75445082015-05-11 22:57:16 -04002490 DISPATCH();
2491 }
2492
Benjamin Petersonddd19492018-09-16 22:38:02 -07002493 case TARGET(GET_ANEXT): {
Yury Selivanov6ef05902015-05-28 11:21:31 -04002494 unaryfunc getter = NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04002495 PyObject *next_iter = NULL;
2496 PyObject *awaitable = NULL;
2497 PyObject *aiter = TOP();
2498 PyTypeObject *type = Py_TYPE(aiter);
2499
Yury Selivanoveb636452016-09-08 22:01:51 -07002500 if (PyAsyncGen_CheckExact(aiter)) {
2501 awaitable = type->tp_as_async->am_anext(aiter);
2502 if (awaitable == NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04002503 goto error;
2504 }
Yury Selivanoveb636452016-09-08 22:01:51 -07002505 } else {
2506 if (type->tp_as_async != NULL){
2507 getter = type->tp_as_async->am_anext;
2508 }
Yury Selivanov75445082015-05-11 22:57:16 -04002509
Yury Selivanoveb636452016-09-08 22:01:51 -07002510 if (getter != NULL) {
2511 next_iter = (*getter)(aiter);
2512 if (next_iter == NULL) {
2513 goto error;
2514 }
2515 }
2516 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02002517 _PyErr_Format(tstate, PyExc_TypeError,
2518 "'async for' requires an iterator with "
2519 "__anext__ method, got %.100s",
2520 type->tp_name);
Yury Selivanoveb636452016-09-08 22:01:51 -07002521 goto error;
2522 }
Yury Selivanov75445082015-05-11 22:57:16 -04002523
Yury Selivanoveb636452016-09-08 22:01:51 -07002524 awaitable = _PyCoro_GetAwaitableIter(next_iter);
2525 if (awaitable == NULL) {
Yury Selivanov398ff912017-03-02 22:20:00 -05002526 _PyErr_FormatFromCause(
Yury Selivanoveb636452016-09-08 22:01:51 -07002527 PyExc_TypeError,
2528 "'async for' received an invalid object "
2529 "from __anext__: %.100s",
2530 Py_TYPE(next_iter)->tp_name);
2531
2532 Py_DECREF(next_iter);
2533 goto error;
2534 } else {
2535 Py_DECREF(next_iter);
2536 }
2537 }
Yury Selivanov75445082015-05-11 22:57:16 -04002538
2539 PUSH(awaitable);
Serhiy Storchakada9c5132016-06-27 18:58:57 +03002540 PREDICT(LOAD_CONST);
Yury Selivanov75445082015-05-11 22:57:16 -04002541 DISPATCH();
2542 }
2543
Benjamin Petersonddd19492018-09-16 22:38:02 -07002544 case TARGET(GET_AWAITABLE): {
2545 PREDICTED(GET_AWAITABLE);
Yury Selivanov75445082015-05-11 22:57:16 -04002546 PyObject *iterable = TOP();
Yury Selivanov5376ba92015-06-22 12:19:30 -04002547 PyObject *iter = _PyCoro_GetAwaitableIter(iterable);
Yury Selivanov75445082015-05-11 22:57:16 -04002548
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03002549 if (iter == NULL) {
Mark Shannonfee55262019-11-21 09:11:43 +00002550 int opcode_at_minus_3 = 0;
2551 if ((next_instr - first_instr) > 2) {
2552 opcode_at_minus_3 = _Py_OPCODE(next_instr[-3]);
2553 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002554 format_awaitable_error(tstate, Py_TYPE(iterable),
Mark Shannonfee55262019-11-21 09:11:43 +00002555 opcode_at_minus_3,
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03002556 _Py_OPCODE(next_instr[-2]));
2557 }
2558
Yury Selivanov75445082015-05-11 22:57:16 -04002559 Py_DECREF(iterable);
2560
Yury Selivanovc724bae2016-03-02 11:30:46 -05002561 if (iter != NULL && PyCoro_CheckExact(iter)) {
2562 PyObject *yf = _PyGen_yf((PyGenObject*)iter);
2563 if (yf != NULL) {
2564 /* `iter` is a coroutine object that is being
2565 awaited, `yf` is a pointer to the current awaitable
2566 being awaited on. */
2567 Py_DECREF(yf);
2568 Py_CLEAR(iter);
Victor Stinner438a12d2019-05-24 17:01:38 +02002569 _PyErr_SetString(tstate, PyExc_RuntimeError,
2570 "coroutine is being awaited already");
Yury Selivanovc724bae2016-03-02 11:30:46 -05002571 /* The code below jumps to `error` if `iter` is NULL. */
2572 }
2573 }
2574
Yury Selivanov75445082015-05-11 22:57:16 -04002575 SET_TOP(iter); /* Even if it's NULL */
2576
2577 if (iter == NULL) {
2578 goto error;
2579 }
2580
Serhiy Storchakada9c5132016-06-27 18:58:57 +03002581 PREDICT(LOAD_CONST);
Yury Selivanov75445082015-05-11 22:57:16 -04002582 DISPATCH();
2583 }
2584
Benjamin Petersonddd19492018-09-16 22:38:02 -07002585 case TARGET(YIELD_FROM): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002586 PyObject *v = POP();
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07002587 PyObject *receiver = TOP();
Vladimir Matveev037245c2020-10-09 17:15:15 -07002588 PySendResult gen_status;
2589 if (tstate->c_tracefunc == NULL) {
2590 gen_status = PyIter_Send(receiver, v, &retval);
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05002591 } else {
Vladimir Matveev037245c2020-10-09 17:15:15 -07002592 _Py_IDENTIFIER(send);
2593 if (v == Py_None && PyIter_Check(receiver)) {
2594 retval = Py_TYPE(receiver)->tp_iternext(receiver);
Vladimir Matveev2b053612020-09-18 18:38:38 -07002595 }
2596 else {
Vladimir Matveev037245c2020-10-09 17:15:15 -07002597 retval = _PyObject_CallMethodIdOneArg(receiver, &PyId_send, v);
Vladimir Matveev2b053612020-09-18 18:38:38 -07002598 }
Vladimir Matveev2b053612020-09-18 18:38:38 -07002599 if (retval == NULL) {
2600 if (tstate->c_tracefunc != NULL
2601 && _PyErr_ExceptionMatches(tstate, PyExc_StopIteration))
Mark Shannon8e1b4062021-03-05 14:45:50 +00002602 call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj, tstate, f, &trace_info);
Vladimir Matveev2b053612020-09-18 18:38:38 -07002603 if (_PyGen_FetchStopIterationValue(&retval) == 0) {
2604 gen_status = PYGEN_RETURN;
2605 }
2606 else {
2607 gen_status = PYGEN_ERROR;
2608 }
2609 }
2610 else {
2611 gen_status = PYGEN_NEXT;
2612 }
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05002613 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002614 Py_DECREF(v);
Vladimir Matveev2b053612020-09-18 18:38:38 -07002615 if (gen_status == PYGEN_ERROR) {
2616 assert (retval == NULL);
2617 goto error;
2618 }
2619 if (gen_status == PYGEN_RETURN) {
2620 assert (retval != NULL);
2621
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07002622 Py_DECREF(receiver);
Vladimir Matveev2b053612020-09-18 18:38:38 -07002623 SET_TOP(retval);
2624 retval = NULL;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002625 DISPATCH();
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002626 }
Vladimir Matveev2b053612020-09-18 18:38:38 -07002627 assert (gen_status == PYGEN_NEXT);
Martin Panter95f53c12016-07-18 08:23:26 +00002628 /* receiver remains on stack, retval is value to be yielded */
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05002629 /* and repeat... */
Victor Stinnerf7d199f2016-11-24 22:33:01 +01002630 assert(f->f_lasti >= (int)sizeof(_Py_CODEUNIT));
Serhiy Storchakaab874002016-09-11 13:48:15 +03002631 f->f_lasti -= sizeof(_Py_CODEUNIT);
Mark Shannoncb9879b2020-07-17 11:44:23 +01002632 f->f_state = FRAME_SUSPENDED;
Victor Stinnerb7d8d8d2020-09-23 14:07:16 +02002633 f->f_stackdepth = (int)(stack_pointer - f->f_valuestack);
Mark Shannone7c9f4a2020-01-13 12:51:26 +00002634 goto exiting;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002635 }
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002636
Benjamin Petersonddd19492018-09-16 22:38:02 -07002637 case TARGET(YIELD_VALUE): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002638 retval = POP();
Yury Selivanoveb636452016-09-08 22:01:51 -07002639
2640 if (co->co_flags & CO_ASYNC_GENERATOR) {
2641 PyObject *w = _PyAsyncGenValueWrapperNew(retval);
2642 Py_DECREF(retval);
2643 if (w == NULL) {
2644 retval = NULL;
2645 goto error;
2646 }
2647 retval = w;
2648 }
Mark Shannoncb9879b2020-07-17 11:44:23 +01002649 f->f_state = FRAME_SUSPENDED;
Victor Stinnerb7d8d8d2020-09-23 14:07:16 +02002650 f->f_stackdepth = (int)(stack_pointer - f->f_valuestack);
Mark Shannone7c9f4a2020-01-13 12:51:26 +00002651 goto exiting;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002652 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002653
Benjamin Petersonddd19492018-09-16 22:38:02 -07002654 case TARGET(POP_EXCEPT): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002655 PyObject *type, *value, *traceback;
2656 _PyErr_StackItem *exc_info;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002657 PyTryBlock *b = PyFrame_BlockPop(f);
2658 if (b->b_type != EXCEPT_HANDLER) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002659 _PyErr_SetString(tstate, PyExc_SystemError,
2660 "popped block is not an except handler");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002661 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002662 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002663 assert(STACK_LEVEL() >= (b)->b_level + 3 &&
2664 STACK_LEVEL() <= (b)->b_level + 4);
2665 exc_info = tstate->exc_info;
2666 type = exc_info->exc_type;
2667 value = exc_info->exc_value;
2668 traceback = exc_info->exc_traceback;
2669 exc_info->exc_type = POP();
2670 exc_info->exc_value = POP();
2671 exc_info->exc_traceback = POP();
2672 Py_XDECREF(type);
2673 Py_XDECREF(value);
2674 Py_XDECREF(traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002675 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002676 }
Benjamin Petersoneec3d712008-06-11 15:59:43 +00002677
Benjamin Petersonddd19492018-09-16 22:38:02 -07002678 case TARGET(POP_BLOCK): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002679 PyFrame_BlockPop(f);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002680 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002681 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002682
Mark Shannonfee55262019-11-21 09:11:43 +00002683 case TARGET(RERAISE): {
Mark Shannonbf353f32020-12-17 13:55:28 +00002684 assert(f->f_iblock > 0);
2685 if (oparg) {
2686 f->f_lasti = f->f_blockstack[f->f_iblock-1].b_handler;
2687 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002688 PyObject *exc = POP();
Mark Shannonfee55262019-11-21 09:11:43 +00002689 PyObject *val = POP();
2690 PyObject *tb = POP();
2691 assert(PyExceptionClass_Check(exc));
Victor Stinner61f4db82020-01-28 03:37:45 +01002692 _PyErr_Restore(tstate, exc, val, tb);
Mark Shannonfee55262019-11-21 09:11:43 +00002693 goto exception_unwind;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002694 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002695
Benjamin Petersonddd19492018-09-16 22:38:02 -07002696 case TARGET(END_ASYNC_FOR): {
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002697 PyObject *exc = POP();
2698 assert(PyExceptionClass_Check(exc));
2699 if (PyErr_GivenExceptionMatches(exc, PyExc_StopAsyncIteration)) {
2700 PyTryBlock *b = PyFrame_BlockPop(f);
2701 assert(b->b_type == EXCEPT_HANDLER);
2702 Py_DECREF(exc);
2703 UNWIND_EXCEPT_HANDLER(b);
2704 Py_DECREF(POP());
2705 JUMPBY(oparg);
Mark Shannon4958f5d2021-03-24 17:56:12 +00002706 DISPATCH();
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002707 }
2708 else {
2709 PyObject *val = POP();
2710 PyObject *tb = POP();
Victor Stinner438a12d2019-05-24 17:01:38 +02002711 _PyErr_Restore(tstate, exc, val, tb);
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002712 goto exception_unwind;
2713 }
2714 }
2715
Zackery Spytzce6a0702019-08-25 03:44:09 -06002716 case TARGET(LOAD_ASSERTION_ERROR): {
2717 PyObject *value = PyExc_AssertionError;
2718 Py_INCREF(value);
2719 PUSH(value);
Mark Shannon4958f5d2021-03-24 17:56:12 +00002720 DISPATCH();
Zackery Spytzce6a0702019-08-25 03:44:09 -06002721 }
2722
Benjamin Petersonddd19492018-09-16 22:38:02 -07002723 case TARGET(LOAD_BUILD_CLASS): {
Victor Stinner3c1e4812012-03-26 22:10:51 +02002724 _Py_IDENTIFIER(__build_class__);
Victor Stinnerb0b22422012-04-19 00:57:45 +02002725
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002726 PyObject *bc;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002727 if (PyDict_CheckExact(f->f_builtins)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002728 bc = _PyDict_GetItemIdWithError(f->f_builtins, &PyId___build_class__);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002729 if (bc == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002730 if (!_PyErr_Occurred(tstate)) {
2731 _PyErr_SetString(tstate, PyExc_NameError,
2732 "__build_class__ not found");
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002733 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002734 goto error;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002735 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002736 Py_INCREF(bc);
Victor Stinnerb0b22422012-04-19 00:57:45 +02002737 }
2738 else {
2739 PyObject *build_class_str = _PyUnicode_FromId(&PyId___build_class__);
2740 if (build_class_str == NULL)
Serhiy Storchaka70b72f02016-11-08 23:12:46 +02002741 goto error;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002742 bc = PyObject_GetItem(f->f_builtins, build_class_str);
2743 if (bc == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002744 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError))
2745 _PyErr_SetString(tstate, PyExc_NameError,
2746 "__build_class__ not found");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002747 goto error;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002748 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002749 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002750 PUSH(bc);
Benjamin Peterson00f86f22012-10-10 14:10:33 -04002751 DISPATCH();
Victor Stinner3c1e4812012-03-26 22:10:51 +02002752 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002753
Benjamin Petersonddd19492018-09-16 22:38:02 -07002754 case TARGET(STORE_NAME): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002755 PyObject *name = GETITEM(names, oparg);
2756 PyObject *v = POP();
2757 PyObject *ns = f->f_locals;
2758 int err;
2759 if (ns == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002760 _PyErr_Format(tstate, PyExc_SystemError,
2761 "no locals found when storing %R", name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002762 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002763 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002764 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002765 if (PyDict_CheckExact(ns))
2766 err = PyDict_SetItem(ns, name, v);
2767 else
2768 err = PyObject_SetItem(ns, name, v);
2769 Py_DECREF(v);
2770 if (err != 0)
2771 goto error;
2772 DISPATCH();
2773 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002774
Benjamin Petersonddd19492018-09-16 22:38:02 -07002775 case TARGET(DELETE_NAME): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002776 PyObject *name = GETITEM(names, oparg);
2777 PyObject *ns = f->f_locals;
2778 int err;
2779 if (ns == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002780 _PyErr_Format(tstate, PyExc_SystemError,
2781 "no locals when deleting %R", name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002782 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002783 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002784 err = PyObject_DelItem(ns, name);
2785 if (err != 0) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002786 format_exc_check_arg(tstate, PyExc_NameError,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002787 NAME_ERROR_MSG,
2788 name);
2789 goto error;
2790 }
2791 DISPATCH();
2792 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00002793
Benjamin Petersonddd19492018-09-16 22:38:02 -07002794 case TARGET(UNPACK_SEQUENCE): {
2795 PREDICTED(UNPACK_SEQUENCE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002796 PyObject *seq = POP(), *item, **items;
2797 if (PyTuple_CheckExact(seq) &&
2798 PyTuple_GET_SIZE(seq) == oparg) {
2799 items = ((PyTupleObject *)seq)->ob_item;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002800 while (oparg--) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002801 item = items[oparg];
2802 Py_INCREF(item);
2803 PUSH(item);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002804 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002805 } else if (PyList_CheckExact(seq) &&
2806 PyList_GET_SIZE(seq) == oparg) {
2807 items = ((PyListObject *)seq)->ob_item;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002808 while (oparg--) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002809 item = items[oparg];
2810 Py_INCREF(item);
2811 PUSH(item);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002812 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002813 } else if (unpack_iterable(tstate, seq, oparg, -1,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002814 stack_pointer + oparg)) {
costypetrisor8ed317f2018-07-31 20:55:14 +00002815 STACK_GROW(oparg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002816 } else {
2817 /* unpack_iterable() raised an exception */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002818 Py_DECREF(seq);
2819 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002820 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002821 Py_DECREF(seq);
Benjamin Peterson00f86f22012-10-10 14:10:33 -04002822 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002823 }
Guido van Rossum0368b722007-05-11 16:50:42 +00002824
Benjamin Petersonddd19492018-09-16 22:38:02 -07002825 case TARGET(UNPACK_EX): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002826 int totalargs = 1 + (oparg & 0xFF) + (oparg >> 8);
2827 PyObject *seq = POP();
2828
Victor Stinner438a12d2019-05-24 17:01:38 +02002829 if (unpack_iterable(tstate, seq, oparg & 0xFF, oparg >> 8,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002830 stack_pointer + totalargs)) {
2831 stack_pointer += totalargs;
2832 } else {
2833 Py_DECREF(seq);
2834 goto error;
2835 }
2836 Py_DECREF(seq);
2837 DISPATCH();
2838 }
2839
Benjamin Petersonddd19492018-09-16 22:38:02 -07002840 case TARGET(STORE_ATTR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002841 PyObject *name = GETITEM(names, oparg);
2842 PyObject *owner = TOP();
2843 PyObject *v = SECOND();
2844 int err;
costypetrisor8ed317f2018-07-31 20:55:14 +00002845 STACK_SHRINK(2);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002846 err = PyObject_SetAttr(owner, name, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002847 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002848 Py_DECREF(owner);
2849 if (err != 0)
2850 goto error;
2851 DISPATCH();
2852 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002853
Benjamin Petersonddd19492018-09-16 22:38:02 -07002854 case TARGET(DELETE_ATTR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002855 PyObject *name = GETITEM(names, oparg);
2856 PyObject *owner = POP();
2857 int err;
2858 err = PyObject_SetAttr(owner, name, (PyObject *)NULL);
2859 Py_DECREF(owner);
2860 if (err != 0)
2861 goto error;
2862 DISPATCH();
2863 }
2864
Benjamin Petersonddd19492018-09-16 22:38:02 -07002865 case TARGET(STORE_GLOBAL): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002866 PyObject *name = GETITEM(names, oparg);
2867 PyObject *v = POP();
2868 int err;
2869 err = PyDict_SetItem(f->f_globals, name, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002870 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002871 if (err != 0)
2872 goto error;
2873 DISPATCH();
2874 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002875
Benjamin Petersonddd19492018-09-16 22:38:02 -07002876 case TARGET(DELETE_GLOBAL): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002877 PyObject *name = GETITEM(names, oparg);
2878 int err;
2879 err = PyDict_DelItem(f->f_globals, name);
2880 if (err != 0) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002881 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
2882 format_exc_check_arg(tstate, PyExc_NameError,
2883 NAME_ERROR_MSG, name);
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002884 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002885 goto error;
Benjamin Peterson00f86f22012-10-10 14:10:33 -04002886 }
2887 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002888 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002889
Benjamin Petersonddd19492018-09-16 22:38:02 -07002890 case TARGET(LOAD_NAME): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002891 PyObject *name = GETITEM(names, oparg);
2892 PyObject *locals = f->f_locals;
2893 PyObject *v;
2894 if (locals == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002895 _PyErr_Format(tstate, PyExc_SystemError,
2896 "no locals when loading %R", name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002897 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002898 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002899 if (PyDict_CheckExact(locals)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002900 v = PyDict_GetItemWithError(locals, name);
2901 if (v != NULL) {
2902 Py_INCREF(v);
2903 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002904 else if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002905 goto error;
2906 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002907 }
2908 else {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002909 v = PyObject_GetItem(locals, name);
Victor Stinnere20310f2015-11-05 13:56:58 +01002910 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002911 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError))
Benjamin Peterson92722792012-12-15 12:51:05 -05002912 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02002913 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002914 }
2915 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002916 if (v == NULL) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002917 v = PyDict_GetItemWithError(f->f_globals, name);
2918 if (v != NULL) {
2919 Py_INCREF(v);
2920 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002921 else if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002922 goto error;
2923 }
2924 else {
Victor Stinnerb0b22422012-04-19 00:57:45 +02002925 if (PyDict_CheckExact(f->f_builtins)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002926 v = PyDict_GetItemWithError(f->f_builtins, name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002927 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002928 if (!_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002929 format_exc_check_arg(
Victor Stinner438a12d2019-05-24 17:01:38 +02002930 tstate, PyExc_NameError,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002931 NAME_ERROR_MSG, name);
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002932 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002933 goto error;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002934 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002935 Py_INCREF(v);
Victor Stinnerb0b22422012-04-19 00:57:45 +02002936 }
2937 else {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002938 v = PyObject_GetItem(f->f_builtins, name);
2939 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002940 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Victor Stinnerb0b22422012-04-19 00:57:45 +02002941 format_exc_check_arg(
Victor Stinner438a12d2019-05-24 17:01:38 +02002942 tstate, PyExc_NameError,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002943 NAME_ERROR_MSG, name);
Victor Stinner438a12d2019-05-24 17:01:38 +02002944 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002945 goto error;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002946 }
Benjamin Peterson20f9c3c2010-07-20 22:39:34 +00002947 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002948 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002949 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002950 PUSH(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002951 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002952 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002953
Benjamin Petersonddd19492018-09-16 22:38:02 -07002954 case TARGET(LOAD_GLOBAL): {
Inada Naoki91234a12019-06-03 21:30:58 +09002955 PyObject *name;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002956 PyObject *v;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002957 if (PyDict_CheckExact(f->f_globals)
Victor Stinnerb4efc962015-11-20 09:24:02 +01002958 && PyDict_CheckExact(f->f_builtins))
2959 {
Inada Naoki91234a12019-06-03 21:30:58 +09002960 OPCACHE_CHECK();
2961 if (co_opcache != NULL && co_opcache->optimized > 0) {
2962 _PyOpcache_LoadGlobal *lg = &co_opcache->u.lg;
2963
2964 if (lg->globals_ver ==
2965 ((PyDictObject *)f->f_globals)->ma_version_tag
2966 && lg->builtins_ver ==
2967 ((PyDictObject *)f->f_builtins)->ma_version_tag)
2968 {
2969 PyObject *ptr = lg->ptr;
2970 OPCACHE_STAT_GLOBAL_HIT();
2971 assert(ptr != NULL);
2972 Py_INCREF(ptr);
2973 PUSH(ptr);
2974 DISPATCH();
2975 }
2976 }
2977
2978 name = GETITEM(names, oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002979 v = _PyDict_LoadGlobal((PyDictObject *)f->f_globals,
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002980 (PyDictObject *)f->f_builtins,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002981 name);
2982 if (v == NULL) {
Victor Stinnera4860542021-02-19 15:08:54 +01002983 if (!_PyErr_Occurred(tstate)) {
Victor Stinnerb4efc962015-11-20 09:24:02 +01002984 /* _PyDict_LoadGlobal() returns NULL without raising
2985 * an exception if the key doesn't exist */
Victor Stinner438a12d2019-05-24 17:01:38 +02002986 format_exc_check_arg(tstate, PyExc_NameError,
Ezio Melotti04a29552013-03-03 15:12:44 +02002987 NAME_ERROR_MSG, name);
Victor Stinnerb4efc962015-11-20 09:24:02 +01002988 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002989 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002990 }
Inada Naoki91234a12019-06-03 21:30:58 +09002991
2992 if (co_opcache != NULL) {
2993 _PyOpcache_LoadGlobal *lg = &co_opcache->u.lg;
2994
2995 if (co_opcache->optimized == 0) {
2996 /* Wasn't optimized before. */
2997 OPCACHE_STAT_GLOBAL_OPT();
2998 } else {
2999 OPCACHE_STAT_GLOBAL_MISS();
3000 }
3001
3002 co_opcache->optimized = 1;
3003 lg->globals_ver =
3004 ((PyDictObject *)f->f_globals)->ma_version_tag;
3005 lg->builtins_ver =
3006 ((PyDictObject *)f->f_builtins)->ma_version_tag;
3007 lg->ptr = v; /* borrowed */
3008 }
3009
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003010 Py_INCREF(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003011 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003012 else {
3013 /* Slow-path if globals or builtins is not a dict */
Victor Stinnerb4efc962015-11-20 09:24:02 +01003014
3015 /* namespace 1: globals */
Inada Naoki91234a12019-06-03 21:30:58 +09003016 name = GETITEM(names, oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003017 v = PyObject_GetItem(f->f_globals, name);
3018 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003019 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Victor Stinner60a1d3c2015-11-05 13:55:20 +01003020 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02003021 }
3022 _PyErr_Clear(tstate);
Victor Stinner60a1d3c2015-11-05 13:55:20 +01003023
Victor Stinnerb4efc962015-11-20 09:24:02 +01003024 /* namespace 2: builtins */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003025 v = PyObject_GetItem(f->f_builtins, name);
3026 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003027 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003028 format_exc_check_arg(
Victor Stinner438a12d2019-05-24 17:01:38 +02003029 tstate, PyExc_NameError,
Ezio Melotti04a29552013-03-03 15:12:44 +02003030 NAME_ERROR_MSG, name);
Victor Stinner438a12d2019-05-24 17:01:38 +02003031 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003032 goto error;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003033 }
3034 }
3035 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003036 PUSH(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003037 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003038 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003039
Benjamin Petersonddd19492018-09-16 22:38:02 -07003040 case TARGET(DELETE_FAST): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003041 PyObject *v = GETLOCAL(oparg);
3042 if (v != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003043 SETLOCAL(oparg, NULL);
3044 DISPATCH();
3045 }
3046 format_exc_check_arg(
Victor Stinner438a12d2019-05-24 17:01:38 +02003047 tstate, PyExc_UnboundLocalError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003048 UNBOUNDLOCAL_ERROR_MSG,
3049 PyTuple_GetItem(co->co_varnames, oparg)
3050 );
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003051 goto error;
3052 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003053
Benjamin Petersonddd19492018-09-16 22:38:02 -07003054 case TARGET(DELETE_DEREF): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003055 PyObject *cell = freevars[oparg];
Raymond Hettingerc32f9db2016-11-12 04:10:35 -05003056 PyObject *oldobj = PyCell_GET(cell);
3057 if (oldobj != NULL) {
3058 PyCell_SET(cell, NULL);
3059 Py_DECREF(oldobj);
Benjamin Peterson00ebe2c2010-09-10 22:02:31 +00003060 DISPATCH();
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00003061 }
Victor Stinner438a12d2019-05-24 17:01:38 +02003062 format_exc_unbound(tstate, co, oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003063 goto error;
3064 }
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00003065
Benjamin Petersonddd19492018-09-16 22:38:02 -07003066 case TARGET(LOAD_CLOSURE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003067 PyObject *cell = freevars[oparg];
3068 Py_INCREF(cell);
3069 PUSH(cell);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003070 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003071 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003072
Benjamin Petersonddd19492018-09-16 22:38:02 -07003073 case TARGET(LOAD_CLASSDEREF): {
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04003074 PyObject *name, *value, *locals = f->f_locals;
Victor Stinnerd3dfd0e2013-05-16 23:48:01 +02003075 Py_ssize_t idx;
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04003076 assert(locals);
3077 assert(oparg >= PyTuple_GET_SIZE(co->co_cellvars));
3078 idx = oparg - PyTuple_GET_SIZE(co->co_cellvars);
3079 assert(idx >= 0 && idx < PyTuple_GET_SIZE(co->co_freevars));
3080 name = PyTuple_GET_ITEM(co->co_freevars, idx);
3081 if (PyDict_CheckExact(locals)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02003082 value = PyDict_GetItemWithError(locals, name);
3083 if (value != NULL) {
3084 Py_INCREF(value);
3085 }
Victor Stinner438a12d2019-05-24 17:01:38 +02003086 else if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02003087 goto error;
3088 }
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04003089 }
3090 else {
3091 value = PyObject_GetItem(locals, name);
Victor Stinnere20310f2015-11-05 13:56:58 +01003092 if (value == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003093 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04003094 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02003095 }
3096 _PyErr_Clear(tstate);
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04003097 }
3098 }
3099 if (!value) {
3100 PyObject *cell = freevars[oparg];
3101 value = PyCell_GET(cell);
3102 if (value == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003103 format_exc_unbound(tstate, co, oparg);
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04003104 goto error;
3105 }
3106 Py_INCREF(value);
3107 }
3108 PUSH(value);
3109 DISPATCH();
3110 }
3111
Benjamin Petersonddd19492018-09-16 22:38:02 -07003112 case TARGET(LOAD_DEREF): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003113 PyObject *cell = freevars[oparg];
3114 PyObject *value = PyCell_GET(cell);
3115 if (value == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003116 format_exc_unbound(tstate, co, oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003117 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003118 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003119 Py_INCREF(value);
3120 PUSH(value);
3121 DISPATCH();
3122 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003123
Benjamin Petersonddd19492018-09-16 22:38:02 -07003124 case TARGET(STORE_DEREF): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003125 PyObject *v = POP();
3126 PyObject *cell = freevars[oparg];
Raymond Hettingerb2b15432016-11-11 04:32:11 -08003127 PyObject *oldobj = PyCell_GET(cell);
3128 PyCell_SET(cell, v);
3129 Py_XDECREF(oldobj);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003130 DISPATCH();
3131 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003132
Benjamin Petersonddd19492018-09-16 22:38:02 -07003133 case TARGET(BUILD_STRING): {
Serhiy Storchakaea525a22016-09-06 22:07:53 +03003134 PyObject *str;
3135 PyObject *empty = PyUnicode_New(0, 0);
3136 if (empty == NULL) {
3137 goto error;
3138 }
3139 str = _PyUnicode_JoinArray(empty, stack_pointer - oparg, oparg);
3140 Py_DECREF(empty);
3141 if (str == NULL)
3142 goto error;
3143 while (--oparg >= 0) {
3144 PyObject *item = POP();
3145 Py_DECREF(item);
3146 }
3147 PUSH(str);
3148 DISPATCH();
3149 }
3150
Benjamin Petersonddd19492018-09-16 22:38:02 -07003151 case TARGET(BUILD_TUPLE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003152 PyObject *tup = PyTuple_New(oparg);
3153 if (tup == NULL)
3154 goto error;
3155 while (--oparg >= 0) {
3156 PyObject *item = POP();
3157 PyTuple_SET_ITEM(tup, oparg, item);
3158 }
3159 PUSH(tup);
3160 DISPATCH();
3161 }
3162
Benjamin Petersonddd19492018-09-16 22:38:02 -07003163 case TARGET(BUILD_LIST): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003164 PyObject *list = PyList_New(oparg);
3165 if (list == NULL)
3166 goto error;
3167 while (--oparg >= 0) {
3168 PyObject *item = POP();
3169 PyList_SET_ITEM(list, oparg, item);
3170 }
3171 PUSH(list);
3172 DISPATCH();
3173 }
3174
Mark Shannon13bc1392020-01-23 09:25:17 +00003175 case TARGET(LIST_TO_TUPLE): {
3176 PyObject *list = POP();
3177 PyObject *tuple = PyList_AsTuple(list);
3178 Py_DECREF(list);
3179 if (tuple == NULL) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003180 goto error;
Mark Shannon13bc1392020-01-23 09:25:17 +00003181 }
3182 PUSH(tuple);
3183 DISPATCH();
3184 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003185
Mark Shannon13bc1392020-01-23 09:25:17 +00003186 case TARGET(LIST_EXTEND): {
3187 PyObject *iterable = POP();
3188 PyObject *list = PEEK(oparg);
3189 PyObject *none_val = _PyList_Extend((PyListObject *)list, iterable);
3190 if (none_val == NULL) {
3191 if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError) &&
Victor Stinnera102ed72020-02-07 02:24:48 +01003192 (Py_TYPE(iterable)->tp_iter == NULL && !PySequence_Check(iterable)))
Mark Shannon13bc1392020-01-23 09:25:17 +00003193 {
Victor Stinner61f4db82020-01-28 03:37:45 +01003194 _PyErr_Clear(tstate);
Mark Shannon13bc1392020-01-23 09:25:17 +00003195 _PyErr_Format(tstate, PyExc_TypeError,
3196 "Value after * must be an iterable, not %.200s",
3197 Py_TYPE(iterable)->tp_name);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003198 }
Mark Shannon13bc1392020-01-23 09:25:17 +00003199 Py_DECREF(iterable);
3200 goto error;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003201 }
Mark Shannon13bc1392020-01-23 09:25:17 +00003202 Py_DECREF(none_val);
3203 Py_DECREF(iterable);
3204 DISPATCH();
3205 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003206
Mark Shannon13bc1392020-01-23 09:25:17 +00003207 case TARGET(SET_UPDATE): {
3208 PyObject *iterable = POP();
3209 PyObject *set = PEEK(oparg);
3210 int err = _PySet_Update(set, iterable);
3211 Py_DECREF(iterable);
3212 if (err < 0) {
3213 goto error;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003214 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003215 DISPATCH();
3216 }
3217
Benjamin Petersonddd19492018-09-16 22:38:02 -07003218 case TARGET(BUILD_SET): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003219 PyObject *set = PySet_New(NULL);
3220 int err = 0;
Raymond Hettinger4c483ad2016-09-08 14:45:40 -07003221 int i;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003222 if (set == NULL)
3223 goto error;
Raymond Hettinger4c483ad2016-09-08 14:45:40 -07003224 for (i = oparg; i > 0; i--) {
3225 PyObject *item = PEEK(i);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003226 if (err == 0)
3227 err = PySet_Add(set, item);
3228 Py_DECREF(item);
3229 }
costypetrisor8ed317f2018-07-31 20:55:14 +00003230 STACK_SHRINK(oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003231 if (err != 0) {
3232 Py_DECREF(set);
3233 goto error;
3234 }
3235 PUSH(set);
3236 DISPATCH();
3237 }
3238
Benjamin Petersonddd19492018-09-16 22:38:02 -07003239 case TARGET(BUILD_MAP): {
Victor Stinner74319ae2016-08-25 00:04:09 +02003240 Py_ssize_t i;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003241 PyObject *map = _PyDict_NewPresized((Py_ssize_t)oparg);
3242 if (map == NULL)
3243 goto error;
Benjamin Petersond5d77aa2015-07-05 10:37:25 -05003244 for (i = oparg; i > 0; i--) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003245 int err;
Benjamin Petersond5d77aa2015-07-05 10:37:25 -05003246 PyObject *key = PEEK(2*i);
3247 PyObject *value = PEEK(2*i - 1);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003248 err = PyDict_SetItem(map, key, value);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003249 if (err != 0) {
3250 Py_DECREF(map);
3251 goto error;
3252 }
3253 }
Benjamin Petersond5d77aa2015-07-05 10:37:25 -05003254
3255 while (oparg--) {
3256 Py_DECREF(POP());
3257 Py_DECREF(POP());
3258 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003259 PUSH(map);
3260 DISPATCH();
3261 }
3262
Benjamin Petersonddd19492018-09-16 22:38:02 -07003263 case TARGET(SETUP_ANNOTATIONS): {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003264 _Py_IDENTIFIER(__annotations__);
3265 int err;
3266 PyObject *ann_dict;
3267 if (f->f_locals == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003268 _PyErr_Format(tstate, PyExc_SystemError,
3269 "no locals found when setting up annotations");
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003270 goto error;
3271 }
3272 /* check if __annotations__ in locals()... */
3273 if (PyDict_CheckExact(f->f_locals)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02003274 ann_dict = _PyDict_GetItemIdWithError(f->f_locals,
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003275 &PyId___annotations__);
3276 if (ann_dict == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003277 if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02003278 goto error;
3279 }
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003280 /* ...if not, create a new one */
3281 ann_dict = PyDict_New();
3282 if (ann_dict == NULL) {
3283 goto error;
3284 }
3285 err = _PyDict_SetItemId(f->f_locals,
3286 &PyId___annotations__, ann_dict);
3287 Py_DECREF(ann_dict);
3288 if (err != 0) {
3289 goto error;
3290 }
3291 }
3292 }
3293 else {
3294 /* do the same if locals() is not a dict */
3295 PyObject *ann_str = _PyUnicode_FromId(&PyId___annotations__);
3296 if (ann_str == NULL) {
Serhiy Storchaka4678b2f2016-11-08 23:13:36 +02003297 goto error;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003298 }
3299 ann_dict = PyObject_GetItem(f->f_locals, ann_str);
3300 if (ann_dict == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003301 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003302 goto error;
3303 }
Victor Stinner438a12d2019-05-24 17:01:38 +02003304 _PyErr_Clear(tstate);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003305 ann_dict = PyDict_New();
3306 if (ann_dict == NULL) {
3307 goto error;
3308 }
3309 err = PyObject_SetItem(f->f_locals, ann_str, ann_dict);
3310 Py_DECREF(ann_dict);
3311 if (err != 0) {
3312 goto error;
3313 }
3314 }
3315 else {
3316 Py_DECREF(ann_dict);
3317 }
3318 }
3319 DISPATCH();
3320 }
3321
Benjamin Petersonddd19492018-09-16 22:38:02 -07003322 case TARGET(BUILD_CONST_KEY_MAP): {
Victor Stinner74319ae2016-08-25 00:04:09 +02003323 Py_ssize_t i;
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003324 PyObject *map;
3325 PyObject *keys = TOP();
3326 if (!PyTuple_CheckExact(keys) ||
3327 PyTuple_GET_SIZE(keys) != (Py_ssize_t)oparg) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003328 _PyErr_SetString(tstate, PyExc_SystemError,
3329 "bad BUILD_CONST_KEY_MAP keys argument");
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003330 goto error;
3331 }
3332 map = _PyDict_NewPresized((Py_ssize_t)oparg);
3333 if (map == NULL) {
3334 goto error;
3335 }
3336 for (i = oparg; i > 0; i--) {
3337 int err;
3338 PyObject *key = PyTuple_GET_ITEM(keys, oparg - i);
3339 PyObject *value = PEEK(i + 1);
3340 err = PyDict_SetItem(map, key, value);
3341 if (err != 0) {
3342 Py_DECREF(map);
3343 goto error;
3344 }
3345 }
3346
3347 Py_DECREF(POP());
3348 while (oparg--) {
3349 Py_DECREF(POP());
3350 }
3351 PUSH(map);
3352 DISPATCH();
3353 }
3354
Mark Shannon8a4cd702020-01-27 09:57:45 +00003355 case TARGET(DICT_UPDATE): {
3356 PyObject *update = POP();
3357 PyObject *dict = PEEK(oparg);
3358 if (PyDict_Update(dict, update) < 0) {
3359 if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) {
3360 _PyErr_Format(tstate, PyExc_TypeError,
3361 "'%.200s' object is not a mapping",
Victor Stinnera102ed72020-02-07 02:24:48 +01003362 Py_TYPE(update)->tp_name);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003363 }
Mark Shannon8a4cd702020-01-27 09:57:45 +00003364 Py_DECREF(update);
3365 goto error;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003366 }
Mark Shannon8a4cd702020-01-27 09:57:45 +00003367 Py_DECREF(update);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003368 DISPATCH();
3369 }
3370
Mark Shannon8a4cd702020-01-27 09:57:45 +00003371 case TARGET(DICT_MERGE): {
3372 PyObject *update = POP();
3373 PyObject *dict = PEEK(oparg);
3374
3375 if (_PyDict_MergeEx(dict, update, 2) < 0) {
3376 format_kwargs_error(tstate, PEEK(2 + oparg), update);
3377 Py_DECREF(update);
Serhiy Storchakae036ef82016-10-02 11:06:43 +03003378 goto error;
Serhiy Storchakae036ef82016-10-02 11:06:43 +03003379 }
Mark Shannon8a4cd702020-01-27 09:57:45 +00003380 Py_DECREF(update);
Brandt Bucherf185a732019-09-28 17:12:49 -07003381 PREDICT(CALL_FUNCTION_EX);
Serhiy Storchakae036ef82016-10-02 11:06:43 +03003382 DISPATCH();
3383 }
3384
Benjamin Petersonddd19492018-09-16 22:38:02 -07003385 case TARGET(MAP_ADD): {
Jörn Heisslerc8a35412019-06-22 16:40:55 +02003386 PyObject *value = TOP();
3387 PyObject *key = SECOND();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003388 PyObject *map;
3389 int err;
costypetrisor8ed317f2018-07-31 20:55:14 +00003390 STACK_SHRINK(2);
Raymond Hettinger41862222016-10-15 19:03:06 -07003391 map = PEEK(oparg); /* dict */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003392 assert(PyDict_CheckExact(map));
Martin Panter95f53c12016-07-18 08:23:26 +00003393 err = PyDict_SetItem(map, key, value); /* map[key] = value */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003394 Py_DECREF(value);
3395 Py_DECREF(key);
3396 if (err != 0)
3397 goto error;
3398 PREDICT(JUMP_ABSOLUTE);
3399 DISPATCH();
3400 }
3401
Benjamin Petersonddd19492018-09-16 22:38:02 -07003402 case TARGET(LOAD_ATTR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003403 PyObject *name = GETITEM(names, oparg);
3404 PyObject *owner = TOP();
Pablo Galindo109826c2020-10-20 06:22:44 +01003405
3406 PyTypeObject *type = Py_TYPE(owner);
3407 PyObject *res;
3408 PyObject **dictptr;
3409 PyObject *dict;
3410 _PyOpCodeOpt_LoadAttr *la;
3411
3412 OPCACHE_STAT_ATTR_TOTAL();
3413
3414 OPCACHE_CHECK();
3415 if (co_opcache != NULL && PyType_HasFeature(type, Py_TPFLAGS_VALID_VERSION_TAG))
3416 {
3417 if (co_opcache->optimized > 0) {
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003418 // Fast path -- cache hit makes LOAD_ATTR ~30% faster.
Pablo Galindo109826c2020-10-20 06:22:44 +01003419 la = &co_opcache->u.la;
3420 if (la->type == type && la->tp_version_tag == type->tp_version_tag)
3421 {
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003422 // Hint >= 0 is a dict index; hint == -1 is a dict miss.
3423 // Hint < -1 is an inverted slot offset: offset is strictly > 0,
3424 // so ~offset is strictly < -1 (assuming 2's complement).
3425 if (la->hint < -1) {
3426 // Even faster path -- slot hint.
3427 Py_ssize_t offset = ~la->hint;
3428 // fprintf(stderr, "Using hint for offset %zd\n", offset);
3429 char *addr = (char *)owner + offset;
3430 res = *(PyObject **)addr;
Pablo Galindo109826c2020-10-20 06:22:44 +01003431 if (res != NULL) {
Pablo Galindo109826c2020-10-20 06:22:44 +01003432 Py_INCREF(res);
3433 SET_TOP(res);
3434 Py_DECREF(owner);
Pablo Galindo109826c2020-10-20 06:22:44 +01003435 DISPATCH();
Pablo Galindo109826c2020-10-20 06:22:44 +01003436 }
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003437 // Else slot is NULL. Fall through to slow path to raise AttributeError(name).
3438 // Don't DEOPT, since the slot is still there.
Pablo Galindo109826c2020-10-20 06:22:44 +01003439 } else {
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003440 // Fast path for dict.
3441 assert(type->tp_dict != NULL);
3442 assert(type->tp_dictoffset > 0);
3443
3444 dictptr = (PyObject **) ((char *)owner + type->tp_dictoffset);
3445 dict = *dictptr;
3446 if (dict != NULL && PyDict_CheckExact(dict)) {
3447 Py_ssize_t hint = la->hint;
3448 Py_INCREF(dict);
3449 res = NULL;
Victor Stinnerd5fc9982021-02-21 12:02:04 +01003450 assert(!_PyErr_Occurred(tstate));
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003451 la->hint = _PyDict_GetItemHint((PyDictObject*)dict, name, hint, &res);
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003452 if (res != NULL) {
Victor Stinnerd5fc9982021-02-21 12:02:04 +01003453 assert(la->hint >= 0);
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003454 if (la->hint == hint && hint >= 0) {
3455 // Our hint has helped -- cache hit.
3456 OPCACHE_STAT_ATTR_HIT();
3457 } else {
3458 // The hint we provided didn't work.
3459 // Maybe next time?
3460 OPCACHE_MAYBE_DEOPT_LOAD_ATTR();
3461 }
3462
3463 Py_INCREF(res);
3464 SET_TOP(res);
3465 Py_DECREF(owner);
3466 Py_DECREF(dict);
3467 DISPATCH();
Victor Stinnerd5fc9982021-02-21 12:02:04 +01003468 }
3469 else {
3470 _PyErr_Clear(tstate);
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003471 // This attribute can be missing sometimes;
3472 // we don't want to optimize this lookup.
3473 OPCACHE_DEOPT_LOAD_ATTR();
3474 Py_DECREF(dict);
3475 }
Victor Stinnerd5fc9982021-02-21 12:02:04 +01003476 }
3477 else {
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003478 // There is no dict, or __dict__ doesn't satisfy PyDict_CheckExact.
3479 OPCACHE_DEOPT_LOAD_ATTR();
3480 }
Pablo Galindo109826c2020-10-20 06:22:44 +01003481 }
Victor Stinnerd5fc9982021-02-21 12:02:04 +01003482 }
3483 else {
Pablo Galindo109826c2020-10-20 06:22:44 +01003484 // The type of the object has either been updated,
3485 // or is different. Maybe it will stabilize?
3486 OPCACHE_MAYBE_DEOPT_LOAD_ATTR();
3487 }
Pablo Galindo109826c2020-10-20 06:22:44 +01003488 OPCACHE_STAT_ATTR_MISS();
3489 }
3490
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003491 if (co_opcache != NULL && // co_opcache can be NULL after a DEOPT() call.
Pablo Galindo109826c2020-10-20 06:22:44 +01003492 type->tp_getattro == PyObject_GenericGetAttr)
3493 {
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003494 if (type->tp_dict == NULL) {
3495 if (PyType_Ready(type) < 0) {
3496 Py_DECREF(owner);
3497 SET_TOP(NULL);
3498 goto error;
Pablo Galindo109826c2020-10-20 06:22:44 +01003499 }
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003500 }
3501 PyObject *descr = _PyType_Lookup(type, name);
3502 if (descr != NULL) {
3503 // We found an attribute with a data-like descriptor.
3504 PyTypeObject *dtype = Py_TYPE(descr);
3505 if (dtype == &PyMemberDescr_Type) { // It's a slot
3506 PyMemberDescrObject *member = (PyMemberDescrObject *)descr;
3507 struct PyMemberDef *dmem = member->d_member;
3508 if (dmem->type == T_OBJECT_EX) {
3509 Py_ssize_t offset = dmem->offset;
3510 assert(offset > 0); // 0 would be confused with dict hint == -1 (miss).
Pablo Galindo109826c2020-10-20 06:22:44 +01003511
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003512 if (co_opcache->optimized == 0) {
3513 // First time we optimize this opcode.
3514 OPCACHE_STAT_ATTR_OPT();
3515 co_opcache->optimized = OPCODE_CACHE_MAX_TRIES;
3516 // fprintf(stderr, "Setting hint for %s, offset %zd\n", dmem->name, offset);
3517 }
3518
3519 la = &co_opcache->u.la;
3520 la->type = type;
3521 la->tp_version_tag = type->tp_version_tag;
3522 la->hint = ~offset;
3523
3524 char *addr = (char *)owner + offset;
3525 res = *(PyObject **)addr;
Pablo Galindo109826c2020-10-20 06:22:44 +01003526 if (res != NULL) {
3527 Py_INCREF(res);
Pablo Galindo109826c2020-10-20 06:22:44 +01003528 Py_DECREF(owner);
3529 SET_TOP(res);
3530
Pablo Galindo109826c2020-10-20 06:22:44 +01003531 DISPATCH();
3532 }
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003533 // Else slot is NULL. Fall through to slow path to raise AttributeError(name).
Pablo Galindo109826c2020-10-20 06:22:44 +01003534 }
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003535 // Else it's a slot of a different type. We don't handle those.
3536 }
3537 // Else it's some other kind of descriptor that we don't handle.
3538 OPCACHE_DEOPT_LOAD_ATTR();
Victor Stinnerd5fc9982021-02-21 12:02:04 +01003539 }
3540 else if (type->tp_dictoffset > 0) {
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003541 // We found an instance with a __dict__.
3542 dictptr = (PyObject **) ((char *)owner + type->tp_dictoffset);
3543 dict = *dictptr;
3544
3545 if (dict != NULL && PyDict_CheckExact(dict)) {
3546 Py_INCREF(dict);
3547 res = NULL;
Victor Stinnerd5fc9982021-02-21 12:02:04 +01003548 assert(!_PyErr_Occurred(tstate));
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003549 Py_ssize_t hint = _PyDict_GetItemHint((PyDictObject*)dict, name, -1, &res);
3550 if (res != NULL) {
3551 Py_INCREF(res);
3552 Py_DECREF(dict);
3553 Py_DECREF(owner);
3554 SET_TOP(res);
3555
3556 if (co_opcache->optimized == 0) {
3557 // First time we optimize this opcode.
3558 OPCACHE_STAT_ATTR_OPT();
3559 co_opcache->optimized = OPCODE_CACHE_MAX_TRIES;
3560 }
3561
3562 la = &co_opcache->u.la;
3563 la->type = type;
3564 la->tp_version_tag = type->tp_version_tag;
Victor Stinnerd5fc9982021-02-21 12:02:04 +01003565 assert(hint >= 0);
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003566 la->hint = hint;
3567
3568 DISPATCH();
3569 }
Victor Stinnerd5fc9982021-02-21 12:02:04 +01003570 else {
3571 _PyErr_Clear(tstate);
3572 }
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003573 Py_DECREF(dict);
Pablo Galindo109826c2020-10-20 06:22:44 +01003574 } else {
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003575 // There is no dict, or __dict__ doesn't satisfy PyDict_CheckExact.
Pablo Galindo109826c2020-10-20 06:22:44 +01003576 OPCACHE_DEOPT_LOAD_ATTR();
3577 }
3578 } else {
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003579 // The object's class does not have a tp_dictoffset we can use.
Pablo Galindo109826c2020-10-20 06:22:44 +01003580 OPCACHE_DEOPT_LOAD_ATTR();
3581 }
3582 } else if (type->tp_getattro != PyObject_GenericGetAttr) {
3583 OPCACHE_DEOPT_LOAD_ATTR();
3584 }
3585 }
3586
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003587 // Slow path.
Pablo Galindo109826c2020-10-20 06:22:44 +01003588 res = PyObject_GetAttr(owner, name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003589 Py_DECREF(owner);
3590 SET_TOP(res);
3591 if (res == NULL)
3592 goto error;
3593 DISPATCH();
3594 }
3595
Benjamin Petersonddd19492018-09-16 22:38:02 -07003596 case TARGET(COMPARE_OP): {
Mark Shannon9af0e472020-01-14 10:12:45 +00003597 assert(oparg <= Py_GE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003598 PyObject *right = POP();
3599 PyObject *left = TOP();
Mark Shannon9af0e472020-01-14 10:12:45 +00003600 PyObject *res = PyObject_RichCompare(left, right, oparg);
3601 SET_TOP(res);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003602 Py_DECREF(left);
3603 Py_DECREF(right);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003604 if (res == NULL)
3605 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003606 PREDICT(POP_JUMP_IF_FALSE);
3607 PREDICT(POP_JUMP_IF_TRUE);
3608 DISPATCH();
Victor Stinner3c1e4812012-03-26 22:10:51 +02003609 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003610
Mark Shannon9af0e472020-01-14 10:12:45 +00003611 case TARGET(IS_OP): {
3612 PyObject *right = POP();
3613 PyObject *left = TOP();
3614 int res = (left == right)^oparg;
3615 PyObject *b = res ? Py_True : Py_False;
3616 Py_INCREF(b);
3617 SET_TOP(b);
3618 Py_DECREF(left);
3619 Py_DECREF(right);
3620 PREDICT(POP_JUMP_IF_FALSE);
3621 PREDICT(POP_JUMP_IF_TRUE);
Mark Shannon4958f5d2021-03-24 17:56:12 +00003622 DISPATCH();
Mark Shannon9af0e472020-01-14 10:12:45 +00003623 }
3624
3625 case TARGET(CONTAINS_OP): {
3626 PyObject *right = POP();
3627 PyObject *left = POP();
3628 int res = PySequence_Contains(right, left);
3629 Py_DECREF(left);
3630 Py_DECREF(right);
3631 if (res < 0) {
3632 goto error;
3633 }
3634 PyObject *b = (res^oparg) ? Py_True : Py_False;
3635 Py_INCREF(b);
3636 PUSH(b);
3637 PREDICT(POP_JUMP_IF_FALSE);
3638 PREDICT(POP_JUMP_IF_TRUE);
Mark Shannon4958f5d2021-03-24 17:56:12 +00003639 DISPATCH();
Mark Shannon9af0e472020-01-14 10:12:45 +00003640 }
3641
3642#define CANNOT_CATCH_MSG "catching classes that do not inherit from "\
3643 "BaseException is not allowed"
3644
3645 case TARGET(JUMP_IF_NOT_EXC_MATCH): {
3646 PyObject *right = POP();
3647 PyObject *left = POP();
3648 if (PyTuple_Check(right)) {
3649 Py_ssize_t i, length;
3650 length = PyTuple_GET_SIZE(right);
3651 for (i = 0; i < length; i++) {
3652 PyObject *exc = PyTuple_GET_ITEM(right, i);
3653 if (!PyExceptionClass_Check(exc)) {
3654 _PyErr_SetString(tstate, PyExc_TypeError,
3655 CANNOT_CATCH_MSG);
3656 Py_DECREF(left);
3657 Py_DECREF(right);
3658 goto error;
3659 }
3660 }
3661 }
3662 else {
3663 if (!PyExceptionClass_Check(right)) {
3664 _PyErr_SetString(tstate, PyExc_TypeError,
3665 CANNOT_CATCH_MSG);
3666 Py_DECREF(left);
3667 Py_DECREF(right);
3668 goto error;
3669 }
3670 }
3671 int res = PyErr_GivenExceptionMatches(left, right);
3672 Py_DECREF(left);
3673 Py_DECREF(right);
3674 if (res > 0) {
3675 /* Exception matches -- Do nothing */;
3676 }
3677 else if (res == 0) {
3678 JUMPTO(oparg);
3679 }
3680 else {
3681 goto error;
3682 }
3683 DISPATCH();
3684 }
3685
Benjamin Petersonddd19492018-09-16 22:38:02 -07003686 case TARGET(IMPORT_NAME): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003687 PyObject *name = GETITEM(names, oparg);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03003688 PyObject *fromlist = POP();
3689 PyObject *level = TOP();
3690 PyObject *res;
Victor Stinner438a12d2019-05-24 17:01:38 +02003691 res = import_name(tstate, f, name, fromlist, level);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03003692 Py_DECREF(level);
3693 Py_DECREF(fromlist);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003694 SET_TOP(res);
3695 if (res == NULL)
3696 goto error;
3697 DISPATCH();
3698 }
3699
Benjamin Petersonddd19492018-09-16 22:38:02 -07003700 case TARGET(IMPORT_STAR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003701 PyObject *from = POP(), *locals;
3702 int err;
Matthias Bussonnier160edb42017-02-25 21:58:05 -08003703 if (PyFrame_FastToLocalsWithError(f) < 0) {
3704 Py_DECREF(from);
Victor Stinner41bb43a2013-10-29 01:19:37 +01003705 goto error;
Matthias Bussonnier160edb42017-02-25 21:58:05 -08003706 }
Victor Stinner41bb43a2013-10-29 01:19:37 +01003707
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003708 locals = f->f_locals;
3709 if (locals == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003710 _PyErr_SetString(tstate, PyExc_SystemError,
3711 "no locals found during 'import *'");
Matthias Bussonnier160edb42017-02-25 21:58:05 -08003712 Py_DECREF(from);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003713 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003714 }
Victor Stinner438a12d2019-05-24 17:01:38 +02003715 err = import_all_from(tstate, locals, from);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003716 PyFrame_LocalsToFast(f, 0);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003717 Py_DECREF(from);
3718 if (err != 0)
3719 goto error;
3720 DISPATCH();
3721 }
Guido van Rossum25831651993-05-19 14:50:45 +00003722
Benjamin Petersonddd19492018-09-16 22:38:02 -07003723 case TARGET(IMPORT_FROM): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003724 PyObject *name = GETITEM(names, oparg);
3725 PyObject *from = TOP();
3726 PyObject *res;
Victor Stinner438a12d2019-05-24 17:01:38 +02003727 res = import_from(tstate, from, name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003728 PUSH(res);
3729 if (res == NULL)
3730 goto error;
3731 DISPATCH();
3732 }
Thomas Wouters52152252000-08-17 22:55:00 +00003733
Benjamin Petersonddd19492018-09-16 22:38:02 -07003734 case TARGET(JUMP_FORWARD): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003735 JUMPBY(oparg);
Mark Shannon4958f5d2021-03-24 17:56:12 +00003736 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003737 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003738
Benjamin Petersonddd19492018-09-16 22:38:02 -07003739 case TARGET(POP_JUMP_IF_FALSE): {
3740 PREDICTED(POP_JUMP_IF_FALSE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003741 PyObject *cond = POP();
3742 int err;
3743 if (cond == Py_True) {
3744 Py_DECREF(cond);
Mark Shannon4958f5d2021-03-24 17:56:12 +00003745 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003746 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003747 if (cond == Py_False) {
3748 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003749 JUMPTO(oparg);
Mark Shannon4958f5d2021-03-24 17:56:12 +00003750 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003751 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003752 err = PyObject_IsTrue(cond);
3753 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003754 if (err > 0)
Adrian Wielgosik50c28502017-06-23 13:35:41 -07003755 ;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003756 else if (err == 0)
3757 JUMPTO(oparg);
3758 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003759 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003760 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003761 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003762
Benjamin Petersonddd19492018-09-16 22:38:02 -07003763 case TARGET(POP_JUMP_IF_TRUE): {
3764 PREDICTED(POP_JUMP_IF_TRUE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003765 PyObject *cond = POP();
3766 int err;
3767 if (cond == Py_False) {
3768 Py_DECREF(cond);
Mark Shannon4958f5d2021-03-24 17:56:12 +00003769 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003770 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003771 if (cond == Py_True) {
3772 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003773 JUMPTO(oparg);
Mark Shannon4958f5d2021-03-24 17:56:12 +00003774 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003775 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003776 err = PyObject_IsTrue(cond);
3777 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003778 if (err > 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003779 JUMPTO(oparg);
3780 }
3781 else if (err == 0)
3782 ;
3783 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003784 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003785 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003786 }
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00003787
Benjamin Petersonddd19492018-09-16 22:38:02 -07003788 case TARGET(JUMP_IF_FALSE_OR_POP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003789 PyObject *cond = TOP();
3790 int err;
3791 if (cond == Py_True) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003792 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003793 Py_DECREF(cond);
Mark Shannon4958f5d2021-03-24 17:56:12 +00003794 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003795 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003796 if (cond == Py_False) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003797 JUMPTO(oparg);
Mark Shannon4958f5d2021-03-24 17:56:12 +00003798 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003799 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003800 err = PyObject_IsTrue(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003801 if (err > 0) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003802 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003803 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003804 }
3805 else if (err == 0)
3806 JUMPTO(oparg);
3807 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003808 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003809 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003810 }
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00003811
Benjamin Petersonddd19492018-09-16 22:38:02 -07003812 case TARGET(JUMP_IF_TRUE_OR_POP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003813 PyObject *cond = TOP();
3814 int err;
3815 if (cond == Py_False) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003816 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003817 Py_DECREF(cond);
Mark Shannon4958f5d2021-03-24 17:56:12 +00003818 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003819 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003820 if (cond == Py_True) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003821 JUMPTO(oparg);
Mark Shannon4958f5d2021-03-24 17:56:12 +00003822 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003823 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003824 err = PyObject_IsTrue(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003825 if (err > 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003826 JUMPTO(oparg);
3827 }
3828 else if (err == 0) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003829 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003830 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003831 }
3832 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003833 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003834 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003835 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003836
Benjamin Petersonddd19492018-09-16 22:38:02 -07003837 case TARGET(JUMP_ABSOLUTE): {
3838 PREDICTED(JUMP_ABSOLUTE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003839 JUMPTO(oparg);
Mark Shannon4958f5d2021-03-24 17:56:12 +00003840 CHECK_EVAL_BREAKER();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003841 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003842 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003843
Brandt Bucher145bf262021-02-26 14:51:55 -08003844 case TARGET(GET_LEN): {
3845 // PUSH(len(TOS))
3846 Py_ssize_t len_i = PyObject_Length(TOP());
3847 if (len_i < 0) {
3848 goto error;
3849 }
3850 PyObject *len_o = PyLong_FromSsize_t(len_i);
3851 if (len_o == NULL) {
3852 goto error;
3853 }
3854 PUSH(len_o);
3855 DISPATCH();
3856 }
3857
3858 case TARGET(MATCH_CLASS): {
3859 // Pop TOS. On success, set TOS to True and TOS1 to a tuple of
3860 // attributes. On failure, set TOS to False.
3861 PyObject *names = POP();
3862 PyObject *type = TOP();
3863 PyObject *subject = SECOND();
3864 assert(PyTuple_CheckExact(names));
3865 PyObject *attrs = match_class(tstate, subject, type, oparg, names);
3866 Py_DECREF(names);
3867 if (attrs) {
3868 // Success!
3869 assert(PyTuple_CheckExact(attrs));
3870 Py_DECREF(subject);
3871 SET_SECOND(attrs);
3872 }
3873 else if (_PyErr_Occurred(tstate)) {
3874 goto error;
3875 }
3876 Py_DECREF(type);
3877 SET_TOP(PyBool_FromLong(!!attrs));
3878 DISPATCH();
3879 }
3880
3881 case TARGET(MATCH_MAPPING): {
3882 // PUSH(isinstance(TOS, _collections_abc.Mapping))
3883 PyObject *subject = TOP();
3884 // Fast path for dicts:
3885 if (PyDict_Check(subject)) {
3886 Py_INCREF(Py_True);
3887 PUSH(Py_True);
3888 DISPATCH();
3889 }
3890 // Lazily import _collections_abc.Mapping, and keep it handy on the
3891 // PyInterpreterState struct (it gets cleaned up at exit):
3892 PyInterpreterState *interp = PyInterpreterState_Get();
3893 if (interp->map_abc == NULL) {
3894 PyObject *abc = PyImport_ImportModule("_collections_abc");
3895 if (abc == NULL) {
3896 goto error;
3897 }
3898 interp->map_abc = PyObject_GetAttrString(abc, "Mapping");
3899 if (interp->map_abc == NULL) {
3900 goto error;
3901 }
3902 }
3903 int match = PyObject_IsInstance(subject, interp->map_abc);
3904 if (match < 0) {
3905 goto error;
3906 }
3907 PUSH(PyBool_FromLong(match));
3908 DISPATCH();
3909 }
3910
3911 case TARGET(MATCH_SEQUENCE): {
3912 // PUSH(not isinstance(TOS, (bytearray, bytes, str))
3913 // and isinstance(TOS, _collections_abc.Sequence))
3914 PyObject *subject = TOP();
3915 // Fast path for lists and tuples:
3916 if (PyType_FastSubclass(Py_TYPE(subject),
3917 Py_TPFLAGS_LIST_SUBCLASS |
3918 Py_TPFLAGS_TUPLE_SUBCLASS))
3919 {
3920 Py_INCREF(Py_True);
3921 PUSH(Py_True);
3922 DISPATCH();
3923 }
3924 // Bail on some possible Sequences that we intentionally exclude:
3925 if (PyType_FastSubclass(Py_TYPE(subject),
3926 Py_TPFLAGS_BYTES_SUBCLASS |
3927 Py_TPFLAGS_UNICODE_SUBCLASS) ||
3928 PyByteArray_Check(subject))
3929 {
3930 Py_INCREF(Py_False);
3931 PUSH(Py_False);
3932 DISPATCH();
3933 }
3934 // Lazily import _collections_abc.Sequence, and keep it handy on the
3935 // PyInterpreterState struct (it gets cleaned up at exit):
3936 PyInterpreterState *interp = PyInterpreterState_Get();
3937 if (interp->seq_abc == NULL) {
3938 PyObject *abc = PyImport_ImportModule("_collections_abc");
3939 if (abc == NULL) {
3940 goto error;
3941 }
3942 interp->seq_abc = PyObject_GetAttrString(abc, "Sequence");
3943 if (interp->seq_abc == NULL) {
3944 goto error;
3945 }
3946 }
3947 int match = PyObject_IsInstance(subject, interp->seq_abc);
3948 if (match < 0) {
3949 goto error;
3950 }
3951 PUSH(PyBool_FromLong(match));
3952 DISPATCH();
3953 }
3954
3955 case TARGET(MATCH_KEYS): {
3956 // On successful match for all keys, PUSH(values) and PUSH(True).
3957 // Otherwise, PUSH(None) and PUSH(False).
3958 PyObject *keys = TOP();
3959 PyObject *subject = SECOND();
3960 PyObject *values_or_none = match_keys(tstate, subject, keys);
3961 if (values_or_none == NULL) {
3962 goto error;
3963 }
3964 PUSH(values_or_none);
3965 if (values_or_none == Py_None) {
3966 Py_INCREF(Py_False);
3967 PUSH(Py_False);
3968 DISPATCH();
3969 }
3970 assert(PyTuple_CheckExact(values_or_none));
3971 Py_INCREF(Py_True);
3972 PUSH(Py_True);
3973 DISPATCH();
3974 }
3975
3976 case TARGET(COPY_DICT_WITHOUT_KEYS): {
3977 // rest = dict(TOS1)
3978 // for key in TOS:
3979 // del rest[key]
3980 // SET_TOP(rest)
3981 PyObject *keys = TOP();
3982 PyObject *subject = SECOND();
3983 PyObject *rest = PyDict_New();
3984 if (rest == NULL || PyDict_Update(rest, subject)) {
3985 Py_XDECREF(rest);
3986 goto error;
3987 }
3988 // This may seem a bit inefficient, but keys is rarely big enough to
3989 // actually impact runtime.
3990 assert(PyTuple_CheckExact(keys));
3991 for (Py_ssize_t i = 0; i < PyTuple_GET_SIZE(keys); i++) {
3992 if (PyDict_DelItem(rest, PyTuple_GET_ITEM(keys, i))) {
3993 Py_DECREF(rest);
3994 goto error;
3995 }
3996 }
3997 Py_DECREF(keys);
3998 SET_TOP(rest);
3999 DISPATCH();
4000 }
4001
Benjamin Petersonddd19492018-09-16 22:38:02 -07004002 case TARGET(GET_ITER): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004003 /* before: [obj]; after [getiter(obj)] */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004004 PyObject *iterable = TOP();
Yury Selivanov5376ba92015-06-22 12:19:30 -04004005 PyObject *iter = PyObject_GetIter(iterable);
4006 Py_DECREF(iterable);
4007 SET_TOP(iter);
4008 if (iter == NULL)
4009 goto error;
4010 PREDICT(FOR_ITER);
Serhiy Storchakada9c5132016-06-27 18:58:57 +03004011 PREDICT(CALL_FUNCTION);
Yury Selivanov5376ba92015-06-22 12:19:30 -04004012 DISPATCH();
4013 }
4014
Benjamin Petersonddd19492018-09-16 22:38:02 -07004015 case TARGET(GET_YIELD_FROM_ITER): {
Yury Selivanov5376ba92015-06-22 12:19:30 -04004016 /* before: [obj]; after [getiter(obj)] */
4017 PyObject *iterable = TOP();
Yury Selivanov75445082015-05-11 22:57:16 -04004018 PyObject *iter;
Yury Selivanov5376ba92015-06-22 12:19:30 -04004019 if (PyCoro_CheckExact(iterable)) {
4020 /* `iterable` is a coroutine */
4021 if (!(co->co_flags & (CO_COROUTINE | CO_ITERABLE_COROUTINE))) {
4022 /* and it is used in a 'yield from' expression of a
4023 regular generator. */
4024 Py_DECREF(iterable);
4025 SET_TOP(NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02004026 _PyErr_SetString(tstate, PyExc_TypeError,
4027 "cannot 'yield from' a coroutine object "
4028 "in a non-coroutine generator");
Yury Selivanov5376ba92015-06-22 12:19:30 -04004029 goto error;
4030 }
4031 }
4032 else if (!PyGen_CheckExact(iterable)) {
Yury Selivanov75445082015-05-11 22:57:16 -04004033 /* `iterable` is not a generator. */
4034 iter = PyObject_GetIter(iterable);
4035 Py_DECREF(iterable);
4036 SET_TOP(iter);
4037 if (iter == NULL)
4038 goto error;
4039 }
Serhiy Storchakada9c5132016-06-27 18:58:57 +03004040 PREDICT(LOAD_CONST);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004041 DISPATCH();
4042 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00004043
Benjamin Petersonddd19492018-09-16 22:38:02 -07004044 case TARGET(FOR_ITER): {
4045 PREDICTED(FOR_ITER);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004046 /* before: [iter]; after: [iter, iter()] *or* [] */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004047 PyObject *iter = TOP();
Victor Stinnera102ed72020-02-07 02:24:48 +01004048 PyObject *next = (*Py_TYPE(iter)->tp_iternext)(iter);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004049 if (next != NULL) {
4050 PUSH(next);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004051 PREDICT(STORE_FAST);
4052 PREDICT(UNPACK_SEQUENCE);
4053 DISPATCH();
4054 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004055 if (_PyErr_Occurred(tstate)) {
4056 if (!_PyErr_ExceptionMatches(tstate, PyExc_StopIteration)) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004057 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02004058 }
4059 else if (tstate->c_tracefunc != NULL) {
Mark Shannon8e1b4062021-03-05 14:45:50 +00004060 call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj, tstate, f, &trace_info);
Victor Stinner438a12d2019-05-24 17:01:38 +02004061 }
4062 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004063 }
4064 /* iterator ended normally */
costypetrisor8ed317f2018-07-31 20:55:14 +00004065 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004066 Py_DECREF(iter);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004067 JUMPBY(oparg);
4068 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004069 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00004070
Benjamin Petersonddd19492018-09-16 22:38:02 -07004071 case TARGET(SETUP_FINALLY): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004072 PyFrame_BlockSetup(f, SETUP_FINALLY, INSTR_OFFSET() + oparg,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004073 STACK_LEVEL());
4074 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004075 }
Guido van Rossumac7be682001-01-17 15:42:30 +00004076
Benjamin Petersonddd19492018-09-16 22:38:02 -07004077 case TARGET(BEFORE_ASYNC_WITH): {
Yury Selivanov75445082015-05-11 22:57:16 -04004078 _Py_IDENTIFIER(__aenter__);
Géry Ogam1d1b97a2020-01-14 12:58:29 +01004079 _Py_IDENTIFIER(__aexit__);
Yury Selivanov75445082015-05-11 22:57:16 -04004080 PyObject *mgr = TOP();
Géry Ogam1d1b97a2020-01-14 12:58:29 +01004081 PyObject *enter = special_lookup(tstate, mgr, &PyId___aenter__);
Yury Selivanov75445082015-05-11 22:57:16 -04004082 PyObject *res;
Géry Ogam1d1b97a2020-01-14 12:58:29 +01004083 if (enter == NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04004084 goto error;
Géry Ogam1d1b97a2020-01-14 12:58:29 +01004085 }
4086 PyObject *exit = special_lookup(tstate, mgr, &PyId___aexit__);
4087 if (exit == NULL) {
4088 Py_DECREF(enter);
4089 goto error;
4090 }
Yury Selivanov75445082015-05-11 22:57:16 -04004091 SET_TOP(exit);
Yury Selivanov75445082015-05-11 22:57:16 -04004092 Py_DECREF(mgr);
Victor Stinnerf17c3de2016-12-06 18:46:19 +01004093 res = _PyObject_CallNoArg(enter);
Yury Selivanov75445082015-05-11 22:57:16 -04004094 Py_DECREF(enter);
4095 if (res == NULL)
4096 goto error;
4097 PUSH(res);
Serhiy Storchakada9c5132016-06-27 18:58:57 +03004098 PREDICT(GET_AWAITABLE);
Yury Selivanov75445082015-05-11 22:57:16 -04004099 DISPATCH();
4100 }
4101
Benjamin Petersonddd19492018-09-16 22:38:02 -07004102 case TARGET(SETUP_ASYNC_WITH): {
Yury Selivanov75445082015-05-11 22:57:16 -04004103 PyObject *res = POP();
4104 /* Setup the finally block before pushing the result
4105 of __aenter__ on the stack. */
4106 PyFrame_BlockSetup(f, SETUP_FINALLY, INSTR_OFFSET() + oparg,
4107 STACK_LEVEL());
4108 PUSH(res);
4109 DISPATCH();
4110 }
4111
Benjamin Petersonddd19492018-09-16 22:38:02 -07004112 case TARGET(SETUP_WITH): {
Benjamin Petersonce798522012-01-22 11:24:29 -05004113 _Py_IDENTIFIER(__enter__);
Géry Ogam1d1b97a2020-01-14 12:58:29 +01004114 _Py_IDENTIFIER(__exit__);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004115 PyObject *mgr = TOP();
Victor Stinner438a12d2019-05-24 17:01:38 +02004116 PyObject *enter = special_lookup(tstate, mgr, &PyId___enter__);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004117 PyObject *res;
Victor Stinner438a12d2019-05-24 17:01:38 +02004118 if (enter == NULL) {
Raymond Hettingera3fec152016-11-21 17:24:23 -08004119 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02004120 }
4121 PyObject *exit = special_lookup(tstate, mgr, &PyId___exit__);
Raymond Hettinger64e2f9a2016-11-22 11:50:40 -08004122 if (exit == NULL) {
4123 Py_DECREF(enter);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004124 goto error;
Raymond Hettinger64e2f9a2016-11-22 11:50:40 -08004125 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004126 SET_TOP(exit);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004127 Py_DECREF(mgr);
Victor Stinnerf17c3de2016-12-06 18:46:19 +01004128 res = _PyObject_CallNoArg(enter);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004129 Py_DECREF(enter);
4130 if (res == NULL)
4131 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004132 /* Setup the finally block before pushing the result
4133 of __enter__ on the stack. */
4134 PyFrame_BlockSetup(f, SETUP_FINALLY, INSTR_OFFSET() + oparg,
4135 STACK_LEVEL());
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004136
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004137 PUSH(res);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004138 DISPATCH();
4139 }
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004140
Mark Shannonfee55262019-11-21 09:11:43 +00004141 case TARGET(WITH_EXCEPT_START): {
4142 /* At the top of the stack are 7 values:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004143 - (TOP, SECOND, THIRD) = exc_info()
Mark Shannonfee55262019-11-21 09:11:43 +00004144 - (FOURTH, FIFTH, SIXTH) = previous exception for EXCEPT_HANDLER
4145 - SEVENTH: the context.__exit__ bound method
4146 We call SEVENTH(TOP, SECOND, THIRD).
4147 Then we push again the TOP exception and the __exit__
4148 return value.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004149 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004150 PyObject *exit_func;
Victor Stinner842cfff2016-12-01 14:45:31 +01004151 PyObject *exc, *val, *tb, *res;
4152
Victor Stinner842cfff2016-12-01 14:45:31 +01004153 exc = TOP();
Mark Shannonfee55262019-11-21 09:11:43 +00004154 val = SECOND();
4155 tb = THIRD();
4156 assert(exc != Py_None);
4157 assert(!PyLong_Check(exc));
4158 exit_func = PEEK(7);
Jeroen Demeyer469d1a72019-07-03 12:52:21 +02004159 PyObject *stack[4] = {NULL, exc, val, tb};
Petr Viktorinffd97532020-02-11 17:46:57 +01004160 res = PyObject_Vectorcall(exit_func, stack + 1,
Jeroen Demeyer469d1a72019-07-03 12:52:21 +02004161 3 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004162 if (res == NULL)
4163 goto error;
Amaury Forgeot d'Arc10b24e82008-12-10 23:49:33 +00004164
Yury Selivanov75445082015-05-11 22:57:16 -04004165 PUSH(res);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004166 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004167 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00004168
Benjamin Petersonddd19492018-09-16 22:38:02 -07004169 case TARGET(LOAD_METHOD): {
Andreyb021ba52019-04-29 14:33:26 +10004170 /* Designed to work in tandem with CALL_METHOD. */
Yury Selivanovf2392132016-12-13 19:03:51 -05004171 PyObject *name = GETITEM(names, oparg);
4172 PyObject *obj = TOP();
4173 PyObject *meth = NULL;
4174
4175 int meth_found = _PyObject_GetMethod(obj, name, &meth);
4176
Yury Selivanovf2392132016-12-13 19:03:51 -05004177 if (meth == NULL) {
4178 /* Most likely attribute wasn't found. */
Yury Selivanovf2392132016-12-13 19:03:51 -05004179 goto error;
4180 }
4181
4182 if (meth_found) {
INADA Naoki015bce62017-01-16 17:23:30 +09004183 /* We can bypass temporary bound method object.
4184 meth is unbound method and obj is self.
Victor Stinnera8cb5152017-01-18 14:12:51 +01004185
INADA Naoki015bce62017-01-16 17:23:30 +09004186 meth | self | arg1 | ... | argN
4187 */
4188 SET_TOP(meth);
4189 PUSH(obj); // self
Yury Selivanovf2392132016-12-13 19:03:51 -05004190 }
4191 else {
INADA Naoki015bce62017-01-16 17:23:30 +09004192 /* meth is not an unbound method (but a regular attr, or
4193 something was returned by a descriptor protocol). Set
4194 the second element of the stack to NULL, to signal
Yury Selivanovf2392132016-12-13 19:03:51 -05004195 CALL_METHOD that it's not a method call.
INADA Naoki015bce62017-01-16 17:23:30 +09004196
4197 NULL | meth | arg1 | ... | argN
Yury Selivanovf2392132016-12-13 19:03:51 -05004198 */
INADA Naoki015bce62017-01-16 17:23:30 +09004199 SET_TOP(NULL);
Yury Selivanovf2392132016-12-13 19:03:51 -05004200 Py_DECREF(obj);
INADA Naoki015bce62017-01-16 17:23:30 +09004201 PUSH(meth);
Yury Selivanovf2392132016-12-13 19:03:51 -05004202 }
4203 DISPATCH();
4204 }
4205
Benjamin Petersonddd19492018-09-16 22:38:02 -07004206 case TARGET(CALL_METHOD): {
Yury Selivanovf2392132016-12-13 19:03:51 -05004207 /* Designed to work in tamdem with LOAD_METHOD. */
INADA Naoki015bce62017-01-16 17:23:30 +09004208 PyObject **sp, *res, *meth;
Yury Selivanovf2392132016-12-13 19:03:51 -05004209
4210 sp = stack_pointer;
4211
INADA Naoki015bce62017-01-16 17:23:30 +09004212 meth = PEEK(oparg + 2);
4213 if (meth == NULL) {
4214 /* `meth` is NULL when LOAD_METHOD thinks that it's not
4215 a method call.
Yury Selivanovf2392132016-12-13 19:03:51 -05004216
4217 Stack layout:
4218
INADA Naoki015bce62017-01-16 17:23:30 +09004219 ... | NULL | callable | arg1 | ... | argN
4220 ^- TOP()
4221 ^- (-oparg)
4222 ^- (-oparg-1)
4223 ^- (-oparg-2)
Yury Selivanovf2392132016-12-13 19:03:51 -05004224
Ville Skyttä49b27342017-08-03 09:00:59 +03004225 `callable` will be POPed by call_function.
INADA Naoki015bce62017-01-16 17:23:30 +09004226 NULL will will be POPed manually later.
Yury Selivanovf2392132016-12-13 19:03:51 -05004227 */
Mark Shannon8e1b4062021-03-05 14:45:50 +00004228 res = call_function(tstate, &trace_info, &sp, oparg, NULL);
Yury Selivanovf2392132016-12-13 19:03:51 -05004229 stack_pointer = sp;
INADA Naoki015bce62017-01-16 17:23:30 +09004230 (void)POP(); /* POP the NULL. */
Yury Selivanovf2392132016-12-13 19:03:51 -05004231 }
4232 else {
4233 /* This is a method call. Stack layout:
4234
INADA Naoki015bce62017-01-16 17:23:30 +09004235 ... | method | self | arg1 | ... | argN
Yury Selivanovf2392132016-12-13 19:03:51 -05004236 ^- TOP()
4237 ^- (-oparg)
INADA Naoki015bce62017-01-16 17:23:30 +09004238 ^- (-oparg-1)
4239 ^- (-oparg-2)
Yury Selivanovf2392132016-12-13 19:03:51 -05004240
INADA Naoki015bce62017-01-16 17:23:30 +09004241 `self` and `method` will be POPed by call_function.
Yury Selivanovf2392132016-12-13 19:03:51 -05004242 We'll be passing `oparg + 1` to call_function, to
INADA Naoki015bce62017-01-16 17:23:30 +09004243 make it accept the `self` as a first argument.
Yury Selivanovf2392132016-12-13 19:03:51 -05004244 */
Mark Shannon8e1b4062021-03-05 14:45:50 +00004245 res = call_function(tstate, &trace_info, &sp, oparg + 1, NULL);
Yury Selivanovf2392132016-12-13 19:03:51 -05004246 stack_pointer = sp;
4247 }
4248
4249 PUSH(res);
4250 if (res == NULL)
4251 goto error;
Mark Shannon4958f5d2021-03-24 17:56:12 +00004252 CHECK_EVAL_BREAKER();
Yury Selivanovf2392132016-12-13 19:03:51 -05004253 DISPATCH();
4254 }
4255
Benjamin Petersonddd19492018-09-16 22:38:02 -07004256 case TARGET(CALL_FUNCTION): {
4257 PREDICTED(CALL_FUNCTION);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004258 PyObject **sp, *res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004259 sp = stack_pointer;
Mark Shannon8e1b4062021-03-05 14:45:50 +00004260 res = call_function(tstate, &trace_info, &sp, oparg, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004261 stack_pointer = sp;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004262 PUSH(res);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004263 if (res == NULL) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004264 goto error;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004265 }
Mark Shannon4958f5d2021-03-24 17:56:12 +00004266 CHECK_EVAL_BREAKER();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004267 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004268 }
Guido van Rossumac7be682001-01-17 15:42:30 +00004269
Benjamin Petersonddd19492018-09-16 22:38:02 -07004270 case TARGET(CALL_FUNCTION_KW): {
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004271 PyObject **sp, *res, *names;
4272
4273 names = POP();
Jeroen Demeyer05677862019-08-16 12:41:27 +02004274 assert(PyTuple_Check(names));
4275 assert(PyTuple_GET_SIZE(names) <= oparg);
4276 /* We assume without checking that names contains only strings */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004277 sp = stack_pointer;
Mark Shannon8e1b4062021-03-05 14:45:50 +00004278 res = call_function(tstate, &trace_info, &sp, oparg, names);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004279 stack_pointer = sp;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004280 PUSH(res);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004281 Py_DECREF(names);
4282
4283 if (res == NULL) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004284 goto error;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004285 }
Mark Shannon4958f5d2021-03-24 17:56:12 +00004286 CHECK_EVAL_BREAKER();
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004287 DISPATCH();
4288 }
4289
Benjamin Petersonddd19492018-09-16 22:38:02 -07004290 case TARGET(CALL_FUNCTION_EX): {
Brandt Bucherf185a732019-09-28 17:12:49 -07004291 PREDICTED(CALL_FUNCTION_EX);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004292 PyObject *func, *callargs, *kwargs = NULL, *result;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004293 if (oparg & 0x01) {
4294 kwargs = POP();
Serhiy Storchakab7281052016-09-12 00:52:40 +03004295 if (!PyDict_CheckExact(kwargs)) {
4296 PyObject *d = PyDict_New();
4297 if (d == NULL)
4298 goto error;
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02004299 if (_PyDict_MergeEx(d, kwargs, 2) < 0) {
Serhiy Storchakab7281052016-09-12 00:52:40 +03004300 Py_DECREF(d);
Victor Stinner438a12d2019-05-24 17:01:38 +02004301 format_kwargs_error(tstate, SECOND(), kwargs);
Victor Stinnereece2222016-09-12 11:16:37 +02004302 Py_DECREF(kwargs);
Serhiy Storchakab7281052016-09-12 00:52:40 +03004303 goto error;
4304 }
4305 Py_DECREF(kwargs);
4306 kwargs = d;
4307 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004308 assert(PyDict_CheckExact(kwargs));
4309 }
4310 callargs = POP();
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004311 func = TOP();
Serhiy Storchaka63dc5482016-09-22 19:41:20 +03004312 if (!PyTuple_CheckExact(callargs)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004313 if (check_args_iterable(tstate, func, callargs) < 0) {
Victor Stinnereece2222016-09-12 11:16:37 +02004314 Py_DECREF(callargs);
Serhiy Storchakab7281052016-09-12 00:52:40 +03004315 goto error;
4316 }
4317 Py_SETREF(callargs, PySequence_Tuple(callargs));
4318 if (callargs == NULL) {
4319 goto error;
4320 }
4321 }
Serhiy Storchaka63dc5482016-09-22 19:41:20 +03004322 assert(PyTuple_CheckExact(callargs));
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004323
Mark Shannon8e1b4062021-03-05 14:45:50 +00004324 result = do_call_core(tstate, &trace_info, func, callargs, kwargs);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004325 Py_DECREF(func);
4326 Py_DECREF(callargs);
4327 Py_XDECREF(kwargs);
4328
4329 SET_TOP(result);
4330 if (result == NULL) {
4331 goto error;
4332 }
Mark Shannon4958f5d2021-03-24 17:56:12 +00004333 CHECK_EVAL_BREAKER();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004334 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004335 }
Guido van Rossumac7be682001-01-17 15:42:30 +00004336
Benjamin Petersonddd19492018-09-16 22:38:02 -07004337 case TARGET(MAKE_FUNCTION): {
Serhiy Storchaka64204de2016-06-12 17:36:24 +03004338 PyObject *qualname = POP();
4339 PyObject *codeobj = POP();
4340 PyFunctionObject *func = (PyFunctionObject *)
4341 PyFunction_NewWithQualName(codeobj, f->f_globals, qualname);
Guido van Rossum4f72a782006-10-27 23:31:49 +00004342
Serhiy Storchaka64204de2016-06-12 17:36:24 +03004343 Py_DECREF(codeobj);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004344 Py_DECREF(qualname);
Serhiy Storchaka64204de2016-06-12 17:36:24 +03004345 if (func == NULL) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004346 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004347 }
Neal Norwitzc1505362006-12-28 06:47:50 +00004348
Serhiy Storchaka64204de2016-06-12 17:36:24 +03004349 if (oparg & 0x08) {
4350 assert(PyTuple_CheckExact(TOP()));
Mark Shannond6c33fb2021-01-29 13:24:55 +00004351 func->func_closure = POP();
Serhiy Storchaka64204de2016-06-12 17:36:24 +03004352 }
4353 if (oparg & 0x04) {
Yurii Karabas73019792020-11-25 12:43:18 +02004354 assert(PyTuple_CheckExact(TOP()));
Serhiy Storchaka64204de2016-06-12 17:36:24 +03004355 func->func_annotations = POP();
4356 }
4357 if (oparg & 0x02) {
4358 assert(PyDict_CheckExact(TOP()));
4359 func->func_kwdefaults = POP();
4360 }
4361 if (oparg & 0x01) {
4362 assert(PyTuple_CheckExact(TOP()));
4363 func->func_defaults = POP();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004364 }
Neal Norwitzc1505362006-12-28 06:47:50 +00004365
Serhiy Storchaka64204de2016-06-12 17:36:24 +03004366 PUSH((PyObject *)func);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004367 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004368 }
Guido van Rossum8861b741996-07-30 16:49:37 +00004369
Benjamin Petersonddd19492018-09-16 22:38:02 -07004370 case TARGET(BUILD_SLICE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004371 PyObject *start, *stop, *step, *slice;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004372 if (oparg == 3)
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004373 step = POP();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004374 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004375 step = NULL;
4376 stop = POP();
4377 start = TOP();
4378 slice = PySlice_New(start, stop, step);
4379 Py_DECREF(start);
4380 Py_DECREF(stop);
4381 Py_XDECREF(step);
4382 SET_TOP(slice);
4383 if (slice == NULL)
4384 goto error;
4385 DISPATCH();
4386 }
Guido van Rossum8861b741996-07-30 16:49:37 +00004387
Benjamin Petersonddd19492018-09-16 22:38:02 -07004388 case TARGET(FORMAT_VALUE): {
Eric V. Smitha78c7952015-11-03 12:45:05 -05004389 /* Handles f-string value formatting. */
4390 PyObject *result;
4391 PyObject *fmt_spec;
4392 PyObject *value;
4393 PyObject *(*conv_fn)(PyObject *);
4394 int which_conversion = oparg & FVC_MASK;
4395 int have_fmt_spec = (oparg & FVS_MASK) == FVS_HAVE_SPEC;
4396
4397 fmt_spec = have_fmt_spec ? POP() : NULL;
Eric V. Smith135d5f42016-02-05 18:23:08 -05004398 value = POP();
Eric V. Smitha78c7952015-11-03 12:45:05 -05004399
4400 /* See if any conversion is specified. */
4401 switch (which_conversion) {
Eric V. Smith9a4135e2019-05-08 16:28:48 -04004402 case FVC_NONE: conv_fn = NULL; break;
Eric V. Smitha78c7952015-11-03 12:45:05 -05004403 case FVC_STR: conv_fn = PyObject_Str; break;
4404 case FVC_REPR: conv_fn = PyObject_Repr; break;
4405 case FVC_ASCII: conv_fn = PyObject_ASCII; break;
Eric V. Smith9a4135e2019-05-08 16:28:48 -04004406 default:
Victor Stinner438a12d2019-05-24 17:01:38 +02004407 _PyErr_Format(tstate, PyExc_SystemError,
4408 "unexpected conversion flag %d",
4409 which_conversion);
Eric V. Smith9a4135e2019-05-08 16:28:48 -04004410 goto error;
Eric V. Smitha78c7952015-11-03 12:45:05 -05004411 }
4412
4413 /* If there's a conversion function, call it and replace
4414 value with that result. Otherwise, just use value,
4415 without conversion. */
Eric V. Smitheb588a12016-02-05 18:26:20 -05004416 if (conv_fn != NULL) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05004417 result = conv_fn(value);
4418 Py_DECREF(value);
Eric V. Smitheb588a12016-02-05 18:26:20 -05004419 if (result == NULL) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05004420 Py_XDECREF(fmt_spec);
4421 goto error;
4422 }
4423 value = result;
4424 }
4425
4426 /* If value is a unicode object, and there's no fmt_spec,
4427 then we know the result of format(value) is value
4428 itself. In that case, skip calling format(). I plan to
4429 move this optimization in to PyObject_Format()
4430 itself. */
4431 if (PyUnicode_CheckExact(value) && fmt_spec == NULL) {
4432 /* Do nothing, just transfer ownership to result. */
4433 result = value;
4434 } else {
4435 /* Actually call format(). */
4436 result = PyObject_Format(value, fmt_spec);
4437 Py_DECREF(value);
4438 Py_XDECREF(fmt_spec);
Eric V. Smitheb588a12016-02-05 18:26:20 -05004439 if (result == NULL) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05004440 goto error;
Eric V. Smitheb588a12016-02-05 18:26:20 -05004441 }
Eric V. Smitha78c7952015-11-03 12:45:05 -05004442 }
4443
Eric V. Smith135d5f42016-02-05 18:23:08 -05004444 PUSH(result);
Eric V. Smitha78c7952015-11-03 12:45:05 -05004445 DISPATCH();
4446 }
4447
Benjamin Petersonddd19492018-09-16 22:38:02 -07004448 case TARGET(EXTENDED_ARG): {
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03004449 int oldoparg = oparg;
4450 NEXTOPARG();
4451 oparg |= oldoparg << 8;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004452 goto dispatch_opcode;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004453 }
Guido van Rossum8861b741996-07-30 16:49:37 +00004454
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004455
Antoine Pitrou042b1282010-08-13 21:15:58 +00004456#if USE_COMPUTED_GOTOS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004457 _unknown_opcode:
Antoine Pitroub52ec782009-01-25 16:34:23 +00004458#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004459 default:
4460 fprintf(stderr,
4461 "XXX lineno: %d, opcode: %d\n",
4462 PyFrame_GetLineNumber(f),
4463 opcode);
Victor Stinner438a12d2019-05-24 17:01:38 +02004464 _PyErr_SetString(tstate, PyExc_SystemError, "unknown opcode");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004465 goto error;
Guido van Rossum04691fc1992-08-12 15:35:34 +00004466
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004467 } /* switch */
Guido van Rossum374a9221991-04-04 10:40:29 +00004468
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004469 /* This should never be reached. Every opcode should end with DISPATCH()
4470 or goto error. */
Barry Warsawb2e57942017-09-14 18:13:16 -07004471 Py_UNREACHABLE();
Guido van Rossumac7be682001-01-17 15:42:30 +00004472
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004473error:
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004474 /* Double-check exception status. */
Victor Stinner365b6932013-07-12 00:11:58 +02004475#ifdef NDEBUG
Victor Stinner438a12d2019-05-24 17:01:38 +02004476 if (!_PyErr_Occurred(tstate)) {
4477 _PyErr_SetString(tstate, PyExc_SystemError,
4478 "error return without exception set");
4479 }
Victor Stinner365b6932013-07-12 00:11:58 +02004480#else
Victor Stinner438a12d2019-05-24 17:01:38 +02004481 assert(_PyErr_Occurred(tstate));
Victor Stinner365b6932013-07-12 00:11:58 +02004482#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00004483
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004484 /* Log traceback info. */
4485 PyTraceBack_Here(f);
Guido van Rossumac7be682001-01-17 15:42:30 +00004486
Mark Shannoncb9879b2020-07-17 11:44:23 +01004487 if (tstate->c_tracefunc != NULL) {
4488 /* Make sure state is set to FRAME_EXECUTING for tracing */
4489 assert(f->f_state == FRAME_EXECUTING);
4490 f->f_state = FRAME_UNWINDING;
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004491 call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj,
Mark Shannon8e1b4062021-03-05 14:45:50 +00004492 tstate, f, &trace_info);
Mark Shannoncb9879b2020-07-17 11:44:23 +01004493 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004494exception_unwind:
Mark Shannoncb9879b2020-07-17 11:44:23 +01004495 f->f_state = FRAME_UNWINDING;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004496 /* Unwind stacks if an exception occurred */
4497 while (f->f_iblock > 0) {
4498 /* Pop the current block. */
4499 PyTryBlock *b = &f->f_blockstack[--f->f_iblock];
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004500
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004501 if (b->b_type == EXCEPT_HANDLER) {
4502 UNWIND_EXCEPT_HANDLER(b);
4503 continue;
4504 }
4505 UNWIND_BLOCK(b);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004506 if (b->b_type == SETUP_FINALLY) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004507 PyObject *exc, *val, *tb;
4508 int handler = b->b_handler;
Mark Shannonae3087c2017-10-22 22:41:51 +01004509 _PyErr_StackItem *exc_info = tstate->exc_info;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004510 /* Beware, this invalidates all b->b_* fields */
Mark Shannonbf353f32020-12-17 13:55:28 +00004511 PyFrame_BlockSetup(f, EXCEPT_HANDLER, f->f_lasti, STACK_LEVEL());
Mark Shannonae3087c2017-10-22 22:41:51 +01004512 PUSH(exc_info->exc_traceback);
4513 PUSH(exc_info->exc_value);
4514 if (exc_info->exc_type != NULL) {
4515 PUSH(exc_info->exc_type);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004516 }
4517 else {
4518 Py_INCREF(Py_None);
4519 PUSH(Py_None);
4520 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004521 _PyErr_Fetch(tstate, &exc, &val, &tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004522 /* Make the raw exception data
4523 available to the handler,
4524 so a program can emulate the
4525 Python main loop. */
Victor Stinner438a12d2019-05-24 17:01:38 +02004526 _PyErr_NormalizeException(tstate, &exc, &val, &tb);
Victor Stinner7eab0d02013-07-15 21:16:27 +02004527 if (tb != NULL)
4528 PyException_SetTraceback(val, tb);
4529 else
4530 PyException_SetTraceback(val, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004531 Py_INCREF(exc);
Mark Shannonae3087c2017-10-22 22:41:51 +01004532 exc_info->exc_type = exc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004533 Py_INCREF(val);
Mark Shannonae3087c2017-10-22 22:41:51 +01004534 exc_info->exc_value = val;
4535 exc_info->exc_traceback = tb;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004536 if (tb == NULL)
4537 tb = Py_None;
4538 Py_INCREF(tb);
4539 PUSH(tb);
4540 PUSH(val);
4541 PUSH(exc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004542 JUMPTO(handler);
Victor Stinnerdab84232020-03-17 18:56:44 +01004543 if (_Py_TracingPossible(ceval2)) {
Mark Shannon8e1b4062021-03-05 14:45:50 +00004544 trace_info.instr_prev = INT_MAX;
Mark Shannonfee55262019-11-21 09:11:43 +00004545 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004546 /* Resume normal execution */
Mark Shannoncb9879b2020-07-17 11:44:23 +01004547 f->f_state = FRAME_EXECUTING;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004548 goto main_loop;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004549 }
4550 } /* unwind stack */
Guido van Rossum374a9221991-04-04 10:40:29 +00004551
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004552 /* End the loop as we still have an error */
4553 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004554 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00004555
Pablo Galindof00828a2019-05-09 16:52:02 +01004556 assert(retval == NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02004557 assert(_PyErr_Occurred(tstate));
Pablo Galindof00828a2019-05-09 16:52:02 +01004558
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004559 /* Pop remaining stack entries. */
4560 while (!EMPTY()) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004561 PyObject *o = POP();
4562 Py_XDECREF(o);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004563 }
Mark Shannoncb9879b2020-07-17 11:44:23 +01004564 f->f_stackdepth = 0;
4565 f->f_state = FRAME_RAISED;
Mark Shannone7c9f4a2020-01-13 12:51:26 +00004566exiting:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004567 if (tstate->use_tracing) {
Benjamin Peterson51f46162013-01-23 08:38:47 -05004568 if (tstate->c_tracefunc) {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004569 if (call_trace_protected(tstate->c_tracefunc, tstate->c_traceobj,
Mark Shannon8e1b4062021-03-05 14:45:50 +00004570 tstate, f, &trace_info, PyTrace_RETURN, retval)) {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004571 Py_CLEAR(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004572 }
4573 }
4574 if (tstate->c_profilefunc) {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004575 if (call_trace_protected(tstate->c_profilefunc, tstate->c_profileobj,
Mark Shannon8e1b4062021-03-05 14:45:50 +00004576 tstate, f, &trace_info, PyTrace_RETURN, retval)) {
Serhiy Storchaka505ff752014-02-09 13:33:53 +02004577 Py_CLEAR(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004578 }
4579 }
4580 }
Guido van Rossuma4240131997-01-21 21:18:36 +00004581
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004582 /* pop frame */
Thomas Woutersce272b62007-09-19 21:19:28 +00004583exit_eval_frame:
Łukasz Langaa785c872016-09-09 17:37:37 -07004584 if (PyDTrace_FUNCTION_RETURN_ENABLED())
4585 dtrace_function_return(f);
Victor Stinnerbe434dc2019-11-05 00:51:22 +01004586 _Py_LeaveRecursiveCall(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004587 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00004588
Victor Stinner0b72b232020-03-12 23:18:39 +01004589 return _Py_CheckFunctionResult(tstate, NULL, retval, __func__);
Guido van Rossum374a9221991-04-04 10:40:29 +00004590}
4591
Benjamin Petersonb204a422011-06-05 22:04:07 -05004592static void
Victor Stinner438a12d2019-05-24 17:01:38 +02004593format_missing(PyThreadState *tstate, const char *kind,
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004594 PyCodeObject *co, PyObject *names, PyObject *qualname)
Benjamin Petersone109c702011-06-24 09:37:26 -05004595{
4596 int err;
4597 Py_ssize_t len = PyList_GET_SIZE(names);
4598 PyObject *name_str, *comma, *tail, *tmp;
4599
4600 assert(PyList_CheckExact(names));
4601 assert(len >= 1);
4602 /* Deal with the joys of natural language. */
4603 switch (len) {
4604 case 1:
4605 name_str = PyList_GET_ITEM(names, 0);
4606 Py_INCREF(name_str);
4607 break;
4608 case 2:
4609 name_str = PyUnicode_FromFormat("%U and %U",
4610 PyList_GET_ITEM(names, len - 2),
4611 PyList_GET_ITEM(names, len - 1));
4612 break;
4613 default:
4614 tail = PyUnicode_FromFormat(", %U, and %U",
4615 PyList_GET_ITEM(names, len - 2),
4616 PyList_GET_ITEM(names, len - 1));
Benjamin Petersond1ab6082012-06-01 11:18:22 -07004617 if (tail == NULL)
4618 return;
Benjamin Petersone109c702011-06-24 09:37:26 -05004619 /* Chop off the last two objects in the list. This shouldn't actually
4620 fail, but we can't be too careful. */
4621 err = PyList_SetSlice(names, len - 2, len, NULL);
4622 if (err == -1) {
4623 Py_DECREF(tail);
4624 return;
4625 }
4626 /* Stitch everything up into a nice comma-separated list. */
4627 comma = PyUnicode_FromString(", ");
4628 if (comma == NULL) {
4629 Py_DECREF(tail);
4630 return;
4631 }
4632 tmp = PyUnicode_Join(comma, names);
4633 Py_DECREF(comma);
4634 if (tmp == NULL) {
4635 Py_DECREF(tail);
4636 return;
4637 }
4638 name_str = PyUnicode_Concat(tmp, tail);
4639 Py_DECREF(tmp);
4640 Py_DECREF(tail);
4641 break;
4642 }
4643 if (name_str == NULL)
4644 return;
Victor Stinner438a12d2019-05-24 17:01:38 +02004645 _PyErr_Format(tstate, PyExc_TypeError,
4646 "%U() missing %i required %s argument%s: %U",
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004647 qualname,
Victor Stinner438a12d2019-05-24 17:01:38 +02004648 len,
4649 kind,
4650 len == 1 ? "" : "s",
4651 name_str);
Benjamin Petersone109c702011-06-24 09:37:26 -05004652 Py_DECREF(name_str);
4653}
4654
4655static void
Victor Stinner438a12d2019-05-24 17:01:38 +02004656missing_arguments(PyThreadState *tstate, PyCodeObject *co,
4657 Py_ssize_t missing, Py_ssize_t defcount,
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004658 PyObject **fastlocals, PyObject *qualname)
Benjamin Petersone109c702011-06-24 09:37:26 -05004659{
Victor Stinner74319ae2016-08-25 00:04:09 +02004660 Py_ssize_t i, j = 0;
4661 Py_ssize_t start, end;
4662 int positional = (defcount != -1);
Benjamin Petersone109c702011-06-24 09:37:26 -05004663 const char *kind = positional ? "positional" : "keyword-only";
4664 PyObject *missing_names;
4665
4666 /* Compute the names of the arguments that are missing. */
4667 missing_names = PyList_New(missing);
4668 if (missing_names == NULL)
4669 return;
4670 if (positional) {
4671 start = 0;
Pablo Galindocd74e662019-06-01 18:08:04 +01004672 end = co->co_argcount - defcount;
Benjamin Petersone109c702011-06-24 09:37:26 -05004673 }
4674 else {
Pablo Galindocd74e662019-06-01 18:08:04 +01004675 start = co->co_argcount;
Benjamin Petersone109c702011-06-24 09:37:26 -05004676 end = start + co->co_kwonlyargcount;
4677 }
4678 for (i = start; i < end; i++) {
4679 if (GETLOCAL(i) == NULL) {
4680 PyObject *raw = PyTuple_GET_ITEM(co->co_varnames, i);
4681 PyObject *name = PyObject_Repr(raw);
4682 if (name == NULL) {
4683 Py_DECREF(missing_names);
4684 return;
4685 }
4686 PyList_SET_ITEM(missing_names, j++, name);
4687 }
4688 }
4689 assert(j == missing);
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004690 format_missing(tstate, kind, co, missing_names, qualname);
Benjamin Petersone109c702011-06-24 09:37:26 -05004691 Py_DECREF(missing_names);
4692}
4693
4694static void
Victor Stinner438a12d2019-05-24 17:01:38 +02004695too_many_positional(PyThreadState *tstate, PyCodeObject *co,
Mark Shannond6c33fb2021-01-29 13:24:55 +00004696 Py_ssize_t given, PyObject *defaults,
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004697 PyObject **fastlocals, PyObject *qualname)
Benjamin Petersonb204a422011-06-05 22:04:07 -05004698{
4699 int plural;
Victor Stinner74319ae2016-08-25 00:04:09 +02004700 Py_ssize_t kwonly_given = 0;
4701 Py_ssize_t i;
Benjamin Petersonb204a422011-06-05 22:04:07 -05004702 PyObject *sig, *kwonly_sig;
Victor Stinner74319ae2016-08-25 00:04:09 +02004703 Py_ssize_t co_argcount = co->co_argcount;
Benjamin Petersonb204a422011-06-05 22:04:07 -05004704
Benjamin Petersone109c702011-06-24 09:37:26 -05004705 assert((co->co_flags & CO_VARARGS) == 0);
4706 /* Count missing keyword-only args. */
Pablo Galindocd74e662019-06-01 18:08:04 +01004707 for (i = co_argcount; i < co_argcount + co->co_kwonlyargcount; i++) {
Victor Stinner74319ae2016-08-25 00:04:09 +02004708 if (GETLOCAL(i) != NULL) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004709 kwonly_given++;
Victor Stinner74319ae2016-08-25 00:04:09 +02004710 }
4711 }
Mark Shannond6c33fb2021-01-29 13:24:55 +00004712 Py_ssize_t defcount = defaults == NULL ? 0 : PyTuple_GET_SIZE(defaults);
Benjamin Petersone109c702011-06-24 09:37:26 -05004713 if (defcount) {
Pablo Galindocd74e662019-06-01 18:08:04 +01004714 Py_ssize_t atleast = co_argcount - defcount;
Benjamin Petersonb204a422011-06-05 22:04:07 -05004715 plural = 1;
Pablo Galindocd74e662019-06-01 18:08:04 +01004716 sig = PyUnicode_FromFormat("from %zd to %zd", atleast, co_argcount);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004717 }
4718 else {
Pablo Galindocd74e662019-06-01 18:08:04 +01004719 plural = (co_argcount != 1);
4720 sig = PyUnicode_FromFormat("%zd", co_argcount);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004721 }
4722 if (sig == NULL)
4723 return;
4724 if (kwonly_given) {
Victor Stinner74319ae2016-08-25 00:04:09 +02004725 const char *format = " positional argument%s (and %zd keyword-only argument%s)";
4726 kwonly_sig = PyUnicode_FromFormat(format,
4727 given != 1 ? "s" : "",
4728 kwonly_given,
4729 kwonly_given != 1 ? "s" : "");
Benjamin Petersonb204a422011-06-05 22:04:07 -05004730 if (kwonly_sig == NULL) {
4731 Py_DECREF(sig);
4732 return;
4733 }
4734 }
4735 else {
4736 /* This will not fail. */
4737 kwonly_sig = PyUnicode_FromString("");
Benjamin Petersone109c702011-06-24 09:37:26 -05004738 assert(kwonly_sig != NULL);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004739 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004740 _PyErr_Format(tstate, PyExc_TypeError,
4741 "%U() takes %U positional argument%s but %zd%U %s given",
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004742 qualname,
Victor Stinner438a12d2019-05-24 17:01:38 +02004743 sig,
4744 plural ? "s" : "",
4745 given,
4746 kwonly_sig,
4747 given == 1 && !kwonly_given ? "was" : "were");
Benjamin Petersonb204a422011-06-05 22:04:07 -05004748 Py_DECREF(sig);
4749 Py_DECREF(kwonly_sig);
4750}
4751
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004752static int
Victor Stinner438a12d2019-05-24 17:01:38 +02004753positional_only_passed_as_keyword(PyThreadState *tstate, PyCodeObject *co,
Mark Shannon0332e562021-02-01 10:42:03 +00004754 Py_ssize_t kwcount, PyObject* kwnames,
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004755 PyObject *qualname)
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004756{
4757 int posonly_conflicts = 0;
4758 PyObject* posonly_names = PyList_New(0);
4759
4760 for(int k=0; k < co->co_posonlyargcount; k++){
4761 PyObject* posonly_name = PyTuple_GET_ITEM(co->co_varnames, k);
4762
4763 for (int k2=0; k2<kwcount; k2++){
4764 /* Compare the pointers first and fallback to PyObject_RichCompareBool*/
Mark Shannon0332e562021-02-01 10:42:03 +00004765 PyObject* kwname = PyTuple_GET_ITEM(kwnames, k2);
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004766 if (kwname == posonly_name){
4767 if(PyList_Append(posonly_names, kwname) != 0) {
4768 goto fail;
4769 }
4770 posonly_conflicts++;
4771 continue;
4772 }
4773
4774 int cmp = PyObject_RichCompareBool(posonly_name, kwname, Py_EQ);
4775
4776 if ( cmp > 0) {
4777 if(PyList_Append(posonly_names, kwname) != 0) {
4778 goto fail;
4779 }
4780 posonly_conflicts++;
4781 } else if (cmp < 0) {
4782 goto fail;
4783 }
4784
4785 }
4786 }
4787 if (posonly_conflicts) {
4788 PyObject* comma = PyUnicode_FromString(", ");
4789 if (comma == NULL) {
4790 goto fail;
4791 }
4792 PyObject* error_names = PyUnicode_Join(comma, posonly_names);
4793 Py_DECREF(comma);
4794 if (error_names == NULL) {
4795 goto fail;
4796 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004797 _PyErr_Format(tstate, PyExc_TypeError,
4798 "%U() got some positional-only arguments passed"
4799 " as keyword arguments: '%U'",
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004800 qualname, error_names);
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004801 Py_DECREF(error_names);
4802 goto fail;
4803 }
4804
4805 Py_DECREF(posonly_names);
4806 return 0;
4807
4808fail:
4809 Py_XDECREF(posonly_names);
4810 return 1;
4811
4812}
4813
Skip Montanaro786ea6b2004-03-01 15:44:05 +00004814
Mark Shannon0332e562021-02-01 10:42:03 +00004815PyFrameObject *
4816_PyEval_MakeFrameVector(PyThreadState *tstate,
Mark Shannond6c33fb2021-01-29 13:24:55 +00004817 PyFrameConstructor *con, PyObject *locals,
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02004818 PyObject *const *args, Py_ssize_t argcount,
Mark Shannon0332e562021-02-01 10:42:03 +00004819 PyObject *kwnames)
Tim Peters5ca576e2001-06-18 22:08:13 +00004820{
Victor Stinnerda2914d2020-03-20 09:29:08 +01004821 assert(is_tstate_valid(tstate));
Victor Stinnerb5e170f2019-11-16 01:03:22 +01004822
Mark Shannond6c33fb2021-01-29 13:24:55 +00004823 PyCodeObject *co = (PyCodeObject*)con->fc_code;
4824 assert(con->fc_defaults == NULL || PyTuple_CheckExact(con->fc_defaults));
Pablo Galindocd74e662019-06-01 18:08:04 +01004825 const Py_ssize_t total_args = co->co_argcount + co->co_kwonlyargcount;
Tim Peters5ca576e2001-06-18 22:08:13 +00004826
Victor Stinnerc7020012016-08-16 23:40:29 +02004827 /* Create the frame */
Mark Shannon0332e562021-02-01 10:42:03 +00004828 PyFrameObject *f = _PyFrame_New_NoTrack(tstate, con, locals);
Victor Stinnerc7020012016-08-16 23:40:29 +02004829 if (f == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004830 return NULL;
Victor Stinnerc7020012016-08-16 23:40:29 +02004831 }
Victor Stinner232dda62020-06-04 15:19:02 +02004832 PyObject **fastlocals = f->f_localsplus;
4833 PyObject **freevars = f->f_localsplus + co->co_nlocals;
Tim Peters5ca576e2001-06-18 22:08:13 +00004834
Victor Stinnerc7020012016-08-16 23:40:29 +02004835 /* Create a dictionary for keyword parameters (**kwags) */
Victor Stinner232dda62020-06-04 15:19:02 +02004836 PyObject *kwdict;
4837 Py_ssize_t i;
Benjamin Petersonb204a422011-06-05 22:04:07 -05004838 if (co->co_flags & CO_VARKEYWORDS) {
4839 kwdict = PyDict_New();
4840 if (kwdict == NULL)
4841 goto fail;
4842 i = total_args;
Victor Stinnerc7020012016-08-16 23:40:29 +02004843 if (co->co_flags & CO_VARARGS) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004844 i++;
Victor Stinnerc7020012016-08-16 23:40:29 +02004845 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004846 SETLOCAL(i, kwdict);
4847 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004848 else {
4849 kwdict = NULL;
4850 }
4851
Pablo Galindocd74e662019-06-01 18:08:04 +01004852 /* Copy all positional arguments into local variables */
Victor Stinner232dda62020-06-04 15:19:02 +02004853 Py_ssize_t j, n;
Pablo Galindocd74e662019-06-01 18:08:04 +01004854 if (argcount > co->co_argcount) {
4855 n = co->co_argcount;
Victor Stinnerc7020012016-08-16 23:40:29 +02004856 }
4857 else {
4858 n = argcount;
4859 }
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004860 for (j = 0; j < n; j++) {
Victor Stinner232dda62020-06-04 15:19:02 +02004861 PyObject *x = args[j];
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004862 Py_INCREF(x);
4863 SETLOCAL(j, x);
4864 }
4865
Victor Stinnerc7020012016-08-16 23:40:29 +02004866 /* Pack other positional arguments into the *args argument */
Benjamin Petersonb204a422011-06-05 22:04:07 -05004867 if (co->co_flags & CO_VARARGS) {
Victor Stinner232dda62020-06-04 15:19:02 +02004868 PyObject *u = _PyTuple_FromArray(args + n, argcount - n);
Victor Stinnerc7020012016-08-16 23:40:29 +02004869 if (u == NULL) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004870 goto fail;
Victor Stinnerc7020012016-08-16 23:40:29 +02004871 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004872 SETLOCAL(total_args, u);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004873 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004874
Mark Shannon0332e562021-02-01 10:42:03 +00004875 /* Handle keyword arguments */
4876 if (kwnames != NULL) {
4877 Py_ssize_t kwcount = PyTuple_GET_SIZE(kwnames);
4878 for (i = 0; i < kwcount; i++) {
4879 PyObject **co_varnames;
4880 PyObject *keyword = PyTuple_GET_ITEM(kwnames, i);
4881 PyObject *value = args[i+argcount];
4882 Py_ssize_t j;
Victor Stinnerc7020012016-08-16 23:40:29 +02004883
Mark Shannon0332e562021-02-01 10:42:03 +00004884 if (keyword == NULL || !PyUnicode_Check(keyword)) {
4885 _PyErr_Format(tstate, PyExc_TypeError,
4886 "%U() keywords must be strings",
Mark Shannond6c33fb2021-01-29 13:24:55 +00004887 con->fc_qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004888 goto fail;
Victor Stinner6fea7f72016-08-22 23:17:30 +02004889 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004890
Mark Shannon0332e562021-02-01 10:42:03 +00004891 /* Speed hack: do raw pointer compares. As names are
4892 normally interned this should almost always hit. */
4893 co_varnames = ((PyTupleObject *)(co->co_varnames))->ob_item;
4894 for (j = co->co_posonlyargcount; j < total_args; j++) {
4895 PyObject *varname = co_varnames[j];
4896 if (varname == keyword) {
4897 goto kw_found;
4898 }
4899 }
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004900
Mark Shannon0332e562021-02-01 10:42:03 +00004901 /* Slow fallback, just in case */
4902 for (j = co->co_posonlyargcount; j < total_args; j++) {
4903 PyObject *varname = co_varnames[j];
4904 int cmp = PyObject_RichCompareBool( keyword, varname, Py_EQ);
4905 if (cmp > 0) {
4906 goto kw_found;
4907 }
4908 else if (cmp < 0) {
4909 goto fail;
4910 }
4911 }
4912
4913 assert(j >= total_args);
4914 if (kwdict == NULL) {
4915
4916 if (co->co_posonlyargcount
4917 && positional_only_passed_as_keyword(tstate, co,
4918 kwcount, kwnames,
Mark Shannond6c33fb2021-01-29 13:24:55 +00004919 con->fc_qualname))
Mark Shannon0332e562021-02-01 10:42:03 +00004920 {
4921 goto fail;
4922 }
4923
4924 _PyErr_Format(tstate, PyExc_TypeError,
4925 "%U() got an unexpected keyword argument '%S'",
4926 con->fc_qualname, keyword);
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004927 goto fail;
4928 }
4929
Mark Shannon0332e562021-02-01 10:42:03 +00004930 if (PyDict_SetItem(kwdict, keyword, value) == -1) {
4931 goto fail;
4932 }
4933 continue;
Victor Stinnerc7020012016-08-16 23:40:29 +02004934
Mark Shannon0332e562021-02-01 10:42:03 +00004935 kw_found:
4936 if (GETLOCAL(j) != NULL) {
4937 _PyErr_Format(tstate, PyExc_TypeError,
4938 "%U() got multiple values for argument '%S'",
Mark Shannond6c33fb2021-01-29 13:24:55 +00004939 con->fc_qualname, keyword);
Mark Shannon0332e562021-02-01 10:42:03 +00004940 goto fail;
4941 }
4942 Py_INCREF(value);
4943 SETLOCAL(j, value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004944 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004945 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004946
4947 /* Check the number of positional arguments */
Pablo Galindocd74e662019-06-01 18:08:04 +01004948 if ((argcount > co->co_argcount) && !(co->co_flags & CO_VARARGS)) {
Mark Shannond6c33fb2021-01-29 13:24:55 +00004949 too_many_positional(tstate, co, argcount, con->fc_defaults, fastlocals,
4950 con->fc_qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004951 goto fail;
4952 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004953
4954 /* Add missing positional arguments (copy default values from defs) */
Pablo Galindocd74e662019-06-01 18:08:04 +01004955 if (argcount < co->co_argcount) {
Mark Shannond6c33fb2021-01-29 13:24:55 +00004956 Py_ssize_t defcount = con->fc_defaults == NULL ? 0 : PyTuple_GET_SIZE(con->fc_defaults);
Pablo Galindocd74e662019-06-01 18:08:04 +01004957 Py_ssize_t m = co->co_argcount - defcount;
Victor Stinner17061a92016-08-16 23:39:42 +02004958 Py_ssize_t missing = 0;
4959 for (i = argcount; i < m; i++) {
4960 if (GETLOCAL(i) == NULL) {
Benjamin Petersone109c702011-06-24 09:37:26 -05004961 missing++;
Victor Stinner17061a92016-08-16 23:39:42 +02004962 }
4963 }
Benjamin Petersone109c702011-06-24 09:37:26 -05004964 if (missing) {
Victor Stinner232dda62020-06-04 15:19:02 +02004965 missing_arguments(tstate, co, missing, defcount, fastlocals,
Mark Shannond6c33fb2021-01-29 13:24:55 +00004966 con->fc_qualname);
Benjamin Petersone109c702011-06-24 09:37:26 -05004967 goto fail;
Benjamin Petersonb204a422011-06-05 22:04:07 -05004968 }
4969 if (n > m)
4970 i = n - m;
4971 else
4972 i = 0;
Mark Shannond6c33fb2021-01-29 13:24:55 +00004973 if (defcount) {
4974 PyObject **defs = &PyTuple_GET_ITEM(con->fc_defaults, 0);
4975 for (; i < defcount; i++) {
4976 if (GETLOCAL(m+i) == NULL) {
4977 PyObject *def = defs[i];
4978 Py_INCREF(def);
4979 SETLOCAL(m+i, def);
4980 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004981 }
4982 }
4983 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004984
4985 /* Add missing keyword arguments (copy default values from kwdefs) */
Benjamin Petersonb204a422011-06-05 22:04:07 -05004986 if (co->co_kwonlyargcount > 0) {
Victor Stinner17061a92016-08-16 23:39:42 +02004987 Py_ssize_t missing = 0;
Pablo Galindocd74e662019-06-01 18:08:04 +01004988 for (i = co->co_argcount; i < total_args; i++) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004989 if (GETLOCAL(i) != NULL)
4990 continue;
Victor Stinner232dda62020-06-04 15:19:02 +02004991 PyObject *varname = PyTuple_GET_ITEM(co->co_varnames, i);
Mark Shannond6c33fb2021-01-29 13:24:55 +00004992 if (con->fc_kwdefaults != NULL) {
4993 PyObject *def = PyDict_GetItemWithError(con->fc_kwdefaults, varname);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004994 if (def) {
4995 Py_INCREF(def);
4996 SETLOCAL(i, def);
4997 continue;
4998 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004999 else if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02005000 goto fail;
5001 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05005002 }
Benjamin Petersone109c702011-06-24 09:37:26 -05005003 missing++;
5004 }
5005 if (missing) {
Victor Stinner232dda62020-06-04 15:19:02 +02005006 missing_arguments(tstate, co, missing, -1, fastlocals,
Mark Shannond6c33fb2021-01-29 13:24:55 +00005007 con->fc_qualname);
Benjamin Petersonb204a422011-06-05 22:04:07 -05005008 goto fail;
5009 }
5010 }
5011
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005012 /* Allocate and initialize storage for cell vars, and copy free
Benjamin Peterson90037602011-06-25 22:54:45 -05005013 vars into frame. */
5014 for (i = 0; i < PyTuple_GET_SIZE(co->co_cellvars); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005015 PyObject *c;
Serhiy Storchaka5bb8b912016-12-16 19:19:02 +02005016 Py_ssize_t arg;
Benjamin Peterson90037602011-06-25 22:54:45 -05005017 /* Possibly account for the cell variable being an argument. */
5018 if (co->co_cell2arg != NULL &&
Guido van Rossum6832c812013-05-10 08:47:42 -07005019 (arg = co->co_cell2arg[i]) != CO_CELL_NOT_AN_ARG) {
Benjamin Peterson90037602011-06-25 22:54:45 -05005020 c = PyCell_New(GETLOCAL(arg));
Benjamin Peterson159ae412013-05-12 18:16:06 -05005021 /* Clear the local copy. */
5022 SETLOCAL(arg, NULL);
Guido van Rossum6832c812013-05-10 08:47:42 -07005023 }
5024 else {
Benjamin Peterson90037602011-06-25 22:54:45 -05005025 c = PyCell_New(NULL);
Guido van Rossum6832c812013-05-10 08:47:42 -07005026 }
Benjamin Peterson159ae412013-05-12 18:16:06 -05005027 if (c == NULL)
5028 goto fail;
Benjamin Peterson90037602011-06-25 22:54:45 -05005029 SETLOCAL(co->co_nlocals + i, c);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005030 }
Victor Stinnerc7020012016-08-16 23:40:29 +02005031
5032 /* Copy closure variables to free variables */
Benjamin Peterson90037602011-06-25 22:54:45 -05005033 for (i = 0; i < PyTuple_GET_SIZE(co->co_freevars); ++i) {
Mark Shannond6c33fb2021-01-29 13:24:55 +00005034 PyObject *o = PyTuple_GET_ITEM(con->fc_closure, i);
Benjamin Peterson90037602011-06-25 22:54:45 -05005035 Py_INCREF(o);
5036 freevars[PyTuple_GET_SIZE(co->co_cellvars) + i] = o;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005037 }
Tim Peters5ca576e2001-06-18 22:08:13 +00005038
Mark Shannon0332e562021-02-01 10:42:03 +00005039 return f;
Tim Peters5ca576e2001-06-18 22:08:13 +00005040
Thomas Woutersce272b62007-09-19 21:19:28 +00005041fail: /* Jump here from prelude on failure */
Tim Peters5ca576e2001-06-18 22:08:13 +00005042
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005043 /* decref'ing the frame can cause __del__ methods to get invoked,
5044 which can call back into Python. While we're done with the
5045 current Python frame (f), the associated C stack is still in use,
5046 so recursion_depth must be boosted for the duration.
5047 */
INADA Naoki5a625d02016-12-24 20:19:08 +09005048 if (Py_REFCNT(f) > 1) {
5049 Py_DECREF(f);
5050 _PyObject_GC_TRACK(f);
5051 }
5052 else {
5053 ++tstate->recursion_depth;
5054 Py_DECREF(f);
5055 --tstate->recursion_depth;
5056 }
Mark Shannon0332e562021-02-01 10:42:03 +00005057 return NULL;
5058}
5059
5060static PyObject *
5061make_coro(PyFrameConstructor *con, PyFrameObject *f)
5062{
5063 assert (((PyCodeObject *)con->fc_code)->co_flags & (CO_GENERATOR | CO_COROUTINE | CO_ASYNC_GENERATOR));
5064 PyObject *gen;
5065 int is_coro = ((PyCodeObject *)con->fc_code)->co_flags & CO_COROUTINE;
5066
5067 /* Don't need to keep the reference to f_back, it will be set
5068 * when the generator is resumed. */
5069 Py_CLEAR(f->f_back);
5070
5071 /* Create a new generator that owns the ready to run frame
5072 * and return that as the value. */
5073 if (is_coro) {
5074 gen = PyCoro_New(f, con->fc_name, con->fc_qualname);
5075 } else if (((PyCodeObject *)con->fc_code)->co_flags & CO_ASYNC_GENERATOR) {
5076 gen = PyAsyncGen_New(f, con->fc_name, con->fc_qualname);
5077 } else {
5078 gen = PyGen_NewWithQualName(f, con->fc_name, con->fc_qualname);
5079 }
5080 if (gen == NULL) {
5081 return NULL;
5082 }
5083
5084 _PyObject_GC_TRACK(f);
5085
5086 return gen;
5087}
5088
5089PyObject *
5090_PyEval_Vector(PyThreadState *tstate, PyFrameConstructor *con,
5091 PyObject *locals,
5092 PyObject* const* args, size_t argcount,
5093 PyObject *kwnames)
5094{
5095 PyFrameObject *f = _PyEval_MakeFrameVector(
5096 tstate, con, locals, args, argcount, kwnames);
5097 if (f == NULL) {
5098 return NULL;
5099 }
5100 if (((PyCodeObject *)con->fc_code)->co_flags & (CO_GENERATOR | CO_COROUTINE | CO_ASYNC_GENERATOR)) {
5101 return make_coro(con, f);
5102 }
5103 PyObject *retval = _PyEval_EvalFrame(tstate, f, 0);
5104
5105 /* decref'ing the frame can cause __del__ methods to get invoked,
5106 which can call back into Python. While we're done with the
5107 current Python frame (f), the associated C stack is still in use,
5108 so recursion_depth must be boosted for the duration.
5109 */
5110 if (Py_REFCNT(f) > 1) {
5111 Py_DECREF(f);
5112 _PyObject_GC_TRACK(f);
5113 }
5114 else {
5115 ++tstate->recursion_depth;
5116 Py_DECREF(f);
5117 --tstate->recursion_depth;
5118 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005119 return retval;
Tim Peters5ca576e2001-06-18 22:08:13 +00005120}
5121
Mark Shannond6c33fb2021-01-29 13:24:55 +00005122/* Legacy API */
Victor Stinnerb5e170f2019-11-16 01:03:22 +01005123PyObject *
Mark Shannon0332e562021-02-01 10:42:03 +00005124PyEval_EvalCodeEx(PyObject *_co, PyObject *globals, PyObject *locals,
5125 PyObject *const *args, int argcount,
5126 PyObject *const *kws, int kwcount,
5127 PyObject *const *defs, int defcount,
5128 PyObject *kwdefs, PyObject *closure)
Victor Stinnerb5e170f2019-11-16 01:03:22 +01005129{
Victor Stinner46496f92021-02-20 15:17:18 +01005130 PyThreadState *tstate = _PyThreadState_GET();
Mark Shannon0332e562021-02-01 10:42:03 +00005131 PyObject *res;
Mark Shannond6c33fb2021-01-29 13:24:55 +00005132 PyObject *defaults = _PyTuple_FromArray(defs, defcount);
5133 if (defaults == NULL) {
5134 return NULL;
5135 }
Victor Stinnerfc980e02021-03-18 14:51:24 +01005136 PyObject *builtins = _PyEval_BuiltinsFromGlobals(tstate, globals); // borrowed ref
Mark Shannond6c33fb2021-01-29 13:24:55 +00005137 if (builtins == NULL) {
5138 Py_DECREF(defaults);
5139 return NULL;
5140 }
Mark Shannon0332e562021-02-01 10:42:03 +00005141 if (locals == NULL) {
5142 locals = globals;
5143 }
5144 PyObject *kwnames;
5145 PyObject *const *allargs;
5146 PyObject **newargs;
5147 if (kwcount == 0) {
5148 allargs = args;
5149 kwnames = NULL;
5150 }
5151 else {
5152 kwnames = PyTuple_New(kwcount);
5153 if (kwnames == NULL) {
5154 res = NULL;
5155 goto fail;
5156 }
5157 newargs = PyMem_Malloc(sizeof(PyObject *)*(kwcount+argcount));
5158 if (newargs == NULL) {
5159 res = NULL;
5160 Py_DECREF(kwnames);
5161 goto fail;
5162 }
5163 for (int i = 0; i < argcount; i++) {
5164 newargs[i] = args[i];
5165 }
5166 for (int i = 0; i < kwcount; i++) {
5167 Py_INCREF(kws[2*i]);
5168 PyTuple_SET_ITEM(kwnames, i, kws[2*i]);
5169 newargs[argcount+i] = kws[2*i+1];
5170 }
5171 allargs = newargs;
5172 }
5173 PyObject **kwargs = PyMem_Malloc(sizeof(PyObject *)*kwcount);
5174 if (kwargs == NULL) {
5175 res = NULL;
5176 Py_DECREF(kwnames);
5177 goto fail;
5178 }
5179 for (int i = 0; i < kwcount; i++) {
5180 Py_INCREF(kws[2*i]);
5181 PyTuple_SET_ITEM(kwnames, i, kws[2*i]);
5182 kwargs[i] = kws[2*i+1];
5183 }
Mark Shannond6c33fb2021-01-29 13:24:55 +00005184 PyFrameConstructor constr = {
5185 .fc_globals = globals,
5186 .fc_builtins = builtins,
Mark Shannon0332e562021-02-01 10:42:03 +00005187 .fc_name = ((PyCodeObject *)_co)->co_name,
5188 .fc_qualname = ((PyCodeObject *)_co)->co_name,
Mark Shannond6c33fb2021-01-29 13:24:55 +00005189 .fc_code = _co,
5190 .fc_defaults = defaults,
5191 .fc_kwdefaults = kwdefs,
5192 .fc_closure = closure
5193 };
Mark Shannon0332e562021-02-01 10:42:03 +00005194 res = _PyEval_Vector(tstate, &constr, locals,
Victor Stinner44085a32021-02-18 19:20:16 +01005195 allargs, argcount,
5196 kwnames);
Mark Shannon0332e562021-02-01 10:42:03 +00005197 if (kwcount) {
5198 Py_DECREF(kwnames);
5199 PyMem_Free(newargs);
5200 }
5201fail:
Mark Shannond6c33fb2021-01-29 13:24:55 +00005202 Py_DECREF(defaults);
Mark Shannond6c33fb2021-01-29 13:24:55 +00005203 return res;
Victor Stinnerb5e170f2019-11-16 01:03:22 +01005204}
5205
Tim Peters5ca576e2001-06-18 22:08:13 +00005206
Benjamin Peterson876b2f22009-06-28 03:18:59 +00005207static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02005208special_lookup(PyThreadState *tstate, PyObject *o, _Py_Identifier *id)
Benjamin Peterson876b2f22009-06-28 03:18:59 +00005209{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005210 PyObject *res;
Benjamin Petersonce798522012-01-22 11:24:29 -05005211 res = _PyObject_LookupSpecial(o, id);
Victor Stinner438a12d2019-05-24 17:01:38 +02005212 if (res == NULL && !_PyErr_Occurred(tstate)) {
Victor Stinner4804b5b2020-05-12 01:43:38 +02005213 _PyErr_SetObject(tstate, PyExc_AttributeError, _PyUnicode_FromId(id));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005214 return NULL;
5215 }
5216 return res;
Benjamin Peterson876b2f22009-06-28 03:18:59 +00005217}
5218
5219
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00005220/* Logic for the raise statement (too complicated for inlining).
5221 This *consumes* a reference count to each of its arguments. */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04005222static int
Victor Stinner09532fe2019-05-10 23:39:09 +02005223do_raise(PyThreadState *tstate, PyObject *exc, PyObject *cause)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00005224{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005225 PyObject *type = NULL, *value = NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00005226
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005227 if (exc == NULL) {
5228 /* Reraise */
Mark Shannonae3087c2017-10-22 22:41:51 +01005229 _PyErr_StackItem *exc_info = _PyErr_GetTopmostException(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005230 PyObject *tb;
Mark Shannonae3087c2017-10-22 22:41:51 +01005231 type = exc_info->exc_type;
5232 value = exc_info->exc_value;
5233 tb = exc_info->exc_traceback;
Victor Stinnereec93312016-08-18 18:13:10 +02005234 if (type == Py_None || type == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005235 _PyErr_SetString(tstate, PyExc_RuntimeError,
5236 "No active exception to reraise");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04005237 return 0;
5238 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005239 Py_XINCREF(type);
5240 Py_XINCREF(value);
5241 Py_XINCREF(tb);
Victor Stinner438a12d2019-05-24 17:01:38 +02005242 _PyErr_Restore(tstate, type, value, tb);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04005243 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005244 }
Guido van Rossumac7be682001-01-17 15:42:30 +00005245
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005246 /* We support the following forms of raise:
5247 raise
Collin Winter828f04a2007-08-31 00:04:24 +00005248 raise <instance>
5249 raise <type> */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00005250
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005251 if (PyExceptionClass_Check(exc)) {
5252 type = exc;
Victor Stinnera5ed5f02016-12-06 18:45:50 +01005253 value = _PyObject_CallNoArg(exc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005254 if (value == NULL)
5255 goto raise_error;
Benjamin Peterson5afa03a2011-07-15 14:09:26 -05005256 if (!PyExceptionInstance_Check(value)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005257 _PyErr_Format(tstate, PyExc_TypeError,
5258 "calling %R should have returned an instance of "
5259 "BaseException, not %R",
5260 type, Py_TYPE(value));
5261 goto raise_error;
Benjamin Peterson5afa03a2011-07-15 14:09:26 -05005262 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005263 }
5264 else if (PyExceptionInstance_Check(exc)) {
5265 value = exc;
5266 type = PyExceptionInstance_Class(exc);
5267 Py_INCREF(type);
5268 }
5269 else {
5270 /* Not something you can raise. You get an exception
5271 anyway, just not what you specified :-) */
5272 Py_DECREF(exc);
Victor Stinner438a12d2019-05-24 17:01:38 +02005273 _PyErr_SetString(tstate, PyExc_TypeError,
5274 "exceptions must derive from BaseException");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005275 goto raise_error;
5276 }
Collin Winter828f04a2007-08-31 00:04:24 +00005277
Serhiy Storchakac0191582016-09-27 11:37:10 +03005278 assert(type != NULL);
5279 assert(value != NULL);
5280
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005281 if (cause) {
5282 PyObject *fixed_cause;
5283 if (PyExceptionClass_Check(cause)) {
Victor Stinnera5ed5f02016-12-06 18:45:50 +01005284 fixed_cause = _PyObject_CallNoArg(cause);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005285 if (fixed_cause == NULL)
5286 goto raise_error;
Benjamin Petersond5a1c442012-05-14 22:09:31 -07005287 Py_DECREF(cause);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005288 }
Benjamin Petersond5a1c442012-05-14 22:09:31 -07005289 else if (PyExceptionInstance_Check(cause)) {
5290 fixed_cause = cause;
5291 }
5292 else if (cause == Py_None) {
5293 Py_DECREF(cause);
5294 fixed_cause = NULL;
5295 }
5296 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02005297 _PyErr_SetString(tstate, PyExc_TypeError,
5298 "exception causes must derive from "
5299 "BaseException");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005300 goto raise_error;
5301 }
Benjamin Petersond5a1c442012-05-14 22:09:31 -07005302 PyException_SetCause(value, fixed_cause);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005303 }
Collin Winter828f04a2007-08-31 00:04:24 +00005304
Victor Stinner438a12d2019-05-24 17:01:38 +02005305 _PyErr_SetObject(tstate, type, value);
Victor Stinner61f4db82020-01-28 03:37:45 +01005306 /* _PyErr_SetObject incref's its arguments */
Serhiy Storchakac0191582016-09-27 11:37:10 +03005307 Py_DECREF(value);
5308 Py_DECREF(type);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04005309 return 0;
Collin Winter828f04a2007-08-31 00:04:24 +00005310
5311raise_error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005312 Py_XDECREF(value);
5313 Py_XDECREF(type);
5314 Py_XDECREF(cause);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04005315 return 0;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00005316}
5317
Tim Petersd6d010b2001-06-21 02:49:55 +00005318/* Iterate v argcnt times and store the results on the stack (via decreasing
Guido van Rossum0368b722007-05-11 16:50:42 +00005319 sp). Return 1 for success, 0 if error.
Antoine Pitrou9a2310d2008-07-25 22:39:39 +00005320
Guido van Rossum0368b722007-05-11 16:50:42 +00005321 If argcntafter == -1, do a simple unpack. If it is >= 0, do an unpack
5322 with a variable target.
5323*/
Tim Petersd6d010b2001-06-21 02:49:55 +00005324
Barry Warsawe42b18f1997-08-25 22:13:04 +00005325static int
Victor Stinner438a12d2019-05-24 17:01:38 +02005326unpack_iterable(PyThreadState *tstate, PyObject *v,
5327 int argcnt, int argcntafter, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00005328{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005329 int i = 0, j = 0;
5330 Py_ssize_t ll = 0;
5331 PyObject *it; /* iter(v) */
5332 PyObject *w;
5333 PyObject *l = NULL; /* variable list */
Guido van Rossumac7be682001-01-17 15:42:30 +00005334
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005335 assert(v != NULL);
Tim Petersd6d010b2001-06-21 02:49:55 +00005336
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005337 it = PyObject_GetIter(v);
Serhiy Storchaka13a6c092017-12-26 12:30:41 +02005338 if (it == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005339 if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError) &&
Victor Stinnera102ed72020-02-07 02:24:48 +01005340 Py_TYPE(v)->tp_iter == NULL && !PySequence_Check(v))
Serhiy Storchaka13a6c092017-12-26 12:30:41 +02005341 {
Victor Stinner438a12d2019-05-24 17:01:38 +02005342 _PyErr_Format(tstate, PyExc_TypeError,
5343 "cannot unpack non-iterable %.200s object",
Victor Stinnera102ed72020-02-07 02:24:48 +01005344 Py_TYPE(v)->tp_name);
Serhiy Storchaka13a6c092017-12-26 12:30:41 +02005345 }
5346 return 0;
5347 }
Tim Petersd6d010b2001-06-21 02:49:55 +00005348
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005349 for (; i < argcnt; i++) {
5350 w = PyIter_Next(it);
5351 if (w == NULL) {
5352 /* Iterator done, via error or exhaustion. */
Victor Stinner438a12d2019-05-24 17:01:38 +02005353 if (!_PyErr_Occurred(tstate)) {
R David Murray4171bbe2015-04-15 17:08:45 -04005354 if (argcntafter == -1) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005355 _PyErr_Format(tstate, PyExc_ValueError,
5356 "not enough values to unpack "
5357 "(expected %d, got %d)",
5358 argcnt, i);
R David Murray4171bbe2015-04-15 17:08:45 -04005359 }
5360 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02005361 _PyErr_Format(tstate, PyExc_ValueError,
5362 "not enough values to unpack "
5363 "(expected at least %d, got %d)",
5364 argcnt + argcntafter, i);
R David Murray4171bbe2015-04-15 17:08:45 -04005365 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005366 }
5367 goto Error;
5368 }
5369 *--sp = w;
5370 }
Tim Petersd6d010b2001-06-21 02:49:55 +00005371
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005372 if (argcntafter == -1) {
5373 /* We better have exhausted the iterator now. */
5374 w = PyIter_Next(it);
5375 if (w == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005376 if (_PyErr_Occurred(tstate))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005377 goto Error;
5378 Py_DECREF(it);
5379 return 1;
5380 }
5381 Py_DECREF(w);
Victor Stinner438a12d2019-05-24 17:01:38 +02005382 _PyErr_Format(tstate, PyExc_ValueError,
5383 "too many values to unpack (expected %d)",
5384 argcnt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005385 goto Error;
5386 }
Guido van Rossum0368b722007-05-11 16:50:42 +00005387
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005388 l = PySequence_List(it);
5389 if (l == NULL)
5390 goto Error;
5391 *--sp = l;
5392 i++;
Guido van Rossum0368b722007-05-11 16:50:42 +00005393
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005394 ll = PyList_GET_SIZE(l);
5395 if (ll < argcntafter) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005396 _PyErr_Format(tstate, PyExc_ValueError,
R David Murray4171bbe2015-04-15 17:08:45 -04005397 "not enough values to unpack (expected at least %d, got %zd)",
5398 argcnt + argcntafter, argcnt + ll);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005399 goto Error;
5400 }
Guido van Rossum0368b722007-05-11 16:50:42 +00005401
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005402 /* Pop the "after-variable" args off the list. */
5403 for (j = argcntafter; j > 0; j--, i++) {
5404 *--sp = PyList_GET_ITEM(l, ll - j);
5405 }
5406 /* Resize the list. */
Victor Stinner60ac6ed2020-02-07 23:18:08 +01005407 Py_SET_SIZE(l, ll - argcntafter);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005408 Py_DECREF(it);
5409 return 1;
Guido van Rossum0368b722007-05-11 16:50:42 +00005410
Tim Petersd6d010b2001-06-21 02:49:55 +00005411Error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005412 for (; i > 0; i--, sp++)
5413 Py_DECREF(*sp);
5414 Py_XDECREF(it);
5415 return 0;
Barry Warsawe42b18f1997-08-25 22:13:04 +00005416}
5417
5418
Guido van Rossum96a42c81992-01-12 02:29:51 +00005419#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00005420static int
Victor Stinner438a12d2019-05-24 17:01:38 +02005421prtrace(PyThreadState *tstate, PyObject *v, const char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005422{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005423 printf("%s ", str);
Victor Stinner438a12d2019-05-24 17:01:38 +02005424 if (PyObject_Print(v, stdout, 0) != 0) {
5425 /* Don't know what else to do */
5426 _PyErr_Clear(tstate);
5427 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005428 printf("\n");
5429 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005430}
Guido van Rossum3f5da241990-12-20 15:06:42 +00005431#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005432
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00005433static void
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005434call_exc_trace(Py_tracefunc func, PyObject *self,
Mark Shannon86433452021-01-07 16:49:02 +00005435 PyThreadState *tstate,
5436 PyFrameObject *f,
Mark Shannon8e1b4062021-03-05 14:45:50 +00005437 PyTraceInfo *trace_info)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00005438{
Victor Stinneraaa8ed82013-07-10 13:57:55 +02005439 PyObject *type, *value, *traceback, *orig_traceback, *arg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005440 int err;
Victor Stinner438a12d2019-05-24 17:01:38 +02005441 _PyErr_Fetch(tstate, &type, &value, &orig_traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005442 if (value == NULL) {
5443 value = Py_None;
5444 Py_INCREF(value);
5445 }
Victor Stinner438a12d2019-05-24 17:01:38 +02005446 _PyErr_NormalizeException(tstate, &type, &value, &orig_traceback);
Antoine Pitrou89335212013-11-23 14:05:23 +01005447 traceback = (orig_traceback != NULL) ? orig_traceback : Py_None;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005448 arg = PyTuple_Pack(3, type, value, traceback);
5449 if (arg == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005450 _PyErr_Restore(tstate, type, value, orig_traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005451 return;
5452 }
Mark Shannon8e1b4062021-03-05 14:45:50 +00005453 err = call_trace(func, self, tstate, f, trace_info, PyTrace_EXCEPTION, arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005454 Py_DECREF(arg);
Victor Stinner438a12d2019-05-24 17:01:38 +02005455 if (err == 0) {
5456 _PyErr_Restore(tstate, type, value, orig_traceback);
5457 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005458 else {
5459 Py_XDECREF(type);
5460 Py_XDECREF(value);
Victor Stinneraaa8ed82013-07-10 13:57:55 +02005461 Py_XDECREF(orig_traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005462 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00005463}
5464
Amaury Forgeot d'Arcf05149a2007-11-13 01:05:30 +00005465static int
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005466call_trace_protected(Py_tracefunc func, PyObject *obj,
5467 PyThreadState *tstate, PyFrameObject *frame,
Mark Shannon8e1b4062021-03-05 14:45:50 +00005468 PyTraceInfo *trace_info,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005469 int what, PyObject *arg)
Fred Drake4ec5d562001-10-04 19:26:43 +00005470{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005471 PyObject *type, *value, *traceback;
5472 int err;
Victor Stinner438a12d2019-05-24 17:01:38 +02005473 _PyErr_Fetch(tstate, &type, &value, &traceback);
Mark Shannon8e1b4062021-03-05 14:45:50 +00005474 err = call_trace(func, obj, tstate, frame, trace_info, what, arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005475 if (err == 0)
5476 {
Victor Stinner438a12d2019-05-24 17:01:38 +02005477 _PyErr_Restore(tstate, type, value, traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005478 return 0;
5479 }
5480 else {
5481 Py_XDECREF(type);
5482 Py_XDECREF(value);
5483 Py_XDECREF(traceback);
5484 return -1;
5485 }
Fred Drake4ec5d562001-10-04 19:26:43 +00005486}
5487
Mark Shannon8e1b4062021-03-05 14:45:50 +00005488static void
5489initialize_trace_info(PyTraceInfo *trace_info, PyFrameObject *frame)
5490{
5491 if (trace_info->code != frame->f_code) {
5492 trace_info->code = frame->f_code;
5493 trace_info->instr_prev = -1;
5494 _PyCode_InitAddressRange(frame->f_code, &trace_info->bounds);
5495 }
5496}
5497
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00005498static int
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005499call_trace(Py_tracefunc func, PyObject *obj,
5500 PyThreadState *tstate, PyFrameObject *frame,
Mark Shannon8e1b4062021-03-05 14:45:50 +00005501 PyTraceInfo *trace_info,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005502 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00005503{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005504 int result;
5505 if (tstate->tracing)
5506 return 0;
5507 tstate->tracing++;
5508 tstate->use_tracing = 0;
Mark Shannon86433452021-01-07 16:49:02 +00005509 if (frame->f_lasti < 0) {
5510 frame->f_lineno = frame->f_code->co_firstlineno;
5511 }
5512 else {
Mark Shannon8e1b4062021-03-05 14:45:50 +00005513 initialize_trace_info(trace_info, frame);
5514 frame->f_lineno = _PyCode_CheckLineNumber(frame->f_lasti, &trace_info->bounds);
Mark Shannon86433452021-01-07 16:49:02 +00005515 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005516 result = func(obj, frame, what, arg);
Mark Shannon86433452021-01-07 16:49:02 +00005517 frame->f_lineno = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005518 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
5519 || (tstate->c_profilefunc != NULL));
5520 tstate->tracing--;
5521 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00005522}
5523
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00005524PyObject *
5525_PyEval_CallTracing(PyObject *func, PyObject *args)
5526{
Victor Stinner50b48572018-11-01 01:51:40 +01005527 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005528 int save_tracing = tstate->tracing;
5529 int save_use_tracing = tstate->use_tracing;
5530 PyObject *result;
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00005531
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005532 tstate->tracing = 0;
5533 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
5534 || (tstate->c_profilefunc != NULL));
5535 result = PyObject_Call(func, args, NULL);
5536 tstate->tracing = save_tracing;
5537 tstate->use_tracing = save_use_tracing;
5538 return result;
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00005539}
5540
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00005541/* See Objects/lnotab_notes.txt for a description of how tracing works. */
Michael W. Hudson006c7522002-11-08 13:08:46 +00005542static int
Tim Peters8a5c3c72004-04-05 19:36:21 +00005543maybe_call_line_trace(Py_tracefunc func, PyObject *obj,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005544 PyThreadState *tstate, PyFrameObject *frame,
Mark Shannon8e1b4062021-03-05 14:45:50 +00005545 PyTraceInfo *trace_info)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00005546{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005547 int result = 0;
Michael W. Hudson006c7522002-11-08 13:08:46 +00005548
Nick Coghlan5a851672017-09-08 10:14:16 +10005549 /* If the last instruction falls at the start of a line or if it
5550 represents a jump backwards, update the frame's line number and
5551 then call the trace function if we're tracing source lines.
5552 */
Mark Shannon8e1b4062021-03-05 14:45:50 +00005553 initialize_trace_info(trace_info, frame);
5554 int lastline = trace_info->bounds.ar_line;
5555 int line = _PyCode_CheckLineNumber(frame->f_lasti, &trace_info->bounds);
Mark Shannonee9f98d2021-01-05 12:04:10 +00005556 if (line != -1 && frame->f_trace_lines) {
5557 /* Trace backward edges or first instruction of a new line */
Mark Shannon8e1b4062021-03-05 14:45:50 +00005558 if (frame->f_lasti < trace_info->instr_prev ||
5559 (line != lastline && frame->f_lasti == trace_info->bounds.ar_start))
Mark Shannonee9f98d2021-01-05 12:04:10 +00005560 {
Mark Shannon8e1b4062021-03-05 14:45:50 +00005561 result = call_trace(func, obj, tstate, frame, trace_info, PyTrace_LINE, Py_None);
Nick Coghlan5a851672017-09-08 10:14:16 +10005562 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005563 }
George King20faa682017-10-18 17:44:22 -07005564 /* Always emit an opcode event if we're tracing all opcodes. */
5565 if (frame->f_trace_opcodes) {
Mark Shannon8e1b4062021-03-05 14:45:50 +00005566 result = call_trace(func, obj, tstate, frame, trace_info, PyTrace_OPCODE, Py_None);
George King20faa682017-10-18 17:44:22 -07005567 }
Mark Shannon8e1b4062021-03-05 14:45:50 +00005568 trace_info->instr_prev = frame->f_lasti;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005569 return result;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00005570}
5571
Victor Stinner309d7cc2020-03-13 16:39:12 +01005572int
5573_PyEval_SetProfile(PyThreadState *tstate, Py_tracefunc func, PyObject *arg)
5574{
Victor Stinnerda2914d2020-03-20 09:29:08 +01005575 assert(is_tstate_valid(tstate));
Victor Stinner309d7cc2020-03-13 16:39:12 +01005576 /* The caller must hold the GIL */
5577 assert(PyGILState_Check());
5578
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005579 /* Call _PySys_Audit() in the context of the current thread state,
Victor Stinner309d7cc2020-03-13 16:39:12 +01005580 even if tstate is not the current thread state. */
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005581 PyThreadState *current_tstate = _PyThreadState_GET();
5582 if (_PySys_Audit(current_tstate, "sys.setprofile", NULL) < 0) {
Victor Stinner309d7cc2020-03-13 16:39:12 +01005583 return -1;
5584 }
5585
5586 PyObject *profileobj = tstate->c_profileobj;
5587
5588 tstate->c_profilefunc = NULL;
5589 tstate->c_profileobj = NULL;
5590 /* Must make sure that tracing is not ignored if 'profileobj' is freed */
5591 tstate->use_tracing = tstate->c_tracefunc != NULL;
5592 Py_XDECREF(profileobj);
5593
5594 Py_XINCREF(arg);
5595 tstate->c_profileobj = arg;
5596 tstate->c_profilefunc = func;
5597
5598 /* Flag that tracing or profiling is turned on */
5599 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
5600 return 0;
5601}
5602
Fred Drake5755ce62001-06-27 19:19:46 +00005603void
5604PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00005605{
Victor Stinner309d7cc2020-03-13 16:39:12 +01005606 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerf6a58502020-03-16 17:41:44 +01005607 if (_PyEval_SetProfile(tstate, func, arg) < 0) {
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005608 /* Log _PySys_Audit() error */
Victor Stinnerf6a58502020-03-16 17:41:44 +01005609 _PyErr_WriteUnraisableMsg("in PyEval_SetProfile", NULL);
5610 }
Victor Stinner309d7cc2020-03-13 16:39:12 +01005611}
5612
5613int
5614_PyEval_SetTrace(PyThreadState *tstate, Py_tracefunc func, PyObject *arg)
5615{
Victor Stinnerda2914d2020-03-20 09:29:08 +01005616 assert(is_tstate_valid(tstate));
Victor Stinner309d7cc2020-03-13 16:39:12 +01005617 /* The caller must hold the GIL */
5618 assert(PyGILState_Check());
5619
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005620 /* Call _PySys_Audit() in the context of the current thread state,
Victor Stinner309d7cc2020-03-13 16:39:12 +01005621 even if tstate is not the current thread state. */
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005622 PyThreadState *current_tstate = _PyThreadState_GET();
5623 if (_PySys_Audit(current_tstate, "sys.settrace", NULL) < 0) {
Victor Stinner309d7cc2020-03-13 16:39:12 +01005624 return -1;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005625 }
5626
Victor Stinnerda2914d2020-03-20 09:29:08 +01005627 struct _ceval_state *ceval2 = &tstate->interp->ceval;
Victor Stinner309d7cc2020-03-13 16:39:12 +01005628 PyObject *traceobj = tstate->c_traceobj;
Victor Stinnerda2914d2020-03-20 09:29:08 +01005629 ceval2->tracing_possible += (func != NULL) - (tstate->c_tracefunc != NULL);
Victor Stinner309d7cc2020-03-13 16:39:12 +01005630
5631 tstate->c_tracefunc = NULL;
5632 tstate->c_traceobj = NULL;
5633 /* Must make sure that profiling is not ignored if 'traceobj' is freed */
5634 tstate->use_tracing = (tstate->c_profilefunc != NULL);
5635 Py_XDECREF(traceobj);
5636
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005637 Py_XINCREF(arg);
Victor Stinner309d7cc2020-03-13 16:39:12 +01005638 tstate->c_traceobj = arg;
5639 tstate->c_tracefunc = func;
5640
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005641 /* Flag that tracing or profiling is turned on */
Victor Stinner309d7cc2020-03-13 16:39:12 +01005642 tstate->use_tracing = ((func != NULL)
5643 || (tstate->c_profilefunc != NULL));
5644
5645 return 0;
Fred Drake5755ce62001-06-27 19:19:46 +00005646}
5647
5648void
5649PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
5650{
Victor Stinner309d7cc2020-03-13 16:39:12 +01005651 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerf6a58502020-03-16 17:41:44 +01005652 if (_PyEval_SetTrace(tstate, func, arg) < 0) {
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005653 /* Log _PySys_Audit() error */
Victor Stinnerf6a58502020-03-16 17:41:44 +01005654 _PyErr_WriteUnraisableMsg("in PyEval_SetTrace", NULL);
5655 }
Fred Draked0838392001-06-16 21:02:31 +00005656}
5657
Victor Stinner309d7cc2020-03-13 16:39:12 +01005658
Yury Selivanov75445082015-05-11 22:57:16 -04005659void
Victor Stinner838f2642019-06-13 22:41:23 +02005660_PyEval_SetCoroutineOriginTrackingDepth(PyThreadState *tstate, int new_depth)
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08005661{
5662 assert(new_depth >= 0);
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08005663 tstate->coroutine_origin_tracking_depth = new_depth;
5664}
5665
5666int
5667_PyEval_GetCoroutineOriginTrackingDepth(void)
5668{
Victor Stinner50b48572018-11-01 01:51:40 +01005669 PyThreadState *tstate = _PyThreadState_GET();
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08005670 return tstate->coroutine_origin_tracking_depth;
5671}
5672
Zackery Spytz79ceccd2020-03-26 06:11:13 -06005673int
Yury Selivanoveb636452016-09-08 22:01:51 -07005674_PyEval_SetAsyncGenFirstiter(PyObject *firstiter)
5675{
Victor Stinner50b48572018-11-01 01:51:40 +01005676 PyThreadState *tstate = _PyThreadState_GET();
Steve Dowerb82e17e2019-05-23 08:45:22 -07005677
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005678 if (_PySys_Audit(tstate, "sys.set_asyncgen_hook_firstiter", NULL) < 0) {
Zackery Spytz79ceccd2020-03-26 06:11:13 -06005679 return -1;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005680 }
5681
Yury Selivanoveb636452016-09-08 22:01:51 -07005682 Py_XINCREF(firstiter);
5683 Py_XSETREF(tstate->async_gen_firstiter, firstiter);
Zackery Spytz79ceccd2020-03-26 06:11:13 -06005684 return 0;
Yury Selivanoveb636452016-09-08 22:01:51 -07005685}
5686
5687PyObject *
5688_PyEval_GetAsyncGenFirstiter(void)
5689{
Victor Stinner50b48572018-11-01 01:51:40 +01005690 PyThreadState *tstate = _PyThreadState_GET();
Yury Selivanoveb636452016-09-08 22:01:51 -07005691 return tstate->async_gen_firstiter;
5692}
5693
Zackery Spytz79ceccd2020-03-26 06:11:13 -06005694int
Yury Selivanoveb636452016-09-08 22:01:51 -07005695_PyEval_SetAsyncGenFinalizer(PyObject *finalizer)
5696{
Victor Stinner50b48572018-11-01 01:51:40 +01005697 PyThreadState *tstate = _PyThreadState_GET();
Steve Dowerb82e17e2019-05-23 08:45:22 -07005698
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005699 if (_PySys_Audit(tstate, "sys.set_asyncgen_hook_finalizer", NULL) < 0) {
Zackery Spytz79ceccd2020-03-26 06:11:13 -06005700 return -1;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005701 }
5702
Yury Selivanoveb636452016-09-08 22:01:51 -07005703 Py_XINCREF(finalizer);
5704 Py_XSETREF(tstate->async_gen_finalizer, finalizer);
Zackery Spytz79ceccd2020-03-26 06:11:13 -06005705 return 0;
Yury Selivanoveb636452016-09-08 22:01:51 -07005706}
5707
5708PyObject *
5709_PyEval_GetAsyncGenFinalizer(void)
5710{
Victor Stinner50b48572018-11-01 01:51:40 +01005711 PyThreadState *tstate = _PyThreadState_GET();
Yury Selivanoveb636452016-09-08 22:01:51 -07005712 return tstate->async_gen_finalizer;
5713}
5714
Victor Stinner438a12d2019-05-24 17:01:38 +02005715PyFrameObject *
5716PyEval_GetFrame(void)
5717{
5718 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner6723e932020-03-20 17:46:56 +01005719 return tstate->frame;
Victor Stinner438a12d2019-05-24 17:01:38 +02005720}
5721
Guido van Rossumb209a111997-04-29 18:18:01 +00005722PyObject *
Victor Stinner46496f92021-02-20 15:17:18 +01005723_PyEval_GetBuiltins(PyThreadState *tstate)
5724{
5725 PyFrameObject *frame = tstate->frame;
5726 if (frame != NULL) {
5727 return frame->f_builtins;
5728 }
5729 return tstate->interp->builtins;
5730}
5731
5732PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005733PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00005734{
Victor Stinner438a12d2019-05-24 17:01:38 +02005735 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner46496f92021-02-20 15:17:18 +01005736 return _PyEval_GetBuiltins(tstate);
Guido van Rossum6135a871995-01-09 17:53:26 +00005737}
5738
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02005739/* Convenience function to get a builtin from its name */
5740PyObject *
5741_PyEval_GetBuiltinId(_Py_Identifier *name)
5742{
Victor Stinner438a12d2019-05-24 17:01:38 +02005743 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02005744 PyObject *attr = _PyDict_GetItemIdWithError(PyEval_GetBuiltins(), name);
5745 if (attr) {
5746 Py_INCREF(attr);
5747 }
Victor Stinner438a12d2019-05-24 17:01:38 +02005748 else if (!_PyErr_Occurred(tstate)) {
5749 _PyErr_SetObject(tstate, PyExc_AttributeError, _PyUnicode_FromId(name));
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02005750 }
5751 return attr;
5752}
5753
Guido van Rossumb209a111997-04-29 18:18:01 +00005754PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005755PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00005756{
Victor Stinner438a12d2019-05-24 17:01:38 +02005757 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner6723e932020-03-20 17:46:56 +01005758 PyFrameObject *current_frame = tstate->frame;
Victor Stinner41bb43a2013-10-29 01:19:37 +01005759 if (current_frame == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005760 _PyErr_SetString(tstate, PyExc_SystemError, "frame does not exist");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005761 return NULL;
Victor Stinner41bb43a2013-10-29 01:19:37 +01005762 }
5763
Victor Stinner438a12d2019-05-24 17:01:38 +02005764 if (PyFrame_FastToLocalsWithError(current_frame) < 0) {
Victor Stinner41bb43a2013-10-29 01:19:37 +01005765 return NULL;
Victor Stinner438a12d2019-05-24 17:01:38 +02005766 }
Victor Stinner41bb43a2013-10-29 01:19:37 +01005767
5768 assert(current_frame->f_locals != NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005769 return current_frame->f_locals;
Guido van Rossum5b722181993-03-30 17:46:03 +00005770}
5771
Guido van Rossumb209a111997-04-29 18:18:01 +00005772PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005773PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00005774{
Victor Stinner438a12d2019-05-24 17:01:38 +02005775 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner6723e932020-03-20 17:46:56 +01005776 PyFrameObject *current_frame = tstate->frame;
Victor Stinner438a12d2019-05-24 17:01:38 +02005777 if (current_frame == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005778 return NULL;
Victor Stinner438a12d2019-05-24 17:01:38 +02005779 }
Victor Stinner41bb43a2013-10-29 01:19:37 +01005780
5781 assert(current_frame->f_globals != NULL);
5782 return current_frame->f_globals;
Guido van Rossum3f5da241990-12-20 15:06:42 +00005783}
5784
Guido van Rossum6135a871995-01-09 17:53:26 +00005785int
Tim Peters5ba58662001-07-16 02:29:45 +00005786PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
Jeremy Hylton061d1062001-03-22 02:32:48 +00005787{
Victor Stinner438a12d2019-05-24 17:01:38 +02005788 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner6723e932020-03-20 17:46:56 +01005789 PyFrameObject *current_frame = tstate->frame;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005790 int result = cf->cf_flags != 0;
Tim Peters5ba58662001-07-16 02:29:45 +00005791
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005792 if (current_frame != NULL) {
5793 const int codeflags = current_frame->f_code->co_flags;
5794 const int compilerflags = codeflags & PyCF_MASK;
5795 if (compilerflags) {
5796 result = 1;
5797 cf->cf_flags |= compilerflags;
5798 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00005799#if 0 /* future keyword */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005800 if (codeflags & CO_GENERATOR_ALLOWED) {
5801 result = 1;
5802 cf->cf_flags |= CO_GENERATOR_ALLOWED;
5803 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00005804#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005805 }
5806 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00005807}
5808
Guido van Rossum3f5da241990-12-20 15:06:42 +00005809
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00005810const char *
Tim Peters6d6c1a32001-08-02 04:15:00 +00005811PyEval_GetFuncName(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00005812{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005813 if (PyMethod_Check(func))
5814 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
5815 else if (PyFunction_Check(func))
Serhiy Storchaka06515832016-11-20 09:13:07 +02005816 return PyUnicode_AsUTF8(((PyFunctionObject*)func)->func_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005817 else if (PyCFunction_Check(func))
5818 return ((PyCFunctionObject*)func)->m_ml->ml_name;
5819 else
Victor Stinnera102ed72020-02-07 02:24:48 +01005820 return Py_TYPE(func)->tp_name;
Jeremy Hylton512a2372001-04-11 13:52:29 +00005821}
5822
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00005823const char *
Tim Peters6d6c1a32001-08-02 04:15:00 +00005824PyEval_GetFuncDesc(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00005825{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005826 if (PyMethod_Check(func))
5827 return "()";
5828 else if (PyFunction_Check(func))
5829 return "()";
5830 else if (PyCFunction_Check(func))
5831 return "()";
5832 else
5833 return " object";
Jeremy Hylton512a2372001-04-11 13:52:29 +00005834}
5835
Armin Rigo1c2d7e52005-09-20 18:34:01 +00005836#define C_TRACE(x, call) \
Nicholas Bastind858a772004-06-25 23:31:06 +00005837if (tstate->use_tracing && tstate->c_profilefunc) { \
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005838 if (call_trace(tstate->c_profilefunc, tstate->c_profileobj, \
Mark Shannon8e1b4062021-03-05 14:45:50 +00005839 tstate, tstate->frame, trace_info, \
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005840 PyTrace_C_CALL, func)) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005841 x = NULL; \
5842 } \
5843 else { \
5844 x = call; \
5845 if (tstate->c_profilefunc != NULL) { \
5846 if (x == NULL) { \
5847 call_trace_protected(tstate->c_profilefunc, \
5848 tstate->c_profileobj, \
Mark Shannon8e1b4062021-03-05 14:45:50 +00005849 tstate, tstate->frame, trace_info, \
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005850 PyTrace_C_EXCEPTION, func); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005851 /* XXX should pass (type, value, tb) */ \
5852 } else { \
5853 if (call_trace(tstate->c_profilefunc, \
5854 tstate->c_profileobj, \
Mark Shannon8e1b4062021-03-05 14:45:50 +00005855 tstate, tstate->frame, trace_info, \
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005856 PyTrace_C_RETURN, func)) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005857 Py_DECREF(x); \
5858 x = NULL; \
5859 } \
5860 } \
5861 } \
5862 } \
Nicholas Bastind858a772004-06-25 23:31:06 +00005863} else { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005864 x = call; \
5865 }
Nicholas Bastinc69ebe82004-03-24 21:57:10 +00005866
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005867
5868static PyObject *
5869trace_call_function(PyThreadState *tstate,
Mark Shannon8e1b4062021-03-05 14:45:50 +00005870 PyTraceInfo *trace_info,
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005871 PyObject *func,
5872 PyObject **args, Py_ssize_t nargs,
5873 PyObject *kwnames)
5874{
5875 PyObject *x;
scoder4c9ea092020-05-12 16:12:41 +02005876 if (PyCFunction_CheckExact(func) || PyCMethod_CheckExact(func)) {
Petr Viktorinffd97532020-02-11 17:46:57 +01005877 C_TRACE(x, PyObject_Vectorcall(func, args, nargs, kwnames));
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005878 return x;
5879 }
Andy Lesterdffe4c02020-03-04 07:15:20 -06005880 else if (Py_IS_TYPE(func, &PyMethodDescr_Type) && nargs > 0) {
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005881 /* We need to create a temporary bound method as argument
5882 for profiling.
5883
5884 If nargs == 0, then this cannot work because we have no
5885 "self". In any case, the call itself would raise
5886 TypeError (foo needs an argument), so we just skip
5887 profiling. */
5888 PyObject *self = args[0];
5889 func = Py_TYPE(func)->tp_descr_get(func, self, (PyObject*)Py_TYPE(self));
5890 if (func == NULL) {
5891 return NULL;
5892 }
Petr Viktorinffd97532020-02-11 17:46:57 +01005893 C_TRACE(x, PyObject_Vectorcall(func,
Jeroen Demeyer0d722f32019-07-05 14:48:24 +02005894 args+1, nargs-1,
5895 kwnames));
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005896 Py_DECREF(func);
5897 return x;
5898 }
Petr Viktorinffd97532020-02-11 17:46:57 +01005899 return PyObject_Vectorcall(func, args, nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames);
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005900}
5901
Victor Stinner415c5102017-01-11 00:54:57 +01005902/* Issue #29227: Inline call_function() into _PyEval_EvalFrameDefault()
5903 to reduce the stack consumption. */
5904Py_LOCAL_INLINE(PyObject *) _Py_HOT_FUNCTION
Mark Shannon86433452021-01-07 16:49:02 +00005905call_function(PyThreadState *tstate,
Mark Shannon8e1b4062021-03-05 14:45:50 +00005906 PyTraceInfo *trace_info,
Mark Shannon86433452021-01-07 16:49:02 +00005907 PyObject ***pp_stack,
5908 Py_ssize_t oparg,
5909 PyObject *kwnames)
Jeremy Hyltone8c04322002-08-16 17:47:26 +00005910{
Victor Stinnerf9b760f2016-09-09 10:17:08 -07005911 PyObject **pfunc = (*pp_stack) - oparg - 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005912 PyObject *func = *pfunc;
5913 PyObject *x, *w;
Victor Stinnerd8735722016-09-09 12:36:44 -07005914 Py_ssize_t nkwargs = (kwnames == NULL) ? 0 : PyTuple_GET_SIZE(kwnames);
5915 Py_ssize_t nargs = oparg - nkwargs;
INADA Naoki5566bbb2017-02-03 07:43:03 +09005916 PyObject **stack = (*pp_stack) - nargs - nkwargs;
Jeremy Hyltone8c04322002-08-16 17:47:26 +00005917
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005918 if (tstate->use_tracing) {
Mark Shannon8e1b4062021-03-05 14:45:50 +00005919 x = trace_call_function(tstate, trace_info, func, stack, nargs, kwnames);
INADA Naoki5566bbb2017-02-03 07:43:03 +09005920 }
Victor Stinner4a7cc882015-03-06 23:35:27 +01005921 else {
Petr Viktorinffd97532020-02-11 17:46:57 +01005922 x = PyObject_Vectorcall(func, stack, nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005923 }
Tim Peters8a5c3c72004-04-05 19:36:21 +00005924
Victor Stinner438a12d2019-05-24 17:01:38 +02005925 assert((x != NULL) ^ (_PyErr_Occurred(tstate) != NULL));
Victor Stinnerf9b760f2016-09-09 10:17:08 -07005926
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01005927 /* Clear the stack of the function object. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005928 while ((*pp_stack) > pfunc) {
5929 w = EXT_POP(*pp_stack);
5930 Py_DECREF(w);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005931 }
Victor Stinnerace47d72013-07-18 01:41:08 +02005932
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005933 return x;
Jeremy Hyltone8c04322002-08-16 17:47:26 +00005934}
5935
Jeremy Hylton52820442001-01-03 23:52:36 +00005936static PyObject *
Mark Shannon86433452021-01-07 16:49:02 +00005937do_call_core(PyThreadState *tstate,
Mark Shannon8e1b4062021-03-05 14:45:50 +00005938 PyTraceInfo *trace_info,
Mark Shannon86433452021-01-07 16:49:02 +00005939 PyObject *func,
5940 PyObject *callargs,
5941 PyObject *kwdict)
Jeremy Hylton52820442001-01-03 23:52:36 +00005942{
jdemeyere89de732018-09-19 12:06:20 +02005943 PyObject *result;
5944
scoder4c9ea092020-05-12 16:12:41 +02005945 if (PyCFunction_CheckExact(func) || PyCMethod_CheckExact(func)) {
Jeroen Demeyer7a6873c2019-09-11 13:01:01 +02005946 C_TRACE(result, PyObject_Call(func, callargs, kwdict));
Victor Stinnerf9b760f2016-09-09 10:17:08 -07005947 return result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005948 }
Andy Lesterdffe4c02020-03-04 07:15:20 -06005949 else if (Py_IS_TYPE(func, &PyMethodDescr_Type)) {
jdemeyere89de732018-09-19 12:06:20 +02005950 Py_ssize_t nargs = PyTuple_GET_SIZE(callargs);
5951 if (nargs > 0 && tstate->use_tracing) {
5952 /* We need to create a temporary bound method as argument
5953 for profiling.
5954
5955 If nargs == 0, then this cannot work because we have no
5956 "self". In any case, the call itself would raise
5957 TypeError (foo needs an argument), so we just skip
5958 profiling. */
5959 PyObject *self = PyTuple_GET_ITEM(callargs, 0);
5960 func = Py_TYPE(func)->tp_descr_get(func, self, (PyObject*)Py_TYPE(self));
5961 if (func == NULL) {
5962 return NULL;
5963 }
5964
Victor Stinner4d231bc2019-11-14 13:36:21 +01005965 C_TRACE(result, _PyObject_FastCallDictTstate(
5966 tstate, func,
5967 &_PyTuple_ITEMS(callargs)[1],
5968 nargs - 1,
5969 kwdict));
jdemeyere89de732018-09-19 12:06:20 +02005970 Py_DECREF(func);
5971 return result;
5972 }
Victor Stinner74319ae2016-08-25 00:04:09 +02005973 }
jdemeyere89de732018-09-19 12:06:20 +02005974 return PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00005975}
5976
Serhiy Storchaka483405b2015-02-17 10:14:30 +02005977/* Extract a slice index from a PyLong or an object with the
Guido van Rossum38fff8c2006-03-07 18:50:55 +00005978 nb_index slot defined, and store in *pi.
5979 Silently reduce values larger than PY_SSIZE_T_MAX to PY_SSIZE_T_MAX,
Xiang Zhang2ddf5a12017-05-10 18:19:41 +08005980 and silently boost values less than PY_SSIZE_T_MIN to PY_SSIZE_T_MIN.
Martin v. Löwisdde99d22006-02-17 15:57:41 +00005981 Return 0 on error, 1 on success.
Tim Peterscb479e72001-12-16 19:11:44 +00005982*/
Guido van Rossum20c6add2000-05-08 14:06:50 +00005983int
Martin v. Löwis18e16552006-02-15 17:27:45 +00005984_PyEval_SliceIndex(PyObject *v, Py_ssize_t *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005985{
Victor Stinner438a12d2019-05-24 17:01:38 +02005986 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005987 if (v != Py_None) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005988 Py_ssize_t x;
Victor Stinnera15e2602020-04-08 02:01:56 +02005989 if (_PyIndex_Check(v)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005990 x = PyNumber_AsSsize_t(v, NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02005991 if (x == -1 && _PyErr_Occurred(tstate))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005992 return 0;
5993 }
5994 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02005995 _PyErr_SetString(tstate, PyExc_TypeError,
5996 "slice indices must be integers or "
5997 "None or have an __index__ method");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005998 return 0;
5999 }
6000 *pi = x;
6001 }
6002 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00006003}
6004
Serhiy Storchaka80ec8362017-03-19 19:37:40 +02006005int
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03006006_PyEval_SliceIndexNotNone(PyObject *v, Py_ssize_t *pi)
Serhiy Storchaka80ec8362017-03-19 19:37:40 +02006007{
Victor Stinner438a12d2019-05-24 17:01:38 +02006008 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03006009 Py_ssize_t x;
Victor Stinnera15e2602020-04-08 02:01:56 +02006010 if (_PyIndex_Check(v)) {
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03006011 x = PyNumber_AsSsize_t(v, NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02006012 if (x == -1 && _PyErr_Occurred(tstate))
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03006013 return 0;
6014 }
6015 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02006016 _PyErr_SetString(tstate, PyExc_TypeError,
6017 "slice indices must be integers or "
6018 "have an __index__ method");
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03006019 return 0;
6020 }
6021 *pi = x;
6022 return 1;
Serhiy Storchaka80ec8362017-03-19 19:37:40 +02006023}
6024
Thomas Wouters52152252000-08-17 22:55:00 +00006025static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02006026import_name(PyThreadState *tstate, PyFrameObject *f,
6027 PyObject *name, PyObject *fromlist, PyObject *level)
Serhiy Storchaka133138a2016-08-02 22:51:21 +03006028{
6029 _Py_IDENTIFIER(__import__);
Victor Stinnerdf142fd2016-08-20 00:44:42 +02006030 PyObject *import_func, *res;
6031 PyObject* stack[5];
Serhiy Storchaka133138a2016-08-02 22:51:21 +03006032
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02006033 import_func = _PyDict_GetItemIdWithError(f->f_builtins, &PyId___import__);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03006034 if (import_func == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02006035 if (!_PyErr_Occurred(tstate)) {
6036 _PyErr_SetString(tstate, PyExc_ImportError, "__import__ not found");
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02006037 }
Serhiy Storchaka133138a2016-08-02 22:51:21 +03006038 return NULL;
6039 }
6040
6041 /* Fast path for not overloaded __import__. */
Victor Stinner438a12d2019-05-24 17:01:38 +02006042 if (import_func == tstate->interp->import_func) {
Serhiy Storchaka133138a2016-08-02 22:51:21 +03006043 int ilevel = _PyLong_AsInt(level);
Victor Stinner438a12d2019-05-24 17:01:38 +02006044 if (ilevel == -1 && _PyErr_Occurred(tstate)) {
Serhiy Storchaka133138a2016-08-02 22:51:21 +03006045 return NULL;
6046 }
6047 res = PyImport_ImportModuleLevelObject(
6048 name,
6049 f->f_globals,
6050 f->f_locals == NULL ? Py_None : f->f_locals,
6051 fromlist,
6052 ilevel);
6053 return res;
6054 }
6055
6056 Py_INCREF(import_func);
Victor Stinnerdf142fd2016-08-20 00:44:42 +02006057
6058 stack[0] = name;
6059 stack[1] = f->f_globals;
6060 stack[2] = f->f_locals == NULL ? Py_None : f->f_locals;
6061 stack[3] = fromlist;
6062 stack[4] = level;
Victor Stinner559bb6a2016-08-22 22:48:54 +02006063 res = _PyObject_FastCall(import_func, stack, 5);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03006064 Py_DECREF(import_func);
6065 return res;
6066}
6067
6068static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02006069import_from(PyThreadState *tstate, PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00006070{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006071 PyObject *x;
Xiang Zhang4830f582017-03-21 11:13:42 +08006072 PyObject *fullmodname, *pkgname, *pkgpath, *pkgname_or_unknown, *errmsg;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00006073
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006074 if (_PyObject_LookupAttr(v, name, &x) != 0) {
Antoine Pitrou0373a102014-10-13 20:19:45 +02006075 return x;
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006076 }
Antoine Pitrou0373a102014-10-13 20:19:45 +02006077 /* Issue #17636: in case this failed because of a circular relative
6078 import, try to fallback on reading the module directly from
6079 sys.modules. */
Antoine Pitrou0373a102014-10-13 20:19:45 +02006080 pkgname = _PyObject_GetAttrId(v, &PyId___name__);
Brett Cannon3008bc02015-08-11 18:01:31 -07006081 if (pkgname == NULL) {
6082 goto error;
6083 }
Oren Milman6db70332017-09-19 14:23:01 +03006084 if (!PyUnicode_Check(pkgname)) {
6085 Py_CLEAR(pkgname);
6086 goto error;
6087 }
Antoine Pitrou0373a102014-10-13 20:19:45 +02006088 fullmodname = PyUnicode_FromFormat("%U.%U", pkgname, name);
Brett Cannon3008bc02015-08-11 18:01:31 -07006089 if (fullmodname == NULL) {
Xiang Zhang4830f582017-03-21 11:13:42 +08006090 Py_DECREF(pkgname);
Antoine Pitrou0373a102014-10-13 20:19:45 +02006091 return NULL;
Brett Cannon3008bc02015-08-11 18:01:31 -07006092 }
Eric Snow3f9eee62017-09-15 16:35:20 -06006093 x = PyImport_GetModule(fullmodname);
Antoine Pitrou0373a102014-10-13 20:19:45 +02006094 Py_DECREF(fullmodname);
Victor Stinner438a12d2019-05-24 17:01:38 +02006095 if (x == NULL && !_PyErr_Occurred(tstate)) {
Brett Cannon3008bc02015-08-11 18:01:31 -07006096 goto error;
6097 }
Matthias Bussonnier1bc15642017-02-22 07:06:50 -08006098 Py_DECREF(pkgname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006099 return x;
Brett Cannon3008bc02015-08-11 18:01:31 -07006100 error:
Matthias Bussonnierbc4bed42017-02-14 16:05:25 -08006101 pkgpath = PyModule_GetFilenameObject(v);
Matthias Bussonnier1bc15642017-02-22 07:06:50 -08006102 if (pkgname == NULL) {
6103 pkgname_or_unknown = PyUnicode_FromString("<unknown module name>");
6104 if (pkgname_or_unknown == NULL) {
6105 Py_XDECREF(pkgpath);
6106 return NULL;
6107 }
6108 } else {
6109 pkgname_or_unknown = pkgname;
6110 }
Matthias Bussonnierbc4bed42017-02-14 16:05:25 -08006111
6112 if (pkgpath == NULL || !PyUnicode_Check(pkgpath)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02006113 _PyErr_Clear(tstate);
Xiang Zhang4830f582017-03-21 11:13:42 +08006114 errmsg = PyUnicode_FromFormat(
6115 "cannot import name %R from %R (unknown location)",
6116 name, pkgname_or_unknown
6117 );
Stefan Krah027b09c2019-03-25 21:50:58 +01006118 /* NULL checks for errmsg and pkgname done by PyErr_SetImportError. */
Xiang Zhang4830f582017-03-21 11:13:42 +08006119 PyErr_SetImportError(errmsg, pkgname, NULL);
6120 }
6121 else {
Anthony Sottile65366bc2019-09-09 08:17:50 -07006122 _Py_IDENTIFIER(__spec__);
6123 PyObject *spec = _PyObject_GetAttrId(v, &PyId___spec__);
Anthony Sottile65366bc2019-09-09 08:17:50 -07006124 const char *fmt =
6125 _PyModuleSpec_IsInitializing(spec) ?
6126 "cannot import name %R from partially initialized module %R "
6127 "(most likely due to a circular import) (%S)" :
6128 "cannot import name %R from %R (%S)";
6129 Py_XDECREF(spec);
6130
6131 errmsg = PyUnicode_FromFormat(fmt, name, pkgname_or_unknown, pkgpath);
Stefan Krah027b09c2019-03-25 21:50:58 +01006132 /* NULL checks for errmsg and pkgname done by PyErr_SetImportError. */
Xiang Zhang4830f582017-03-21 11:13:42 +08006133 PyErr_SetImportError(errmsg, pkgname, pkgpath);
Matthias Bussonnierbc4bed42017-02-14 16:05:25 -08006134 }
6135
Xiang Zhang4830f582017-03-21 11:13:42 +08006136 Py_XDECREF(errmsg);
Matthias Bussonnier1bc15642017-02-22 07:06:50 -08006137 Py_XDECREF(pkgname_or_unknown);
6138 Py_XDECREF(pkgpath);
Brett Cannon3008bc02015-08-11 18:01:31 -07006139 return NULL;
Thomas Wouters52152252000-08-17 22:55:00 +00006140}
Guido van Rossumac7be682001-01-17 15:42:30 +00006141
Thomas Wouters52152252000-08-17 22:55:00 +00006142static int
Victor Stinner438a12d2019-05-24 17:01:38 +02006143import_all_from(PyThreadState *tstate, PyObject *locals, PyObject *v)
Thomas Wouters52152252000-08-17 22:55:00 +00006144{
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02006145 _Py_IDENTIFIER(__all__);
6146 _Py_IDENTIFIER(__dict__);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006147 PyObject *all, *dict, *name, *value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006148 int skip_leading_underscores = 0;
6149 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00006150
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006151 if (_PyObject_LookupAttrId(v, &PyId___all__, &all) < 0) {
6152 return -1; /* Unexpected error */
6153 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006154 if (all == NULL) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006155 if (_PyObject_LookupAttrId(v, &PyId___dict__, &dict) < 0) {
6156 return -1;
6157 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006158 if (dict == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02006159 _PyErr_SetString(tstate, PyExc_ImportError,
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006160 "from-import-* object has no __dict__ and no __all__");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006161 return -1;
6162 }
6163 all = PyMapping_Keys(dict);
6164 Py_DECREF(dict);
6165 if (all == NULL)
6166 return -1;
6167 skip_leading_underscores = 1;
6168 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00006169
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006170 for (pos = 0, err = 0; ; pos++) {
6171 name = PySequence_GetItem(all, pos);
6172 if (name == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02006173 if (!_PyErr_ExceptionMatches(tstate, PyExc_IndexError)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006174 err = -1;
Victor Stinner438a12d2019-05-24 17:01:38 +02006175 }
6176 else {
6177 _PyErr_Clear(tstate);
6178 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006179 break;
6180 }
Xiang Zhangd8b291a2018-03-24 18:39:36 +08006181 if (!PyUnicode_Check(name)) {
6182 PyObject *modname = _PyObject_GetAttrId(v, &PyId___name__);
6183 if (modname == NULL) {
6184 Py_DECREF(name);
6185 err = -1;
6186 break;
6187 }
6188 if (!PyUnicode_Check(modname)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02006189 _PyErr_Format(tstate, PyExc_TypeError,
6190 "module __name__ must be a string, not %.100s",
6191 Py_TYPE(modname)->tp_name);
Xiang Zhangd8b291a2018-03-24 18:39:36 +08006192 }
6193 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02006194 _PyErr_Format(tstate, PyExc_TypeError,
6195 "%s in %U.%s must be str, not %.100s",
6196 skip_leading_underscores ? "Key" : "Item",
6197 modname,
6198 skip_leading_underscores ? "__dict__" : "__all__",
6199 Py_TYPE(name)->tp_name);
Xiang Zhangd8b291a2018-03-24 18:39:36 +08006200 }
6201 Py_DECREF(modname);
6202 Py_DECREF(name);
6203 err = -1;
6204 break;
6205 }
6206 if (skip_leading_underscores) {
Serhiy Storchakae3b2b4b2017-09-08 09:58:51 +03006207 if (PyUnicode_READY(name) == -1) {
6208 Py_DECREF(name);
6209 err = -1;
6210 break;
6211 }
6212 if (PyUnicode_READ_CHAR(name, 0) == '_') {
6213 Py_DECREF(name);
6214 continue;
6215 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006216 }
6217 value = PyObject_GetAttr(v, name);
6218 if (value == NULL)
6219 err = -1;
6220 else if (PyDict_CheckExact(locals))
6221 err = PyDict_SetItem(locals, name, value);
6222 else
6223 err = PyObject_SetItem(locals, name, value);
6224 Py_DECREF(name);
6225 Py_XDECREF(value);
6226 if (err != 0)
6227 break;
6228 }
6229 Py_DECREF(all);
6230 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00006231}
6232
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03006233static int
Victor Stinner438a12d2019-05-24 17:01:38 +02006234check_args_iterable(PyThreadState *tstate, PyObject *func, PyObject *args)
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03006235{
Victor Stinnera102ed72020-02-07 02:24:48 +01006236 if (Py_TYPE(args)->tp_iter == NULL && !PySequence_Check(args)) {
Jeroen Demeyerbf17d412019-11-05 16:48:04 +01006237 /* check_args_iterable() may be called with a live exception:
6238 * clear it to prevent calling _PyObject_FunctionStr() with an
6239 * exception set. */
Victor Stinner61f4db82020-01-28 03:37:45 +01006240 _PyErr_Clear(tstate);
Jeroen Demeyerbf17d412019-11-05 16:48:04 +01006241 PyObject *funcstr = _PyObject_FunctionStr(func);
6242 if (funcstr != NULL) {
6243 _PyErr_Format(tstate, PyExc_TypeError,
6244 "%U argument after * must be an iterable, not %.200s",
6245 funcstr, Py_TYPE(args)->tp_name);
6246 Py_DECREF(funcstr);
6247 }
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03006248 return -1;
6249 }
6250 return 0;
6251}
6252
6253static void
Victor Stinner438a12d2019-05-24 17:01:38 +02006254format_kwargs_error(PyThreadState *tstate, PyObject *func, PyObject *kwargs)
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03006255{
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02006256 /* _PyDict_MergeEx raises attribute
6257 * error (percolated from an attempt
6258 * to get 'keys' attribute) instead of
6259 * a type error if its second argument
6260 * is not a mapping.
6261 */
Victor Stinner438a12d2019-05-24 17:01:38 +02006262 if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) {
Victor Stinner61f4db82020-01-28 03:37:45 +01006263 _PyErr_Clear(tstate);
Jeroen Demeyerbf17d412019-11-05 16:48:04 +01006264 PyObject *funcstr = _PyObject_FunctionStr(func);
6265 if (funcstr != NULL) {
6266 _PyErr_Format(
6267 tstate, PyExc_TypeError,
6268 "%U argument after ** must be a mapping, not %.200s",
6269 funcstr, Py_TYPE(kwargs)->tp_name);
6270 Py_DECREF(funcstr);
6271 }
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02006272 }
Victor Stinner438a12d2019-05-24 17:01:38 +02006273 else if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02006274 PyObject *exc, *val, *tb;
Victor Stinner438a12d2019-05-24 17:01:38 +02006275 _PyErr_Fetch(tstate, &exc, &val, &tb);
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02006276 if (val && PyTuple_Check(val) && PyTuple_GET_SIZE(val) == 1) {
Victor Stinner61f4db82020-01-28 03:37:45 +01006277 _PyErr_Clear(tstate);
Jeroen Demeyerbf17d412019-11-05 16:48:04 +01006278 PyObject *funcstr = _PyObject_FunctionStr(func);
6279 if (funcstr != NULL) {
6280 PyObject *key = PyTuple_GET_ITEM(val, 0);
6281 _PyErr_Format(
6282 tstate, PyExc_TypeError,
6283 "%U got multiple values for keyword argument '%S'",
6284 funcstr, key);
6285 Py_DECREF(funcstr);
6286 }
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02006287 Py_XDECREF(exc);
6288 Py_XDECREF(val);
6289 Py_XDECREF(tb);
6290 }
6291 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02006292 _PyErr_Restore(tstate, exc, val, tb);
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02006293 }
6294 }
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03006295}
6296
Guido van Rossumac7be682001-01-17 15:42:30 +00006297static void
Victor Stinner438a12d2019-05-24 17:01:38 +02006298format_exc_check_arg(PyThreadState *tstate, PyObject *exc,
6299 const char *format_str, PyObject *obj)
Paul Prescode68140d2000-08-30 20:25:01 +00006300{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006301 const char *obj_str;
Paul Prescode68140d2000-08-30 20:25:01 +00006302
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006303 if (!obj)
6304 return;
Paul Prescode68140d2000-08-30 20:25:01 +00006305
Serhiy Storchaka06515832016-11-20 09:13:07 +02006306 obj_str = PyUnicode_AsUTF8(obj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006307 if (!obj_str)
6308 return;
Paul Prescode68140d2000-08-30 20:25:01 +00006309
Victor Stinner438a12d2019-05-24 17:01:38 +02006310 _PyErr_Format(tstate, exc, format_str, obj_str);
Paul Prescode68140d2000-08-30 20:25:01 +00006311}
Guido van Rossum950361c1997-01-24 13:49:28 +00006312
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00006313static void
Victor Stinner438a12d2019-05-24 17:01:38 +02006314format_exc_unbound(PyThreadState *tstate, PyCodeObject *co, int oparg)
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00006315{
6316 PyObject *name;
6317 /* Don't stomp existing exception */
Victor Stinner438a12d2019-05-24 17:01:38 +02006318 if (_PyErr_Occurred(tstate))
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00006319 return;
6320 if (oparg < PyTuple_GET_SIZE(co->co_cellvars)) {
6321 name = PyTuple_GET_ITEM(co->co_cellvars,
6322 oparg);
Victor Stinner438a12d2019-05-24 17:01:38 +02006323 format_exc_check_arg(tstate,
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00006324 PyExc_UnboundLocalError,
6325 UNBOUNDLOCAL_ERROR_MSG,
6326 name);
6327 } else {
6328 name = PyTuple_GET_ITEM(co->co_freevars, oparg -
6329 PyTuple_GET_SIZE(co->co_cellvars));
Victor Stinner438a12d2019-05-24 17:01:38 +02006330 format_exc_check_arg(tstate, PyExc_NameError,
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00006331 UNBOUNDFREE_ERROR_MSG, name);
6332 }
6333}
6334
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03006335static void
Mark Shannonfee55262019-11-21 09:11:43 +00006336format_awaitable_error(PyThreadState *tstate, PyTypeObject *type, int prevprevopcode, int prevopcode)
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03006337{
6338 if (type->tp_as_async == NULL || type->tp_as_async->am_await == NULL) {
6339 if (prevopcode == BEFORE_ASYNC_WITH) {
Victor Stinner438a12d2019-05-24 17:01:38 +02006340 _PyErr_Format(tstate, PyExc_TypeError,
6341 "'async with' received an object from __aenter__ "
6342 "that does not implement __await__: %.100s",
6343 type->tp_name);
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03006344 }
Mark Shannonfee55262019-11-21 09:11:43 +00006345 else if (prevopcode == WITH_EXCEPT_START || (prevopcode == CALL_FUNCTION && prevprevopcode == DUP_TOP)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02006346 _PyErr_Format(tstate, PyExc_TypeError,
6347 "'async with' received an object from __aexit__ "
6348 "that does not implement __await__: %.100s",
6349 type->tp_name);
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03006350 }
6351 }
6352}
6353
Victor Stinnerd2a915d2011-10-02 20:34:20 +02006354static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02006355unicode_concatenate(PyThreadState *tstate, PyObject *v, PyObject *w,
Serhiy Storchakaab874002016-09-11 13:48:15 +03006356 PyFrameObject *f, const _Py_CODEUNIT *next_instr)
Victor Stinnerd2a915d2011-10-02 20:34:20 +02006357{
6358 PyObject *res;
6359 if (Py_REFCNT(v) == 2) {
6360 /* In the common case, there are 2 references to the value
6361 * stored in 'variable' when the += is performed: one on the
6362 * value stack (in 'v') and one still stored in the
6363 * 'variable'. We try to delete the variable now to reduce
6364 * the refcnt to 1.
6365 */
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03006366 int opcode, oparg;
6367 NEXTOPARG();
6368 switch (opcode) {
Victor Stinnerd2a915d2011-10-02 20:34:20 +02006369 case STORE_FAST:
6370 {
Victor Stinnerd2a915d2011-10-02 20:34:20 +02006371 PyObject **fastlocals = f->f_localsplus;
6372 if (GETLOCAL(oparg) == v)
6373 SETLOCAL(oparg, NULL);
6374 break;
6375 }
6376 case STORE_DEREF:
6377 {
6378 PyObject **freevars = (f->f_localsplus +
6379 f->f_code->co_nlocals);
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03006380 PyObject *c = freevars[oparg];
Raymond Hettingerc32f9db2016-11-12 04:10:35 -05006381 if (PyCell_GET(c) == v) {
6382 PyCell_SET(c, NULL);
6383 Py_DECREF(v);
6384 }
Victor Stinnerd2a915d2011-10-02 20:34:20 +02006385 break;
6386 }
6387 case STORE_NAME:
6388 {
6389 PyObject *names = f->f_code->co_names;
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03006390 PyObject *name = GETITEM(names, oparg);
Victor Stinnerd2a915d2011-10-02 20:34:20 +02006391 PyObject *locals = f->f_locals;
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02006392 if (locals && PyDict_CheckExact(locals)) {
6393 PyObject *w = PyDict_GetItemWithError(locals, name);
6394 if ((w == v && PyDict_DelItem(locals, name) != 0) ||
Victor Stinner438a12d2019-05-24 17:01:38 +02006395 (w == NULL && _PyErr_Occurred(tstate)))
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02006396 {
6397 Py_DECREF(v);
6398 return NULL;
Victor Stinnerd2a915d2011-10-02 20:34:20 +02006399 }
6400 }
6401 break;
6402 }
6403 }
6404 }
6405 res = v;
6406 PyUnicode_Append(&res, w);
6407 return res;
6408}
6409
Guido van Rossum950361c1997-01-24 13:49:28 +00006410#ifdef DYNAMIC_EXECUTION_PROFILE
6411
Skip Montanarof118cb12001-10-15 20:51:38 +00006412static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00006413getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00006414{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006415 int i;
6416 PyObject *l = PyList_New(256);
6417 if (l == NULL) return NULL;
6418 for (i = 0; i < 256; i++) {
6419 PyObject *x = PyLong_FromLong(a[i]);
6420 if (x == NULL) {
6421 Py_DECREF(l);
6422 return NULL;
6423 }
Zackery Spytz99d56b52018-12-08 07:16:55 -07006424 PyList_SET_ITEM(l, i, x);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006425 }
6426 for (i = 0; i < 256; i++)
6427 a[i] = 0;
6428 return l;
Guido van Rossum950361c1997-01-24 13:49:28 +00006429}
6430
6431PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00006432_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00006433{
6434#ifndef DXPAIRS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006435 return getarray(dxp);
Guido van Rossum950361c1997-01-24 13:49:28 +00006436#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006437 int i;
6438 PyObject *l = PyList_New(257);
6439 if (l == NULL) return NULL;
6440 for (i = 0; i < 257; i++) {
6441 PyObject *x = getarray(dxpairs[i]);
6442 if (x == NULL) {
6443 Py_DECREF(l);
6444 return NULL;
6445 }
Zackery Spytz99d56b52018-12-08 07:16:55 -07006446 PyList_SET_ITEM(l, i, x);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006447 }
6448 return l;
Guido van Rossum950361c1997-01-24 13:49:28 +00006449#endif
6450}
6451
6452#endif
Brett Cannon5c4de282016-09-07 11:16:41 -07006453
6454Py_ssize_t
6455_PyEval_RequestCodeExtraIndex(freefunc free)
6456{
Victor Stinner81a7be32020-04-14 15:14:01 +02006457 PyInterpreterState *interp = _PyInterpreterState_GET();
Brett Cannon5c4de282016-09-07 11:16:41 -07006458 Py_ssize_t new_index;
6459
Dino Viehlandf3cffd22017-06-21 14:44:36 -07006460 if (interp->co_extra_user_count == MAX_CO_EXTRA_USERS - 1) {
Brett Cannon5c4de282016-09-07 11:16:41 -07006461 return -1;
6462 }
Dino Viehlandf3cffd22017-06-21 14:44:36 -07006463 new_index = interp->co_extra_user_count++;
6464 interp->co_extra_freefuncs[new_index] = free;
Brett Cannon5c4de282016-09-07 11:16:41 -07006465 return new_index;
6466}
Łukasz Langaa785c872016-09-09 17:37:37 -07006467
6468static void
6469dtrace_function_entry(PyFrameObject *f)
6470{
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02006471 const char *filename;
6472 const char *funcname;
Łukasz Langaa785c872016-09-09 17:37:37 -07006473 int lineno;
6474
Victor Stinner6d86a232020-04-29 00:56:58 +02006475 PyCodeObject *code = f->f_code;
6476 filename = PyUnicode_AsUTF8(code->co_filename);
6477 funcname = PyUnicode_AsUTF8(code->co_name);
6478 lineno = PyCode_Addr2Line(code, f->f_lasti);
Łukasz Langaa785c872016-09-09 17:37:37 -07006479
Andy Lestere6be9b52020-02-11 20:28:35 -06006480 PyDTrace_FUNCTION_ENTRY(filename, funcname, lineno);
Łukasz Langaa785c872016-09-09 17:37:37 -07006481}
6482
6483static void
6484dtrace_function_return(PyFrameObject *f)
6485{
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02006486 const char *filename;
6487 const char *funcname;
Łukasz Langaa785c872016-09-09 17:37:37 -07006488 int lineno;
6489
Victor Stinner6d86a232020-04-29 00:56:58 +02006490 PyCodeObject *code = f->f_code;
6491 filename = PyUnicode_AsUTF8(code->co_filename);
6492 funcname = PyUnicode_AsUTF8(code->co_name);
6493 lineno = PyCode_Addr2Line(code, f->f_lasti);
Łukasz Langaa785c872016-09-09 17:37:37 -07006494
Andy Lestere6be9b52020-02-11 20:28:35 -06006495 PyDTrace_FUNCTION_RETURN(filename, funcname, lineno);
Łukasz Langaa785c872016-09-09 17:37:37 -07006496}
6497
6498/* DTrace equivalent of maybe_call_line_trace. */
6499static void
6500maybe_dtrace_line(PyFrameObject *frame,
Mark Shannon8e1b4062021-03-05 14:45:50 +00006501 PyTraceInfo *trace_info)
Łukasz Langaa785c872016-09-09 17:37:37 -07006502{
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02006503 const char *co_filename, *co_name;
Łukasz Langaa785c872016-09-09 17:37:37 -07006504
6505 /* If the last instruction executed isn't in the current
6506 instruction window, reset the window.
6507 */
Mark Shannon8e1b4062021-03-05 14:45:50 +00006508 initialize_trace_info(trace_info, frame);
6509 int line = _PyCode_CheckLineNumber(frame->f_lasti, &trace_info->bounds);
Łukasz Langaa785c872016-09-09 17:37:37 -07006510 /* If the last instruction falls at the start of a line or if
6511 it represents a jump backwards, update the frame's line
6512 number and call the trace function. */
Mark Shannon8e1b4062021-03-05 14:45:50 +00006513 if (line != frame->f_lineno || frame->f_lasti < trace_info->instr_prev) {
Mark Shannon877df852020-11-12 09:43:29 +00006514 if (line != -1) {
6515 frame->f_lineno = line;
6516 co_filename = PyUnicode_AsUTF8(frame->f_code->co_filename);
6517 if (!co_filename)
6518 co_filename = "?";
6519 co_name = PyUnicode_AsUTF8(frame->f_code->co_name);
6520 if (!co_name)
6521 co_name = "?";
6522 PyDTrace_LINE(co_filename, co_name, line);
6523 }
Łukasz Langaa785c872016-09-09 17:37:37 -07006524 }
Mark Shannon8e1b4062021-03-05 14:45:50 +00006525 trace_info->instr_prev = frame->f_lasti;
Łukasz Langaa785c872016-09-09 17:37:37 -07006526}
Victor Stinnerf4b1e3d2019-11-04 19:48:34 +01006527
6528
6529/* Implement Py_EnterRecursiveCall() and Py_LeaveRecursiveCall() as functions
6530 for the limited API. */
6531
6532#undef Py_EnterRecursiveCall
6533
6534int Py_EnterRecursiveCall(const char *where)
6535{
Victor Stinnerbe434dc2019-11-05 00:51:22 +01006536 return _Py_EnterRecursiveCall_inline(where);
Victor Stinnerf4b1e3d2019-11-04 19:48:34 +01006537}
6538
6539#undef Py_LeaveRecursiveCall
6540
6541void Py_LeaveRecursiveCall(void)
6542{
Victor Stinnerbe434dc2019-11-05 00:51:22 +01006543 _Py_LeaveRecursiveCall_inline();
Victor Stinnerf4b1e3d2019-11-04 19:48:34 +01006544}