blob: eda993927093c4f675522ccd6a82f7604c954cde [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) {
Brandt Bucher145bf262021-02-26 14:51:55 -08001032 if (!PyTuple_CheckExact(match_args)) {
Brandt Bucherf84d5a12021-04-05 19:17:08 -07001033 const char *e = "%s.__match_args__ must be a tuple (got %s)";
Brandt Bucher145bf262021-02-26 14:51:55 -08001034 _PyErr_Format(tstate, PyExc_TypeError, e,
1035 ((PyTypeObject *)type)->tp_name,
1036 Py_TYPE(match_args)->tp_name);
1037 goto fail;
1038 }
1039 }
1040 else if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) {
1041 _PyErr_Clear(tstate);
1042 // _Py_TPFLAGS_MATCH_SELF is only acknowledged if the type does not
1043 // define __match_args__. This is natural behavior for subclasses:
1044 // it's as if __match_args__ is some "magic" value that is lost as
1045 // soon as they redefine it.
1046 match_args = PyTuple_New(0);
1047 match_self = PyType_HasFeature((PyTypeObject*)type,
1048 _Py_TPFLAGS_MATCH_SELF);
1049 }
1050 else {
1051 goto fail;
1052 }
1053 assert(PyTuple_CheckExact(match_args));
1054 Py_ssize_t allowed = match_self ? 1 : PyTuple_GET_SIZE(match_args);
1055 if (allowed < nargs) {
1056 const char *plural = (allowed == 1) ? "" : "s";
1057 _PyErr_Format(tstate, PyExc_TypeError,
1058 "%s() accepts %d positional sub-pattern%s (%d given)",
1059 ((PyTypeObject*)type)->tp_name,
1060 allowed, plural, nargs);
1061 goto fail;
1062 }
1063 if (match_self) {
1064 // Easy. Copy the subject itself, and move on to kwargs.
1065 PyList_Append(attrs, subject);
1066 }
1067 else {
1068 for (Py_ssize_t i = 0; i < nargs; i++) {
1069 PyObject *name = PyTuple_GET_ITEM(match_args, i);
1070 if (!PyUnicode_CheckExact(name)) {
1071 _PyErr_Format(tstate, PyExc_TypeError,
1072 "__match_args__ elements must be strings "
1073 "(got %s)", Py_TYPE(name)->tp_name);
1074 goto fail;
1075 }
1076 PyObject *attr = match_class_attr(tstate, subject, type, name,
1077 seen);
1078 if (attr == NULL) {
1079 goto fail;
1080 }
1081 PyList_Append(attrs, attr);
1082 Py_DECREF(attr);
1083 }
1084 }
1085 Py_CLEAR(match_args);
1086 }
1087 // Finally, the keyword subpatterns:
1088 for (Py_ssize_t i = 0; i < PyTuple_GET_SIZE(kwargs); i++) {
1089 PyObject *name = PyTuple_GET_ITEM(kwargs, i);
1090 PyObject *attr = match_class_attr(tstate, subject, type, name, seen);
1091 if (attr == NULL) {
1092 goto fail;
1093 }
1094 PyList_Append(attrs, attr);
1095 Py_DECREF(attr);
1096 }
1097 Py_SETREF(attrs, PyList_AsTuple(attrs));
1098 Py_DECREF(seen);
1099 return attrs;
1100fail:
1101 // We really don't care whether an error was raised or not... that's our
1102 // caller's problem. All we know is that the match failed.
1103 Py_XDECREF(match_args);
1104 Py_DECREF(seen);
1105 Py_DECREF(attrs);
1106 return NULL;
1107}
1108
1109
Victor Stinner09532fe2019-05-10 23:39:09 +02001110static int do_raise(PyThreadState *tstate, PyObject *exc, PyObject *cause);
Victor Stinner438a12d2019-05-24 17:01:38 +02001111static int unpack_iterable(PyThreadState *, PyObject *, int, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +00001112
Victor Stinnere225beb2019-06-03 18:14:24 +02001113#define _Py_TracingPossible(ceval) ((ceval)->tracing_possible)
Antoine Pitrou074e5ed2009-11-10 19:50:40 +00001114
Guido van Rossum374a9221991-04-04 10:40:29 +00001115
Guido van Rossumb209a111997-04-29 18:18:01 +00001116PyObject *
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00001117PyEval_EvalCode(PyObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +00001118{
Victor Stinner46496f92021-02-20 15:17:18 +01001119 PyThreadState *tstate = PyThreadState_GET();
Mark Shannon0332e562021-02-01 10:42:03 +00001120 if (locals == NULL) {
1121 locals = globals;
1122 }
Victor Stinnerfc980e02021-03-18 14:51:24 +01001123 PyObject *builtins = _PyEval_BuiltinsFromGlobals(tstate, globals); // borrowed ref
Mark Shannon0332e562021-02-01 10:42:03 +00001124 if (builtins == NULL) {
1125 return NULL;
1126 }
1127 PyFrameConstructor desc = {
1128 .fc_globals = globals,
1129 .fc_builtins = builtins,
1130 .fc_name = ((PyCodeObject *)co)->co_name,
1131 .fc_qualname = ((PyCodeObject *)co)->co_name,
1132 .fc_code = co,
1133 .fc_defaults = NULL,
1134 .fc_kwdefaults = NULL,
1135 .fc_closure = NULL
1136 };
Victor Stinner46496f92021-02-20 15:17:18 +01001137 return _PyEval_Vector(tstate, &desc, locals, NULL, 0, NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001138}
1139
1140
1141/* Interpreter main loop */
1142
Martin v. Löwis8d97e332004-06-27 15:43:12 +00001143PyObject *
Victor Stinnerb9e68122019-11-14 12:20:46 +01001144PyEval_EvalFrame(PyFrameObject *f)
1145{
Victor Stinner0b72b232020-03-12 23:18:39 +01001146 /* Function kept for backward compatibility */
Victor Stinnerb9e68122019-11-14 12:20:46 +01001147 PyThreadState *tstate = _PyThreadState_GET();
1148 return _PyEval_EvalFrame(tstate, f, 0);
Phillip J. Eby0d6615f2005-08-02 00:46:46 +00001149}
1150
1151PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001152PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
Guido van Rossum374a9221991-04-04 10:40:29 +00001153{
Victor Stinnerb9e68122019-11-14 12:20:46 +01001154 PyThreadState *tstate = _PyThreadState_GET();
1155 return _PyEval_EvalFrame(tstate, f, throwflag);
Brett Cannon3cebf932016-09-05 15:33:46 -07001156}
1157
Victor Stinnerda2914d2020-03-20 09:29:08 +01001158
1159/* Handle signals, pending calls, GIL drop request
1160 and asynchronous exception */
1161static int
1162eval_frame_handle_pending(PyThreadState *tstate)
1163{
Victor Stinnerda2914d2020-03-20 09:29:08 +01001164 _PyRuntimeState * const runtime = &_PyRuntime;
1165 struct _ceval_runtime_state *ceval = &runtime->ceval;
Victor Stinnerb54a99d2020-04-08 23:35:05 +02001166
1167 /* Pending signals */
Victor Stinner299b8c62020-05-05 17:40:18 +02001168 if (_Py_atomic_load_relaxed(&ceval->signals_pending)) {
Victor Stinnerda2914d2020-03-20 09:29:08 +01001169 if (handle_signals(tstate) != 0) {
1170 return -1;
1171 }
1172 }
1173
1174 /* Pending calls */
Victor Stinner299b8c62020-05-05 17:40:18 +02001175 struct _ceval_state *ceval2 = &tstate->interp->ceval;
Victor Stinnerda2914d2020-03-20 09:29:08 +01001176 if (_Py_atomic_load_relaxed(&ceval2->pending.calls_to_do)) {
Victor Stinnerbcb094b2021-02-19 15:10:45 +01001177 if (make_pending_calls(tstate->interp) != 0) {
Victor Stinnerda2914d2020-03-20 09:29:08 +01001178 return -1;
1179 }
1180 }
1181
1182 /* GIL drop request */
Victor Stinner0b1e3302020-05-05 16:14:31 +02001183 if (_Py_atomic_load_relaxed(&ceval2->gil_drop_request)) {
Victor Stinnerda2914d2020-03-20 09:29:08 +01001184 /* Give another thread a chance */
1185 if (_PyThreadState_Swap(&runtime->gilstate, NULL) != tstate) {
1186 Py_FatalError("tstate mix-up");
1187 }
Victor Stinner0b1e3302020-05-05 16:14:31 +02001188 drop_gil(ceval, ceval2, tstate);
Victor Stinnerda2914d2020-03-20 09:29:08 +01001189
1190 /* Other threads may run now */
1191
1192 take_gil(tstate);
1193
Victor Stinnere838a932020-05-05 19:56:48 +02001194#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
1195 (void)_PyThreadState_Swap(&runtime->gilstate, tstate);
1196#else
Victor Stinnerda2914d2020-03-20 09:29:08 +01001197 if (_PyThreadState_Swap(&runtime->gilstate, tstate) != NULL) {
1198 Py_FatalError("orphan tstate");
1199 }
Victor Stinnere838a932020-05-05 19:56:48 +02001200#endif
Victor Stinnerda2914d2020-03-20 09:29:08 +01001201 }
1202
1203 /* Check for asynchronous exception. */
1204 if (tstate->async_exc != NULL) {
1205 PyObject *exc = tstate->async_exc;
1206 tstate->async_exc = NULL;
Victor Stinnerb54a99d2020-04-08 23:35:05 +02001207 UNSIGNAL_ASYNC_EXC(tstate->interp);
Victor Stinnerda2914d2020-03-20 09:29:08 +01001208 _PyErr_SetNone(tstate, exc);
1209 Py_DECREF(exc);
1210 return -1;
1211 }
1212
Victor Stinnerd96a7a82020-11-13 14:44:42 +01001213#ifdef MS_WINDOWS
1214 // bpo-42296: On Windows, _PyEval_SignalReceived() can be called in a
1215 // different thread than the Python thread, in which case
1216 // _Py_ThreadCanHandleSignals() is wrong. Recompute eval_breaker in the
1217 // current Python thread with the correct _Py_ThreadCanHandleSignals()
1218 // value. It prevents to interrupt the eval loop at every instruction if
1219 // the current Python thread cannot handle signals (if
1220 // _Py_ThreadCanHandleSignals() is false).
1221 COMPUTE_EVAL_BREAKER(tstate->interp, ceval, ceval2);
1222#endif
1223
Victor Stinnerda2914d2020-03-20 09:29:08 +01001224 return 0;
1225}
1226
Victor Stinner3c1e4812012-03-26 22:10:51 +02001227
Antoine Pitroub52ec782009-01-25 16:34:23 +00001228/* Computed GOTOs, or
1229 the-optimization-commonly-but-improperly-known-as-"threaded code"
1230 using gcc's labels-as-values extension
1231 (http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html).
1232
1233 The traditional bytecode evaluation loop uses a "switch" statement, which
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001234 decent compilers will optimize as a single indirect branch instruction
Antoine Pitroub52ec782009-01-25 16:34:23 +00001235 combined with a lookup table of jump addresses. However, since the
1236 indirect jump instruction is shared by all opcodes, the CPU will have a
1237 hard time making the right prediction for where to jump next (actually,
1238 it will be always wrong except in the uncommon case of a sequence of
1239 several identical opcodes).
1240
1241 "Threaded code" in contrast, uses an explicit jump table and an explicit
1242 indirect jump instruction at the end of each opcode. Since the jump
1243 instruction is at a different address for each opcode, the CPU will make a
1244 separate prediction for each of these instructions, which is equivalent to
1245 predicting the second opcode of each opcode pair. These predictions have
1246 a much better chance to turn out valid, especially in small bytecode loops.
1247
1248 A mispredicted branch on a modern CPU flushes the whole pipeline and
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001249 can cost several CPU cycles (depending on the pipeline depth),
Antoine Pitroub52ec782009-01-25 16:34:23 +00001250 and potentially many more instructions (depending on the pipeline width).
1251 A correctly predicted branch, however, is nearly free.
1252
1253 At the time of this writing, the "threaded code" version is up to 15-20%
1254 faster than the normal "switch" version, depending on the compiler and the
1255 CPU architecture.
1256
1257 We disable the optimization if DYNAMIC_EXECUTION_PROFILE is defined,
1258 because it would render the measurements invalid.
1259
1260
1261 NOTE: care must be taken that the compiler doesn't try to "optimize" the
1262 indirect jumps by sharing them between all opcodes. Such optimizations
1263 can be disabled on gcc by using the -fno-gcse flag (or possibly
1264 -fno-crossjumping).
1265*/
1266
Antoine Pitrou042b1282010-08-13 21:15:58 +00001267#ifdef DYNAMIC_EXECUTION_PROFILE
Antoine Pitroub52ec782009-01-25 16:34:23 +00001268#undef USE_COMPUTED_GOTOS
Antoine Pitrou042b1282010-08-13 21:15:58 +00001269#define USE_COMPUTED_GOTOS 0
Antoine Pitroub52ec782009-01-25 16:34:23 +00001270#endif
1271
Antoine Pitrou042b1282010-08-13 21:15:58 +00001272#ifdef HAVE_COMPUTED_GOTOS
1273 #ifndef USE_COMPUTED_GOTOS
1274 #define USE_COMPUTED_GOTOS 1
1275 #endif
1276#else
1277 #if defined(USE_COMPUTED_GOTOS) && USE_COMPUTED_GOTOS
1278 #error "Computed gotos are not supported on this compiler."
1279 #endif
1280 #undef USE_COMPUTED_GOTOS
1281 #define USE_COMPUTED_GOTOS 0
1282#endif
1283
1284#if USE_COMPUTED_GOTOS
Antoine Pitroub52ec782009-01-25 16:34:23 +00001285#define TARGET(op) \
Benjamin Petersonddd19492018-09-16 22:38:02 -07001286 op: \
1287 TARGET_##op
Antoine Pitroub52ec782009-01-25 16:34:23 +00001288
Antoine Pitroub52ec782009-01-25 16:34:23 +00001289#ifdef LLTRACE
Mark Shannon4958f5d2021-03-24 17:56:12 +00001290#define DISPATCH() \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001291 { \
Victor Stinnerdab84232020-03-17 18:56:44 +01001292 if (!lltrace && !_Py_TracingPossible(ceval2) && !PyDTrace_LINE_ENABLED()) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001293 f->f_lasti = INSTR_OFFSET(); \
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001294 NEXTOPARG(); \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001295 goto *opcode_targets[opcode]; \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001296 } \
1297 goto fast_next_opcode; \
1298 }
Antoine Pitroub52ec782009-01-25 16:34:23 +00001299#else
Mark Shannon4958f5d2021-03-24 17:56:12 +00001300#define DISPATCH() \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001301 { \
Victor Stinnerdab84232020-03-17 18:56:44 +01001302 if (!_Py_TracingPossible(ceval2) && !PyDTrace_LINE_ENABLED()) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001303 f->f_lasti = INSTR_OFFSET(); \
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001304 NEXTOPARG(); \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001305 goto *opcode_targets[opcode]; \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001306 } \
1307 goto fast_next_opcode; \
1308 }
Antoine Pitroub52ec782009-01-25 16:34:23 +00001309#endif
1310
1311#else
Benjamin Petersonddd19492018-09-16 22:38:02 -07001312#define TARGET(op) op
Mark Shannon4958f5d2021-03-24 17:56:12 +00001313#define DISPATCH() goto fast_next_opcode
1314
Antoine Pitroub52ec782009-01-25 16:34:23 +00001315#endif
1316
Mark Shannon4958f5d2021-03-24 17:56:12 +00001317#define CHECK_EVAL_BREAKER() \
1318 if (_Py_atomic_load_relaxed(eval_breaker)) { \
1319 continue; \
1320 }
1321
Antoine Pitroub52ec782009-01-25 16:34:23 +00001322
Neal Norwitza81d2202002-07-14 00:27:26 +00001323/* Tuple access macros */
1324
1325#ifndef Py_DEBUG
1326#define GETITEM(v, i) PyTuple_GET_ITEM((PyTupleObject *)(v), (i))
1327#else
1328#define GETITEM(v, i) PyTuple_GetItem((v), (i))
1329#endif
1330
Guido van Rossum374a9221991-04-04 10:40:29 +00001331/* Code access macros */
1332
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001333/* The integer overflow is checked by an assertion below. */
Mark Shannonfcb55c02021-04-01 16:00:31 +01001334#define INSTR_OFFSET() ((int)(next_instr - first_instr))
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001335#define NEXTOPARG() do { \
Serhiy Storchakaab874002016-09-11 13:48:15 +03001336 _Py_CODEUNIT word = *next_instr; \
1337 opcode = _Py_OPCODE(word); \
1338 oparg = _Py_OPARG(word); \
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001339 next_instr++; \
1340 } while (0)
Mark Shannonfcb55c02021-04-01 16:00:31 +01001341#define JUMPTO(x) (next_instr = first_instr + (x))
1342#define JUMPBY(x) (next_instr += (x))
Guido van Rossum374a9221991-04-04 10:40:29 +00001343
Raymond Hettingerf606f872003-03-16 03:11:04 +00001344/* OpCode prediction macros
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001345 Some opcodes tend to come in pairs thus making it possible to
1346 predict the second code when the first is run. For example,
Serhiy Storchakada9c5132016-06-27 18:58:57 +03001347 COMPARE_OP is often followed by POP_JUMP_IF_FALSE or POP_JUMP_IF_TRUE.
Raymond Hettingerf606f872003-03-16 03:11:04 +00001348
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001349 Verifying the prediction costs a single high-speed test of a register
1350 variable against a constant. If the pairing was good, then the
1351 processor's own internal branch predication has a high likelihood of
1352 success, resulting in a nearly zero-overhead transition to the
1353 next opcode. A successful prediction saves a trip through the eval-loop
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001354 including its unpredictable switch-case branch. Combined with the
1355 processor's internal branch prediction, a successful PREDICT has the
1356 effect of making the two opcodes run as if they were a single new opcode
1357 with the bodies combined.
Raymond Hettingerf606f872003-03-16 03:11:04 +00001358
Georg Brandl86b2fb92008-07-16 03:43:04 +00001359 If collecting opcode statistics, your choices are to either keep the
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001360 predictions turned-on and interpret the results as if some opcodes
1361 had been combined or turn-off predictions so that the opcode frequency
1362 counter updates for both opcodes.
Antoine Pitroub52ec782009-01-25 16:34:23 +00001363
1364 Opcode prediction is disabled with threaded code, since the latter allows
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001365 the CPU to record separate branch prediction information for each
1366 opcode.
Antoine Pitroub52ec782009-01-25 16:34:23 +00001367
Raymond Hettingerf606f872003-03-16 03:11:04 +00001368*/
1369
Denis Chernikovbaf29b22020-02-21 12:17:50 +03001370#define PREDICT_ID(op) PRED_##op
1371
Antoine Pitrou042b1282010-08-13 21:15:58 +00001372#if defined(DYNAMIC_EXECUTION_PROFILE) || USE_COMPUTED_GOTOS
Denis Chernikovbaf29b22020-02-21 12:17:50 +03001373#define PREDICT(op) if (0) goto PREDICT_ID(op)
Raymond Hettingera7216982004-02-08 19:59:27 +00001374#else
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001375#define PREDICT(op) \
Denis Chernikovbaf29b22020-02-21 12:17:50 +03001376 do { \
Serhiy Storchakaab874002016-09-11 13:48:15 +03001377 _Py_CODEUNIT word = *next_instr; \
1378 opcode = _Py_OPCODE(word); \
Denis Chernikovbaf29b22020-02-21 12:17:50 +03001379 if (opcode == op) { \
Serhiy Storchakaab874002016-09-11 13:48:15 +03001380 oparg = _Py_OPARG(word); \
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001381 next_instr++; \
Denis Chernikovbaf29b22020-02-21 12:17:50 +03001382 goto PREDICT_ID(op); \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001383 } \
1384 } while(0)
Antoine Pitroub52ec782009-01-25 16:34:23 +00001385#endif
Denis Chernikovbaf29b22020-02-21 12:17:50 +03001386#define PREDICTED(op) PREDICT_ID(op):
Antoine Pitroub52ec782009-01-25 16:34:23 +00001387
Raymond Hettingerf606f872003-03-16 03:11:04 +00001388
Guido van Rossum374a9221991-04-04 10:40:29 +00001389/* Stack manipulation macros */
1390
Martin v. Löwis18e16552006-02-15 17:27:45 +00001391/* The stack can grow at most MAXINT deep, as co_nlocals and
1392 co_stacksize are ints. */
Stefan Krahb7e10102010-06-23 18:42:39 +00001393#define STACK_LEVEL() ((int)(stack_pointer - f->f_valuestack))
1394#define EMPTY() (STACK_LEVEL() == 0)
1395#define TOP() (stack_pointer[-1])
1396#define SECOND() (stack_pointer[-2])
1397#define THIRD() (stack_pointer[-3])
1398#define FOURTH() (stack_pointer[-4])
1399#define PEEK(n) (stack_pointer[-(n)])
1400#define SET_TOP(v) (stack_pointer[-1] = (v))
1401#define SET_SECOND(v) (stack_pointer[-2] = (v))
1402#define SET_THIRD(v) (stack_pointer[-3] = (v))
1403#define SET_FOURTH(v) (stack_pointer[-4] = (v))
Stefan Krahb7e10102010-06-23 18:42:39 +00001404#define BASIC_STACKADJ(n) (stack_pointer += n)
1405#define BASIC_PUSH(v) (*stack_pointer++ = (v))
1406#define BASIC_POP() (*--stack_pointer)
Guido van Rossum374a9221991-04-04 10:40:29 +00001407
Guido van Rossum96a42c81992-01-12 02:29:51 +00001408#ifdef LLTRACE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001409#define PUSH(v) { (void)(BASIC_PUSH(v), \
Victor Stinner438a12d2019-05-24 17:01:38 +02001410 lltrace && prtrace(tstate, TOP(), "push")); \
Stefan Krahb7e10102010-06-23 18:42:39 +00001411 assert(STACK_LEVEL() <= co->co_stacksize); }
Victor Stinner438a12d2019-05-24 17:01:38 +02001412#define POP() ((void)(lltrace && prtrace(tstate, TOP(), "pop")), \
Stefan Krahb7e10102010-06-23 18:42:39 +00001413 BASIC_POP())
costypetrisor8ed317f2018-07-31 20:55:14 +00001414#define STACK_GROW(n) do { \
1415 assert(n >= 0); \
1416 (void)(BASIC_STACKADJ(n), \
Victor Stinner438a12d2019-05-24 17:01:38 +02001417 lltrace && prtrace(tstate, TOP(), "stackadj")); \
costypetrisor8ed317f2018-07-31 20:55:14 +00001418 assert(STACK_LEVEL() <= co->co_stacksize); \
1419 } while (0)
1420#define STACK_SHRINK(n) do { \
1421 assert(n >= 0); \
Victor Stinner438a12d2019-05-24 17:01:38 +02001422 (void)(lltrace && prtrace(tstate, TOP(), "stackadj")); \
costypetrisor8ed317f2018-07-31 20:55:14 +00001423 (void)(BASIC_STACKADJ(-n)); \
1424 assert(STACK_LEVEL() <= co->co_stacksize); \
1425 } while (0)
Christian Heimes0449f632007-12-15 01:27:15 +00001426#define EXT_POP(STACK_POINTER) ((void)(lltrace && \
Victor Stinner438a12d2019-05-24 17:01:38 +02001427 prtrace(tstate, (STACK_POINTER)[-1], "ext_pop")), \
Stefan Krahb7e10102010-06-23 18:42:39 +00001428 *--(STACK_POINTER))
Guido van Rossum374a9221991-04-04 10:40:29 +00001429#else
Stefan Krahb7e10102010-06-23 18:42:39 +00001430#define PUSH(v) BASIC_PUSH(v)
1431#define POP() BASIC_POP()
costypetrisor8ed317f2018-07-31 20:55:14 +00001432#define STACK_GROW(n) BASIC_STACKADJ(n)
1433#define STACK_SHRINK(n) BASIC_STACKADJ(-n)
Guido van Rossumc2e20742006-02-27 22:32:47 +00001434#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
Guido van Rossum374a9221991-04-04 10:40:29 +00001435#endif
1436
Guido van Rossum681d79a1995-07-18 14:51:37 +00001437/* Local variable macros */
1438
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001439#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumcfbf1a32002-03-28 20:17:52 +00001440
1441/* The SETLOCAL() macro must not DECREF the local variable in-place and
1442 then store the new value; it must copy the old value to a temporary
1443 value, then store the new value, and then DECREF the temporary value.
1444 This is because it is possible that during the DECREF the frame is
1445 accessed by other code (e.g. a __del__ method or gc.collect()) and the
1446 variable would be pointing to already-freed memory. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001447#define SETLOCAL(i, value) do { PyObject *tmp = GETLOCAL(i); \
Stefan Krahb7e10102010-06-23 18:42:39 +00001448 GETLOCAL(i) = value; \
1449 Py_XDECREF(tmp); } while (0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00001450
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001451
1452#define UNWIND_BLOCK(b) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001453 while (STACK_LEVEL() > (b)->b_level) { \
1454 PyObject *v = POP(); \
1455 Py_XDECREF(v); \
1456 }
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001457
1458#define UNWIND_EXCEPT_HANDLER(b) \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001459 do { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001460 PyObject *type, *value, *traceback; \
Mark Shannonae3087c2017-10-22 22:41:51 +01001461 _PyErr_StackItem *exc_info; \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001462 assert(STACK_LEVEL() >= (b)->b_level + 3); \
1463 while (STACK_LEVEL() > (b)->b_level + 3) { \
1464 value = POP(); \
1465 Py_XDECREF(value); \
1466 } \
Mark Shannonae3087c2017-10-22 22:41:51 +01001467 exc_info = tstate->exc_info; \
1468 type = exc_info->exc_type; \
1469 value = exc_info->exc_value; \
1470 traceback = exc_info->exc_traceback; \
1471 exc_info->exc_type = POP(); \
1472 exc_info->exc_value = POP(); \
1473 exc_info->exc_traceback = POP(); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001474 Py_XDECREF(type); \
1475 Py_XDECREF(value); \
1476 Py_XDECREF(traceback); \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001477 } while(0)
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001478
Inada Naoki91234a12019-06-03 21:30:58 +09001479 /* macros for opcode cache */
1480#define OPCACHE_CHECK() \
1481 do { \
1482 co_opcache = NULL; \
1483 if (co->co_opcache != NULL) { \
Pablo Galindo109826c2020-10-20 06:22:44 +01001484 unsigned char co_opcache_offset = \
Inada Naoki91234a12019-06-03 21:30:58 +09001485 co->co_opcache_map[next_instr - first_instr]; \
Pablo Galindo109826c2020-10-20 06:22:44 +01001486 if (co_opcache_offset > 0) { \
1487 assert(co_opcache_offset <= co->co_opcache_size); \
1488 co_opcache = &co->co_opcache[co_opcache_offset - 1]; \
Inada Naoki91234a12019-06-03 21:30:58 +09001489 assert(co_opcache != NULL); \
Inada Naoki91234a12019-06-03 21:30:58 +09001490 } \
1491 } \
1492 } while (0)
1493
Pablo Galindo109826c2020-10-20 06:22:44 +01001494#define OPCACHE_DEOPT() \
1495 do { \
1496 if (co_opcache != NULL) { \
1497 co_opcache->optimized = -1; \
1498 unsigned char co_opcache_offset = \
1499 co->co_opcache_map[next_instr - first_instr]; \
1500 assert(co_opcache_offset <= co->co_opcache_size); \
1501 co->co_opcache_map[co_opcache_offset] = 0; \
1502 co_opcache = NULL; \
1503 } \
1504 } while (0)
1505
1506#define OPCACHE_DEOPT_LOAD_ATTR() \
1507 do { \
1508 if (co_opcache != NULL) { \
1509 OPCACHE_STAT_ATTR_DEOPT(); \
1510 OPCACHE_DEOPT(); \
1511 } \
1512 } while (0)
1513
1514#define OPCACHE_MAYBE_DEOPT_LOAD_ATTR() \
1515 do { \
1516 if (co_opcache != NULL && --co_opcache->optimized <= 0) { \
1517 OPCACHE_DEOPT_LOAD_ATTR(); \
1518 } \
1519 } while (0)
1520
Inada Naoki91234a12019-06-03 21:30:58 +09001521#if OPCACHE_STATS
1522
1523#define OPCACHE_STAT_GLOBAL_HIT() \
1524 do { \
1525 if (co->co_opcache != NULL) opcache_global_hits++; \
1526 } while (0)
1527
1528#define OPCACHE_STAT_GLOBAL_MISS() \
1529 do { \
1530 if (co->co_opcache != NULL) opcache_global_misses++; \
1531 } while (0)
1532
1533#define OPCACHE_STAT_GLOBAL_OPT() \
1534 do { \
1535 if (co->co_opcache != NULL) opcache_global_opts++; \
1536 } while (0)
1537
Pablo Galindo109826c2020-10-20 06:22:44 +01001538#define OPCACHE_STAT_ATTR_HIT() \
1539 do { \
1540 if (co->co_opcache != NULL) opcache_attr_hits++; \
1541 } while (0)
1542
1543#define OPCACHE_STAT_ATTR_MISS() \
1544 do { \
1545 if (co->co_opcache != NULL) opcache_attr_misses++; \
1546 } while (0)
1547
1548#define OPCACHE_STAT_ATTR_OPT() \
1549 do { \
1550 if (co->co_opcache!= NULL) opcache_attr_opts++; \
1551 } while (0)
1552
1553#define OPCACHE_STAT_ATTR_DEOPT() \
1554 do { \
1555 if (co->co_opcache != NULL) opcache_attr_deopts++; \
1556 } while (0)
1557
1558#define OPCACHE_STAT_ATTR_TOTAL() \
1559 do { \
1560 if (co->co_opcache != NULL) opcache_attr_total++; \
1561 } while (0)
1562
Inada Naoki91234a12019-06-03 21:30:58 +09001563#else /* OPCACHE_STATS */
1564
1565#define OPCACHE_STAT_GLOBAL_HIT()
1566#define OPCACHE_STAT_GLOBAL_MISS()
1567#define OPCACHE_STAT_GLOBAL_OPT()
1568
Pablo Galindo109826c2020-10-20 06:22:44 +01001569#define OPCACHE_STAT_ATTR_HIT()
1570#define OPCACHE_STAT_ATTR_MISS()
1571#define OPCACHE_STAT_ATTR_OPT()
1572#define OPCACHE_STAT_ATTR_DEOPT()
1573#define OPCACHE_STAT_ATTR_TOTAL()
1574
Inada Naoki91234a12019-06-03 21:30:58 +09001575#endif
1576
Mark Shannond41bddd2021-03-25 12:00:30 +00001577
1578PyObject* _Py_HOT_FUNCTION
1579_PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag)
1580{
1581 _Py_EnsureTstateNotNULL(tstate);
1582
1583#if USE_COMPUTED_GOTOS
1584/* Import the static jump table */
1585#include "opcode_targets.h"
1586#endif
1587
1588#ifdef DXPAIRS
1589 int lastopcode = 0;
1590#endif
1591 PyObject **stack_pointer; /* Next free slot in value stack */
1592 const _Py_CODEUNIT *next_instr;
1593 int opcode; /* Current opcode */
1594 int oparg; /* Current opcode argument, if any */
1595 PyObject **fastlocals, **freevars;
1596 PyObject *retval = NULL; /* Return value */
1597 struct _ceval_state * const ceval2 = &tstate->interp->ceval;
1598 _Py_atomic_int * const eval_breaker = &ceval2->eval_breaker;
1599 PyCodeObject *co;
1600
1601 /* when tracing we set things up so that
1602
1603 not (instr_lb <= current_bytecode_offset < instr_ub)
1604
1605 is true when the line being executed has changed. The
1606 initial values are such as to make this false the first
1607 time it is tested. */
1608
1609 const _Py_CODEUNIT *first_instr;
1610 PyObject *names;
1611 PyObject *consts;
1612 _PyOpcache *co_opcache;
1613
1614#ifdef LLTRACE
1615 _Py_IDENTIFIER(__ltrace__);
1616#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +00001617
Victor Stinnerbe434dc2019-11-05 00:51:22 +01001618 if (_Py_EnterRecursiveCall(tstate, "")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001619 return NULL;
Victor Stinnerbe434dc2019-11-05 00:51:22 +01001620 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001621
Mark Shannon8e1b4062021-03-05 14:45:50 +00001622 PyTraceInfo trace_info;
1623 /* Mark trace_info as initialized */
1624 trace_info.code = NULL;
1625
1626 /* push frame */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001627 tstate->frame = f;
Mark Shannon86433452021-01-07 16:49:02 +00001628 co = f->f_code;
Tim Peters5ca576e2001-06-18 22:08:13 +00001629
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001630 if (tstate->use_tracing) {
1631 if (tstate->c_tracefunc != NULL) {
1632 /* tstate->c_tracefunc, if defined, is a
1633 function that will be called on *every* entry
1634 to a code block. Its return value, if not
1635 None, is a function that will be called at
1636 the start of each executed line of code.
1637 (Actually, the function must return itself
1638 in order to continue tracing.) The trace
1639 functions are called with three arguments:
1640 a pointer to the current frame, a string
1641 indicating why the function is called, and
1642 an argument which depends on the situation.
1643 The global trace function is also called
1644 whenever an exception is detected. */
1645 if (call_trace_protected(tstate->c_tracefunc,
1646 tstate->c_traceobj,
Mark Shannon8e1b4062021-03-05 14:45:50 +00001647 tstate, f, &trace_info,
Mark Shannon86433452021-01-07 16:49:02 +00001648 PyTrace_CALL, Py_None)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001649 /* Trace function raised an error */
1650 goto exit_eval_frame;
1651 }
1652 }
1653 if (tstate->c_profilefunc != NULL) {
1654 /* Similar for c_profilefunc, except it needn't
1655 return itself and isn't called for "line" events */
1656 if (call_trace_protected(tstate->c_profilefunc,
1657 tstate->c_profileobj,
Mark Shannon8e1b4062021-03-05 14:45:50 +00001658 tstate, f, &trace_info,
Mark Shannon86433452021-01-07 16:49:02 +00001659 PyTrace_CALL, Py_None)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001660 /* Profile function raised an error */
1661 goto exit_eval_frame;
1662 }
1663 }
1664 }
Neil Schemenauer6c0f2002001-09-04 19:03:35 +00001665
Łukasz Langaa785c872016-09-09 17:37:37 -07001666 if (PyDTrace_FUNCTION_ENTRY_ENABLED())
1667 dtrace_function_entry(f);
1668
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001669 names = co->co_names;
1670 consts = co->co_consts;
1671 fastlocals = f->f_localsplus;
1672 freevars = f->f_localsplus + co->co_nlocals;
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001673 assert(PyBytes_Check(co->co_code));
1674 assert(PyBytes_GET_SIZE(co->co_code) <= INT_MAX);
Serhiy Storchakaab874002016-09-11 13:48:15 +03001675 assert(PyBytes_GET_SIZE(co->co_code) % sizeof(_Py_CODEUNIT) == 0);
1676 assert(_Py_IS_ALIGNED(PyBytes_AS_STRING(co->co_code), sizeof(_Py_CODEUNIT)));
1677 first_instr = (_Py_CODEUNIT *) PyBytes_AS_STRING(co->co_code);
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001678 /*
1679 f->f_lasti refers to the index of the last instruction,
1680 unless it's -1 in which case next_instr should be first_instr.
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001681
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001682 YIELD_FROM sets f_lasti to itself, in order to repeatedly yield
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05001683 multiple values.
Thomas Wouters902d6eb2007-01-09 23:18:33 +00001684
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001685 When the PREDICT() macros are enabled, some opcode pairs follow in
1686 direct succession without updating f->f_lasti. A successful
1687 prediction effectively links the two codes together as if they
1688 were a single new opcode; accordingly,f->f_lasti will point to
1689 the first code in the pair (for instance, GET_ITER followed by
1690 FOR_ITER is effectively a single opcode and f->f_lasti will point
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001691 to the beginning of the combined pair.)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001692 */
Serhiy Storchakaab874002016-09-11 13:48:15 +03001693 assert(f->f_lasti >= -1);
Mark Shannonfcb55c02021-04-01 16:00:31 +01001694 next_instr = first_instr + f->f_lasti + 1;
Mark Shannoncb9879b2020-07-17 11:44:23 +01001695 stack_pointer = f->f_valuestack + f->f_stackdepth;
1696 /* Set f->f_stackdepth to -1.
1697 * Update when returning or calling trace function.
1698 Having f_stackdepth <= 0 ensures that invalid
1699 values are not visible to the cycle GC.
1700 We choose -1 rather than 0 to assist debugging.
1701 */
1702 f->f_stackdepth = -1;
1703 f->f_state = FRAME_EXECUTING;
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001704
Pablo Galindoaf5fa132021-02-28 22:41:09 +00001705 if (co->co_opcache_flag < opcache_min_runs) {
Inada Naoki91234a12019-06-03 21:30:58 +09001706 co->co_opcache_flag++;
Pablo Galindoaf5fa132021-02-28 22:41:09 +00001707 if (co->co_opcache_flag == opcache_min_runs) {
Inada Naoki91234a12019-06-03 21:30:58 +09001708 if (_PyCode_InitOpcache(co) < 0) {
Victor Stinner25104942020-04-24 02:43:18 +02001709 goto exit_eval_frame;
Inada Naoki91234a12019-06-03 21:30:58 +09001710 }
1711#if OPCACHE_STATS
1712 opcache_code_objects_extra_mem +=
1713 PyBytes_Size(co->co_code) / sizeof(_Py_CODEUNIT) +
1714 sizeof(_PyOpcache) * co->co_opcache_size;
1715 opcache_code_objects++;
1716#endif
1717 }
1718 }
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001719
Tim Peters5ca576e2001-06-18 22:08:13 +00001720#ifdef LLTRACE
Serhiy Storchakafb5db7e2020-10-26 08:43:39 +02001721 {
1722 int r = _PyDict_ContainsId(f->f_globals, &PyId___ltrace__);
1723 if (r < 0) {
1724 goto exit_eval_frame;
1725 }
1726 lltrace = r;
1727 }
Tim Peters5ca576e2001-06-18 22:08:13 +00001728#endif
Guido van Rossumac7be682001-01-17 15:42:30 +00001729
Serhiy Storchakafb5db7e2020-10-26 08:43:39 +02001730 if (throwflag) { /* support for generator.throw() */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001731 goto error;
Serhiy Storchakafb5db7e2020-10-26 08:43:39 +02001732 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001733
Victor Stinnerace47d72013-07-18 01:41:08 +02001734#ifdef Py_DEBUG
Victor Stinner0b72b232020-03-12 23:18:39 +01001735 /* _PyEval_EvalFrameDefault() must not be called with an exception set,
Victor Stinnera8cb5152017-01-18 14:12:51 +01001736 because it can clear it (directly or indirectly) and so the
Martin Panter9955a372015-10-07 10:26:23 +00001737 caller loses its exception */
Victor Stinner438a12d2019-05-24 17:01:38 +02001738 assert(!_PyErr_Occurred(tstate));
Victor Stinnerace47d72013-07-18 01:41:08 +02001739#endif
1740
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001741main_loop:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001742 for (;;) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001743 assert(stack_pointer >= f->f_valuestack); /* else underflow */
1744 assert(STACK_LEVEL() <= co->co_stacksize); /* else overflow */
Victor Stinner438a12d2019-05-24 17:01:38 +02001745 assert(!_PyErr_Occurred(tstate));
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001746
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001747 /* Do periodic things. Doing this every time through
1748 the loop would add too much overhead, so we do it
1749 only every Nth instruction. We also do it if
Chris Jerdonek4a12d122020-05-14 19:25:45 -07001750 ``pending.calls_to_do'' is set, i.e. when an asynchronous
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001751 event needs attention (e.g. a signal handler or
1752 async I/O handler); see Py_AddPendingCall() and
1753 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +00001754
Eric Snow7bda9de2019-03-08 17:25:54 -07001755 if (_Py_atomic_load_relaxed(eval_breaker)) {
Serhiy Storchaka3f4d90d2018-07-09 15:40:14 +03001756 opcode = _Py_OPCODE(*next_instr);
1757 if (opcode == SETUP_FINALLY ||
1758 opcode == SETUP_WITH ||
1759 opcode == BEFORE_ASYNC_WITH ||
1760 opcode == YIELD_FROM) {
1761 /* Few cases where we skip running signal handlers and other
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07001762 pending calls:
Serhiy Storchaka3f4d90d2018-07-09 15:40:14 +03001763 - If we're about to enter the 'with:'. It will prevent
1764 emitting a resource warning in the common idiom
1765 'with open(path) as file:'.
1766 - If we're about to enter the 'async with:'.
1767 - If we're about to enter the 'try:' of a try/finally (not
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07001768 *very* useful, but might help in some cases and it's
1769 traditional)
1770 - If we're resuming a chain of nested 'yield from' or
1771 'await' calls, then each frame is parked with YIELD_FROM
1772 as its next opcode. If the user hit control-C we want to
1773 wait until we've reached the innermost frame before
1774 running the signal handler and raising KeyboardInterrupt
1775 (see bpo-30039).
1776 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001777 goto fast_next_opcode;
1778 }
Eric Snowfdf282d2019-01-11 14:26:55 -07001779
Victor Stinnerda2914d2020-03-20 09:29:08 +01001780 if (eval_frame_handle_pending(tstate) != 0) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001781 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001782 }
1783 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001784
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001785 fast_next_opcode:
1786 f->f_lasti = INSTR_OFFSET();
Guido van Rossumac7be682001-01-17 15:42:30 +00001787
Łukasz Langaa785c872016-09-09 17:37:37 -07001788 if (PyDTrace_LINE_ENABLED())
Mark Shannon8e1b4062021-03-05 14:45:50 +00001789 maybe_dtrace_line(f, &trace_info);
Łukasz Langaa785c872016-09-09 17:37:37 -07001790
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001791 /* line-by-line tracing support */
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001792
Victor Stinnerdab84232020-03-17 18:56:44 +01001793 if (_Py_TracingPossible(ceval2) &&
Benjamin Peterson51f46162013-01-23 08:38:47 -05001794 tstate->c_tracefunc != NULL && !tstate->tracing) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001795 int err;
Victor Stinnerb7d8d8d2020-09-23 14:07:16 +02001796 /* see maybe_call_line_trace()
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001797 for expository comments */
Victor Stinnerb7d8d8d2020-09-23 14:07:16 +02001798 f->f_stackdepth = (int)(stack_pointer - f->f_valuestack);
Tim Peters8a5c3c72004-04-05 19:36:21 +00001799
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001800 err = maybe_call_line_trace(tstate->c_tracefunc,
1801 tstate->c_traceobj,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01001802 tstate, f,
Mark Shannon8e1b4062021-03-05 14:45:50 +00001803 &trace_info);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001804 /* Reload possibly changed frame fields */
1805 JUMPTO(f->f_lasti);
Mark Shannoncb9879b2020-07-17 11:44:23 +01001806 stack_pointer = f->f_valuestack+f->f_stackdepth;
1807 f->f_stackdepth = -1;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001808 if (err)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001809 /* trace function raised an exception */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001810 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001811 }
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001812
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001813 /* Extract opcode and argument */
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001814
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001815 NEXTOPARG();
Stefan Krahb7e10102010-06-23 18:42:39 +00001816 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +00001817#ifdef DYNAMIC_EXECUTION_PROFILE
1818#ifdef DXPAIRS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001819 dxpairs[lastopcode][opcode]++;
1820 lastopcode = opcode;
Guido van Rossum950361c1997-01-24 13:49:28 +00001821#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001822 dxp[opcode]++;
Guido van Rossum950361c1997-01-24 13:49:28 +00001823#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001824
Guido van Rossum96a42c81992-01-12 02:29:51 +00001825#ifdef LLTRACE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001826 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +00001827
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001828 if (lltrace) {
1829 if (HAS_ARG(opcode)) {
1830 printf("%d: %d, %d\n",
1831 f->f_lasti, opcode, oparg);
1832 }
1833 else {
1834 printf("%d: %d\n",
1835 f->f_lasti, opcode);
1836 }
1837 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001838#endif
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001839
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001840 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +00001841
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001842 /* BEWARE!
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001843 It is essential that any operation that fails must goto error
1844 and that all operation that succeed call [FAST_]DISPATCH() ! */
Guido van Rossumac7be682001-01-17 15:42:30 +00001845
Benjamin Petersonddd19492018-09-16 22:38:02 -07001846 case TARGET(NOP): {
Mark Shannon4958f5d2021-03-24 17:56:12 +00001847 DISPATCH();
Benjamin Petersonddd19492018-09-16 22:38:02 -07001848 }
Raymond Hettinger9c18e812004-06-21 16:31:15 +00001849
Benjamin Petersonddd19492018-09-16 22:38:02 -07001850 case TARGET(LOAD_FAST): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001851 PyObject *value = GETLOCAL(oparg);
1852 if (value == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02001853 format_exc_check_arg(tstate, PyExc_UnboundLocalError,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001854 UNBOUNDLOCAL_ERROR_MSG,
1855 PyTuple_GetItem(co->co_varnames, oparg));
1856 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001857 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001858 Py_INCREF(value);
1859 PUSH(value);
Mark Shannon4958f5d2021-03-24 17:56:12 +00001860 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001861 }
1862
Benjamin Petersonddd19492018-09-16 22:38:02 -07001863 case TARGET(LOAD_CONST): {
1864 PREDICTED(LOAD_CONST);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001865 PyObject *value = GETITEM(consts, oparg);
1866 Py_INCREF(value);
1867 PUSH(value);
Mark Shannon4958f5d2021-03-24 17:56:12 +00001868 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001869 }
Neil Schemenauer63543862002-02-17 19:10:14 +00001870
Benjamin Petersonddd19492018-09-16 22:38:02 -07001871 case TARGET(STORE_FAST): {
1872 PREDICTED(STORE_FAST);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001873 PyObject *value = POP();
1874 SETLOCAL(oparg, value);
Mark Shannon4958f5d2021-03-24 17:56:12 +00001875 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001876 }
Neil Schemenauer63543862002-02-17 19:10:14 +00001877
Benjamin Petersonddd19492018-09-16 22:38:02 -07001878 case TARGET(POP_TOP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001879 PyObject *value = POP();
1880 Py_DECREF(value);
Mark Shannon4958f5d2021-03-24 17:56:12 +00001881 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001882 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001883
Benjamin Petersonddd19492018-09-16 22:38:02 -07001884 case TARGET(ROT_TWO): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001885 PyObject *top = TOP();
1886 PyObject *second = SECOND();
1887 SET_TOP(second);
1888 SET_SECOND(top);
Mark Shannon4958f5d2021-03-24 17:56:12 +00001889 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001890 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001891
Benjamin Petersonddd19492018-09-16 22:38:02 -07001892 case TARGET(ROT_THREE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001893 PyObject *top = TOP();
1894 PyObject *second = SECOND();
1895 PyObject *third = THIRD();
1896 SET_TOP(second);
1897 SET_SECOND(third);
1898 SET_THIRD(top);
Mark Shannon4958f5d2021-03-24 17:56:12 +00001899 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001900 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001901
Benjamin Petersonddd19492018-09-16 22:38:02 -07001902 case TARGET(ROT_FOUR): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001903 PyObject *top = TOP();
1904 PyObject *second = SECOND();
1905 PyObject *third = THIRD();
1906 PyObject *fourth = FOURTH();
1907 SET_TOP(second);
1908 SET_SECOND(third);
1909 SET_THIRD(fourth);
1910 SET_FOURTH(top);
Mark Shannon4958f5d2021-03-24 17:56:12 +00001911 DISPATCH();
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001912 }
1913
Benjamin Petersonddd19492018-09-16 22:38:02 -07001914 case TARGET(DUP_TOP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001915 PyObject *top = TOP();
1916 Py_INCREF(top);
1917 PUSH(top);
Mark Shannon4958f5d2021-03-24 17:56:12 +00001918 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001919 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001920
Benjamin Petersonddd19492018-09-16 22:38:02 -07001921 case TARGET(DUP_TOP_TWO): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001922 PyObject *top = TOP();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001923 PyObject *second = SECOND();
Benjamin Petersonf208df32012-10-12 11:37:56 -04001924 Py_INCREF(top);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001925 Py_INCREF(second);
costypetrisor8ed317f2018-07-31 20:55:14 +00001926 STACK_GROW(2);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001927 SET_TOP(top);
1928 SET_SECOND(second);
Mark Shannon4958f5d2021-03-24 17:56:12 +00001929 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001930 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001931
Benjamin Petersonddd19492018-09-16 22:38:02 -07001932 case TARGET(UNARY_POSITIVE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001933 PyObject *value = TOP();
1934 PyObject *res = PyNumber_Positive(value);
1935 Py_DECREF(value);
1936 SET_TOP(res);
1937 if (res == NULL)
1938 goto error;
1939 DISPATCH();
1940 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001941
Benjamin Petersonddd19492018-09-16 22:38:02 -07001942 case TARGET(UNARY_NEGATIVE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001943 PyObject *value = TOP();
1944 PyObject *res = PyNumber_Negative(value);
1945 Py_DECREF(value);
1946 SET_TOP(res);
1947 if (res == NULL)
1948 goto error;
1949 DISPATCH();
1950 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001951
Benjamin Petersonddd19492018-09-16 22:38:02 -07001952 case TARGET(UNARY_NOT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001953 PyObject *value = TOP();
1954 int err = PyObject_IsTrue(value);
1955 Py_DECREF(value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001956 if (err == 0) {
1957 Py_INCREF(Py_True);
1958 SET_TOP(Py_True);
1959 DISPATCH();
1960 }
1961 else if (err > 0) {
1962 Py_INCREF(Py_False);
1963 SET_TOP(Py_False);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001964 DISPATCH();
1965 }
costypetrisor8ed317f2018-07-31 20:55:14 +00001966 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001967 goto error;
1968 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001969
Benjamin Petersonddd19492018-09-16 22:38:02 -07001970 case TARGET(UNARY_INVERT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001971 PyObject *value = TOP();
1972 PyObject *res = PyNumber_Invert(value);
1973 Py_DECREF(value);
1974 SET_TOP(res);
1975 if (res == NULL)
1976 goto error;
1977 DISPATCH();
1978 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001979
Benjamin Petersonddd19492018-09-16 22:38:02 -07001980 case TARGET(BINARY_POWER): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001981 PyObject *exp = POP();
1982 PyObject *base = TOP();
1983 PyObject *res = PyNumber_Power(base, exp, Py_None);
1984 Py_DECREF(base);
1985 Py_DECREF(exp);
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_MULTIPLY): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001993 PyObject *right = POP();
1994 PyObject *left = TOP();
1995 PyObject *res = PyNumber_Multiply(left, right);
1996 Py_DECREF(left);
1997 Py_DECREF(right);
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_MATRIX_MULTIPLY): {
Benjamin Petersond51374e2014-04-09 23:55:56 -04002005 PyObject *right = POP();
2006 PyObject *left = TOP();
2007 PyObject *res = PyNumber_MatrixMultiply(left, right);
2008 Py_DECREF(left);
2009 Py_DECREF(right);
2010 SET_TOP(res);
2011 if (res == NULL)
2012 goto error;
2013 DISPATCH();
2014 }
2015
Benjamin Petersonddd19492018-09-16 22:38:02 -07002016 case TARGET(BINARY_TRUE_DIVIDE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002017 PyObject *divisor = POP();
2018 PyObject *dividend = TOP();
2019 PyObject *quotient = PyNumber_TrueDivide(dividend, divisor);
2020 Py_DECREF(dividend);
2021 Py_DECREF(divisor);
2022 SET_TOP(quotient);
2023 if (quotient == NULL)
2024 goto error;
2025 DISPATCH();
2026 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002027
Benjamin Petersonddd19492018-09-16 22:38:02 -07002028 case TARGET(BINARY_FLOOR_DIVIDE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002029 PyObject *divisor = POP();
2030 PyObject *dividend = TOP();
2031 PyObject *quotient = PyNumber_FloorDivide(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 Rossum4668b002001-08-08 05:00:18 +00002039
Benjamin Petersonddd19492018-09-16 22:38:02 -07002040 case TARGET(BINARY_MODULO): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002041 PyObject *divisor = POP();
2042 PyObject *dividend = TOP();
Martijn Pietersd7e64332017-02-23 13:38:04 +00002043 PyObject *res;
2044 if (PyUnicode_CheckExact(dividend) && (
2045 !PyUnicode_Check(divisor) || PyUnicode_CheckExact(divisor))) {
2046 // fast path; string formatting, but not if the RHS is a str subclass
2047 // (see issue28598)
2048 res = PyUnicode_Format(dividend, divisor);
2049 } else {
2050 res = PyNumber_Remainder(dividend, divisor);
2051 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002052 Py_DECREF(divisor);
2053 Py_DECREF(dividend);
2054 SET_TOP(res);
2055 if (res == NULL)
2056 goto error;
2057 DISPATCH();
2058 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002059
Benjamin Petersonddd19492018-09-16 22:38:02 -07002060 case TARGET(BINARY_ADD): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002061 PyObject *right = POP();
2062 PyObject *left = TOP();
2063 PyObject *sum;
Victor Stinnerbd0a08e2020-10-01 18:57:37 +02002064 /* NOTE(vstinner): Please don't try to micro-optimize int+int on
Victor Stinnerd65f42a2016-10-20 12:18:10 +02002065 CPython using bytecode, it is simply worthless.
2066 See http://bugs.python.org/issue21955 and
2067 http://bugs.python.org/issue10044 for the discussion. In short,
2068 no patch shown any impact on a realistic benchmark, only a minor
2069 speedup on microbenchmarks. */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002070 if (PyUnicode_CheckExact(left) &&
2071 PyUnicode_CheckExact(right)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002072 sum = unicode_concatenate(tstate, left, right, f, next_instr);
Martin Panter95f53c12016-07-18 08:23:26 +00002073 /* unicode_concatenate consumed the ref to left */
Victor Stinnerd2a915d2011-10-02 20:34:20 +02002074 }
2075 else {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002076 sum = PyNumber_Add(left, right);
2077 Py_DECREF(left);
Victor Stinnerd2a915d2011-10-02 20:34:20 +02002078 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002079 Py_DECREF(right);
2080 SET_TOP(sum);
2081 if (sum == NULL)
2082 goto error;
2083 DISPATCH();
2084 }
2085
Benjamin Petersonddd19492018-09-16 22:38:02 -07002086 case TARGET(BINARY_SUBTRACT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002087 PyObject *right = POP();
2088 PyObject *left = TOP();
2089 PyObject *diff = PyNumber_Subtract(left, right);
2090 Py_DECREF(right);
2091 Py_DECREF(left);
2092 SET_TOP(diff);
2093 if (diff == NULL)
2094 goto error;
2095 DISPATCH();
2096 }
2097
Benjamin Petersonddd19492018-09-16 22:38:02 -07002098 case TARGET(BINARY_SUBSCR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002099 PyObject *sub = POP();
2100 PyObject *container = TOP();
2101 PyObject *res = PyObject_GetItem(container, sub);
2102 Py_DECREF(container);
2103 Py_DECREF(sub);
2104 SET_TOP(res);
2105 if (res == NULL)
2106 goto error;
2107 DISPATCH();
2108 }
2109
Benjamin Petersonddd19492018-09-16 22:38:02 -07002110 case TARGET(BINARY_LSHIFT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002111 PyObject *right = POP();
2112 PyObject *left = TOP();
2113 PyObject *res = PyNumber_Lshift(left, right);
2114 Py_DECREF(left);
2115 Py_DECREF(right);
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_RSHIFT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002123 PyObject *right = POP();
2124 PyObject *left = TOP();
2125 PyObject *res = PyNumber_Rshift(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_AND): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002135 PyObject *right = POP();
2136 PyObject *left = TOP();
2137 PyObject *res = PyNumber_And(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_XOR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002147 PyObject *right = POP();
2148 PyObject *left = TOP();
2149 PyObject *res = PyNumber_Xor(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_OR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002159 PyObject *right = POP();
2160 PyObject *left = TOP();
2161 PyObject *res = PyNumber_Or(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(LIST_APPEND): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002171 PyObject *v = POP();
2172 PyObject *list = PEEK(oparg);
2173 int err;
2174 err = PyList_Append(list, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002175 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002176 if (err != 0)
2177 goto error;
2178 PREDICT(JUMP_ABSOLUTE);
2179 DISPATCH();
2180 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002181
Benjamin Petersonddd19492018-09-16 22:38:02 -07002182 case TARGET(SET_ADD): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002183 PyObject *v = POP();
Raymond Hettinger41862222016-10-15 19:03:06 -07002184 PyObject *set = PEEK(oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002185 int err;
2186 err = PySet_Add(set, 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(INPLACE_POWER): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002195 PyObject *exp = POP();
2196 PyObject *base = TOP();
2197 PyObject *res = PyNumber_InPlacePower(base, exp, Py_None);
2198 Py_DECREF(base);
2199 Py_DECREF(exp);
2200 SET_TOP(res);
2201 if (res == NULL)
2202 goto error;
2203 DISPATCH();
2204 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002205
Benjamin Petersonddd19492018-09-16 22:38:02 -07002206 case TARGET(INPLACE_MULTIPLY): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002207 PyObject *right = POP();
2208 PyObject *left = TOP();
2209 PyObject *res = PyNumber_InPlaceMultiply(left, right);
2210 Py_DECREF(left);
2211 Py_DECREF(right);
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_MATRIX_MULTIPLY): {
Benjamin Petersond51374e2014-04-09 23:55:56 -04002219 PyObject *right = POP();
2220 PyObject *left = TOP();
2221 PyObject *res = PyNumber_InPlaceMatrixMultiply(left, right);
2222 Py_DECREF(left);
2223 Py_DECREF(right);
2224 SET_TOP(res);
2225 if (res == NULL)
2226 goto error;
2227 DISPATCH();
2228 }
2229
Benjamin Petersonddd19492018-09-16 22:38:02 -07002230 case TARGET(INPLACE_TRUE_DIVIDE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002231 PyObject *divisor = POP();
2232 PyObject *dividend = TOP();
2233 PyObject *quotient = PyNumber_InPlaceTrueDivide(dividend, divisor);
2234 Py_DECREF(dividend);
2235 Py_DECREF(divisor);
2236 SET_TOP(quotient);
2237 if (quotient == NULL)
2238 goto error;
2239 DISPATCH();
2240 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002241
Benjamin Petersonddd19492018-09-16 22:38:02 -07002242 case TARGET(INPLACE_FLOOR_DIVIDE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002243 PyObject *divisor = POP();
2244 PyObject *dividend = TOP();
2245 PyObject *quotient = PyNumber_InPlaceFloorDivide(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_MODULO): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002255 PyObject *right = POP();
2256 PyObject *left = TOP();
2257 PyObject *mod = PyNumber_InPlaceRemainder(left, right);
2258 Py_DECREF(left);
2259 Py_DECREF(right);
2260 SET_TOP(mod);
2261 if (mod == 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_ADD): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002267 PyObject *right = POP();
2268 PyObject *left = TOP();
2269 PyObject *sum;
2270 if (PyUnicode_CheckExact(left) && PyUnicode_CheckExact(right)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002271 sum = unicode_concatenate(tstate, left, right, f, next_instr);
Martin Panter95f53c12016-07-18 08:23:26 +00002272 /* unicode_concatenate consumed the ref to left */
Victor Stinnerd2a915d2011-10-02 20:34:20 +02002273 }
2274 else {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002275 sum = PyNumber_InPlaceAdd(left, right);
2276 Py_DECREF(left);
Victor Stinnerd2a915d2011-10-02 20:34:20 +02002277 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002278 Py_DECREF(right);
2279 SET_TOP(sum);
2280 if (sum == NULL)
2281 goto error;
2282 DISPATCH();
2283 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002284
Benjamin Petersonddd19492018-09-16 22:38:02 -07002285 case TARGET(INPLACE_SUBTRACT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002286 PyObject *right = POP();
2287 PyObject *left = TOP();
2288 PyObject *diff = PyNumber_InPlaceSubtract(left, right);
2289 Py_DECREF(left);
2290 Py_DECREF(right);
2291 SET_TOP(diff);
2292 if (diff == 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_LSHIFT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002298 PyObject *right = POP();
2299 PyObject *left = TOP();
2300 PyObject *res = PyNumber_InPlaceLshift(left, right);
2301 Py_DECREF(left);
2302 Py_DECREF(right);
2303 SET_TOP(res);
2304 if (res == 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_RSHIFT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002310 PyObject *right = POP();
2311 PyObject *left = TOP();
2312 PyObject *res = PyNumber_InPlaceRshift(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_AND): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002322 PyObject *right = POP();
2323 PyObject *left = TOP();
2324 PyObject *res = PyNumber_InPlaceAnd(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_XOR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002334 PyObject *right = POP();
2335 PyObject *left = TOP();
2336 PyObject *res = PyNumber_InPlaceXor(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_OR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002346 PyObject *right = POP();
2347 PyObject *left = TOP();
2348 PyObject *res = PyNumber_InPlaceOr(left, right);
2349 Py_DECREF(left);
2350 Py_DECREF(right);
2351 SET_TOP(res);
2352 if (res == NULL)
2353 goto error;
2354 DISPATCH();
2355 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002356
Benjamin Petersonddd19492018-09-16 22:38:02 -07002357 case TARGET(STORE_SUBSCR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002358 PyObject *sub = TOP();
2359 PyObject *container = SECOND();
2360 PyObject *v = THIRD();
2361 int err;
costypetrisor8ed317f2018-07-31 20:55:14 +00002362 STACK_SHRINK(3);
Martin Panter95f53c12016-07-18 08:23:26 +00002363 /* container[sub] = v */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002364 err = PyObject_SetItem(container, sub, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002365 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002366 Py_DECREF(container);
2367 Py_DECREF(sub);
2368 if (err != 0)
2369 goto error;
2370 DISPATCH();
2371 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002372
Benjamin Petersonddd19492018-09-16 22:38:02 -07002373 case TARGET(DELETE_SUBSCR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002374 PyObject *sub = TOP();
2375 PyObject *container = SECOND();
2376 int err;
costypetrisor8ed317f2018-07-31 20:55:14 +00002377 STACK_SHRINK(2);
Martin Panter95f53c12016-07-18 08:23:26 +00002378 /* del container[sub] */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002379 err = PyObject_DelItem(container, sub);
2380 Py_DECREF(container);
2381 Py_DECREF(sub);
2382 if (err != 0)
2383 goto error;
2384 DISPATCH();
2385 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00002386
Benjamin Petersonddd19492018-09-16 22:38:02 -07002387 case TARGET(PRINT_EXPR): {
Victor Stinnercab75e32013-11-06 22:38:37 +01002388 _Py_IDENTIFIER(displayhook);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002389 PyObject *value = POP();
Victor Stinnercab75e32013-11-06 22:38:37 +01002390 PyObject *hook = _PySys_GetObjectId(&PyId_displayhook);
Benjamin Petersonfe1bcb62012-10-12 11:40:01 -04002391 PyObject *res;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002392 if (hook == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002393 _PyErr_SetString(tstate, PyExc_RuntimeError,
2394 "lost sys.displayhook");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002395 Py_DECREF(value);
2396 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002397 }
Petr Viktorinffd97532020-02-11 17:46:57 +01002398 res = PyObject_CallOneArg(hook, value);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002399 Py_DECREF(value);
2400 if (res == NULL)
2401 goto error;
2402 Py_DECREF(res);
2403 DISPATCH();
2404 }
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00002405
Benjamin Petersonddd19492018-09-16 22:38:02 -07002406 case TARGET(RAISE_VARARGS): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002407 PyObject *cause = NULL, *exc = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002408 switch (oparg) {
2409 case 2:
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002410 cause = POP(); /* cause */
Stefan Krahf432a322017-08-21 13:09:59 +02002411 /* fall through */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002412 case 1:
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002413 exc = POP(); /* exc */
Stefan Krahf432a322017-08-21 13:09:59 +02002414 /* fall through */
2415 case 0:
Victor Stinner09532fe2019-05-10 23:39:09 +02002416 if (do_raise(tstate, exc, cause)) {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002417 goto exception_unwind;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002418 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002419 break;
2420 default:
Victor Stinner438a12d2019-05-24 17:01:38 +02002421 _PyErr_SetString(tstate, PyExc_SystemError,
2422 "bad RAISE_VARARGS oparg");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002423 break;
2424 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002425 goto error;
2426 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002427
Benjamin Petersonddd19492018-09-16 22:38:02 -07002428 case TARGET(RETURN_VALUE): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002429 retval = POP();
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002430 assert(f->f_iblock == 0);
Mark Shannone7c9f4a2020-01-13 12:51:26 +00002431 assert(EMPTY());
Mark Shannoncb9879b2020-07-17 11:44:23 +01002432 f->f_state = FRAME_RETURNED;
2433 f->f_stackdepth = 0;
Mark Shannone7c9f4a2020-01-13 12:51:26 +00002434 goto exiting;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002435 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002436
Benjamin Petersonddd19492018-09-16 22:38:02 -07002437 case TARGET(GET_AITER): {
Yury Selivanov6ef05902015-05-28 11:21:31 -04002438 unaryfunc getter = NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04002439 PyObject *iter = NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04002440 PyObject *obj = TOP();
2441 PyTypeObject *type = Py_TYPE(obj);
2442
Yury Selivanova6f6edb2016-06-09 15:08:31 -04002443 if (type->tp_as_async != NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04002444 getter = type->tp_as_async->am_aiter;
Yury Selivanova6f6edb2016-06-09 15:08:31 -04002445 }
Yury Selivanov75445082015-05-11 22:57:16 -04002446
2447 if (getter != NULL) {
2448 iter = (*getter)(obj);
2449 Py_DECREF(obj);
2450 if (iter == NULL) {
2451 SET_TOP(NULL);
2452 goto error;
2453 }
2454 }
2455 else {
2456 SET_TOP(NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02002457 _PyErr_Format(tstate, PyExc_TypeError,
2458 "'async for' requires an object with "
2459 "__aiter__ method, got %.100s",
2460 type->tp_name);
Yury Selivanov75445082015-05-11 22:57:16 -04002461 Py_DECREF(obj);
2462 goto error;
2463 }
2464
Yury Selivanovfaa135a2017-10-06 02:08:57 -04002465 if (Py_TYPE(iter)->tp_as_async == NULL ||
2466 Py_TYPE(iter)->tp_as_async->am_anext == NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04002467
Yury Selivanov398ff912017-03-02 22:20:00 -05002468 SET_TOP(NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02002469 _PyErr_Format(tstate, PyExc_TypeError,
2470 "'async for' received an object from __aiter__ "
2471 "that does not implement __anext__: %.100s",
2472 Py_TYPE(iter)->tp_name);
Yury Selivanov75445082015-05-11 22:57:16 -04002473 Py_DECREF(iter);
2474 goto error;
Yury Selivanova6f6edb2016-06-09 15:08:31 -04002475 }
2476
Yury Selivanovfaa135a2017-10-06 02:08:57 -04002477 SET_TOP(iter);
Yury Selivanov75445082015-05-11 22:57:16 -04002478 DISPATCH();
2479 }
2480
Benjamin Petersonddd19492018-09-16 22:38:02 -07002481 case TARGET(GET_ANEXT): {
Yury Selivanov6ef05902015-05-28 11:21:31 -04002482 unaryfunc getter = NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04002483 PyObject *next_iter = NULL;
2484 PyObject *awaitable = NULL;
2485 PyObject *aiter = TOP();
2486 PyTypeObject *type = Py_TYPE(aiter);
2487
Yury Selivanoveb636452016-09-08 22:01:51 -07002488 if (PyAsyncGen_CheckExact(aiter)) {
2489 awaitable = type->tp_as_async->am_anext(aiter);
2490 if (awaitable == NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04002491 goto error;
2492 }
Yury Selivanoveb636452016-09-08 22:01:51 -07002493 } else {
2494 if (type->tp_as_async != NULL){
2495 getter = type->tp_as_async->am_anext;
2496 }
Yury Selivanov75445082015-05-11 22:57:16 -04002497
Yury Selivanoveb636452016-09-08 22:01:51 -07002498 if (getter != NULL) {
2499 next_iter = (*getter)(aiter);
2500 if (next_iter == NULL) {
2501 goto error;
2502 }
2503 }
2504 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02002505 _PyErr_Format(tstate, PyExc_TypeError,
2506 "'async for' requires an iterator with "
2507 "__anext__ method, got %.100s",
2508 type->tp_name);
Yury Selivanoveb636452016-09-08 22:01:51 -07002509 goto error;
2510 }
Yury Selivanov75445082015-05-11 22:57:16 -04002511
Yury Selivanoveb636452016-09-08 22:01:51 -07002512 awaitable = _PyCoro_GetAwaitableIter(next_iter);
2513 if (awaitable == NULL) {
Yury Selivanov398ff912017-03-02 22:20:00 -05002514 _PyErr_FormatFromCause(
Yury Selivanoveb636452016-09-08 22:01:51 -07002515 PyExc_TypeError,
2516 "'async for' received an invalid object "
2517 "from __anext__: %.100s",
2518 Py_TYPE(next_iter)->tp_name);
2519
2520 Py_DECREF(next_iter);
2521 goto error;
2522 } else {
2523 Py_DECREF(next_iter);
2524 }
2525 }
Yury Selivanov75445082015-05-11 22:57:16 -04002526
2527 PUSH(awaitable);
Serhiy Storchakada9c5132016-06-27 18:58:57 +03002528 PREDICT(LOAD_CONST);
Yury Selivanov75445082015-05-11 22:57:16 -04002529 DISPATCH();
2530 }
2531
Benjamin Petersonddd19492018-09-16 22:38:02 -07002532 case TARGET(GET_AWAITABLE): {
2533 PREDICTED(GET_AWAITABLE);
Yury Selivanov75445082015-05-11 22:57:16 -04002534 PyObject *iterable = TOP();
Yury Selivanov5376ba92015-06-22 12:19:30 -04002535 PyObject *iter = _PyCoro_GetAwaitableIter(iterable);
Yury Selivanov75445082015-05-11 22:57:16 -04002536
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03002537 if (iter == NULL) {
Mark Shannonfee55262019-11-21 09:11:43 +00002538 int opcode_at_minus_3 = 0;
2539 if ((next_instr - first_instr) > 2) {
2540 opcode_at_minus_3 = _Py_OPCODE(next_instr[-3]);
2541 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002542 format_awaitable_error(tstate, Py_TYPE(iterable),
Mark Shannonfee55262019-11-21 09:11:43 +00002543 opcode_at_minus_3,
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03002544 _Py_OPCODE(next_instr[-2]));
2545 }
2546
Yury Selivanov75445082015-05-11 22:57:16 -04002547 Py_DECREF(iterable);
2548
Yury Selivanovc724bae2016-03-02 11:30:46 -05002549 if (iter != NULL && PyCoro_CheckExact(iter)) {
2550 PyObject *yf = _PyGen_yf((PyGenObject*)iter);
2551 if (yf != NULL) {
2552 /* `iter` is a coroutine object that is being
2553 awaited, `yf` is a pointer to the current awaitable
2554 being awaited on. */
2555 Py_DECREF(yf);
2556 Py_CLEAR(iter);
Victor Stinner438a12d2019-05-24 17:01:38 +02002557 _PyErr_SetString(tstate, PyExc_RuntimeError,
2558 "coroutine is being awaited already");
Yury Selivanovc724bae2016-03-02 11:30:46 -05002559 /* The code below jumps to `error` if `iter` is NULL. */
2560 }
2561 }
2562
Yury Selivanov75445082015-05-11 22:57:16 -04002563 SET_TOP(iter); /* Even if it's NULL */
2564
2565 if (iter == NULL) {
2566 goto error;
2567 }
2568
Serhiy Storchakada9c5132016-06-27 18:58:57 +03002569 PREDICT(LOAD_CONST);
Yury Selivanov75445082015-05-11 22:57:16 -04002570 DISPATCH();
2571 }
2572
Benjamin Petersonddd19492018-09-16 22:38:02 -07002573 case TARGET(YIELD_FROM): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002574 PyObject *v = POP();
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07002575 PyObject *receiver = TOP();
Vladimir Matveev037245c2020-10-09 17:15:15 -07002576 PySendResult gen_status;
2577 if (tstate->c_tracefunc == NULL) {
2578 gen_status = PyIter_Send(receiver, v, &retval);
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05002579 } else {
Vladimir Matveev037245c2020-10-09 17:15:15 -07002580 _Py_IDENTIFIER(send);
2581 if (v == Py_None && PyIter_Check(receiver)) {
2582 retval = Py_TYPE(receiver)->tp_iternext(receiver);
Vladimir Matveev2b053612020-09-18 18:38:38 -07002583 }
2584 else {
Vladimir Matveev037245c2020-10-09 17:15:15 -07002585 retval = _PyObject_CallMethodIdOneArg(receiver, &PyId_send, v);
Vladimir Matveev2b053612020-09-18 18:38:38 -07002586 }
Vladimir Matveev2b053612020-09-18 18:38:38 -07002587 if (retval == NULL) {
2588 if (tstate->c_tracefunc != NULL
2589 && _PyErr_ExceptionMatches(tstate, PyExc_StopIteration))
Mark Shannon8e1b4062021-03-05 14:45:50 +00002590 call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj, tstate, f, &trace_info);
Vladimir Matveev2b053612020-09-18 18:38:38 -07002591 if (_PyGen_FetchStopIterationValue(&retval) == 0) {
2592 gen_status = PYGEN_RETURN;
2593 }
2594 else {
2595 gen_status = PYGEN_ERROR;
2596 }
2597 }
2598 else {
2599 gen_status = PYGEN_NEXT;
2600 }
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05002601 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002602 Py_DECREF(v);
Vladimir Matveev2b053612020-09-18 18:38:38 -07002603 if (gen_status == PYGEN_ERROR) {
2604 assert (retval == NULL);
2605 goto error;
2606 }
2607 if (gen_status == PYGEN_RETURN) {
2608 assert (retval != NULL);
2609
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07002610 Py_DECREF(receiver);
Vladimir Matveev2b053612020-09-18 18:38:38 -07002611 SET_TOP(retval);
2612 retval = NULL;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002613 DISPATCH();
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002614 }
Vladimir Matveev2b053612020-09-18 18:38:38 -07002615 assert (gen_status == PYGEN_NEXT);
Martin Panter95f53c12016-07-18 08:23:26 +00002616 /* receiver remains on stack, retval is value to be yielded */
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05002617 /* and repeat... */
Mark Shannonfcb55c02021-04-01 16:00:31 +01002618 assert(f->f_lasti > 0);
2619 f->f_lasti -= 1;
Mark Shannoncb9879b2020-07-17 11:44:23 +01002620 f->f_state = FRAME_SUSPENDED;
Victor Stinnerb7d8d8d2020-09-23 14:07:16 +02002621 f->f_stackdepth = (int)(stack_pointer - f->f_valuestack);
Mark Shannone7c9f4a2020-01-13 12:51:26 +00002622 goto exiting;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002623 }
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002624
Benjamin Petersonddd19492018-09-16 22:38:02 -07002625 case TARGET(YIELD_VALUE): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002626 retval = POP();
Yury Selivanoveb636452016-09-08 22:01:51 -07002627
2628 if (co->co_flags & CO_ASYNC_GENERATOR) {
2629 PyObject *w = _PyAsyncGenValueWrapperNew(retval);
2630 Py_DECREF(retval);
2631 if (w == NULL) {
2632 retval = NULL;
2633 goto error;
2634 }
2635 retval = w;
2636 }
Mark Shannoncb9879b2020-07-17 11:44:23 +01002637 f->f_state = FRAME_SUSPENDED;
Victor Stinnerb7d8d8d2020-09-23 14:07:16 +02002638 f->f_stackdepth = (int)(stack_pointer - f->f_valuestack);
Mark Shannone7c9f4a2020-01-13 12:51:26 +00002639 goto exiting;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002640 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002641
Mark Shannonb37181e2021-04-06 11:48:59 +01002642 case TARGET(GEN_START): {
2643 PyObject *none = POP();
2644 Py_DECREF(none);
2645 if (none != Py_None) {
2646 if (oparg > 2) {
2647 _PyErr_SetString(tstate, PyExc_SystemError,
2648 "Illegal kind for GEN_START");
2649 }
2650 else {
2651 static const char *gen_kind[3] = {
2652 "generator",
2653 "coroutine",
2654 "async generator"
2655 };
2656 _PyErr_Format(tstate, PyExc_TypeError,
2657 "can't send non-None value to a "
2658 "just-started %s",
2659 gen_kind[oparg]);
2660 }
2661 goto error;
2662 }
2663 DISPATCH();
2664 }
2665
Benjamin Petersonddd19492018-09-16 22:38:02 -07002666 case TARGET(POP_EXCEPT): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002667 PyObject *type, *value, *traceback;
2668 _PyErr_StackItem *exc_info;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002669 PyTryBlock *b = PyFrame_BlockPop(f);
2670 if (b->b_type != EXCEPT_HANDLER) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002671 _PyErr_SetString(tstate, PyExc_SystemError,
2672 "popped block is not an except handler");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002673 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002674 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002675 assert(STACK_LEVEL() >= (b)->b_level + 3 &&
2676 STACK_LEVEL() <= (b)->b_level + 4);
2677 exc_info = tstate->exc_info;
2678 type = exc_info->exc_type;
2679 value = exc_info->exc_value;
2680 traceback = exc_info->exc_traceback;
2681 exc_info->exc_type = POP();
2682 exc_info->exc_value = POP();
2683 exc_info->exc_traceback = POP();
2684 Py_XDECREF(type);
2685 Py_XDECREF(value);
2686 Py_XDECREF(traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002687 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002688 }
Benjamin Petersoneec3d712008-06-11 15:59:43 +00002689
Benjamin Petersonddd19492018-09-16 22:38:02 -07002690 case TARGET(POP_BLOCK): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002691 PyFrame_BlockPop(f);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002692 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002693 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002694
Mark Shannonfee55262019-11-21 09:11:43 +00002695 case TARGET(RERAISE): {
Mark Shannonbf353f32020-12-17 13:55:28 +00002696 assert(f->f_iblock > 0);
2697 if (oparg) {
2698 f->f_lasti = f->f_blockstack[f->f_iblock-1].b_handler;
2699 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002700 PyObject *exc = POP();
Mark Shannonfee55262019-11-21 09:11:43 +00002701 PyObject *val = POP();
2702 PyObject *tb = POP();
2703 assert(PyExceptionClass_Check(exc));
Victor Stinner61f4db82020-01-28 03:37:45 +01002704 _PyErr_Restore(tstate, exc, val, tb);
Mark Shannonfee55262019-11-21 09:11:43 +00002705 goto exception_unwind;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002706 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002707
Benjamin Petersonddd19492018-09-16 22:38:02 -07002708 case TARGET(END_ASYNC_FOR): {
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002709 PyObject *exc = POP();
2710 assert(PyExceptionClass_Check(exc));
2711 if (PyErr_GivenExceptionMatches(exc, PyExc_StopAsyncIteration)) {
2712 PyTryBlock *b = PyFrame_BlockPop(f);
2713 assert(b->b_type == EXCEPT_HANDLER);
2714 Py_DECREF(exc);
2715 UNWIND_EXCEPT_HANDLER(b);
2716 Py_DECREF(POP());
2717 JUMPBY(oparg);
Mark Shannon4958f5d2021-03-24 17:56:12 +00002718 DISPATCH();
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002719 }
2720 else {
2721 PyObject *val = POP();
2722 PyObject *tb = POP();
Victor Stinner438a12d2019-05-24 17:01:38 +02002723 _PyErr_Restore(tstate, exc, val, tb);
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002724 goto exception_unwind;
2725 }
2726 }
2727
Zackery Spytzce6a0702019-08-25 03:44:09 -06002728 case TARGET(LOAD_ASSERTION_ERROR): {
2729 PyObject *value = PyExc_AssertionError;
2730 Py_INCREF(value);
2731 PUSH(value);
Mark Shannon4958f5d2021-03-24 17:56:12 +00002732 DISPATCH();
Zackery Spytzce6a0702019-08-25 03:44:09 -06002733 }
2734
Benjamin Petersonddd19492018-09-16 22:38:02 -07002735 case TARGET(LOAD_BUILD_CLASS): {
Victor Stinner3c1e4812012-03-26 22:10:51 +02002736 _Py_IDENTIFIER(__build_class__);
Victor Stinnerb0b22422012-04-19 00:57:45 +02002737
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002738 PyObject *bc;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002739 if (PyDict_CheckExact(f->f_builtins)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002740 bc = _PyDict_GetItemIdWithError(f->f_builtins, &PyId___build_class__);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002741 if (bc == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002742 if (!_PyErr_Occurred(tstate)) {
2743 _PyErr_SetString(tstate, PyExc_NameError,
2744 "__build_class__ not found");
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002745 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002746 goto error;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002747 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002748 Py_INCREF(bc);
Victor Stinnerb0b22422012-04-19 00:57:45 +02002749 }
2750 else {
2751 PyObject *build_class_str = _PyUnicode_FromId(&PyId___build_class__);
2752 if (build_class_str == NULL)
Serhiy Storchaka70b72f02016-11-08 23:12:46 +02002753 goto error;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002754 bc = PyObject_GetItem(f->f_builtins, build_class_str);
2755 if (bc == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002756 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError))
2757 _PyErr_SetString(tstate, PyExc_NameError,
2758 "__build_class__ not found");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002759 goto error;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002760 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002761 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002762 PUSH(bc);
Benjamin Peterson00f86f22012-10-10 14:10:33 -04002763 DISPATCH();
Victor Stinner3c1e4812012-03-26 22:10:51 +02002764 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002765
Benjamin Petersonddd19492018-09-16 22:38:02 -07002766 case TARGET(STORE_NAME): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002767 PyObject *name = GETITEM(names, oparg);
2768 PyObject *v = POP();
2769 PyObject *ns = f->f_locals;
2770 int err;
2771 if (ns == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002772 _PyErr_Format(tstate, PyExc_SystemError,
2773 "no locals found when storing %R", name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002774 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002775 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002776 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002777 if (PyDict_CheckExact(ns))
2778 err = PyDict_SetItem(ns, name, v);
2779 else
2780 err = PyObject_SetItem(ns, name, v);
2781 Py_DECREF(v);
2782 if (err != 0)
2783 goto error;
2784 DISPATCH();
2785 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002786
Benjamin Petersonddd19492018-09-16 22:38:02 -07002787 case TARGET(DELETE_NAME): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002788 PyObject *name = GETITEM(names, oparg);
2789 PyObject *ns = f->f_locals;
2790 int err;
2791 if (ns == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002792 _PyErr_Format(tstate, PyExc_SystemError,
2793 "no locals when deleting %R", name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002794 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002795 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002796 err = PyObject_DelItem(ns, name);
2797 if (err != 0) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002798 format_exc_check_arg(tstate, PyExc_NameError,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002799 NAME_ERROR_MSG,
2800 name);
2801 goto error;
2802 }
2803 DISPATCH();
2804 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00002805
Benjamin Petersonddd19492018-09-16 22:38:02 -07002806 case TARGET(UNPACK_SEQUENCE): {
2807 PREDICTED(UNPACK_SEQUENCE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002808 PyObject *seq = POP(), *item, **items;
2809 if (PyTuple_CheckExact(seq) &&
2810 PyTuple_GET_SIZE(seq) == oparg) {
2811 items = ((PyTupleObject *)seq)->ob_item;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002812 while (oparg--) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002813 item = items[oparg];
2814 Py_INCREF(item);
2815 PUSH(item);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002816 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002817 } else if (PyList_CheckExact(seq) &&
2818 PyList_GET_SIZE(seq) == oparg) {
2819 items = ((PyListObject *)seq)->ob_item;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002820 while (oparg--) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002821 item = items[oparg];
2822 Py_INCREF(item);
2823 PUSH(item);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002824 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002825 } else if (unpack_iterable(tstate, seq, oparg, -1,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002826 stack_pointer + oparg)) {
costypetrisor8ed317f2018-07-31 20:55:14 +00002827 STACK_GROW(oparg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002828 } else {
2829 /* unpack_iterable() raised an exception */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002830 Py_DECREF(seq);
2831 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002832 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002833 Py_DECREF(seq);
Benjamin Peterson00f86f22012-10-10 14:10:33 -04002834 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002835 }
Guido van Rossum0368b722007-05-11 16:50:42 +00002836
Benjamin Petersonddd19492018-09-16 22:38:02 -07002837 case TARGET(UNPACK_EX): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002838 int totalargs = 1 + (oparg & 0xFF) + (oparg >> 8);
2839 PyObject *seq = POP();
2840
Victor Stinner438a12d2019-05-24 17:01:38 +02002841 if (unpack_iterable(tstate, seq, oparg & 0xFF, oparg >> 8,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002842 stack_pointer + totalargs)) {
2843 stack_pointer += totalargs;
2844 } else {
2845 Py_DECREF(seq);
2846 goto error;
2847 }
2848 Py_DECREF(seq);
2849 DISPATCH();
2850 }
2851
Benjamin Petersonddd19492018-09-16 22:38:02 -07002852 case TARGET(STORE_ATTR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002853 PyObject *name = GETITEM(names, oparg);
2854 PyObject *owner = TOP();
2855 PyObject *v = SECOND();
2856 int err;
costypetrisor8ed317f2018-07-31 20:55:14 +00002857 STACK_SHRINK(2);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002858 err = PyObject_SetAttr(owner, name, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002859 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002860 Py_DECREF(owner);
2861 if (err != 0)
2862 goto error;
2863 DISPATCH();
2864 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002865
Benjamin Petersonddd19492018-09-16 22:38:02 -07002866 case TARGET(DELETE_ATTR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002867 PyObject *name = GETITEM(names, oparg);
2868 PyObject *owner = POP();
2869 int err;
2870 err = PyObject_SetAttr(owner, name, (PyObject *)NULL);
2871 Py_DECREF(owner);
2872 if (err != 0)
2873 goto error;
2874 DISPATCH();
2875 }
2876
Benjamin Petersonddd19492018-09-16 22:38:02 -07002877 case TARGET(STORE_GLOBAL): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002878 PyObject *name = GETITEM(names, oparg);
2879 PyObject *v = POP();
2880 int err;
2881 err = PyDict_SetItem(f->f_globals, name, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002882 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002883 if (err != 0)
2884 goto error;
2885 DISPATCH();
2886 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002887
Benjamin Petersonddd19492018-09-16 22:38:02 -07002888 case TARGET(DELETE_GLOBAL): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002889 PyObject *name = GETITEM(names, oparg);
2890 int err;
2891 err = PyDict_DelItem(f->f_globals, name);
2892 if (err != 0) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002893 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
2894 format_exc_check_arg(tstate, PyExc_NameError,
2895 NAME_ERROR_MSG, name);
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002896 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002897 goto error;
Benjamin Peterson00f86f22012-10-10 14:10:33 -04002898 }
2899 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002900 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002901
Benjamin Petersonddd19492018-09-16 22:38:02 -07002902 case TARGET(LOAD_NAME): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002903 PyObject *name = GETITEM(names, oparg);
2904 PyObject *locals = f->f_locals;
2905 PyObject *v;
2906 if (locals == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002907 _PyErr_Format(tstate, PyExc_SystemError,
2908 "no locals when loading %R", name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002909 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002910 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002911 if (PyDict_CheckExact(locals)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002912 v = PyDict_GetItemWithError(locals, name);
2913 if (v != NULL) {
2914 Py_INCREF(v);
2915 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002916 else if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002917 goto error;
2918 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002919 }
2920 else {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002921 v = PyObject_GetItem(locals, name);
Victor Stinnere20310f2015-11-05 13:56:58 +01002922 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002923 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError))
Benjamin Peterson92722792012-12-15 12:51:05 -05002924 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02002925 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002926 }
2927 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002928 if (v == NULL) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002929 v = PyDict_GetItemWithError(f->f_globals, name);
2930 if (v != NULL) {
2931 Py_INCREF(v);
2932 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002933 else if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002934 goto error;
2935 }
2936 else {
Victor Stinnerb0b22422012-04-19 00:57:45 +02002937 if (PyDict_CheckExact(f->f_builtins)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002938 v = PyDict_GetItemWithError(f->f_builtins, name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002939 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002940 if (!_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +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);
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002944 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002945 goto error;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002946 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002947 Py_INCREF(v);
Victor Stinnerb0b22422012-04-19 00:57:45 +02002948 }
2949 else {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002950 v = PyObject_GetItem(f->f_builtins, name);
2951 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002952 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Victor Stinnerb0b22422012-04-19 00:57:45 +02002953 format_exc_check_arg(
Victor Stinner438a12d2019-05-24 17:01:38 +02002954 tstate, PyExc_NameError,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002955 NAME_ERROR_MSG, name);
Victor Stinner438a12d2019-05-24 17:01:38 +02002956 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002957 goto error;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002958 }
Benjamin Peterson20f9c3c2010-07-20 22:39:34 +00002959 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002960 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002961 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002962 PUSH(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002963 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002964 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002965
Benjamin Petersonddd19492018-09-16 22:38:02 -07002966 case TARGET(LOAD_GLOBAL): {
Inada Naoki91234a12019-06-03 21:30:58 +09002967 PyObject *name;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002968 PyObject *v;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002969 if (PyDict_CheckExact(f->f_globals)
Victor Stinnerb4efc962015-11-20 09:24:02 +01002970 && PyDict_CheckExact(f->f_builtins))
2971 {
Inada Naoki91234a12019-06-03 21:30:58 +09002972 OPCACHE_CHECK();
2973 if (co_opcache != NULL && co_opcache->optimized > 0) {
2974 _PyOpcache_LoadGlobal *lg = &co_opcache->u.lg;
2975
2976 if (lg->globals_ver ==
2977 ((PyDictObject *)f->f_globals)->ma_version_tag
2978 && lg->builtins_ver ==
2979 ((PyDictObject *)f->f_builtins)->ma_version_tag)
2980 {
2981 PyObject *ptr = lg->ptr;
2982 OPCACHE_STAT_GLOBAL_HIT();
2983 assert(ptr != NULL);
2984 Py_INCREF(ptr);
2985 PUSH(ptr);
2986 DISPATCH();
2987 }
2988 }
2989
2990 name = GETITEM(names, oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002991 v = _PyDict_LoadGlobal((PyDictObject *)f->f_globals,
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002992 (PyDictObject *)f->f_builtins,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002993 name);
2994 if (v == NULL) {
Victor Stinnera4860542021-02-19 15:08:54 +01002995 if (!_PyErr_Occurred(tstate)) {
Victor Stinnerb4efc962015-11-20 09:24:02 +01002996 /* _PyDict_LoadGlobal() returns NULL without raising
2997 * an exception if the key doesn't exist */
Victor Stinner438a12d2019-05-24 17:01:38 +02002998 format_exc_check_arg(tstate, PyExc_NameError,
Ezio Melotti04a29552013-03-03 15:12:44 +02002999 NAME_ERROR_MSG, name);
Victor Stinnerb4efc962015-11-20 09:24:02 +01003000 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003001 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003002 }
Inada Naoki91234a12019-06-03 21:30:58 +09003003
3004 if (co_opcache != NULL) {
3005 _PyOpcache_LoadGlobal *lg = &co_opcache->u.lg;
3006
3007 if (co_opcache->optimized == 0) {
3008 /* Wasn't optimized before. */
3009 OPCACHE_STAT_GLOBAL_OPT();
3010 } else {
3011 OPCACHE_STAT_GLOBAL_MISS();
3012 }
3013
3014 co_opcache->optimized = 1;
3015 lg->globals_ver =
3016 ((PyDictObject *)f->f_globals)->ma_version_tag;
3017 lg->builtins_ver =
3018 ((PyDictObject *)f->f_builtins)->ma_version_tag;
3019 lg->ptr = v; /* borrowed */
3020 }
3021
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003022 Py_INCREF(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003023 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003024 else {
3025 /* Slow-path if globals or builtins is not a dict */
Victor Stinnerb4efc962015-11-20 09:24:02 +01003026
3027 /* namespace 1: globals */
Inada Naoki91234a12019-06-03 21:30:58 +09003028 name = GETITEM(names, oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003029 v = PyObject_GetItem(f->f_globals, name);
3030 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003031 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Victor Stinner60a1d3c2015-11-05 13:55:20 +01003032 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02003033 }
3034 _PyErr_Clear(tstate);
Victor Stinner60a1d3c2015-11-05 13:55:20 +01003035
Victor Stinnerb4efc962015-11-20 09:24:02 +01003036 /* namespace 2: builtins */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003037 v = PyObject_GetItem(f->f_builtins, name);
3038 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003039 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003040 format_exc_check_arg(
Victor Stinner438a12d2019-05-24 17:01:38 +02003041 tstate, PyExc_NameError,
Ezio Melotti04a29552013-03-03 15:12:44 +02003042 NAME_ERROR_MSG, name);
Victor Stinner438a12d2019-05-24 17:01:38 +02003043 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003044 goto error;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003045 }
3046 }
3047 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003048 PUSH(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003049 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003050 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003051
Benjamin Petersonddd19492018-09-16 22:38:02 -07003052 case TARGET(DELETE_FAST): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003053 PyObject *v = GETLOCAL(oparg);
3054 if (v != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003055 SETLOCAL(oparg, NULL);
3056 DISPATCH();
3057 }
3058 format_exc_check_arg(
Victor Stinner438a12d2019-05-24 17:01:38 +02003059 tstate, PyExc_UnboundLocalError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003060 UNBOUNDLOCAL_ERROR_MSG,
3061 PyTuple_GetItem(co->co_varnames, oparg)
3062 );
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003063 goto error;
3064 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003065
Benjamin Petersonddd19492018-09-16 22:38:02 -07003066 case TARGET(DELETE_DEREF): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003067 PyObject *cell = freevars[oparg];
Raymond Hettingerc32f9db2016-11-12 04:10:35 -05003068 PyObject *oldobj = PyCell_GET(cell);
3069 if (oldobj != NULL) {
3070 PyCell_SET(cell, NULL);
3071 Py_DECREF(oldobj);
Benjamin Peterson00ebe2c2010-09-10 22:02:31 +00003072 DISPATCH();
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00003073 }
Victor Stinner438a12d2019-05-24 17:01:38 +02003074 format_exc_unbound(tstate, co, oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003075 goto error;
3076 }
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00003077
Benjamin Petersonddd19492018-09-16 22:38:02 -07003078 case TARGET(LOAD_CLOSURE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003079 PyObject *cell = freevars[oparg];
3080 Py_INCREF(cell);
3081 PUSH(cell);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003082 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003083 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003084
Benjamin Petersonddd19492018-09-16 22:38:02 -07003085 case TARGET(LOAD_CLASSDEREF): {
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04003086 PyObject *name, *value, *locals = f->f_locals;
Victor Stinnerd3dfd0e2013-05-16 23:48:01 +02003087 Py_ssize_t idx;
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04003088 assert(locals);
3089 assert(oparg >= PyTuple_GET_SIZE(co->co_cellvars));
3090 idx = oparg - PyTuple_GET_SIZE(co->co_cellvars);
3091 assert(idx >= 0 && idx < PyTuple_GET_SIZE(co->co_freevars));
3092 name = PyTuple_GET_ITEM(co->co_freevars, idx);
3093 if (PyDict_CheckExact(locals)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02003094 value = PyDict_GetItemWithError(locals, name);
3095 if (value != NULL) {
3096 Py_INCREF(value);
3097 }
Victor Stinner438a12d2019-05-24 17:01:38 +02003098 else if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02003099 goto error;
3100 }
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04003101 }
3102 else {
3103 value = PyObject_GetItem(locals, name);
Victor Stinnere20310f2015-11-05 13:56:58 +01003104 if (value == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003105 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04003106 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02003107 }
3108 _PyErr_Clear(tstate);
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04003109 }
3110 }
3111 if (!value) {
3112 PyObject *cell = freevars[oparg];
3113 value = PyCell_GET(cell);
3114 if (value == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003115 format_exc_unbound(tstate, co, oparg);
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04003116 goto error;
3117 }
3118 Py_INCREF(value);
3119 }
3120 PUSH(value);
3121 DISPATCH();
3122 }
3123
Benjamin Petersonddd19492018-09-16 22:38:02 -07003124 case TARGET(LOAD_DEREF): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003125 PyObject *cell = freevars[oparg];
3126 PyObject *value = PyCell_GET(cell);
3127 if (value == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003128 format_exc_unbound(tstate, co, oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003129 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003130 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003131 Py_INCREF(value);
3132 PUSH(value);
3133 DISPATCH();
3134 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003135
Benjamin Petersonddd19492018-09-16 22:38:02 -07003136 case TARGET(STORE_DEREF): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003137 PyObject *v = POP();
3138 PyObject *cell = freevars[oparg];
Raymond Hettingerb2b15432016-11-11 04:32:11 -08003139 PyObject *oldobj = PyCell_GET(cell);
3140 PyCell_SET(cell, v);
3141 Py_XDECREF(oldobj);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003142 DISPATCH();
3143 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003144
Benjamin Petersonddd19492018-09-16 22:38:02 -07003145 case TARGET(BUILD_STRING): {
Serhiy Storchakaea525a22016-09-06 22:07:53 +03003146 PyObject *str;
3147 PyObject *empty = PyUnicode_New(0, 0);
3148 if (empty == NULL) {
3149 goto error;
3150 }
3151 str = _PyUnicode_JoinArray(empty, stack_pointer - oparg, oparg);
3152 Py_DECREF(empty);
3153 if (str == NULL)
3154 goto error;
3155 while (--oparg >= 0) {
3156 PyObject *item = POP();
3157 Py_DECREF(item);
3158 }
3159 PUSH(str);
3160 DISPATCH();
3161 }
3162
Benjamin Petersonddd19492018-09-16 22:38:02 -07003163 case TARGET(BUILD_TUPLE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003164 PyObject *tup = PyTuple_New(oparg);
3165 if (tup == NULL)
3166 goto error;
3167 while (--oparg >= 0) {
3168 PyObject *item = POP();
3169 PyTuple_SET_ITEM(tup, oparg, item);
3170 }
3171 PUSH(tup);
3172 DISPATCH();
3173 }
3174
Benjamin Petersonddd19492018-09-16 22:38:02 -07003175 case TARGET(BUILD_LIST): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003176 PyObject *list = PyList_New(oparg);
3177 if (list == NULL)
3178 goto error;
3179 while (--oparg >= 0) {
3180 PyObject *item = POP();
3181 PyList_SET_ITEM(list, oparg, item);
3182 }
3183 PUSH(list);
3184 DISPATCH();
3185 }
3186
Mark Shannon13bc1392020-01-23 09:25:17 +00003187 case TARGET(LIST_TO_TUPLE): {
3188 PyObject *list = POP();
3189 PyObject *tuple = PyList_AsTuple(list);
3190 Py_DECREF(list);
3191 if (tuple == NULL) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003192 goto error;
Mark Shannon13bc1392020-01-23 09:25:17 +00003193 }
3194 PUSH(tuple);
3195 DISPATCH();
3196 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003197
Mark Shannon13bc1392020-01-23 09:25:17 +00003198 case TARGET(LIST_EXTEND): {
3199 PyObject *iterable = POP();
3200 PyObject *list = PEEK(oparg);
3201 PyObject *none_val = _PyList_Extend((PyListObject *)list, iterable);
3202 if (none_val == NULL) {
3203 if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError) &&
Victor Stinnera102ed72020-02-07 02:24:48 +01003204 (Py_TYPE(iterable)->tp_iter == NULL && !PySequence_Check(iterable)))
Mark Shannon13bc1392020-01-23 09:25:17 +00003205 {
Victor Stinner61f4db82020-01-28 03:37:45 +01003206 _PyErr_Clear(tstate);
Mark Shannon13bc1392020-01-23 09:25:17 +00003207 _PyErr_Format(tstate, PyExc_TypeError,
3208 "Value after * must be an iterable, not %.200s",
3209 Py_TYPE(iterable)->tp_name);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003210 }
Mark Shannon13bc1392020-01-23 09:25:17 +00003211 Py_DECREF(iterable);
3212 goto error;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003213 }
Mark Shannon13bc1392020-01-23 09:25:17 +00003214 Py_DECREF(none_val);
3215 Py_DECREF(iterable);
3216 DISPATCH();
3217 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003218
Mark Shannon13bc1392020-01-23 09:25:17 +00003219 case TARGET(SET_UPDATE): {
3220 PyObject *iterable = POP();
3221 PyObject *set = PEEK(oparg);
3222 int err = _PySet_Update(set, iterable);
3223 Py_DECREF(iterable);
3224 if (err < 0) {
3225 goto error;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003226 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003227 DISPATCH();
3228 }
3229
Benjamin Petersonddd19492018-09-16 22:38:02 -07003230 case TARGET(BUILD_SET): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003231 PyObject *set = PySet_New(NULL);
3232 int err = 0;
Raymond Hettinger4c483ad2016-09-08 14:45:40 -07003233 int i;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003234 if (set == NULL)
3235 goto error;
Raymond Hettinger4c483ad2016-09-08 14:45:40 -07003236 for (i = oparg; i > 0; i--) {
3237 PyObject *item = PEEK(i);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003238 if (err == 0)
3239 err = PySet_Add(set, item);
3240 Py_DECREF(item);
3241 }
costypetrisor8ed317f2018-07-31 20:55:14 +00003242 STACK_SHRINK(oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003243 if (err != 0) {
3244 Py_DECREF(set);
3245 goto error;
3246 }
3247 PUSH(set);
3248 DISPATCH();
3249 }
3250
Benjamin Petersonddd19492018-09-16 22:38:02 -07003251 case TARGET(BUILD_MAP): {
Victor Stinner74319ae2016-08-25 00:04:09 +02003252 Py_ssize_t i;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003253 PyObject *map = _PyDict_NewPresized((Py_ssize_t)oparg);
3254 if (map == NULL)
3255 goto error;
Benjamin Petersond5d77aa2015-07-05 10:37:25 -05003256 for (i = oparg; i > 0; i--) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003257 int err;
Benjamin Petersond5d77aa2015-07-05 10:37:25 -05003258 PyObject *key = PEEK(2*i);
3259 PyObject *value = PEEK(2*i - 1);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003260 err = PyDict_SetItem(map, key, value);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003261 if (err != 0) {
3262 Py_DECREF(map);
3263 goto error;
3264 }
3265 }
Benjamin Petersond5d77aa2015-07-05 10:37:25 -05003266
3267 while (oparg--) {
3268 Py_DECREF(POP());
3269 Py_DECREF(POP());
3270 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003271 PUSH(map);
3272 DISPATCH();
3273 }
3274
Benjamin Petersonddd19492018-09-16 22:38:02 -07003275 case TARGET(SETUP_ANNOTATIONS): {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003276 _Py_IDENTIFIER(__annotations__);
3277 int err;
3278 PyObject *ann_dict;
3279 if (f->f_locals == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003280 _PyErr_Format(tstate, PyExc_SystemError,
3281 "no locals found when setting up annotations");
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003282 goto error;
3283 }
3284 /* check if __annotations__ in locals()... */
3285 if (PyDict_CheckExact(f->f_locals)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02003286 ann_dict = _PyDict_GetItemIdWithError(f->f_locals,
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003287 &PyId___annotations__);
3288 if (ann_dict == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003289 if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02003290 goto error;
3291 }
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003292 /* ...if not, create a new one */
3293 ann_dict = PyDict_New();
3294 if (ann_dict == NULL) {
3295 goto error;
3296 }
3297 err = _PyDict_SetItemId(f->f_locals,
3298 &PyId___annotations__, ann_dict);
3299 Py_DECREF(ann_dict);
3300 if (err != 0) {
3301 goto error;
3302 }
3303 }
3304 }
3305 else {
3306 /* do the same if locals() is not a dict */
3307 PyObject *ann_str = _PyUnicode_FromId(&PyId___annotations__);
3308 if (ann_str == NULL) {
Serhiy Storchaka4678b2f2016-11-08 23:13:36 +02003309 goto error;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003310 }
3311 ann_dict = PyObject_GetItem(f->f_locals, ann_str);
3312 if (ann_dict == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003313 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003314 goto error;
3315 }
Victor Stinner438a12d2019-05-24 17:01:38 +02003316 _PyErr_Clear(tstate);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003317 ann_dict = PyDict_New();
3318 if (ann_dict == NULL) {
3319 goto error;
3320 }
3321 err = PyObject_SetItem(f->f_locals, ann_str, ann_dict);
3322 Py_DECREF(ann_dict);
3323 if (err != 0) {
3324 goto error;
3325 }
3326 }
3327 else {
3328 Py_DECREF(ann_dict);
3329 }
3330 }
3331 DISPATCH();
3332 }
3333
Benjamin Petersonddd19492018-09-16 22:38:02 -07003334 case TARGET(BUILD_CONST_KEY_MAP): {
Victor Stinner74319ae2016-08-25 00:04:09 +02003335 Py_ssize_t i;
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003336 PyObject *map;
3337 PyObject *keys = TOP();
3338 if (!PyTuple_CheckExact(keys) ||
3339 PyTuple_GET_SIZE(keys) != (Py_ssize_t)oparg) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003340 _PyErr_SetString(tstate, PyExc_SystemError,
3341 "bad BUILD_CONST_KEY_MAP keys argument");
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003342 goto error;
3343 }
3344 map = _PyDict_NewPresized((Py_ssize_t)oparg);
3345 if (map == NULL) {
3346 goto error;
3347 }
3348 for (i = oparg; i > 0; i--) {
3349 int err;
3350 PyObject *key = PyTuple_GET_ITEM(keys, oparg - i);
3351 PyObject *value = PEEK(i + 1);
3352 err = PyDict_SetItem(map, key, value);
3353 if (err != 0) {
3354 Py_DECREF(map);
3355 goto error;
3356 }
3357 }
3358
3359 Py_DECREF(POP());
3360 while (oparg--) {
3361 Py_DECREF(POP());
3362 }
3363 PUSH(map);
3364 DISPATCH();
3365 }
3366
Mark Shannon8a4cd702020-01-27 09:57:45 +00003367 case TARGET(DICT_UPDATE): {
3368 PyObject *update = POP();
3369 PyObject *dict = PEEK(oparg);
3370 if (PyDict_Update(dict, update) < 0) {
3371 if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) {
3372 _PyErr_Format(tstate, PyExc_TypeError,
3373 "'%.200s' object is not a mapping",
Victor Stinnera102ed72020-02-07 02:24:48 +01003374 Py_TYPE(update)->tp_name);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003375 }
Mark Shannon8a4cd702020-01-27 09:57:45 +00003376 Py_DECREF(update);
3377 goto error;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003378 }
Mark Shannon8a4cd702020-01-27 09:57:45 +00003379 Py_DECREF(update);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003380 DISPATCH();
3381 }
3382
Mark Shannon8a4cd702020-01-27 09:57:45 +00003383 case TARGET(DICT_MERGE): {
3384 PyObject *update = POP();
3385 PyObject *dict = PEEK(oparg);
3386
3387 if (_PyDict_MergeEx(dict, update, 2) < 0) {
3388 format_kwargs_error(tstate, PEEK(2 + oparg), update);
3389 Py_DECREF(update);
Serhiy Storchakae036ef82016-10-02 11:06:43 +03003390 goto error;
Serhiy Storchakae036ef82016-10-02 11:06:43 +03003391 }
Mark Shannon8a4cd702020-01-27 09:57:45 +00003392 Py_DECREF(update);
Brandt Bucherf185a732019-09-28 17:12:49 -07003393 PREDICT(CALL_FUNCTION_EX);
Serhiy Storchakae036ef82016-10-02 11:06:43 +03003394 DISPATCH();
3395 }
3396
Benjamin Petersonddd19492018-09-16 22:38:02 -07003397 case TARGET(MAP_ADD): {
Jörn Heisslerc8a35412019-06-22 16:40:55 +02003398 PyObject *value = TOP();
3399 PyObject *key = SECOND();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003400 PyObject *map;
3401 int err;
costypetrisor8ed317f2018-07-31 20:55:14 +00003402 STACK_SHRINK(2);
Raymond Hettinger41862222016-10-15 19:03:06 -07003403 map = PEEK(oparg); /* dict */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003404 assert(PyDict_CheckExact(map));
Martin Panter95f53c12016-07-18 08:23:26 +00003405 err = PyDict_SetItem(map, key, value); /* map[key] = value */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003406 Py_DECREF(value);
3407 Py_DECREF(key);
3408 if (err != 0)
3409 goto error;
3410 PREDICT(JUMP_ABSOLUTE);
3411 DISPATCH();
3412 }
3413
Benjamin Petersonddd19492018-09-16 22:38:02 -07003414 case TARGET(LOAD_ATTR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003415 PyObject *name = GETITEM(names, oparg);
3416 PyObject *owner = TOP();
Pablo Galindo109826c2020-10-20 06:22:44 +01003417
3418 PyTypeObject *type = Py_TYPE(owner);
3419 PyObject *res;
3420 PyObject **dictptr;
3421 PyObject *dict;
3422 _PyOpCodeOpt_LoadAttr *la;
3423
3424 OPCACHE_STAT_ATTR_TOTAL();
3425
3426 OPCACHE_CHECK();
3427 if (co_opcache != NULL && PyType_HasFeature(type, Py_TPFLAGS_VALID_VERSION_TAG))
3428 {
3429 if (co_opcache->optimized > 0) {
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003430 // Fast path -- cache hit makes LOAD_ATTR ~30% faster.
Pablo Galindo109826c2020-10-20 06:22:44 +01003431 la = &co_opcache->u.la;
3432 if (la->type == type && la->tp_version_tag == type->tp_version_tag)
3433 {
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003434 // Hint >= 0 is a dict index; hint == -1 is a dict miss.
3435 // Hint < -1 is an inverted slot offset: offset is strictly > 0,
3436 // so ~offset is strictly < -1 (assuming 2's complement).
3437 if (la->hint < -1) {
3438 // Even faster path -- slot hint.
3439 Py_ssize_t offset = ~la->hint;
3440 // fprintf(stderr, "Using hint for offset %zd\n", offset);
3441 char *addr = (char *)owner + offset;
3442 res = *(PyObject **)addr;
Pablo Galindo109826c2020-10-20 06:22:44 +01003443 if (res != NULL) {
Pablo Galindo109826c2020-10-20 06:22:44 +01003444 Py_INCREF(res);
3445 SET_TOP(res);
3446 Py_DECREF(owner);
Pablo Galindo109826c2020-10-20 06:22:44 +01003447 DISPATCH();
Pablo Galindo109826c2020-10-20 06:22:44 +01003448 }
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003449 // Else slot is NULL. Fall through to slow path to raise AttributeError(name).
3450 // Don't DEOPT, since the slot is still there.
Pablo Galindo109826c2020-10-20 06:22:44 +01003451 } else {
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003452 // Fast path for dict.
3453 assert(type->tp_dict != NULL);
3454 assert(type->tp_dictoffset > 0);
3455
3456 dictptr = (PyObject **) ((char *)owner + type->tp_dictoffset);
3457 dict = *dictptr;
3458 if (dict != NULL && PyDict_CheckExact(dict)) {
3459 Py_ssize_t hint = la->hint;
3460 Py_INCREF(dict);
3461 res = NULL;
Victor Stinnerd5fc9982021-02-21 12:02:04 +01003462 assert(!_PyErr_Occurred(tstate));
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003463 la->hint = _PyDict_GetItemHint((PyDictObject*)dict, name, hint, &res);
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003464 if (res != NULL) {
Victor Stinnerd5fc9982021-02-21 12:02:04 +01003465 assert(la->hint >= 0);
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003466 if (la->hint == hint && hint >= 0) {
3467 // Our hint has helped -- cache hit.
3468 OPCACHE_STAT_ATTR_HIT();
3469 } else {
3470 // The hint we provided didn't work.
3471 // Maybe next time?
3472 OPCACHE_MAYBE_DEOPT_LOAD_ATTR();
3473 }
3474
3475 Py_INCREF(res);
3476 SET_TOP(res);
3477 Py_DECREF(owner);
3478 Py_DECREF(dict);
3479 DISPATCH();
Victor Stinnerd5fc9982021-02-21 12:02:04 +01003480 }
3481 else {
3482 _PyErr_Clear(tstate);
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003483 // This attribute can be missing sometimes;
3484 // we don't want to optimize this lookup.
3485 OPCACHE_DEOPT_LOAD_ATTR();
3486 Py_DECREF(dict);
3487 }
Victor Stinnerd5fc9982021-02-21 12:02:04 +01003488 }
3489 else {
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003490 // There is no dict, or __dict__ doesn't satisfy PyDict_CheckExact.
3491 OPCACHE_DEOPT_LOAD_ATTR();
3492 }
Pablo Galindo109826c2020-10-20 06:22:44 +01003493 }
Victor Stinnerd5fc9982021-02-21 12:02:04 +01003494 }
3495 else {
Pablo Galindo109826c2020-10-20 06:22:44 +01003496 // The type of the object has either been updated,
3497 // or is different. Maybe it will stabilize?
3498 OPCACHE_MAYBE_DEOPT_LOAD_ATTR();
3499 }
Pablo Galindo109826c2020-10-20 06:22:44 +01003500 OPCACHE_STAT_ATTR_MISS();
3501 }
3502
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003503 if (co_opcache != NULL && // co_opcache can be NULL after a DEOPT() call.
Pablo Galindo109826c2020-10-20 06:22:44 +01003504 type->tp_getattro == PyObject_GenericGetAttr)
3505 {
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003506 if (type->tp_dict == NULL) {
3507 if (PyType_Ready(type) < 0) {
3508 Py_DECREF(owner);
3509 SET_TOP(NULL);
3510 goto error;
Pablo Galindo109826c2020-10-20 06:22:44 +01003511 }
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003512 }
3513 PyObject *descr = _PyType_Lookup(type, name);
3514 if (descr != NULL) {
3515 // We found an attribute with a data-like descriptor.
3516 PyTypeObject *dtype = Py_TYPE(descr);
3517 if (dtype == &PyMemberDescr_Type) { // It's a slot
3518 PyMemberDescrObject *member = (PyMemberDescrObject *)descr;
3519 struct PyMemberDef *dmem = member->d_member;
3520 if (dmem->type == T_OBJECT_EX) {
3521 Py_ssize_t offset = dmem->offset;
3522 assert(offset > 0); // 0 would be confused with dict hint == -1 (miss).
Pablo Galindo109826c2020-10-20 06:22:44 +01003523
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003524 if (co_opcache->optimized == 0) {
3525 // First time we optimize this opcode.
3526 OPCACHE_STAT_ATTR_OPT();
3527 co_opcache->optimized = OPCODE_CACHE_MAX_TRIES;
3528 // fprintf(stderr, "Setting hint for %s, offset %zd\n", dmem->name, offset);
3529 }
3530
3531 la = &co_opcache->u.la;
3532 la->type = type;
3533 la->tp_version_tag = type->tp_version_tag;
3534 la->hint = ~offset;
3535
3536 char *addr = (char *)owner + offset;
3537 res = *(PyObject **)addr;
Pablo Galindo109826c2020-10-20 06:22:44 +01003538 if (res != NULL) {
3539 Py_INCREF(res);
Pablo Galindo109826c2020-10-20 06:22:44 +01003540 Py_DECREF(owner);
3541 SET_TOP(res);
3542
Pablo Galindo109826c2020-10-20 06:22:44 +01003543 DISPATCH();
3544 }
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003545 // Else slot is NULL. Fall through to slow path to raise AttributeError(name).
Pablo Galindo109826c2020-10-20 06:22:44 +01003546 }
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003547 // Else it's a slot of a different type. We don't handle those.
3548 }
3549 // Else it's some other kind of descriptor that we don't handle.
3550 OPCACHE_DEOPT_LOAD_ATTR();
Victor Stinnerd5fc9982021-02-21 12:02:04 +01003551 }
3552 else if (type->tp_dictoffset > 0) {
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003553 // We found an instance with a __dict__.
3554 dictptr = (PyObject **) ((char *)owner + type->tp_dictoffset);
3555 dict = *dictptr;
3556
3557 if (dict != NULL && PyDict_CheckExact(dict)) {
3558 Py_INCREF(dict);
3559 res = NULL;
Victor Stinnerd5fc9982021-02-21 12:02:04 +01003560 assert(!_PyErr_Occurred(tstate));
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003561 Py_ssize_t hint = _PyDict_GetItemHint((PyDictObject*)dict, name, -1, &res);
3562 if (res != NULL) {
3563 Py_INCREF(res);
3564 Py_DECREF(dict);
3565 Py_DECREF(owner);
3566 SET_TOP(res);
3567
3568 if (co_opcache->optimized == 0) {
3569 // First time we optimize this opcode.
3570 OPCACHE_STAT_ATTR_OPT();
3571 co_opcache->optimized = OPCODE_CACHE_MAX_TRIES;
3572 }
3573
3574 la = &co_opcache->u.la;
3575 la->type = type;
3576 la->tp_version_tag = type->tp_version_tag;
Victor Stinnerd5fc9982021-02-21 12:02:04 +01003577 assert(hint >= 0);
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003578 la->hint = hint;
3579
3580 DISPATCH();
3581 }
Victor Stinnerd5fc9982021-02-21 12:02:04 +01003582 else {
3583 _PyErr_Clear(tstate);
3584 }
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003585 Py_DECREF(dict);
Pablo Galindo109826c2020-10-20 06:22:44 +01003586 } else {
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003587 // There is no dict, or __dict__ doesn't satisfy PyDict_CheckExact.
Pablo Galindo109826c2020-10-20 06:22:44 +01003588 OPCACHE_DEOPT_LOAD_ATTR();
3589 }
3590 } else {
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003591 // The object's class does not have a tp_dictoffset we can use.
Pablo Galindo109826c2020-10-20 06:22:44 +01003592 OPCACHE_DEOPT_LOAD_ATTR();
3593 }
3594 } else if (type->tp_getattro != PyObject_GenericGetAttr) {
3595 OPCACHE_DEOPT_LOAD_ATTR();
3596 }
3597 }
3598
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003599 // Slow path.
Pablo Galindo109826c2020-10-20 06:22:44 +01003600 res = PyObject_GetAttr(owner, name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003601 Py_DECREF(owner);
3602 SET_TOP(res);
3603 if (res == NULL)
3604 goto error;
3605 DISPATCH();
3606 }
3607
Benjamin Petersonddd19492018-09-16 22:38:02 -07003608 case TARGET(COMPARE_OP): {
Mark Shannon9af0e472020-01-14 10:12:45 +00003609 assert(oparg <= Py_GE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003610 PyObject *right = POP();
3611 PyObject *left = TOP();
Mark Shannon9af0e472020-01-14 10:12:45 +00003612 PyObject *res = PyObject_RichCompare(left, right, oparg);
3613 SET_TOP(res);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003614 Py_DECREF(left);
3615 Py_DECREF(right);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003616 if (res == NULL)
3617 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003618 PREDICT(POP_JUMP_IF_FALSE);
3619 PREDICT(POP_JUMP_IF_TRUE);
3620 DISPATCH();
Victor Stinner3c1e4812012-03-26 22:10:51 +02003621 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003622
Mark Shannon9af0e472020-01-14 10:12:45 +00003623 case TARGET(IS_OP): {
3624 PyObject *right = POP();
3625 PyObject *left = TOP();
3626 int res = (left == right)^oparg;
3627 PyObject *b = res ? Py_True : Py_False;
3628 Py_INCREF(b);
3629 SET_TOP(b);
3630 Py_DECREF(left);
3631 Py_DECREF(right);
3632 PREDICT(POP_JUMP_IF_FALSE);
3633 PREDICT(POP_JUMP_IF_TRUE);
Mark Shannon4958f5d2021-03-24 17:56:12 +00003634 DISPATCH();
Mark Shannon9af0e472020-01-14 10:12:45 +00003635 }
3636
3637 case TARGET(CONTAINS_OP): {
3638 PyObject *right = POP();
3639 PyObject *left = POP();
3640 int res = PySequence_Contains(right, left);
3641 Py_DECREF(left);
3642 Py_DECREF(right);
3643 if (res < 0) {
3644 goto error;
3645 }
3646 PyObject *b = (res^oparg) ? Py_True : Py_False;
3647 Py_INCREF(b);
3648 PUSH(b);
3649 PREDICT(POP_JUMP_IF_FALSE);
3650 PREDICT(POP_JUMP_IF_TRUE);
Mark Shannon4958f5d2021-03-24 17:56:12 +00003651 DISPATCH();
Mark Shannon9af0e472020-01-14 10:12:45 +00003652 }
3653
3654#define CANNOT_CATCH_MSG "catching classes that do not inherit from "\
3655 "BaseException is not allowed"
3656
3657 case TARGET(JUMP_IF_NOT_EXC_MATCH): {
3658 PyObject *right = POP();
3659 PyObject *left = POP();
3660 if (PyTuple_Check(right)) {
3661 Py_ssize_t i, length;
3662 length = PyTuple_GET_SIZE(right);
3663 for (i = 0; i < length; i++) {
3664 PyObject *exc = PyTuple_GET_ITEM(right, i);
3665 if (!PyExceptionClass_Check(exc)) {
3666 _PyErr_SetString(tstate, PyExc_TypeError,
3667 CANNOT_CATCH_MSG);
3668 Py_DECREF(left);
3669 Py_DECREF(right);
3670 goto error;
3671 }
3672 }
3673 }
3674 else {
3675 if (!PyExceptionClass_Check(right)) {
3676 _PyErr_SetString(tstate, PyExc_TypeError,
3677 CANNOT_CATCH_MSG);
3678 Py_DECREF(left);
3679 Py_DECREF(right);
3680 goto error;
3681 }
3682 }
3683 int res = PyErr_GivenExceptionMatches(left, right);
3684 Py_DECREF(left);
3685 Py_DECREF(right);
3686 if (res > 0) {
3687 /* Exception matches -- Do nothing */;
3688 }
3689 else if (res == 0) {
3690 JUMPTO(oparg);
3691 }
3692 else {
3693 goto error;
3694 }
3695 DISPATCH();
3696 }
3697
Benjamin Petersonddd19492018-09-16 22:38:02 -07003698 case TARGET(IMPORT_NAME): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003699 PyObject *name = GETITEM(names, oparg);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03003700 PyObject *fromlist = POP();
3701 PyObject *level = TOP();
3702 PyObject *res;
Victor Stinner438a12d2019-05-24 17:01:38 +02003703 res = import_name(tstate, f, name, fromlist, level);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03003704 Py_DECREF(level);
3705 Py_DECREF(fromlist);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003706 SET_TOP(res);
3707 if (res == NULL)
3708 goto error;
3709 DISPATCH();
3710 }
3711
Benjamin Petersonddd19492018-09-16 22:38:02 -07003712 case TARGET(IMPORT_STAR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003713 PyObject *from = POP(), *locals;
3714 int err;
Matthias Bussonnier160edb42017-02-25 21:58:05 -08003715 if (PyFrame_FastToLocalsWithError(f) < 0) {
3716 Py_DECREF(from);
Victor Stinner41bb43a2013-10-29 01:19:37 +01003717 goto error;
Matthias Bussonnier160edb42017-02-25 21:58:05 -08003718 }
Victor Stinner41bb43a2013-10-29 01:19:37 +01003719
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003720 locals = f->f_locals;
3721 if (locals == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003722 _PyErr_SetString(tstate, PyExc_SystemError,
3723 "no locals found during 'import *'");
Matthias Bussonnier160edb42017-02-25 21:58:05 -08003724 Py_DECREF(from);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003725 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003726 }
Victor Stinner438a12d2019-05-24 17:01:38 +02003727 err = import_all_from(tstate, locals, from);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003728 PyFrame_LocalsToFast(f, 0);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003729 Py_DECREF(from);
3730 if (err != 0)
3731 goto error;
3732 DISPATCH();
3733 }
Guido van Rossum25831651993-05-19 14:50:45 +00003734
Benjamin Petersonddd19492018-09-16 22:38:02 -07003735 case TARGET(IMPORT_FROM): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003736 PyObject *name = GETITEM(names, oparg);
3737 PyObject *from = TOP();
3738 PyObject *res;
Victor Stinner438a12d2019-05-24 17:01:38 +02003739 res = import_from(tstate, from, name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003740 PUSH(res);
3741 if (res == NULL)
3742 goto error;
3743 DISPATCH();
3744 }
Thomas Wouters52152252000-08-17 22:55:00 +00003745
Benjamin Petersonddd19492018-09-16 22:38:02 -07003746 case TARGET(JUMP_FORWARD): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003747 JUMPBY(oparg);
Mark Shannon4958f5d2021-03-24 17:56:12 +00003748 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003749 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003750
Benjamin Petersonddd19492018-09-16 22:38:02 -07003751 case TARGET(POP_JUMP_IF_FALSE): {
3752 PREDICTED(POP_JUMP_IF_FALSE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003753 PyObject *cond = POP();
3754 int err;
3755 if (cond == Py_True) {
3756 Py_DECREF(cond);
Mark Shannon4958f5d2021-03-24 17:56:12 +00003757 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003758 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003759 if (cond == Py_False) {
3760 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003761 JUMPTO(oparg);
Mark Shannon4958f5d2021-03-24 17:56:12 +00003762 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003763 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003764 err = PyObject_IsTrue(cond);
3765 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003766 if (err > 0)
Adrian Wielgosik50c28502017-06-23 13:35:41 -07003767 ;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003768 else if (err == 0)
3769 JUMPTO(oparg);
3770 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003771 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003772 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003773 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003774
Benjamin Petersonddd19492018-09-16 22:38:02 -07003775 case TARGET(POP_JUMP_IF_TRUE): {
3776 PREDICTED(POP_JUMP_IF_TRUE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003777 PyObject *cond = POP();
3778 int err;
3779 if (cond == Py_False) {
3780 Py_DECREF(cond);
Mark Shannon4958f5d2021-03-24 17:56:12 +00003781 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003782 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003783 if (cond == Py_True) {
3784 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003785 JUMPTO(oparg);
Mark Shannon4958f5d2021-03-24 17:56:12 +00003786 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003787 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003788 err = PyObject_IsTrue(cond);
3789 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003790 if (err > 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003791 JUMPTO(oparg);
3792 }
3793 else if (err == 0)
3794 ;
3795 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003796 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003797 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003798 }
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00003799
Benjamin Petersonddd19492018-09-16 22:38:02 -07003800 case TARGET(JUMP_IF_FALSE_OR_POP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003801 PyObject *cond = TOP();
3802 int err;
3803 if (cond == Py_True) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003804 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003805 Py_DECREF(cond);
Mark Shannon4958f5d2021-03-24 17:56:12 +00003806 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003807 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003808 if (cond == Py_False) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003809 JUMPTO(oparg);
Mark Shannon4958f5d2021-03-24 17:56:12 +00003810 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003811 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003812 err = PyObject_IsTrue(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003813 if (err > 0) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003814 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003815 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003816 }
3817 else if (err == 0)
3818 JUMPTO(oparg);
3819 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003820 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003821 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003822 }
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00003823
Benjamin Petersonddd19492018-09-16 22:38:02 -07003824 case TARGET(JUMP_IF_TRUE_OR_POP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003825 PyObject *cond = TOP();
3826 int err;
3827 if (cond == Py_False) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003828 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003829 Py_DECREF(cond);
Mark Shannon4958f5d2021-03-24 17:56:12 +00003830 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003831 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003832 if (cond == Py_True) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003833 JUMPTO(oparg);
Mark Shannon4958f5d2021-03-24 17:56:12 +00003834 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003835 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003836 err = PyObject_IsTrue(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003837 if (err > 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003838 JUMPTO(oparg);
3839 }
3840 else if (err == 0) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003841 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003842 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003843 }
3844 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003845 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003846 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003847 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003848
Benjamin Petersonddd19492018-09-16 22:38:02 -07003849 case TARGET(JUMP_ABSOLUTE): {
3850 PREDICTED(JUMP_ABSOLUTE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003851 JUMPTO(oparg);
Mark Shannon4958f5d2021-03-24 17:56:12 +00003852 CHECK_EVAL_BREAKER();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003853 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003854 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003855
Brandt Bucher145bf262021-02-26 14:51:55 -08003856 case TARGET(GET_LEN): {
3857 // PUSH(len(TOS))
3858 Py_ssize_t len_i = PyObject_Length(TOP());
3859 if (len_i < 0) {
3860 goto error;
3861 }
3862 PyObject *len_o = PyLong_FromSsize_t(len_i);
3863 if (len_o == NULL) {
3864 goto error;
3865 }
3866 PUSH(len_o);
3867 DISPATCH();
3868 }
3869
3870 case TARGET(MATCH_CLASS): {
3871 // Pop TOS. On success, set TOS to True and TOS1 to a tuple of
3872 // attributes. On failure, set TOS to False.
3873 PyObject *names = POP();
3874 PyObject *type = TOP();
3875 PyObject *subject = SECOND();
3876 assert(PyTuple_CheckExact(names));
3877 PyObject *attrs = match_class(tstate, subject, type, oparg, names);
3878 Py_DECREF(names);
3879 if (attrs) {
3880 // Success!
3881 assert(PyTuple_CheckExact(attrs));
3882 Py_DECREF(subject);
3883 SET_SECOND(attrs);
3884 }
3885 else if (_PyErr_Occurred(tstate)) {
3886 goto error;
3887 }
3888 Py_DECREF(type);
3889 SET_TOP(PyBool_FromLong(!!attrs));
3890 DISPATCH();
3891 }
3892
3893 case TARGET(MATCH_MAPPING): {
3894 // PUSH(isinstance(TOS, _collections_abc.Mapping))
3895 PyObject *subject = TOP();
3896 // Fast path for dicts:
3897 if (PyDict_Check(subject)) {
3898 Py_INCREF(Py_True);
3899 PUSH(Py_True);
3900 DISPATCH();
3901 }
3902 // Lazily import _collections_abc.Mapping, and keep it handy on the
3903 // PyInterpreterState struct (it gets cleaned up at exit):
3904 PyInterpreterState *interp = PyInterpreterState_Get();
3905 if (interp->map_abc == NULL) {
3906 PyObject *abc = PyImport_ImportModule("_collections_abc");
3907 if (abc == NULL) {
3908 goto error;
3909 }
3910 interp->map_abc = PyObject_GetAttrString(abc, "Mapping");
3911 if (interp->map_abc == NULL) {
3912 goto error;
3913 }
3914 }
3915 int match = PyObject_IsInstance(subject, interp->map_abc);
3916 if (match < 0) {
3917 goto error;
3918 }
3919 PUSH(PyBool_FromLong(match));
3920 DISPATCH();
3921 }
3922
3923 case TARGET(MATCH_SEQUENCE): {
3924 // PUSH(not isinstance(TOS, (bytearray, bytes, str))
3925 // and isinstance(TOS, _collections_abc.Sequence))
3926 PyObject *subject = TOP();
3927 // Fast path for lists and tuples:
3928 if (PyType_FastSubclass(Py_TYPE(subject),
3929 Py_TPFLAGS_LIST_SUBCLASS |
3930 Py_TPFLAGS_TUPLE_SUBCLASS))
3931 {
3932 Py_INCREF(Py_True);
3933 PUSH(Py_True);
3934 DISPATCH();
3935 }
3936 // Bail on some possible Sequences that we intentionally exclude:
3937 if (PyType_FastSubclass(Py_TYPE(subject),
3938 Py_TPFLAGS_BYTES_SUBCLASS |
3939 Py_TPFLAGS_UNICODE_SUBCLASS) ||
3940 PyByteArray_Check(subject))
3941 {
3942 Py_INCREF(Py_False);
3943 PUSH(Py_False);
3944 DISPATCH();
3945 }
3946 // Lazily import _collections_abc.Sequence, and keep it handy on the
3947 // PyInterpreterState struct (it gets cleaned up at exit):
3948 PyInterpreterState *interp = PyInterpreterState_Get();
3949 if (interp->seq_abc == NULL) {
3950 PyObject *abc = PyImport_ImportModule("_collections_abc");
3951 if (abc == NULL) {
3952 goto error;
3953 }
3954 interp->seq_abc = PyObject_GetAttrString(abc, "Sequence");
3955 if (interp->seq_abc == NULL) {
3956 goto error;
3957 }
3958 }
3959 int match = PyObject_IsInstance(subject, interp->seq_abc);
3960 if (match < 0) {
3961 goto error;
3962 }
3963 PUSH(PyBool_FromLong(match));
3964 DISPATCH();
3965 }
3966
3967 case TARGET(MATCH_KEYS): {
3968 // On successful match for all keys, PUSH(values) and PUSH(True).
3969 // Otherwise, PUSH(None) and PUSH(False).
3970 PyObject *keys = TOP();
3971 PyObject *subject = SECOND();
3972 PyObject *values_or_none = match_keys(tstate, subject, keys);
3973 if (values_or_none == NULL) {
3974 goto error;
3975 }
3976 PUSH(values_or_none);
3977 if (values_or_none == Py_None) {
3978 Py_INCREF(Py_False);
3979 PUSH(Py_False);
3980 DISPATCH();
3981 }
3982 assert(PyTuple_CheckExact(values_or_none));
3983 Py_INCREF(Py_True);
3984 PUSH(Py_True);
3985 DISPATCH();
3986 }
3987
3988 case TARGET(COPY_DICT_WITHOUT_KEYS): {
3989 // rest = dict(TOS1)
3990 // for key in TOS:
3991 // del rest[key]
3992 // SET_TOP(rest)
3993 PyObject *keys = TOP();
3994 PyObject *subject = SECOND();
3995 PyObject *rest = PyDict_New();
3996 if (rest == NULL || PyDict_Update(rest, subject)) {
3997 Py_XDECREF(rest);
3998 goto error;
3999 }
4000 // This may seem a bit inefficient, but keys is rarely big enough to
4001 // actually impact runtime.
4002 assert(PyTuple_CheckExact(keys));
4003 for (Py_ssize_t i = 0; i < PyTuple_GET_SIZE(keys); i++) {
4004 if (PyDict_DelItem(rest, PyTuple_GET_ITEM(keys, i))) {
4005 Py_DECREF(rest);
4006 goto error;
4007 }
4008 }
4009 Py_DECREF(keys);
4010 SET_TOP(rest);
4011 DISPATCH();
4012 }
4013
Benjamin Petersonddd19492018-09-16 22:38:02 -07004014 case TARGET(GET_ITER): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004015 /* before: [obj]; after [getiter(obj)] */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004016 PyObject *iterable = TOP();
Yury Selivanov5376ba92015-06-22 12:19:30 -04004017 PyObject *iter = PyObject_GetIter(iterable);
4018 Py_DECREF(iterable);
4019 SET_TOP(iter);
4020 if (iter == NULL)
4021 goto error;
4022 PREDICT(FOR_ITER);
Serhiy Storchakada9c5132016-06-27 18:58:57 +03004023 PREDICT(CALL_FUNCTION);
Yury Selivanov5376ba92015-06-22 12:19:30 -04004024 DISPATCH();
4025 }
4026
Benjamin Petersonddd19492018-09-16 22:38:02 -07004027 case TARGET(GET_YIELD_FROM_ITER): {
Yury Selivanov5376ba92015-06-22 12:19:30 -04004028 /* before: [obj]; after [getiter(obj)] */
4029 PyObject *iterable = TOP();
Yury Selivanov75445082015-05-11 22:57:16 -04004030 PyObject *iter;
Yury Selivanov5376ba92015-06-22 12:19:30 -04004031 if (PyCoro_CheckExact(iterable)) {
4032 /* `iterable` is a coroutine */
4033 if (!(co->co_flags & (CO_COROUTINE | CO_ITERABLE_COROUTINE))) {
4034 /* and it is used in a 'yield from' expression of a
4035 regular generator. */
4036 Py_DECREF(iterable);
4037 SET_TOP(NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02004038 _PyErr_SetString(tstate, PyExc_TypeError,
4039 "cannot 'yield from' a coroutine object "
4040 "in a non-coroutine generator");
Yury Selivanov5376ba92015-06-22 12:19:30 -04004041 goto error;
4042 }
4043 }
4044 else if (!PyGen_CheckExact(iterable)) {
Yury Selivanov75445082015-05-11 22:57:16 -04004045 /* `iterable` is not a generator. */
4046 iter = PyObject_GetIter(iterable);
4047 Py_DECREF(iterable);
4048 SET_TOP(iter);
4049 if (iter == NULL)
4050 goto error;
4051 }
Serhiy Storchakada9c5132016-06-27 18:58:57 +03004052 PREDICT(LOAD_CONST);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004053 DISPATCH();
4054 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00004055
Benjamin Petersonddd19492018-09-16 22:38:02 -07004056 case TARGET(FOR_ITER): {
4057 PREDICTED(FOR_ITER);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004058 /* before: [iter]; after: [iter, iter()] *or* [] */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004059 PyObject *iter = TOP();
Victor Stinnera102ed72020-02-07 02:24:48 +01004060 PyObject *next = (*Py_TYPE(iter)->tp_iternext)(iter);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004061 if (next != NULL) {
4062 PUSH(next);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004063 PREDICT(STORE_FAST);
4064 PREDICT(UNPACK_SEQUENCE);
4065 DISPATCH();
4066 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004067 if (_PyErr_Occurred(tstate)) {
4068 if (!_PyErr_ExceptionMatches(tstate, PyExc_StopIteration)) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004069 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02004070 }
4071 else if (tstate->c_tracefunc != NULL) {
Mark Shannon8e1b4062021-03-05 14:45:50 +00004072 call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj, tstate, f, &trace_info);
Victor Stinner438a12d2019-05-24 17:01:38 +02004073 }
4074 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004075 }
4076 /* iterator ended normally */
costypetrisor8ed317f2018-07-31 20:55:14 +00004077 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004078 Py_DECREF(iter);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004079 JUMPBY(oparg);
4080 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004081 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00004082
Benjamin Petersonddd19492018-09-16 22:38:02 -07004083 case TARGET(SETUP_FINALLY): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004084 PyFrame_BlockSetup(f, SETUP_FINALLY, INSTR_OFFSET() + oparg,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004085 STACK_LEVEL());
4086 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004087 }
Guido van Rossumac7be682001-01-17 15:42:30 +00004088
Benjamin Petersonddd19492018-09-16 22:38:02 -07004089 case TARGET(BEFORE_ASYNC_WITH): {
Yury Selivanov75445082015-05-11 22:57:16 -04004090 _Py_IDENTIFIER(__aenter__);
Géry Ogam1d1b97a2020-01-14 12:58:29 +01004091 _Py_IDENTIFIER(__aexit__);
Yury Selivanov75445082015-05-11 22:57:16 -04004092 PyObject *mgr = TOP();
Géry Ogam1d1b97a2020-01-14 12:58:29 +01004093 PyObject *enter = special_lookup(tstate, mgr, &PyId___aenter__);
Yury Selivanov75445082015-05-11 22:57:16 -04004094 PyObject *res;
Géry Ogam1d1b97a2020-01-14 12:58:29 +01004095 if (enter == NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04004096 goto error;
Géry Ogam1d1b97a2020-01-14 12:58:29 +01004097 }
4098 PyObject *exit = special_lookup(tstate, mgr, &PyId___aexit__);
4099 if (exit == NULL) {
4100 Py_DECREF(enter);
4101 goto error;
4102 }
Yury Selivanov75445082015-05-11 22:57:16 -04004103 SET_TOP(exit);
Yury Selivanov75445082015-05-11 22:57:16 -04004104 Py_DECREF(mgr);
Victor Stinnerf17c3de2016-12-06 18:46:19 +01004105 res = _PyObject_CallNoArg(enter);
Yury Selivanov75445082015-05-11 22:57:16 -04004106 Py_DECREF(enter);
4107 if (res == NULL)
4108 goto error;
4109 PUSH(res);
Serhiy Storchakada9c5132016-06-27 18:58:57 +03004110 PREDICT(GET_AWAITABLE);
Yury Selivanov75445082015-05-11 22:57:16 -04004111 DISPATCH();
4112 }
4113
Benjamin Petersonddd19492018-09-16 22:38:02 -07004114 case TARGET(SETUP_ASYNC_WITH): {
Yury Selivanov75445082015-05-11 22:57:16 -04004115 PyObject *res = POP();
4116 /* Setup the finally block before pushing the result
4117 of __aenter__ on the stack. */
4118 PyFrame_BlockSetup(f, SETUP_FINALLY, INSTR_OFFSET() + oparg,
4119 STACK_LEVEL());
4120 PUSH(res);
4121 DISPATCH();
4122 }
4123
Benjamin Petersonddd19492018-09-16 22:38:02 -07004124 case TARGET(SETUP_WITH): {
Benjamin Petersonce798522012-01-22 11:24:29 -05004125 _Py_IDENTIFIER(__enter__);
Géry Ogam1d1b97a2020-01-14 12:58:29 +01004126 _Py_IDENTIFIER(__exit__);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004127 PyObject *mgr = TOP();
Victor Stinner438a12d2019-05-24 17:01:38 +02004128 PyObject *enter = special_lookup(tstate, mgr, &PyId___enter__);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004129 PyObject *res;
Victor Stinner438a12d2019-05-24 17:01:38 +02004130 if (enter == NULL) {
Raymond Hettingera3fec152016-11-21 17:24:23 -08004131 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02004132 }
4133 PyObject *exit = special_lookup(tstate, mgr, &PyId___exit__);
Raymond Hettinger64e2f9a2016-11-22 11:50:40 -08004134 if (exit == NULL) {
4135 Py_DECREF(enter);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004136 goto error;
Raymond Hettinger64e2f9a2016-11-22 11:50:40 -08004137 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004138 SET_TOP(exit);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004139 Py_DECREF(mgr);
Victor Stinnerf17c3de2016-12-06 18:46:19 +01004140 res = _PyObject_CallNoArg(enter);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004141 Py_DECREF(enter);
4142 if (res == NULL)
4143 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004144 /* Setup the finally block before pushing the result
4145 of __enter__ on the stack. */
4146 PyFrame_BlockSetup(f, SETUP_FINALLY, INSTR_OFFSET() + oparg,
4147 STACK_LEVEL());
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004148
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004149 PUSH(res);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004150 DISPATCH();
4151 }
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004152
Mark Shannonfee55262019-11-21 09:11:43 +00004153 case TARGET(WITH_EXCEPT_START): {
4154 /* At the top of the stack are 7 values:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004155 - (TOP, SECOND, THIRD) = exc_info()
Mark Shannonfee55262019-11-21 09:11:43 +00004156 - (FOURTH, FIFTH, SIXTH) = previous exception for EXCEPT_HANDLER
4157 - SEVENTH: the context.__exit__ bound method
4158 We call SEVENTH(TOP, SECOND, THIRD).
4159 Then we push again the TOP exception and the __exit__
4160 return value.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004161 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004162 PyObject *exit_func;
Victor Stinner842cfff2016-12-01 14:45:31 +01004163 PyObject *exc, *val, *tb, *res;
4164
Victor Stinner842cfff2016-12-01 14:45:31 +01004165 exc = TOP();
Mark Shannonfee55262019-11-21 09:11:43 +00004166 val = SECOND();
4167 tb = THIRD();
4168 assert(exc != Py_None);
4169 assert(!PyLong_Check(exc));
4170 exit_func = PEEK(7);
Jeroen Demeyer469d1a72019-07-03 12:52:21 +02004171 PyObject *stack[4] = {NULL, exc, val, tb};
Petr Viktorinffd97532020-02-11 17:46:57 +01004172 res = PyObject_Vectorcall(exit_func, stack + 1,
Jeroen Demeyer469d1a72019-07-03 12:52:21 +02004173 3 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004174 if (res == NULL)
4175 goto error;
Amaury Forgeot d'Arc10b24e82008-12-10 23:49:33 +00004176
Yury Selivanov75445082015-05-11 22:57:16 -04004177 PUSH(res);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004178 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004179 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00004180
Benjamin Petersonddd19492018-09-16 22:38:02 -07004181 case TARGET(LOAD_METHOD): {
Andreyb021ba52019-04-29 14:33:26 +10004182 /* Designed to work in tandem with CALL_METHOD. */
Yury Selivanovf2392132016-12-13 19:03:51 -05004183 PyObject *name = GETITEM(names, oparg);
4184 PyObject *obj = TOP();
4185 PyObject *meth = NULL;
4186
4187 int meth_found = _PyObject_GetMethod(obj, name, &meth);
4188
Yury Selivanovf2392132016-12-13 19:03:51 -05004189 if (meth == NULL) {
4190 /* Most likely attribute wasn't found. */
Yury Selivanovf2392132016-12-13 19:03:51 -05004191 goto error;
4192 }
4193
4194 if (meth_found) {
INADA Naoki015bce62017-01-16 17:23:30 +09004195 /* We can bypass temporary bound method object.
4196 meth is unbound method and obj is self.
Victor Stinnera8cb5152017-01-18 14:12:51 +01004197
INADA Naoki015bce62017-01-16 17:23:30 +09004198 meth | self | arg1 | ... | argN
4199 */
4200 SET_TOP(meth);
4201 PUSH(obj); // self
Yury Selivanovf2392132016-12-13 19:03:51 -05004202 }
4203 else {
INADA Naoki015bce62017-01-16 17:23:30 +09004204 /* meth is not an unbound method (but a regular attr, or
4205 something was returned by a descriptor protocol). Set
4206 the second element of the stack to NULL, to signal
Yury Selivanovf2392132016-12-13 19:03:51 -05004207 CALL_METHOD that it's not a method call.
INADA Naoki015bce62017-01-16 17:23:30 +09004208
4209 NULL | meth | arg1 | ... | argN
Yury Selivanovf2392132016-12-13 19:03:51 -05004210 */
INADA Naoki015bce62017-01-16 17:23:30 +09004211 SET_TOP(NULL);
Yury Selivanovf2392132016-12-13 19:03:51 -05004212 Py_DECREF(obj);
INADA Naoki015bce62017-01-16 17:23:30 +09004213 PUSH(meth);
Yury Selivanovf2392132016-12-13 19:03:51 -05004214 }
4215 DISPATCH();
4216 }
4217
Benjamin Petersonddd19492018-09-16 22:38:02 -07004218 case TARGET(CALL_METHOD): {
Yury Selivanovf2392132016-12-13 19:03:51 -05004219 /* Designed to work in tamdem with LOAD_METHOD. */
INADA Naoki015bce62017-01-16 17:23:30 +09004220 PyObject **sp, *res, *meth;
Yury Selivanovf2392132016-12-13 19:03:51 -05004221
4222 sp = stack_pointer;
4223
INADA Naoki015bce62017-01-16 17:23:30 +09004224 meth = PEEK(oparg + 2);
4225 if (meth == NULL) {
4226 /* `meth` is NULL when LOAD_METHOD thinks that it's not
4227 a method call.
Yury Selivanovf2392132016-12-13 19:03:51 -05004228
4229 Stack layout:
4230
INADA Naoki015bce62017-01-16 17:23:30 +09004231 ... | NULL | callable | arg1 | ... | argN
4232 ^- TOP()
4233 ^- (-oparg)
4234 ^- (-oparg-1)
4235 ^- (-oparg-2)
Yury Selivanovf2392132016-12-13 19:03:51 -05004236
Ville Skyttä49b27342017-08-03 09:00:59 +03004237 `callable` will be POPed by call_function.
INADA Naoki015bce62017-01-16 17:23:30 +09004238 NULL will will be POPed manually later.
Yury Selivanovf2392132016-12-13 19:03:51 -05004239 */
Mark Shannon8e1b4062021-03-05 14:45:50 +00004240 res = call_function(tstate, &trace_info, &sp, oparg, NULL);
Yury Selivanovf2392132016-12-13 19:03:51 -05004241 stack_pointer = sp;
INADA Naoki015bce62017-01-16 17:23:30 +09004242 (void)POP(); /* POP the NULL. */
Yury Selivanovf2392132016-12-13 19:03:51 -05004243 }
4244 else {
4245 /* This is a method call. Stack layout:
4246
INADA Naoki015bce62017-01-16 17:23:30 +09004247 ... | method | self | arg1 | ... | argN
Yury Selivanovf2392132016-12-13 19:03:51 -05004248 ^- TOP()
4249 ^- (-oparg)
INADA Naoki015bce62017-01-16 17:23:30 +09004250 ^- (-oparg-1)
4251 ^- (-oparg-2)
Yury Selivanovf2392132016-12-13 19:03:51 -05004252
INADA Naoki015bce62017-01-16 17:23:30 +09004253 `self` and `method` will be POPed by call_function.
Yury Selivanovf2392132016-12-13 19:03:51 -05004254 We'll be passing `oparg + 1` to call_function, to
INADA Naoki015bce62017-01-16 17:23:30 +09004255 make it accept the `self` as a first argument.
Yury Selivanovf2392132016-12-13 19:03:51 -05004256 */
Mark Shannon8e1b4062021-03-05 14:45:50 +00004257 res = call_function(tstate, &trace_info, &sp, oparg + 1, NULL);
Yury Selivanovf2392132016-12-13 19:03:51 -05004258 stack_pointer = sp;
4259 }
4260
4261 PUSH(res);
4262 if (res == NULL)
4263 goto error;
Mark Shannon4958f5d2021-03-24 17:56:12 +00004264 CHECK_EVAL_BREAKER();
Yury Selivanovf2392132016-12-13 19:03:51 -05004265 DISPATCH();
4266 }
4267
Benjamin Petersonddd19492018-09-16 22:38:02 -07004268 case TARGET(CALL_FUNCTION): {
4269 PREDICTED(CALL_FUNCTION);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004270 PyObject **sp, *res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004271 sp = stack_pointer;
Mark Shannon8e1b4062021-03-05 14:45:50 +00004272 res = call_function(tstate, &trace_info, &sp, oparg, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004273 stack_pointer = sp;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004274 PUSH(res);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004275 if (res == NULL) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004276 goto error;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004277 }
Mark Shannon4958f5d2021-03-24 17:56:12 +00004278 CHECK_EVAL_BREAKER();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004279 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004280 }
Guido van Rossumac7be682001-01-17 15:42:30 +00004281
Benjamin Petersonddd19492018-09-16 22:38:02 -07004282 case TARGET(CALL_FUNCTION_KW): {
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004283 PyObject **sp, *res, *names;
4284
4285 names = POP();
Jeroen Demeyer05677862019-08-16 12:41:27 +02004286 assert(PyTuple_Check(names));
4287 assert(PyTuple_GET_SIZE(names) <= oparg);
4288 /* We assume without checking that names contains only strings */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004289 sp = stack_pointer;
Mark Shannon8e1b4062021-03-05 14:45:50 +00004290 res = call_function(tstate, &trace_info, &sp, oparg, names);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004291 stack_pointer = sp;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004292 PUSH(res);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004293 Py_DECREF(names);
4294
4295 if (res == NULL) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004296 goto error;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004297 }
Mark Shannon4958f5d2021-03-24 17:56:12 +00004298 CHECK_EVAL_BREAKER();
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004299 DISPATCH();
4300 }
4301
Benjamin Petersonddd19492018-09-16 22:38:02 -07004302 case TARGET(CALL_FUNCTION_EX): {
Brandt Bucherf185a732019-09-28 17:12:49 -07004303 PREDICTED(CALL_FUNCTION_EX);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004304 PyObject *func, *callargs, *kwargs = NULL, *result;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004305 if (oparg & 0x01) {
4306 kwargs = POP();
Serhiy Storchakab7281052016-09-12 00:52:40 +03004307 if (!PyDict_CheckExact(kwargs)) {
4308 PyObject *d = PyDict_New();
4309 if (d == NULL)
4310 goto error;
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02004311 if (_PyDict_MergeEx(d, kwargs, 2) < 0) {
Serhiy Storchakab7281052016-09-12 00:52:40 +03004312 Py_DECREF(d);
Victor Stinner438a12d2019-05-24 17:01:38 +02004313 format_kwargs_error(tstate, SECOND(), kwargs);
Victor Stinnereece2222016-09-12 11:16:37 +02004314 Py_DECREF(kwargs);
Serhiy Storchakab7281052016-09-12 00:52:40 +03004315 goto error;
4316 }
4317 Py_DECREF(kwargs);
4318 kwargs = d;
4319 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004320 assert(PyDict_CheckExact(kwargs));
4321 }
4322 callargs = POP();
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004323 func = TOP();
Serhiy Storchaka63dc5482016-09-22 19:41:20 +03004324 if (!PyTuple_CheckExact(callargs)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004325 if (check_args_iterable(tstate, func, callargs) < 0) {
Victor Stinnereece2222016-09-12 11:16:37 +02004326 Py_DECREF(callargs);
Serhiy Storchakab7281052016-09-12 00:52:40 +03004327 goto error;
4328 }
4329 Py_SETREF(callargs, PySequence_Tuple(callargs));
4330 if (callargs == NULL) {
4331 goto error;
4332 }
4333 }
Serhiy Storchaka63dc5482016-09-22 19:41:20 +03004334 assert(PyTuple_CheckExact(callargs));
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004335
Mark Shannon8e1b4062021-03-05 14:45:50 +00004336 result = do_call_core(tstate, &trace_info, func, callargs, kwargs);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004337 Py_DECREF(func);
4338 Py_DECREF(callargs);
4339 Py_XDECREF(kwargs);
4340
4341 SET_TOP(result);
4342 if (result == NULL) {
4343 goto error;
4344 }
Mark Shannon4958f5d2021-03-24 17:56:12 +00004345 CHECK_EVAL_BREAKER();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004346 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004347 }
Guido van Rossumac7be682001-01-17 15:42:30 +00004348
Benjamin Petersonddd19492018-09-16 22:38:02 -07004349 case TARGET(MAKE_FUNCTION): {
Serhiy Storchaka64204de2016-06-12 17:36:24 +03004350 PyObject *qualname = POP();
4351 PyObject *codeobj = POP();
4352 PyFunctionObject *func = (PyFunctionObject *)
4353 PyFunction_NewWithQualName(codeobj, f->f_globals, qualname);
Guido van Rossum4f72a782006-10-27 23:31:49 +00004354
Serhiy Storchaka64204de2016-06-12 17:36:24 +03004355 Py_DECREF(codeobj);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004356 Py_DECREF(qualname);
Serhiy Storchaka64204de2016-06-12 17:36:24 +03004357 if (func == NULL) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004358 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004359 }
Neal Norwitzc1505362006-12-28 06:47:50 +00004360
Serhiy Storchaka64204de2016-06-12 17:36:24 +03004361 if (oparg & 0x08) {
4362 assert(PyTuple_CheckExact(TOP()));
Mark Shannond6c33fb2021-01-29 13:24:55 +00004363 func->func_closure = POP();
Serhiy Storchaka64204de2016-06-12 17:36:24 +03004364 }
4365 if (oparg & 0x04) {
Yurii Karabas73019792020-11-25 12:43:18 +02004366 assert(PyTuple_CheckExact(TOP()));
Serhiy Storchaka64204de2016-06-12 17:36:24 +03004367 func->func_annotations = POP();
4368 }
4369 if (oparg & 0x02) {
4370 assert(PyDict_CheckExact(TOP()));
4371 func->func_kwdefaults = POP();
4372 }
4373 if (oparg & 0x01) {
4374 assert(PyTuple_CheckExact(TOP()));
4375 func->func_defaults = POP();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004376 }
Neal Norwitzc1505362006-12-28 06:47:50 +00004377
Serhiy Storchaka64204de2016-06-12 17:36:24 +03004378 PUSH((PyObject *)func);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004379 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004380 }
Guido van Rossum8861b741996-07-30 16:49:37 +00004381
Benjamin Petersonddd19492018-09-16 22:38:02 -07004382 case TARGET(BUILD_SLICE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004383 PyObject *start, *stop, *step, *slice;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004384 if (oparg == 3)
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004385 step = POP();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004386 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004387 step = NULL;
4388 stop = POP();
4389 start = TOP();
4390 slice = PySlice_New(start, stop, step);
4391 Py_DECREF(start);
4392 Py_DECREF(stop);
4393 Py_XDECREF(step);
4394 SET_TOP(slice);
4395 if (slice == NULL)
4396 goto error;
4397 DISPATCH();
4398 }
Guido van Rossum8861b741996-07-30 16:49:37 +00004399
Benjamin Petersonddd19492018-09-16 22:38:02 -07004400 case TARGET(FORMAT_VALUE): {
Eric V. Smitha78c7952015-11-03 12:45:05 -05004401 /* Handles f-string value formatting. */
4402 PyObject *result;
4403 PyObject *fmt_spec;
4404 PyObject *value;
4405 PyObject *(*conv_fn)(PyObject *);
4406 int which_conversion = oparg & FVC_MASK;
4407 int have_fmt_spec = (oparg & FVS_MASK) == FVS_HAVE_SPEC;
4408
4409 fmt_spec = have_fmt_spec ? POP() : NULL;
Eric V. Smith135d5f42016-02-05 18:23:08 -05004410 value = POP();
Eric V. Smitha78c7952015-11-03 12:45:05 -05004411
4412 /* See if any conversion is specified. */
4413 switch (which_conversion) {
Eric V. Smith9a4135e2019-05-08 16:28:48 -04004414 case FVC_NONE: conv_fn = NULL; break;
Eric V. Smitha78c7952015-11-03 12:45:05 -05004415 case FVC_STR: conv_fn = PyObject_Str; break;
4416 case FVC_REPR: conv_fn = PyObject_Repr; break;
4417 case FVC_ASCII: conv_fn = PyObject_ASCII; break;
Eric V. Smith9a4135e2019-05-08 16:28:48 -04004418 default:
Victor Stinner438a12d2019-05-24 17:01:38 +02004419 _PyErr_Format(tstate, PyExc_SystemError,
4420 "unexpected conversion flag %d",
4421 which_conversion);
Eric V. Smith9a4135e2019-05-08 16:28:48 -04004422 goto error;
Eric V. Smitha78c7952015-11-03 12:45:05 -05004423 }
4424
4425 /* If there's a conversion function, call it and replace
4426 value with that result. Otherwise, just use value,
4427 without conversion. */
Eric V. Smitheb588a12016-02-05 18:26:20 -05004428 if (conv_fn != NULL) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05004429 result = conv_fn(value);
4430 Py_DECREF(value);
Eric V. Smitheb588a12016-02-05 18:26:20 -05004431 if (result == NULL) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05004432 Py_XDECREF(fmt_spec);
4433 goto error;
4434 }
4435 value = result;
4436 }
4437
4438 /* If value is a unicode object, and there's no fmt_spec,
4439 then we know the result of format(value) is value
4440 itself. In that case, skip calling format(). I plan to
4441 move this optimization in to PyObject_Format()
4442 itself. */
4443 if (PyUnicode_CheckExact(value) && fmt_spec == NULL) {
4444 /* Do nothing, just transfer ownership to result. */
4445 result = value;
4446 } else {
4447 /* Actually call format(). */
4448 result = PyObject_Format(value, fmt_spec);
4449 Py_DECREF(value);
4450 Py_XDECREF(fmt_spec);
Eric V. Smitheb588a12016-02-05 18:26:20 -05004451 if (result == NULL) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05004452 goto error;
Eric V. Smitheb588a12016-02-05 18:26:20 -05004453 }
Eric V. Smitha78c7952015-11-03 12:45:05 -05004454 }
4455
Eric V. Smith135d5f42016-02-05 18:23:08 -05004456 PUSH(result);
Eric V. Smitha78c7952015-11-03 12:45:05 -05004457 DISPATCH();
4458 }
4459
Benjamin Petersonddd19492018-09-16 22:38:02 -07004460 case TARGET(EXTENDED_ARG): {
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03004461 int oldoparg = oparg;
4462 NEXTOPARG();
4463 oparg |= oldoparg << 8;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004464 goto dispatch_opcode;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004465 }
Guido van Rossum8861b741996-07-30 16:49:37 +00004466
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004467
Antoine Pitrou042b1282010-08-13 21:15:58 +00004468#if USE_COMPUTED_GOTOS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004469 _unknown_opcode:
Antoine Pitroub52ec782009-01-25 16:34:23 +00004470#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004471 default:
4472 fprintf(stderr,
4473 "XXX lineno: %d, opcode: %d\n",
4474 PyFrame_GetLineNumber(f),
4475 opcode);
Victor Stinner438a12d2019-05-24 17:01:38 +02004476 _PyErr_SetString(tstate, PyExc_SystemError, "unknown opcode");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004477 goto error;
Guido van Rossum04691fc1992-08-12 15:35:34 +00004478
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004479 } /* switch */
Guido van Rossum374a9221991-04-04 10:40:29 +00004480
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004481 /* This should never be reached. Every opcode should end with DISPATCH()
4482 or goto error. */
Barry Warsawb2e57942017-09-14 18:13:16 -07004483 Py_UNREACHABLE();
Guido van Rossumac7be682001-01-17 15:42:30 +00004484
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004485error:
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004486 /* Double-check exception status. */
Victor Stinner365b6932013-07-12 00:11:58 +02004487#ifdef NDEBUG
Victor Stinner438a12d2019-05-24 17:01:38 +02004488 if (!_PyErr_Occurred(tstate)) {
4489 _PyErr_SetString(tstate, PyExc_SystemError,
4490 "error return without exception set");
4491 }
Victor Stinner365b6932013-07-12 00:11:58 +02004492#else
Victor Stinner438a12d2019-05-24 17:01:38 +02004493 assert(_PyErr_Occurred(tstate));
Victor Stinner365b6932013-07-12 00:11:58 +02004494#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00004495
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004496 /* Log traceback info. */
4497 PyTraceBack_Here(f);
Guido van Rossumac7be682001-01-17 15:42:30 +00004498
Mark Shannoncb9879b2020-07-17 11:44:23 +01004499 if (tstate->c_tracefunc != NULL) {
4500 /* Make sure state is set to FRAME_EXECUTING for tracing */
4501 assert(f->f_state == FRAME_EXECUTING);
4502 f->f_state = FRAME_UNWINDING;
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004503 call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj,
Mark Shannon8e1b4062021-03-05 14:45:50 +00004504 tstate, f, &trace_info);
Mark Shannoncb9879b2020-07-17 11:44:23 +01004505 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004506exception_unwind:
Mark Shannoncb9879b2020-07-17 11:44:23 +01004507 f->f_state = FRAME_UNWINDING;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004508 /* Unwind stacks if an exception occurred */
4509 while (f->f_iblock > 0) {
4510 /* Pop the current block. */
4511 PyTryBlock *b = &f->f_blockstack[--f->f_iblock];
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004512
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004513 if (b->b_type == EXCEPT_HANDLER) {
4514 UNWIND_EXCEPT_HANDLER(b);
4515 continue;
4516 }
4517 UNWIND_BLOCK(b);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004518 if (b->b_type == SETUP_FINALLY) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004519 PyObject *exc, *val, *tb;
4520 int handler = b->b_handler;
Mark Shannonae3087c2017-10-22 22:41:51 +01004521 _PyErr_StackItem *exc_info = tstate->exc_info;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004522 /* Beware, this invalidates all b->b_* fields */
Mark Shannonbf353f32020-12-17 13:55:28 +00004523 PyFrame_BlockSetup(f, EXCEPT_HANDLER, f->f_lasti, STACK_LEVEL());
Mark Shannonae3087c2017-10-22 22:41:51 +01004524 PUSH(exc_info->exc_traceback);
4525 PUSH(exc_info->exc_value);
4526 if (exc_info->exc_type != NULL) {
4527 PUSH(exc_info->exc_type);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004528 }
4529 else {
4530 Py_INCREF(Py_None);
4531 PUSH(Py_None);
4532 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004533 _PyErr_Fetch(tstate, &exc, &val, &tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004534 /* Make the raw exception data
4535 available to the handler,
4536 so a program can emulate the
4537 Python main loop. */
Victor Stinner438a12d2019-05-24 17:01:38 +02004538 _PyErr_NormalizeException(tstate, &exc, &val, &tb);
Victor Stinner7eab0d02013-07-15 21:16:27 +02004539 if (tb != NULL)
4540 PyException_SetTraceback(val, tb);
4541 else
4542 PyException_SetTraceback(val, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004543 Py_INCREF(exc);
Mark Shannonae3087c2017-10-22 22:41:51 +01004544 exc_info->exc_type = exc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004545 Py_INCREF(val);
Mark Shannonae3087c2017-10-22 22:41:51 +01004546 exc_info->exc_value = val;
4547 exc_info->exc_traceback = tb;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004548 if (tb == NULL)
4549 tb = Py_None;
4550 Py_INCREF(tb);
4551 PUSH(tb);
4552 PUSH(val);
4553 PUSH(exc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004554 JUMPTO(handler);
Victor Stinnerdab84232020-03-17 18:56:44 +01004555 if (_Py_TracingPossible(ceval2)) {
Mark Shannon8e1b4062021-03-05 14:45:50 +00004556 trace_info.instr_prev = INT_MAX;
Mark Shannonfee55262019-11-21 09:11:43 +00004557 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004558 /* Resume normal execution */
Mark Shannoncb9879b2020-07-17 11:44:23 +01004559 f->f_state = FRAME_EXECUTING;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004560 goto main_loop;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004561 }
4562 } /* unwind stack */
Guido van Rossum374a9221991-04-04 10:40:29 +00004563
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004564 /* End the loop as we still have an error */
4565 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004566 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00004567
Pablo Galindof00828a2019-05-09 16:52:02 +01004568 assert(retval == NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02004569 assert(_PyErr_Occurred(tstate));
Pablo Galindof00828a2019-05-09 16:52:02 +01004570
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004571 /* Pop remaining stack entries. */
4572 while (!EMPTY()) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004573 PyObject *o = POP();
4574 Py_XDECREF(o);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004575 }
Mark Shannoncb9879b2020-07-17 11:44:23 +01004576 f->f_stackdepth = 0;
4577 f->f_state = FRAME_RAISED;
Mark Shannone7c9f4a2020-01-13 12:51:26 +00004578exiting:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004579 if (tstate->use_tracing) {
Benjamin Peterson51f46162013-01-23 08:38:47 -05004580 if (tstate->c_tracefunc) {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004581 if (call_trace_protected(tstate->c_tracefunc, tstate->c_traceobj,
Mark Shannon8e1b4062021-03-05 14:45:50 +00004582 tstate, f, &trace_info, PyTrace_RETURN, retval)) {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004583 Py_CLEAR(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004584 }
4585 }
4586 if (tstate->c_profilefunc) {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004587 if (call_trace_protected(tstate->c_profilefunc, tstate->c_profileobj,
Mark Shannon8e1b4062021-03-05 14:45:50 +00004588 tstate, f, &trace_info, PyTrace_RETURN, retval)) {
Serhiy Storchaka505ff752014-02-09 13:33:53 +02004589 Py_CLEAR(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004590 }
4591 }
4592 }
Guido van Rossuma4240131997-01-21 21:18:36 +00004593
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004594 /* pop frame */
Thomas Woutersce272b62007-09-19 21:19:28 +00004595exit_eval_frame:
Łukasz Langaa785c872016-09-09 17:37:37 -07004596 if (PyDTrace_FUNCTION_RETURN_ENABLED())
4597 dtrace_function_return(f);
Victor Stinnerbe434dc2019-11-05 00:51:22 +01004598 _Py_LeaveRecursiveCall(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004599 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00004600
Victor Stinner0b72b232020-03-12 23:18:39 +01004601 return _Py_CheckFunctionResult(tstate, NULL, retval, __func__);
Guido van Rossum374a9221991-04-04 10:40:29 +00004602}
4603
Benjamin Petersonb204a422011-06-05 22:04:07 -05004604static void
Victor Stinner438a12d2019-05-24 17:01:38 +02004605format_missing(PyThreadState *tstate, const char *kind,
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004606 PyCodeObject *co, PyObject *names, PyObject *qualname)
Benjamin Petersone109c702011-06-24 09:37:26 -05004607{
4608 int err;
4609 Py_ssize_t len = PyList_GET_SIZE(names);
4610 PyObject *name_str, *comma, *tail, *tmp;
4611
4612 assert(PyList_CheckExact(names));
4613 assert(len >= 1);
4614 /* Deal with the joys of natural language. */
4615 switch (len) {
4616 case 1:
4617 name_str = PyList_GET_ITEM(names, 0);
4618 Py_INCREF(name_str);
4619 break;
4620 case 2:
4621 name_str = PyUnicode_FromFormat("%U and %U",
4622 PyList_GET_ITEM(names, len - 2),
4623 PyList_GET_ITEM(names, len - 1));
4624 break;
4625 default:
4626 tail = PyUnicode_FromFormat(", %U, and %U",
4627 PyList_GET_ITEM(names, len - 2),
4628 PyList_GET_ITEM(names, len - 1));
Benjamin Petersond1ab6082012-06-01 11:18:22 -07004629 if (tail == NULL)
4630 return;
Benjamin Petersone109c702011-06-24 09:37:26 -05004631 /* Chop off the last two objects in the list. This shouldn't actually
4632 fail, but we can't be too careful. */
4633 err = PyList_SetSlice(names, len - 2, len, NULL);
4634 if (err == -1) {
4635 Py_DECREF(tail);
4636 return;
4637 }
4638 /* Stitch everything up into a nice comma-separated list. */
4639 comma = PyUnicode_FromString(", ");
4640 if (comma == NULL) {
4641 Py_DECREF(tail);
4642 return;
4643 }
4644 tmp = PyUnicode_Join(comma, names);
4645 Py_DECREF(comma);
4646 if (tmp == NULL) {
4647 Py_DECREF(tail);
4648 return;
4649 }
4650 name_str = PyUnicode_Concat(tmp, tail);
4651 Py_DECREF(tmp);
4652 Py_DECREF(tail);
4653 break;
4654 }
4655 if (name_str == NULL)
4656 return;
Victor Stinner438a12d2019-05-24 17:01:38 +02004657 _PyErr_Format(tstate, PyExc_TypeError,
4658 "%U() missing %i required %s argument%s: %U",
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004659 qualname,
Victor Stinner438a12d2019-05-24 17:01:38 +02004660 len,
4661 kind,
4662 len == 1 ? "" : "s",
4663 name_str);
Benjamin Petersone109c702011-06-24 09:37:26 -05004664 Py_DECREF(name_str);
4665}
4666
4667static void
Victor Stinner438a12d2019-05-24 17:01:38 +02004668missing_arguments(PyThreadState *tstate, PyCodeObject *co,
4669 Py_ssize_t missing, Py_ssize_t defcount,
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004670 PyObject **fastlocals, PyObject *qualname)
Benjamin Petersone109c702011-06-24 09:37:26 -05004671{
Victor Stinner74319ae2016-08-25 00:04:09 +02004672 Py_ssize_t i, j = 0;
4673 Py_ssize_t start, end;
4674 int positional = (defcount != -1);
Benjamin Petersone109c702011-06-24 09:37:26 -05004675 const char *kind = positional ? "positional" : "keyword-only";
4676 PyObject *missing_names;
4677
4678 /* Compute the names of the arguments that are missing. */
4679 missing_names = PyList_New(missing);
4680 if (missing_names == NULL)
4681 return;
4682 if (positional) {
4683 start = 0;
Pablo Galindocd74e662019-06-01 18:08:04 +01004684 end = co->co_argcount - defcount;
Benjamin Petersone109c702011-06-24 09:37:26 -05004685 }
4686 else {
Pablo Galindocd74e662019-06-01 18:08:04 +01004687 start = co->co_argcount;
Benjamin Petersone109c702011-06-24 09:37:26 -05004688 end = start + co->co_kwonlyargcount;
4689 }
4690 for (i = start; i < end; i++) {
4691 if (GETLOCAL(i) == NULL) {
4692 PyObject *raw = PyTuple_GET_ITEM(co->co_varnames, i);
4693 PyObject *name = PyObject_Repr(raw);
4694 if (name == NULL) {
4695 Py_DECREF(missing_names);
4696 return;
4697 }
4698 PyList_SET_ITEM(missing_names, j++, name);
4699 }
4700 }
4701 assert(j == missing);
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004702 format_missing(tstate, kind, co, missing_names, qualname);
Benjamin Petersone109c702011-06-24 09:37:26 -05004703 Py_DECREF(missing_names);
4704}
4705
4706static void
Victor Stinner438a12d2019-05-24 17:01:38 +02004707too_many_positional(PyThreadState *tstate, PyCodeObject *co,
Mark Shannond6c33fb2021-01-29 13:24:55 +00004708 Py_ssize_t given, PyObject *defaults,
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004709 PyObject **fastlocals, PyObject *qualname)
Benjamin Petersonb204a422011-06-05 22:04:07 -05004710{
4711 int plural;
Victor Stinner74319ae2016-08-25 00:04:09 +02004712 Py_ssize_t kwonly_given = 0;
4713 Py_ssize_t i;
Benjamin Petersonb204a422011-06-05 22:04:07 -05004714 PyObject *sig, *kwonly_sig;
Victor Stinner74319ae2016-08-25 00:04:09 +02004715 Py_ssize_t co_argcount = co->co_argcount;
Benjamin Petersonb204a422011-06-05 22:04:07 -05004716
Benjamin Petersone109c702011-06-24 09:37:26 -05004717 assert((co->co_flags & CO_VARARGS) == 0);
4718 /* Count missing keyword-only args. */
Pablo Galindocd74e662019-06-01 18:08:04 +01004719 for (i = co_argcount; i < co_argcount + co->co_kwonlyargcount; i++) {
Victor Stinner74319ae2016-08-25 00:04:09 +02004720 if (GETLOCAL(i) != NULL) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004721 kwonly_given++;
Victor Stinner74319ae2016-08-25 00:04:09 +02004722 }
4723 }
Mark Shannond6c33fb2021-01-29 13:24:55 +00004724 Py_ssize_t defcount = defaults == NULL ? 0 : PyTuple_GET_SIZE(defaults);
Benjamin Petersone109c702011-06-24 09:37:26 -05004725 if (defcount) {
Pablo Galindocd74e662019-06-01 18:08:04 +01004726 Py_ssize_t atleast = co_argcount - defcount;
Benjamin Petersonb204a422011-06-05 22:04:07 -05004727 plural = 1;
Pablo Galindocd74e662019-06-01 18:08:04 +01004728 sig = PyUnicode_FromFormat("from %zd to %zd", atleast, co_argcount);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004729 }
4730 else {
Pablo Galindocd74e662019-06-01 18:08:04 +01004731 plural = (co_argcount != 1);
4732 sig = PyUnicode_FromFormat("%zd", co_argcount);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004733 }
4734 if (sig == NULL)
4735 return;
4736 if (kwonly_given) {
Victor Stinner74319ae2016-08-25 00:04:09 +02004737 const char *format = " positional argument%s (and %zd keyword-only argument%s)";
4738 kwonly_sig = PyUnicode_FromFormat(format,
4739 given != 1 ? "s" : "",
4740 kwonly_given,
4741 kwonly_given != 1 ? "s" : "");
Benjamin Petersonb204a422011-06-05 22:04:07 -05004742 if (kwonly_sig == NULL) {
4743 Py_DECREF(sig);
4744 return;
4745 }
4746 }
4747 else {
4748 /* This will not fail. */
4749 kwonly_sig = PyUnicode_FromString("");
Benjamin Petersone109c702011-06-24 09:37:26 -05004750 assert(kwonly_sig != NULL);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004751 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004752 _PyErr_Format(tstate, PyExc_TypeError,
4753 "%U() takes %U positional argument%s but %zd%U %s given",
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004754 qualname,
Victor Stinner438a12d2019-05-24 17:01:38 +02004755 sig,
4756 plural ? "s" : "",
4757 given,
4758 kwonly_sig,
4759 given == 1 && !kwonly_given ? "was" : "were");
Benjamin Petersonb204a422011-06-05 22:04:07 -05004760 Py_DECREF(sig);
4761 Py_DECREF(kwonly_sig);
4762}
4763
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004764static int
Victor Stinner438a12d2019-05-24 17:01:38 +02004765positional_only_passed_as_keyword(PyThreadState *tstate, PyCodeObject *co,
Mark Shannon0332e562021-02-01 10:42:03 +00004766 Py_ssize_t kwcount, PyObject* kwnames,
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004767 PyObject *qualname)
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004768{
4769 int posonly_conflicts = 0;
4770 PyObject* posonly_names = PyList_New(0);
4771
4772 for(int k=0; k < co->co_posonlyargcount; k++){
4773 PyObject* posonly_name = PyTuple_GET_ITEM(co->co_varnames, k);
4774
4775 for (int k2=0; k2<kwcount; k2++){
4776 /* Compare the pointers first and fallback to PyObject_RichCompareBool*/
Mark Shannon0332e562021-02-01 10:42:03 +00004777 PyObject* kwname = PyTuple_GET_ITEM(kwnames, k2);
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004778 if (kwname == posonly_name){
4779 if(PyList_Append(posonly_names, kwname) != 0) {
4780 goto fail;
4781 }
4782 posonly_conflicts++;
4783 continue;
4784 }
4785
4786 int cmp = PyObject_RichCompareBool(posonly_name, kwname, Py_EQ);
4787
4788 if ( cmp > 0) {
4789 if(PyList_Append(posonly_names, kwname) != 0) {
4790 goto fail;
4791 }
4792 posonly_conflicts++;
4793 } else if (cmp < 0) {
4794 goto fail;
4795 }
4796
4797 }
4798 }
4799 if (posonly_conflicts) {
4800 PyObject* comma = PyUnicode_FromString(", ");
4801 if (comma == NULL) {
4802 goto fail;
4803 }
4804 PyObject* error_names = PyUnicode_Join(comma, posonly_names);
4805 Py_DECREF(comma);
4806 if (error_names == NULL) {
4807 goto fail;
4808 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004809 _PyErr_Format(tstate, PyExc_TypeError,
4810 "%U() got some positional-only arguments passed"
4811 " as keyword arguments: '%U'",
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004812 qualname, error_names);
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004813 Py_DECREF(error_names);
4814 goto fail;
4815 }
4816
4817 Py_DECREF(posonly_names);
4818 return 0;
4819
4820fail:
4821 Py_XDECREF(posonly_names);
4822 return 1;
4823
4824}
4825
Skip Montanaro786ea6b2004-03-01 15:44:05 +00004826
Mark Shannon0332e562021-02-01 10:42:03 +00004827PyFrameObject *
4828_PyEval_MakeFrameVector(PyThreadState *tstate,
Mark Shannond6c33fb2021-01-29 13:24:55 +00004829 PyFrameConstructor *con, PyObject *locals,
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02004830 PyObject *const *args, Py_ssize_t argcount,
Mark Shannon0332e562021-02-01 10:42:03 +00004831 PyObject *kwnames)
Tim Peters5ca576e2001-06-18 22:08:13 +00004832{
Victor Stinnerda2914d2020-03-20 09:29:08 +01004833 assert(is_tstate_valid(tstate));
Victor Stinnerb5e170f2019-11-16 01:03:22 +01004834
Mark Shannond6c33fb2021-01-29 13:24:55 +00004835 PyCodeObject *co = (PyCodeObject*)con->fc_code;
4836 assert(con->fc_defaults == NULL || PyTuple_CheckExact(con->fc_defaults));
Pablo Galindocd74e662019-06-01 18:08:04 +01004837 const Py_ssize_t total_args = co->co_argcount + co->co_kwonlyargcount;
Tim Peters5ca576e2001-06-18 22:08:13 +00004838
Victor Stinnerc7020012016-08-16 23:40:29 +02004839 /* Create the frame */
Mark Shannon0332e562021-02-01 10:42:03 +00004840 PyFrameObject *f = _PyFrame_New_NoTrack(tstate, con, locals);
Victor Stinnerc7020012016-08-16 23:40:29 +02004841 if (f == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004842 return NULL;
Victor Stinnerc7020012016-08-16 23:40:29 +02004843 }
Victor Stinner232dda62020-06-04 15:19:02 +02004844 PyObject **fastlocals = f->f_localsplus;
4845 PyObject **freevars = f->f_localsplus + co->co_nlocals;
Tim Peters5ca576e2001-06-18 22:08:13 +00004846
Victor Stinnerc7020012016-08-16 23:40:29 +02004847 /* Create a dictionary for keyword parameters (**kwags) */
Victor Stinner232dda62020-06-04 15:19:02 +02004848 PyObject *kwdict;
4849 Py_ssize_t i;
Benjamin Petersonb204a422011-06-05 22:04:07 -05004850 if (co->co_flags & CO_VARKEYWORDS) {
4851 kwdict = PyDict_New();
4852 if (kwdict == NULL)
4853 goto fail;
4854 i = total_args;
Victor Stinnerc7020012016-08-16 23:40:29 +02004855 if (co->co_flags & CO_VARARGS) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004856 i++;
Victor Stinnerc7020012016-08-16 23:40:29 +02004857 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004858 SETLOCAL(i, kwdict);
4859 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004860 else {
4861 kwdict = NULL;
4862 }
4863
Pablo Galindocd74e662019-06-01 18:08:04 +01004864 /* Copy all positional arguments into local variables */
Victor Stinner232dda62020-06-04 15:19:02 +02004865 Py_ssize_t j, n;
Pablo Galindocd74e662019-06-01 18:08:04 +01004866 if (argcount > co->co_argcount) {
4867 n = co->co_argcount;
Victor Stinnerc7020012016-08-16 23:40:29 +02004868 }
4869 else {
4870 n = argcount;
4871 }
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004872 for (j = 0; j < n; j++) {
Victor Stinner232dda62020-06-04 15:19:02 +02004873 PyObject *x = args[j];
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004874 Py_INCREF(x);
4875 SETLOCAL(j, x);
4876 }
4877
Victor Stinnerc7020012016-08-16 23:40:29 +02004878 /* Pack other positional arguments into the *args argument */
Benjamin Petersonb204a422011-06-05 22:04:07 -05004879 if (co->co_flags & CO_VARARGS) {
Victor Stinner232dda62020-06-04 15:19:02 +02004880 PyObject *u = _PyTuple_FromArray(args + n, argcount - n);
Victor Stinnerc7020012016-08-16 23:40:29 +02004881 if (u == NULL) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004882 goto fail;
Victor Stinnerc7020012016-08-16 23:40:29 +02004883 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004884 SETLOCAL(total_args, u);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004885 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004886
Mark Shannon0332e562021-02-01 10:42:03 +00004887 /* Handle keyword arguments */
4888 if (kwnames != NULL) {
4889 Py_ssize_t kwcount = PyTuple_GET_SIZE(kwnames);
4890 for (i = 0; i < kwcount; i++) {
4891 PyObject **co_varnames;
4892 PyObject *keyword = PyTuple_GET_ITEM(kwnames, i);
4893 PyObject *value = args[i+argcount];
4894 Py_ssize_t j;
Victor Stinnerc7020012016-08-16 23:40:29 +02004895
Mark Shannon0332e562021-02-01 10:42:03 +00004896 if (keyword == NULL || !PyUnicode_Check(keyword)) {
4897 _PyErr_Format(tstate, PyExc_TypeError,
4898 "%U() keywords must be strings",
Mark Shannond6c33fb2021-01-29 13:24:55 +00004899 con->fc_qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004900 goto fail;
Victor Stinner6fea7f72016-08-22 23:17:30 +02004901 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004902
Mark Shannon0332e562021-02-01 10:42:03 +00004903 /* Speed hack: do raw pointer compares. As names are
4904 normally interned this should almost always hit. */
4905 co_varnames = ((PyTupleObject *)(co->co_varnames))->ob_item;
4906 for (j = co->co_posonlyargcount; j < total_args; j++) {
4907 PyObject *varname = co_varnames[j];
4908 if (varname == keyword) {
4909 goto kw_found;
4910 }
4911 }
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004912
Mark Shannon0332e562021-02-01 10:42:03 +00004913 /* Slow fallback, just in case */
4914 for (j = co->co_posonlyargcount; j < total_args; j++) {
4915 PyObject *varname = co_varnames[j];
4916 int cmp = PyObject_RichCompareBool( keyword, varname, Py_EQ);
4917 if (cmp > 0) {
4918 goto kw_found;
4919 }
4920 else if (cmp < 0) {
4921 goto fail;
4922 }
4923 }
4924
4925 assert(j >= total_args);
4926 if (kwdict == NULL) {
4927
4928 if (co->co_posonlyargcount
4929 && positional_only_passed_as_keyword(tstate, co,
4930 kwcount, kwnames,
Mark Shannond6c33fb2021-01-29 13:24:55 +00004931 con->fc_qualname))
Mark Shannon0332e562021-02-01 10:42:03 +00004932 {
4933 goto fail;
4934 }
4935
4936 _PyErr_Format(tstate, PyExc_TypeError,
4937 "%U() got an unexpected keyword argument '%S'",
4938 con->fc_qualname, keyword);
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004939 goto fail;
4940 }
4941
Mark Shannon0332e562021-02-01 10:42:03 +00004942 if (PyDict_SetItem(kwdict, keyword, value) == -1) {
4943 goto fail;
4944 }
4945 continue;
Victor Stinnerc7020012016-08-16 23:40:29 +02004946
Mark Shannon0332e562021-02-01 10:42:03 +00004947 kw_found:
4948 if (GETLOCAL(j) != NULL) {
4949 _PyErr_Format(tstate, PyExc_TypeError,
4950 "%U() got multiple values for argument '%S'",
Mark Shannond6c33fb2021-01-29 13:24:55 +00004951 con->fc_qualname, keyword);
Mark Shannon0332e562021-02-01 10:42:03 +00004952 goto fail;
4953 }
4954 Py_INCREF(value);
4955 SETLOCAL(j, value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004956 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004957 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004958
4959 /* Check the number of positional arguments */
Pablo Galindocd74e662019-06-01 18:08:04 +01004960 if ((argcount > co->co_argcount) && !(co->co_flags & CO_VARARGS)) {
Mark Shannond6c33fb2021-01-29 13:24:55 +00004961 too_many_positional(tstate, co, argcount, con->fc_defaults, fastlocals,
4962 con->fc_qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004963 goto fail;
4964 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004965
4966 /* Add missing positional arguments (copy default values from defs) */
Pablo Galindocd74e662019-06-01 18:08:04 +01004967 if (argcount < co->co_argcount) {
Mark Shannond6c33fb2021-01-29 13:24:55 +00004968 Py_ssize_t defcount = con->fc_defaults == NULL ? 0 : PyTuple_GET_SIZE(con->fc_defaults);
Pablo Galindocd74e662019-06-01 18:08:04 +01004969 Py_ssize_t m = co->co_argcount - defcount;
Victor Stinner17061a92016-08-16 23:39:42 +02004970 Py_ssize_t missing = 0;
4971 for (i = argcount; i < m; i++) {
4972 if (GETLOCAL(i) == NULL) {
Benjamin Petersone109c702011-06-24 09:37:26 -05004973 missing++;
Victor Stinner17061a92016-08-16 23:39:42 +02004974 }
4975 }
Benjamin Petersone109c702011-06-24 09:37:26 -05004976 if (missing) {
Victor Stinner232dda62020-06-04 15:19:02 +02004977 missing_arguments(tstate, co, missing, defcount, fastlocals,
Mark Shannond6c33fb2021-01-29 13:24:55 +00004978 con->fc_qualname);
Benjamin Petersone109c702011-06-24 09:37:26 -05004979 goto fail;
Benjamin Petersonb204a422011-06-05 22:04:07 -05004980 }
4981 if (n > m)
4982 i = n - m;
4983 else
4984 i = 0;
Mark Shannond6c33fb2021-01-29 13:24:55 +00004985 if (defcount) {
4986 PyObject **defs = &PyTuple_GET_ITEM(con->fc_defaults, 0);
4987 for (; i < defcount; i++) {
4988 if (GETLOCAL(m+i) == NULL) {
4989 PyObject *def = defs[i];
4990 Py_INCREF(def);
4991 SETLOCAL(m+i, def);
4992 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004993 }
4994 }
4995 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004996
4997 /* Add missing keyword arguments (copy default values from kwdefs) */
Benjamin Petersonb204a422011-06-05 22:04:07 -05004998 if (co->co_kwonlyargcount > 0) {
Victor Stinner17061a92016-08-16 23:39:42 +02004999 Py_ssize_t missing = 0;
Pablo Galindocd74e662019-06-01 18:08:04 +01005000 for (i = co->co_argcount; i < total_args; i++) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05005001 if (GETLOCAL(i) != NULL)
5002 continue;
Victor Stinner232dda62020-06-04 15:19:02 +02005003 PyObject *varname = PyTuple_GET_ITEM(co->co_varnames, i);
Mark Shannond6c33fb2021-01-29 13:24:55 +00005004 if (con->fc_kwdefaults != NULL) {
5005 PyObject *def = PyDict_GetItemWithError(con->fc_kwdefaults, varname);
Benjamin Petersonb204a422011-06-05 22:04:07 -05005006 if (def) {
5007 Py_INCREF(def);
5008 SETLOCAL(i, def);
5009 continue;
5010 }
Victor Stinner438a12d2019-05-24 17:01:38 +02005011 else if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02005012 goto fail;
5013 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05005014 }
Benjamin Petersone109c702011-06-24 09:37:26 -05005015 missing++;
5016 }
5017 if (missing) {
Victor Stinner232dda62020-06-04 15:19:02 +02005018 missing_arguments(tstate, co, missing, -1, fastlocals,
Mark Shannond6c33fb2021-01-29 13:24:55 +00005019 con->fc_qualname);
Benjamin Petersonb204a422011-06-05 22:04:07 -05005020 goto fail;
5021 }
5022 }
5023
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005024 /* Allocate and initialize storage for cell vars, and copy free
Benjamin Peterson90037602011-06-25 22:54:45 -05005025 vars into frame. */
5026 for (i = 0; i < PyTuple_GET_SIZE(co->co_cellvars); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005027 PyObject *c;
Serhiy Storchaka5bb8b912016-12-16 19:19:02 +02005028 Py_ssize_t arg;
Benjamin Peterson90037602011-06-25 22:54:45 -05005029 /* Possibly account for the cell variable being an argument. */
5030 if (co->co_cell2arg != NULL &&
Guido van Rossum6832c812013-05-10 08:47:42 -07005031 (arg = co->co_cell2arg[i]) != CO_CELL_NOT_AN_ARG) {
Benjamin Peterson90037602011-06-25 22:54:45 -05005032 c = PyCell_New(GETLOCAL(arg));
Benjamin Peterson159ae412013-05-12 18:16:06 -05005033 /* Clear the local copy. */
5034 SETLOCAL(arg, NULL);
Guido van Rossum6832c812013-05-10 08:47:42 -07005035 }
5036 else {
Benjamin Peterson90037602011-06-25 22:54:45 -05005037 c = PyCell_New(NULL);
Guido van Rossum6832c812013-05-10 08:47:42 -07005038 }
Benjamin Peterson159ae412013-05-12 18:16:06 -05005039 if (c == NULL)
5040 goto fail;
Benjamin Peterson90037602011-06-25 22:54:45 -05005041 SETLOCAL(co->co_nlocals + i, c);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005042 }
Victor Stinnerc7020012016-08-16 23:40:29 +02005043
5044 /* Copy closure variables to free variables */
Benjamin Peterson90037602011-06-25 22:54:45 -05005045 for (i = 0; i < PyTuple_GET_SIZE(co->co_freevars); ++i) {
Mark Shannond6c33fb2021-01-29 13:24:55 +00005046 PyObject *o = PyTuple_GET_ITEM(con->fc_closure, i);
Benjamin Peterson90037602011-06-25 22:54:45 -05005047 Py_INCREF(o);
5048 freevars[PyTuple_GET_SIZE(co->co_cellvars) + i] = o;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005049 }
Tim Peters5ca576e2001-06-18 22:08:13 +00005050
Mark Shannon0332e562021-02-01 10:42:03 +00005051 return f;
Tim Peters5ca576e2001-06-18 22:08:13 +00005052
Thomas Woutersce272b62007-09-19 21:19:28 +00005053fail: /* Jump here from prelude on failure */
Tim Peters5ca576e2001-06-18 22:08:13 +00005054
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005055 /* decref'ing the frame can cause __del__ methods to get invoked,
5056 which can call back into Python. While we're done with the
5057 current Python frame (f), the associated C stack is still in use,
5058 so recursion_depth must be boosted for the duration.
5059 */
INADA Naoki5a625d02016-12-24 20:19:08 +09005060 if (Py_REFCNT(f) > 1) {
5061 Py_DECREF(f);
5062 _PyObject_GC_TRACK(f);
5063 }
5064 else {
5065 ++tstate->recursion_depth;
5066 Py_DECREF(f);
5067 --tstate->recursion_depth;
5068 }
Mark Shannon0332e562021-02-01 10:42:03 +00005069 return NULL;
5070}
5071
5072static PyObject *
5073make_coro(PyFrameConstructor *con, PyFrameObject *f)
5074{
5075 assert (((PyCodeObject *)con->fc_code)->co_flags & (CO_GENERATOR | CO_COROUTINE | CO_ASYNC_GENERATOR));
5076 PyObject *gen;
5077 int is_coro = ((PyCodeObject *)con->fc_code)->co_flags & CO_COROUTINE;
5078
5079 /* Don't need to keep the reference to f_back, it will be set
5080 * when the generator is resumed. */
5081 Py_CLEAR(f->f_back);
5082
5083 /* Create a new generator that owns the ready to run frame
5084 * and return that as the value. */
5085 if (is_coro) {
5086 gen = PyCoro_New(f, con->fc_name, con->fc_qualname);
5087 } else if (((PyCodeObject *)con->fc_code)->co_flags & CO_ASYNC_GENERATOR) {
5088 gen = PyAsyncGen_New(f, con->fc_name, con->fc_qualname);
5089 } else {
5090 gen = PyGen_NewWithQualName(f, con->fc_name, con->fc_qualname);
5091 }
5092 if (gen == NULL) {
5093 return NULL;
5094 }
5095
5096 _PyObject_GC_TRACK(f);
5097
5098 return gen;
5099}
5100
5101PyObject *
5102_PyEval_Vector(PyThreadState *tstate, PyFrameConstructor *con,
5103 PyObject *locals,
5104 PyObject* const* args, size_t argcount,
5105 PyObject *kwnames)
5106{
5107 PyFrameObject *f = _PyEval_MakeFrameVector(
5108 tstate, con, locals, args, argcount, kwnames);
5109 if (f == NULL) {
5110 return NULL;
5111 }
5112 if (((PyCodeObject *)con->fc_code)->co_flags & (CO_GENERATOR | CO_COROUTINE | CO_ASYNC_GENERATOR)) {
5113 return make_coro(con, f);
5114 }
5115 PyObject *retval = _PyEval_EvalFrame(tstate, f, 0);
5116
5117 /* decref'ing the frame can cause __del__ methods to get invoked,
5118 which can call back into Python. While we're done with the
5119 current Python frame (f), the associated C stack is still in use,
5120 so recursion_depth must be boosted for the duration.
5121 */
5122 if (Py_REFCNT(f) > 1) {
5123 Py_DECREF(f);
5124 _PyObject_GC_TRACK(f);
5125 }
5126 else {
5127 ++tstate->recursion_depth;
5128 Py_DECREF(f);
5129 --tstate->recursion_depth;
5130 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005131 return retval;
Tim Peters5ca576e2001-06-18 22:08:13 +00005132}
5133
Mark Shannond6c33fb2021-01-29 13:24:55 +00005134/* Legacy API */
Victor Stinnerb5e170f2019-11-16 01:03:22 +01005135PyObject *
Mark Shannon0332e562021-02-01 10:42:03 +00005136PyEval_EvalCodeEx(PyObject *_co, PyObject *globals, PyObject *locals,
5137 PyObject *const *args, int argcount,
5138 PyObject *const *kws, int kwcount,
5139 PyObject *const *defs, int defcount,
5140 PyObject *kwdefs, PyObject *closure)
Victor Stinnerb5e170f2019-11-16 01:03:22 +01005141{
Victor Stinner46496f92021-02-20 15:17:18 +01005142 PyThreadState *tstate = _PyThreadState_GET();
Mark Shannon0332e562021-02-01 10:42:03 +00005143 PyObject *res;
Mark Shannond6c33fb2021-01-29 13:24:55 +00005144 PyObject *defaults = _PyTuple_FromArray(defs, defcount);
5145 if (defaults == NULL) {
5146 return NULL;
5147 }
Victor Stinnerfc980e02021-03-18 14:51:24 +01005148 PyObject *builtins = _PyEval_BuiltinsFromGlobals(tstate, globals); // borrowed ref
Mark Shannond6c33fb2021-01-29 13:24:55 +00005149 if (builtins == NULL) {
5150 Py_DECREF(defaults);
5151 return NULL;
5152 }
Mark Shannon0332e562021-02-01 10:42:03 +00005153 if (locals == NULL) {
5154 locals = globals;
5155 }
5156 PyObject *kwnames;
5157 PyObject *const *allargs;
5158 PyObject **newargs;
5159 if (kwcount == 0) {
5160 allargs = args;
5161 kwnames = NULL;
5162 }
5163 else {
5164 kwnames = PyTuple_New(kwcount);
5165 if (kwnames == NULL) {
5166 res = NULL;
5167 goto fail;
5168 }
5169 newargs = PyMem_Malloc(sizeof(PyObject *)*(kwcount+argcount));
5170 if (newargs == NULL) {
5171 res = NULL;
5172 Py_DECREF(kwnames);
5173 goto fail;
5174 }
5175 for (int i = 0; i < argcount; i++) {
5176 newargs[i] = args[i];
5177 }
5178 for (int i = 0; i < kwcount; i++) {
5179 Py_INCREF(kws[2*i]);
5180 PyTuple_SET_ITEM(kwnames, i, kws[2*i]);
5181 newargs[argcount+i] = kws[2*i+1];
5182 }
5183 allargs = newargs;
5184 }
5185 PyObject **kwargs = PyMem_Malloc(sizeof(PyObject *)*kwcount);
5186 if (kwargs == NULL) {
5187 res = NULL;
5188 Py_DECREF(kwnames);
5189 goto fail;
5190 }
5191 for (int i = 0; i < kwcount; i++) {
5192 Py_INCREF(kws[2*i]);
5193 PyTuple_SET_ITEM(kwnames, i, kws[2*i]);
5194 kwargs[i] = kws[2*i+1];
5195 }
Mark Shannond6c33fb2021-01-29 13:24:55 +00005196 PyFrameConstructor constr = {
5197 .fc_globals = globals,
5198 .fc_builtins = builtins,
Mark Shannon0332e562021-02-01 10:42:03 +00005199 .fc_name = ((PyCodeObject *)_co)->co_name,
5200 .fc_qualname = ((PyCodeObject *)_co)->co_name,
Mark Shannond6c33fb2021-01-29 13:24:55 +00005201 .fc_code = _co,
5202 .fc_defaults = defaults,
5203 .fc_kwdefaults = kwdefs,
5204 .fc_closure = closure
5205 };
Mark Shannon0332e562021-02-01 10:42:03 +00005206 res = _PyEval_Vector(tstate, &constr, locals,
Victor Stinner44085a32021-02-18 19:20:16 +01005207 allargs, argcount,
5208 kwnames);
Mark Shannon0332e562021-02-01 10:42:03 +00005209 if (kwcount) {
5210 Py_DECREF(kwnames);
5211 PyMem_Free(newargs);
5212 }
5213fail:
Mark Shannond6c33fb2021-01-29 13:24:55 +00005214 Py_DECREF(defaults);
Mark Shannond6c33fb2021-01-29 13:24:55 +00005215 return res;
Victor Stinnerb5e170f2019-11-16 01:03:22 +01005216}
5217
Tim Peters5ca576e2001-06-18 22:08:13 +00005218
Benjamin Peterson876b2f22009-06-28 03:18:59 +00005219static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02005220special_lookup(PyThreadState *tstate, PyObject *o, _Py_Identifier *id)
Benjamin Peterson876b2f22009-06-28 03:18:59 +00005221{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005222 PyObject *res;
Benjamin Petersonce798522012-01-22 11:24:29 -05005223 res = _PyObject_LookupSpecial(o, id);
Victor Stinner438a12d2019-05-24 17:01:38 +02005224 if (res == NULL && !_PyErr_Occurred(tstate)) {
Victor Stinner4804b5b2020-05-12 01:43:38 +02005225 _PyErr_SetObject(tstate, PyExc_AttributeError, _PyUnicode_FromId(id));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005226 return NULL;
5227 }
5228 return res;
Benjamin Peterson876b2f22009-06-28 03:18:59 +00005229}
5230
5231
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00005232/* Logic for the raise statement (too complicated for inlining).
5233 This *consumes* a reference count to each of its arguments. */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04005234static int
Victor Stinner09532fe2019-05-10 23:39:09 +02005235do_raise(PyThreadState *tstate, PyObject *exc, PyObject *cause)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00005236{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005237 PyObject *type = NULL, *value = NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00005238
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005239 if (exc == NULL) {
5240 /* Reraise */
Mark Shannonae3087c2017-10-22 22:41:51 +01005241 _PyErr_StackItem *exc_info = _PyErr_GetTopmostException(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005242 PyObject *tb;
Mark Shannonae3087c2017-10-22 22:41:51 +01005243 type = exc_info->exc_type;
5244 value = exc_info->exc_value;
5245 tb = exc_info->exc_traceback;
Victor Stinnereec93312016-08-18 18:13:10 +02005246 if (type == Py_None || type == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005247 _PyErr_SetString(tstate, PyExc_RuntimeError,
5248 "No active exception to reraise");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04005249 return 0;
5250 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005251 Py_XINCREF(type);
5252 Py_XINCREF(value);
5253 Py_XINCREF(tb);
Victor Stinner438a12d2019-05-24 17:01:38 +02005254 _PyErr_Restore(tstate, type, value, tb);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04005255 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005256 }
Guido van Rossumac7be682001-01-17 15:42:30 +00005257
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005258 /* We support the following forms of raise:
5259 raise
Collin Winter828f04a2007-08-31 00:04:24 +00005260 raise <instance>
5261 raise <type> */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00005262
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005263 if (PyExceptionClass_Check(exc)) {
5264 type = exc;
Victor Stinnera5ed5f02016-12-06 18:45:50 +01005265 value = _PyObject_CallNoArg(exc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005266 if (value == NULL)
5267 goto raise_error;
Benjamin Peterson5afa03a2011-07-15 14:09:26 -05005268 if (!PyExceptionInstance_Check(value)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005269 _PyErr_Format(tstate, PyExc_TypeError,
5270 "calling %R should have returned an instance of "
5271 "BaseException, not %R",
5272 type, Py_TYPE(value));
5273 goto raise_error;
Benjamin Peterson5afa03a2011-07-15 14:09:26 -05005274 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005275 }
5276 else if (PyExceptionInstance_Check(exc)) {
5277 value = exc;
5278 type = PyExceptionInstance_Class(exc);
5279 Py_INCREF(type);
5280 }
5281 else {
5282 /* Not something you can raise. You get an exception
5283 anyway, just not what you specified :-) */
5284 Py_DECREF(exc);
Victor Stinner438a12d2019-05-24 17:01:38 +02005285 _PyErr_SetString(tstate, PyExc_TypeError,
5286 "exceptions must derive from BaseException");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005287 goto raise_error;
5288 }
Collin Winter828f04a2007-08-31 00:04:24 +00005289
Serhiy Storchakac0191582016-09-27 11:37:10 +03005290 assert(type != NULL);
5291 assert(value != NULL);
5292
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005293 if (cause) {
5294 PyObject *fixed_cause;
5295 if (PyExceptionClass_Check(cause)) {
Victor Stinnera5ed5f02016-12-06 18:45:50 +01005296 fixed_cause = _PyObject_CallNoArg(cause);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005297 if (fixed_cause == NULL)
5298 goto raise_error;
Benjamin Petersond5a1c442012-05-14 22:09:31 -07005299 Py_DECREF(cause);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005300 }
Benjamin Petersond5a1c442012-05-14 22:09:31 -07005301 else if (PyExceptionInstance_Check(cause)) {
5302 fixed_cause = cause;
5303 }
5304 else if (cause == Py_None) {
5305 Py_DECREF(cause);
5306 fixed_cause = NULL;
5307 }
5308 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02005309 _PyErr_SetString(tstate, PyExc_TypeError,
5310 "exception causes must derive from "
5311 "BaseException");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005312 goto raise_error;
5313 }
Benjamin Petersond5a1c442012-05-14 22:09:31 -07005314 PyException_SetCause(value, fixed_cause);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005315 }
Collin Winter828f04a2007-08-31 00:04:24 +00005316
Victor Stinner438a12d2019-05-24 17:01:38 +02005317 _PyErr_SetObject(tstate, type, value);
Victor Stinner61f4db82020-01-28 03:37:45 +01005318 /* _PyErr_SetObject incref's its arguments */
Serhiy Storchakac0191582016-09-27 11:37:10 +03005319 Py_DECREF(value);
5320 Py_DECREF(type);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04005321 return 0;
Collin Winter828f04a2007-08-31 00:04:24 +00005322
5323raise_error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005324 Py_XDECREF(value);
5325 Py_XDECREF(type);
5326 Py_XDECREF(cause);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04005327 return 0;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00005328}
5329
Tim Petersd6d010b2001-06-21 02:49:55 +00005330/* Iterate v argcnt times and store the results on the stack (via decreasing
Guido van Rossum0368b722007-05-11 16:50:42 +00005331 sp). Return 1 for success, 0 if error.
Antoine Pitrou9a2310d2008-07-25 22:39:39 +00005332
Guido van Rossum0368b722007-05-11 16:50:42 +00005333 If argcntafter == -1, do a simple unpack. If it is >= 0, do an unpack
5334 with a variable target.
5335*/
Tim Petersd6d010b2001-06-21 02:49:55 +00005336
Barry Warsawe42b18f1997-08-25 22:13:04 +00005337static int
Victor Stinner438a12d2019-05-24 17:01:38 +02005338unpack_iterable(PyThreadState *tstate, PyObject *v,
5339 int argcnt, int argcntafter, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00005340{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005341 int i = 0, j = 0;
5342 Py_ssize_t ll = 0;
5343 PyObject *it; /* iter(v) */
5344 PyObject *w;
5345 PyObject *l = NULL; /* variable list */
Guido van Rossumac7be682001-01-17 15:42:30 +00005346
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005347 assert(v != NULL);
Tim Petersd6d010b2001-06-21 02:49:55 +00005348
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005349 it = PyObject_GetIter(v);
Serhiy Storchaka13a6c092017-12-26 12:30:41 +02005350 if (it == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005351 if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError) &&
Victor Stinnera102ed72020-02-07 02:24:48 +01005352 Py_TYPE(v)->tp_iter == NULL && !PySequence_Check(v))
Serhiy Storchaka13a6c092017-12-26 12:30:41 +02005353 {
Victor Stinner438a12d2019-05-24 17:01:38 +02005354 _PyErr_Format(tstate, PyExc_TypeError,
5355 "cannot unpack non-iterable %.200s object",
Victor Stinnera102ed72020-02-07 02:24:48 +01005356 Py_TYPE(v)->tp_name);
Serhiy Storchaka13a6c092017-12-26 12:30:41 +02005357 }
5358 return 0;
5359 }
Tim Petersd6d010b2001-06-21 02:49:55 +00005360
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005361 for (; i < argcnt; i++) {
5362 w = PyIter_Next(it);
5363 if (w == NULL) {
5364 /* Iterator done, via error or exhaustion. */
Victor Stinner438a12d2019-05-24 17:01:38 +02005365 if (!_PyErr_Occurred(tstate)) {
R David Murray4171bbe2015-04-15 17:08:45 -04005366 if (argcntafter == -1) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005367 _PyErr_Format(tstate, PyExc_ValueError,
5368 "not enough values to unpack "
5369 "(expected %d, got %d)",
5370 argcnt, i);
R David Murray4171bbe2015-04-15 17:08:45 -04005371 }
5372 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02005373 _PyErr_Format(tstate, PyExc_ValueError,
5374 "not enough values to unpack "
5375 "(expected at least %d, got %d)",
5376 argcnt + argcntafter, i);
R David Murray4171bbe2015-04-15 17:08:45 -04005377 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005378 }
5379 goto Error;
5380 }
5381 *--sp = w;
5382 }
Tim Petersd6d010b2001-06-21 02:49:55 +00005383
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005384 if (argcntafter == -1) {
5385 /* We better have exhausted the iterator now. */
5386 w = PyIter_Next(it);
5387 if (w == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005388 if (_PyErr_Occurred(tstate))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005389 goto Error;
5390 Py_DECREF(it);
5391 return 1;
5392 }
5393 Py_DECREF(w);
Victor Stinner438a12d2019-05-24 17:01:38 +02005394 _PyErr_Format(tstate, PyExc_ValueError,
5395 "too many values to unpack (expected %d)",
5396 argcnt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005397 goto Error;
5398 }
Guido van Rossum0368b722007-05-11 16:50:42 +00005399
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005400 l = PySequence_List(it);
5401 if (l == NULL)
5402 goto Error;
5403 *--sp = l;
5404 i++;
Guido van Rossum0368b722007-05-11 16:50:42 +00005405
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005406 ll = PyList_GET_SIZE(l);
5407 if (ll < argcntafter) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005408 _PyErr_Format(tstate, PyExc_ValueError,
R David Murray4171bbe2015-04-15 17:08:45 -04005409 "not enough values to unpack (expected at least %d, got %zd)",
5410 argcnt + argcntafter, argcnt + ll);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005411 goto Error;
5412 }
Guido van Rossum0368b722007-05-11 16:50:42 +00005413
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005414 /* Pop the "after-variable" args off the list. */
5415 for (j = argcntafter; j > 0; j--, i++) {
5416 *--sp = PyList_GET_ITEM(l, ll - j);
5417 }
5418 /* Resize the list. */
Victor Stinner60ac6ed2020-02-07 23:18:08 +01005419 Py_SET_SIZE(l, ll - argcntafter);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005420 Py_DECREF(it);
5421 return 1;
Guido van Rossum0368b722007-05-11 16:50:42 +00005422
Tim Petersd6d010b2001-06-21 02:49:55 +00005423Error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005424 for (; i > 0; i--, sp++)
5425 Py_DECREF(*sp);
5426 Py_XDECREF(it);
5427 return 0;
Barry Warsawe42b18f1997-08-25 22:13:04 +00005428}
5429
5430
Guido van Rossum96a42c81992-01-12 02:29:51 +00005431#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00005432static int
Victor Stinner438a12d2019-05-24 17:01:38 +02005433prtrace(PyThreadState *tstate, PyObject *v, const char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005434{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005435 printf("%s ", str);
Victor Stinner438a12d2019-05-24 17:01:38 +02005436 if (PyObject_Print(v, stdout, 0) != 0) {
5437 /* Don't know what else to do */
5438 _PyErr_Clear(tstate);
5439 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005440 printf("\n");
5441 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005442}
Guido van Rossum3f5da241990-12-20 15:06:42 +00005443#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005444
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00005445static void
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005446call_exc_trace(Py_tracefunc func, PyObject *self,
Mark Shannon86433452021-01-07 16:49:02 +00005447 PyThreadState *tstate,
5448 PyFrameObject *f,
Mark Shannon8e1b4062021-03-05 14:45:50 +00005449 PyTraceInfo *trace_info)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00005450{
Victor Stinneraaa8ed82013-07-10 13:57:55 +02005451 PyObject *type, *value, *traceback, *orig_traceback, *arg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005452 int err;
Victor Stinner438a12d2019-05-24 17:01:38 +02005453 _PyErr_Fetch(tstate, &type, &value, &orig_traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005454 if (value == NULL) {
5455 value = Py_None;
5456 Py_INCREF(value);
5457 }
Victor Stinner438a12d2019-05-24 17:01:38 +02005458 _PyErr_NormalizeException(tstate, &type, &value, &orig_traceback);
Antoine Pitrou89335212013-11-23 14:05:23 +01005459 traceback = (orig_traceback != NULL) ? orig_traceback : Py_None;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005460 arg = PyTuple_Pack(3, type, value, traceback);
5461 if (arg == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005462 _PyErr_Restore(tstate, type, value, orig_traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005463 return;
5464 }
Mark Shannon8e1b4062021-03-05 14:45:50 +00005465 err = call_trace(func, self, tstate, f, trace_info, PyTrace_EXCEPTION, arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005466 Py_DECREF(arg);
Victor Stinner438a12d2019-05-24 17:01:38 +02005467 if (err == 0) {
5468 _PyErr_Restore(tstate, type, value, orig_traceback);
5469 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005470 else {
5471 Py_XDECREF(type);
5472 Py_XDECREF(value);
Victor Stinneraaa8ed82013-07-10 13:57:55 +02005473 Py_XDECREF(orig_traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005474 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00005475}
5476
Amaury Forgeot d'Arcf05149a2007-11-13 01:05:30 +00005477static int
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005478call_trace_protected(Py_tracefunc func, PyObject *obj,
5479 PyThreadState *tstate, PyFrameObject *frame,
Mark Shannon8e1b4062021-03-05 14:45:50 +00005480 PyTraceInfo *trace_info,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005481 int what, PyObject *arg)
Fred Drake4ec5d562001-10-04 19:26:43 +00005482{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005483 PyObject *type, *value, *traceback;
5484 int err;
Victor Stinner438a12d2019-05-24 17:01:38 +02005485 _PyErr_Fetch(tstate, &type, &value, &traceback);
Mark Shannon8e1b4062021-03-05 14:45:50 +00005486 err = call_trace(func, obj, tstate, frame, trace_info, what, arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005487 if (err == 0)
5488 {
Victor Stinner438a12d2019-05-24 17:01:38 +02005489 _PyErr_Restore(tstate, type, value, traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005490 return 0;
5491 }
5492 else {
5493 Py_XDECREF(type);
5494 Py_XDECREF(value);
5495 Py_XDECREF(traceback);
5496 return -1;
5497 }
Fred Drake4ec5d562001-10-04 19:26:43 +00005498}
5499
Mark Shannon8e1b4062021-03-05 14:45:50 +00005500static void
5501initialize_trace_info(PyTraceInfo *trace_info, PyFrameObject *frame)
5502{
5503 if (trace_info->code != frame->f_code) {
5504 trace_info->code = frame->f_code;
5505 trace_info->instr_prev = -1;
5506 _PyCode_InitAddressRange(frame->f_code, &trace_info->bounds);
5507 }
5508}
5509
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00005510static int
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005511call_trace(Py_tracefunc func, PyObject *obj,
5512 PyThreadState *tstate, PyFrameObject *frame,
Mark Shannon8e1b4062021-03-05 14:45:50 +00005513 PyTraceInfo *trace_info,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005514 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00005515{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005516 int result;
5517 if (tstate->tracing)
5518 return 0;
5519 tstate->tracing++;
5520 tstate->use_tracing = 0;
Mark Shannon86433452021-01-07 16:49:02 +00005521 if (frame->f_lasti < 0) {
5522 frame->f_lineno = frame->f_code->co_firstlineno;
5523 }
5524 else {
Mark Shannon8e1b4062021-03-05 14:45:50 +00005525 initialize_trace_info(trace_info, frame);
Mark Shannonfcb55c02021-04-01 16:00:31 +01005526 frame->f_lineno = _PyCode_CheckLineNumber(frame->f_lasti*2, &trace_info->bounds);
Mark Shannon86433452021-01-07 16:49:02 +00005527 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005528 result = func(obj, frame, what, arg);
Mark Shannon86433452021-01-07 16:49:02 +00005529 frame->f_lineno = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005530 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
5531 || (tstate->c_profilefunc != NULL));
5532 tstate->tracing--;
5533 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00005534}
5535
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00005536PyObject *
5537_PyEval_CallTracing(PyObject *func, PyObject *args)
5538{
Victor Stinner50b48572018-11-01 01:51:40 +01005539 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005540 int save_tracing = tstate->tracing;
5541 int save_use_tracing = tstate->use_tracing;
5542 PyObject *result;
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00005543
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005544 tstate->tracing = 0;
5545 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
5546 || (tstate->c_profilefunc != NULL));
5547 result = PyObject_Call(func, args, NULL);
5548 tstate->tracing = save_tracing;
5549 tstate->use_tracing = save_use_tracing;
5550 return result;
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00005551}
5552
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00005553/* See Objects/lnotab_notes.txt for a description of how tracing works. */
Michael W. Hudson006c7522002-11-08 13:08:46 +00005554static int
Tim Peters8a5c3c72004-04-05 19:36:21 +00005555maybe_call_line_trace(Py_tracefunc func, PyObject *obj,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005556 PyThreadState *tstate, PyFrameObject *frame,
Mark Shannon8e1b4062021-03-05 14:45:50 +00005557 PyTraceInfo *trace_info)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00005558{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005559 int result = 0;
Michael W. Hudson006c7522002-11-08 13:08:46 +00005560
Nick Coghlan5a851672017-09-08 10:14:16 +10005561 /* If the last instruction falls at the start of a line or if it
5562 represents a jump backwards, update the frame's line number and
5563 then call the trace function if we're tracing source lines.
5564 */
Mark Shannon8e1b4062021-03-05 14:45:50 +00005565 initialize_trace_info(trace_info, frame);
5566 int lastline = trace_info->bounds.ar_line;
Mark Shannonfcb55c02021-04-01 16:00:31 +01005567 int line = _PyCode_CheckLineNumber(frame->f_lasti*2, &trace_info->bounds);
Mark Shannonee9f98d2021-01-05 12:04:10 +00005568 if (line != -1 && frame->f_trace_lines) {
5569 /* Trace backward edges or first instruction of a new line */
Mark Shannon8e1b4062021-03-05 14:45:50 +00005570 if (frame->f_lasti < trace_info->instr_prev ||
Mark Shannonfcb55c02021-04-01 16:00:31 +01005571 (line != lastline && frame->f_lasti*2 == trace_info->bounds.ar_start))
Mark Shannonee9f98d2021-01-05 12:04:10 +00005572 {
Mark Shannon8e1b4062021-03-05 14:45:50 +00005573 result = call_trace(func, obj, tstate, frame, trace_info, PyTrace_LINE, Py_None);
Nick Coghlan5a851672017-09-08 10:14:16 +10005574 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005575 }
George King20faa682017-10-18 17:44:22 -07005576 /* Always emit an opcode event if we're tracing all opcodes. */
5577 if (frame->f_trace_opcodes) {
Mark Shannon8e1b4062021-03-05 14:45:50 +00005578 result = call_trace(func, obj, tstate, frame, trace_info, PyTrace_OPCODE, Py_None);
George King20faa682017-10-18 17:44:22 -07005579 }
Mark Shannon8e1b4062021-03-05 14:45:50 +00005580 trace_info->instr_prev = frame->f_lasti;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005581 return result;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00005582}
5583
Victor Stinner309d7cc2020-03-13 16:39:12 +01005584int
5585_PyEval_SetProfile(PyThreadState *tstate, Py_tracefunc func, PyObject *arg)
5586{
Victor Stinnerda2914d2020-03-20 09:29:08 +01005587 assert(is_tstate_valid(tstate));
Victor Stinner309d7cc2020-03-13 16:39:12 +01005588 /* The caller must hold the GIL */
5589 assert(PyGILState_Check());
5590
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005591 /* Call _PySys_Audit() in the context of the current thread state,
Victor Stinner309d7cc2020-03-13 16:39:12 +01005592 even if tstate is not the current thread state. */
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005593 PyThreadState *current_tstate = _PyThreadState_GET();
5594 if (_PySys_Audit(current_tstate, "sys.setprofile", NULL) < 0) {
Victor Stinner309d7cc2020-03-13 16:39:12 +01005595 return -1;
5596 }
5597
5598 PyObject *profileobj = tstate->c_profileobj;
5599
5600 tstate->c_profilefunc = NULL;
5601 tstate->c_profileobj = NULL;
5602 /* Must make sure that tracing is not ignored if 'profileobj' is freed */
5603 tstate->use_tracing = tstate->c_tracefunc != NULL;
5604 Py_XDECREF(profileobj);
5605
5606 Py_XINCREF(arg);
5607 tstate->c_profileobj = arg;
5608 tstate->c_profilefunc = func;
5609
5610 /* Flag that tracing or profiling is turned on */
5611 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
5612 return 0;
5613}
5614
Fred Drake5755ce62001-06-27 19:19:46 +00005615void
5616PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00005617{
Victor Stinner309d7cc2020-03-13 16:39:12 +01005618 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerf6a58502020-03-16 17:41:44 +01005619 if (_PyEval_SetProfile(tstate, func, arg) < 0) {
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005620 /* Log _PySys_Audit() error */
Victor Stinnerf6a58502020-03-16 17:41:44 +01005621 _PyErr_WriteUnraisableMsg("in PyEval_SetProfile", NULL);
5622 }
Victor Stinner309d7cc2020-03-13 16:39:12 +01005623}
5624
5625int
5626_PyEval_SetTrace(PyThreadState *tstate, Py_tracefunc func, PyObject *arg)
5627{
Victor Stinnerda2914d2020-03-20 09:29:08 +01005628 assert(is_tstate_valid(tstate));
Victor Stinner309d7cc2020-03-13 16:39:12 +01005629 /* The caller must hold the GIL */
5630 assert(PyGILState_Check());
5631
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005632 /* Call _PySys_Audit() in the context of the current thread state,
Victor Stinner309d7cc2020-03-13 16:39:12 +01005633 even if tstate is not the current thread state. */
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005634 PyThreadState *current_tstate = _PyThreadState_GET();
5635 if (_PySys_Audit(current_tstate, "sys.settrace", NULL) < 0) {
Victor Stinner309d7cc2020-03-13 16:39:12 +01005636 return -1;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005637 }
5638
Victor Stinnerda2914d2020-03-20 09:29:08 +01005639 struct _ceval_state *ceval2 = &tstate->interp->ceval;
Victor Stinner309d7cc2020-03-13 16:39:12 +01005640 PyObject *traceobj = tstate->c_traceobj;
Victor Stinnerda2914d2020-03-20 09:29:08 +01005641 ceval2->tracing_possible += (func != NULL) - (tstate->c_tracefunc != NULL);
Victor Stinner309d7cc2020-03-13 16:39:12 +01005642
5643 tstate->c_tracefunc = NULL;
5644 tstate->c_traceobj = NULL;
5645 /* Must make sure that profiling is not ignored if 'traceobj' is freed */
5646 tstate->use_tracing = (tstate->c_profilefunc != NULL);
5647 Py_XDECREF(traceobj);
5648
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005649 Py_XINCREF(arg);
Victor Stinner309d7cc2020-03-13 16:39:12 +01005650 tstate->c_traceobj = arg;
5651 tstate->c_tracefunc = func;
5652
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005653 /* Flag that tracing or profiling is turned on */
Victor Stinner309d7cc2020-03-13 16:39:12 +01005654 tstate->use_tracing = ((func != NULL)
5655 || (tstate->c_profilefunc != NULL));
5656
5657 return 0;
Fred Drake5755ce62001-06-27 19:19:46 +00005658}
5659
5660void
5661PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
5662{
Victor Stinner309d7cc2020-03-13 16:39:12 +01005663 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerf6a58502020-03-16 17:41:44 +01005664 if (_PyEval_SetTrace(tstate, func, arg) < 0) {
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005665 /* Log _PySys_Audit() error */
Victor Stinnerf6a58502020-03-16 17:41:44 +01005666 _PyErr_WriteUnraisableMsg("in PyEval_SetTrace", NULL);
5667 }
Fred Draked0838392001-06-16 21:02:31 +00005668}
5669
Victor Stinner309d7cc2020-03-13 16:39:12 +01005670
Yury Selivanov75445082015-05-11 22:57:16 -04005671void
Victor Stinner838f2642019-06-13 22:41:23 +02005672_PyEval_SetCoroutineOriginTrackingDepth(PyThreadState *tstate, int new_depth)
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08005673{
5674 assert(new_depth >= 0);
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08005675 tstate->coroutine_origin_tracking_depth = new_depth;
5676}
5677
5678int
5679_PyEval_GetCoroutineOriginTrackingDepth(void)
5680{
Victor Stinner50b48572018-11-01 01:51:40 +01005681 PyThreadState *tstate = _PyThreadState_GET();
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08005682 return tstate->coroutine_origin_tracking_depth;
5683}
5684
Zackery Spytz79ceccd2020-03-26 06:11:13 -06005685int
Yury Selivanoveb636452016-09-08 22:01:51 -07005686_PyEval_SetAsyncGenFirstiter(PyObject *firstiter)
5687{
Victor Stinner50b48572018-11-01 01:51:40 +01005688 PyThreadState *tstate = _PyThreadState_GET();
Steve Dowerb82e17e2019-05-23 08:45:22 -07005689
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005690 if (_PySys_Audit(tstate, "sys.set_asyncgen_hook_firstiter", NULL) < 0) {
Zackery Spytz79ceccd2020-03-26 06:11:13 -06005691 return -1;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005692 }
5693
Yury Selivanoveb636452016-09-08 22:01:51 -07005694 Py_XINCREF(firstiter);
5695 Py_XSETREF(tstate->async_gen_firstiter, firstiter);
Zackery Spytz79ceccd2020-03-26 06:11:13 -06005696 return 0;
Yury Selivanoveb636452016-09-08 22:01:51 -07005697}
5698
5699PyObject *
5700_PyEval_GetAsyncGenFirstiter(void)
5701{
Victor Stinner50b48572018-11-01 01:51:40 +01005702 PyThreadState *tstate = _PyThreadState_GET();
Yury Selivanoveb636452016-09-08 22:01:51 -07005703 return tstate->async_gen_firstiter;
5704}
5705
Zackery Spytz79ceccd2020-03-26 06:11:13 -06005706int
Yury Selivanoveb636452016-09-08 22:01:51 -07005707_PyEval_SetAsyncGenFinalizer(PyObject *finalizer)
5708{
Victor Stinner50b48572018-11-01 01:51:40 +01005709 PyThreadState *tstate = _PyThreadState_GET();
Steve Dowerb82e17e2019-05-23 08:45:22 -07005710
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005711 if (_PySys_Audit(tstate, "sys.set_asyncgen_hook_finalizer", NULL) < 0) {
Zackery Spytz79ceccd2020-03-26 06:11:13 -06005712 return -1;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005713 }
5714
Yury Selivanoveb636452016-09-08 22:01:51 -07005715 Py_XINCREF(finalizer);
5716 Py_XSETREF(tstate->async_gen_finalizer, finalizer);
Zackery Spytz79ceccd2020-03-26 06:11:13 -06005717 return 0;
Yury Selivanoveb636452016-09-08 22:01:51 -07005718}
5719
5720PyObject *
5721_PyEval_GetAsyncGenFinalizer(void)
5722{
Victor Stinner50b48572018-11-01 01:51:40 +01005723 PyThreadState *tstate = _PyThreadState_GET();
Yury Selivanoveb636452016-09-08 22:01:51 -07005724 return tstate->async_gen_finalizer;
5725}
5726
Victor Stinner438a12d2019-05-24 17:01:38 +02005727PyFrameObject *
5728PyEval_GetFrame(void)
5729{
5730 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner6723e932020-03-20 17:46:56 +01005731 return tstate->frame;
Victor Stinner438a12d2019-05-24 17:01:38 +02005732}
5733
Guido van Rossumb209a111997-04-29 18:18:01 +00005734PyObject *
Victor Stinner46496f92021-02-20 15:17:18 +01005735_PyEval_GetBuiltins(PyThreadState *tstate)
5736{
5737 PyFrameObject *frame = tstate->frame;
5738 if (frame != NULL) {
5739 return frame->f_builtins;
5740 }
5741 return tstate->interp->builtins;
5742}
5743
5744PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005745PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00005746{
Victor Stinner438a12d2019-05-24 17:01:38 +02005747 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner46496f92021-02-20 15:17:18 +01005748 return _PyEval_GetBuiltins(tstate);
Guido van Rossum6135a871995-01-09 17:53:26 +00005749}
5750
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02005751/* Convenience function to get a builtin from its name */
5752PyObject *
5753_PyEval_GetBuiltinId(_Py_Identifier *name)
5754{
Victor Stinner438a12d2019-05-24 17:01:38 +02005755 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02005756 PyObject *attr = _PyDict_GetItemIdWithError(PyEval_GetBuiltins(), name);
5757 if (attr) {
5758 Py_INCREF(attr);
5759 }
Victor Stinner438a12d2019-05-24 17:01:38 +02005760 else if (!_PyErr_Occurred(tstate)) {
5761 _PyErr_SetObject(tstate, PyExc_AttributeError, _PyUnicode_FromId(name));
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02005762 }
5763 return attr;
5764}
5765
Guido van Rossumb209a111997-04-29 18:18:01 +00005766PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005767PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00005768{
Victor Stinner438a12d2019-05-24 17:01:38 +02005769 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner6723e932020-03-20 17:46:56 +01005770 PyFrameObject *current_frame = tstate->frame;
Victor Stinner41bb43a2013-10-29 01:19:37 +01005771 if (current_frame == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005772 _PyErr_SetString(tstate, PyExc_SystemError, "frame does not exist");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005773 return NULL;
Victor Stinner41bb43a2013-10-29 01:19:37 +01005774 }
5775
Victor Stinner438a12d2019-05-24 17:01:38 +02005776 if (PyFrame_FastToLocalsWithError(current_frame) < 0) {
Victor Stinner41bb43a2013-10-29 01:19:37 +01005777 return NULL;
Victor Stinner438a12d2019-05-24 17:01:38 +02005778 }
Victor Stinner41bb43a2013-10-29 01:19:37 +01005779
5780 assert(current_frame->f_locals != NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005781 return current_frame->f_locals;
Guido van Rossum5b722181993-03-30 17:46:03 +00005782}
5783
Guido van Rossumb209a111997-04-29 18:18:01 +00005784PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005785PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00005786{
Victor Stinner438a12d2019-05-24 17:01:38 +02005787 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner6723e932020-03-20 17:46:56 +01005788 PyFrameObject *current_frame = tstate->frame;
Victor Stinner438a12d2019-05-24 17:01:38 +02005789 if (current_frame == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005790 return NULL;
Victor Stinner438a12d2019-05-24 17:01:38 +02005791 }
Victor Stinner41bb43a2013-10-29 01:19:37 +01005792
5793 assert(current_frame->f_globals != NULL);
5794 return current_frame->f_globals;
Guido van Rossum3f5da241990-12-20 15:06:42 +00005795}
5796
Guido van Rossum6135a871995-01-09 17:53:26 +00005797int
Tim Peters5ba58662001-07-16 02:29:45 +00005798PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
Jeremy Hylton061d1062001-03-22 02:32:48 +00005799{
Victor Stinner438a12d2019-05-24 17:01:38 +02005800 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner6723e932020-03-20 17:46:56 +01005801 PyFrameObject *current_frame = tstate->frame;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005802 int result = cf->cf_flags != 0;
Tim Peters5ba58662001-07-16 02:29:45 +00005803
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005804 if (current_frame != NULL) {
5805 const int codeflags = current_frame->f_code->co_flags;
5806 const int compilerflags = codeflags & PyCF_MASK;
5807 if (compilerflags) {
5808 result = 1;
5809 cf->cf_flags |= compilerflags;
5810 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00005811#if 0 /* future keyword */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005812 if (codeflags & CO_GENERATOR_ALLOWED) {
5813 result = 1;
5814 cf->cf_flags |= CO_GENERATOR_ALLOWED;
5815 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00005816#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005817 }
5818 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00005819}
5820
Guido van Rossum3f5da241990-12-20 15:06:42 +00005821
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00005822const char *
Tim Peters6d6c1a32001-08-02 04:15:00 +00005823PyEval_GetFuncName(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00005824{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005825 if (PyMethod_Check(func))
5826 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
5827 else if (PyFunction_Check(func))
Serhiy Storchaka06515832016-11-20 09:13:07 +02005828 return PyUnicode_AsUTF8(((PyFunctionObject*)func)->func_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005829 else if (PyCFunction_Check(func))
5830 return ((PyCFunctionObject*)func)->m_ml->ml_name;
5831 else
Victor Stinnera102ed72020-02-07 02:24:48 +01005832 return Py_TYPE(func)->tp_name;
Jeremy Hylton512a2372001-04-11 13:52:29 +00005833}
5834
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00005835const char *
Tim Peters6d6c1a32001-08-02 04:15:00 +00005836PyEval_GetFuncDesc(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00005837{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005838 if (PyMethod_Check(func))
5839 return "()";
5840 else if (PyFunction_Check(func))
5841 return "()";
5842 else if (PyCFunction_Check(func))
5843 return "()";
5844 else
5845 return " object";
Jeremy Hylton512a2372001-04-11 13:52:29 +00005846}
5847
Armin Rigo1c2d7e52005-09-20 18:34:01 +00005848#define C_TRACE(x, call) \
Nicholas Bastind858a772004-06-25 23:31:06 +00005849if (tstate->use_tracing && tstate->c_profilefunc) { \
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005850 if (call_trace(tstate->c_profilefunc, tstate->c_profileobj, \
Mark Shannon8e1b4062021-03-05 14:45:50 +00005851 tstate, tstate->frame, trace_info, \
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005852 PyTrace_C_CALL, func)) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005853 x = NULL; \
5854 } \
5855 else { \
5856 x = call; \
5857 if (tstate->c_profilefunc != NULL) { \
5858 if (x == NULL) { \
5859 call_trace_protected(tstate->c_profilefunc, \
5860 tstate->c_profileobj, \
Mark Shannon8e1b4062021-03-05 14:45:50 +00005861 tstate, tstate->frame, trace_info, \
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005862 PyTrace_C_EXCEPTION, func); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005863 /* XXX should pass (type, value, tb) */ \
5864 } else { \
5865 if (call_trace(tstate->c_profilefunc, \
5866 tstate->c_profileobj, \
Mark Shannon8e1b4062021-03-05 14:45:50 +00005867 tstate, tstate->frame, trace_info, \
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005868 PyTrace_C_RETURN, func)) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005869 Py_DECREF(x); \
5870 x = NULL; \
5871 } \
5872 } \
5873 } \
5874 } \
Nicholas Bastind858a772004-06-25 23:31:06 +00005875} else { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005876 x = call; \
5877 }
Nicholas Bastinc69ebe82004-03-24 21:57:10 +00005878
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005879
5880static PyObject *
5881trace_call_function(PyThreadState *tstate,
Mark Shannon8e1b4062021-03-05 14:45:50 +00005882 PyTraceInfo *trace_info,
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005883 PyObject *func,
5884 PyObject **args, Py_ssize_t nargs,
5885 PyObject *kwnames)
5886{
5887 PyObject *x;
scoder4c9ea092020-05-12 16:12:41 +02005888 if (PyCFunction_CheckExact(func) || PyCMethod_CheckExact(func)) {
Petr Viktorinffd97532020-02-11 17:46:57 +01005889 C_TRACE(x, PyObject_Vectorcall(func, args, nargs, kwnames));
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005890 return x;
5891 }
Andy Lesterdffe4c02020-03-04 07:15:20 -06005892 else if (Py_IS_TYPE(func, &PyMethodDescr_Type) && nargs > 0) {
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005893 /* We need to create a temporary bound method as argument
5894 for profiling.
5895
5896 If nargs == 0, then this cannot work because we have no
5897 "self". In any case, the call itself would raise
5898 TypeError (foo needs an argument), so we just skip
5899 profiling. */
5900 PyObject *self = args[0];
5901 func = Py_TYPE(func)->tp_descr_get(func, self, (PyObject*)Py_TYPE(self));
5902 if (func == NULL) {
5903 return NULL;
5904 }
Petr Viktorinffd97532020-02-11 17:46:57 +01005905 C_TRACE(x, PyObject_Vectorcall(func,
Jeroen Demeyer0d722f32019-07-05 14:48:24 +02005906 args+1, nargs-1,
5907 kwnames));
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005908 Py_DECREF(func);
5909 return x;
5910 }
Petr Viktorinffd97532020-02-11 17:46:57 +01005911 return PyObject_Vectorcall(func, args, nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames);
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005912}
5913
Victor Stinner415c5102017-01-11 00:54:57 +01005914/* Issue #29227: Inline call_function() into _PyEval_EvalFrameDefault()
5915 to reduce the stack consumption. */
5916Py_LOCAL_INLINE(PyObject *) _Py_HOT_FUNCTION
Mark Shannon86433452021-01-07 16:49:02 +00005917call_function(PyThreadState *tstate,
Mark Shannon8e1b4062021-03-05 14:45:50 +00005918 PyTraceInfo *trace_info,
Mark Shannon86433452021-01-07 16:49:02 +00005919 PyObject ***pp_stack,
5920 Py_ssize_t oparg,
5921 PyObject *kwnames)
Jeremy Hyltone8c04322002-08-16 17:47:26 +00005922{
Victor Stinnerf9b760f2016-09-09 10:17:08 -07005923 PyObject **pfunc = (*pp_stack) - oparg - 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005924 PyObject *func = *pfunc;
5925 PyObject *x, *w;
Victor Stinnerd8735722016-09-09 12:36:44 -07005926 Py_ssize_t nkwargs = (kwnames == NULL) ? 0 : PyTuple_GET_SIZE(kwnames);
5927 Py_ssize_t nargs = oparg - nkwargs;
INADA Naoki5566bbb2017-02-03 07:43:03 +09005928 PyObject **stack = (*pp_stack) - nargs - nkwargs;
Jeremy Hyltone8c04322002-08-16 17:47:26 +00005929
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005930 if (tstate->use_tracing) {
Mark Shannon8e1b4062021-03-05 14:45:50 +00005931 x = trace_call_function(tstate, trace_info, func, stack, nargs, kwnames);
INADA Naoki5566bbb2017-02-03 07:43:03 +09005932 }
Victor Stinner4a7cc882015-03-06 23:35:27 +01005933 else {
Petr Viktorinffd97532020-02-11 17:46:57 +01005934 x = PyObject_Vectorcall(func, stack, nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005935 }
Tim Peters8a5c3c72004-04-05 19:36:21 +00005936
Victor Stinner438a12d2019-05-24 17:01:38 +02005937 assert((x != NULL) ^ (_PyErr_Occurred(tstate) != NULL));
Victor Stinnerf9b760f2016-09-09 10:17:08 -07005938
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01005939 /* Clear the stack of the function object. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005940 while ((*pp_stack) > pfunc) {
5941 w = EXT_POP(*pp_stack);
5942 Py_DECREF(w);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005943 }
Victor Stinnerace47d72013-07-18 01:41:08 +02005944
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005945 return x;
Jeremy Hyltone8c04322002-08-16 17:47:26 +00005946}
5947
Jeremy Hylton52820442001-01-03 23:52:36 +00005948static PyObject *
Mark Shannon86433452021-01-07 16:49:02 +00005949do_call_core(PyThreadState *tstate,
Mark Shannon8e1b4062021-03-05 14:45:50 +00005950 PyTraceInfo *trace_info,
Mark Shannon86433452021-01-07 16:49:02 +00005951 PyObject *func,
5952 PyObject *callargs,
5953 PyObject *kwdict)
Jeremy Hylton52820442001-01-03 23:52:36 +00005954{
jdemeyere89de732018-09-19 12:06:20 +02005955 PyObject *result;
5956
scoder4c9ea092020-05-12 16:12:41 +02005957 if (PyCFunction_CheckExact(func) || PyCMethod_CheckExact(func)) {
Jeroen Demeyer7a6873c2019-09-11 13:01:01 +02005958 C_TRACE(result, PyObject_Call(func, callargs, kwdict));
Victor Stinnerf9b760f2016-09-09 10:17:08 -07005959 return result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005960 }
Andy Lesterdffe4c02020-03-04 07:15:20 -06005961 else if (Py_IS_TYPE(func, &PyMethodDescr_Type)) {
jdemeyere89de732018-09-19 12:06:20 +02005962 Py_ssize_t nargs = PyTuple_GET_SIZE(callargs);
5963 if (nargs > 0 && tstate->use_tracing) {
5964 /* We need to create a temporary bound method as argument
5965 for profiling.
5966
5967 If nargs == 0, then this cannot work because we have no
5968 "self". In any case, the call itself would raise
5969 TypeError (foo needs an argument), so we just skip
5970 profiling. */
5971 PyObject *self = PyTuple_GET_ITEM(callargs, 0);
5972 func = Py_TYPE(func)->tp_descr_get(func, self, (PyObject*)Py_TYPE(self));
5973 if (func == NULL) {
5974 return NULL;
5975 }
5976
Victor Stinner4d231bc2019-11-14 13:36:21 +01005977 C_TRACE(result, _PyObject_FastCallDictTstate(
5978 tstate, func,
5979 &_PyTuple_ITEMS(callargs)[1],
5980 nargs - 1,
5981 kwdict));
jdemeyere89de732018-09-19 12:06:20 +02005982 Py_DECREF(func);
5983 return result;
5984 }
Victor Stinner74319ae2016-08-25 00:04:09 +02005985 }
jdemeyere89de732018-09-19 12:06:20 +02005986 return PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00005987}
5988
Serhiy Storchaka483405b2015-02-17 10:14:30 +02005989/* Extract a slice index from a PyLong or an object with the
Guido van Rossum38fff8c2006-03-07 18:50:55 +00005990 nb_index slot defined, and store in *pi.
5991 Silently reduce values larger than PY_SSIZE_T_MAX to PY_SSIZE_T_MAX,
Xiang Zhang2ddf5a12017-05-10 18:19:41 +08005992 and silently boost values less than PY_SSIZE_T_MIN to PY_SSIZE_T_MIN.
Martin v. Löwisdde99d22006-02-17 15:57:41 +00005993 Return 0 on error, 1 on success.
Tim Peterscb479e72001-12-16 19:11:44 +00005994*/
Guido van Rossum20c6add2000-05-08 14:06:50 +00005995int
Martin v. Löwis18e16552006-02-15 17:27:45 +00005996_PyEval_SliceIndex(PyObject *v, Py_ssize_t *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005997{
Victor Stinner438a12d2019-05-24 17:01:38 +02005998 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005999 if (v != Py_None) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006000 Py_ssize_t x;
Victor Stinnera15e2602020-04-08 02:01:56 +02006001 if (_PyIndex_Check(v)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006002 x = PyNumber_AsSsize_t(v, NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02006003 if (x == -1 && _PyErr_Occurred(tstate))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006004 return 0;
6005 }
6006 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02006007 _PyErr_SetString(tstate, PyExc_TypeError,
6008 "slice indices must be integers or "
6009 "None or have an __index__ method");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006010 return 0;
6011 }
6012 *pi = x;
6013 }
6014 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00006015}
6016
Serhiy Storchaka80ec8362017-03-19 19:37:40 +02006017int
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03006018_PyEval_SliceIndexNotNone(PyObject *v, Py_ssize_t *pi)
Serhiy Storchaka80ec8362017-03-19 19:37:40 +02006019{
Victor Stinner438a12d2019-05-24 17:01:38 +02006020 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03006021 Py_ssize_t x;
Victor Stinnera15e2602020-04-08 02:01:56 +02006022 if (_PyIndex_Check(v)) {
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03006023 x = PyNumber_AsSsize_t(v, NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02006024 if (x == -1 && _PyErr_Occurred(tstate))
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03006025 return 0;
6026 }
6027 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02006028 _PyErr_SetString(tstate, PyExc_TypeError,
6029 "slice indices must be integers or "
6030 "have an __index__ method");
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03006031 return 0;
6032 }
6033 *pi = x;
6034 return 1;
Serhiy Storchaka80ec8362017-03-19 19:37:40 +02006035}
6036
Thomas Wouters52152252000-08-17 22:55:00 +00006037static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02006038import_name(PyThreadState *tstate, PyFrameObject *f,
6039 PyObject *name, PyObject *fromlist, PyObject *level)
Serhiy Storchaka133138a2016-08-02 22:51:21 +03006040{
6041 _Py_IDENTIFIER(__import__);
Victor Stinnerdf142fd2016-08-20 00:44:42 +02006042 PyObject *import_func, *res;
6043 PyObject* stack[5];
Serhiy Storchaka133138a2016-08-02 22:51:21 +03006044
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02006045 import_func = _PyDict_GetItemIdWithError(f->f_builtins, &PyId___import__);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03006046 if (import_func == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02006047 if (!_PyErr_Occurred(tstate)) {
6048 _PyErr_SetString(tstate, PyExc_ImportError, "__import__ not found");
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02006049 }
Serhiy Storchaka133138a2016-08-02 22:51:21 +03006050 return NULL;
6051 }
6052
6053 /* Fast path for not overloaded __import__. */
Victor Stinner438a12d2019-05-24 17:01:38 +02006054 if (import_func == tstate->interp->import_func) {
Serhiy Storchaka133138a2016-08-02 22:51:21 +03006055 int ilevel = _PyLong_AsInt(level);
Victor Stinner438a12d2019-05-24 17:01:38 +02006056 if (ilevel == -1 && _PyErr_Occurred(tstate)) {
Serhiy Storchaka133138a2016-08-02 22:51:21 +03006057 return NULL;
6058 }
6059 res = PyImport_ImportModuleLevelObject(
6060 name,
6061 f->f_globals,
6062 f->f_locals == NULL ? Py_None : f->f_locals,
6063 fromlist,
6064 ilevel);
6065 return res;
6066 }
6067
6068 Py_INCREF(import_func);
Victor Stinnerdf142fd2016-08-20 00:44:42 +02006069
6070 stack[0] = name;
6071 stack[1] = f->f_globals;
6072 stack[2] = f->f_locals == NULL ? Py_None : f->f_locals;
6073 stack[3] = fromlist;
6074 stack[4] = level;
Victor Stinner559bb6a2016-08-22 22:48:54 +02006075 res = _PyObject_FastCall(import_func, stack, 5);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03006076 Py_DECREF(import_func);
6077 return res;
6078}
6079
6080static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02006081import_from(PyThreadState *tstate, PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00006082{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006083 PyObject *x;
Xiang Zhang4830f582017-03-21 11:13:42 +08006084 PyObject *fullmodname, *pkgname, *pkgpath, *pkgname_or_unknown, *errmsg;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00006085
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006086 if (_PyObject_LookupAttr(v, name, &x) != 0) {
Antoine Pitrou0373a102014-10-13 20:19:45 +02006087 return x;
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006088 }
Antoine Pitrou0373a102014-10-13 20:19:45 +02006089 /* Issue #17636: in case this failed because of a circular relative
6090 import, try to fallback on reading the module directly from
6091 sys.modules. */
Antoine Pitrou0373a102014-10-13 20:19:45 +02006092 pkgname = _PyObject_GetAttrId(v, &PyId___name__);
Brett Cannon3008bc02015-08-11 18:01:31 -07006093 if (pkgname == NULL) {
6094 goto error;
6095 }
Oren Milman6db70332017-09-19 14:23:01 +03006096 if (!PyUnicode_Check(pkgname)) {
6097 Py_CLEAR(pkgname);
6098 goto error;
6099 }
Antoine Pitrou0373a102014-10-13 20:19:45 +02006100 fullmodname = PyUnicode_FromFormat("%U.%U", pkgname, name);
Brett Cannon3008bc02015-08-11 18:01:31 -07006101 if (fullmodname == NULL) {
Xiang Zhang4830f582017-03-21 11:13:42 +08006102 Py_DECREF(pkgname);
Antoine Pitrou0373a102014-10-13 20:19:45 +02006103 return NULL;
Brett Cannon3008bc02015-08-11 18:01:31 -07006104 }
Eric Snow3f9eee62017-09-15 16:35:20 -06006105 x = PyImport_GetModule(fullmodname);
Antoine Pitrou0373a102014-10-13 20:19:45 +02006106 Py_DECREF(fullmodname);
Victor Stinner438a12d2019-05-24 17:01:38 +02006107 if (x == NULL && !_PyErr_Occurred(tstate)) {
Brett Cannon3008bc02015-08-11 18:01:31 -07006108 goto error;
6109 }
Matthias Bussonnier1bc15642017-02-22 07:06:50 -08006110 Py_DECREF(pkgname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006111 return x;
Brett Cannon3008bc02015-08-11 18:01:31 -07006112 error:
Matthias Bussonnierbc4bed42017-02-14 16:05:25 -08006113 pkgpath = PyModule_GetFilenameObject(v);
Matthias Bussonnier1bc15642017-02-22 07:06:50 -08006114 if (pkgname == NULL) {
6115 pkgname_or_unknown = PyUnicode_FromString("<unknown module name>");
6116 if (pkgname_or_unknown == NULL) {
6117 Py_XDECREF(pkgpath);
6118 return NULL;
6119 }
6120 } else {
6121 pkgname_or_unknown = pkgname;
6122 }
Matthias Bussonnierbc4bed42017-02-14 16:05:25 -08006123
6124 if (pkgpath == NULL || !PyUnicode_Check(pkgpath)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02006125 _PyErr_Clear(tstate);
Xiang Zhang4830f582017-03-21 11:13:42 +08006126 errmsg = PyUnicode_FromFormat(
6127 "cannot import name %R from %R (unknown location)",
6128 name, pkgname_or_unknown
6129 );
Stefan Krah027b09c2019-03-25 21:50:58 +01006130 /* NULL checks for errmsg and pkgname done by PyErr_SetImportError. */
Xiang Zhang4830f582017-03-21 11:13:42 +08006131 PyErr_SetImportError(errmsg, pkgname, NULL);
6132 }
6133 else {
Anthony Sottile65366bc2019-09-09 08:17:50 -07006134 _Py_IDENTIFIER(__spec__);
6135 PyObject *spec = _PyObject_GetAttrId(v, &PyId___spec__);
Anthony Sottile65366bc2019-09-09 08:17:50 -07006136 const char *fmt =
6137 _PyModuleSpec_IsInitializing(spec) ?
6138 "cannot import name %R from partially initialized module %R "
6139 "(most likely due to a circular import) (%S)" :
6140 "cannot import name %R from %R (%S)";
6141 Py_XDECREF(spec);
6142
6143 errmsg = PyUnicode_FromFormat(fmt, name, pkgname_or_unknown, pkgpath);
Stefan Krah027b09c2019-03-25 21:50:58 +01006144 /* NULL checks for errmsg and pkgname done by PyErr_SetImportError. */
Xiang Zhang4830f582017-03-21 11:13:42 +08006145 PyErr_SetImportError(errmsg, pkgname, pkgpath);
Matthias Bussonnierbc4bed42017-02-14 16:05:25 -08006146 }
6147
Xiang Zhang4830f582017-03-21 11:13:42 +08006148 Py_XDECREF(errmsg);
Matthias Bussonnier1bc15642017-02-22 07:06:50 -08006149 Py_XDECREF(pkgname_or_unknown);
6150 Py_XDECREF(pkgpath);
Brett Cannon3008bc02015-08-11 18:01:31 -07006151 return NULL;
Thomas Wouters52152252000-08-17 22:55:00 +00006152}
Guido van Rossumac7be682001-01-17 15:42:30 +00006153
Thomas Wouters52152252000-08-17 22:55:00 +00006154static int
Victor Stinner438a12d2019-05-24 17:01:38 +02006155import_all_from(PyThreadState *tstate, PyObject *locals, PyObject *v)
Thomas Wouters52152252000-08-17 22:55:00 +00006156{
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02006157 _Py_IDENTIFIER(__all__);
6158 _Py_IDENTIFIER(__dict__);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006159 PyObject *all, *dict, *name, *value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006160 int skip_leading_underscores = 0;
6161 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00006162
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006163 if (_PyObject_LookupAttrId(v, &PyId___all__, &all) < 0) {
6164 return -1; /* Unexpected error */
6165 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006166 if (all == NULL) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006167 if (_PyObject_LookupAttrId(v, &PyId___dict__, &dict) < 0) {
6168 return -1;
6169 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006170 if (dict == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02006171 _PyErr_SetString(tstate, PyExc_ImportError,
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006172 "from-import-* object has no __dict__ and no __all__");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006173 return -1;
6174 }
6175 all = PyMapping_Keys(dict);
6176 Py_DECREF(dict);
6177 if (all == NULL)
6178 return -1;
6179 skip_leading_underscores = 1;
6180 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00006181
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006182 for (pos = 0, err = 0; ; pos++) {
6183 name = PySequence_GetItem(all, pos);
6184 if (name == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02006185 if (!_PyErr_ExceptionMatches(tstate, PyExc_IndexError)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006186 err = -1;
Victor Stinner438a12d2019-05-24 17:01:38 +02006187 }
6188 else {
6189 _PyErr_Clear(tstate);
6190 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006191 break;
6192 }
Xiang Zhangd8b291a2018-03-24 18:39:36 +08006193 if (!PyUnicode_Check(name)) {
6194 PyObject *modname = _PyObject_GetAttrId(v, &PyId___name__);
6195 if (modname == NULL) {
6196 Py_DECREF(name);
6197 err = -1;
6198 break;
6199 }
6200 if (!PyUnicode_Check(modname)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02006201 _PyErr_Format(tstate, PyExc_TypeError,
6202 "module __name__ must be a string, not %.100s",
6203 Py_TYPE(modname)->tp_name);
Xiang Zhangd8b291a2018-03-24 18:39:36 +08006204 }
6205 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02006206 _PyErr_Format(tstate, PyExc_TypeError,
6207 "%s in %U.%s must be str, not %.100s",
6208 skip_leading_underscores ? "Key" : "Item",
6209 modname,
6210 skip_leading_underscores ? "__dict__" : "__all__",
6211 Py_TYPE(name)->tp_name);
Xiang Zhangd8b291a2018-03-24 18:39:36 +08006212 }
6213 Py_DECREF(modname);
6214 Py_DECREF(name);
6215 err = -1;
6216 break;
6217 }
6218 if (skip_leading_underscores) {
Serhiy Storchakae3b2b4b2017-09-08 09:58:51 +03006219 if (PyUnicode_READY(name) == -1) {
6220 Py_DECREF(name);
6221 err = -1;
6222 break;
6223 }
6224 if (PyUnicode_READ_CHAR(name, 0) == '_') {
6225 Py_DECREF(name);
6226 continue;
6227 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006228 }
6229 value = PyObject_GetAttr(v, name);
6230 if (value == NULL)
6231 err = -1;
6232 else if (PyDict_CheckExact(locals))
6233 err = PyDict_SetItem(locals, name, value);
6234 else
6235 err = PyObject_SetItem(locals, name, value);
6236 Py_DECREF(name);
6237 Py_XDECREF(value);
6238 if (err != 0)
6239 break;
6240 }
6241 Py_DECREF(all);
6242 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00006243}
6244
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03006245static int
Victor Stinner438a12d2019-05-24 17:01:38 +02006246check_args_iterable(PyThreadState *tstate, PyObject *func, PyObject *args)
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03006247{
Victor Stinnera102ed72020-02-07 02:24:48 +01006248 if (Py_TYPE(args)->tp_iter == NULL && !PySequence_Check(args)) {
Jeroen Demeyerbf17d412019-11-05 16:48:04 +01006249 /* check_args_iterable() may be called with a live exception:
6250 * clear it to prevent calling _PyObject_FunctionStr() with an
6251 * exception set. */
Victor Stinner61f4db82020-01-28 03:37:45 +01006252 _PyErr_Clear(tstate);
Jeroen Demeyerbf17d412019-11-05 16:48:04 +01006253 PyObject *funcstr = _PyObject_FunctionStr(func);
6254 if (funcstr != NULL) {
6255 _PyErr_Format(tstate, PyExc_TypeError,
6256 "%U argument after * must be an iterable, not %.200s",
6257 funcstr, Py_TYPE(args)->tp_name);
6258 Py_DECREF(funcstr);
6259 }
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03006260 return -1;
6261 }
6262 return 0;
6263}
6264
6265static void
Victor Stinner438a12d2019-05-24 17:01:38 +02006266format_kwargs_error(PyThreadState *tstate, PyObject *func, PyObject *kwargs)
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03006267{
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02006268 /* _PyDict_MergeEx raises attribute
6269 * error (percolated from an attempt
6270 * to get 'keys' attribute) instead of
6271 * a type error if its second argument
6272 * is not a mapping.
6273 */
Victor Stinner438a12d2019-05-24 17:01:38 +02006274 if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) {
Victor Stinner61f4db82020-01-28 03:37:45 +01006275 _PyErr_Clear(tstate);
Jeroen Demeyerbf17d412019-11-05 16:48:04 +01006276 PyObject *funcstr = _PyObject_FunctionStr(func);
6277 if (funcstr != NULL) {
6278 _PyErr_Format(
6279 tstate, PyExc_TypeError,
6280 "%U argument after ** must be a mapping, not %.200s",
6281 funcstr, Py_TYPE(kwargs)->tp_name);
6282 Py_DECREF(funcstr);
6283 }
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02006284 }
Victor Stinner438a12d2019-05-24 17:01:38 +02006285 else if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02006286 PyObject *exc, *val, *tb;
Victor Stinner438a12d2019-05-24 17:01:38 +02006287 _PyErr_Fetch(tstate, &exc, &val, &tb);
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02006288 if (val && PyTuple_Check(val) && PyTuple_GET_SIZE(val) == 1) {
Victor Stinner61f4db82020-01-28 03:37:45 +01006289 _PyErr_Clear(tstate);
Jeroen Demeyerbf17d412019-11-05 16:48:04 +01006290 PyObject *funcstr = _PyObject_FunctionStr(func);
6291 if (funcstr != NULL) {
6292 PyObject *key = PyTuple_GET_ITEM(val, 0);
6293 _PyErr_Format(
6294 tstate, PyExc_TypeError,
6295 "%U got multiple values for keyword argument '%S'",
6296 funcstr, key);
6297 Py_DECREF(funcstr);
6298 }
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02006299 Py_XDECREF(exc);
6300 Py_XDECREF(val);
6301 Py_XDECREF(tb);
6302 }
6303 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02006304 _PyErr_Restore(tstate, exc, val, tb);
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02006305 }
6306 }
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03006307}
6308
Guido van Rossumac7be682001-01-17 15:42:30 +00006309static void
Victor Stinner438a12d2019-05-24 17:01:38 +02006310format_exc_check_arg(PyThreadState *tstate, PyObject *exc,
6311 const char *format_str, PyObject *obj)
Paul Prescode68140d2000-08-30 20:25:01 +00006312{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006313 const char *obj_str;
Paul Prescode68140d2000-08-30 20:25:01 +00006314
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006315 if (!obj)
6316 return;
Paul Prescode68140d2000-08-30 20:25:01 +00006317
Serhiy Storchaka06515832016-11-20 09:13:07 +02006318 obj_str = PyUnicode_AsUTF8(obj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006319 if (!obj_str)
6320 return;
Paul Prescode68140d2000-08-30 20:25:01 +00006321
Victor Stinner438a12d2019-05-24 17:01:38 +02006322 _PyErr_Format(tstate, exc, format_str, obj_str);
Paul Prescode68140d2000-08-30 20:25:01 +00006323}
Guido van Rossum950361c1997-01-24 13:49:28 +00006324
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00006325static void
Victor Stinner438a12d2019-05-24 17:01:38 +02006326format_exc_unbound(PyThreadState *tstate, PyCodeObject *co, int oparg)
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00006327{
6328 PyObject *name;
6329 /* Don't stomp existing exception */
Victor Stinner438a12d2019-05-24 17:01:38 +02006330 if (_PyErr_Occurred(tstate))
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00006331 return;
6332 if (oparg < PyTuple_GET_SIZE(co->co_cellvars)) {
6333 name = PyTuple_GET_ITEM(co->co_cellvars,
6334 oparg);
Victor Stinner438a12d2019-05-24 17:01:38 +02006335 format_exc_check_arg(tstate,
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00006336 PyExc_UnboundLocalError,
6337 UNBOUNDLOCAL_ERROR_MSG,
6338 name);
6339 } else {
6340 name = PyTuple_GET_ITEM(co->co_freevars, oparg -
6341 PyTuple_GET_SIZE(co->co_cellvars));
Victor Stinner438a12d2019-05-24 17:01:38 +02006342 format_exc_check_arg(tstate, PyExc_NameError,
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00006343 UNBOUNDFREE_ERROR_MSG, name);
6344 }
6345}
6346
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03006347static void
Mark Shannonfee55262019-11-21 09:11:43 +00006348format_awaitable_error(PyThreadState *tstate, PyTypeObject *type, int prevprevopcode, int prevopcode)
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03006349{
6350 if (type->tp_as_async == NULL || type->tp_as_async->am_await == NULL) {
6351 if (prevopcode == BEFORE_ASYNC_WITH) {
Victor Stinner438a12d2019-05-24 17:01:38 +02006352 _PyErr_Format(tstate, PyExc_TypeError,
6353 "'async with' received an object from __aenter__ "
6354 "that does not implement __await__: %.100s",
6355 type->tp_name);
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03006356 }
Mark Shannonfee55262019-11-21 09:11:43 +00006357 else if (prevopcode == WITH_EXCEPT_START || (prevopcode == CALL_FUNCTION && prevprevopcode == DUP_TOP)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02006358 _PyErr_Format(tstate, PyExc_TypeError,
6359 "'async with' received an object from __aexit__ "
6360 "that does not implement __await__: %.100s",
6361 type->tp_name);
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03006362 }
6363 }
6364}
6365
Victor Stinnerd2a915d2011-10-02 20:34:20 +02006366static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02006367unicode_concatenate(PyThreadState *tstate, PyObject *v, PyObject *w,
Serhiy Storchakaab874002016-09-11 13:48:15 +03006368 PyFrameObject *f, const _Py_CODEUNIT *next_instr)
Victor Stinnerd2a915d2011-10-02 20:34:20 +02006369{
6370 PyObject *res;
6371 if (Py_REFCNT(v) == 2) {
6372 /* In the common case, there are 2 references to the value
6373 * stored in 'variable' when the += is performed: one on the
6374 * value stack (in 'v') and one still stored in the
6375 * 'variable'. We try to delete the variable now to reduce
6376 * the refcnt to 1.
6377 */
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03006378 int opcode, oparg;
6379 NEXTOPARG();
6380 switch (opcode) {
Victor Stinnerd2a915d2011-10-02 20:34:20 +02006381 case STORE_FAST:
6382 {
Victor Stinnerd2a915d2011-10-02 20:34:20 +02006383 PyObject **fastlocals = f->f_localsplus;
6384 if (GETLOCAL(oparg) == v)
6385 SETLOCAL(oparg, NULL);
6386 break;
6387 }
6388 case STORE_DEREF:
6389 {
6390 PyObject **freevars = (f->f_localsplus +
6391 f->f_code->co_nlocals);
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03006392 PyObject *c = freevars[oparg];
Raymond Hettingerc32f9db2016-11-12 04:10:35 -05006393 if (PyCell_GET(c) == v) {
6394 PyCell_SET(c, NULL);
6395 Py_DECREF(v);
6396 }
Victor Stinnerd2a915d2011-10-02 20:34:20 +02006397 break;
6398 }
6399 case STORE_NAME:
6400 {
6401 PyObject *names = f->f_code->co_names;
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03006402 PyObject *name = GETITEM(names, oparg);
Victor Stinnerd2a915d2011-10-02 20:34:20 +02006403 PyObject *locals = f->f_locals;
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02006404 if (locals && PyDict_CheckExact(locals)) {
6405 PyObject *w = PyDict_GetItemWithError(locals, name);
6406 if ((w == v && PyDict_DelItem(locals, name) != 0) ||
Victor Stinner438a12d2019-05-24 17:01:38 +02006407 (w == NULL && _PyErr_Occurred(tstate)))
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02006408 {
6409 Py_DECREF(v);
6410 return NULL;
Victor Stinnerd2a915d2011-10-02 20:34:20 +02006411 }
6412 }
6413 break;
6414 }
6415 }
6416 }
6417 res = v;
6418 PyUnicode_Append(&res, w);
6419 return res;
6420}
6421
Guido van Rossum950361c1997-01-24 13:49:28 +00006422#ifdef DYNAMIC_EXECUTION_PROFILE
6423
Skip Montanarof118cb12001-10-15 20:51:38 +00006424static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00006425getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00006426{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006427 int i;
6428 PyObject *l = PyList_New(256);
6429 if (l == NULL) return NULL;
6430 for (i = 0; i < 256; i++) {
6431 PyObject *x = PyLong_FromLong(a[i]);
6432 if (x == NULL) {
6433 Py_DECREF(l);
6434 return NULL;
6435 }
Zackery Spytz99d56b52018-12-08 07:16:55 -07006436 PyList_SET_ITEM(l, i, x);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006437 }
6438 for (i = 0; i < 256; i++)
6439 a[i] = 0;
6440 return l;
Guido van Rossum950361c1997-01-24 13:49:28 +00006441}
6442
6443PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00006444_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00006445{
6446#ifndef DXPAIRS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006447 return getarray(dxp);
Guido van Rossum950361c1997-01-24 13:49:28 +00006448#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006449 int i;
6450 PyObject *l = PyList_New(257);
6451 if (l == NULL) return NULL;
6452 for (i = 0; i < 257; i++) {
6453 PyObject *x = getarray(dxpairs[i]);
6454 if (x == NULL) {
6455 Py_DECREF(l);
6456 return NULL;
6457 }
Zackery Spytz99d56b52018-12-08 07:16:55 -07006458 PyList_SET_ITEM(l, i, x);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006459 }
6460 return l;
Guido van Rossum950361c1997-01-24 13:49:28 +00006461#endif
6462}
6463
6464#endif
Brett Cannon5c4de282016-09-07 11:16:41 -07006465
6466Py_ssize_t
6467_PyEval_RequestCodeExtraIndex(freefunc free)
6468{
Victor Stinner81a7be32020-04-14 15:14:01 +02006469 PyInterpreterState *interp = _PyInterpreterState_GET();
Brett Cannon5c4de282016-09-07 11:16:41 -07006470 Py_ssize_t new_index;
6471
Dino Viehlandf3cffd22017-06-21 14:44:36 -07006472 if (interp->co_extra_user_count == MAX_CO_EXTRA_USERS - 1) {
Brett Cannon5c4de282016-09-07 11:16:41 -07006473 return -1;
6474 }
Dino Viehlandf3cffd22017-06-21 14:44:36 -07006475 new_index = interp->co_extra_user_count++;
6476 interp->co_extra_freefuncs[new_index] = free;
Brett Cannon5c4de282016-09-07 11:16:41 -07006477 return new_index;
6478}
Łukasz Langaa785c872016-09-09 17:37:37 -07006479
6480static void
6481dtrace_function_entry(PyFrameObject *f)
6482{
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02006483 const char *filename;
6484 const char *funcname;
Łukasz Langaa785c872016-09-09 17:37:37 -07006485 int lineno;
6486
Victor Stinner6d86a232020-04-29 00:56:58 +02006487 PyCodeObject *code = f->f_code;
6488 filename = PyUnicode_AsUTF8(code->co_filename);
6489 funcname = PyUnicode_AsUTF8(code->co_name);
Mark Shannonfcb55c02021-04-01 16:00:31 +01006490 lineno = PyFrame_GetLineNumber(f);
Łukasz Langaa785c872016-09-09 17:37:37 -07006491
Andy Lestere6be9b52020-02-11 20:28:35 -06006492 PyDTrace_FUNCTION_ENTRY(filename, funcname, lineno);
Łukasz Langaa785c872016-09-09 17:37:37 -07006493}
6494
6495static void
6496dtrace_function_return(PyFrameObject *f)
6497{
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02006498 const char *filename;
6499 const char *funcname;
Łukasz Langaa785c872016-09-09 17:37:37 -07006500 int lineno;
6501
Victor Stinner6d86a232020-04-29 00:56:58 +02006502 PyCodeObject *code = f->f_code;
6503 filename = PyUnicode_AsUTF8(code->co_filename);
6504 funcname = PyUnicode_AsUTF8(code->co_name);
Mark Shannonfcb55c02021-04-01 16:00:31 +01006505 lineno = PyFrame_GetLineNumber(f);
Łukasz Langaa785c872016-09-09 17:37:37 -07006506
Andy Lestere6be9b52020-02-11 20:28:35 -06006507 PyDTrace_FUNCTION_RETURN(filename, funcname, lineno);
Łukasz Langaa785c872016-09-09 17:37:37 -07006508}
6509
6510/* DTrace equivalent of maybe_call_line_trace. */
6511static void
6512maybe_dtrace_line(PyFrameObject *frame,
Mark Shannon8e1b4062021-03-05 14:45:50 +00006513 PyTraceInfo *trace_info)
Łukasz Langaa785c872016-09-09 17:37:37 -07006514{
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02006515 const char *co_filename, *co_name;
Łukasz Langaa785c872016-09-09 17:37:37 -07006516
6517 /* If the last instruction executed isn't in the current
6518 instruction window, reset the window.
6519 */
Mark Shannon8e1b4062021-03-05 14:45:50 +00006520 initialize_trace_info(trace_info, frame);
Mark Shannonfcb55c02021-04-01 16:00:31 +01006521 int line = _PyCode_CheckLineNumber(frame->f_lasti*2, &trace_info->bounds);
Łukasz Langaa785c872016-09-09 17:37:37 -07006522 /* If the last instruction falls at the start of a line or if
6523 it represents a jump backwards, update the frame's line
6524 number and call the trace function. */
Mark Shannon8e1b4062021-03-05 14:45:50 +00006525 if (line != frame->f_lineno || frame->f_lasti < trace_info->instr_prev) {
Mark Shannon877df852020-11-12 09:43:29 +00006526 if (line != -1) {
6527 frame->f_lineno = line;
6528 co_filename = PyUnicode_AsUTF8(frame->f_code->co_filename);
6529 if (!co_filename)
6530 co_filename = "?";
6531 co_name = PyUnicode_AsUTF8(frame->f_code->co_name);
6532 if (!co_name)
6533 co_name = "?";
6534 PyDTrace_LINE(co_filename, co_name, line);
6535 }
Łukasz Langaa785c872016-09-09 17:37:37 -07006536 }
Mark Shannon8e1b4062021-03-05 14:45:50 +00006537 trace_info->instr_prev = frame->f_lasti;
Łukasz Langaa785c872016-09-09 17:37:37 -07006538}
Victor Stinnerf4b1e3d2019-11-04 19:48:34 +01006539
6540
6541/* Implement Py_EnterRecursiveCall() and Py_LeaveRecursiveCall() as functions
6542 for the limited API. */
6543
6544#undef Py_EnterRecursiveCall
6545
6546int Py_EnterRecursiveCall(const char *where)
6547{
Victor Stinnerbe434dc2019-11-05 00:51:22 +01006548 return _Py_EnterRecursiveCall_inline(where);
Victor Stinnerf4b1e3d2019-11-04 19:48:34 +01006549}
6550
6551#undef Py_LeaveRecursiveCall
6552
6553void Py_LeaveRecursiveCall(void)
6554{
Victor Stinnerbe434dc2019-11-05 00:51:22 +01006555 _Py_LeaveRecursiveCall_inline();
Victor Stinnerf4b1e3d2019-11-04 19:48:34 +01006556}