blob: e1a8f15b51746def939b95c9d22a061be73a5b0f [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum3f5da241990-12-20 15:06:42 +00002/* Execute compiled code */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003
Guido van Rossum681d79a1995-07-18 14:51:37 +00004/* XXX TO DO:
Guido van Rossum681d79a1995-07-18 14:51:37 +00005 XXX speed up searching for keywords by using a dictionary
Guido van Rossum681d79a1995-07-18 14:51:37 +00006 XXX document it!
7 */
8
Thomas Wouters477c8d52006-05-27 19:21:47 +00009/* enable more aggressive intra-module optimizations, where available */
10#define PY_LOCAL_AGGRESSIVE
11
Guido van Rossumb209a111997-04-29 18:18:01 +000012#include "Python.h"
Victor Stinnere560f902020-04-14 18:30:41 +020013#include "pycore_abstract.h" // _PyIndex_Check()
Victor Stinner384621c2020-06-22 17:27:35 +020014#include "pycore_call.h" // _PyObject_FastCallDictTstate()
15#include "pycore_ceval.h" // _PyEval_SignalAsyncExc()
16#include "pycore_code.h" // _PyCode_InitOpcache()
17#include "pycore_initconfig.h" // _PyStatus_OK()
18#include "pycore_object.h" // _PyObject_GC_TRACK()
19#include "pycore_pyerrors.h" // _PyErr_Fetch()
20#include "pycore_pylifecycle.h" // _PyErr_Print()
Victor Stinnere560f902020-04-14 18:30:41 +020021#include "pycore_pymem.h" // _PyMem_IsPtrFreed()
22#include "pycore_pystate.h" // _PyInterpreterState_GET()
Victor Stinner384621c2020-06-22 17:27:35 +020023#include "pycore_sysmodule.h" // _PySys_Audit()
24#include "pycore_tuple.h" // _PyTuple_ITEMS()
Guido van Rossum10dc2e81990-11-18 17:27:39 +000025
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000026#include "code.h"
Benjamin Peterson025e9eb2015-05-05 20:16:41 -040027#include "dictobject.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000028#include "frameobject.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000029#include "opcode.h"
Łukasz Langaa785c872016-09-09 17:37:37 -070030#include "pydtrace.h"
Benjamin Peterson025e9eb2015-05-05 20:16:41 -040031#include "setobject.h"
Guido van Rossum5c5a9382021-01-29 18:02:29 -080032#include "structmember.h" // struct PyMemberDef, T_OFFSET_EX
Guido van Rossum10dc2e81990-11-18 17:27:39 +000033
Guido van Rossumc6004111993-11-05 10:22:19 +000034#include <ctype.h>
35
Guido van Rossum408027e1996-12-30 16:17:54 +000036#ifdef Py_DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000037/* For debugging the interpreter: */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000038#define LLTRACE 1 /* Low-level trace feature */
39#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000040#endif
41
Victor Stinner5c75f372019-04-17 23:02:26 +020042#if !defined(Py_BUILD_CORE)
43# error "ceval.c must be build with Py_BUILD_CORE define for best performance"
44#endif
45
Hai Shi46874c22020-01-30 17:20:25 -060046_Py_IDENTIFIER(__name__);
Guido van Rossum5b722181993-03-30 17:46:03 +000047
Guido van Rossum374a9221991-04-04 10:40:29 +000048/* Forward declarations */
Victor Stinner09532fe2019-05-10 23:39:09 +020049Py_LOCAL_INLINE(PyObject *) call_function(
Mark Shannon86433452021-01-07 16:49:02 +000050 PyThreadState *tstate, PyCodeAddressRange *, PyObject ***pp_stack,
Victor Stinner09532fe2019-05-10 23:39:09 +020051 Py_ssize_t oparg, PyObject *kwnames);
52static PyObject * do_call_core(
Mark Shannon86433452021-01-07 16:49:02 +000053 PyThreadState *tstate, PyCodeAddressRange *, PyObject *func,
Victor Stinner09532fe2019-05-10 23:39:09 +020054 PyObject *callargs, PyObject *kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +000055
Guido van Rossum0a066c01992-03-27 17:29:15 +000056#ifdef LLTRACE
Guido van Rossumc2e20742006-02-27 22:32:47 +000057static int lltrace;
Victor Stinner438a12d2019-05-24 17:01:38 +020058static int prtrace(PyThreadState *, PyObject *, const char *);
Guido van Rossum0a066c01992-03-27 17:29:15 +000059#endif
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +010060static int call_trace(Py_tracefunc, PyObject *,
61 PyThreadState *, PyFrameObject *,
Mark Shannon86433452021-01-07 16:49:02 +000062 PyCodeAddressRange *,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000063 int, PyObject *);
Amaury Forgeot d'Arcf05149a2007-11-13 01:05:30 +000064static int call_trace_protected(Py_tracefunc, PyObject *,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +010065 PyThreadState *, PyFrameObject *,
Mark Shannon86433452021-01-07 16:49:02 +000066 PyCodeAddressRange *,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +010067 int, PyObject *);
68static void call_exc_trace(Py_tracefunc, PyObject *,
Mark Shannon86433452021-01-07 16:49:02 +000069 PyThreadState *, PyFrameObject *,
70 PyCodeAddressRange *);
Tim Peters8a5c3c72004-04-05 19:36:21 +000071static int maybe_call_line_trace(Py_tracefunc, PyObject *,
Eric Snow2ebc5ce2017-09-07 23:51:28 -060072 PyThreadState *, PyFrameObject *,
Mark Shannon877df852020-11-12 09:43:29 +000073 PyCodeAddressRange *, int *);
74static void maybe_dtrace_line(PyFrameObject *, PyCodeAddressRange *, int *);
Łukasz Langaa785c872016-09-09 17:37:37 -070075static void dtrace_function_entry(PyFrameObject *);
76static void dtrace_function_return(PyFrameObject *);
Michael W. Hudsondd32a912002-08-15 14:59:02 +000077
Victor Stinner438a12d2019-05-24 17:01:38 +020078static PyObject * import_name(PyThreadState *, PyFrameObject *,
79 PyObject *, PyObject *, PyObject *);
80static PyObject * import_from(PyThreadState *, PyObject *, PyObject *);
81static int import_all_from(PyThreadState *, PyObject *, PyObject *);
82static void format_exc_check_arg(PyThreadState *, PyObject *, const char *, PyObject *);
83static void format_exc_unbound(PyThreadState *tstate, PyCodeObject *co, int oparg);
84static PyObject * unicode_concatenate(PyThreadState *, PyObject *, PyObject *,
Serhiy Storchakaab874002016-09-11 13:48:15 +030085 PyFrameObject *, const _Py_CODEUNIT *);
Victor Stinner438a12d2019-05-24 17:01:38 +020086static PyObject * special_lookup(PyThreadState *, PyObject *, _Py_Identifier *);
87static int check_args_iterable(PyThreadState *, PyObject *func, PyObject *vararg);
88static void format_kwargs_error(PyThreadState *, PyObject *func, PyObject *kwargs);
Mark Shannonfee55262019-11-21 09:11:43 +000089static void format_awaitable_error(PyThreadState *, PyTypeObject *, int, int);
Guido van Rossum374a9221991-04-04 10:40:29 +000090
Paul Prescode68140d2000-08-30 20:25:01 +000091#define NAME_ERROR_MSG \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000092 "name '%.200s' is not defined"
Paul Prescode68140d2000-08-30 20:25:01 +000093#define UNBOUNDLOCAL_ERROR_MSG \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000094 "local variable '%.200s' referenced before assignment"
Jeremy Hyltonc76770c2001-04-13 16:51:46 +000095#define UNBOUNDFREE_ERROR_MSG \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000096 "free variable '%.200s' referenced before assignment" \
97 " in enclosing scope"
Guido van Rossum374a9221991-04-04 10:40:29 +000098
Guido van Rossum950361c1997-01-24 13:49:28 +000099/* Dynamic execution profile */
100#ifdef DYNAMIC_EXECUTION_PROFILE
101#ifdef DXPAIRS
102static long dxpairs[257][256];
103#define dxp dxpairs[256]
104#else
105static long dxp[256];
106#endif
107#endif
108
Inada Naoki91234a12019-06-03 21:30:58 +0900109/* per opcode cache */
Inada Naokieddef862019-06-04 07:38:10 +0900110#ifdef Py_DEBUG
111// --with-pydebug is used to find memory leak. opcache makes it harder.
112// So we disable opcache when Py_DEBUG is defined.
113// See bpo-37146
114#define OPCACHE_MIN_RUNS 0 /* disable opcache */
115#else
Inada Naoki91234a12019-06-03 21:30:58 +0900116#define OPCACHE_MIN_RUNS 1024 /* create opcache when code executed this time */
Inada Naokieddef862019-06-04 07:38:10 +0900117#endif
Pablo Galindo109826c2020-10-20 06:22:44 +0100118#define OPCODE_CACHE_MAX_TRIES 20
Inada Naoki91234a12019-06-03 21:30:58 +0900119#define OPCACHE_STATS 0 /* Enable stats */
120
121#if OPCACHE_STATS
122static size_t opcache_code_objects = 0;
123static size_t opcache_code_objects_extra_mem = 0;
124
125static size_t opcache_global_opts = 0;
126static size_t opcache_global_hits = 0;
127static size_t opcache_global_misses = 0;
Pablo Galindo109826c2020-10-20 06:22:44 +0100128
129static size_t opcache_attr_opts = 0;
130static size_t opcache_attr_hits = 0;
131static size_t opcache_attr_misses = 0;
132static size_t opcache_attr_deopts = 0;
133static size_t opcache_attr_total = 0;
Inada Naoki91234a12019-06-03 21:30:58 +0900134#endif
135
Victor Stinner5a3a71d2020-03-19 17:40:12 +0100136
Victor Stinnerda2914d2020-03-20 09:29:08 +0100137#ifndef NDEBUG
138/* Ensure that tstate is valid: sanity check for PyEval_AcquireThread() and
139 PyEval_RestoreThread(). Detect if tstate memory was freed. It can happen
140 when a thread continues to run after Python finalization, especially
141 daemon threads. */
142static int
143is_tstate_valid(PyThreadState *tstate)
144{
145 assert(!_PyMem_IsPtrFreed(tstate));
146 assert(!_PyMem_IsPtrFreed(tstate->interp));
147 return 1;
148}
149#endif
150
151
Jeffrey Yasskin39370832010-05-03 19:29:34 +0000152/* This can set eval_breaker to 0 even though gil_drop_request became
153 1. We believe this is all right because the eval loop will release
154 the GIL eventually anyway. */
Victor Stinnerda2914d2020-03-20 09:29:08 +0100155static inline void
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200156COMPUTE_EVAL_BREAKER(PyInterpreterState *interp,
Victor Stinner299b8c62020-05-05 17:40:18 +0200157 struct _ceval_runtime_state *ceval,
158 struct _ceval_state *ceval2)
Victor Stinnerda2914d2020-03-20 09:29:08 +0100159{
Victor Stinner299b8c62020-05-05 17:40:18 +0200160 _Py_atomic_store_relaxed(&ceval2->eval_breaker,
161 _Py_atomic_load_relaxed(&ceval2->gil_drop_request)
Victor Stinner0b1e3302020-05-05 16:14:31 +0200162 | (_Py_atomic_load_relaxed(&ceval->signals_pending)
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200163 && _Py_ThreadCanHandleSignals(interp))
Victor Stinner299b8c62020-05-05 17:40:18 +0200164 | (_Py_atomic_load_relaxed(&ceval2->pending.calls_to_do)
Victor Stinnerd8316882020-03-20 14:50:35 +0100165 && _Py_ThreadCanHandlePendingCalls())
Victor Stinner299b8c62020-05-05 17:40:18 +0200166 | ceval2->pending.async_exc);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100167}
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000168
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000169
Victor Stinnerda2914d2020-03-20 09:29:08 +0100170static inline void
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200171SET_GIL_DROP_REQUEST(PyInterpreterState *interp)
Victor Stinnerda2914d2020-03-20 09:29:08 +0100172{
Victor Stinner299b8c62020-05-05 17:40:18 +0200173 struct _ceval_state *ceval2 = &interp->ceval;
174 _Py_atomic_store_relaxed(&ceval2->gil_drop_request, 1);
175 _Py_atomic_store_relaxed(&ceval2->eval_breaker, 1);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100176}
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000177
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000178
Victor Stinnerda2914d2020-03-20 09:29:08 +0100179static inline void
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200180RESET_GIL_DROP_REQUEST(PyInterpreterState *interp)
Victor Stinnerda2914d2020-03-20 09:29:08 +0100181{
Victor Stinner299b8c62020-05-05 17:40:18 +0200182 struct _ceval_runtime_state *ceval = &interp->runtime->ceval;
183 struct _ceval_state *ceval2 = &interp->ceval;
184 _Py_atomic_store_relaxed(&ceval2->gil_drop_request, 0);
185 COMPUTE_EVAL_BREAKER(interp, ceval, ceval2);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100186}
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000187
Eric Snowfdf282d2019-01-11 14:26:55 -0700188
Victor Stinnerda2914d2020-03-20 09:29:08 +0100189static inline void
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200190SIGNAL_PENDING_CALLS(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->pending.calls_to_do, 1);
195 COMPUTE_EVAL_BREAKER(interp, ceval, ceval2);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100196}
Eric Snowfdf282d2019-01-11 14:26:55 -0700197
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000198
Victor Stinnerda2914d2020-03-20 09:29:08 +0100199static inline void
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200200UNSIGNAL_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, 0);
205 COMPUTE_EVAL_BREAKER(interp, ceval, ceval2);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100206}
207
208
209static inline void
Victor Stinnerd96a7a82020-11-13 14:44:42 +0100210SIGNAL_PENDING_SIGNALS(PyInterpreterState *interp, int force)
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;
Victor Stinner0b1e3302020-05-05 16:14:31 +0200214 _Py_atomic_store_relaxed(&ceval->signals_pending, 1);
Victor Stinnerd96a7a82020-11-13 14:44:42 +0100215 if (force) {
216 _Py_atomic_store_relaxed(&ceval2->eval_breaker, 1);
217 }
218 else {
219 /* eval_breaker is not set to 1 if thread_can_handle_signals() is false */
220 COMPUTE_EVAL_BREAKER(interp, ceval, ceval2);
221 }
Victor Stinnerda2914d2020-03-20 09:29:08 +0100222}
223
224
225static inline void
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200226UNSIGNAL_PENDING_SIGNALS(PyInterpreterState *interp)
Victor Stinnerda2914d2020-03-20 09:29:08 +0100227{
Victor Stinner299b8c62020-05-05 17:40:18 +0200228 struct _ceval_runtime_state *ceval = &interp->runtime->ceval;
229 struct _ceval_state *ceval2 = &interp->ceval;
Victor Stinner0b1e3302020-05-05 16:14:31 +0200230 _Py_atomic_store_relaxed(&ceval->signals_pending, 0);
Victor Stinner299b8c62020-05-05 17:40:18 +0200231 COMPUTE_EVAL_BREAKER(interp, ceval, ceval2);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100232}
233
234
235static inline void
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200236SIGNAL_ASYNC_EXC(PyInterpreterState *interp)
Victor Stinnerda2914d2020-03-20 09:29:08 +0100237{
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200238 struct _ceval_state *ceval2 = &interp->ceval;
Victor Stinnerda2914d2020-03-20 09:29:08 +0100239 ceval2->pending.async_exc = 1;
240 _Py_atomic_store_relaxed(&ceval2->eval_breaker, 1);
241}
242
243
244static inline void
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200245UNSIGNAL_ASYNC_EXC(PyInterpreterState *interp)
Victor Stinnerda2914d2020-03-20 09:29:08 +0100246{
Victor Stinner299b8c62020-05-05 17:40:18 +0200247 struct _ceval_runtime_state *ceval = &interp->runtime->ceval;
248 struct _ceval_state *ceval2 = &interp->ceval;
249 ceval2->pending.async_exc = 0;
250 COMPUTE_EVAL_BREAKER(interp, ceval, ceval2);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100251}
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000252
253
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000254#ifdef HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000255#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +0000256#endif
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000257#include "ceval_gil.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000258
Victor Stinner3026cad2020-06-01 16:02:40 +0200259void _Py_NO_RETURN
260_Py_FatalError_TstateNULL(const char *func)
Victor Stinnereb4e2ae2020-03-08 11:57:45 +0100261{
Victor Stinner3026cad2020-06-01 16:02:40 +0200262 _Py_FatalErrorFunc(func,
263 "the function must be called with the GIL held, "
264 "but the GIL is released "
265 "(the current Python thread state is NULL)");
Victor Stinnereb4e2ae2020-03-08 11:57:45 +0100266}
267
Victor Stinner7be4e352020-05-05 20:27:47 +0200268#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
269int
270_PyEval_ThreadsInitialized(PyInterpreterState *interp)
271{
272 return gil_created(&interp->ceval.gil);
273}
274
275int
276PyEval_ThreadsInitialized(void)
277{
278 // Fatal error if there is no current interpreter
279 PyInterpreterState *interp = PyInterpreterState_Get();
280 return _PyEval_ThreadsInitialized(interp);
281}
282#else
Tim Peters7f468f22004-10-11 02:40:51 +0000283int
Victor Stinner175a7042020-03-10 00:37:48 +0100284_PyEval_ThreadsInitialized(_PyRuntimeState *runtime)
285{
286 return gil_created(&runtime->ceval.gil);
287}
288
289int
Tim Peters7f468f22004-10-11 02:40:51 +0000290PyEval_ThreadsInitialized(void)
291{
Victor Stinner01b1cc12019-11-20 02:27:56 +0100292 _PyRuntimeState *runtime = &_PyRuntime;
Victor Stinner175a7042020-03-10 00:37:48 +0100293 return _PyEval_ThreadsInitialized(runtime);
Tim Peters7f468f22004-10-11 02:40:51 +0000294}
Victor Stinner7be4e352020-05-05 20:27:47 +0200295#endif
Tim Peters7f468f22004-10-11 02:40:51 +0000296
Victor Stinner111e4ee2020-03-09 21:24:14 +0100297PyStatus
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200298_PyEval_InitGIL(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000299{
Victor Stinner7be4e352020-05-05 20:27:47 +0200300#ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
Victor Stinner101bf692021-02-19 13:33:31 +0100301 if (!_Py_IsMainInterpreter(tstate->interp)) {
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200302 /* Currently, the GIL is shared by all interpreters,
303 and only the main interpreter is responsible to create
304 and destroy it. */
305 return _PyStatus_OK();
Victor Stinner111e4ee2020-03-09 21:24:14 +0100306 }
Victor Stinner7be4e352020-05-05 20:27:47 +0200307#endif
Victor Stinner111e4ee2020-03-09 21:24:14 +0100308
Victor Stinner7be4e352020-05-05 20:27:47 +0200309#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
310 struct _gil_runtime_state *gil = &tstate->interp->ceval.gil;
311#else
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200312 struct _gil_runtime_state *gil = &tstate->interp->runtime->ceval.gil;
Victor Stinner7be4e352020-05-05 20:27:47 +0200313#endif
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200314 assert(!gil_created(gil));
Victor Stinner85f5a692020-03-09 22:12:04 +0100315
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200316 PyThread_init_thread();
317 create_gil(gil);
318
319 take_gil(tstate);
320
321 assert(gil_created(gil));
Victor Stinner111e4ee2020-03-09 21:24:14 +0100322 return _PyStatus_OK();
323}
324
325void
Victor Stinnerbcb094b2021-02-19 15:10:45 +0100326_PyEval_FiniGIL(PyInterpreterState *interp)
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200327{
Victor Stinner7be4e352020-05-05 20:27:47 +0200328#ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
Victor Stinnerbcb094b2021-02-19 15:10:45 +0100329 if (!_Py_IsMainInterpreter(interp)) {
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200330 /* Currently, the GIL is shared by all interpreters,
331 and only the main interpreter is responsible to create
332 and destroy it. */
333 return;
334 }
Victor Stinner7be4e352020-05-05 20:27:47 +0200335#endif
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200336
Victor Stinner7be4e352020-05-05 20:27:47 +0200337#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
Victor Stinnerbcb094b2021-02-19 15:10:45 +0100338 struct _gil_runtime_state *gil = &interp->ceval.gil;
Victor Stinner7be4e352020-05-05 20:27:47 +0200339#else
Victor Stinnerbcb094b2021-02-19 15:10:45 +0100340 struct _gil_runtime_state *gil = &interp->runtime->ceval.gil;
Victor Stinner7be4e352020-05-05 20:27:47 +0200341#endif
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200342 if (!gil_created(gil)) {
343 /* First Py_InitializeFromConfig() call: the GIL doesn't exist
344 yet: do nothing. */
345 return;
346 }
347
348 destroy_gil(gil);
349 assert(!gil_created(gil));
350}
351
352void
Victor Stinner111e4ee2020-03-09 21:24:14 +0100353PyEval_InitThreads(void)
354{
Victor Stinnerb4698ec2020-03-10 01:28:54 +0100355 /* Do nothing: kept for backward compatibility */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000356}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000357
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000358void
Inada Naoki91234a12019-06-03 21:30:58 +0900359_PyEval_Fini(void)
360{
361#if OPCACHE_STATS
362 fprintf(stderr, "-- Opcode cache number of objects = %zd\n",
363 opcache_code_objects);
364
365 fprintf(stderr, "-- Opcode cache total extra mem = %zd\n",
366 opcache_code_objects_extra_mem);
367
368 fprintf(stderr, "\n");
369
370 fprintf(stderr, "-- Opcode cache LOAD_GLOBAL hits = %zd (%d%%)\n",
371 opcache_global_hits,
372 (int) (100.0 * opcache_global_hits /
373 (opcache_global_hits + opcache_global_misses)));
374
375 fprintf(stderr, "-- Opcode cache LOAD_GLOBAL misses = %zd (%d%%)\n",
376 opcache_global_misses,
377 (int) (100.0 * opcache_global_misses /
378 (opcache_global_hits + opcache_global_misses)));
379
380 fprintf(stderr, "-- Opcode cache LOAD_GLOBAL opts = %zd\n",
381 opcache_global_opts);
382
383 fprintf(stderr, "\n");
Pablo Galindo109826c2020-10-20 06:22:44 +0100384
385 fprintf(stderr, "-- Opcode cache LOAD_ATTR hits = %zd (%d%%)\n",
386 opcache_attr_hits,
387 (int) (100.0 * opcache_attr_hits /
388 opcache_attr_total));
389
390 fprintf(stderr, "-- Opcode cache LOAD_ATTR misses = %zd (%d%%)\n",
391 opcache_attr_misses,
392 (int) (100.0 * opcache_attr_misses /
393 opcache_attr_total));
394
395 fprintf(stderr, "-- Opcode cache LOAD_ATTR opts = %zd\n",
396 opcache_attr_opts);
397
398 fprintf(stderr, "-- Opcode cache LOAD_ATTR deopts = %zd\n",
399 opcache_attr_deopts);
400
401 fprintf(stderr, "-- Opcode cache LOAD_ATTR total = %zd\n",
402 opcache_attr_total);
Inada Naoki91234a12019-06-03 21:30:58 +0900403#endif
404}
405
406void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000407PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000408{
Victor Stinner09532fe2019-05-10 23:39:09 +0200409 _PyRuntimeState *runtime = &_PyRuntime;
Victor Stinner09532fe2019-05-10 23:39:09 +0200410 PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime);
Victor Stinner3026cad2020-06-01 16:02:40 +0200411 _Py_EnsureTstateNotNULL(tstate);
Victor Stinnereb4e2ae2020-03-08 11:57:45 +0100412
Victor Stinner85f5a692020-03-09 22:12:04 +0100413 take_gil(tstate);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000414}
415
416void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000417PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000418{
Victor Stinner09532fe2019-05-10 23:39:09 +0200419 _PyRuntimeState *runtime = &_PyRuntime;
Victor Stinnere225beb2019-06-03 18:14:24 +0200420 PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000421 /* This function must succeed when the current thread state is NULL.
Victor Stinner50b48572018-11-01 01:51:40 +0100422 We therefore avoid PyThreadState_Get() which dumps a fatal error
Victor Stinnerda2914d2020-03-20 09:29:08 +0100423 in debug mode. */
Victor Stinner299b8c62020-05-05 17:40:18 +0200424 struct _ceval_runtime_state *ceval = &runtime->ceval;
425 struct _ceval_state *ceval2 = &tstate->interp->ceval;
426 drop_gil(ceval, ceval2, tstate);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000427}
428
429void
Victor Stinner23ef89d2020-03-18 02:26:04 +0100430_PyEval_ReleaseLock(PyThreadState *tstate)
431{
432 struct _ceval_runtime_state *ceval = &tstate->interp->runtime->ceval;
Victor Stinner0b1e3302020-05-05 16:14:31 +0200433 struct _ceval_state *ceval2 = &tstate->interp->ceval;
434 drop_gil(ceval, ceval2, tstate);
Victor Stinner23ef89d2020-03-18 02:26:04 +0100435}
436
437void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000438PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000439{
Victor Stinner3026cad2020-06-01 16:02:40 +0200440 _Py_EnsureTstateNotNULL(tstate);
Victor Stinnereb4e2ae2020-03-08 11:57:45 +0100441
Victor Stinner85f5a692020-03-09 22:12:04 +0100442 take_gil(tstate);
Victor Stinnere225beb2019-06-03 18:14:24 +0200443
Victor Stinner85f5a692020-03-09 22:12:04 +0100444 struct _gilstate_runtime_state *gilstate = &tstate->interp->runtime->gilstate;
Victor Stinnere838a932020-05-05 19:56:48 +0200445#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
446 (void)_PyThreadState_Swap(gilstate, tstate);
447#else
Victor Stinner85f5a692020-03-09 22:12:04 +0100448 if (_PyThreadState_Swap(gilstate, tstate) != NULL) {
Victor Stinner9e5d30c2020-03-07 00:54:20 +0100449 Py_FatalError("non-NULL old thread state");
Victor Stinner09532fe2019-05-10 23:39:09 +0200450 }
Victor Stinnere838a932020-05-05 19:56:48 +0200451#endif
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000452}
453
454void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000455PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000456{
Victor Stinnerda2914d2020-03-20 09:29:08 +0100457 assert(is_tstate_valid(tstate));
Victor Stinner09532fe2019-05-10 23:39:09 +0200458
Victor Stinner01b1cc12019-11-20 02:27:56 +0100459 _PyRuntimeState *runtime = tstate->interp->runtime;
Victor Stinner09532fe2019-05-10 23:39:09 +0200460 PyThreadState *new_tstate = _PyThreadState_Swap(&runtime->gilstate, NULL);
461 if (new_tstate != tstate) {
Victor Stinner9e5d30c2020-03-07 00:54:20 +0100462 Py_FatalError("wrong thread state");
Victor Stinner09532fe2019-05-10 23:39:09 +0200463 }
Victor Stinner0b1e3302020-05-05 16:14:31 +0200464 struct _ceval_runtime_state *ceval = &runtime->ceval;
465 struct _ceval_state *ceval2 = &tstate->interp->ceval;
466 drop_gil(ceval, ceval2, tstate);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000467}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000468
Dong-hee Na62f75fe2020-04-15 01:16:24 +0900469#ifdef HAVE_FORK
Antoine Pitrouf7ecfac2017-05-28 11:35:14 +0200470/* This function is called from PyOS_AfterFork_Child to destroy all threads
Victor Stinner26881c82020-06-02 15:51:37 +0200471 which are not running in the child process, and clear internal locks
472 which might be held by those threads. */
473PyStatus
Victor Stinner317bab02020-06-02 18:44:54 +0200474_PyEval_ReInitThreads(PyThreadState *tstate)
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000475{
Victor Stinner317bab02020-06-02 18:44:54 +0200476 _PyRuntimeState *runtime = tstate->interp->runtime;
Victor Stinner7be4e352020-05-05 20:27:47 +0200477
478#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
479 struct _gil_runtime_state *gil = &tstate->interp->ceval.gil;
480#else
Victor Stinner56bfdeb2020-03-18 09:26:25 +0100481 struct _gil_runtime_state *gil = &runtime->ceval.gil;
Victor Stinner7be4e352020-05-05 20:27:47 +0200482#endif
Victor Stinner56bfdeb2020-03-18 09:26:25 +0100483 if (!gil_created(gil)) {
Victor Stinner26881c82020-06-02 15:51:37 +0200484 return _PyStatus_OK();
Victor Stinner09532fe2019-05-10 23:39:09 +0200485 }
Victor Stinner56bfdeb2020-03-18 09:26:25 +0100486 recreate_gil(gil);
Victor Stinner85f5a692020-03-09 22:12:04 +0100487
488 take_gil(tstate);
Eric Snow8479a342019-03-08 23:44:33 -0700489
Victor Stinner50e6e992020-03-19 02:41:21 +0100490 struct _pending_calls *pending = &tstate->interp->ceval.pending;
Dong-hee Na62f75fe2020-04-15 01:16:24 +0900491 if (_PyThread_at_fork_reinit(&pending->lock) < 0) {
Victor Stinner26881c82020-06-02 15:51:37 +0200492 return _PyStatus_ERR("Can't reinitialize pending calls lock");
Eric Snow8479a342019-03-08 23:44:33 -0700493 }
Jesse Nollera8513972008-07-17 16:49:17 +0000494
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200495 /* Destroy all threads except the current one */
Victor Stinnereb4e2ae2020-03-08 11:57:45 +0100496 _PyThreadState_DeleteExcept(runtime, tstate);
Victor Stinner26881c82020-06-02 15:51:37 +0200497 return _PyStatus_OK();
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000498}
Dong-hee Na62f75fe2020-04-15 01:16:24 +0900499#endif
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000500
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000501/* This function is used to signal that async exceptions are waiting to be
Zackery Spytzeef05962018-09-29 10:07:11 -0600502 raised. */
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000503
504void
Victor Stinnerbcb094b2021-02-19 15:10:45 +0100505_PyEval_SignalAsyncExc(PyInterpreterState *interp)
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000506{
Victor Stinnerbcb094b2021-02-19 15:10:45 +0100507 SIGNAL_ASYNC_EXC(interp);
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000508}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000509
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000510PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000511PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000512{
Victor Stinner09532fe2019-05-10 23:39:09 +0200513 _PyRuntimeState *runtime = &_PyRuntime;
Victor Stinnere838a932020-05-05 19:56:48 +0200514#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
515 PyThreadState *old_tstate = _PyThreadState_GET();
516 PyThreadState *tstate = _PyThreadState_Swap(&runtime->gilstate, old_tstate);
517#else
Victor Stinner09532fe2019-05-10 23:39:09 +0200518 PyThreadState *tstate = _PyThreadState_Swap(&runtime->gilstate, NULL);
Victor Stinnere838a932020-05-05 19:56:48 +0200519#endif
Victor Stinner3026cad2020-06-01 16:02:40 +0200520 _Py_EnsureTstateNotNULL(tstate);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100521
Victor Stinner0b1e3302020-05-05 16:14:31 +0200522 struct _ceval_runtime_state *ceval = &runtime->ceval;
523 struct _ceval_state *ceval2 = &tstate->interp->ceval;
Victor Stinner7be4e352020-05-05 20:27:47 +0200524#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
525 assert(gil_created(&ceval2->gil));
526#else
Victor Stinnere225beb2019-06-03 18:14:24 +0200527 assert(gil_created(&ceval->gil));
Victor Stinner7be4e352020-05-05 20:27:47 +0200528#endif
Victor Stinner0b1e3302020-05-05 16:14:31 +0200529 drop_gil(ceval, ceval2, tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000530 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000531}
532
533void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000534PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000535{
Victor Stinner3026cad2020-06-01 16:02:40 +0200536 _Py_EnsureTstateNotNULL(tstate);
Victor Stinnereb4e2ae2020-03-08 11:57:45 +0100537
Victor Stinner85f5a692020-03-09 22:12:04 +0100538 take_gil(tstate);
Victor Stinner17c68b82020-01-30 12:20:48 +0100539
Victor Stinner85f5a692020-03-09 22:12:04 +0100540 struct _gilstate_runtime_state *gilstate = &tstate->interp->runtime->gilstate;
541 _PyThreadState_Swap(gilstate, tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000542}
543
544
Guido van Rossuma9672091994-09-14 13:31:22 +0000545/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
546 signal handlers or Mac I/O completion routines) can schedule calls
547 to a function to be called synchronously.
548 The synchronous function is called with one void* argument.
549 It should return 0 for success or -1 for failure -- failure should
550 be accompanied by an exception.
551
552 If registry succeeds, the registry function returns 0; if it fails
553 (e.g. due to too many pending calls) it returns -1 (without setting
554 an exception condition).
555
556 Note that because registry may occur from within signal handlers,
557 or other asynchronous events, calling malloc() is unsafe!
558
Guido van Rossuma9672091994-09-14 13:31:22 +0000559 Any thread can schedule pending calls, but only the main thread
560 will execute them.
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000561 There is no facility to schedule calls to a particular thread, but
562 that should be easy to change, should that ever be required. In
563 that case, the static variables here should go into the python
564 threadstate.
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000565*/
Guido van Rossuma9672091994-09-14 13:31:22 +0000566
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200567void
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200568_PyEval_SignalReceived(PyInterpreterState *interp)
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200569{
Victor Stinnerd96a7a82020-11-13 14:44:42 +0100570#ifdef MS_WINDOWS
571 // bpo-42296: On Windows, _PyEval_SignalReceived() is called from a signal
572 // handler which can run in a thread different than the Python thread, in
573 // which case _Py_ThreadCanHandleSignals() is wrong. Ignore
574 // _Py_ThreadCanHandleSignals() and always set eval_breaker to 1.
575 //
576 // The next eval_frame_handle_pending() call will call
577 // _Py_ThreadCanHandleSignals() to recompute eval_breaker.
578 int force = 1;
579#else
580 int force = 0;
581#endif
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200582 /* bpo-30703: Function called when the C signal handler of Python gets a
Victor Stinner50e6e992020-03-19 02:41:21 +0100583 signal. We cannot queue a callback using _PyEval_AddPendingCall() since
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200584 that function is not async-signal-safe. */
Victor Stinnerd96a7a82020-11-13 14:44:42 +0100585 SIGNAL_PENDING_SIGNALS(interp, force);
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200586}
587
Eric Snow5be45a62019-03-08 22:47:07 -0700588/* Push one item onto the queue while holding the lock. */
589static int
Victor Stinnere225beb2019-06-03 18:14:24 +0200590_push_pending_call(struct _pending_calls *pending,
Eric Snow842a2f02019-03-15 15:47:51 -0600591 int (*func)(void *), void *arg)
Eric Snow5be45a62019-03-08 22:47:07 -0700592{
Eric Snow842a2f02019-03-15 15:47:51 -0600593 int i = pending->last;
Eric Snow5be45a62019-03-08 22:47:07 -0700594 int j = (i + 1) % NPENDINGCALLS;
Eric Snow842a2f02019-03-15 15:47:51 -0600595 if (j == pending->first) {
Eric Snow5be45a62019-03-08 22:47:07 -0700596 return -1; /* Queue full */
597 }
Eric Snow842a2f02019-03-15 15:47:51 -0600598 pending->calls[i].func = func;
599 pending->calls[i].arg = arg;
600 pending->last = j;
Eric Snow5be45a62019-03-08 22:47:07 -0700601 return 0;
602}
603
604/* Pop one item off the queue while holding the lock. */
605static void
Victor Stinnere225beb2019-06-03 18:14:24 +0200606_pop_pending_call(struct _pending_calls *pending,
Eric Snow842a2f02019-03-15 15:47:51 -0600607 int (**func)(void *), void **arg)
Eric Snow5be45a62019-03-08 22:47:07 -0700608{
Eric Snow842a2f02019-03-15 15:47:51 -0600609 int i = pending->first;
610 if (i == pending->last) {
Eric Snow5be45a62019-03-08 22:47:07 -0700611 return; /* Queue empty */
612 }
613
Eric Snow842a2f02019-03-15 15:47:51 -0600614 *func = pending->calls[i].func;
615 *arg = pending->calls[i].arg;
616 pending->first = (i + 1) % NPENDINGCALLS;
Eric Snow5be45a62019-03-08 22:47:07 -0700617}
618
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200619/* This implementation is thread-safe. It allows
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000620 scheduling to be made from any thread, and even from an executing
621 callback.
622 */
623
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000624int
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200625_PyEval_AddPendingCall(PyInterpreterState *interp,
Victor Stinner09532fe2019-05-10 23:39:09 +0200626 int (*func)(void *), void *arg)
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000627{
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200628 struct _pending_calls *pending = &interp->ceval.pending;
Eric Snow842a2f02019-03-15 15:47:51 -0600629
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200630 /* Ensure that _PyEval_InitPendingCalls() was called
631 and that _PyEval_FiniPendingCalls() is not called yet. */
632 assert(pending->lock != NULL);
633
Eric Snow842a2f02019-03-15 15:47:51 -0600634 PyThread_acquire_lock(pending->lock, WAIT_LOCK);
Victor Stinnere225beb2019-06-03 18:14:24 +0200635 int result = _push_pending_call(pending, func, arg);
Eric Snow842a2f02019-03-15 15:47:51 -0600636 PyThread_release_lock(pending->lock);
Eric Snow5be45a62019-03-08 22:47:07 -0700637
Victor Stinnere225beb2019-06-03 18:14:24 +0200638 /* signal main loop */
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200639 SIGNAL_PENDING_CALLS(interp);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000640 return result;
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000641}
642
Victor Stinner09532fe2019-05-10 23:39:09 +0200643int
644Py_AddPendingCall(int (*func)(void *), void *arg)
645{
Victor Stinner50e6e992020-03-19 02:41:21 +0100646 /* Best-effort to support subinterpreters and calls with the GIL released.
647
648 First attempt _PyThreadState_GET() since it supports subinterpreters.
649
650 If the GIL is released, _PyThreadState_GET() returns NULL . In this
651 case, use PyGILState_GetThisThreadState() which works even if the GIL
652 is released.
653
654 Sadly, PyGILState_GetThisThreadState() doesn't support subinterpreters:
655 see bpo-10915 and bpo-15751.
656
Victor Stinner8849e592020-03-18 19:28:53 +0100657 Py_AddPendingCall() doesn't require the caller to hold the GIL. */
Victor Stinner50e6e992020-03-19 02:41:21 +0100658 PyThreadState *tstate = _PyThreadState_GET();
659 if (tstate == NULL) {
660 tstate = PyGILState_GetThisThreadState();
661 }
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200662
663 PyInterpreterState *interp;
664 if (tstate != NULL) {
665 interp = tstate->interp;
666 }
667 else {
668 /* Last resort: use the main interpreter */
669 interp = _PyRuntime.interpreters.main;
670 }
671 return _PyEval_AddPendingCall(interp, func, arg);
Victor Stinner09532fe2019-05-10 23:39:09 +0200672}
673
Eric Snowfdf282d2019-01-11 14:26:55 -0700674static int
Victor Stinnerd7fabc12020-03-18 01:56:21 +0100675handle_signals(PyThreadState *tstate)
Eric Snowfdf282d2019-01-11 14:26:55 -0700676{
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200677 assert(is_tstate_valid(tstate));
678 if (!_Py_ThreadCanHandleSignals(tstate->interp)) {
Eric Snow64d6cc82019-02-23 15:40:43 -0700679 return 0;
680 }
Eric Snowfdf282d2019-01-11 14:26:55 -0700681
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200682 UNSIGNAL_PENDING_SIGNALS(tstate->interp);
Victor Stinner72818982020-03-26 22:28:11 +0100683 if (_PyErr_CheckSignalsTstate(tstate) < 0) {
684 /* On failure, re-schedule a call to handle_signals(). */
Victor Stinnerd96a7a82020-11-13 14:44:42 +0100685 SIGNAL_PENDING_SIGNALS(tstate->interp, 0);
Eric Snowfdf282d2019-01-11 14:26:55 -0700686 return -1;
687 }
688 return 0;
689}
690
691static int
Victor Stinnerbcb094b2021-02-19 15:10:45 +0100692make_pending_calls(PyInterpreterState *interp)
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000693{
Victor Stinnerd8316882020-03-20 14:50:35 +0100694 /* only execute pending calls on main thread */
695 if (!_Py_ThreadCanHandlePendingCalls()) {
Victor Stinnere225beb2019-06-03 18:14:24 +0200696 return 0;
697 }
698
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000699 /* don't perform recursive pending calls */
Victor Stinnerda2914d2020-03-20 09:29:08 +0100700 static int busy = 0;
Eric Snowfdf282d2019-01-11 14:26:55 -0700701 if (busy) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000702 return 0;
Eric Snowfdf282d2019-01-11 14:26:55 -0700703 }
Charles-François Natalif23339a2011-07-23 18:15:43 +0200704 busy = 1;
Victor Stinnerda2914d2020-03-20 09:29:08 +0100705
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200706 /* unsignal before starting to call callbacks, so that any callback
707 added in-between re-signals */
Victor Stinnerbcb094b2021-02-19 15:10:45 +0100708 UNSIGNAL_PENDING_CALLS(interp);
Eric Snowfdf282d2019-01-11 14:26:55 -0700709 int res = 0;
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200710
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000711 /* perform a bounded number of calls, in case of recursion */
Victor Stinnerbcb094b2021-02-19 15:10:45 +0100712 struct _pending_calls *pending = &interp->ceval.pending;
Eric Snowfdf282d2019-01-11 14:26:55 -0700713 for (int i=0; i<NPENDINGCALLS; i++) {
Eric Snow5be45a62019-03-08 22:47:07 -0700714 int (*func)(void *) = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000715 void *arg = NULL;
716
717 /* pop one item off the queue while holding the lock */
Eric Snow842a2f02019-03-15 15:47:51 -0600718 PyThread_acquire_lock(pending->lock, WAIT_LOCK);
Victor Stinnere225beb2019-06-03 18:14:24 +0200719 _pop_pending_call(pending, &func, &arg);
Eric Snow842a2f02019-03-15 15:47:51 -0600720 PyThread_release_lock(pending->lock);
Eric Snow5be45a62019-03-08 22:47:07 -0700721
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100722 /* having released the lock, perform the callback */
Eric Snow5be45a62019-03-08 22:47:07 -0700723 if (func == NULL) {
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100724 break;
Eric Snow5be45a62019-03-08 22:47:07 -0700725 }
Eric Snowfdf282d2019-01-11 14:26:55 -0700726 res = func(arg);
727 if (res) {
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200728 goto error;
729 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000730 }
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200731
Charles-François Natalif23339a2011-07-23 18:15:43 +0200732 busy = 0;
Eric Snowfdf282d2019-01-11 14:26:55 -0700733 return res;
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200734
735error:
736 busy = 0;
Victor Stinnerbcb094b2021-02-19 15:10:45 +0100737 SIGNAL_PENDING_CALLS(interp);
Eric Snowfdf282d2019-01-11 14:26:55 -0700738 return res;
739}
740
Eric Snow842a2f02019-03-15 15:47:51 -0600741void
Victor Stinner2b1df452020-01-13 18:46:59 +0100742_Py_FinishPendingCalls(PyThreadState *tstate)
Eric Snow842a2f02019-03-15 15:47:51 -0600743{
Eric Snow842a2f02019-03-15 15:47:51 -0600744 assert(PyGILState_Check());
Victor Stinnerbcb094b2021-02-19 15:10:45 +0100745 assert(is_tstate_valid(tstate));
Eric Snow842a2f02019-03-15 15:47:51 -0600746
Victor Stinner50e6e992020-03-19 02:41:21 +0100747 struct _pending_calls *pending = &tstate->interp->ceval.pending;
Victor Stinner09532fe2019-05-10 23:39:09 +0200748
Eric Snow842a2f02019-03-15 15:47:51 -0600749 if (!_Py_atomic_load_relaxed(&(pending->calls_to_do))) {
750 return;
751 }
752
Victor Stinnerbcb094b2021-02-19 15:10:45 +0100753 if (make_pending_calls(tstate->interp) < 0) {
Victor Stinnere225beb2019-06-03 18:14:24 +0200754 PyObject *exc, *val, *tb;
755 _PyErr_Fetch(tstate, &exc, &val, &tb);
756 PyErr_BadInternalCall();
757 _PyErr_ChainExceptions(exc, val, tb);
758 _PyErr_Print(tstate);
Eric Snow842a2f02019-03-15 15:47:51 -0600759 }
760}
761
Eric Snowfdf282d2019-01-11 14:26:55 -0700762/* Py_MakePendingCalls() is a simple wrapper for the sake
763 of backward-compatibility. */
764int
765Py_MakePendingCalls(void)
766{
767 assert(PyGILState_Check());
768
Victor Stinnerd7fabc12020-03-18 01:56:21 +0100769 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerbcb094b2021-02-19 15:10:45 +0100770 assert(is_tstate_valid(tstate));
Victor Stinnerd7fabc12020-03-18 01:56:21 +0100771
Eric Snowfdf282d2019-01-11 14:26:55 -0700772 /* Python signal handler doesn't really queue a callback: it only signals
773 that a signal was received, see _PyEval_SignalReceived(). */
Victor Stinnerd7fabc12020-03-18 01:56:21 +0100774 int res = handle_signals(tstate);
Eric Snowfdf282d2019-01-11 14:26:55 -0700775 if (res != 0) {
776 return res;
777 }
778
Victor Stinnerbcb094b2021-02-19 15:10:45 +0100779 res = make_pending_calls(tstate->interp);
Eric Snowb75b1a352019-04-12 10:20:10 -0600780 if (res != 0) {
781 return res;
782 }
783
784 return 0;
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000785}
786
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000787/* The interpreter's recursion limit */
788
Hye-Shik Changb6fa2812005-04-04 15:49:02 +0000789#ifndef Py_DEFAULT_RECURSION_LIMIT
Victor Stinner19c3ac92020-09-23 14:04:57 +0200790# define Py_DEFAULT_RECURSION_LIMIT 1000
Hye-Shik Changb6fa2812005-04-04 15:49:02 +0000791#endif
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600792
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600793void
Victor Stinnerdab84232020-03-17 18:56:44 +0100794_PyEval_InitRuntimeState(struct _ceval_runtime_state *ceval)
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600795{
Victor Stinner7be4e352020-05-05 20:27:47 +0200796#ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
Victor Stinnerdab84232020-03-17 18:56:44 +0100797 _gil_initialize(&ceval->gil);
Victor Stinner7be4e352020-05-05 20:27:47 +0200798#endif
Victor Stinnerdab84232020-03-17 18:56:44 +0100799}
800
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200801int
Victor Stinnerdab84232020-03-17 18:56:44 +0100802_PyEval_InitState(struct _ceval_state *ceval)
803{
Victor Stinner4e30ed32020-05-05 16:52:52 +0200804 ceval->recursion_limit = Py_DEFAULT_RECURSION_LIMIT;
805
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200806 struct _pending_calls *pending = &ceval->pending;
807 assert(pending->lock == NULL);
808
809 pending->lock = PyThread_allocate_lock();
810 if (pending->lock == NULL) {
811 return -1;
812 }
Victor Stinner7be4e352020-05-05 20:27:47 +0200813
814#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
815 _gil_initialize(&ceval->gil);
816#endif
817
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200818 return 0;
819}
820
821void
822_PyEval_FiniState(struct _ceval_state *ceval)
823{
824 struct _pending_calls *pending = &ceval->pending;
825 if (pending->lock != NULL) {
826 PyThread_free_lock(pending->lock);
827 pending->lock = NULL;
828 }
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600829}
830
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000831int
832Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000833{
Victor Stinner1bcc32f2020-06-10 20:08:26 +0200834 PyInterpreterState *interp = _PyInterpreterState_GET();
835 return interp->ceval.recursion_limit;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000836}
837
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000838void
839Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000840{
Victor Stinner4e30ed32020-05-05 16:52:52 +0200841 PyThreadState *tstate = _PyThreadState_GET();
842 tstate->interp->ceval.recursion_limit = new_limit;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000843}
844
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100845/* The function _Py_EnterRecursiveCall() only calls _Py_CheckRecursiveCall()
Victor Stinner19c3ac92020-09-23 14:04:57 +0200846 if the recursion_depth reaches recursion_limit.
847 If USE_STACKCHECK, the macro decrements recursion_limit
Armin Rigo2b3eb402003-10-28 12:05:48 +0000848 to guarantee that _Py_CheckRecursiveCall() is regularly called.
849 Without USE_STACKCHECK, there is no need for this. */
850int
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100851_Py_CheckRecursiveCall(PyThreadState *tstate, const char *where)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000852{
Victor Stinner4e30ed32020-05-05 16:52:52 +0200853 int recursion_limit = tstate->interp->ceval.recursion_limit;
Armin Rigo2b3eb402003-10-28 12:05:48 +0000854
855#ifdef USE_STACKCHECK
pdox18967932017-10-25 23:03:01 -0700856 tstate->stackcheck_counter = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000857 if (PyOS_CheckStack()) {
858 --tstate->recursion_depth;
Victor Stinner438a12d2019-05-24 17:01:38 +0200859 _PyErr_SetString(tstate, PyExc_MemoryError, "Stack overflow");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000860 return -1;
861 }
pdox18967932017-10-25 23:03:01 -0700862#endif
Mark Shannon4e7a69b2020-12-02 13:30:55 +0000863 if (tstate->recursion_headroom) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000864 if (tstate->recursion_depth > recursion_limit + 50) {
865 /* Overflowing while handling an overflow. Give up. */
866 Py_FatalError("Cannot recover from stack overflow.");
867 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000868 }
Mark Shannon4e7a69b2020-12-02 13:30:55 +0000869 else {
870 if (tstate->recursion_depth > recursion_limit) {
871 tstate->recursion_headroom++;
872 _PyErr_Format(tstate, PyExc_RecursionError,
873 "maximum recursion depth exceeded%s",
874 where);
875 tstate->recursion_headroom--;
876 --tstate->recursion_depth;
877 return -1;
878 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000879 }
880 return 0;
Armin Rigo2b3eb402003-10-28 12:05:48 +0000881}
882
Victor Stinner09532fe2019-05-10 23:39:09 +0200883static int do_raise(PyThreadState *tstate, PyObject *exc, PyObject *cause);
Victor Stinner438a12d2019-05-24 17:01:38 +0200884static int unpack_iterable(PyThreadState *, PyObject *, int, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000885
Victor Stinnere225beb2019-06-03 18:14:24 +0200886#define _Py_TracingPossible(ceval) ((ceval)->tracing_possible)
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000887
Guido van Rossum374a9221991-04-04 10:40:29 +0000888
Guido van Rossumb209a111997-04-29 18:18:01 +0000889PyObject *
Martin v. Löwis4d0d4712010-12-03 20:14:31 +0000890PyEval_EvalCode(PyObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000891{
Victor Stinner46496f92021-02-20 15:17:18 +0100892 PyThreadState *tstate = PyThreadState_GET();
Mark Shannon0332e562021-02-01 10:42:03 +0000893 if (locals == NULL) {
894 locals = globals;
895 }
Victor Stinner46496f92021-02-20 15:17:18 +0100896 PyObject *builtins = _PyEval_BuiltinsFromGlobals(tstate, globals);
Mark Shannon0332e562021-02-01 10:42:03 +0000897 if (builtins == NULL) {
898 return NULL;
899 }
900 PyFrameConstructor desc = {
901 .fc_globals = globals,
902 .fc_builtins = builtins,
903 .fc_name = ((PyCodeObject *)co)->co_name,
904 .fc_qualname = ((PyCodeObject *)co)->co_name,
905 .fc_code = co,
906 .fc_defaults = NULL,
907 .fc_kwdefaults = NULL,
908 .fc_closure = NULL
909 };
Victor Stinner46496f92021-02-20 15:17:18 +0100910 return _PyEval_Vector(tstate, &desc, locals, NULL, 0, NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000911}
912
913
914/* Interpreter main loop */
915
Martin v. Löwis8d97e332004-06-27 15:43:12 +0000916PyObject *
Victor Stinnerb9e68122019-11-14 12:20:46 +0100917PyEval_EvalFrame(PyFrameObject *f)
918{
Victor Stinner0b72b232020-03-12 23:18:39 +0100919 /* Function kept for backward compatibility */
Victor Stinnerb9e68122019-11-14 12:20:46 +0100920 PyThreadState *tstate = _PyThreadState_GET();
921 return _PyEval_EvalFrame(tstate, f, 0);
Phillip J. Eby0d6615f2005-08-02 00:46:46 +0000922}
923
924PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000925PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
Guido van Rossum374a9221991-04-04 10:40:29 +0000926{
Victor Stinnerb9e68122019-11-14 12:20:46 +0100927 PyThreadState *tstate = _PyThreadState_GET();
928 return _PyEval_EvalFrame(tstate, f, throwflag);
Brett Cannon3cebf932016-09-05 15:33:46 -0700929}
930
Victor Stinnerda2914d2020-03-20 09:29:08 +0100931
932/* Handle signals, pending calls, GIL drop request
933 and asynchronous exception */
934static int
935eval_frame_handle_pending(PyThreadState *tstate)
936{
Victor Stinnerda2914d2020-03-20 09:29:08 +0100937 _PyRuntimeState * const runtime = &_PyRuntime;
938 struct _ceval_runtime_state *ceval = &runtime->ceval;
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200939
940 /* Pending signals */
Victor Stinner299b8c62020-05-05 17:40:18 +0200941 if (_Py_atomic_load_relaxed(&ceval->signals_pending)) {
Victor Stinnerda2914d2020-03-20 09:29:08 +0100942 if (handle_signals(tstate) != 0) {
943 return -1;
944 }
945 }
946
947 /* Pending calls */
Victor Stinner299b8c62020-05-05 17:40:18 +0200948 struct _ceval_state *ceval2 = &tstate->interp->ceval;
Victor Stinnerda2914d2020-03-20 09:29:08 +0100949 if (_Py_atomic_load_relaxed(&ceval2->pending.calls_to_do)) {
Victor Stinnerbcb094b2021-02-19 15:10:45 +0100950 if (make_pending_calls(tstate->interp) != 0) {
Victor Stinnerda2914d2020-03-20 09:29:08 +0100951 return -1;
952 }
953 }
954
955 /* GIL drop request */
Victor Stinner0b1e3302020-05-05 16:14:31 +0200956 if (_Py_atomic_load_relaxed(&ceval2->gil_drop_request)) {
Victor Stinnerda2914d2020-03-20 09:29:08 +0100957 /* Give another thread a chance */
958 if (_PyThreadState_Swap(&runtime->gilstate, NULL) != tstate) {
959 Py_FatalError("tstate mix-up");
960 }
Victor Stinner0b1e3302020-05-05 16:14:31 +0200961 drop_gil(ceval, ceval2, tstate);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100962
963 /* Other threads may run now */
964
965 take_gil(tstate);
966
Victor Stinnere838a932020-05-05 19:56:48 +0200967#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
968 (void)_PyThreadState_Swap(&runtime->gilstate, tstate);
969#else
Victor Stinnerda2914d2020-03-20 09:29:08 +0100970 if (_PyThreadState_Swap(&runtime->gilstate, tstate) != NULL) {
971 Py_FatalError("orphan tstate");
972 }
Victor Stinnere838a932020-05-05 19:56:48 +0200973#endif
Victor Stinnerda2914d2020-03-20 09:29:08 +0100974 }
975
976 /* Check for asynchronous exception. */
977 if (tstate->async_exc != NULL) {
978 PyObject *exc = tstate->async_exc;
979 tstate->async_exc = NULL;
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200980 UNSIGNAL_ASYNC_EXC(tstate->interp);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100981 _PyErr_SetNone(tstate, exc);
982 Py_DECREF(exc);
983 return -1;
984 }
985
Victor Stinnerd96a7a82020-11-13 14:44:42 +0100986#ifdef MS_WINDOWS
987 // bpo-42296: On Windows, _PyEval_SignalReceived() can be called in a
988 // different thread than the Python thread, in which case
989 // _Py_ThreadCanHandleSignals() is wrong. Recompute eval_breaker in the
990 // current Python thread with the correct _Py_ThreadCanHandleSignals()
991 // value. It prevents to interrupt the eval loop at every instruction if
992 // the current Python thread cannot handle signals (if
993 // _Py_ThreadCanHandleSignals() is false).
994 COMPUTE_EVAL_BREAKER(tstate->interp, ceval, ceval2);
995#endif
996
Victor Stinnerda2914d2020-03-20 09:29:08 +0100997 return 0;
998}
999
Victor Stinnerc6944e72016-11-11 02:13:35 +01001000PyObject* _Py_HOT_FUNCTION
Victor Stinner0b72b232020-03-12 23:18:39 +01001001_PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag)
Brett Cannon3cebf932016-09-05 15:33:46 -07001002{
Victor Stinner3026cad2020-06-01 16:02:40 +02001003 _Py_EnsureTstateNotNULL(tstate);
Victor Stinner0b72b232020-03-12 23:18:39 +01001004
Guido van Rossum950361c1997-01-24 13:49:28 +00001005#ifdef DXPAIRS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001006 int lastopcode = 0;
Guido van Rossum950361c1997-01-24 13:49:28 +00001007#endif
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001008 PyObject **stack_pointer; /* Next free slot in value stack */
Serhiy Storchakaab874002016-09-11 13:48:15 +03001009 const _Py_CODEUNIT *next_instr;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001010 int opcode; /* Current opcode */
1011 int oparg; /* Current opcode argument, if any */
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001012 PyObject **fastlocals, **freevars;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001013 PyObject *retval = NULL; /* Return value */
Victor Stinnerdab84232020-03-17 18:56:44 +01001014 struct _ceval_state * const ceval2 = &tstate->interp->ceval;
Victor Stinner50e6e992020-03-19 02:41:21 +01001015 _Py_atomic_int * const eval_breaker = &ceval2->eval_breaker;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001016 PyCodeObject *co;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001017
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001018 /* when tracing we set things up so that
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001019
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001020 not (instr_lb <= current_bytecode_offset < instr_ub)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001021
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001022 is true when the line being executed has changed. The
1023 initial values are such as to make this false the first
1024 time it is tested. */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001025
Serhiy Storchakaab874002016-09-11 13:48:15 +03001026 const _Py_CODEUNIT *first_instr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001027 PyObject *names;
1028 PyObject *consts;
Inada Naoki91234a12019-06-03 21:30:58 +09001029 _PyOpcache *co_opcache;
Guido van Rossum374a9221991-04-04 10:40:29 +00001030
Brett Cannon368b4b72012-04-02 12:17:59 -04001031#ifdef LLTRACE
Victor Stinner3c1e4812012-03-26 22:10:51 +02001032 _Py_IDENTIFIER(__ltrace__);
Brett Cannon368b4b72012-04-02 12:17:59 -04001033#endif
Victor Stinner3c1e4812012-03-26 22:10:51 +02001034
Antoine Pitroub52ec782009-01-25 16:34:23 +00001035/* Computed GOTOs, or
1036 the-optimization-commonly-but-improperly-known-as-"threaded code"
1037 using gcc's labels-as-values extension
1038 (http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html).
1039
1040 The traditional bytecode evaluation loop uses a "switch" statement, which
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001041 decent compilers will optimize as a single indirect branch instruction
Antoine Pitroub52ec782009-01-25 16:34:23 +00001042 combined with a lookup table of jump addresses. However, since the
1043 indirect jump instruction is shared by all opcodes, the CPU will have a
1044 hard time making the right prediction for where to jump next (actually,
1045 it will be always wrong except in the uncommon case of a sequence of
1046 several identical opcodes).
1047
1048 "Threaded code" in contrast, uses an explicit jump table and an explicit
1049 indirect jump instruction at the end of each opcode. Since the jump
1050 instruction is at a different address for each opcode, the CPU will make a
1051 separate prediction for each of these instructions, which is equivalent to
1052 predicting the second opcode of each opcode pair. These predictions have
1053 a much better chance to turn out valid, especially in small bytecode loops.
1054
1055 A mispredicted branch on a modern CPU flushes the whole pipeline and
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001056 can cost several CPU cycles (depending on the pipeline depth),
Antoine Pitroub52ec782009-01-25 16:34:23 +00001057 and potentially many more instructions (depending on the pipeline width).
1058 A correctly predicted branch, however, is nearly free.
1059
1060 At the time of this writing, the "threaded code" version is up to 15-20%
1061 faster than the normal "switch" version, depending on the compiler and the
1062 CPU architecture.
1063
1064 We disable the optimization if DYNAMIC_EXECUTION_PROFILE is defined,
1065 because it would render the measurements invalid.
1066
1067
1068 NOTE: care must be taken that the compiler doesn't try to "optimize" the
1069 indirect jumps by sharing them between all opcodes. Such optimizations
1070 can be disabled on gcc by using the -fno-gcse flag (or possibly
1071 -fno-crossjumping).
1072*/
1073
Antoine Pitrou042b1282010-08-13 21:15:58 +00001074#ifdef DYNAMIC_EXECUTION_PROFILE
Antoine Pitroub52ec782009-01-25 16:34:23 +00001075#undef USE_COMPUTED_GOTOS
Antoine Pitrou042b1282010-08-13 21:15:58 +00001076#define USE_COMPUTED_GOTOS 0
Antoine Pitroub52ec782009-01-25 16:34:23 +00001077#endif
1078
Antoine Pitrou042b1282010-08-13 21:15:58 +00001079#ifdef HAVE_COMPUTED_GOTOS
1080 #ifndef USE_COMPUTED_GOTOS
1081 #define USE_COMPUTED_GOTOS 1
1082 #endif
1083#else
1084 #if defined(USE_COMPUTED_GOTOS) && USE_COMPUTED_GOTOS
1085 #error "Computed gotos are not supported on this compiler."
1086 #endif
1087 #undef USE_COMPUTED_GOTOS
1088 #define USE_COMPUTED_GOTOS 0
1089#endif
1090
1091#if USE_COMPUTED_GOTOS
Antoine Pitroub52ec782009-01-25 16:34:23 +00001092/* Import the static jump table */
1093#include "opcode_targets.h"
1094
Antoine Pitroub52ec782009-01-25 16:34:23 +00001095#define TARGET(op) \
Benjamin Petersonddd19492018-09-16 22:38:02 -07001096 op: \
1097 TARGET_##op
Antoine Pitroub52ec782009-01-25 16:34:23 +00001098
Antoine Pitroub52ec782009-01-25 16:34:23 +00001099#ifdef LLTRACE
1100#define FAST_DISPATCH() \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001101 { \
Victor Stinnerdab84232020-03-17 18:56:44 +01001102 if (!lltrace && !_Py_TracingPossible(ceval2) && !PyDTrace_LINE_ENABLED()) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001103 f->f_lasti = INSTR_OFFSET(); \
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001104 NEXTOPARG(); \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001105 goto *opcode_targets[opcode]; \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001106 } \
1107 goto fast_next_opcode; \
1108 }
Antoine Pitroub52ec782009-01-25 16:34:23 +00001109#else
1110#define FAST_DISPATCH() \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001111 { \
Victor Stinnerdab84232020-03-17 18:56:44 +01001112 if (!_Py_TracingPossible(ceval2) && !PyDTrace_LINE_ENABLED()) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001113 f->f_lasti = INSTR_OFFSET(); \
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001114 NEXTOPARG(); \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001115 goto *opcode_targets[opcode]; \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001116 } \
1117 goto fast_next_opcode; \
1118 }
Antoine Pitroub52ec782009-01-25 16:34:23 +00001119#endif
1120
Victor Stinner09532fe2019-05-10 23:39:09 +02001121#define DISPATCH() \
1122 { \
1123 if (!_Py_atomic_load_relaxed(eval_breaker)) { \
1124 FAST_DISPATCH(); \
1125 } \
1126 continue; \
1127 }
1128
Antoine Pitroub52ec782009-01-25 16:34:23 +00001129#else
Benjamin Petersonddd19492018-09-16 22:38:02 -07001130#define TARGET(op) op
Antoine Pitroub52ec782009-01-25 16:34:23 +00001131#define FAST_DISPATCH() goto fast_next_opcode
Victor Stinner09532fe2019-05-10 23:39:09 +02001132#define DISPATCH() continue
Antoine Pitroub52ec782009-01-25 16:34:23 +00001133#endif
1134
1135
Neal Norwitza81d2202002-07-14 00:27:26 +00001136/* Tuple access macros */
1137
1138#ifndef Py_DEBUG
1139#define GETITEM(v, i) PyTuple_GET_ITEM((PyTupleObject *)(v), (i))
1140#else
1141#define GETITEM(v, i) PyTuple_GetItem((v), (i))
1142#endif
1143
Guido van Rossum374a9221991-04-04 10:40:29 +00001144/* Code access macros */
1145
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001146/* The integer overflow is checked by an assertion below. */
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001147#define INSTR_OFFSET() \
1148 (sizeof(_Py_CODEUNIT) * (int)(next_instr - first_instr))
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001149#define NEXTOPARG() do { \
Serhiy Storchakaab874002016-09-11 13:48:15 +03001150 _Py_CODEUNIT word = *next_instr; \
1151 opcode = _Py_OPCODE(word); \
1152 oparg = _Py_OPARG(word); \
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001153 next_instr++; \
1154 } while (0)
Serhiy Storchakaab874002016-09-11 13:48:15 +03001155#define JUMPTO(x) (next_instr = first_instr + (x) / sizeof(_Py_CODEUNIT))
1156#define JUMPBY(x) (next_instr += (x) / sizeof(_Py_CODEUNIT))
Guido van Rossum374a9221991-04-04 10:40:29 +00001157
Raymond Hettingerf606f872003-03-16 03:11:04 +00001158/* OpCode prediction macros
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001159 Some opcodes tend to come in pairs thus making it possible to
1160 predict the second code when the first is run. For example,
Serhiy Storchakada9c5132016-06-27 18:58:57 +03001161 COMPARE_OP is often followed by POP_JUMP_IF_FALSE or POP_JUMP_IF_TRUE.
Raymond Hettingerf606f872003-03-16 03:11:04 +00001162
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001163 Verifying the prediction costs a single high-speed test of a register
1164 variable against a constant. If the pairing was good, then the
1165 processor's own internal branch predication has a high likelihood of
1166 success, resulting in a nearly zero-overhead transition to the
1167 next opcode. A successful prediction saves a trip through the eval-loop
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001168 including its unpredictable switch-case branch. Combined with the
1169 processor's internal branch prediction, a successful PREDICT has the
1170 effect of making the two opcodes run as if they were a single new opcode
1171 with the bodies combined.
Raymond Hettingerf606f872003-03-16 03:11:04 +00001172
Georg Brandl86b2fb92008-07-16 03:43:04 +00001173 If collecting opcode statistics, your choices are to either keep the
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001174 predictions turned-on and interpret the results as if some opcodes
1175 had been combined or turn-off predictions so that the opcode frequency
1176 counter updates for both opcodes.
Antoine Pitroub52ec782009-01-25 16:34:23 +00001177
1178 Opcode prediction is disabled with threaded code, since the latter allows
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001179 the CPU to record separate branch prediction information for each
1180 opcode.
Antoine Pitroub52ec782009-01-25 16:34:23 +00001181
Raymond Hettingerf606f872003-03-16 03:11:04 +00001182*/
1183
Denis Chernikovbaf29b22020-02-21 12:17:50 +03001184#define PREDICT_ID(op) PRED_##op
1185
Antoine Pitrou042b1282010-08-13 21:15:58 +00001186#if defined(DYNAMIC_EXECUTION_PROFILE) || USE_COMPUTED_GOTOS
Denis Chernikovbaf29b22020-02-21 12:17:50 +03001187#define PREDICT(op) if (0) goto PREDICT_ID(op)
Raymond Hettingera7216982004-02-08 19:59:27 +00001188#else
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001189#define PREDICT(op) \
Denis Chernikovbaf29b22020-02-21 12:17:50 +03001190 do { \
Serhiy Storchakaab874002016-09-11 13:48:15 +03001191 _Py_CODEUNIT word = *next_instr; \
1192 opcode = _Py_OPCODE(word); \
Denis Chernikovbaf29b22020-02-21 12:17:50 +03001193 if (opcode == op) { \
Serhiy Storchakaab874002016-09-11 13:48:15 +03001194 oparg = _Py_OPARG(word); \
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001195 next_instr++; \
Denis Chernikovbaf29b22020-02-21 12:17:50 +03001196 goto PREDICT_ID(op); \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001197 } \
1198 } while(0)
Antoine Pitroub52ec782009-01-25 16:34:23 +00001199#endif
Denis Chernikovbaf29b22020-02-21 12:17:50 +03001200#define PREDICTED(op) PREDICT_ID(op):
Antoine Pitroub52ec782009-01-25 16:34:23 +00001201
Raymond Hettingerf606f872003-03-16 03:11:04 +00001202
Guido van Rossum374a9221991-04-04 10:40:29 +00001203/* Stack manipulation macros */
1204
Martin v. Löwis18e16552006-02-15 17:27:45 +00001205/* The stack can grow at most MAXINT deep, as co_nlocals and
1206 co_stacksize are ints. */
Stefan Krahb7e10102010-06-23 18:42:39 +00001207#define STACK_LEVEL() ((int)(stack_pointer - f->f_valuestack))
1208#define EMPTY() (STACK_LEVEL() == 0)
1209#define TOP() (stack_pointer[-1])
1210#define SECOND() (stack_pointer[-2])
1211#define THIRD() (stack_pointer[-3])
1212#define FOURTH() (stack_pointer[-4])
1213#define PEEK(n) (stack_pointer[-(n)])
1214#define SET_TOP(v) (stack_pointer[-1] = (v))
1215#define SET_SECOND(v) (stack_pointer[-2] = (v))
1216#define SET_THIRD(v) (stack_pointer[-3] = (v))
1217#define SET_FOURTH(v) (stack_pointer[-4] = (v))
Stefan Krahb7e10102010-06-23 18:42:39 +00001218#define BASIC_STACKADJ(n) (stack_pointer += n)
1219#define BASIC_PUSH(v) (*stack_pointer++ = (v))
1220#define BASIC_POP() (*--stack_pointer)
Guido van Rossum374a9221991-04-04 10:40:29 +00001221
Guido van Rossum96a42c81992-01-12 02:29:51 +00001222#ifdef LLTRACE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001223#define PUSH(v) { (void)(BASIC_PUSH(v), \
Victor Stinner438a12d2019-05-24 17:01:38 +02001224 lltrace && prtrace(tstate, TOP(), "push")); \
Stefan Krahb7e10102010-06-23 18:42:39 +00001225 assert(STACK_LEVEL() <= co->co_stacksize); }
Victor Stinner438a12d2019-05-24 17:01:38 +02001226#define POP() ((void)(lltrace && prtrace(tstate, TOP(), "pop")), \
Stefan Krahb7e10102010-06-23 18:42:39 +00001227 BASIC_POP())
costypetrisor8ed317f2018-07-31 20:55:14 +00001228#define STACK_GROW(n) do { \
1229 assert(n >= 0); \
1230 (void)(BASIC_STACKADJ(n), \
Victor Stinner438a12d2019-05-24 17:01:38 +02001231 lltrace && prtrace(tstate, TOP(), "stackadj")); \
costypetrisor8ed317f2018-07-31 20:55:14 +00001232 assert(STACK_LEVEL() <= co->co_stacksize); \
1233 } while (0)
1234#define STACK_SHRINK(n) do { \
1235 assert(n >= 0); \
Victor Stinner438a12d2019-05-24 17:01:38 +02001236 (void)(lltrace && prtrace(tstate, TOP(), "stackadj")); \
costypetrisor8ed317f2018-07-31 20:55:14 +00001237 (void)(BASIC_STACKADJ(-n)); \
1238 assert(STACK_LEVEL() <= co->co_stacksize); \
1239 } while (0)
Christian Heimes0449f632007-12-15 01:27:15 +00001240#define EXT_POP(STACK_POINTER) ((void)(lltrace && \
Victor Stinner438a12d2019-05-24 17:01:38 +02001241 prtrace(tstate, (STACK_POINTER)[-1], "ext_pop")), \
Stefan Krahb7e10102010-06-23 18:42:39 +00001242 *--(STACK_POINTER))
Guido van Rossum374a9221991-04-04 10:40:29 +00001243#else
Stefan Krahb7e10102010-06-23 18:42:39 +00001244#define PUSH(v) BASIC_PUSH(v)
1245#define POP() BASIC_POP()
costypetrisor8ed317f2018-07-31 20:55:14 +00001246#define STACK_GROW(n) BASIC_STACKADJ(n)
1247#define STACK_SHRINK(n) BASIC_STACKADJ(-n)
Guido van Rossumc2e20742006-02-27 22:32:47 +00001248#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
Guido van Rossum374a9221991-04-04 10:40:29 +00001249#endif
1250
Guido van Rossum681d79a1995-07-18 14:51:37 +00001251/* Local variable macros */
1252
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001253#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumcfbf1a32002-03-28 20:17:52 +00001254
1255/* The SETLOCAL() macro must not DECREF the local variable in-place and
1256 then store the new value; it must copy the old value to a temporary
1257 value, then store the new value, and then DECREF the temporary value.
1258 This is because it is possible that during the DECREF the frame is
1259 accessed by other code (e.g. a __del__ method or gc.collect()) and the
1260 variable would be pointing to already-freed memory. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001261#define SETLOCAL(i, value) do { PyObject *tmp = GETLOCAL(i); \
Stefan Krahb7e10102010-06-23 18:42:39 +00001262 GETLOCAL(i) = value; \
1263 Py_XDECREF(tmp); } while (0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00001264
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001265
1266#define UNWIND_BLOCK(b) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001267 while (STACK_LEVEL() > (b)->b_level) { \
1268 PyObject *v = POP(); \
1269 Py_XDECREF(v); \
1270 }
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001271
1272#define UNWIND_EXCEPT_HANDLER(b) \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001273 do { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001274 PyObject *type, *value, *traceback; \
Mark Shannonae3087c2017-10-22 22:41:51 +01001275 _PyErr_StackItem *exc_info; \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001276 assert(STACK_LEVEL() >= (b)->b_level + 3); \
1277 while (STACK_LEVEL() > (b)->b_level + 3) { \
1278 value = POP(); \
1279 Py_XDECREF(value); \
1280 } \
Mark Shannonae3087c2017-10-22 22:41:51 +01001281 exc_info = tstate->exc_info; \
1282 type = exc_info->exc_type; \
1283 value = exc_info->exc_value; \
1284 traceback = exc_info->exc_traceback; \
1285 exc_info->exc_type = POP(); \
1286 exc_info->exc_value = POP(); \
1287 exc_info->exc_traceback = POP(); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001288 Py_XDECREF(type); \
1289 Py_XDECREF(value); \
1290 Py_XDECREF(traceback); \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001291 } while(0)
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001292
Inada Naoki91234a12019-06-03 21:30:58 +09001293 /* macros for opcode cache */
1294#define OPCACHE_CHECK() \
1295 do { \
1296 co_opcache = NULL; \
1297 if (co->co_opcache != NULL) { \
Pablo Galindo109826c2020-10-20 06:22:44 +01001298 unsigned char co_opcache_offset = \
Inada Naoki91234a12019-06-03 21:30:58 +09001299 co->co_opcache_map[next_instr - first_instr]; \
Pablo Galindo109826c2020-10-20 06:22:44 +01001300 if (co_opcache_offset > 0) { \
1301 assert(co_opcache_offset <= co->co_opcache_size); \
1302 co_opcache = &co->co_opcache[co_opcache_offset - 1]; \
Inada Naoki91234a12019-06-03 21:30:58 +09001303 assert(co_opcache != NULL); \
Inada Naoki91234a12019-06-03 21:30:58 +09001304 } \
1305 } \
1306 } while (0)
1307
Pablo Galindo109826c2020-10-20 06:22:44 +01001308#define OPCACHE_DEOPT() \
1309 do { \
1310 if (co_opcache != NULL) { \
1311 co_opcache->optimized = -1; \
1312 unsigned char co_opcache_offset = \
1313 co->co_opcache_map[next_instr - first_instr]; \
1314 assert(co_opcache_offset <= co->co_opcache_size); \
1315 co->co_opcache_map[co_opcache_offset] = 0; \
1316 co_opcache = NULL; \
1317 } \
1318 } while (0)
1319
1320#define OPCACHE_DEOPT_LOAD_ATTR() \
1321 do { \
1322 if (co_opcache != NULL) { \
1323 OPCACHE_STAT_ATTR_DEOPT(); \
1324 OPCACHE_DEOPT(); \
1325 } \
1326 } while (0)
1327
1328#define OPCACHE_MAYBE_DEOPT_LOAD_ATTR() \
1329 do { \
1330 if (co_opcache != NULL && --co_opcache->optimized <= 0) { \
1331 OPCACHE_DEOPT_LOAD_ATTR(); \
1332 } \
1333 } while (0)
1334
Inada Naoki91234a12019-06-03 21:30:58 +09001335#if OPCACHE_STATS
1336
1337#define OPCACHE_STAT_GLOBAL_HIT() \
1338 do { \
1339 if (co->co_opcache != NULL) opcache_global_hits++; \
1340 } while (0)
1341
1342#define OPCACHE_STAT_GLOBAL_MISS() \
1343 do { \
1344 if (co->co_opcache != NULL) opcache_global_misses++; \
1345 } while (0)
1346
1347#define OPCACHE_STAT_GLOBAL_OPT() \
1348 do { \
1349 if (co->co_opcache != NULL) opcache_global_opts++; \
1350 } while (0)
1351
Pablo Galindo109826c2020-10-20 06:22:44 +01001352#define OPCACHE_STAT_ATTR_HIT() \
1353 do { \
1354 if (co->co_opcache != NULL) opcache_attr_hits++; \
1355 } while (0)
1356
1357#define OPCACHE_STAT_ATTR_MISS() \
1358 do { \
1359 if (co->co_opcache != NULL) opcache_attr_misses++; \
1360 } while (0)
1361
1362#define OPCACHE_STAT_ATTR_OPT() \
1363 do { \
1364 if (co->co_opcache!= NULL) opcache_attr_opts++; \
1365 } while (0)
1366
1367#define OPCACHE_STAT_ATTR_DEOPT() \
1368 do { \
1369 if (co->co_opcache != NULL) opcache_attr_deopts++; \
1370 } while (0)
1371
1372#define OPCACHE_STAT_ATTR_TOTAL() \
1373 do { \
1374 if (co->co_opcache != NULL) opcache_attr_total++; \
1375 } while (0)
1376
Inada Naoki91234a12019-06-03 21:30:58 +09001377#else /* OPCACHE_STATS */
1378
1379#define OPCACHE_STAT_GLOBAL_HIT()
1380#define OPCACHE_STAT_GLOBAL_MISS()
1381#define OPCACHE_STAT_GLOBAL_OPT()
1382
Pablo Galindo109826c2020-10-20 06:22:44 +01001383#define OPCACHE_STAT_ATTR_HIT()
1384#define OPCACHE_STAT_ATTR_MISS()
1385#define OPCACHE_STAT_ATTR_OPT()
1386#define OPCACHE_STAT_ATTR_DEOPT()
1387#define OPCACHE_STAT_ATTR_TOTAL()
1388
Inada Naoki91234a12019-06-03 21:30:58 +09001389#endif
1390
Guido van Rossuma027efa1997-05-05 20:56:21 +00001391/* Start of code */
1392
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001393 /* push frame */
Victor Stinnerbe434dc2019-11-05 00:51:22 +01001394 if (_Py_EnterRecursiveCall(tstate, "")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001395 return NULL;
Victor Stinnerbe434dc2019-11-05 00:51:22 +01001396 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001397
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001398 tstate->frame = f;
Mark Shannon86433452021-01-07 16:49:02 +00001399 co = f->f_code;
1400 PyCodeAddressRange bounds;
1401 _PyCode_InitAddressRange(co, &bounds);
Tim Peters5ca576e2001-06-18 22:08:13 +00001402
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001403 if (tstate->use_tracing) {
1404 if (tstate->c_tracefunc != NULL) {
1405 /* tstate->c_tracefunc, if defined, is a
1406 function that will be called on *every* entry
1407 to a code block. Its return value, if not
1408 None, is a function that will be called at
1409 the start of each executed line of code.
1410 (Actually, the function must return itself
1411 in order to continue tracing.) The trace
1412 functions are called with three arguments:
1413 a pointer to the current frame, a string
1414 indicating why the function is called, and
1415 an argument which depends on the situation.
1416 The global trace function is also called
1417 whenever an exception is detected. */
1418 if (call_trace_protected(tstate->c_tracefunc,
1419 tstate->c_traceobj,
Mark Shannon86433452021-01-07 16:49:02 +00001420 tstate, f, &bounds,
1421 PyTrace_CALL, Py_None)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001422 /* Trace function raised an error */
1423 goto exit_eval_frame;
1424 }
1425 }
1426 if (tstate->c_profilefunc != NULL) {
1427 /* Similar for c_profilefunc, except it needn't
1428 return itself and isn't called for "line" events */
1429 if (call_trace_protected(tstate->c_profilefunc,
1430 tstate->c_profileobj,
Mark Shannon86433452021-01-07 16:49:02 +00001431 tstate, f, &bounds,
1432 PyTrace_CALL, Py_None)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001433 /* Profile function raised an error */
1434 goto exit_eval_frame;
1435 }
1436 }
1437 }
Neil Schemenauer6c0f2002001-09-04 19:03:35 +00001438
Łukasz Langaa785c872016-09-09 17:37:37 -07001439 if (PyDTrace_FUNCTION_ENTRY_ENABLED())
1440 dtrace_function_entry(f);
1441
Mark Shannon877df852020-11-12 09:43:29 +00001442 int instr_prev = -1;
1443
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001444 names = co->co_names;
1445 consts = co->co_consts;
1446 fastlocals = f->f_localsplus;
1447 freevars = f->f_localsplus + co->co_nlocals;
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001448 assert(PyBytes_Check(co->co_code));
1449 assert(PyBytes_GET_SIZE(co->co_code) <= INT_MAX);
Serhiy Storchakaab874002016-09-11 13:48:15 +03001450 assert(PyBytes_GET_SIZE(co->co_code) % sizeof(_Py_CODEUNIT) == 0);
1451 assert(_Py_IS_ALIGNED(PyBytes_AS_STRING(co->co_code), sizeof(_Py_CODEUNIT)));
1452 first_instr = (_Py_CODEUNIT *) PyBytes_AS_STRING(co->co_code);
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001453 /*
1454 f->f_lasti refers to the index of the last instruction,
1455 unless it's -1 in which case next_instr should be first_instr.
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001456
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001457 YIELD_FROM sets f_lasti to itself, in order to repeatedly yield
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05001458 multiple values.
Thomas Wouters902d6eb2007-01-09 23:18:33 +00001459
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001460 When the PREDICT() macros are enabled, some opcode pairs follow in
1461 direct succession without updating f->f_lasti. A successful
1462 prediction effectively links the two codes together as if they
1463 were a single new opcode; accordingly,f->f_lasti will point to
1464 the first code in the pair (for instance, GET_ITER followed by
1465 FOR_ITER is effectively a single opcode and f->f_lasti will point
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001466 to the beginning of the combined pair.)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001467 */
Serhiy Storchakaab874002016-09-11 13:48:15 +03001468 assert(f->f_lasti >= -1);
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001469 next_instr = first_instr;
1470 if (f->f_lasti >= 0) {
Serhiy Storchakaab874002016-09-11 13:48:15 +03001471 assert(f->f_lasti % sizeof(_Py_CODEUNIT) == 0);
1472 next_instr += f->f_lasti / sizeof(_Py_CODEUNIT) + 1;
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001473 }
Mark Shannoncb9879b2020-07-17 11:44:23 +01001474 stack_pointer = f->f_valuestack + f->f_stackdepth;
1475 /* Set f->f_stackdepth to -1.
1476 * Update when returning or calling trace function.
1477 Having f_stackdepth <= 0 ensures that invalid
1478 values are not visible to the cycle GC.
1479 We choose -1 rather than 0 to assist debugging.
1480 */
1481 f->f_stackdepth = -1;
1482 f->f_state = FRAME_EXECUTING;
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001483
Inada Naoki91234a12019-06-03 21:30:58 +09001484 if (co->co_opcache_flag < OPCACHE_MIN_RUNS) {
1485 co->co_opcache_flag++;
1486 if (co->co_opcache_flag == OPCACHE_MIN_RUNS) {
1487 if (_PyCode_InitOpcache(co) < 0) {
Victor Stinner25104942020-04-24 02:43:18 +02001488 goto exit_eval_frame;
Inada Naoki91234a12019-06-03 21:30:58 +09001489 }
1490#if OPCACHE_STATS
1491 opcache_code_objects_extra_mem +=
1492 PyBytes_Size(co->co_code) / sizeof(_Py_CODEUNIT) +
1493 sizeof(_PyOpcache) * co->co_opcache_size;
1494 opcache_code_objects++;
1495#endif
1496 }
1497 }
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001498
Tim Peters5ca576e2001-06-18 22:08:13 +00001499#ifdef LLTRACE
Serhiy Storchakafb5db7e2020-10-26 08:43:39 +02001500 {
1501 int r = _PyDict_ContainsId(f->f_globals, &PyId___ltrace__);
1502 if (r < 0) {
1503 goto exit_eval_frame;
1504 }
1505 lltrace = r;
1506 }
Tim Peters5ca576e2001-06-18 22:08:13 +00001507#endif
Guido van Rossumac7be682001-01-17 15:42:30 +00001508
Serhiy Storchakafb5db7e2020-10-26 08:43:39 +02001509 if (throwflag) { /* support for generator.throw() */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001510 goto error;
Serhiy Storchakafb5db7e2020-10-26 08:43:39 +02001511 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001512
Victor Stinnerace47d72013-07-18 01:41:08 +02001513#ifdef Py_DEBUG
Victor Stinner0b72b232020-03-12 23:18:39 +01001514 /* _PyEval_EvalFrameDefault() must not be called with an exception set,
Victor Stinnera8cb5152017-01-18 14:12:51 +01001515 because it can clear it (directly or indirectly) and so the
Martin Panter9955a372015-10-07 10:26:23 +00001516 caller loses its exception */
Victor Stinner438a12d2019-05-24 17:01:38 +02001517 assert(!_PyErr_Occurred(tstate));
Victor Stinnerace47d72013-07-18 01:41:08 +02001518#endif
1519
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001520main_loop:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001521 for (;;) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001522 assert(stack_pointer >= f->f_valuestack); /* else underflow */
1523 assert(STACK_LEVEL() <= co->co_stacksize); /* else overflow */
Victor Stinner438a12d2019-05-24 17:01:38 +02001524 assert(!_PyErr_Occurred(tstate));
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001525
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001526 /* Do periodic things. Doing this every time through
1527 the loop would add too much overhead, so we do it
1528 only every Nth instruction. We also do it if
Chris Jerdonek4a12d122020-05-14 19:25:45 -07001529 ``pending.calls_to_do'' is set, i.e. when an asynchronous
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001530 event needs attention (e.g. a signal handler or
1531 async I/O handler); see Py_AddPendingCall() and
1532 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +00001533
Eric Snow7bda9de2019-03-08 17:25:54 -07001534 if (_Py_atomic_load_relaxed(eval_breaker)) {
Serhiy Storchaka3f4d90d2018-07-09 15:40:14 +03001535 opcode = _Py_OPCODE(*next_instr);
1536 if (opcode == SETUP_FINALLY ||
1537 opcode == SETUP_WITH ||
1538 opcode == BEFORE_ASYNC_WITH ||
1539 opcode == YIELD_FROM) {
1540 /* Few cases where we skip running signal handlers and other
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07001541 pending calls:
Serhiy Storchaka3f4d90d2018-07-09 15:40:14 +03001542 - If we're about to enter the 'with:'. It will prevent
1543 emitting a resource warning in the common idiom
1544 'with open(path) as file:'.
1545 - If we're about to enter the 'async with:'.
1546 - If we're about to enter the 'try:' of a try/finally (not
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07001547 *very* useful, but might help in some cases and it's
1548 traditional)
1549 - If we're resuming a chain of nested 'yield from' or
1550 'await' calls, then each frame is parked with YIELD_FROM
1551 as its next opcode. If the user hit control-C we want to
1552 wait until we've reached the innermost frame before
1553 running the signal handler and raising KeyboardInterrupt
1554 (see bpo-30039).
1555 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001556 goto fast_next_opcode;
1557 }
Eric Snowfdf282d2019-01-11 14:26:55 -07001558
Victor Stinnerda2914d2020-03-20 09:29:08 +01001559 if (eval_frame_handle_pending(tstate) != 0) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001560 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001561 }
1562 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001563
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001564 fast_next_opcode:
1565 f->f_lasti = INSTR_OFFSET();
Guido van Rossumac7be682001-01-17 15:42:30 +00001566
Łukasz Langaa785c872016-09-09 17:37:37 -07001567 if (PyDTrace_LINE_ENABLED())
Mark Shannon877df852020-11-12 09:43:29 +00001568 maybe_dtrace_line(f, &bounds, &instr_prev);
Łukasz Langaa785c872016-09-09 17:37:37 -07001569
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001570 /* line-by-line tracing support */
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001571
Victor Stinnerdab84232020-03-17 18:56:44 +01001572 if (_Py_TracingPossible(ceval2) &&
Benjamin Peterson51f46162013-01-23 08:38:47 -05001573 tstate->c_tracefunc != NULL && !tstate->tracing) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001574 int err;
Victor Stinnerb7d8d8d2020-09-23 14:07:16 +02001575 /* see maybe_call_line_trace()
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001576 for expository comments */
Victor Stinnerb7d8d8d2020-09-23 14:07:16 +02001577 f->f_stackdepth = (int)(stack_pointer - f->f_valuestack);
Tim Peters8a5c3c72004-04-05 19:36:21 +00001578
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001579 err = maybe_call_line_trace(tstate->c_tracefunc,
1580 tstate->c_traceobj,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01001581 tstate, f,
Mark Shannon877df852020-11-12 09:43:29 +00001582 &bounds, &instr_prev);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001583 /* Reload possibly changed frame fields */
1584 JUMPTO(f->f_lasti);
Mark Shannoncb9879b2020-07-17 11:44:23 +01001585 stack_pointer = f->f_valuestack+f->f_stackdepth;
1586 f->f_stackdepth = -1;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001587 if (err)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001588 /* trace function raised an exception */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001589 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001590 }
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001591
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001592 /* Extract opcode and argument */
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001593
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001594 NEXTOPARG();
Stefan Krahb7e10102010-06-23 18:42:39 +00001595 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +00001596#ifdef DYNAMIC_EXECUTION_PROFILE
1597#ifdef DXPAIRS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001598 dxpairs[lastopcode][opcode]++;
1599 lastopcode = opcode;
Guido van Rossum950361c1997-01-24 13:49:28 +00001600#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001601 dxp[opcode]++;
Guido van Rossum950361c1997-01-24 13:49:28 +00001602#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001603
Guido van Rossum96a42c81992-01-12 02:29:51 +00001604#ifdef LLTRACE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001605 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +00001606
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001607 if (lltrace) {
1608 if (HAS_ARG(opcode)) {
1609 printf("%d: %d, %d\n",
1610 f->f_lasti, opcode, oparg);
1611 }
1612 else {
1613 printf("%d: %d\n",
1614 f->f_lasti, opcode);
1615 }
1616 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001617#endif
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001618
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001619 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +00001620
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001621 /* BEWARE!
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001622 It is essential that any operation that fails must goto error
1623 and that all operation that succeed call [FAST_]DISPATCH() ! */
Guido van Rossumac7be682001-01-17 15:42:30 +00001624
Benjamin Petersonddd19492018-09-16 22:38:02 -07001625 case TARGET(NOP): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001626 FAST_DISPATCH();
Benjamin Petersonddd19492018-09-16 22:38:02 -07001627 }
Raymond Hettinger9c18e812004-06-21 16:31:15 +00001628
Benjamin Petersonddd19492018-09-16 22:38:02 -07001629 case TARGET(LOAD_FAST): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001630 PyObject *value = GETLOCAL(oparg);
1631 if (value == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02001632 format_exc_check_arg(tstate, PyExc_UnboundLocalError,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001633 UNBOUNDLOCAL_ERROR_MSG,
1634 PyTuple_GetItem(co->co_varnames, oparg));
1635 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001636 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001637 Py_INCREF(value);
1638 PUSH(value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001639 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001640 }
1641
Benjamin Petersonddd19492018-09-16 22:38:02 -07001642 case TARGET(LOAD_CONST): {
1643 PREDICTED(LOAD_CONST);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001644 PyObject *value = GETITEM(consts, oparg);
1645 Py_INCREF(value);
1646 PUSH(value);
1647 FAST_DISPATCH();
1648 }
Neil Schemenauer63543862002-02-17 19:10:14 +00001649
Benjamin Petersonddd19492018-09-16 22:38:02 -07001650 case TARGET(STORE_FAST): {
1651 PREDICTED(STORE_FAST);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001652 PyObject *value = POP();
1653 SETLOCAL(oparg, value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001654 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001655 }
Neil Schemenauer63543862002-02-17 19:10:14 +00001656
Benjamin Petersonddd19492018-09-16 22:38:02 -07001657 case TARGET(POP_TOP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001658 PyObject *value = POP();
1659 Py_DECREF(value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001660 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001661 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001662
Benjamin Petersonddd19492018-09-16 22:38:02 -07001663 case TARGET(ROT_TWO): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001664 PyObject *top = TOP();
1665 PyObject *second = SECOND();
1666 SET_TOP(second);
1667 SET_SECOND(top);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001668 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001669 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001670
Benjamin Petersonddd19492018-09-16 22:38:02 -07001671 case TARGET(ROT_THREE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001672 PyObject *top = TOP();
1673 PyObject *second = SECOND();
1674 PyObject *third = THIRD();
1675 SET_TOP(second);
1676 SET_SECOND(third);
1677 SET_THIRD(top);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001678 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001679 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001680
Benjamin Petersonddd19492018-09-16 22:38:02 -07001681 case TARGET(ROT_FOUR): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001682 PyObject *top = TOP();
1683 PyObject *second = SECOND();
1684 PyObject *third = THIRD();
1685 PyObject *fourth = FOURTH();
1686 SET_TOP(second);
1687 SET_SECOND(third);
1688 SET_THIRD(fourth);
1689 SET_FOURTH(top);
1690 FAST_DISPATCH();
1691 }
1692
Benjamin Petersonddd19492018-09-16 22:38:02 -07001693 case TARGET(DUP_TOP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001694 PyObject *top = TOP();
1695 Py_INCREF(top);
1696 PUSH(top);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001697 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001698 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001699
Benjamin Petersonddd19492018-09-16 22:38:02 -07001700 case TARGET(DUP_TOP_TWO): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001701 PyObject *top = TOP();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001702 PyObject *second = SECOND();
Benjamin Petersonf208df32012-10-12 11:37:56 -04001703 Py_INCREF(top);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001704 Py_INCREF(second);
costypetrisor8ed317f2018-07-31 20:55:14 +00001705 STACK_GROW(2);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001706 SET_TOP(top);
1707 SET_SECOND(second);
Antoine Pitrou74a69fa2010-09-04 18:43:52 +00001708 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001709 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001710
Benjamin Petersonddd19492018-09-16 22:38:02 -07001711 case TARGET(UNARY_POSITIVE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001712 PyObject *value = TOP();
1713 PyObject *res = PyNumber_Positive(value);
1714 Py_DECREF(value);
1715 SET_TOP(res);
1716 if (res == NULL)
1717 goto error;
1718 DISPATCH();
1719 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001720
Benjamin Petersonddd19492018-09-16 22:38:02 -07001721 case TARGET(UNARY_NEGATIVE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001722 PyObject *value = TOP();
1723 PyObject *res = PyNumber_Negative(value);
1724 Py_DECREF(value);
1725 SET_TOP(res);
1726 if (res == NULL)
1727 goto error;
1728 DISPATCH();
1729 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001730
Benjamin Petersonddd19492018-09-16 22:38:02 -07001731 case TARGET(UNARY_NOT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001732 PyObject *value = TOP();
1733 int err = PyObject_IsTrue(value);
1734 Py_DECREF(value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001735 if (err == 0) {
1736 Py_INCREF(Py_True);
1737 SET_TOP(Py_True);
1738 DISPATCH();
1739 }
1740 else if (err > 0) {
1741 Py_INCREF(Py_False);
1742 SET_TOP(Py_False);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001743 DISPATCH();
1744 }
costypetrisor8ed317f2018-07-31 20:55:14 +00001745 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001746 goto error;
1747 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001748
Benjamin Petersonddd19492018-09-16 22:38:02 -07001749 case TARGET(UNARY_INVERT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001750 PyObject *value = TOP();
1751 PyObject *res = PyNumber_Invert(value);
1752 Py_DECREF(value);
1753 SET_TOP(res);
1754 if (res == NULL)
1755 goto error;
1756 DISPATCH();
1757 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001758
Benjamin Petersonddd19492018-09-16 22:38:02 -07001759 case TARGET(BINARY_POWER): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001760 PyObject *exp = POP();
1761 PyObject *base = TOP();
1762 PyObject *res = PyNumber_Power(base, exp, Py_None);
1763 Py_DECREF(base);
1764 Py_DECREF(exp);
1765 SET_TOP(res);
1766 if (res == NULL)
1767 goto error;
1768 DISPATCH();
1769 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001770
Benjamin Petersonddd19492018-09-16 22:38:02 -07001771 case TARGET(BINARY_MULTIPLY): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001772 PyObject *right = POP();
1773 PyObject *left = TOP();
1774 PyObject *res = PyNumber_Multiply(left, right);
1775 Py_DECREF(left);
1776 Py_DECREF(right);
1777 SET_TOP(res);
1778 if (res == NULL)
1779 goto error;
1780 DISPATCH();
1781 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001782
Benjamin Petersonddd19492018-09-16 22:38:02 -07001783 case TARGET(BINARY_MATRIX_MULTIPLY): {
Benjamin Petersond51374e2014-04-09 23:55:56 -04001784 PyObject *right = POP();
1785 PyObject *left = TOP();
1786 PyObject *res = PyNumber_MatrixMultiply(left, right);
1787 Py_DECREF(left);
1788 Py_DECREF(right);
1789 SET_TOP(res);
1790 if (res == NULL)
1791 goto error;
1792 DISPATCH();
1793 }
1794
Benjamin Petersonddd19492018-09-16 22:38:02 -07001795 case TARGET(BINARY_TRUE_DIVIDE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001796 PyObject *divisor = POP();
1797 PyObject *dividend = TOP();
1798 PyObject *quotient = PyNumber_TrueDivide(dividend, divisor);
1799 Py_DECREF(dividend);
1800 Py_DECREF(divisor);
1801 SET_TOP(quotient);
1802 if (quotient == NULL)
1803 goto error;
1804 DISPATCH();
1805 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001806
Benjamin Petersonddd19492018-09-16 22:38:02 -07001807 case TARGET(BINARY_FLOOR_DIVIDE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001808 PyObject *divisor = POP();
1809 PyObject *dividend = TOP();
1810 PyObject *quotient = PyNumber_FloorDivide(dividend, divisor);
1811 Py_DECREF(dividend);
1812 Py_DECREF(divisor);
1813 SET_TOP(quotient);
1814 if (quotient == NULL)
1815 goto error;
1816 DISPATCH();
1817 }
Guido van Rossum4668b002001-08-08 05:00:18 +00001818
Benjamin Petersonddd19492018-09-16 22:38:02 -07001819 case TARGET(BINARY_MODULO): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001820 PyObject *divisor = POP();
1821 PyObject *dividend = TOP();
Martijn Pietersd7e64332017-02-23 13:38:04 +00001822 PyObject *res;
1823 if (PyUnicode_CheckExact(dividend) && (
1824 !PyUnicode_Check(divisor) || PyUnicode_CheckExact(divisor))) {
1825 // fast path; string formatting, but not if the RHS is a str subclass
1826 // (see issue28598)
1827 res = PyUnicode_Format(dividend, divisor);
1828 } else {
1829 res = PyNumber_Remainder(dividend, divisor);
1830 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001831 Py_DECREF(divisor);
1832 Py_DECREF(dividend);
1833 SET_TOP(res);
1834 if (res == NULL)
1835 goto error;
1836 DISPATCH();
1837 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001838
Benjamin Petersonddd19492018-09-16 22:38:02 -07001839 case TARGET(BINARY_ADD): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001840 PyObject *right = POP();
1841 PyObject *left = TOP();
1842 PyObject *sum;
Victor Stinnerbd0a08e2020-10-01 18:57:37 +02001843 /* NOTE(vstinner): Please don't try to micro-optimize int+int on
Victor Stinnerd65f42a2016-10-20 12:18:10 +02001844 CPython using bytecode, it is simply worthless.
1845 See http://bugs.python.org/issue21955 and
1846 http://bugs.python.org/issue10044 for the discussion. In short,
1847 no patch shown any impact on a realistic benchmark, only a minor
1848 speedup on microbenchmarks. */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001849 if (PyUnicode_CheckExact(left) &&
1850 PyUnicode_CheckExact(right)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02001851 sum = unicode_concatenate(tstate, left, right, f, next_instr);
Martin Panter95f53c12016-07-18 08:23:26 +00001852 /* unicode_concatenate consumed the ref to left */
Victor Stinnerd2a915d2011-10-02 20:34:20 +02001853 }
1854 else {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001855 sum = PyNumber_Add(left, right);
1856 Py_DECREF(left);
Victor Stinnerd2a915d2011-10-02 20:34:20 +02001857 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001858 Py_DECREF(right);
1859 SET_TOP(sum);
1860 if (sum == NULL)
1861 goto error;
1862 DISPATCH();
1863 }
1864
Benjamin Petersonddd19492018-09-16 22:38:02 -07001865 case TARGET(BINARY_SUBTRACT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001866 PyObject *right = POP();
1867 PyObject *left = TOP();
1868 PyObject *diff = PyNumber_Subtract(left, right);
1869 Py_DECREF(right);
1870 Py_DECREF(left);
1871 SET_TOP(diff);
1872 if (diff == NULL)
1873 goto error;
1874 DISPATCH();
1875 }
1876
Benjamin Petersonddd19492018-09-16 22:38:02 -07001877 case TARGET(BINARY_SUBSCR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001878 PyObject *sub = POP();
1879 PyObject *container = TOP();
1880 PyObject *res = PyObject_GetItem(container, sub);
1881 Py_DECREF(container);
1882 Py_DECREF(sub);
1883 SET_TOP(res);
1884 if (res == NULL)
1885 goto error;
1886 DISPATCH();
1887 }
1888
Benjamin Petersonddd19492018-09-16 22:38:02 -07001889 case TARGET(BINARY_LSHIFT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001890 PyObject *right = POP();
1891 PyObject *left = TOP();
1892 PyObject *res = PyNumber_Lshift(left, right);
1893 Py_DECREF(left);
1894 Py_DECREF(right);
1895 SET_TOP(res);
1896 if (res == NULL)
1897 goto error;
1898 DISPATCH();
1899 }
1900
Benjamin Petersonddd19492018-09-16 22:38:02 -07001901 case TARGET(BINARY_RSHIFT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001902 PyObject *right = POP();
1903 PyObject *left = TOP();
1904 PyObject *res = PyNumber_Rshift(left, right);
1905 Py_DECREF(left);
1906 Py_DECREF(right);
1907 SET_TOP(res);
1908 if (res == NULL)
1909 goto error;
1910 DISPATCH();
1911 }
1912
Benjamin Petersonddd19492018-09-16 22:38:02 -07001913 case TARGET(BINARY_AND): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001914 PyObject *right = POP();
1915 PyObject *left = TOP();
1916 PyObject *res = PyNumber_And(left, right);
1917 Py_DECREF(left);
1918 Py_DECREF(right);
1919 SET_TOP(res);
1920 if (res == NULL)
1921 goto error;
1922 DISPATCH();
1923 }
1924
Benjamin Petersonddd19492018-09-16 22:38:02 -07001925 case TARGET(BINARY_XOR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001926 PyObject *right = POP();
1927 PyObject *left = TOP();
1928 PyObject *res = PyNumber_Xor(left, right);
1929 Py_DECREF(left);
1930 Py_DECREF(right);
1931 SET_TOP(res);
1932 if (res == NULL)
1933 goto error;
1934 DISPATCH();
1935 }
1936
Benjamin Petersonddd19492018-09-16 22:38:02 -07001937 case TARGET(BINARY_OR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001938 PyObject *right = POP();
1939 PyObject *left = TOP();
1940 PyObject *res = PyNumber_Or(left, right);
1941 Py_DECREF(left);
1942 Py_DECREF(right);
1943 SET_TOP(res);
1944 if (res == NULL)
1945 goto error;
1946 DISPATCH();
1947 }
1948
Benjamin Petersonddd19492018-09-16 22:38:02 -07001949 case TARGET(LIST_APPEND): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001950 PyObject *v = POP();
1951 PyObject *list = PEEK(oparg);
1952 int err;
1953 err = PyList_Append(list, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001954 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001955 if (err != 0)
1956 goto error;
1957 PREDICT(JUMP_ABSOLUTE);
1958 DISPATCH();
1959 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001960
Benjamin Petersonddd19492018-09-16 22:38:02 -07001961 case TARGET(SET_ADD): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001962 PyObject *v = POP();
Raymond Hettinger41862222016-10-15 19:03:06 -07001963 PyObject *set = PEEK(oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001964 int err;
1965 err = PySet_Add(set, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001966 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001967 if (err != 0)
1968 goto error;
1969 PREDICT(JUMP_ABSOLUTE);
1970 DISPATCH();
1971 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001972
Benjamin Petersonddd19492018-09-16 22:38:02 -07001973 case TARGET(INPLACE_POWER): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001974 PyObject *exp = POP();
1975 PyObject *base = TOP();
1976 PyObject *res = PyNumber_InPlacePower(base, exp, Py_None);
1977 Py_DECREF(base);
1978 Py_DECREF(exp);
1979 SET_TOP(res);
1980 if (res == NULL)
1981 goto error;
1982 DISPATCH();
1983 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001984
Benjamin Petersonddd19492018-09-16 22:38:02 -07001985 case TARGET(INPLACE_MULTIPLY): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001986 PyObject *right = POP();
1987 PyObject *left = TOP();
1988 PyObject *res = PyNumber_InPlaceMultiply(left, right);
1989 Py_DECREF(left);
1990 Py_DECREF(right);
1991 SET_TOP(res);
1992 if (res == NULL)
1993 goto error;
1994 DISPATCH();
1995 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001996
Benjamin Petersonddd19492018-09-16 22:38:02 -07001997 case TARGET(INPLACE_MATRIX_MULTIPLY): {
Benjamin Petersond51374e2014-04-09 23:55:56 -04001998 PyObject *right = POP();
1999 PyObject *left = TOP();
2000 PyObject *res = PyNumber_InPlaceMatrixMultiply(left, right);
2001 Py_DECREF(left);
2002 Py_DECREF(right);
2003 SET_TOP(res);
2004 if (res == NULL)
2005 goto error;
2006 DISPATCH();
2007 }
2008
Benjamin Petersonddd19492018-09-16 22:38:02 -07002009 case TARGET(INPLACE_TRUE_DIVIDE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002010 PyObject *divisor = POP();
2011 PyObject *dividend = TOP();
2012 PyObject *quotient = PyNumber_InPlaceTrueDivide(dividend, divisor);
2013 Py_DECREF(dividend);
2014 Py_DECREF(divisor);
2015 SET_TOP(quotient);
2016 if (quotient == NULL)
2017 goto error;
2018 DISPATCH();
2019 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002020
Benjamin Petersonddd19492018-09-16 22:38:02 -07002021 case TARGET(INPLACE_FLOOR_DIVIDE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002022 PyObject *divisor = POP();
2023 PyObject *dividend = TOP();
2024 PyObject *quotient = PyNumber_InPlaceFloorDivide(dividend, divisor);
2025 Py_DECREF(dividend);
2026 Py_DECREF(divisor);
2027 SET_TOP(quotient);
2028 if (quotient == NULL)
2029 goto error;
2030 DISPATCH();
2031 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002032
Benjamin Petersonddd19492018-09-16 22:38:02 -07002033 case TARGET(INPLACE_MODULO): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002034 PyObject *right = POP();
2035 PyObject *left = TOP();
2036 PyObject *mod = PyNumber_InPlaceRemainder(left, right);
2037 Py_DECREF(left);
2038 Py_DECREF(right);
2039 SET_TOP(mod);
2040 if (mod == NULL)
2041 goto error;
2042 DISPATCH();
2043 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002044
Benjamin Petersonddd19492018-09-16 22:38:02 -07002045 case TARGET(INPLACE_ADD): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002046 PyObject *right = POP();
2047 PyObject *left = TOP();
2048 PyObject *sum;
2049 if (PyUnicode_CheckExact(left) && PyUnicode_CheckExact(right)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002050 sum = unicode_concatenate(tstate, left, right, f, next_instr);
Martin Panter95f53c12016-07-18 08:23:26 +00002051 /* unicode_concatenate consumed the ref to left */
Victor Stinnerd2a915d2011-10-02 20:34:20 +02002052 }
2053 else {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002054 sum = PyNumber_InPlaceAdd(left, right);
2055 Py_DECREF(left);
Victor Stinnerd2a915d2011-10-02 20:34:20 +02002056 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002057 Py_DECREF(right);
2058 SET_TOP(sum);
2059 if (sum == NULL)
2060 goto error;
2061 DISPATCH();
2062 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002063
Benjamin Petersonddd19492018-09-16 22:38:02 -07002064 case TARGET(INPLACE_SUBTRACT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002065 PyObject *right = POP();
2066 PyObject *left = TOP();
2067 PyObject *diff = PyNumber_InPlaceSubtract(left, right);
2068 Py_DECREF(left);
2069 Py_DECREF(right);
2070 SET_TOP(diff);
2071 if (diff == NULL)
2072 goto error;
2073 DISPATCH();
2074 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002075
Benjamin Petersonddd19492018-09-16 22:38:02 -07002076 case TARGET(INPLACE_LSHIFT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002077 PyObject *right = POP();
2078 PyObject *left = TOP();
2079 PyObject *res = PyNumber_InPlaceLshift(left, right);
2080 Py_DECREF(left);
2081 Py_DECREF(right);
2082 SET_TOP(res);
2083 if (res == NULL)
2084 goto error;
2085 DISPATCH();
2086 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002087
Benjamin Petersonddd19492018-09-16 22:38:02 -07002088 case TARGET(INPLACE_RSHIFT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002089 PyObject *right = POP();
2090 PyObject *left = TOP();
2091 PyObject *res = PyNumber_InPlaceRshift(left, right);
2092 Py_DECREF(left);
2093 Py_DECREF(right);
2094 SET_TOP(res);
2095 if (res == NULL)
2096 goto error;
2097 DISPATCH();
2098 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002099
Benjamin Petersonddd19492018-09-16 22:38:02 -07002100 case TARGET(INPLACE_AND): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002101 PyObject *right = POP();
2102 PyObject *left = TOP();
2103 PyObject *res = PyNumber_InPlaceAnd(left, right);
2104 Py_DECREF(left);
2105 Py_DECREF(right);
2106 SET_TOP(res);
2107 if (res == NULL)
2108 goto error;
2109 DISPATCH();
2110 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002111
Benjamin Petersonddd19492018-09-16 22:38:02 -07002112 case TARGET(INPLACE_XOR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002113 PyObject *right = POP();
2114 PyObject *left = TOP();
2115 PyObject *res = PyNumber_InPlaceXor(left, right);
2116 Py_DECREF(left);
2117 Py_DECREF(right);
2118 SET_TOP(res);
2119 if (res == NULL)
2120 goto error;
2121 DISPATCH();
2122 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002123
Benjamin Petersonddd19492018-09-16 22:38:02 -07002124 case TARGET(INPLACE_OR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002125 PyObject *right = POP();
2126 PyObject *left = TOP();
2127 PyObject *res = PyNumber_InPlaceOr(left, right);
2128 Py_DECREF(left);
2129 Py_DECREF(right);
2130 SET_TOP(res);
2131 if (res == NULL)
2132 goto error;
2133 DISPATCH();
2134 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002135
Benjamin Petersonddd19492018-09-16 22:38:02 -07002136 case TARGET(STORE_SUBSCR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002137 PyObject *sub = TOP();
2138 PyObject *container = SECOND();
2139 PyObject *v = THIRD();
2140 int err;
costypetrisor8ed317f2018-07-31 20:55:14 +00002141 STACK_SHRINK(3);
Martin Panter95f53c12016-07-18 08:23:26 +00002142 /* container[sub] = v */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002143 err = PyObject_SetItem(container, sub, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002144 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002145 Py_DECREF(container);
2146 Py_DECREF(sub);
2147 if (err != 0)
2148 goto error;
2149 DISPATCH();
2150 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002151
Benjamin Petersonddd19492018-09-16 22:38:02 -07002152 case TARGET(DELETE_SUBSCR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002153 PyObject *sub = TOP();
2154 PyObject *container = SECOND();
2155 int err;
costypetrisor8ed317f2018-07-31 20:55:14 +00002156 STACK_SHRINK(2);
Martin Panter95f53c12016-07-18 08:23:26 +00002157 /* del container[sub] */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002158 err = PyObject_DelItem(container, sub);
2159 Py_DECREF(container);
2160 Py_DECREF(sub);
2161 if (err != 0)
2162 goto error;
2163 DISPATCH();
2164 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00002165
Benjamin Petersonddd19492018-09-16 22:38:02 -07002166 case TARGET(PRINT_EXPR): {
Victor Stinnercab75e32013-11-06 22:38:37 +01002167 _Py_IDENTIFIER(displayhook);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002168 PyObject *value = POP();
Victor Stinnercab75e32013-11-06 22:38:37 +01002169 PyObject *hook = _PySys_GetObjectId(&PyId_displayhook);
Benjamin Petersonfe1bcb62012-10-12 11:40:01 -04002170 PyObject *res;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002171 if (hook == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002172 _PyErr_SetString(tstate, PyExc_RuntimeError,
2173 "lost sys.displayhook");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002174 Py_DECREF(value);
2175 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002176 }
Petr Viktorinffd97532020-02-11 17:46:57 +01002177 res = PyObject_CallOneArg(hook, value);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002178 Py_DECREF(value);
2179 if (res == NULL)
2180 goto error;
2181 Py_DECREF(res);
2182 DISPATCH();
2183 }
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00002184
Benjamin Petersonddd19492018-09-16 22:38:02 -07002185 case TARGET(RAISE_VARARGS): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002186 PyObject *cause = NULL, *exc = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002187 switch (oparg) {
2188 case 2:
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002189 cause = POP(); /* cause */
Stefan Krahf432a322017-08-21 13:09:59 +02002190 /* fall through */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002191 case 1:
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002192 exc = POP(); /* exc */
Stefan Krahf432a322017-08-21 13:09:59 +02002193 /* fall through */
2194 case 0:
Victor Stinner09532fe2019-05-10 23:39:09 +02002195 if (do_raise(tstate, exc, cause)) {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002196 goto exception_unwind;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002197 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002198 break;
2199 default:
Victor Stinner438a12d2019-05-24 17:01:38 +02002200 _PyErr_SetString(tstate, PyExc_SystemError,
2201 "bad RAISE_VARARGS oparg");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002202 break;
2203 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002204 goto error;
2205 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002206
Benjamin Petersonddd19492018-09-16 22:38:02 -07002207 case TARGET(RETURN_VALUE): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002208 retval = POP();
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002209 assert(f->f_iblock == 0);
Mark Shannone7c9f4a2020-01-13 12:51:26 +00002210 assert(EMPTY());
Mark Shannoncb9879b2020-07-17 11:44:23 +01002211 f->f_state = FRAME_RETURNED;
2212 f->f_stackdepth = 0;
Mark Shannone7c9f4a2020-01-13 12:51:26 +00002213 goto exiting;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002214 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002215
Benjamin Petersonddd19492018-09-16 22:38:02 -07002216 case TARGET(GET_AITER): {
Yury Selivanov6ef05902015-05-28 11:21:31 -04002217 unaryfunc getter = NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04002218 PyObject *iter = NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04002219 PyObject *obj = TOP();
2220 PyTypeObject *type = Py_TYPE(obj);
2221
Yury Selivanova6f6edb2016-06-09 15:08:31 -04002222 if (type->tp_as_async != NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04002223 getter = type->tp_as_async->am_aiter;
Yury Selivanova6f6edb2016-06-09 15:08:31 -04002224 }
Yury Selivanov75445082015-05-11 22:57:16 -04002225
2226 if (getter != NULL) {
2227 iter = (*getter)(obj);
2228 Py_DECREF(obj);
2229 if (iter == NULL) {
2230 SET_TOP(NULL);
2231 goto error;
2232 }
2233 }
2234 else {
2235 SET_TOP(NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02002236 _PyErr_Format(tstate, PyExc_TypeError,
2237 "'async for' requires an object with "
2238 "__aiter__ method, got %.100s",
2239 type->tp_name);
Yury Selivanov75445082015-05-11 22:57:16 -04002240 Py_DECREF(obj);
2241 goto error;
2242 }
2243
Yury Selivanovfaa135a2017-10-06 02:08:57 -04002244 if (Py_TYPE(iter)->tp_as_async == NULL ||
2245 Py_TYPE(iter)->tp_as_async->am_anext == NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04002246
Yury Selivanov398ff912017-03-02 22:20:00 -05002247 SET_TOP(NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02002248 _PyErr_Format(tstate, PyExc_TypeError,
2249 "'async for' received an object from __aiter__ "
2250 "that does not implement __anext__: %.100s",
2251 Py_TYPE(iter)->tp_name);
Yury Selivanov75445082015-05-11 22:57:16 -04002252 Py_DECREF(iter);
2253 goto error;
Yury Selivanova6f6edb2016-06-09 15:08:31 -04002254 }
2255
Yury Selivanovfaa135a2017-10-06 02:08:57 -04002256 SET_TOP(iter);
Yury Selivanov75445082015-05-11 22:57:16 -04002257 DISPATCH();
2258 }
2259
Benjamin Petersonddd19492018-09-16 22:38:02 -07002260 case TARGET(GET_ANEXT): {
Yury Selivanov6ef05902015-05-28 11:21:31 -04002261 unaryfunc getter = NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04002262 PyObject *next_iter = NULL;
2263 PyObject *awaitable = NULL;
2264 PyObject *aiter = TOP();
2265 PyTypeObject *type = Py_TYPE(aiter);
2266
Yury Selivanoveb636452016-09-08 22:01:51 -07002267 if (PyAsyncGen_CheckExact(aiter)) {
2268 awaitable = type->tp_as_async->am_anext(aiter);
2269 if (awaitable == NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04002270 goto error;
2271 }
Yury Selivanoveb636452016-09-08 22:01:51 -07002272 } else {
2273 if (type->tp_as_async != NULL){
2274 getter = type->tp_as_async->am_anext;
2275 }
Yury Selivanov75445082015-05-11 22:57:16 -04002276
Yury Selivanoveb636452016-09-08 22:01:51 -07002277 if (getter != NULL) {
2278 next_iter = (*getter)(aiter);
2279 if (next_iter == NULL) {
2280 goto error;
2281 }
2282 }
2283 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02002284 _PyErr_Format(tstate, PyExc_TypeError,
2285 "'async for' requires an iterator with "
2286 "__anext__ method, got %.100s",
2287 type->tp_name);
Yury Selivanoveb636452016-09-08 22:01:51 -07002288 goto error;
2289 }
Yury Selivanov75445082015-05-11 22:57:16 -04002290
Yury Selivanoveb636452016-09-08 22:01:51 -07002291 awaitable = _PyCoro_GetAwaitableIter(next_iter);
2292 if (awaitable == NULL) {
Yury Selivanov398ff912017-03-02 22:20:00 -05002293 _PyErr_FormatFromCause(
Yury Selivanoveb636452016-09-08 22:01:51 -07002294 PyExc_TypeError,
2295 "'async for' received an invalid object "
2296 "from __anext__: %.100s",
2297 Py_TYPE(next_iter)->tp_name);
2298
2299 Py_DECREF(next_iter);
2300 goto error;
2301 } else {
2302 Py_DECREF(next_iter);
2303 }
2304 }
Yury Selivanov75445082015-05-11 22:57:16 -04002305
2306 PUSH(awaitable);
Serhiy Storchakada9c5132016-06-27 18:58:57 +03002307 PREDICT(LOAD_CONST);
Yury Selivanov75445082015-05-11 22:57:16 -04002308 DISPATCH();
2309 }
2310
Benjamin Petersonddd19492018-09-16 22:38:02 -07002311 case TARGET(GET_AWAITABLE): {
2312 PREDICTED(GET_AWAITABLE);
Yury Selivanov75445082015-05-11 22:57:16 -04002313 PyObject *iterable = TOP();
Yury Selivanov5376ba92015-06-22 12:19:30 -04002314 PyObject *iter = _PyCoro_GetAwaitableIter(iterable);
Yury Selivanov75445082015-05-11 22:57:16 -04002315
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03002316 if (iter == NULL) {
Mark Shannonfee55262019-11-21 09:11:43 +00002317 int opcode_at_minus_3 = 0;
2318 if ((next_instr - first_instr) > 2) {
2319 opcode_at_minus_3 = _Py_OPCODE(next_instr[-3]);
2320 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002321 format_awaitable_error(tstate, Py_TYPE(iterable),
Mark Shannonfee55262019-11-21 09:11:43 +00002322 opcode_at_minus_3,
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03002323 _Py_OPCODE(next_instr[-2]));
2324 }
2325
Yury Selivanov75445082015-05-11 22:57:16 -04002326 Py_DECREF(iterable);
2327
Yury Selivanovc724bae2016-03-02 11:30:46 -05002328 if (iter != NULL && PyCoro_CheckExact(iter)) {
2329 PyObject *yf = _PyGen_yf((PyGenObject*)iter);
2330 if (yf != NULL) {
2331 /* `iter` is a coroutine object that is being
2332 awaited, `yf` is a pointer to the current awaitable
2333 being awaited on. */
2334 Py_DECREF(yf);
2335 Py_CLEAR(iter);
Victor Stinner438a12d2019-05-24 17:01:38 +02002336 _PyErr_SetString(tstate, PyExc_RuntimeError,
2337 "coroutine is being awaited already");
Yury Selivanovc724bae2016-03-02 11:30:46 -05002338 /* The code below jumps to `error` if `iter` is NULL. */
2339 }
2340 }
2341
Yury Selivanov75445082015-05-11 22:57:16 -04002342 SET_TOP(iter); /* Even if it's NULL */
2343
2344 if (iter == NULL) {
2345 goto error;
2346 }
2347
Serhiy Storchakada9c5132016-06-27 18:58:57 +03002348 PREDICT(LOAD_CONST);
Yury Selivanov75445082015-05-11 22:57:16 -04002349 DISPATCH();
2350 }
2351
Benjamin Petersonddd19492018-09-16 22:38:02 -07002352 case TARGET(YIELD_FROM): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002353 PyObject *v = POP();
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07002354 PyObject *receiver = TOP();
Vladimir Matveev037245c2020-10-09 17:15:15 -07002355 PySendResult gen_status;
2356 if (tstate->c_tracefunc == NULL) {
2357 gen_status = PyIter_Send(receiver, v, &retval);
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05002358 } else {
Vladimir Matveev037245c2020-10-09 17:15:15 -07002359 _Py_IDENTIFIER(send);
2360 if (v == Py_None && PyIter_Check(receiver)) {
2361 retval = Py_TYPE(receiver)->tp_iternext(receiver);
Vladimir Matveev2b053612020-09-18 18:38:38 -07002362 }
2363 else {
Vladimir Matveev037245c2020-10-09 17:15:15 -07002364 retval = _PyObject_CallMethodIdOneArg(receiver, &PyId_send, v);
Vladimir Matveev2b053612020-09-18 18:38:38 -07002365 }
Vladimir Matveev2b053612020-09-18 18:38:38 -07002366 if (retval == NULL) {
2367 if (tstate->c_tracefunc != NULL
2368 && _PyErr_ExceptionMatches(tstate, PyExc_StopIteration))
Mark Shannon86433452021-01-07 16:49:02 +00002369 call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj, tstate, f, &bounds);
Vladimir Matveev2b053612020-09-18 18:38:38 -07002370 if (_PyGen_FetchStopIterationValue(&retval) == 0) {
2371 gen_status = PYGEN_RETURN;
2372 }
2373 else {
2374 gen_status = PYGEN_ERROR;
2375 }
2376 }
2377 else {
2378 gen_status = PYGEN_NEXT;
2379 }
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05002380 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002381 Py_DECREF(v);
Vladimir Matveev2b053612020-09-18 18:38:38 -07002382 if (gen_status == PYGEN_ERROR) {
2383 assert (retval == NULL);
2384 goto error;
2385 }
2386 if (gen_status == PYGEN_RETURN) {
2387 assert (retval != NULL);
2388
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07002389 Py_DECREF(receiver);
Vladimir Matveev2b053612020-09-18 18:38:38 -07002390 SET_TOP(retval);
2391 retval = NULL;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002392 DISPATCH();
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002393 }
Vladimir Matveev2b053612020-09-18 18:38:38 -07002394 assert (gen_status == PYGEN_NEXT);
Martin Panter95f53c12016-07-18 08:23:26 +00002395 /* receiver remains on stack, retval is value to be yielded */
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05002396 /* and repeat... */
Victor Stinnerf7d199f2016-11-24 22:33:01 +01002397 assert(f->f_lasti >= (int)sizeof(_Py_CODEUNIT));
Serhiy Storchakaab874002016-09-11 13:48:15 +03002398 f->f_lasti -= sizeof(_Py_CODEUNIT);
Mark Shannoncb9879b2020-07-17 11:44:23 +01002399 f->f_state = FRAME_SUSPENDED;
Victor Stinnerb7d8d8d2020-09-23 14:07:16 +02002400 f->f_stackdepth = (int)(stack_pointer - f->f_valuestack);
Mark Shannone7c9f4a2020-01-13 12:51:26 +00002401 goto exiting;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002402 }
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002403
Benjamin Petersonddd19492018-09-16 22:38:02 -07002404 case TARGET(YIELD_VALUE): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002405 retval = POP();
Yury Selivanoveb636452016-09-08 22:01:51 -07002406
2407 if (co->co_flags & CO_ASYNC_GENERATOR) {
2408 PyObject *w = _PyAsyncGenValueWrapperNew(retval);
2409 Py_DECREF(retval);
2410 if (w == NULL) {
2411 retval = NULL;
2412 goto error;
2413 }
2414 retval = w;
2415 }
Mark Shannoncb9879b2020-07-17 11:44:23 +01002416 f->f_state = FRAME_SUSPENDED;
Victor Stinnerb7d8d8d2020-09-23 14:07:16 +02002417 f->f_stackdepth = (int)(stack_pointer - f->f_valuestack);
Mark Shannone7c9f4a2020-01-13 12:51:26 +00002418 goto exiting;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002419 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002420
Benjamin Petersonddd19492018-09-16 22:38:02 -07002421 case TARGET(POP_EXCEPT): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002422 PyObject *type, *value, *traceback;
2423 _PyErr_StackItem *exc_info;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002424 PyTryBlock *b = PyFrame_BlockPop(f);
2425 if (b->b_type != EXCEPT_HANDLER) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002426 _PyErr_SetString(tstate, PyExc_SystemError,
2427 "popped block is not an except handler");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002428 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002429 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002430 assert(STACK_LEVEL() >= (b)->b_level + 3 &&
2431 STACK_LEVEL() <= (b)->b_level + 4);
2432 exc_info = tstate->exc_info;
2433 type = exc_info->exc_type;
2434 value = exc_info->exc_value;
2435 traceback = exc_info->exc_traceback;
2436 exc_info->exc_type = POP();
2437 exc_info->exc_value = POP();
2438 exc_info->exc_traceback = POP();
2439 Py_XDECREF(type);
2440 Py_XDECREF(value);
2441 Py_XDECREF(traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002442 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002443 }
Benjamin Petersoneec3d712008-06-11 15:59:43 +00002444
Benjamin Petersonddd19492018-09-16 22:38:02 -07002445 case TARGET(POP_BLOCK): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002446 PyFrame_BlockPop(f);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002447 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002448 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002449
Mark Shannonfee55262019-11-21 09:11:43 +00002450 case TARGET(RERAISE): {
Mark Shannonbf353f32020-12-17 13:55:28 +00002451 assert(f->f_iblock > 0);
2452 if (oparg) {
2453 f->f_lasti = f->f_blockstack[f->f_iblock-1].b_handler;
2454 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002455 PyObject *exc = POP();
Mark Shannonfee55262019-11-21 09:11:43 +00002456 PyObject *val = POP();
2457 PyObject *tb = POP();
2458 assert(PyExceptionClass_Check(exc));
Victor Stinner61f4db82020-01-28 03:37:45 +01002459 _PyErr_Restore(tstate, exc, val, tb);
Mark Shannonfee55262019-11-21 09:11:43 +00002460 goto exception_unwind;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002461 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002462
Benjamin Petersonddd19492018-09-16 22:38:02 -07002463 case TARGET(END_ASYNC_FOR): {
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002464 PyObject *exc = POP();
2465 assert(PyExceptionClass_Check(exc));
2466 if (PyErr_GivenExceptionMatches(exc, PyExc_StopAsyncIteration)) {
2467 PyTryBlock *b = PyFrame_BlockPop(f);
2468 assert(b->b_type == EXCEPT_HANDLER);
2469 Py_DECREF(exc);
2470 UNWIND_EXCEPT_HANDLER(b);
2471 Py_DECREF(POP());
2472 JUMPBY(oparg);
2473 FAST_DISPATCH();
2474 }
2475 else {
2476 PyObject *val = POP();
2477 PyObject *tb = POP();
Victor Stinner438a12d2019-05-24 17:01:38 +02002478 _PyErr_Restore(tstate, exc, val, tb);
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002479 goto exception_unwind;
2480 }
2481 }
2482
Zackery Spytzce6a0702019-08-25 03:44:09 -06002483 case TARGET(LOAD_ASSERTION_ERROR): {
2484 PyObject *value = PyExc_AssertionError;
2485 Py_INCREF(value);
2486 PUSH(value);
2487 FAST_DISPATCH();
2488 }
2489
Benjamin Petersonddd19492018-09-16 22:38:02 -07002490 case TARGET(LOAD_BUILD_CLASS): {
Victor Stinner3c1e4812012-03-26 22:10:51 +02002491 _Py_IDENTIFIER(__build_class__);
Victor Stinnerb0b22422012-04-19 00:57:45 +02002492
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002493 PyObject *bc;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002494 if (PyDict_CheckExact(f->f_builtins)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002495 bc = _PyDict_GetItemIdWithError(f->f_builtins, &PyId___build_class__);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002496 if (bc == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002497 if (!_PyErr_Occurred(tstate)) {
2498 _PyErr_SetString(tstate, PyExc_NameError,
2499 "__build_class__ not found");
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002500 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002501 goto error;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002502 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002503 Py_INCREF(bc);
Victor Stinnerb0b22422012-04-19 00:57:45 +02002504 }
2505 else {
2506 PyObject *build_class_str = _PyUnicode_FromId(&PyId___build_class__);
2507 if (build_class_str == NULL)
Serhiy Storchaka70b72f02016-11-08 23:12:46 +02002508 goto error;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002509 bc = PyObject_GetItem(f->f_builtins, build_class_str);
2510 if (bc == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002511 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError))
2512 _PyErr_SetString(tstate, PyExc_NameError,
2513 "__build_class__ not found");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002514 goto error;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002515 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002516 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002517 PUSH(bc);
Benjamin Peterson00f86f22012-10-10 14:10:33 -04002518 DISPATCH();
Victor Stinner3c1e4812012-03-26 22:10:51 +02002519 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002520
Benjamin Petersonddd19492018-09-16 22:38:02 -07002521 case TARGET(STORE_NAME): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002522 PyObject *name = GETITEM(names, oparg);
2523 PyObject *v = POP();
2524 PyObject *ns = f->f_locals;
2525 int err;
2526 if (ns == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002527 _PyErr_Format(tstate, PyExc_SystemError,
2528 "no locals found when storing %R", name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002529 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002530 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002531 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002532 if (PyDict_CheckExact(ns))
2533 err = PyDict_SetItem(ns, name, v);
2534 else
2535 err = PyObject_SetItem(ns, name, v);
2536 Py_DECREF(v);
2537 if (err != 0)
2538 goto error;
2539 DISPATCH();
2540 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002541
Benjamin Petersonddd19492018-09-16 22:38:02 -07002542 case TARGET(DELETE_NAME): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002543 PyObject *name = GETITEM(names, oparg);
2544 PyObject *ns = f->f_locals;
2545 int err;
2546 if (ns == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002547 _PyErr_Format(tstate, PyExc_SystemError,
2548 "no locals when deleting %R", name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002549 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002550 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002551 err = PyObject_DelItem(ns, name);
2552 if (err != 0) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002553 format_exc_check_arg(tstate, PyExc_NameError,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002554 NAME_ERROR_MSG,
2555 name);
2556 goto error;
2557 }
2558 DISPATCH();
2559 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00002560
Benjamin Petersonddd19492018-09-16 22:38:02 -07002561 case TARGET(UNPACK_SEQUENCE): {
2562 PREDICTED(UNPACK_SEQUENCE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002563 PyObject *seq = POP(), *item, **items;
2564 if (PyTuple_CheckExact(seq) &&
2565 PyTuple_GET_SIZE(seq) == oparg) {
2566 items = ((PyTupleObject *)seq)->ob_item;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002567 while (oparg--) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002568 item = items[oparg];
2569 Py_INCREF(item);
2570 PUSH(item);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002571 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002572 } else if (PyList_CheckExact(seq) &&
2573 PyList_GET_SIZE(seq) == oparg) {
2574 items = ((PyListObject *)seq)->ob_item;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002575 while (oparg--) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002576 item = items[oparg];
2577 Py_INCREF(item);
2578 PUSH(item);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002579 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002580 } else if (unpack_iterable(tstate, seq, oparg, -1,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002581 stack_pointer + oparg)) {
costypetrisor8ed317f2018-07-31 20:55:14 +00002582 STACK_GROW(oparg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002583 } else {
2584 /* unpack_iterable() raised an exception */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002585 Py_DECREF(seq);
2586 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002587 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002588 Py_DECREF(seq);
Benjamin Peterson00f86f22012-10-10 14:10:33 -04002589 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002590 }
Guido van Rossum0368b722007-05-11 16:50:42 +00002591
Benjamin Petersonddd19492018-09-16 22:38:02 -07002592 case TARGET(UNPACK_EX): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002593 int totalargs = 1 + (oparg & 0xFF) + (oparg >> 8);
2594 PyObject *seq = POP();
2595
Victor Stinner438a12d2019-05-24 17:01:38 +02002596 if (unpack_iterable(tstate, seq, oparg & 0xFF, oparg >> 8,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002597 stack_pointer + totalargs)) {
2598 stack_pointer += totalargs;
2599 } else {
2600 Py_DECREF(seq);
2601 goto error;
2602 }
2603 Py_DECREF(seq);
2604 DISPATCH();
2605 }
2606
Benjamin Petersonddd19492018-09-16 22:38:02 -07002607 case TARGET(STORE_ATTR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002608 PyObject *name = GETITEM(names, oparg);
2609 PyObject *owner = TOP();
2610 PyObject *v = SECOND();
2611 int err;
costypetrisor8ed317f2018-07-31 20:55:14 +00002612 STACK_SHRINK(2);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002613 err = PyObject_SetAttr(owner, name, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002614 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002615 Py_DECREF(owner);
2616 if (err != 0)
2617 goto error;
2618 DISPATCH();
2619 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002620
Benjamin Petersonddd19492018-09-16 22:38:02 -07002621 case TARGET(DELETE_ATTR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002622 PyObject *name = GETITEM(names, oparg);
2623 PyObject *owner = POP();
2624 int err;
2625 err = PyObject_SetAttr(owner, name, (PyObject *)NULL);
2626 Py_DECREF(owner);
2627 if (err != 0)
2628 goto error;
2629 DISPATCH();
2630 }
2631
Benjamin Petersonddd19492018-09-16 22:38:02 -07002632 case TARGET(STORE_GLOBAL): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002633 PyObject *name = GETITEM(names, oparg);
2634 PyObject *v = POP();
2635 int err;
2636 err = PyDict_SetItem(f->f_globals, name, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002637 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002638 if (err != 0)
2639 goto error;
2640 DISPATCH();
2641 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002642
Benjamin Petersonddd19492018-09-16 22:38:02 -07002643 case TARGET(DELETE_GLOBAL): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002644 PyObject *name = GETITEM(names, oparg);
2645 int err;
2646 err = PyDict_DelItem(f->f_globals, name);
2647 if (err != 0) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002648 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
2649 format_exc_check_arg(tstate, PyExc_NameError,
2650 NAME_ERROR_MSG, name);
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002651 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002652 goto error;
Benjamin Peterson00f86f22012-10-10 14:10:33 -04002653 }
2654 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002655 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002656
Benjamin Petersonddd19492018-09-16 22:38:02 -07002657 case TARGET(LOAD_NAME): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002658 PyObject *name = GETITEM(names, oparg);
2659 PyObject *locals = f->f_locals;
2660 PyObject *v;
2661 if (locals == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002662 _PyErr_Format(tstate, PyExc_SystemError,
2663 "no locals when loading %R", name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002664 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002665 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002666 if (PyDict_CheckExact(locals)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002667 v = PyDict_GetItemWithError(locals, name);
2668 if (v != NULL) {
2669 Py_INCREF(v);
2670 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002671 else if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002672 goto error;
2673 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002674 }
2675 else {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002676 v = PyObject_GetItem(locals, name);
Victor Stinnere20310f2015-11-05 13:56:58 +01002677 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002678 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError))
Benjamin Peterson92722792012-12-15 12:51:05 -05002679 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02002680 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002681 }
2682 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002683 if (v == NULL) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002684 v = PyDict_GetItemWithError(f->f_globals, name);
2685 if (v != NULL) {
2686 Py_INCREF(v);
2687 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002688 else if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002689 goto error;
2690 }
2691 else {
Victor Stinnerb0b22422012-04-19 00:57:45 +02002692 if (PyDict_CheckExact(f->f_builtins)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002693 v = PyDict_GetItemWithError(f->f_builtins, name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002694 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002695 if (!_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002696 format_exc_check_arg(
Victor Stinner438a12d2019-05-24 17:01:38 +02002697 tstate, PyExc_NameError,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002698 NAME_ERROR_MSG, name);
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002699 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002700 goto error;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002701 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002702 Py_INCREF(v);
Victor Stinnerb0b22422012-04-19 00:57:45 +02002703 }
2704 else {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002705 v = PyObject_GetItem(f->f_builtins, name);
2706 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002707 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Victor Stinnerb0b22422012-04-19 00:57:45 +02002708 format_exc_check_arg(
Victor Stinner438a12d2019-05-24 17:01:38 +02002709 tstate, PyExc_NameError,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002710 NAME_ERROR_MSG, name);
Victor Stinner438a12d2019-05-24 17:01:38 +02002711 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002712 goto error;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002713 }
Benjamin Peterson20f9c3c2010-07-20 22:39:34 +00002714 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002715 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002716 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002717 PUSH(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002718 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002719 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002720
Benjamin Petersonddd19492018-09-16 22:38:02 -07002721 case TARGET(LOAD_GLOBAL): {
Inada Naoki91234a12019-06-03 21:30:58 +09002722 PyObject *name;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002723 PyObject *v;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002724 if (PyDict_CheckExact(f->f_globals)
Victor Stinnerb4efc962015-11-20 09:24:02 +01002725 && PyDict_CheckExact(f->f_builtins))
2726 {
Inada Naoki91234a12019-06-03 21:30:58 +09002727 OPCACHE_CHECK();
2728 if (co_opcache != NULL && co_opcache->optimized > 0) {
2729 _PyOpcache_LoadGlobal *lg = &co_opcache->u.lg;
2730
2731 if (lg->globals_ver ==
2732 ((PyDictObject *)f->f_globals)->ma_version_tag
2733 && lg->builtins_ver ==
2734 ((PyDictObject *)f->f_builtins)->ma_version_tag)
2735 {
2736 PyObject *ptr = lg->ptr;
2737 OPCACHE_STAT_GLOBAL_HIT();
2738 assert(ptr != NULL);
2739 Py_INCREF(ptr);
2740 PUSH(ptr);
2741 DISPATCH();
2742 }
2743 }
2744
2745 name = GETITEM(names, oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002746 v = _PyDict_LoadGlobal((PyDictObject *)f->f_globals,
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002747 (PyDictObject *)f->f_builtins,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002748 name);
2749 if (v == NULL) {
Victor Stinnera4860542021-02-19 15:08:54 +01002750 if (!_PyErr_Occurred(tstate)) {
Victor Stinnerb4efc962015-11-20 09:24:02 +01002751 /* _PyDict_LoadGlobal() returns NULL without raising
2752 * an exception if the key doesn't exist */
Victor Stinner438a12d2019-05-24 17:01:38 +02002753 format_exc_check_arg(tstate, PyExc_NameError,
Ezio Melotti04a29552013-03-03 15:12:44 +02002754 NAME_ERROR_MSG, name);
Victor Stinnerb4efc962015-11-20 09:24:02 +01002755 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002756 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002757 }
Inada Naoki91234a12019-06-03 21:30:58 +09002758
2759 if (co_opcache != NULL) {
2760 _PyOpcache_LoadGlobal *lg = &co_opcache->u.lg;
2761
2762 if (co_opcache->optimized == 0) {
2763 /* Wasn't optimized before. */
2764 OPCACHE_STAT_GLOBAL_OPT();
2765 } else {
2766 OPCACHE_STAT_GLOBAL_MISS();
2767 }
2768
2769 co_opcache->optimized = 1;
2770 lg->globals_ver =
2771 ((PyDictObject *)f->f_globals)->ma_version_tag;
2772 lg->builtins_ver =
2773 ((PyDictObject *)f->f_builtins)->ma_version_tag;
2774 lg->ptr = v; /* borrowed */
2775 }
2776
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002777 Py_INCREF(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002778 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002779 else {
2780 /* Slow-path if globals or builtins is not a dict */
Victor Stinnerb4efc962015-11-20 09:24:02 +01002781
2782 /* namespace 1: globals */
Inada Naoki91234a12019-06-03 21:30:58 +09002783 name = GETITEM(names, oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002784 v = PyObject_GetItem(f->f_globals, name);
2785 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002786 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Victor Stinner60a1d3c2015-11-05 13:55:20 +01002787 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02002788 }
2789 _PyErr_Clear(tstate);
Victor Stinner60a1d3c2015-11-05 13:55:20 +01002790
Victor Stinnerb4efc962015-11-20 09:24:02 +01002791 /* namespace 2: builtins */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002792 v = PyObject_GetItem(f->f_builtins, name);
2793 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002794 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002795 format_exc_check_arg(
Victor Stinner438a12d2019-05-24 17:01:38 +02002796 tstate, PyExc_NameError,
Ezio Melotti04a29552013-03-03 15:12:44 +02002797 NAME_ERROR_MSG, name);
Victor Stinner438a12d2019-05-24 17:01:38 +02002798 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002799 goto error;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002800 }
2801 }
2802 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002803 PUSH(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002804 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002805 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002806
Benjamin Petersonddd19492018-09-16 22:38:02 -07002807 case TARGET(DELETE_FAST): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002808 PyObject *v = GETLOCAL(oparg);
2809 if (v != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002810 SETLOCAL(oparg, NULL);
2811 DISPATCH();
2812 }
2813 format_exc_check_arg(
Victor Stinner438a12d2019-05-24 17:01:38 +02002814 tstate, PyExc_UnboundLocalError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002815 UNBOUNDLOCAL_ERROR_MSG,
2816 PyTuple_GetItem(co->co_varnames, oparg)
2817 );
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002818 goto error;
2819 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002820
Benjamin Petersonddd19492018-09-16 22:38:02 -07002821 case TARGET(DELETE_DEREF): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002822 PyObject *cell = freevars[oparg];
Raymond Hettingerc32f9db2016-11-12 04:10:35 -05002823 PyObject *oldobj = PyCell_GET(cell);
2824 if (oldobj != NULL) {
2825 PyCell_SET(cell, NULL);
2826 Py_DECREF(oldobj);
Benjamin Peterson00ebe2c2010-09-10 22:02:31 +00002827 DISPATCH();
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00002828 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002829 format_exc_unbound(tstate, co, oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002830 goto error;
2831 }
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00002832
Benjamin Petersonddd19492018-09-16 22:38:02 -07002833 case TARGET(LOAD_CLOSURE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002834 PyObject *cell = freevars[oparg];
2835 Py_INCREF(cell);
2836 PUSH(cell);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002837 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002838 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002839
Benjamin Petersonddd19492018-09-16 22:38:02 -07002840 case TARGET(LOAD_CLASSDEREF): {
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002841 PyObject *name, *value, *locals = f->f_locals;
Victor Stinnerd3dfd0e2013-05-16 23:48:01 +02002842 Py_ssize_t idx;
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002843 assert(locals);
2844 assert(oparg >= PyTuple_GET_SIZE(co->co_cellvars));
2845 idx = oparg - PyTuple_GET_SIZE(co->co_cellvars);
2846 assert(idx >= 0 && idx < PyTuple_GET_SIZE(co->co_freevars));
2847 name = PyTuple_GET_ITEM(co->co_freevars, idx);
2848 if (PyDict_CheckExact(locals)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002849 value = PyDict_GetItemWithError(locals, name);
2850 if (value != NULL) {
2851 Py_INCREF(value);
2852 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002853 else if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002854 goto error;
2855 }
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002856 }
2857 else {
2858 value = PyObject_GetItem(locals, name);
Victor Stinnere20310f2015-11-05 13:56:58 +01002859 if (value == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002860 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002861 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02002862 }
2863 _PyErr_Clear(tstate);
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002864 }
2865 }
2866 if (!value) {
2867 PyObject *cell = freevars[oparg];
2868 value = PyCell_GET(cell);
2869 if (value == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002870 format_exc_unbound(tstate, co, oparg);
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002871 goto error;
2872 }
2873 Py_INCREF(value);
2874 }
2875 PUSH(value);
2876 DISPATCH();
2877 }
2878
Benjamin Petersonddd19492018-09-16 22:38:02 -07002879 case TARGET(LOAD_DEREF): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002880 PyObject *cell = freevars[oparg];
2881 PyObject *value = PyCell_GET(cell);
2882 if (value == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002883 format_exc_unbound(tstate, co, oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002884 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002885 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002886 Py_INCREF(value);
2887 PUSH(value);
2888 DISPATCH();
2889 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002890
Benjamin Petersonddd19492018-09-16 22:38:02 -07002891 case TARGET(STORE_DEREF): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002892 PyObject *v = POP();
2893 PyObject *cell = freevars[oparg];
Raymond Hettingerb2b15432016-11-11 04:32:11 -08002894 PyObject *oldobj = PyCell_GET(cell);
2895 PyCell_SET(cell, v);
2896 Py_XDECREF(oldobj);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002897 DISPATCH();
2898 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002899
Benjamin Petersonddd19492018-09-16 22:38:02 -07002900 case TARGET(BUILD_STRING): {
Serhiy Storchakaea525a22016-09-06 22:07:53 +03002901 PyObject *str;
2902 PyObject *empty = PyUnicode_New(0, 0);
2903 if (empty == NULL) {
2904 goto error;
2905 }
2906 str = _PyUnicode_JoinArray(empty, stack_pointer - oparg, oparg);
2907 Py_DECREF(empty);
2908 if (str == NULL)
2909 goto error;
2910 while (--oparg >= 0) {
2911 PyObject *item = POP();
2912 Py_DECREF(item);
2913 }
2914 PUSH(str);
2915 DISPATCH();
2916 }
2917
Benjamin Petersonddd19492018-09-16 22:38:02 -07002918 case TARGET(BUILD_TUPLE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002919 PyObject *tup = PyTuple_New(oparg);
2920 if (tup == NULL)
2921 goto error;
2922 while (--oparg >= 0) {
2923 PyObject *item = POP();
2924 PyTuple_SET_ITEM(tup, oparg, item);
2925 }
2926 PUSH(tup);
2927 DISPATCH();
2928 }
2929
Benjamin Petersonddd19492018-09-16 22:38:02 -07002930 case TARGET(BUILD_LIST): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002931 PyObject *list = PyList_New(oparg);
2932 if (list == NULL)
2933 goto error;
2934 while (--oparg >= 0) {
2935 PyObject *item = POP();
2936 PyList_SET_ITEM(list, oparg, item);
2937 }
2938 PUSH(list);
2939 DISPATCH();
2940 }
2941
Mark Shannon13bc1392020-01-23 09:25:17 +00002942 case TARGET(LIST_TO_TUPLE): {
2943 PyObject *list = POP();
2944 PyObject *tuple = PyList_AsTuple(list);
2945 Py_DECREF(list);
2946 if (tuple == NULL) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002947 goto error;
Mark Shannon13bc1392020-01-23 09:25:17 +00002948 }
2949 PUSH(tuple);
2950 DISPATCH();
2951 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002952
Mark Shannon13bc1392020-01-23 09:25:17 +00002953 case TARGET(LIST_EXTEND): {
2954 PyObject *iterable = POP();
2955 PyObject *list = PEEK(oparg);
2956 PyObject *none_val = _PyList_Extend((PyListObject *)list, iterable);
2957 if (none_val == NULL) {
2958 if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError) &&
Victor Stinnera102ed72020-02-07 02:24:48 +01002959 (Py_TYPE(iterable)->tp_iter == NULL && !PySequence_Check(iterable)))
Mark Shannon13bc1392020-01-23 09:25:17 +00002960 {
Victor Stinner61f4db82020-01-28 03:37:45 +01002961 _PyErr_Clear(tstate);
Mark Shannon13bc1392020-01-23 09:25:17 +00002962 _PyErr_Format(tstate, PyExc_TypeError,
2963 "Value after * must be an iterable, not %.200s",
2964 Py_TYPE(iterable)->tp_name);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002965 }
Mark Shannon13bc1392020-01-23 09:25:17 +00002966 Py_DECREF(iterable);
2967 goto error;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002968 }
Mark Shannon13bc1392020-01-23 09:25:17 +00002969 Py_DECREF(none_val);
2970 Py_DECREF(iterable);
2971 DISPATCH();
2972 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002973
Mark Shannon13bc1392020-01-23 09:25:17 +00002974 case TARGET(SET_UPDATE): {
2975 PyObject *iterable = POP();
2976 PyObject *set = PEEK(oparg);
2977 int err = _PySet_Update(set, iterable);
2978 Py_DECREF(iterable);
2979 if (err < 0) {
2980 goto error;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002981 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002982 DISPATCH();
2983 }
2984
Benjamin Petersonddd19492018-09-16 22:38:02 -07002985 case TARGET(BUILD_SET): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002986 PyObject *set = PySet_New(NULL);
2987 int err = 0;
Raymond Hettinger4c483ad2016-09-08 14:45:40 -07002988 int i;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002989 if (set == NULL)
2990 goto error;
Raymond Hettinger4c483ad2016-09-08 14:45:40 -07002991 for (i = oparg; i > 0; i--) {
2992 PyObject *item = PEEK(i);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002993 if (err == 0)
2994 err = PySet_Add(set, item);
2995 Py_DECREF(item);
2996 }
costypetrisor8ed317f2018-07-31 20:55:14 +00002997 STACK_SHRINK(oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002998 if (err != 0) {
2999 Py_DECREF(set);
3000 goto error;
3001 }
3002 PUSH(set);
3003 DISPATCH();
3004 }
3005
Benjamin Petersonddd19492018-09-16 22:38:02 -07003006 case TARGET(BUILD_MAP): {
Victor Stinner74319ae2016-08-25 00:04:09 +02003007 Py_ssize_t i;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003008 PyObject *map = _PyDict_NewPresized((Py_ssize_t)oparg);
3009 if (map == NULL)
3010 goto error;
Benjamin Petersond5d77aa2015-07-05 10:37:25 -05003011 for (i = oparg; i > 0; i--) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003012 int err;
Benjamin Petersond5d77aa2015-07-05 10:37:25 -05003013 PyObject *key = PEEK(2*i);
3014 PyObject *value = PEEK(2*i - 1);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003015 err = PyDict_SetItem(map, key, value);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003016 if (err != 0) {
3017 Py_DECREF(map);
3018 goto error;
3019 }
3020 }
Benjamin Petersond5d77aa2015-07-05 10:37:25 -05003021
3022 while (oparg--) {
3023 Py_DECREF(POP());
3024 Py_DECREF(POP());
3025 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003026 PUSH(map);
3027 DISPATCH();
3028 }
3029
Benjamin Petersonddd19492018-09-16 22:38:02 -07003030 case TARGET(SETUP_ANNOTATIONS): {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003031 _Py_IDENTIFIER(__annotations__);
3032 int err;
3033 PyObject *ann_dict;
3034 if (f->f_locals == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003035 _PyErr_Format(tstate, PyExc_SystemError,
3036 "no locals found when setting up annotations");
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003037 goto error;
3038 }
3039 /* check if __annotations__ in locals()... */
3040 if (PyDict_CheckExact(f->f_locals)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02003041 ann_dict = _PyDict_GetItemIdWithError(f->f_locals,
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003042 &PyId___annotations__);
3043 if (ann_dict == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003044 if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02003045 goto error;
3046 }
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003047 /* ...if not, create a new one */
3048 ann_dict = PyDict_New();
3049 if (ann_dict == NULL) {
3050 goto error;
3051 }
3052 err = _PyDict_SetItemId(f->f_locals,
3053 &PyId___annotations__, ann_dict);
3054 Py_DECREF(ann_dict);
3055 if (err != 0) {
3056 goto error;
3057 }
3058 }
3059 }
3060 else {
3061 /* do the same if locals() is not a dict */
3062 PyObject *ann_str = _PyUnicode_FromId(&PyId___annotations__);
3063 if (ann_str == NULL) {
Serhiy Storchaka4678b2f2016-11-08 23:13:36 +02003064 goto error;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003065 }
3066 ann_dict = PyObject_GetItem(f->f_locals, ann_str);
3067 if (ann_dict == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003068 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003069 goto error;
3070 }
Victor Stinner438a12d2019-05-24 17:01:38 +02003071 _PyErr_Clear(tstate);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003072 ann_dict = PyDict_New();
3073 if (ann_dict == NULL) {
3074 goto error;
3075 }
3076 err = PyObject_SetItem(f->f_locals, ann_str, ann_dict);
3077 Py_DECREF(ann_dict);
3078 if (err != 0) {
3079 goto error;
3080 }
3081 }
3082 else {
3083 Py_DECREF(ann_dict);
3084 }
3085 }
3086 DISPATCH();
3087 }
3088
Benjamin Petersonddd19492018-09-16 22:38:02 -07003089 case TARGET(BUILD_CONST_KEY_MAP): {
Victor Stinner74319ae2016-08-25 00:04:09 +02003090 Py_ssize_t i;
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003091 PyObject *map;
3092 PyObject *keys = TOP();
3093 if (!PyTuple_CheckExact(keys) ||
3094 PyTuple_GET_SIZE(keys) != (Py_ssize_t)oparg) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003095 _PyErr_SetString(tstate, PyExc_SystemError,
3096 "bad BUILD_CONST_KEY_MAP keys argument");
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003097 goto error;
3098 }
3099 map = _PyDict_NewPresized((Py_ssize_t)oparg);
3100 if (map == NULL) {
3101 goto error;
3102 }
3103 for (i = oparg; i > 0; i--) {
3104 int err;
3105 PyObject *key = PyTuple_GET_ITEM(keys, oparg - i);
3106 PyObject *value = PEEK(i + 1);
3107 err = PyDict_SetItem(map, key, value);
3108 if (err != 0) {
3109 Py_DECREF(map);
3110 goto error;
3111 }
3112 }
3113
3114 Py_DECREF(POP());
3115 while (oparg--) {
3116 Py_DECREF(POP());
3117 }
3118 PUSH(map);
3119 DISPATCH();
3120 }
3121
Mark Shannon8a4cd702020-01-27 09:57:45 +00003122 case TARGET(DICT_UPDATE): {
3123 PyObject *update = POP();
3124 PyObject *dict = PEEK(oparg);
3125 if (PyDict_Update(dict, update) < 0) {
3126 if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) {
3127 _PyErr_Format(tstate, PyExc_TypeError,
3128 "'%.200s' object is not a mapping",
Victor Stinnera102ed72020-02-07 02:24:48 +01003129 Py_TYPE(update)->tp_name);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003130 }
Mark Shannon8a4cd702020-01-27 09:57:45 +00003131 Py_DECREF(update);
3132 goto error;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003133 }
Mark Shannon8a4cd702020-01-27 09:57:45 +00003134 Py_DECREF(update);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003135 DISPATCH();
3136 }
3137
Mark Shannon8a4cd702020-01-27 09:57:45 +00003138 case TARGET(DICT_MERGE): {
3139 PyObject *update = POP();
3140 PyObject *dict = PEEK(oparg);
3141
3142 if (_PyDict_MergeEx(dict, update, 2) < 0) {
3143 format_kwargs_error(tstate, PEEK(2 + oparg), update);
3144 Py_DECREF(update);
Serhiy Storchakae036ef82016-10-02 11:06:43 +03003145 goto error;
Serhiy Storchakae036ef82016-10-02 11:06:43 +03003146 }
Mark Shannon8a4cd702020-01-27 09:57:45 +00003147 Py_DECREF(update);
Brandt Bucherf185a732019-09-28 17:12:49 -07003148 PREDICT(CALL_FUNCTION_EX);
Serhiy Storchakae036ef82016-10-02 11:06:43 +03003149 DISPATCH();
3150 }
3151
Benjamin Petersonddd19492018-09-16 22:38:02 -07003152 case TARGET(MAP_ADD): {
Jörn Heisslerc8a35412019-06-22 16:40:55 +02003153 PyObject *value = TOP();
3154 PyObject *key = SECOND();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003155 PyObject *map;
3156 int err;
costypetrisor8ed317f2018-07-31 20:55:14 +00003157 STACK_SHRINK(2);
Raymond Hettinger41862222016-10-15 19:03:06 -07003158 map = PEEK(oparg); /* dict */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003159 assert(PyDict_CheckExact(map));
Martin Panter95f53c12016-07-18 08:23:26 +00003160 err = PyDict_SetItem(map, key, value); /* map[key] = value */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003161 Py_DECREF(value);
3162 Py_DECREF(key);
3163 if (err != 0)
3164 goto error;
3165 PREDICT(JUMP_ABSOLUTE);
3166 DISPATCH();
3167 }
3168
Benjamin Petersonddd19492018-09-16 22:38:02 -07003169 case TARGET(LOAD_ATTR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003170 PyObject *name = GETITEM(names, oparg);
3171 PyObject *owner = TOP();
Pablo Galindo109826c2020-10-20 06:22:44 +01003172
3173 PyTypeObject *type = Py_TYPE(owner);
3174 PyObject *res;
3175 PyObject **dictptr;
3176 PyObject *dict;
3177 _PyOpCodeOpt_LoadAttr *la;
3178
3179 OPCACHE_STAT_ATTR_TOTAL();
3180
3181 OPCACHE_CHECK();
3182 if (co_opcache != NULL && PyType_HasFeature(type, Py_TPFLAGS_VALID_VERSION_TAG))
3183 {
3184 if (co_opcache->optimized > 0) {
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003185 // Fast path -- cache hit makes LOAD_ATTR ~30% faster.
Pablo Galindo109826c2020-10-20 06:22:44 +01003186 la = &co_opcache->u.la;
3187 if (la->type == type && la->tp_version_tag == type->tp_version_tag)
3188 {
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003189 // Hint >= 0 is a dict index; hint == -1 is a dict miss.
3190 // Hint < -1 is an inverted slot offset: offset is strictly > 0,
3191 // so ~offset is strictly < -1 (assuming 2's complement).
3192 if (la->hint < -1) {
3193 // Even faster path -- slot hint.
3194 Py_ssize_t offset = ~la->hint;
3195 // fprintf(stderr, "Using hint for offset %zd\n", offset);
3196 char *addr = (char *)owner + offset;
3197 res = *(PyObject **)addr;
Pablo Galindo109826c2020-10-20 06:22:44 +01003198 if (res != NULL) {
Pablo Galindo109826c2020-10-20 06:22:44 +01003199 Py_INCREF(res);
3200 SET_TOP(res);
3201 Py_DECREF(owner);
Pablo Galindo109826c2020-10-20 06:22:44 +01003202 DISPATCH();
Pablo Galindo109826c2020-10-20 06:22:44 +01003203 }
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003204 // Else slot is NULL. Fall through to slow path to raise AttributeError(name).
3205 // Don't DEOPT, since the slot is still there.
Pablo Galindo109826c2020-10-20 06:22:44 +01003206 } else {
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003207 // Fast path for dict.
3208 assert(type->tp_dict != NULL);
3209 assert(type->tp_dictoffset > 0);
3210
3211 dictptr = (PyObject **) ((char *)owner + type->tp_dictoffset);
3212 dict = *dictptr;
3213 if (dict != NULL && PyDict_CheckExact(dict)) {
3214 Py_ssize_t hint = la->hint;
3215 Py_INCREF(dict);
3216 res = NULL;
Victor Stinnerd5fc9982021-02-21 12:02:04 +01003217 assert(!_PyErr_Occurred(tstate));
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003218 la->hint = _PyDict_GetItemHint((PyDictObject*)dict, name, hint, &res);
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003219 if (res != NULL) {
Victor Stinnerd5fc9982021-02-21 12:02:04 +01003220 assert(la->hint >= 0);
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003221 if (la->hint == hint && hint >= 0) {
3222 // Our hint has helped -- cache hit.
3223 OPCACHE_STAT_ATTR_HIT();
3224 } else {
3225 // The hint we provided didn't work.
3226 // Maybe next time?
3227 OPCACHE_MAYBE_DEOPT_LOAD_ATTR();
3228 }
3229
3230 Py_INCREF(res);
3231 SET_TOP(res);
3232 Py_DECREF(owner);
3233 Py_DECREF(dict);
3234 DISPATCH();
Victor Stinnerd5fc9982021-02-21 12:02:04 +01003235 }
3236 else {
3237 _PyErr_Clear(tstate);
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003238 // This attribute can be missing sometimes;
3239 // we don't want to optimize this lookup.
3240 OPCACHE_DEOPT_LOAD_ATTR();
3241 Py_DECREF(dict);
3242 }
Victor Stinnerd5fc9982021-02-21 12:02:04 +01003243 }
3244 else {
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003245 // There is no dict, or __dict__ doesn't satisfy PyDict_CheckExact.
3246 OPCACHE_DEOPT_LOAD_ATTR();
3247 }
Pablo Galindo109826c2020-10-20 06:22:44 +01003248 }
Victor Stinnerd5fc9982021-02-21 12:02:04 +01003249 }
3250 else {
Pablo Galindo109826c2020-10-20 06:22:44 +01003251 // The type of the object has either been updated,
3252 // or is different. Maybe it will stabilize?
3253 OPCACHE_MAYBE_DEOPT_LOAD_ATTR();
3254 }
Pablo Galindo109826c2020-10-20 06:22:44 +01003255 OPCACHE_STAT_ATTR_MISS();
3256 }
3257
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003258 if (co_opcache != NULL && // co_opcache can be NULL after a DEOPT() call.
Pablo Galindo109826c2020-10-20 06:22:44 +01003259 type->tp_getattro == PyObject_GenericGetAttr)
3260 {
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003261 if (type->tp_dict == NULL) {
3262 if (PyType_Ready(type) < 0) {
3263 Py_DECREF(owner);
3264 SET_TOP(NULL);
3265 goto error;
Pablo Galindo109826c2020-10-20 06:22:44 +01003266 }
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003267 }
3268 PyObject *descr = _PyType_Lookup(type, name);
3269 if (descr != NULL) {
3270 // We found an attribute with a data-like descriptor.
3271 PyTypeObject *dtype = Py_TYPE(descr);
3272 if (dtype == &PyMemberDescr_Type) { // It's a slot
3273 PyMemberDescrObject *member = (PyMemberDescrObject *)descr;
3274 struct PyMemberDef *dmem = member->d_member;
3275 if (dmem->type == T_OBJECT_EX) {
3276 Py_ssize_t offset = dmem->offset;
3277 assert(offset > 0); // 0 would be confused with dict hint == -1 (miss).
Pablo Galindo109826c2020-10-20 06:22:44 +01003278
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003279 if (co_opcache->optimized == 0) {
3280 // First time we optimize this opcode.
3281 OPCACHE_STAT_ATTR_OPT();
3282 co_opcache->optimized = OPCODE_CACHE_MAX_TRIES;
3283 // fprintf(stderr, "Setting hint for %s, offset %zd\n", dmem->name, offset);
3284 }
3285
3286 la = &co_opcache->u.la;
3287 la->type = type;
3288 la->tp_version_tag = type->tp_version_tag;
3289 la->hint = ~offset;
3290
3291 char *addr = (char *)owner + offset;
3292 res = *(PyObject **)addr;
Pablo Galindo109826c2020-10-20 06:22:44 +01003293 if (res != NULL) {
3294 Py_INCREF(res);
Pablo Galindo109826c2020-10-20 06:22:44 +01003295 Py_DECREF(owner);
3296 SET_TOP(res);
3297
Pablo Galindo109826c2020-10-20 06:22:44 +01003298 DISPATCH();
3299 }
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003300 // Else slot is NULL. Fall through to slow path to raise AttributeError(name).
Pablo Galindo109826c2020-10-20 06:22:44 +01003301 }
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003302 // Else it's a slot of a different type. We don't handle those.
3303 }
3304 // Else it's some other kind of descriptor that we don't handle.
3305 OPCACHE_DEOPT_LOAD_ATTR();
Victor Stinnerd5fc9982021-02-21 12:02:04 +01003306 }
3307 else if (type->tp_dictoffset > 0) {
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003308 // We found an instance with a __dict__.
3309 dictptr = (PyObject **) ((char *)owner + type->tp_dictoffset);
3310 dict = *dictptr;
3311
3312 if (dict != NULL && PyDict_CheckExact(dict)) {
3313 Py_INCREF(dict);
3314 res = NULL;
Victor Stinnerd5fc9982021-02-21 12:02:04 +01003315 assert(!_PyErr_Occurred(tstate));
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003316 Py_ssize_t hint = _PyDict_GetItemHint((PyDictObject*)dict, name, -1, &res);
3317 if (res != NULL) {
3318 Py_INCREF(res);
3319 Py_DECREF(dict);
3320 Py_DECREF(owner);
3321 SET_TOP(res);
3322
3323 if (co_opcache->optimized == 0) {
3324 // First time we optimize this opcode.
3325 OPCACHE_STAT_ATTR_OPT();
3326 co_opcache->optimized = OPCODE_CACHE_MAX_TRIES;
3327 }
3328
3329 la = &co_opcache->u.la;
3330 la->type = type;
3331 la->tp_version_tag = type->tp_version_tag;
Victor Stinnerd5fc9982021-02-21 12:02:04 +01003332 assert(hint >= 0);
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003333 la->hint = hint;
3334
3335 DISPATCH();
3336 }
Victor Stinnerd5fc9982021-02-21 12:02:04 +01003337 else {
3338 _PyErr_Clear(tstate);
3339 }
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003340 Py_DECREF(dict);
Pablo Galindo109826c2020-10-20 06:22:44 +01003341 } else {
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003342 // There is no dict, or __dict__ doesn't satisfy PyDict_CheckExact.
Pablo Galindo109826c2020-10-20 06:22:44 +01003343 OPCACHE_DEOPT_LOAD_ATTR();
3344 }
3345 } else {
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003346 // The object's class does not have a tp_dictoffset we can use.
Pablo Galindo109826c2020-10-20 06:22:44 +01003347 OPCACHE_DEOPT_LOAD_ATTR();
3348 }
3349 } else if (type->tp_getattro != PyObject_GenericGetAttr) {
3350 OPCACHE_DEOPT_LOAD_ATTR();
3351 }
3352 }
3353
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003354 // Slow path.
Pablo Galindo109826c2020-10-20 06:22:44 +01003355 res = PyObject_GetAttr(owner, name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003356 Py_DECREF(owner);
3357 SET_TOP(res);
3358 if (res == NULL)
3359 goto error;
3360 DISPATCH();
3361 }
3362
Benjamin Petersonddd19492018-09-16 22:38:02 -07003363 case TARGET(COMPARE_OP): {
Mark Shannon9af0e472020-01-14 10:12:45 +00003364 assert(oparg <= Py_GE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003365 PyObject *right = POP();
3366 PyObject *left = TOP();
Mark Shannon9af0e472020-01-14 10:12:45 +00003367 PyObject *res = PyObject_RichCompare(left, right, oparg);
3368 SET_TOP(res);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003369 Py_DECREF(left);
3370 Py_DECREF(right);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003371 if (res == NULL)
3372 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003373 PREDICT(POP_JUMP_IF_FALSE);
3374 PREDICT(POP_JUMP_IF_TRUE);
3375 DISPATCH();
Victor Stinner3c1e4812012-03-26 22:10:51 +02003376 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003377
Mark Shannon9af0e472020-01-14 10:12:45 +00003378 case TARGET(IS_OP): {
3379 PyObject *right = POP();
3380 PyObject *left = TOP();
3381 int res = (left == right)^oparg;
3382 PyObject *b = res ? Py_True : Py_False;
3383 Py_INCREF(b);
3384 SET_TOP(b);
3385 Py_DECREF(left);
3386 Py_DECREF(right);
3387 PREDICT(POP_JUMP_IF_FALSE);
3388 PREDICT(POP_JUMP_IF_TRUE);
3389 FAST_DISPATCH();
3390 }
3391
3392 case TARGET(CONTAINS_OP): {
3393 PyObject *right = POP();
3394 PyObject *left = POP();
3395 int res = PySequence_Contains(right, left);
3396 Py_DECREF(left);
3397 Py_DECREF(right);
3398 if (res < 0) {
3399 goto error;
3400 }
3401 PyObject *b = (res^oparg) ? Py_True : Py_False;
3402 Py_INCREF(b);
3403 PUSH(b);
3404 PREDICT(POP_JUMP_IF_FALSE);
3405 PREDICT(POP_JUMP_IF_TRUE);
3406 FAST_DISPATCH();
3407 }
3408
3409#define CANNOT_CATCH_MSG "catching classes that do not inherit from "\
3410 "BaseException is not allowed"
3411
3412 case TARGET(JUMP_IF_NOT_EXC_MATCH): {
3413 PyObject *right = POP();
3414 PyObject *left = POP();
3415 if (PyTuple_Check(right)) {
3416 Py_ssize_t i, length;
3417 length = PyTuple_GET_SIZE(right);
3418 for (i = 0; i < length; i++) {
3419 PyObject *exc = PyTuple_GET_ITEM(right, i);
3420 if (!PyExceptionClass_Check(exc)) {
3421 _PyErr_SetString(tstate, PyExc_TypeError,
3422 CANNOT_CATCH_MSG);
3423 Py_DECREF(left);
3424 Py_DECREF(right);
3425 goto error;
3426 }
3427 }
3428 }
3429 else {
3430 if (!PyExceptionClass_Check(right)) {
3431 _PyErr_SetString(tstate, PyExc_TypeError,
3432 CANNOT_CATCH_MSG);
3433 Py_DECREF(left);
3434 Py_DECREF(right);
3435 goto error;
3436 }
3437 }
3438 int res = PyErr_GivenExceptionMatches(left, right);
3439 Py_DECREF(left);
3440 Py_DECREF(right);
3441 if (res > 0) {
3442 /* Exception matches -- Do nothing */;
3443 }
3444 else if (res == 0) {
3445 JUMPTO(oparg);
3446 }
3447 else {
3448 goto error;
3449 }
3450 DISPATCH();
3451 }
3452
Benjamin Petersonddd19492018-09-16 22:38:02 -07003453 case TARGET(IMPORT_NAME): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003454 PyObject *name = GETITEM(names, oparg);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03003455 PyObject *fromlist = POP();
3456 PyObject *level = TOP();
3457 PyObject *res;
Victor Stinner438a12d2019-05-24 17:01:38 +02003458 res = import_name(tstate, f, name, fromlist, level);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03003459 Py_DECREF(level);
3460 Py_DECREF(fromlist);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003461 SET_TOP(res);
3462 if (res == NULL)
3463 goto error;
3464 DISPATCH();
3465 }
3466
Benjamin Petersonddd19492018-09-16 22:38:02 -07003467 case TARGET(IMPORT_STAR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003468 PyObject *from = POP(), *locals;
3469 int err;
Matthias Bussonnier160edb42017-02-25 21:58:05 -08003470 if (PyFrame_FastToLocalsWithError(f) < 0) {
3471 Py_DECREF(from);
Victor Stinner41bb43a2013-10-29 01:19:37 +01003472 goto error;
Matthias Bussonnier160edb42017-02-25 21:58:05 -08003473 }
Victor Stinner41bb43a2013-10-29 01:19:37 +01003474
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003475 locals = f->f_locals;
3476 if (locals == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003477 _PyErr_SetString(tstate, PyExc_SystemError,
3478 "no locals found during 'import *'");
Matthias Bussonnier160edb42017-02-25 21:58:05 -08003479 Py_DECREF(from);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003480 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003481 }
Victor Stinner438a12d2019-05-24 17:01:38 +02003482 err = import_all_from(tstate, locals, from);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003483 PyFrame_LocalsToFast(f, 0);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003484 Py_DECREF(from);
3485 if (err != 0)
3486 goto error;
3487 DISPATCH();
3488 }
Guido van Rossum25831651993-05-19 14:50:45 +00003489
Benjamin Petersonddd19492018-09-16 22:38:02 -07003490 case TARGET(IMPORT_FROM): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003491 PyObject *name = GETITEM(names, oparg);
3492 PyObject *from = TOP();
3493 PyObject *res;
Victor Stinner438a12d2019-05-24 17:01:38 +02003494 res = import_from(tstate, from, name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003495 PUSH(res);
3496 if (res == NULL)
3497 goto error;
3498 DISPATCH();
3499 }
Thomas Wouters52152252000-08-17 22:55:00 +00003500
Benjamin Petersonddd19492018-09-16 22:38:02 -07003501 case TARGET(JUMP_FORWARD): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003502 JUMPBY(oparg);
3503 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003504 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003505
Benjamin Petersonddd19492018-09-16 22:38:02 -07003506 case TARGET(POP_JUMP_IF_FALSE): {
3507 PREDICTED(POP_JUMP_IF_FALSE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003508 PyObject *cond = POP();
3509 int err;
3510 if (cond == Py_True) {
3511 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003512 FAST_DISPATCH();
3513 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003514 if (cond == Py_False) {
3515 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003516 JUMPTO(oparg);
3517 FAST_DISPATCH();
3518 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003519 err = PyObject_IsTrue(cond);
3520 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003521 if (err > 0)
Adrian Wielgosik50c28502017-06-23 13:35:41 -07003522 ;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003523 else if (err == 0)
3524 JUMPTO(oparg);
3525 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003526 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003527 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003528 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003529
Benjamin Petersonddd19492018-09-16 22:38:02 -07003530 case TARGET(POP_JUMP_IF_TRUE): {
3531 PREDICTED(POP_JUMP_IF_TRUE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003532 PyObject *cond = POP();
3533 int err;
3534 if (cond == Py_False) {
3535 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003536 FAST_DISPATCH();
3537 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003538 if (cond == Py_True) {
3539 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003540 JUMPTO(oparg);
3541 FAST_DISPATCH();
3542 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003543 err = PyObject_IsTrue(cond);
3544 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003545 if (err > 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003546 JUMPTO(oparg);
3547 }
3548 else if (err == 0)
3549 ;
3550 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003551 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003552 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003553 }
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00003554
Benjamin Petersonddd19492018-09-16 22:38:02 -07003555 case TARGET(JUMP_IF_FALSE_OR_POP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003556 PyObject *cond = TOP();
3557 int err;
3558 if (cond == Py_True) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003559 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003560 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003561 FAST_DISPATCH();
3562 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003563 if (cond == Py_False) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003564 JUMPTO(oparg);
3565 FAST_DISPATCH();
3566 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003567 err = PyObject_IsTrue(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003568 if (err > 0) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003569 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003570 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003571 }
3572 else if (err == 0)
3573 JUMPTO(oparg);
3574 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003575 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003576 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003577 }
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00003578
Benjamin Petersonddd19492018-09-16 22:38:02 -07003579 case TARGET(JUMP_IF_TRUE_OR_POP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003580 PyObject *cond = TOP();
3581 int err;
3582 if (cond == Py_False) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003583 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003584 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003585 FAST_DISPATCH();
3586 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003587 if (cond == Py_True) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003588 JUMPTO(oparg);
3589 FAST_DISPATCH();
3590 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003591 err = PyObject_IsTrue(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003592 if (err > 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003593 JUMPTO(oparg);
3594 }
3595 else if (err == 0) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003596 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003597 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003598 }
3599 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003600 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003601 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003602 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003603
Benjamin Petersonddd19492018-09-16 22:38:02 -07003604 case TARGET(JUMP_ABSOLUTE): {
3605 PREDICTED(JUMP_ABSOLUTE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003606 JUMPTO(oparg);
Guido van Rossum58da9312007-11-10 23:39:45 +00003607#if FAST_LOOPS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003608 /* Enabling this path speeds-up all while and for-loops by bypassing
3609 the per-loop checks for signals. By default, this should be turned-off
3610 because it prevents detection of a control-break in tight loops like
3611 "while 1: pass". Compile with this option turned-on when you need
3612 the speed-up and do not need break checking inside tight loops (ones
3613 that contain only instructions ending with FAST_DISPATCH).
3614 */
3615 FAST_DISPATCH();
Guido van Rossum58da9312007-11-10 23:39:45 +00003616#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003617 DISPATCH();
Guido van Rossum58da9312007-11-10 23:39:45 +00003618#endif
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003619 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003620
Benjamin Petersonddd19492018-09-16 22:38:02 -07003621 case TARGET(GET_ITER): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003622 /* before: [obj]; after [getiter(obj)] */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003623 PyObject *iterable = TOP();
Yury Selivanov5376ba92015-06-22 12:19:30 -04003624 PyObject *iter = PyObject_GetIter(iterable);
3625 Py_DECREF(iterable);
3626 SET_TOP(iter);
3627 if (iter == NULL)
3628 goto error;
3629 PREDICT(FOR_ITER);
Serhiy Storchakada9c5132016-06-27 18:58:57 +03003630 PREDICT(CALL_FUNCTION);
Yury Selivanov5376ba92015-06-22 12:19:30 -04003631 DISPATCH();
3632 }
3633
Benjamin Petersonddd19492018-09-16 22:38:02 -07003634 case TARGET(GET_YIELD_FROM_ITER): {
Yury Selivanov5376ba92015-06-22 12:19:30 -04003635 /* before: [obj]; after [getiter(obj)] */
3636 PyObject *iterable = TOP();
Yury Selivanov75445082015-05-11 22:57:16 -04003637 PyObject *iter;
Yury Selivanov5376ba92015-06-22 12:19:30 -04003638 if (PyCoro_CheckExact(iterable)) {
3639 /* `iterable` is a coroutine */
3640 if (!(co->co_flags & (CO_COROUTINE | CO_ITERABLE_COROUTINE))) {
3641 /* and it is used in a 'yield from' expression of a
3642 regular generator. */
3643 Py_DECREF(iterable);
3644 SET_TOP(NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02003645 _PyErr_SetString(tstate, PyExc_TypeError,
3646 "cannot 'yield from' a coroutine object "
3647 "in a non-coroutine generator");
Yury Selivanov5376ba92015-06-22 12:19:30 -04003648 goto error;
3649 }
3650 }
3651 else if (!PyGen_CheckExact(iterable)) {
Yury Selivanov75445082015-05-11 22:57:16 -04003652 /* `iterable` is not a generator. */
3653 iter = PyObject_GetIter(iterable);
3654 Py_DECREF(iterable);
3655 SET_TOP(iter);
3656 if (iter == NULL)
3657 goto error;
3658 }
Serhiy Storchakada9c5132016-06-27 18:58:57 +03003659 PREDICT(LOAD_CONST);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003660 DISPATCH();
3661 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003662
Benjamin Petersonddd19492018-09-16 22:38:02 -07003663 case TARGET(FOR_ITER): {
3664 PREDICTED(FOR_ITER);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003665 /* before: [iter]; after: [iter, iter()] *or* [] */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003666 PyObject *iter = TOP();
Victor Stinnera102ed72020-02-07 02:24:48 +01003667 PyObject *next = (*Py_TYPE(iter)->tp_iternext)(iter);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003668 if (next != NULL) {
3669 PUSH(next);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003670 PREDICT(STORE_FAST);
3671 PREDICT(UNPACK_SEQUENCE);
3672 DISPATCH();
3673 }
Victor Stinner438a12d2019-05-24 17:01:38 +02003674 if (_PyErr_Occurred(tstate)) {
3675 if (!_PyErr_ExceptionMatches(tstate, PyExc_StopIteration)) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003676 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02003677 }
3678 else if (tstate->c_tracefunc != NULL) {
Mark Shannon86433452021-01-07 16:49:02 +00003679 call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj, tstate, f, &bounds);
Victor Stinner438a12d2019-05-24 17:01:38 +02003680 }
3681 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003682 }
3683 /* iterator ended normally */
costypetrisor8ed317f2018-07-31 20:55:14 +00003684 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003685 Py_DECREF(iter);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003686 JUMPBY(oparg);
3687 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003688 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003689
Benjamin Petersonddd19492018-09-16 22:38:02 -07003690 case TARGET(SETUP_FINALLY): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003691 PyFrame_BlockSetup(f, SETUP_FINALLY, INSTR_OFFSET() + oparg,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003692 STACK_LEVEL());
3693 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003694 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003695
Benjamin Petersonddd19492018-09-16 22:38:02 -07003696 case TARGET(BEFORE_ASYNC_WITH): {
Yury Selivanov75445082015-05-11 22:57:16 -04003697 _Py_IDENTIFIER(__aenter__);
Géry Ogam1d1b97a2020-01-14 12:58:29 +01003698 _Py_IDENTIFIER(__aexit__);
Yury Selivanov75445082015-05-11 22:57:16 -04003699 PyObject *mgr = TOP();
Géry Ogam1d1b97a2020-01-14 12:58:29 +01003700 PyObject *enter = special_lookup(tstate, mgr, &PyId___aenter__);
Yury Selivanov75445082015-05-11 22:57:16 -04003701 PyObject *res;
Géry Ogam1d1b97a2020-01-14 12:58:29 +01003702 if (enter == NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04003703 goto error;
Géry Ogam1d1b97a2020-01-14 12:58:29 +01003704 }
3705 PyObject *exit = special_lookup(tstate, mgr, &PyId___aexit__);
3706 if (exit == NULL) {
3707 Py_DECREF(enter);
3708 goto error;
3709 }
Yury Selivanov75445082015-05-11 22:57:16 -04003710 SET_TOP(exit);
Yury Selivanov75445082015-05-11 22:57:16 -04003711 Py_DECREF(mgr);
Victor Stinnerf17c3de2016-12-06 18:46:19 +01003712 res = _PyObject_CallNoArg(enter);
Yury Selivanov75445082015-05-11 22:57:16 -04003713 Py_DECREF(enter);
3714 if (res == NULL)
3715 goto error;
3716 PUSH(res);
Serhiy Storchakada9c5132016-06-27 18:58:57 +03003717 PREDICT(GET_AWAITABLE);
Yury Selivanov75445082015-05-11 22:57:16 -04003718 DISPATCH();
3719 }
3720
Benjamin Petersonddd19492018-09-16 22:38:02 -07003721 case TARGET(SETUP_ASYNC_WITH): {
Yury Selivanov75445082015-05-11 22:57:16 -04003722 PyObject *res = POP();
3723 /* Setup the finally block before pushing the result
3724 of __aenter__ on the stack. */
3725 PyFrame_BlockSetup(f, SETUP_FINALLY, INSTR_OFFSET() + oparg,
3726 STACK_LEVEL());
3727 PUSH(res);
3728 DISPATCH();
3729 }
3730
Benjamin Petersonddd19492018-09-16 22:38:02 -07003731 case TARGET(SETUP_WITH): {
Benjamin Petersonce798522012-01-22 11:24:29 -05003732 _Py_IDENTIFIER(__enter__);
Géry Ogam1d1b97a2020-01-14 12:58:29 +01003733 _Py_IDENTIFIER(__exit__);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003734 PyObject *mgr = TOP();
Victor Stinner438a12d2019-05-24 17:01:38 +02003735 PyObject *enter = special_lookup(tstate, mgr, &PyId___enter__);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003736 PyObject *res;
Victor Stinner438a12d2019-05-24 17:01:38 +02003737 if (enter == NULL) {
Raymond Hettingera3fec152016-11-21 17:24:23 -08003738 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02003739 }
3740 PyObject *exit = special_lookup(tstate, mgr, &PyId___exit__);
Raymond Hettinger64e2f9a2016-11-22 11:50:40 -08003741 if (exit == NULL) {
3742 Py_DECREF(enter);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003743 goto error;
Raymond Hettinger64e2f9a2016-11-22 11:50:40 -08003744 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003745 SET_TOP(exit);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003746 Py_DECREF(mgr);
Victor Stinnerf17c3de2016-12-06 18:46:19 +01003747 res = _PyObject_CallNoArg(enter);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003748 Py_DECREF(enter);
3749 if (res == NULL)
3750 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003751 /* Setup the finally block before pushing the result
3752 of __enter__ on the stack. */
3753 PyFrame_BlockSetup(f, SETUP_FINALLY, INSTR_OFFSET() + oparg,
3754 STACK_LEVEL());
Benjamin Peterson876b2f22009-06-28 03:18:59 +00003755
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003756 PUSH(res);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003757 DISPATCH();
3758 }
Benjamin Peterson876b2f22009-06-28 03:18:59 +00003759
Mark Shannonfee55262019-11-21 09:11:43 +00003760 case TARGET(WITH_EXCEPT_START): {
3761 /* At the top of the stack are 7 values:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003762 - (TOP, SECOND, THIRD) = exc_info()
Mark Shannonfee55262019-11-21 09:11:43 +00003763 - (FOURTH, FIFTH, SIXTH) = previous exception for EXCEPT_HANDLER
3764 - SEVENTH: the context.__exit__ bound method
3765 We call SEVENTH(TOP, SECOND, THIRD).
3766 Then we push again the TOP exception and the __exit__
3767 return value.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003768 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003769 PyObject *exit_func;
Victor Stinner842cfff2016-12-01 14:45:31 +01003770 PyObject *exc, *val, *tb, *res;
3771
Victor Stinner842cfff2016-12-01 14:45:31 +01003772 exc = TOP();
Mark Shannonfee55262019-11-21 09:11:43 +00003773 val = SECOND();
3774 tb = THIRD();
3775 assert(exc != Py_None);
3776 assert(!PyLong_Check(exc));
3777 exit_func = PEEK(7);
Jeroen Demeyer469d1a72019-07-03 12:52:21 +02003778 PyObject *stack[4] = {NULL, exc, val, tb};
Petr Viktorinffd97532020-02-11 17:46:57 +01003779 res = PyObject_Vectorcall(exit_func, stack + 1,
Jeroen Demeyer469d1a72019-07-03 12:52:21 +02003780 3 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003781 if (res == NULL)
3782 goto error;
Amaury Forgeot d'Arc10b24e82008-12-10 23:49:33 +00003783
Yury Selivanov75445082015-05-11 22:57:16 -04003784 PUSH(res);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003785 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003786 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00003787
Benjamin Petersonddd19492018-09-16 22:38:02 -07003788 case TARGET(LOAD_METHOD): {
Andreyb021ba52019-04-29 14:33:26 +10003789 /* Designed to work in tandem with CALL_METHOD. */
Yury Selivanovf2392132016-12-13 19:03:51 -05003790 PyObject *name = GETITEM(names, oparg);
3791 PyObject *obj = TOP();
3792 PyObject *meth = NULL;
3793
3794 int meth_found = _PyObject_GetMethod(obj, name, &meth);
3795
Yury Selivanovf2392132016-12-13 19:03:51 -05003796 if (meth == NULL) {
3797 /* Most likely attribute wasn't found. */
Yury Selivanovf2392132016-12-13 19:03:51 -05003798 goto error;
3799 }
3800
3801 if (meth_found) {
INADA Naoki015bce62017-01-16 17:23:30 +09003802 /* We can bypass temporary bound method object.
3803 meth is unbound method and obj is self.
Victor Stinnera8cb5152017-01-18 14:12:51 +01003804
INADA Naoki015bce62017-01-16 17:23:30 +09003805 meth | self | arg1 | ... | argN
3806 */
3807 SET_TOP(meth);
3808 PUSH(obj); // self
Yury Selivanovf2392132016-12-13 19:03:51 -05003809 }
3810 else {
INADA Naoki015bce62017-01-16 17:23:30 +09003811 /* meth is not an unbound method (but a regular attr, or
3812 something was returned by a descriptor protocol). Set
3813 the second element of the stack to NULL, to signal
Yury Selivanovf2392132016-12-13 19:03:51 -05003814 CALL_METHOD that it's not a method call.
INADA Naoki015bce62017-01-16 17:23:30 +09003815
3816 NULL | meth | arg1 | ... | argN
Yury Selivanovf2392132016-12-13 19:03:51 -05003817 */
INADA Naoki015bce62017-01-16 17:23:30 +09003818 SET_TOP(NULL);
Yury Selivanovf2392132016-12-13 19:03:51 -05003819 Py_DECREF(obj);
INADA Naoki015bce62017-01-16 17:23:30 +09003820 PUSH(meth);
Yury Selivanovf2392132016-12-13 19:03:51 -05003821 }
3822 DISPATCH();
3823 }
3824
Benjamin Petersonddd19492018-09-16 22:38:02 -07003825 case TARGET(CALL_METHOD): {
Yury Selivanovf2392132016-12-13 19:03:51 -05003826 /* Designed to work in tamdem with LOAD_METHOD. */
INADA Naoki015bce62017-01-16 17:23:30 +09003827 PyObject **sp, *res, *meth;
Yury Selivanovf2392132016-12-13 19:03:51 -05003828
3829 sp = stack_pointer;
3830
INADA Naoki015bce62017-01-16 17:23:30 +09003831 meth = PEEK(oparg + 2);
3832 if (meth == NULL) {
3833 /* `meth` is NULL when LOAD_METHOD thinks that it's not
3834 a method call.
Yury Selivanovf2392132016-12-13 19:03:51 -05003835
3836 Stack layout:
3837
INADA Naoki015bce62017-01-16 17:23:30 +09003838 ... | NULL | callable | arg1 | ... | argN
3839 ^- TOP()
3840 ^- (-oparg)
3841 ^- (-oparg-1)
3842 ^- (-oparg-2)
Yury Selivanovf2392132016-12-13 19:03:51 -05003843
Ville Skyttä49b27342017-08-03 09:00:59 +03003844 `callable` will be POPed by call_function.
INADA Naoki015bce62017-01-16 17:23:30 +09003845 NULL will will be POPed manually later.
Yury Selivanovf2392132016-12-13 19:03:51 -05003846 */
Mark Shannon86433452021-01-07 16:49:02 +00003847 res = call_function(tstate, &bounds, &sp, oparg, NULL);
Yury Selivanovf2392132016-12-13 19:03:51 -05003848 stack_pointer = sp;
INADA Naoki015bce62017-01-16 17:23:30 +09003849 (void)POP(); /* POP the NULL. */
Yury Selivanovf2392132016-12-13 19:03:51 -05003850 }
3851 else {
3852 /* This is a method call. Stack layout:
3853
INADA Naoki015bce62017-01-16 17:23:30 +09003854 ... | method | self | arg1 | ... | argN
Yury Selivanovf2392132016-12-13 19:03:51 -05003855 ^- TOP()
3856 ^- (-oparg)
INADA Naoki015bce62017-01-16 17:23:30 +09003857 ^- (-oparg-1)
3858 ^- (-oparg-2)
Yury Selivanovf2392132016-12-13 19:03:51 -05003859
INADA Naoki015bce62017-01-16 17:23:30 +09003860 `self` and `method` will be POPed by call_function.
Yury Selivanovf2392132016-12-13 19:03:51 -05003861 We'll be passing `oparg + 1` to call_function, to
INADA Naoki015bce62017-01-16 17:23:30 +09003862 make it accept the `self` as a first argument.
Yury Selivanovf2392132016-12-13 19:03:51 -05003863 */
Mark Shannon86433452021-01-07 16:49:02 +00003864 res = call_function(tstate, &bounds, &sp, oparg + 1, NULL);
Yury Selivanovf2392132016-12-13 19:03:51 -05003865 stack_pointer = sp;
3866 }
3867
3868 PUSH(res);
3869 if (res == NULL)
3870 goto error;
3871 DISPATCH();
3872 }
3873
Benjamin Petersonddd19492018-09-16 22:38:02 -07003874 case TARGET(CALL_FUNCTION): {
3875 PREDICTED(CALL_FUNCTION);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003876 PyObject **sp, *res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003877 sp = stack_pointer;
Mark Shannon86433452021-01-07 16:49:02 +00003878 res = call_function(tstate, &bounds, &sp, oparg, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003879 stack_pointer = sp;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003880 PUSH(res);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003881 if (res == NULL) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003882 goto error;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003883 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003884 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003885 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003886
Benjamin Petersonddd19492018-09-16 22:38:02 -07003887 case TARGET(CALL_FUNCTION_KW): {
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003888 PyObject **sp, *res, *names;
3889
3890 names = POP();
Jeroen Demeyer05677862019-08-16 12:41:27 +02003891 assert(PyTuple_Check(names));
3892 assert(PyTuple_GET_SIZE(names) <= oparg);
3893 /* We assume without checking that names contains only strings */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003894 sp = stack_pointer;
Mark Shannon86433452021-01-07 16:49:02 +00003895 res = call_function(tstate, &bounds, &sp, oparg, names);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003896 stack_pointer = sp;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003897 PUSH(res);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003898 Py_DECREF(names);
3899
3900 if (res == NULL) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003901 goto error;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003902 }
3903 DISPATCH();
3904 }
3905
Benjamin Petersonddd19492018-09-16 22:38:02 -07003906 case TARGET(CALL_FUNCTION_EX): {
Brandt Bucherf185a732019-09-28 17:12:49 -07003907 PREDICTED(CALL_FUNCTION_EX);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003908 PyObject *func, *callargs, *kwargs = NULL, *result;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003909 if (oparg & 0x01) {
3910 kwargs = POP();
Serhiy Storchakab7281052016-09-12 00:52:40 +03003911 if (!PyDict_CheckExact(kwargs)) {
3912 PyObject *d = PyDict_New();
3913 if (d == NULL)
3914 goto error;
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02003915 if (_PyDict_MergeEx(d, kwargs, 2) < 0) {
Serhiy Storchakab7281052016-09-12 00:52:40 +03003916 Py_DECREF(d);
Victor Stinner438a12d2019-05-24 17:01:38 +02003917 format_kwargs_error(tstate, SECOND(), kwargs);
Victor Stinnereece2222016-09-12 11:16:37 +02003918 Py_DECREF(kwargs);
Serhiy Storchakab7281052016-09-12 00:52:40 +03003919 goto error;
3920 }
3921 Py_DECREF(kwargs);
3922 kwargs = d;
3923 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003924 assert(PyDict_CheckExact(kwargs));
3925 }
3926 callargs = POP();
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003927 func = TOP();
Serhiy Storchaka63dc5482016-09-22 19:41:20 +03003928 if (!PyTuple_CheckExact(callargs)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003929 if (check_args_iterable(tstate, func, callargs) < 0) {
Victor Stinnereece2222016-09-12 11:16:37 +02003930 Py_DECREF(callargs);
Serhiy Storchakab7281052016-09-12 00:52:40 +03003931 goto error;
3932 }
3933 Py_SETREF(callargs, PySequence_Tuple(callargs));
3934 if (callargs == NULL) {
3935 goto error;
3936 }
3937 }
Serhiy Storchaka63dc5482016-09-22 19:41:20 +03003938 assert(PyTuple_CheckExact(callargs));
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003939
Mark Shannon86433452021-01-07 16:49:02 +00003940 result = do_call_core(tstate, &bounds, func, callargs, kwargs);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003941 Py_DECREF(func);
3942 Py_DECREF(callargs);
3943 Py_XDECREF(kwargs);
3944
3945 SET_TOP(result);
3946 if (result == NULL) {
3947 goto error;
3948 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003949 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003950 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003951
Benjamin Petersonddd19492018-09-16 22:38:02 -07003952 case TARGET(MAKE_FUNCTION): {
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003953 PyObject *qualname = POP();
3954 PyObject *codeobj = POP();
3955 PyFunctionObject *func = (PyFunctionObject *)
3956 PyFunction_NewWithQualName(codeobj, f->f_globals, qualname);
Guido van Rossum4f72a782006-10-27 23:31:49 +00003957
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003958 Py_DECREF(codeobj);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003959 Py_DECREF(qualname);
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003960 if (func == NULL) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003961 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003962 }
Neal Norwitzc1505362006-12-28 06:47:50 +00003963
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003964 if (oparg & 0x08) {
3965 assert(PyTuple_CheckExact(TOP()));
Mark Shannond6c33fb2021-01-29 13:24:55 +00003966 func->func_closure = POP();
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003967 }
3968 if (oparg & 0x04) {
Yurii Karabas73019792020-11-25 12:43:18 +02003969 assert(PyTuple_CheckExact(TOP()));
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003970 func->func_annotations = POP();
3971 }
3972 if (oparg & 0x02) {
3973 assert(PyDict_CheckExact(TOP()));
3974 func->func_kwdefaults = POP();
3975 }
3976 if (oparg & 0x01) {
3977 assert(PyTuple_CheckExact(TOP()));
3978 func->func_defaults = POP();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003979 }
Neal Norwitzc1505362006-12-28 06:47:50 +00003980
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003981 PUSH((PyObject *)func);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003982 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003983 }
Guido van Rossum8861b741996-07-30 16:49:37 +00003984
Benjamin Petersonddd19492018-09-16 22:38:02 -07003985 case TARGET(BUILD_SLICE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003986 PyObject *start, *stop, *step, *slice;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003987 if (oparg == 3)
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003988 step = POP();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003989 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003990 step = NULL;
3991 stop = POP();
3992 start = TOP();
3993 slice = PySlice_New(start, stop, step);
3994 Py_DECREF(start);
3995 Py_DECREF(stop);
3996 Py_XDECREF(step);
3997 SET_TOP(slice);
3998 if (slice == NULL)
3999 goto error;
4000 DISPATCH();
4001 }
Guido van Rossum8861b741996-07-30 16:49:37 +00004002
Benjamin Petersonddd19492018-09-16 22:38:02 -07004003 case TARGET(FORMAT_VALUE): {
Eric V. Smitha78c7952015-11-03 12:45:05 -05004004 /* Handles f-string value formatting. */
4005 PyObject *result;
4006 PyObject *fmt_spec;
4007 PyObject *value;
4008 PyObject *(*conv_fn)(PyObject *);
4009 int which_conversion = oparg & FVC_MASK;
4010 int have_fmt_spec = (oparg & FVS_MASK) == FVS_HAVE_SPEC;
4011
4012 fmt_spec = have_fmt_spec ? POP() : NULL;
Eric V. Smith135d5f42016-02-05 18:23:08 -05004013 value = POP();
Eric V. Smitha78c7952015-11-03 12:45:05 -05004014
4015 /* See if any conversion is specified. */
4016 switch (which_conversion) {
Eric V. Smith9a4135e2019-05-08 16:28:48 -04004017 case FVC_NONE: conv_fn = NULL; break;
Eric V. Smitha78c7952015-11-03 12:45:05 -05004018 case FVC_STR: conv_fn = PyObject_Str; break;
4019 case FVC_REPR: conv_fn = PyObject_Repr; break;
4020 case FVC_ASCII: conv_fn = PyObject_ASCII; break;
Eric V. Smith9a4135e2019-05-08 16:28:48 -04004021 default:
Victor Stinner438a12d2019-05-24 17:01:38 +02004022 _PyErr_Format(tstate, PyExc_SystemError,
4023 "unexpected conversion flag %d",
4024 which_conversion);
Eric V. Smith9a4135e2019-05-08 16:28:48 -04004025 goto error;
Eric V. Smitha78c7952015-11-03 12:45:05 -05004026 }
4027
4028 /* If there's a conversion function, call it and replace
4029 value with that result. Otherwise, just use value,
4030 without conversion. */
Eric V. Smitheb588a12016-02-05 18:26:20 -05004031 if (conv_fn != NULL) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05004032 result = conv_fn(value);
4033 Py_DECREF(value);
Eric V. Smitheb588a12016-02-05 18:26:20 -05004034 if (result == NULL) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05004035 Py_XDECREF(fmt_spec);
4036 goto error;
4037 }
4038 value = result;
4039 }
4040
4041 /* If value is a unicode object, and there's no fmt_spec,
4042 then we know the result of format(value) is value
4043 itself. In that case, skip calling format(). I plan to
4044 move this optimization in to PyObject_Format()
4045 itself. */
4046 if (PyUnicode_CheckExact(value) && fmt_spec == NULL) {
4047 /* Do nothing, just transfer ownership to result. */
4048 result = value;
4049 } else {
4050 /* Actually call format(). */
4051 result = PyObject_Format(value, fmt_spec);
4052 Py_DECREF(value);
4053 Py_XDECREF(fmt_spec);
Eric V. Smitheb588a12016-02-05 18:26:20 -05004054 if (result == NULL) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05004055 goto error;
Eric V. Smitheb588a12016-02-05 18:26:20 -05004056 }
Eric V. Smitha78c7952015-11-03 12:45:05 -05004057 }
4058
Eric V. Smith135d5f42016-02-05 18:23:08 -05004059 PUSH(result);
Eric V. Smitha78c7952015-11-03 12:45:05 -05004060 DISPATCH();
4061 }
4062
Benjamin Petersonddd19492018-09-16 22:38:02 -07004063 case TARGET(EXTENDED_ARG): {
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03004064 int oldoparg = oparg;
4065 NEXTOPARG();
4066 oparg |= oldoparg << 8;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004067 goto dispatch_opcode;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004068 }
Guido van Rossum8861b741996-07-30 16:49:37 +00004069
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004070
Antoine Pitrou042b1282010-08-13 21:15:58 +00004071#if USE_COMPUTED_GOTOS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004072 _unknown_opcode:
Antoine Pitroub52ec782009-01-25 16:34:23 +00004073#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004074 default:
4075 fprintf(stderr,
4076 "XXX lineno: %d, opcode: %d\n",
4077 PyFrame_GetLineNumber(f),
4078 opcode);
Victor Stinner438a12d2019-05-24 17:01:38 +02004079 _PyErr_SetString(tstate, PyExc_SystemError, "unknown opcode");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004080 goto error;
Guido van Rossum04691fc1992-08-12 15:35:34 +00004081
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004082 } /* switch */
Guido van Rossum374a9221991-04-04 10:40:29 +00004083
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004084 /* This should never be reached. Every opcode should end with DISPATCH()
4085 or goto error. */
Barry Warsawb2e57942017-09-14 18:13:16 -07004086 Py_UNREACHABLE();
Guido van Rossumac7be682001-01-17 15:42:30 +00004087
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004088error:
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004089 /* Double-check exception status. */
Victor Stinner365b6932013-07-12 00:11:58 +02004090#ifdef NDEBUG
Victor Stinner438a12d2019-05-24 17:01:38 +02004091 if (!_PyErr_Occurred(tstate)) {
4092 _PyErr_SetString(tstate, PyExc_SystemError,
4093 "error return without exception set");
4094 }
Victor Stinner365b6932013-07-12 00:11:58 +02004095#else
Victor Stinner438a12d2019-05-24 17:01:38 +02004096 assert(_PyErr_Occurred(tstate));
Victor Stinner365b6932013-07-12 00:11:58 +02004097#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00004098
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004099 /* Log traceback info. */
4100 PyTraceBack_Here(f);
Guido van Rossumac7be682001-01-17 15:42:30 +00004101
Mark Shannoncb9879b2020-07-17 11:44:23 +01004102 if (tstate->c_tracefunc != NULL) {
4103 /* Make sure state is set to FRAME_EXECUTING for tracing */
4104 assert(f->f_state == FRAME_EXECUTING);
4105 f->f_state = FRAME_UNWINDING;
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004106 call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj,
Mark Shannon86433452021-01-07 16:49:02 +00004107 tstate, f, &bounds);
Mark Shannoncb9879b2020-07-17 11:44:23 +01004108 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004109exception_unwind:
Mark Shannoncb9879b2020-07-17 11:44:23 +01004110 f->f_state = FRAME_UNWINDING;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004111 /* Unwind stacks if an exception occurred */
4112 while (f->f_iblock > 0) {
4113 /* Pop the current block. */
4114 PyTryBlock *b = &f->f_blockstack[--f->f_iblock];
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004115
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004116 if (b->b_type == EXCEPT_HANDLER) {
4117 UNWIND_EXCEPT_HANDLER(b);
4118 continue;
4119 }
4120 UNWIND_BLOCK(b);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004121 if (b->b_type == SETUP_FINALLY) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004122 PyObject *exc, *val, *tb;
4123 int handler = b->b_handler;
Mark Shannonae3087c2017-10-22 22:41:51 +01004124 _PyErr_StackItem *exc_info = tstate->exc_info;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004125 /* Beware, this invalidates all b->b_* fields */
Mark Shannonbf353f32020-12-17 13:55:28 +00004126 PyFrame_BlockSetup(f, EXCEPT_HANDLER, f->f_lasti, STACK_LEVEL());
Mark Shannonae3087c2017-10-22 22:41:51 +01004127 PUSH(exc_info->exc_traceback);
4128 PUSH(exc_info->exc_value);
4129 if (exc_info->exc_type != NULL) {
4130 PUSH(exc_info->exc_type);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004131 }
4132 else {
4133 Py_INCREF(Py_None);
4134 PUSH(Py_None);
4135 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004136 _PyErr_Fetch(tstate, &exc, &val, &tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004137 /* Make the raw exception data
4138 available to the handler,
4139 so a program can emulate the
4140 Python main loop. */
Victor Stinner438a12d2019-05-24 17:01:38 +02004141 _PyErr_NormalizeException(tstate, &exc, &val, &tb);
Victor Stinner7eab0d02013-07-15 21:16:27 +02004142 if (tb != NULL)
4143 PyException_SetTraceback(val, tb);
4144 else
4145 PyException_SetTraceback(val, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004146 Py_INCREF(exc);
Mark Shannonae3087c2017-10-22 22:41:51 +01004147 exc_info->exc_type = exc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004148 Py_INCREF(val);
Mark Shannonae3087c2017-10-22 22:41:51 +01004149 exc_info->exc_value = val;
4150 exc_info->exc_traceback = tb;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004151 if (tb == NULL)
4152 tb = Py_None;
4153 Py_INCREF(tb);
4154 PUSH(tb);
4155 PUSH(val);
4156 PUSH(exc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004157 JUMPTO(handler);
Victor Stinnerdab84232020-03-17 18:56:44 +01004158 if (_Py_TracingPossible(ceval2)) {
Mark Shannon877df852020-11-12 09:43:29 +00004159 instr_prev = INT_MAX;
Mark Shannonfee55262019-11-21 09:11:43 +00004160 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004161 /* Resume normal execution */
Mark Shannoncb9879b2020-07-17 11:44:23 +01004162 f->f_state = FRAME_EXECUTING;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004163 goto main_loop;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004164 }
4165 } /* unwind stack */
Guido van Rossum374a9221991-04-04 10:40:29 +00004166
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004167 /* End the loop as we still have an error */
4168 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004169 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00004170
Pablo Galindof00828a2019-05-09 16:52:02 +01004171 assert(retval == NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02004172 assert(_PyErr_Occurred(tstate));
Pablo Galindof00828a2019-05-09 16:52:02 +01004173
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004174 /* Pop remaining stack entries. */
4175 while (!EMPTY()) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004176 PyObject *o = POP();
4177 Py_XDECREF(o);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004178 }
Mark Shannoncb9879b2020-07-17 11:44:23 +01004179 f->f_stackdepth = 0;
4180 f->f_state = FRAME_RAISED;
Mark Shannone7c9f4a2020-01-13 12:51:26 +00004181exiting:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004182 if (tstate->use_tracing) {
Benjamin Peterson51f46162013-01-23 08:38:47 -05004183 if (tstate->c_tracefunc) {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004184 if (call_trace_protected(tstate->c_tracefunc, tstate->c_traceobj,
Mark Shannon86433452021-01-07 16:49:02 +00004185 tstate, f, &bounds, PyTrace_RETURN, retval)) {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004186 Py_CLEAR(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004187 }
4188 }
4189 if (tstate->c_profilefunc) {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004190 if (call_trace_protected(tstate->c_profilefunc, tstate->c_profileobj,
Mark Shannon86433452021-01-07 16:49:02 +00004191 tstate, f, &bounds, PyTrace_RETURN, retval)) {
Serhiy Storchaka505ff752014-02-09 13:33:53 +02004192 Py_CLEAR(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004193 }
4194 }
4195 }
Guido van Rossuma4240131997-01-21 21:18:36 +00004196
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004197 /* pop frame */
Thomas Woutersce272b62007-09-19 21:19:28 +00004198exit_eval_frame:
Łukasz Langaa785c872016-09-09 17:37:37 -07004199 if (PyDTrace_FUNCTION_RETURN_ENABLED())
4200 dtrace_function_return(f);
Victor Stinnerbe434dc2019-11-05 00:51:22 +01004201 _Py_LeaveRecursiveCall(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004202 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00004203
Victor Stinner0b72b232020-03-12 23:18:39 +01004204 return _Py_CheckFunctionResult(tstate, NULL, retval, __func__);
Guido van Rossum374a9221991-04-04 10:40:29 +00004205}
4206
Benjamin Petersonb204a422011-06-05 22:04:07 -05004207static void
Victor Stinner438a12d2019-05-24 17:01:38 +02004208format_missing(PyThreadState *tstate, const char *kind,
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004209 PyCodeObject *co, PyObject *names, PyObject *qualname)
Benjamin Petersone109c702011-06-24 09:37:26 -05004210{
4211 int err;
4212 Py_ssize_t len = PyList_GET_SIZE(names);
4213 PyObject *name_str, *comma, *tail, *tmp;
4214
4215 assert(PyList_CheckExact(names));
4216 assert(len >= 1);
4217 /* Deal with the joys of natural language. */
4218 switch (len) {
4219 case 1:
4220 name_str = PyList_GET_ITEM(names, 0);
4221 Py_INCREF(name_str);
4222 break;
4223 case 2:
4224 name_str = PyUnicode_FromFormat("%U and %U",
4225 PyList_GET_ITEM(names, len - 2),
4226 PyList_GET_ITEM(names, len - 1));
4227 break;
4228 default:
4229 tail = PyUnicode_FromFormat(", %U, and %U",
4230 PyList_GET_ITEM(names, len - 2),
4231 PyList_GET_ITEM(names, len - 1));
Benjamin Petersond1ab6082012-06-01 11:18:22 -07004232 if (tail == NULL)
4233 return;
Benjamin Petersone109c702011-06-24 09:37:26 -05004234 /* Chop off the last two objects in the list. This shouldn't actually
4235 fail, but we can't be too careful. */
4236 err = PyList_SetSlice(names, len - 2, len, NULL);
4237 if (err == -1) {
4238 Py_DECREF(tail);
4239 return;
4240 }
4241 /* Stitch everything up into a nice comma-separated list. */
4242 comma = PyUnicode_FromString(", ");
4243 if (comma == NULL) {
4244 Py_DECREF(tail);
4245 return;
4246 }
4247 tmp = PyUnicode_Join(comma, names);
4248 Py_DECREF(comma);
4249 if (tmp == NULL) {
4250 Py_DECREF(tail);
4251 return;
4252 }
4253 name_str = PyUnicode_Concat(tmp, tail);
4254 Py_DECREF(tmp);
4255 Py_DECREF(tail);
4256 break;
4257 }
4258 if (name_str == NULL)
4259 return;
Victor Stinner438a12d2019-05-24 17:01:38 +02004260 _PyErr_Format(tstate, PyExc_TypeError,
4261 "%U() missing %i required %s argument%s: %U",
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004262 qualname,
Victor Stinner438a12d2019-05-24 17:01:38 +02004263 len,
4264 kind,
4265 len == 1 ? "" : "s",
4266 name_str);
Benjamin Petersone109c702011-06-24 09:37:26 -05004267 Py_DECREF(name_str);
4268}
4269
4270static void
Victor Stinner438a12d2019-05-24 17:01:38 +02004271missing_arguments(PyThreadState *tstate, PyCodeObject *co,
4272 Py_ssize_t missing, Py_ssize_t defcount,
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004273 PyObject **fastlocals, PyObject *qualname)
Benjamin Petersone109c702011-06-24 09:37:26 -05004274{
Victor Stinner74319ae2016-08-25 00:04:09 +02004275 Py_ssize_t i, j = 0;
4276 Py_ssize_t start, end;
4277 int positional = (defcount != -1);
Benjamin Petersone109c702011-06-24 09:37:26 -05004278 const char *kind = positional ? "positional" : "keyword-only";
4279 PyObject *missing_names;
4280
4281 /* Compute the names of the arguments that are missing. */
4282 missing_names = PyList_New(missing);
4283 if (missing_names == NULL)
4284 return;
4285 if (positional) {
4286 start = 0;
Pablo Galindocd74e662019-06-01 18:08:04 +01004287 end = co->co_argcount - defcount;
Benjamin Petersone109c702011-06-24 09:37:26 -05004288 }
4289 else {
Pablo Galindocd74e662019-06-01 18:08:04 +01004290 start = co->co_argcount;
Benjamin Petersone109c702011-06-24 09:37:26 -05004291 end = start + co->co_kwonlyargcount;
4292 }
4293 for (i = start; i < end; i++) {
4294 if (GETLOCAL(i) == NULL) {
4295 PyObject *raw = PyTuple_GET_ITEM(co->co_varnames, i);
4296 PyObject *name = PyObject_Repr(raw);
4297 if (name == NULL) {
4298 Py_DECREF(missing_names);
4299 return;
4300 }
4301 PyList_SET_ITEM(missing_names, j++, name);
4302 }
4303 }
4304 assert(j == missing);
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004305 format_missing(tstate, kind, co, missing_names, qualname);
Benjamin Petersone109c702011-06-24 09:37:26 -05004306 Py_DECREF(missing_names);
4307}
4308
4309static void
Victor Stinner438a12d2019-05-24 17:01:38 +02004310too_many_positional(PyThreadState *tstate, PyCodeObject *co,
Mark Shannond6c33fb2021-01-29 13:24:55 +00004311 Py_ssize_t given, PyObject *defaults,
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004312 PyObject **fastlocals, PyObject *qualname)
Benjamin Petersonb204a422011-06-05 22:04:07 -05004313{
4314 int plural;
Victor Stinner74319ae2016-08-25 00:04:09 +02004315 Py_ssize_t kwonly_given = 0;
4316 Py_ssize_t i;
Benjamin Petersonb204a422011-06-05 22:04:07 -05004317 PyObject *sig, *kwonly_sig;
Victor Stinner74319ae2016-08-25 00:04:09 +02004318 Py_ssize_t co_argcount = co->co_argcount;
Benjamin Petersonb204a422011-06-05 22:04:07 -05004319
Benjamin Petersone109c702011-06-24 09:37:26 -05004320 assert((co->co_flags & CO_VARARGS) == 0);
4321 /* Count missing keyword-only args. */
Pablo Galindocd74e662019-06-01 18:08:04 +01004322 for (i = co_argcount; i < co_argcount + co->co_kwonlyargcount; i++) {
Victor Stinner74319ae2016-08-25 00:04:09 +02004323 if (GETLOCAL(i) != NULL) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004324 kwonly_given++;
Victor Stinner74319ae2016-08-25 00:04:09 +02004325 }
4326 }
Mark Shannond6c33fb2021-01-29 13:24:55 +00004327 Py_ssize_t defcount = defaults == NULL ? 0 : PyTuple_GET_SIZE(defaults);
Benjamin Petersone109c702011-06-24 09:37:26 -05004328 if (defcount) {
Pablo Galindocd74e662019-06-01 18:08:04 +01004329 Py_ssize_t atleast = co_argcount - defcount;
Benjamin Petersonb204a422011-06-05 22:04:07 -05004330 plural = 1;
Pablo Galindocd74e662019-06-01 18:08:04 +01004331 sig = PyUnicode_FromFormat("from %zd to %zd", atleast, co_argcount);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004332 }
4333 else {
Pablo Galindocd74e662019-06-01 18:08:04 +01004334 plural = (co_argcount != 1);
4335 sig = PyUnicode_FromFormat("%zd", co_argcount);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004336 }
4337 if (sig == NULL)
4338 return;
4339 if (kwonly_given) {
Victor Stinner74319ae2016-08-25 00:04:09 +02004340 const char *format = " positional argument%s (and %zd keyword-only argument%s)";
4341 kwonly_sig = PyUnicode_FromFormat(format,
4342 given != 1 ? "s" : "",
4343 kwonly_given,
4344 kwonly_given != 1 ? "s" : "");
Benjamin Petersonb204a422011-06-05 22:04:07 -05004345 if (kwonly_sig == NULL) {
4346 Py_DECREF(sig);
4347 return;
4348 }
4349 }
4350 else {
4351 /* This will not fail. */
4352 kwonly_sig = PyUnicode_FromString("");
Benjamin Petersone109c702011-06-24 09:37:26 -05004353 assert(kwonly_sig != NULL);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004354 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004355 _PyErr_Format(tstate, PyExc_TypeError,
4356 "%U() takes %U positional argument%s but %zd%U %s given",
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004357 qualname,
Victor Stinner438a12d2019-05-24 17:01:38 +02004358 sig,
4359 plural ? "s" : "",
4360 given,
4361 kwonly_sig,
4362 given == 1 && !kwonly_given ? "was" : "were");
Benjamin Petersonb204a422011-06-05 22:04:07 -05004363 Py_DECREF(sig);
4364 Py_DECREF(kwonly_sig);
4365}
4366
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004367static int
Victor Stinner438a12d2019-05-24 17:01:38 +02004368positional_only_passed_as_keyword(PyThreadState *tstate, PyCodeObject *co,
Mark Shannon0332e562021-02-01 10:42:03 +00004369 Py_ssize_t kwcount, PyObject* kwnames,
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004370 PyObject *qualname)
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004371{
4372 int posonly_conflicts = 0;
4373 PyObject* posonly_names = PyList_New(0);
4374
4375 for(int k=0; k < co->co_posonlyargcount; k++){
4376 PyObject* posonly_name = PyTuple_GET_ITEM(co->co_varnames, k);
4377
4378 for (int k2=0; k2<kwcount; k2++){
4379 /* Compare the pointers first and fallback to PyObject_RichCompareBool*/
Mark Shannon0332e562021-02-01 10:42:03 +00004380 PyObject* kwname = PyTuple_GET_ITEM(kwnames, k2);
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004381 if (kwname == posonly_name){
4382 if(PyList_Append(posonly_names, kwname) != 0) {
4383 goto fail;
4384 }
4385 posonly_conflicts++;
4386 continue;
4387 }
4388
4389 int cmp = PyObject_RichCompareBool(posonly_name, kwname, Py_EQ);
4390
4391 if ( cmp > 0) {
4392 if(PyList_Append(posonly_names, kwname) != 0) {
4393 goto fail;
4394 }
4395 posonly_conflicts++;
4396 } else if (cmp < 0) {
4397 goto fail;
4398 }
4399
4400 }
4401 }
4402 if (posonly_conflicts) {
4403 PyObject* comma = PyUnicode_FromString(", ");
4404 if (comma == NULL) {
4405 goto fail;
4406 }
4407 PyObject* error_names = PyUnicode_Join(comma, posonly_names);
4408 Py_DECREF(comma);
4409 if (error_names == NULL) {
4410 goto fail;
4411 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004412 _PyErr_Format(tstate, PyExc_TypeError,
4413 "%U() got some positional-only arguments passed"
4414 " as keyword arguments: '%U'",
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004415 qualname, error_names);
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004416 Py_DECREF(error_names);
4417 goto fail;
4418 }
4419
4420 Py_DECREF(posonly_names);
4421 return 0;
4422
4423fail:
4424 Py_XDECREF(posonly_names);
4425 return 1;
4426
4427}
4428
Skip Montanaro786ea6b2004-03-01 15:44:05 +00004429
Mark Shannon0332e562021-02-01 10:42:03 +00004430PyFrameObject *
4431_PyEval_MakeFrameVector(PyThreadState *tstate,
Mark Shannond6c33fb2021-01-29 13:24:55 +00004432 PyFrameConstructor *con, PyObject *locals,
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02004433 PyObject *const *args, Py_ssize_t argcount,
Mark Shannon0332e562021-02-01 10:42:03 +00004434 PyObject *kwnames)
Tim Peters5ca576e2001-06-18 22:08:13 +00004435{
Victor Stinnerda2914d2020-03-20 09:29:08 +01004436 assert(is_tstate_valid(tstate));
Victor Stinnerb5e170f2019-11-16 01:03:22 +01004437
Mark Shannond6c33fb2021-01-29 13:24:55 +00004438 PyCodeObject *co = (PyCodeObject*)con->fc_code;
4439 assert(con->fc_defaults == NULL || PyTuple_CheckExact(con->fc_defaults));
Pablo Galindocd74e662019-06-01 18:08:04 +01004440 const Py_ssize_t total_args = co->co_argcount + co->co_kwonlyargcount;
Tim Peters5ca576e2001-06-18 22:08:13 +00004441
Victor Stinnerc7020012016-08-16 23:40:29 +02004442 /* Create the frame */
Mark Shannon0332e562021-02-01 10:42:03 +00004443 PyFrameObject *f = _PyFrame_New_NoTrack(tstate, con, locals);
Victor Stinnerc7020012016-08-16 23:40:29 +02004444 if (f == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004445 return NULL;
Victor Stinnerc7020012016-08-16 23:40:29 +02004446 }
Victor Stinner232dda62020-06-04 15:19:02 +02004447 PyObject **fastlocals = f->f_localsplus;
4448 PyObject **freevars = f->f_localsplus + co->co_nlocals;
Tim Peters5ca576e2001-06-18 22:08:13 +00004449
Victor Stinnerc7020012016-08-16 23:40:29 +02004450 /* Create a dictionary for keyword parameters (**kwags) */
Victor Stinner232dda62020-06-04 15:19:02 +02004451 PyObject *kwdict;
4452 Py_ssize_t i;
Benjamin Petersonb204a422011-06-05 22:04:07 -05004453 if (co->co_flags & CO_VARKEYWORDS) {
4454 kwdict = PyDict_New();
4455 if (kwdict == NULL)
4456 goto fail;
4457 i = total_args;
Victor Stinnerc7020012016-08-16 23:40:29 +02004458 if (co->co_flags & CO_VARARGS) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004459 i++;
Victor Stinnerc7020012016-08-16 23:40:29 +02004460 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004461 SETLOCAL(i, kwdict);
4462 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004463 else {
4464 kwdict = NULL;
4465 }
4466
Pablo Galindocd74e662019-06-01 18:08:04 +01004467 /* Copy all positional arguments into local variables */
Victor Stinner232dda62020-06-04 15:19:02 +02004468 Py_ssize_t j, n;
Pablo Galindocd74e662019-06-01 18:08:04 +01004469 if (argcount > co->co_argcount) {
4470 n = co->co_argcount;
Victor Stinnerc7020012016-08-16 23:40:29 +02004471 }
4472 else {
4473 n = argcount;
4474 }
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004475 for (j = 0; j < n; j++) {
Victor Stinner232dda62020-06-04 15:19:02 +02004476 PyObject *x = args[j];
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004477 Py_INCREF(x);
4478 SETLOCAL(j, x);
4479 }
4480
Victor Stinnerc7020012016-08-16 23:40:29 +02004481 /* Pack other positional arguments into the *args argument */
Benjamin Petersonb204a422011-06-05 22:04:07 -05004482 if (co->co_flags & CO_VARARGS) {
Victor Stinner232dda62020-06-04 15:19:02 +02004483 PyObject *u = _PyTuple_FromArray(args + n, argcount - n);
Victor Stinnerc7020012016-08-16 23:40:29 +02004484 if (u == NULL) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004485 goto fail;
Victor Stinnerc7020012016-08-16 23:40:29 +02004486 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004487 SETLOCAL(total_args, u);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004488 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004489
Mark Shannon0332e562021-02-01 10:42:03 +00004490 /* Handle keyword arguments */
4491 if (kwnames != NULL) {
4492 Py_ssize_t kwcount = PyTuple_GET_SIZE(kwnames);
4493 for (i = 0; i < kwcount; i++) {
4494 PyObject **co_varnames;
4495 PyObject *keyword = PyTuple_GET_ITEM(kwnames, i);
4496 PyObject *value = args[i+argcount];
4497 Py_ssize_t j;
Victor Stinnerc7020012016-08-16 23:40:29 +02004498
Mark Shannon0332e562021-02-01 10:42:03 +00004499 if (keyword == NULL || !PyUnicode_Check(keyword)) {
4500 _PyErr_Format(tstate, PyExc_TypeError,
4501 "%U() keywords must be strings",
Mark Shannond6c33fb2021-01-29 13:24:55 +00004502 con->fc_qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004503 goto fail;
Victor Stinner6fea7f72016-08-22 23:17:30 +02004504 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004505
Mark Shannon0332e562021-02-01 10:42:03 +00004506 /* Speed hack: do raw pointer compares. As names are
4507 normally interned this should almost always hit. */
4508 co_varnames = ((PyTupleObject *)(co->co_varnames))->ob_item;
4509 for (j = co->co_posonlyargcount; j < total_args; j++) {
4510 PyObject *varname = co_varnames[j];
4511 if (varname == keyword) {
4512 goto kw_found;
4513 }
4514 }
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004515
Mark Shannon0332e562021-02-01 10:42:03 +00004516 /* Slow fallback, just in case */
4517 for (j = co->co_posonlyargcount; j < total_args; j++) {
4518 PyObject *varname = co_varnames[j];
4519 int cmp = PyObject_RichCompareBool( keyword, varname, Py_EQ);
4520 if (cmp > 0) {
4521 goto kw_found;
4522 }
4523 else if (cmp < 0) {
4524 goto fail;
4525 }
4526 }
4527
4528 assert(j >= total_args);
4529 if (kwdict == NULL) {
4530
4531 if (co->co_posonlyargcount
4532 && positional_only_passed_as_keyword(tstate, co,
4533 kwcount, kwnames,
Mark Shannond6c33fb2021-01-29 13:24:55 +00004534 con->fc_qualname))
Mark Shannon0332e562021-02-01 10:42:03 +00004535 {
4536 goto fail;
4537 }
4538
4539 _PyErr_Format(tstate, PyExc_TypeError,
4540 "%U() got an unexpected keyword argument '%S'",
4541 con->fc_qualname, keyword);
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004542 goto fail;
4543 }
4544
Mark Shannon0332e562021-02-01 10:42:03 +00004545 if (PyDict_SetItem(kwdict, keyword, value) == -1) {
4546 goto fail;
4547 }
4548 continue;
Victor Stinnerc7020012016-08-16 23:40:29 +02004549
Mark Shannon0332e562021-02-01 10:42:03 +00004550 kw_found:
4551 if (GETLOCAL(j) != NULL) {
4552 _PyErr_Format(tstate, PyExc_TypeError,
4553 "%U() got multiple values for argument '%S'",
Mark Shannond6c33fb2021-01-29 13:24:55 +00004554 con->fc_qualname, keyword);
Mark Shannon0332e562021-02-01 10:42:03 +00004555 goto fail;
4556 }
4557 Py_INCREF(value);
4558 SETLOCAL(j, value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004559 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004560 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004561
4562 /* Check the number of positional arguments */
Pablo Galindocd74e662019-06-01 18:08:04 +01004563 if ((argcount > co->co_argcount) && !(co->co_flags & CO_VARARGS)) {
Mark Shannond6c33fb2021-01-29 13:24:55 +00004564 too_many_positional(tstate, co, argcount, con->fc_defaults, fastlocals,
4565 con->fc_qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004566 goto fail;
4567 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004568
4569 /* Add missing positional arguments (copy default values from defs) */
Pablo Galindocd74e662019-06-01 18:08:04 +01004570 if (argcount < co->co_argcount) {
Mark Shannond6c33fb2021-01-29 13:24:55 +00004571 Py_ssize_t defcount = con->fc_defaults == NULL ? 0 : PyTuple_GET_SIZE(con->fc_defaults);
Pablo Galindocd74e662019-06-01 18:08:04 +01004572 Py_ssize_t m = co->co_argcount - defcount;
Victor Stinner17061a92016-08-16 23:39:42 +02004573 Py_ssize_t missing = 0;
4574 for (i = argcount; i < m; i++) {
4575 if (GETLOCAL(i) == NULL) {
Benjamin Petersone109c702011-06-24 09:37:26 -05004576 missing++;
Victor Stinner17061a92016-08-16 23:39:42 +02004577 }
4578 }
Benjamin Petersone109c702011-06-24 09:37:26 -05004579 if (missing) {
Victor Stinner232dda62020-06-04 15:19:02 +02004580 missing_arguments(tstate, co, missing, defcount, fastlocals,
Mark Shannond6c33fb2021-01-29 13:24:55 +00004581 con->fc_qualname);
Benjamin Petersone109c702011-06-24 09:37:26 -05004582 goto fail;
Benjamin Petersonb204a422011-06-05 22:04:07 -05004583 }
4584 if (n > m)
4585 i = n - m;
4586 else
4587 i = 0;
Mark Shannond6c33fb2021-01-29 13:24:55 +00004588 if (defcount) {
4589 PyObject **defs = &PyTuple_GET_ITEM(con->fc_defaults, 0);
4590 for (; i < defcount; i++) {
4591 if (GETLOCAL(m+i) == NULL) {
4592 PyObject *def = defs[i];
4593 Py_INCREF(def);
4594 SETLOCAL(m+i, def);
4595 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004596 }
4597 }
4598 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004599
4600 /* Add missing keyword arguments (copy default values from kwdefs) */
Benjamin Petersonb204a422011-06-05 22:04:07 -05004601 if (co->co_kwonlyargcount > 0) {
Victor Stinner17061a92016-08-16 23:39:42 +02004602 Py_ssize_t missing = 0;
Pablo Galindocd74e662019-06-01 18:08:04 +01004603 for (i = co->co_argcount; i < total_args; i++) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004604 if (GETLOCAL(i) != NULL)
4605 continue;
Victor Stinner232dda62020-06-04 15:19:02 +02004606 PyObject *varname = PyTuple_GET_ITEM(co->co_varnames, i);
Mark Shannond6c33fb2021-01-29 13:24:55 +00004607 if (con->fc_kwdefaults != NULL) {
4608 PyObject *def = PyDict_GetItemWithError(con->fc_kwdefaults, varname);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004609 if (def) {
4610 Py_INCREF(def);
4611 SETLOCAL(i, def);
4612 continue;
4613 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004614 else if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02004615 goto fail;
4616 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004617 }
Benjamin Petersone109c702011-06-24 09:37:26 -05004618 missing++;
4619 }
4620 if (missing) {
Victor Stinner232dda62020-06-04 15:19:02 +02004621 missing_arguments(tstate, co, missing, -1, fastlocals,
Mark Shannond6c33fb2021-01-29 13:24:55 +00004622 con->fc_qualname);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004623 goto fail;
4624 }
4625 }
4626
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004627 /* Allocate and initialize storage for cell vars, and copy free
Benjamin Peterson90037602011-06-25 22:54:45 -05004628 vars into frame. */
4629 for (i = 0; i < PyTuple_GET_SIZE(co->co_cellvars); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004630 PyObject *c;
Serhiy Storchaka5bb8b912016-12-16 19:19:02 +02004631 Py_ssize_t arg;
Benjamin Peterson90037602011-06-25 22:54:45 -05004632 /* Possibly account for the cell variable being an argument. */
4633 if (co->co_cell2arg != NULL &&
Guido van Rossum6832c812013-05-10 08:47:42 -07004634 (arg = co->co_cell2arg[i]) != CO_CELL_NOT_AN_ARG) {
Benjamin Peterson90037602011-06-25 22:54:45 -05004635 c = PyCell_New(GETLOCAL(arg));
Benjamin Peterson159ae412013-05-12 18:16:06 -05004636 /* Clear the local copy. */
4637 SETLOCAL(arg, NULL);
Guido van Rossum6832c812013-05-10 08:47:42 -07004638 }
4639 else {
Benjamin Peterson90037602011-06-25 22:54:45 -05004640 c = PyCell_New(NULL);
Guido van Rossum6832c812013-05-10 08:47:42 -07004641 }
Benjamin Peterson159ae412013-05-12 18:16:06 -05004642 if (c == NULL)
4643 goto fail;
Benjamin Peterson90037602011-06-25 22:54:45 -05004644 SETLOCAL(co->co_nlocals + i, c);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004645 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004646
4647 /* Copy closure variables to free variables */
Benjamin Peterson90037602011-06-25 22:54:45 -05004648 for (i = 0; i < PyTuple_GET_SIZE(co->co_freevars); ++i) {
Mark Shannond6c33fb2021-01-29 13:24:55 +00004649 PyObject *o = PyTuple_GET_ITEM(con->fc_closure, i);
Benjamin Peterson90037602011-06-25 22:54:45 -05004650 Py_INCREF(o);
4651 freevars[PyTuple_GET_SIZE(co->co_cellvars) + i] = o;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004652 }
Tim Peters5ca576e2001-06-18 22:08:13 +00004653
Mark Shannon0332e562021-02-01 10:42:03 +00004654 return f;
Tim Peters5ca576e2001-06-18 22:08:13 +00004655
Thomas Woutersce272b62007-09-19 21:19:28 +00004656fail: /* Jump here from prelude on failure */
Tim Peters5ca576e2001-06-18 22:08:13 +00004657
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004658 /* decref'ing the frame can cause __del__ methods to get invoked,
4659 which can call back into Python. While we're done with the
4660 current Python frame (f), the associated C stack is still in use,
4661 so recursion_depth must be boosted for the duration.
4662 */
INADA Naoki5a625d02016-12-24 20:19:08 +09004663 if (Py_REFCNT(f) > 1) {
4664 Py_DECREF(f);
4665 _PyObject_GC_TRACK(f);
4666 }
4667 else {
4668 ++tstate->recursion_depth;
4669 Py_DECREF(f);
4670 --tstate->recursion_depth;
4671 }
Mark Shannon0332e562021-02-01 10:42:03 +00004672 return NULL;
4673}
4674
4675static PyObject *
4676make_coro(PyFrameConstructor *con, PyFrameObject *f)
4677{
4678 assert (((PyCodeObject *)con->fc_code)->co_flags & (CO_GENERATOR | CO_COROUTINE | CO_ASYNC_GENERATOR));
4679 PyObject *gen;
4680 int is_coro = ((PyCodeObject *)con->fc_code)->co_flags & CO_COROUTINE;
4681
4682 /* Don't need to keep the reference to f_back, it will be set
4683 * when the generator is resumed. */
4684 Py_CLEAR(f->f_back);
4685
4686 /* Create a new generator that owns the ready to run frame
4687 * and return that as the value. */
4688 if (is_coro) {
4689 gen = PyCoro_New(f, con->fc_name, con->fc_qualname);
4690 } else if (((PyCodeObject *)con->fc_code)->co_flags & CO_ASYNC_GENERATOR) {
4691 gen = PyAsyncGen_New(f, con->fc_name, con->fc_qualname);
4692 } else {
4693 gen = PyGen_NewWithQualName(f, con->fc_name, con->fc_qualname);
4694 }
4695 if (gen == NULL) {
4696 return NULL;
4697 }
4698
4699 _PyObject_GC_TRACK(f);
4700
4701 return gen;
4702}
4703
4704PyObject *
4705_PyEval_Vector(PyThreadState *tstate, PyFrameConstructor *con,
4706 PyObject *locals,
4707 PyObject* const* args, size_t argcount,
4708 PyObject *kwnames)
4709{
4710 PyFrameObject *f = _PyEval_MakeFrameVector(
4711 tstate, con, locals, args, argcount, kwnames);
4712 if (f == NULL) {
4713 return NULL;
4714 }
4715 if (((PyCodeObject *)con->fc_code)->co_flags & (CO_GENERATOR | CO_COROUTINE | CO_ASYNC_GENERATOR)) {
4716 return make_coro(con, f);
4717 }
4718 PyObject *retval = _PyEval_EvalFrame(tstate, f, 0);
4719
4720 /* decref'ing the frame can cause __del__ methods to get invoked,
4721 which can call back into Python. While we're done with the
4722 current Python frame (f), the associated C stack is still in use,
4723 so recursion_depth must be boosted for the duration.
4724 */
4725 if (Py_REFCNT(f) > 1) {
4726 Py_DECREF(f);
4727 _PyObject_GC_TRACK(f);
4728 }
4729 else {
4730 ++tstate->recursion_depth;
4731 Py_DECREF(f);
4732 --tstate->recursion_depth;
4733 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004734 return retval;
Tim Peters5ca576e2001-06-18 22:08:13 +00004735}
4736
Mark Shannond6c33fb2021-01-29 13:24:55 +00004737/* Legacy API */
Victor Stinnerb5e170f2019-11-16 01:03:22 +01004738PyObject *
Mark Shannon0332e562021-02-01 10:42:03 +00004739PyEval_EvalCodeEx(PyObject *_co, PyObject *globals, PyObject *locals,
4740 PyObject *const *args, int argcount,
4741 PyObject *const *kws, int kwcount,
4742 PyObject *const *defs, int defcount,
4743 PyObject *kwdefs, PyObject *closure)
Victor Stinnerb5e170f2019-11-16 01:03:22 +01004744{
Victor Stinner46496f92021-02-20 15:17:18 +01004745 PyThreadState *tstate = _PyThreadState_GET();
Mark Shannon0332e562021-02-01 10:42:03 +00004746 PyObject *res;
Mark Shannond6c33fb2021-01-29 13:24:55 +00004747 PyObject *defaults = _PyTuple_FromArray(defs, defcount);
4748 if (defaults == NULL) {
4749 return NULL;
4750 }
Victor Stinner46496f92021-02-20 15:17:18 +01004751 PyObject *builtins = _PyEval_BuiltinsFromGlobals(tstate, globals);
Mark Shannond6c33fb2021-01-29 13:24:55 +00004752 if (builtins == NULL) {
4753 Py_DECREF(defaults);
4754 return NULL;
4755 }
Dong-hee Na3cf08332021-02-14 15:54:39 +09004756 assert ((((PyCodeObject *)_co)->co_flags & (CO_NEWLOCALS | CO_OPTIMIZED)) == 0);
Mark Shannon0332e562021-02-01 10:42:03 +00004757 if (locals == NULL) {
4758 locals = globals;
4759 }
4760 PyObject *kwnames;
4761 PyObject *const *allargs;
4762 PyObject **newargs;
4763 if (kwcount == 0) {
4764 allargs = args;
4765 kwnames = NULL;
4766 }
4767 else {
4768 kwnames = PyTuple_New(kwcount);
4769 if (kwnames == NULL) {
4770 res = NULL;
4771 goto fail;
4772 }
4773 newargs = PyMem_Malloc(sizeof(PyObject *)*(kwcount+argcount));
4774 if (newargs == NULL) {
4775 res = NULL;
4776 Py_DECREF(kwnames);
4777 goto fail;
4778 }
4779 for (int i = 0; i < argcount; i++) {
4780 newargs[i] = args[i];
4781 }
4782 for (int i = 0; i < kwcount; i++) {
4783 Py_INCREF(kws[2*i]);
4784 PyTuple_SET_ITEM(kwnames, i, kws[2*i]);
4785 newargs[argcount+i] = kws[2*i+1];
4786 }
4787 allargs = newargs;
4788 }
4789 PyObject **kwargs = PyMem_Malloc(sizeof(PyObject *)*kwcount);
4790 if (kwargs == NULL) {
4791 res = NULL;
4792 Py_DECREF(kwnames);
4793 goto fail;
4794 }
4795 for (int i = 0; i < kwcount; i++) {
4796 Py_INCREF(kws[2*i]);
4797 PyTuple_SET_ITEM(kwnames, i, kws[2*i]);
4798 kwargs[i] = kws[2*i+1];
4799 }
Mark Shannond6c33fb2021-01-29 13:24:55 +00004800 PyFrameConstructor constr = {
4801 .fc_globals = globals,
4802 .fc_builtins = builtins,
Mark Shannon0332e562021-02-01 10:42:03 +00004803 .fc_name = ((PyCodeObject *)_co)->co_name,
4804 .fc_qualname = ((PyCodeObject *)_co)->co_name,
Mark Shannond6c33fb2021-01-29 13:24:55 +00004805 .fc_code = _co,
4806 .fc_defaults = defaults,
4807 .fc_kwdefaults = kwdefs,
4808 .fc_closure = closure
4809 };
Mark Shannon0332e562021-02-01 10:42:03 +00004810 res = _PyEval_Vector(tstate, &constr, locals,
Victor Stinner44085a32021-02-18 19:20:16 +01004811 allargs, argcount,
4812 kwnames);
Mark Shannon0332e562021-02-01 10:42:03 +00004813 if (kwcount) {
4814 Py_DECREF(kwnames);
4815 PyMem_Free(newargs);
4816 }
4817fail:
Mark Shannond6c33fb2021-01-29 13:24:55 +00004818 Py_DECREF(defaults);
4819 Py_DECREF(builtins);
4820 return res;
Victor Stinnerb5e170f2019-11-16 01:03:22 +01004821}
4822
Tim Peters5ca576e2001-06-18 22:08:13 +00004823
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004824static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02004825special_lookup(PyThreadState *tstate, PyObject *o, _Py_Identifier *id)
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004826{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004827 PyObject *res;
Benjamin Petersonce798522012-01-22 11:24:29 -05004828 res = _PyObject_LookupSpecial(o, id);
Victor Stinner438a12d2019-05-24 17:01:38 +02004829 if (res == NULL && !_PyErr_Occurred(tstate)) {
Victor Stinner4804b5b2020-05-12 01:43:38 +02004830 _PyErr_SetObject(tstate, PyExc_AttributeError, _PyUnicode_FromId(id));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004831 return NULL;
4832 }
4833 return res;
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004834}
4835
4836
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00004837/* Logic for the raise statement (too complicated for inlining).
4838 This *consumes* a reference count to each of its arguments. */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004839static int
Victor Stinner09532fe2019-05-10 23:39:09 +02004840do_raise(PyThreadState *tstate, PyObject *exc, PyObject *cause)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00004841{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004842 PyObject *type = NULL, *value = NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00004843
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004844 if (exc == NULL) {
4845 /* Reraise */
Mark Shannonae3087c2017-10-22 22:41:51 +01004846 _PyErr_StackItem *exc_info = _PyErr_GetTopmostException(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004847 PyObject *tb;
Mark Shannonae3087c2017-10-22 22:41:51 +01004848 type = exc_info->exc_type;
4849 value = exc_info->exc_value;
4850 tb = exc_info->exc_traceback;
Victor Stinnereec93312016-08-18 18:13:10 +02004851 if (type == Py_None || type == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004852 _PyErr_SetString(tstate, PyExc_RuntimeError,
4853 "No active exception to reraise");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004854 return 0;
4855 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004856 Py_XINCREF(type);
4857 Py_XINCREF(value);
4858 Py_XINCREF(tb);
Victor Stinner438a12d2019-05-24 17:01:38 +02004859 _PyErr_Restore(tstate, type, value, tb);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004860 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004861 }
Guido van Rossumac7be682001-01-17 15:42:30 +00004862
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004863 /* We support the following forms of raise:
4864 raise
Collin Winter828f04a2007-08-31 00:04:24 +00004865 raise <instance>
4866 raise <type> */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00004867
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004868 if (PyExceptionClass_Check(exc)) {
4869 type = exc;
Victor Stinnera5ed5f02016-12-06 18:45:50 +01004870 value = _PyObject_CallNoArg(exc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004871 if (value == NULL)
4872 goto raise_error;
Benjamin Peterson5afa03a2011-07-15 14:09:26 -05004873 if (!PyExceptionInstance_Check(value)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004874 _PyErr_Format(tstate, PyExc_TypeError,
4875 "calling %R should have returned an instance of "
4876 "BaseException, not %R",
4877 type, Py_TYPE(value));
4878 goto raise_error;
Benjamin Peterson5afa03a2011-07-15 14:09:26 -05004879 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004880 }
4881 else if (PyExceptionInstance_Check(exc)) {
4882 value = exc;
4883 type = PyExceptionInstance_Class(exc);
4884 Py_INCREF(type);
4885 }
4886 else {
4887 /* Not something you can raise. You get an exception
4888 anyway, just not what you specified :-) */
4889 Py_DECREF(exc);
Victor Stinner438a12d2019-05-24 17:01:38 +02004890 _PyErr_SetString(tstate, PyExc_TypeError,
4891 "exceptions must derive from BaseException");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004892 goto raise_error;
4893 }
Collin Winter828f04a2007-08-31 00:04:24 +00004894
Serhiy Storchakac0191582016-09-27 11:37:10 +03004895 assert(type != NULL);
4896 assert(value != NULL);
4897
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004898 if (cause) {
4899 PyObject *fixed_cause;
4900 if (PyExceptionClass_Check(cause)) {
Victor Stinnera5ed5f02016-12-06 18:45:50 +01004901 fixed_cause = _PyObject_CallNoArg(cause);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004902 if (fixed_cause == NULL)
4903 goto raise_error;
Benjamin Petersond5a1c442012-05-14 22:09:31 -07004904 Py_DECREF(cause);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004905 }
Benjamin Petersond5a1c442012-05-14 22:09:31 -07004906 else if (PyExceptionInstance_Check(cause)) {
4907 fixed_cause = cause;
4908 }
4909 else if (cause == Py_None) {
4910 Py_DECREF(cause);
4911 fixed_cause = NULL;
4912 }
4913 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02004914 _PyErr_SetString(tstate, PyExc_TypeError,
4915 "exception causes must derive from "
4916 "BaseException");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004917 goto raise_error;
4918 }
Benjamin Petersond5a1c442012-05-14 22:09:31 -07004919 PyException_SetCause(value, fixed_cause);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004920 }
Collin Winter828f04a2007-08-31 00:04:24 +00004921
Victor Stinner438a12d2019-05-24 17:01:38 +02004922 _PyErr_SetObject(tstate, type, value);
Victor Stinner61f4db82020-01-28 03:37:45 +01004923 /* _PyErr_SetObject incref's its arguments */
Serhiy Storchakac0191582016-09-27 11:37:10 +03004924 Py_DECREF(value);
4925 Py_DECREF(type);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004926 return 0;
Collin Winter828f04a2007-08-31 00:04:24 +00004927
4928raise_error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004929 Py_XDECREF(value);
4930 Py_XDECREF(type);
4931 Py_XDECREF(cause);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004932 return 0;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00004933}
4934
Tim Petersd6d010b2001-06-21 02:49:55 +00004935/* Iterate v argcnt times and store the results on the stack (via decreasing
Guido van Rossum0368b722007-05-11 16:50:42 +00004936 sp). Return 1 for success, 0 if error.
Antoine Pitrou9a2310d2008-07-25 22:39:39 +00004937
Guido van Rossum0368b722007-05-11 16:50:42 +00004938 If argcntafter == -1, do a simple unpack. If it is >= 0, do an unpack
4939 with a variable target.
4940*/
Tim Petersd6d010b2001-06-21 02:49:55 +00004941
Barry Warsawe42b18f1997-08-25 22:13:04 +00004942static int
Victor Stinner438a12d2019-05-24 17:01:38 +02004943unpack_iterable(PyThreadState *tstate, PyObject *v,
4944 int argcnt, int argcntafter, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00004945{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004946 int i = 0, j = 0;
4947 Py_ssize_t ll = 0;
4948 PyObject *it; /* iter(v) */
4949 PyObject *w;
4950 PyObject *l = NULL; /* variable list */
Guido van Rossumac7be682001-01-17 15:42:30 +00004951
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004952 assert(v != NULL);
Tim Petersd6d010b2001-06-21 02:49:55 +00004953
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004954 it = PyObject_GetIter(v);
Serhiy Storchaka13a6c092017-12-26 12:30:41 +02004955 if (it == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004956 if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError) &&
Victor Stinnera102ed72020-02-07 02:24:48 +01004957 Py_TYPE(v)->tp_iter == NULL && !PySequence_Check(v))
Serhiy Storchaka13a6c092017-12-26 12:30:41 +02004958 {
Victor Stinner438a12d2019-05-24 17:01:38 +02004959 _PyErr_Format(tstate, PyExc_TypeError,
4960 "cannot unpack non-iterable %.200s object",
Victor Stinnera102ed72020-02-07 02:24:48 +01004961 Py_TYPE(v)->tp_name);
Serhiy Storchaka13a6c092017-12-26 12:30:41 +02004962 }
4963 return 0;
4964 }
Tim Petersd6d010b2001-06-21 02:49:55 +00004965
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004966 for (; i < argcnt; i++) {
4967 w = PyIter_Next(it);
4968 if (w == NULL) {
4969 /* Iterator done, via error or exhaustion. */
Victor Stinner438a12d2019-05-24 17:01:38 +02004970 if (!_PyErr_Occurred(tstate)) {
R David Murray4171bbe2015-04-15 17:08:45 -04004971 if (argcntafter == -1) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004972 _PyErr_Format(tstate, PyExc_ValueError,
4973 "not enough values to unpack "
4974 "(expected %d, got %d)",
4975 argcnt, i);
R David Murray4171bbe2015-04-15 17:08:45 -04004976 }
4977 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02004978 _PyErr_Format(tstate, PyExc_ValueError,
4979 "not enough values to unpack "
4980 "(expected at least %d, got %d)",
4981 argcnt + argcntafter, i);
R David Murray4171bbe2015-04-15 17:08:45 -04004982 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004983 }
4984 goto Error;
4985 }
4986 *--sp = w;
4987 }
Tim Petersd6d010b2001-06-21 02:49:55 +00004988
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004989 if (argcntafter == -1) {
4990 /* We better have exhausted the iterator now. */
4991 w = PyIter_Next(it);
4992 if (w == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004993 if (_PyErr_Occurred(tstate))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004994 goto Error;
4995 Py_DECREF(it);
4996 return 1;
4997 }
4998 Py_DECREF(w);
Victor Stinner438a12d2019-05-24 17:01:38 +02004999 _PyErr_Format(tstate, PyExc_ValueError,
5000 "too many values to unpack (expected %d)",
5001 argcnt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005002 goto Error;
5003 }
Guido van Rossum0368b722007-05-11 16:50:42 +00005004
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005005 l = PySequence_List(it);
5006 if (l == NULL)
5007 goto Error;
5008 *--sp = l;
5009 i++;
Guido van Rossum0368b722007-05-11 16:50:42 +00005010
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005011 ll = PyList_GET_SIZE(l);
5012 if (ll < argcntafter) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005013 _PyErr_Format(tstate, PyExc_ValueError,
R David Murray4171bbe2015-04-15 17:08:45 -04005014 "not enough values to unpack (expected at least %d, got %zd)",
5015 argcnt + argcntafter, argcnt + ll);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005016 goto Error;
5017 }
Guido van Rossum0368b722007-05-11 16:50:42 +00005018
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005019 /* Pop the "after-variable" args off the list. */
5020 for (j = argcntafter; j > 0; j--, i++) {
5021 *--sp = PyList_GET_ITEM(l, ll - j);
5022 }
5023 /* Resize the list. */
Victor Stinner60ac6ed2020-02-07 23:18:08 +01005024 Py_SET_SIZE(l, ll - argcntafter);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005025 Py_DECREF(it);
5026 return 1;
Guido van Rossum0368b722007-05-11 16:50:42 +00005027
Tim Petersd6d010b2001-06-21 02:49:55 +00005028Error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005029 for (; i > 0; i--, sp++)
5030 Py_DECREF(*sp);
5031 Py_XDECREF(it);
5032 return 0;
Barry Warsawe42b18f1997-08-25 22:13:04 +00005033}
5034
5035
Guido van Rossum96a42c81992-01-12 02:29:51 +00005036#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00005037static int
Victor Stinner438a12d2019-05-24 17:01:38 +02005038prtrace(PyThreadState *tstate, PyObject *v, const char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005039{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005040 printf("%s ", str);
Victor Stinner438a12d2019-05-24 17:01:38 +02005041 if (PyObject_Print(v, stdout, 0) != 0) {
5042 /* Don't know what else to do */
5043 _PyErr_Clear(tstate);
5044 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005045 printf("\n");
5046 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005047}
Guido van Rossum3f5da241990-12-20 15:06:42 +00005048#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005049
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00005050static void
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005051call_exc_trace(Py_tracefunc func, PyObject *self,
Mark Shannon86433452021-01-07 16:49:02 +00005052 PyThreadState *tstate,
5053 PyFrameObject *f,
5054 PyCodeAddressRange *bounds)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00005055{
Victor Stinneraaa8ed82013-07-10 13:57:55 +02005056 PyObject *type, *value, *traceback, *orig_traceback, *arg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005057 int err;
Victor Stinner438a12d2019-05-24 17:01:38 +02005058 _PyErr_Fetch(tstate, &type, &value, &orig_traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005059 if (value == NULL) {
5060 value = Py_None;
5061 Py_INCREF(value);
5062 }
Victor Stinner438a12d2019-05-24 17:01:38 +02005063 _PyErr_NormalizeException(tstate, &type, &value, &orig_traceback);
Antoine Pitrou89335212013-11-23 14:05:23 +01005064 traceback = (orig_traceback != NULL) ? orig_traceback : Py_None;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005065 arg = PyTuple_Pack(3, type, value, traceback);
5066 if (arg == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005067 _PyErr_Restore(tstate, type, value, orig_traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005068 return;
5069 }
Mark Shannon86433452021-01-07 16:49:02 +00005070 err = call_trace(func, self, tstate, f, bounds, PyTrace_EXCEPTION, arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005071 Py_DECREF(arg);
Victor Stinner438a12d2019-05-24 17:01:38 +02005072 if (err == 0) {
5073 _PyErr_Restore(tstate, type, value, orig_traceback);
5074 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005075 else {
5076 Py_XDECREF(type);
5077 Py_XDECREF(value);
Victor Stinneraaa8ed82013-07-10 13:57:55 +02005078 Py_XDECREF(orig_traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005079 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00005080}
5081
Amaury Forgeot d'Arcf05149a2007-11-13 01:05:30 +00005082static int
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005083call_trace_protected(Py_tracefunc func, PyObject *obj,
5084 PyThreadState *tstate, PyFrameObject *frame,
Mark Shannon86433452021-01-07 16:49:02 +00005085 PyCodeAddressRange *bounds,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005086 int what, PyObject *arg)
Fred Drake4ec5d562001-10-04 19:26:43 +00005087{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005088 PyObject *type, *value, *traceback;
5089 int err;
Victor Stinner438a12d2019-05-24 17:01:38 +02005090 _PyErr_Fetch(tstate, &type, &value, &traceback);
Mark Shannon86433452021-01-07 16:49:02 +00005091 err = call_trace(func, obj, tstate, frame, bounds, what, arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005092 if (err == 0)
5093 {
Victor Stinner438a12d2019-05-24 17:01:38 +02005094 _PyErr_Restore(tstate, type, value, traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005095 return 0;
5096 }
5097 else {
5098 Py_XDECREF(type);
5099 Py_XDECREF(value);
5100 Py_XDECREF(traceback);
5101 return -1;
5102 }
Fred Drake4ec5d562001-10-04 19:26:43 +00005103}
5104
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00005105static int
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005106call_trace(Py_tracefunc func, PyObject *obj,
5107 PyThreadState *tstate, PyFrameObject *frame,
Mark Shannon86433452021-01-07 16:49:02 +00005108 PyCodeAddressRange *bounds,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005109 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00005110{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005111 int result;
5112 if (tstate->tracing)
5113 return 0;
5114 tstate->tracing++;
5115 tstate->use_tracing = 0;
Mark Shannon86433452021-01-07 16:49:02 +00005116 if (frame->f_lasti < 0) {
5117 frame->f_lineno = frame->f_code->co_firstlineno;
5118 }
5119 else {
5120 frame->f_lineno = _PyCode_CheckLineNumber(frame->f_lasti, bounds);
5121 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005122 result = func(obj, frame, what, arg);
Mark Shannon86433452021-01-07 16:49:02 +00005123 frame->f_lineno = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005124 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
5125 || (tstate->c_profilefunc != NULL));
5126 tstate->tracing--;
5127 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00005128}
5129
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00005130PyObject *
5131_PyEval_CallTracing(PyObject *func, PyObject *args)
5132{
Victor Stinner50b48572018-11-01 01:51:40 +01005133 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005134 int save_tracing = tstate->tracing;
5135 int save_use_tracing = tstate->use_tracing;
5136 PyObject *result;
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00005137
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005138 tstate->tracing = 0;
5139 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
5140 || (tstate->c_profilefunc != NULL));
5141 result = PyObject_Call(func, args, NULL);
5142 tstate->tracing = save_tracing;
5143 tstate->use_tracing = save_use_tracing;
5144 return result;
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00005145}
5146
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00005147/* See Objects/lnotab_notes.txt for a description of how tracing works. */
Michael W. Hudson006c7522002-11-08 13:08:46 +00005148static int
Tim Peters8a5c3c72004-04-05 19:36:21 +00005149maybe_call_line_trace(Py_tracefunc func, PyObject *obj,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005150 PyThreadState *tstate, PyFrameObject *frame,
Mark Shannon877df852020-11-12 09:43:29 +00005151 PyCodeAddressRange *bounds, int *instr_prev)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00005152{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005153 int result = 0;
Michael W. Hudson006c7522002-11-08 13:08:46 +00005154
Nick Coghlan5a851672017-09-08 10:14:16 +10005155 /* If the last instruction falls at the start of a line or if it
5156 represents a jump backwards, update the frame's line number and
5157 then call the trace function if we're tracing source lines.
5158 */
Mark Shannonee9f98d2021-01-05 12:04:10 +00005159 int lastline = bounds->ar_line;
5160 int line = _PyCode_CheckLineNumber(frame->f_lasti, bounds);
5161 if (line != -1 && frame->f_trace_lines) {
5162 /* Trace backward edges or first instruction of a new line */
5163 if (frame->f_lasti < *instr_prev ||
5164 (line != lastline && frame->f_lasti == bounds->ar_start))
5165 {
Mark Shannon86433452021-01-07 16:49:02 +00005166 result = call_trace(func, obj, tstate, frame, bounds, PyTrace_LINE, Py_None);
Nick Coghlan5a851672017-09-08 10:14:16 +10005167 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005168 }
George King20faa682017-10-18 17:44:22 -07005169 /* Always emit an opcode event if we're tracing all opcodes. */
5170 if (frame->f_trace_opcodes) {
Mark Shannon86433452021-01-07 16:49:02 +00005171 result = call_trace(func, obj, tstate, frame, bounds, PyTrace_OPCODE, Py_None);
George King20faa682017-10-18 17:44:22 -07005172 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005173 *instr_prev = frame->f_lasti;
5174 return result;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00005175}
5176
Victor Stinner309d7cc2020-03-13 16:39:12 +01005177int
5178_PyEval_SetProfile(PyThreadState *tstate, Py_tracefunc func, PyObject *arg)
5179{
Victor Stinnerda2914d2020-03-20 09:29:08 +01005180 assert(is_tstate_valid(tstate));
Victor Stinner309d7cc2020-03-13 16:39:12 +01005181 /* The caller must hold the GIL */
5182 assert(PyGILState_Check());
5183
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005184 /* Call _PySys_Audit() in the context of the current thread state,
Victor Stinner309d7cc2020-03-13 16:39:12 +01005185 even if tstate is not the current thread state. */
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005186 PyThreadState *current_tstate = _PyThreadState_GET();
5187 if (_PySys_Audit(current_tstate, "sys.setprofile", NULL) < 0) {
Victor Stinner309d7cc2020-03-13 16:39:12 +01005188 return -1;
5189 }
5190
5191 PyObject *profileobj = tstate->c_profileobj;
5192
5193 tstate->c_profilefunc = NULL;
5194 tstate->c_profileobj = NULL;
5195 /* Must make sure that tracing is not ignored if 'profileobj' is freed */
5196 tstate->use_tracing = tstate->c_tracefunc != NULL;
5197 Py_XDECREF(profileobj);
5198
5199 Py_XINCREF(arg);
5200 tstate->c_profileobj = arg;
5201 tstate->c_profilefunc = func;
5202
5203 /* Flag that tracing or profiling is turned on */
5204 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
5205 return 0;
5206}
5207
Fred Drake5755ce62001-06-27 19:19:46 +00005208void
5209PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00005210{
Victor Stinner309d7cc2020-03-13 16:39:12 +01005211 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerf6a58502020-03-16 17:41:44 +01005212 if (_PyEval_SetProfile(tstate, func, arg) < 0) {
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005213 /* Log _PySys_Audit() error */
Victor Stinnerf6a58502020-03-16 17:41:44 +01005214 _PyErr_WriteUnraisableMsg("in PyEval_SetProfile", NULL);
5215 }
Victor Stinner309d7cc2020-03-13 16:39:12 +01005216}
5217
5218int
5219_PyEval_SetTrace(PyThreadState *tstate, Py_tracefunc func, PyObject *arg)
5220{
Victor Stinnerda2914d2020-03-20 09:29:08 +01005221 assert(is_tstate_valid(tstate));
Victor Stinner309d7cc2020-03-13 16:39:12 +01005222 /* The caller must hold the GIL */
5223 assert(PyGILState_Check());
5224
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005225 /* Call _PySys_Audit() in the context of the current thread state,
Victor Stinner309d7cc2020-03-13 16:39:12 +01005226 even if tstate is not the current thread state. */
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005227 PyThreadState *current_tstate = _PyThreadState_GET();
5228 if (_PySys_Audit(current_tstate, "sys.settrace", NULL) < 0) {
Victor Stinner309d7cc2020-03-13 16:39:12 +01005229 return -1;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005230 }
5231
Victor Stinnerda2914d2020-03-20 09:29:08 +01005232 struct _ceval_state *ceval2 = &tstate->interp->ceval;
Victor Stinner309d7cc2020-03-13 16:39:12 +01005233 PyObject *traceobj = tstate->c_traceobj;
Victor Stinnerda2914d2020-03-20 09:29:08 +01005234 ceval2->tracing_possible += (func != NULL) - (tstate->c_tracefunc != NULL);
Victor Stinner309d7cc2020-03-13 16:39:12 +01005235
5236 tstate->c_tracefunc = NULL;
5237 tstate->c_traceobj = NULL;
5238 /* Must make sure that profiling is not ignored if 'traceobj' is freed */
5239 tstate->use_tracing = (tstate->c_profilefunc != NULL);
5240 Py_XDECREF(traceobj);
5241
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005242 Py_XINCREF(arg);
Victor Stinner309d7cc2020-03-13 16:39:12 +01005243 tstate->c_traceobj = arg;
5244 tstate->c_tracefunc = func;
5245
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005246 /* Flag that tracing or profiling is turned on */
Victor Stinner309d7cc2020-03-13 16:39:12 +01005247 tstate->use_tracing = ((func != NULL)
5248 || (tstate->c_profilefunc != NULL));
5249
5250 return 0;
Fred Drake5755ce62001-06-27 19:19:46 +00005251}
5252
5253void
5254PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
5255{
Victor Stinner309d7cc2020-03-13 16:39:12 +01005256 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerf6a58502020-03-16 17:41:44 +01005257 if (_PyEval_SetTrace(tstate, func, arg) < 0) {
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005258 /* Log _PySys_Audit() error */
Victor Stinnerf6a58502020-03-16 17:41:44 +01005259 _PyErr_WriteUnraisableMsg("in PyEval_SetTrace", NULL);
5260 }
Fred Draked0838392001-06-16 21:02:31 +00005261}
5262
Victor Stinner309d7cc2020-03-13 16:39:12 +01005263
Yury Selivanov75445082015-05-11 22:57:16 -04005264void
Victor Stinner838f2642019-06-13 22:41:23 +02005265_PyEval_SetCoroutineOriginTrackingDepth(PyThreadState *tstate, int new_depth)
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08005266{
5267 assert(new_depth >= 0);
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08005268 tstate->coroutine_origin_tracking_depth = new_depth;
5269}
5270
5271int
5272_PyEval_GetCoroutineOriginTrackingDepth(void)
5273{
Victor Stinner50b48572018-11-01 01:51:40 +01005274 PyThreadState *tstate = _PyThreadState_GET();
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08005275 return tstate->coroutine_origin_tracking_depth;
5276}
5277
Zackery Spytz79ceccd2020-03-26 06:11:13 -06005278int
Yury Selivanoveb636452016-09-08 22:01:51 -07005279_PyEval_SetAsyncGenFirstiter(PyObject *firstiter)
5280{
Victor Stinner50b48572018-11-01 01:51:40 +01005281 PyThreadState *tstate = _PyThreadState_GET();
Steve Dowerb82e17e2019-05-23 08:45:22 -07005282
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005283 if (_PySys_Audit(tstate, "sys.set_asyncgen_hook_firstiter", NULL) < 0) {
Zackery Spytz79ceccd2020-03-26 06:11:13 -06005284 return -1;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005285 }
5286
Yury Selivanoveb636452016-09-08 22:01:51 -07005287 Py_XINCREF(firstiter);
5288 Py_XSETREF(tstate->async_gen_firstiter, firstiter);
Zackery Spytz79ceccd2020-03-26 06:11:13 -06005289 return 0;
Yury Selivanoveb636452016-09-08 22:01:51 -07005290}
5291
5292PyObject *
5293_PyEval_GetAsyncGenFirstiter(void)
5294{
Victor Stinner50b48572018-11-01 01:51:40 +01005295 PyThreadState *tstate = _PyThreadState_GET();
Yury Selivanoveb636452016-09-08 22:01:51 -07005296 return tstate->async_gen_firstiter;
5297}
5298
Zackery Spytz79ceccd2020-03-26 06:11:13 -06005299int
Yury Selivanoveb636452016-09-08 22:01:51 -07005300_PyEval_SetAsyncGenFinalizer(PyObject *finalizer)
5301{
Victor Stinner50b48572018-11-01 01:51:40 +01005302 PyThreadState *tstate = _PyThreadState_GET();
Steve Dowerb82e17e2019-05-23 08:45:22 -07005303
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005304 if (_PySys_Audit(tstate, "sys.set_asyncgen_hook_finalizer", NULL) < 0) {
Zackery Spytz79ceccd2020-03-26 06:11:13 -06005305 return -1;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005306 }
5307
Yury Selivanoveb636452016-09-08 22:01:51 -07005308 Py_XINCREF(finalizer);
5309 Py_XSETREF(tstate->async_gen_finalizer, finalizer);
Zackery Spytz79ceccd2020-03-26 06:11:13 -06005310 return 0;
Yury Selivanoveb636452016-09-08 22:01:51 -07005311}
5312
5313PyObject *
5314_PyEval_GetAsyncGenFinalizer(void)
5315{
Victor Stinner50b48572018-11-01 01:51:40 +01005316 PyThreadState *tstate = _PyThreadState_GET();
Yury Selivanoveb636452016-09-08 22:01:51 -07005317 return tstate->async_gen_finalizer;
5318}
5319
Victor Stinner438a12d2019-05-24 17:01:38 +02005320PyFrameObject *
5321PyEval_GetFrame(void)
5322{
5323 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner6723e932020-03-20 17:46:56 +01005324 return tstate->frame;
Victor Stinner438a12d2019-05-24 17:01:38 +02005325}
5326
Guido van Rossumb209a111997-04-29 18:18:01 +00005327PyObject *
Victor Stinner46496f92021-02-20 15:17:18 +01005328_PyEval_GetBuiltins(PyThreadState *tstate)
5329{
5330 PyFrameObject *frame = tstate->frame;
5331 if (frame != NULL) {
5332 return frame->f_builtins;
5333 }
5334 return tstate->interp->builtins;
5335}
5336
5337PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005338PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00005339{
Victor Stinner438a12d2019-05-24 17:01:38 +02005340 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner46496f92021-02-20 15:17:18 +01005341 return _PyEval_GetBuiltins(tstate);
Guido van Rossum6135a871995-01-09 17:53:26 +00005342}
5343
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02005344/* Convenience function to get a builtin from its name */
5345PyObject *
5346_PyEval_GetBuiltinId(_Py_Identifier *name)
5347{
Victor Stinner438a12d2019-05-24 17:01:38 +02005348 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02005349 PyObject *attr = _PyDict_GetItemIdWithError(PyEval_GetBuiltins(), name);
5350 if (attr) {
5351 Py_INCREF(attr);
5352 }
Victor Stinner438a12d2019-05-24 17:01:38 +02005353 else if (!_PyErr_Occurred(tstate)) {
5354 _PyErr_SetObject(tstate, PyExc_AttributeError, _PyUnicode_FromId(name));
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02005355 }
5356 return attr;
5357}
5358
Guido van Rossumb209a111997-04-29 18:18:01 +00005359PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005360PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00005361{
Victor Stinner438a12d2019-05-24 17:01:38 +02005362 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner6723e932020-03-20 17:46:56 +01005363 PyFrameObject *current_frame = tstate->frame;
Victor Stinner41bb43a2013-10-29 01:19:37 +01005364 if (current_frame == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005365 _PyErr_SetString(tstate, PyExc_SystemError, "frame does not exist");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005366 return NULL;
Victor Stinner41bb43a2013-10-29 01:19:37 +01005367 }
5368
Victor Stinner438a12d2019-05-24 17:01:38 +02005369 if (PyFrame_FastToLocalsWithError(current_frame) < 0) {
Victor Stinner41bb43a2013-10-29 01:19:37 +01005370 return NULL;
Victor Stinner438a12d2019-05-24 17:01:38 +02005371 }
Victor Stinner41bb43a2013-10-29 01:19:37 +01005372
5373 assert(current_frame->f_locals != NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005374 return current_frame->f_locals;
Guido van Rossum5b722181993-03-30 17:46:03 +00005375}
5376
Guido van Rossumb209a111997-04-29 18:18:01 +00005377PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005378PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00005379{
Victor Stinner438a12d2019-05-24 17:01:38 +02005380 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner6723e932020-03-20 17:46:56 +01005381 PyFrameObject *current_frame = tstate->frame;
Victor Stinner438a12d2019-05-24 17:01:38 +02005382 if (current_frame == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005383 return NULL;
Victor Stinner438a12d2019-05-24 17:01:38 +02005384 }
Victor Stinner41bb43a2013-10-29 01:19:37 +01005385
5386 assert(current_frame->f_globals != NULL);
5387 return current_frame->f_globals;
Guido van Rossum3f5da241990-12-20 15:06:42 +00005388}
5389
Guido van Rossum6135a871995-01-09 17:53:26 +00005390int
Tim Peters5ba58662001-07-16 02:29:45 +00005391PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
Jeremy Hylton061d1062001-03-22 02:32:48 +00005392{
Victor Stinner438a12d2019-05-24 17:01:38 +02005393 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner6723e932020-03-20 17:46:56 +01005394 PyFrameObject *current_frame = tstate->frame;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005395 int result = cf->cf_flags != 0;
Tim Peters5ba58662001-07-16 02:29:45 +00005396
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005397 if (current_frame != NULL) {
5398 const int codeflags = current_frame->f_code->co_flags;
5399 const int compilerflags = codeflags & PyCF_MASK;
5400 if (compilerflags) {
5401 result = 1;
5402 cf->cf_flags |= compilerflags;
5403 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00005404#if 0 /* future keyword */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005405 if (codeflags & CO_GENERATOR_ALLOWED) {
5406 result = 1;
5407 cf->cf_flags |= CO_GENERATOR_ALLOWED;
5408 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00005409#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005410 }
5411 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00005412}
5413
Guido van Rossum3f5da241990-12-20 15:06:42 +00005414
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00005415const char *
Tim Peters6d6c1a32001-08-02 04:15:00 +00005416PyEval_GetFuncName(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00005417{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005418 if (PyMethod_Check(func))
5419 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
5420 else if (PyFunction_Check(func))
Serhiy Storchaka06515832016-11-20 09:13:07 +02005421 return PyUnicode_AsUTF8(((PyFunctionObject*)func)->func_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005422 else if (PyCFunction_Check(func))
5423 return ((PyCFunctionObject*)func)->m_ml->ml_name;
5424 else
Victor Stinnera102ed72020-02-07 02:24:48 +01005425 return Py_TYPE(func)->tp_name;
Jeremy Hylton512a2372001-04-11 13:52:29 +00005426}
5427
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00005428const char *
Tim Peters6d6c1a32001-08-02 04:15:00 +00005429PyEval_GetFuncDesc(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00005430{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005431 if (PyMethod_Check(func))
5432 return "()";
5433 else if (PyFunction_Check(func))
5434 return "()";
5435 else if (PyCFunction_Check(func))
5436 return "()";
5437 else
5438 return " object";
Jeremy Hylton512a2372001-04-11 13:52:29 +00005439}
5440
Armin Rigo1c2d7e52005-09-20 18:34:01 +00005441#define C_TRACE(x, call) \
Nicholas Bastind858a772004-06-25 23:31:06 +00005442if (tstate->use_tracing && tstate->c_profilefunc) { \
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005443 if (call_trace(tstate->c_profilefunc, tstate->c_profileobj, \
Mark Shannon86433452021-01-07 16:49:02 +00005444 tstate, tstate->frame, bounds, \
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005445 PyTrace_C_CALL, func)) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005446 x = NULL; \
5447 } \
5448 else { \
5449 x = call; \
5450 if (tstate->c_profilefunc != NULL) { \
5451 if (x == NULL) { \
5452 call_trace_protected(tstate->c_profilefunc, \
5453 tstate->c_profileobj, \
Mark Shannon86433452021-01-07 16:49:02 +00005454 tstate, tstate->frame, bounds, \
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005455 PyTrace_C_EXCEPTION, func); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005456 /* XXX should pass (type, value, tb) */ \
5457 } else { \
5458 if (call_trace(tstate->c_profilefunc, \
5459 tstate->c_profileobj, \
Mark Shannon86433452021-01-07 16:49:02 +00005460 tstate, tstate->frame, bounds, \
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005461 PyTrace_C_RETURN, func)) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005462 Py_DECREF(x); \
5463 x = NULL; \
5464 } \
5465 } \
5466 } \
5467 } \
Nicholas Bastind858a772004-06-25 23:31:06 +00005468} else { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005469 x = call; \
5470 }
Nicholas Bastinc69ebe82004-03-24 21:57:10 +00005471
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005472
5473static PyObject *
5474trace_call_function(PyThreadState *tstate,
Mark Shannon86433452021-01-07 16:49:02 +00005475 PyCodeAddressRange *bounds,
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005476 PyObject *func,
5477 PyObject **args, Py_ssize_t nargs,
5478 PyObject *kwnames)
5479{
5480 PyObject *x;
scoder4c9ea092020-05-12 16:12:41 +02005481 if (PyCFunction_CheckExact(func) || PyCMethod_CheckExact(func)) {
Petr Viktorinffd97532020-02-11 17:46:57 +01005482 C_TRACE(x, PyObject_Vectorcall(func, args, nargs, kwnames));
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005483 return x;
5484 }
Andy Lesterdffe4c02020-03-04 07:15:20 -06005485 else if (Py_IS_TYPE(func, &PyMethodDescr_Type) && nargs > 0) {
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005486 /* We need to create a temporary bound method as argument
5487 for profiling.
5488
5489 If nargs == 0, then this cannot work because we have no
5490 "self". In any case, the call itself would raise
5491 TypeError (foo needs an argument), so we just skip
5492 profiling. */
5493 PyObject *self = args[0];
5494 func = Py_TYPE(func)->tp_descr_get(func, self, (PyObject*)Py_TYPE(self));
5495 if (func == NULL) {
5496 return NULL;
5497 }
Petr Viktorinffd97532020-02-11 17:46:57 +01005498 C_TRACE(x, PyObject_Vectorcall(func,
Jeroen Demeyer0d722f32019-07-05 14:48:24 +02005499 args+1, nargs-1,
5500 kwnames));
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005501 Py_DECREF(func);
5502 return x;
5503 }
Petr Viktorinffd97532020-02-11 17:46:57 +01005504 return PyObject_Vectorcall(func, args, nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames);
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005505}
5506
Victor Stinner415c5102017-01-11 00:54:57 +01005507/* Issue #29227: Inline call_function() into _PyEval_EvalFrameDefault()
5508 to reduce the stack consumption. */
5509Py_LOCAL_INLINE(PyObject *) _Py_HOT_FUNCTION
Mark Shannon86433452021-01-07 16:49:02 +00005510call_function(PyThreadState *tstate,
5511 PyCodeAddressRange *bounds,
5512 PyObject ***pp_stack,
5513 Py_ssize_t oparg,
5514 PyObject *kwnames)
Jeremy Hyltone8c04322002-08-16 17:47:26 +00005515{
Victor Stinnerf9b760f2016-09-09 10:17:08 -07005516 PyObject **pfunc = (*pp_stack) - oparg - 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005517 PyObject *func = *pfunc;
5518 PyObject *x, *w;
Victor Stinnerd8735722016-09-09 12:36:44 -07005519 Py_ssize_t nkwargs = (kwnames == NULL) ? 0 : PyTuple_GET_SIZE(kwnames);
5520 Py_ssize_t nargs = oparg - nkwargs;
INADA Naoki5566bbb2017-02-03 07:43:03 +09005521 PyObject **stack = (*pp_stack) - nargs - nkwargs;
Jeremy Hyltone8c04322002-08-16 17:47:26 +00005522
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005523 if (tstate->use_tracing) {
Mark Shannon86433452021-01-07 16:49:02 +00005524 x = trace_call_function(tstate, bounds, func, stack, nargs, kwnames);
INADA Naoki5566bbb2017-02-03 07:43:03 +09005525 }
Victor Stinner4a7cc882015-03-06 23:35:27 +01005526 else {
Petr Viktorinffd97532020-02-11 17:46:57 +01005527 x = PyObject_Vectorcall(func, stack, nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005528 }
Tim Peters8a5c3c72004-04-05 19:36:21 +00005529
Victor Stinner438a12d2019-05-24 17:01:38 +02005530 assert((x != NULL) ^ (_PyErr_Occurred(tstate) != NULL));
Victor Stinnerf9b760f2016-09-09 10:17:08 -07005531
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01005532 /* Clear the stack of the function object. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005533 while ((*pp_stack) > pfunc) {
5534 w = EXT_POP(*pp_stack);
5535 Py_DECREF(w);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005536 }
Victor Stinnerace47d72013-07-18 01:41:08 +02005537
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005538 return x;
Jeremy Hyltone8c04322002-08-16 17:47:26 +00005539}
5540
Jeremy Hylton52820442001-01-03 23:52:36 +00005541static PyObject *
Mark Shannon86433452021-01-07 16:49:02 +00005542do_call_core(PyThreadState *tstate,
5543 PyCodeAddressRange *bounds,
5544 PyObject *func,
5545 PyObject *callargs,
5546 PyObject *kwdict)
Jeremy Hylton52820442001-01-03 23:52:36 +00005547{
jdemeyere89de732018-09-19 12:06:20 +02005548 PyObject *result;
5549
scoder4c9ea092020-05-12 16:12:41 +02005550 if (PyCFunction_CheckExact(func) || PyCMethod_CheckExact(func)) {
Jeroen Demeyer7a6873c2019-09-11 13:01:01 +02005551 C_TRACE(result, PyObject_Call(func, callargs, kwdict));
Victor Stinnerf9b760f2016-09-09 10:17:08 -07005552 return result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005553 }
Andy Lesterdffe4c02020-03-04 07:15:20 -06005554 else if (Py_IS_TYPE(func, &PyMethodDescr_Type)) {
jdemeyere89de732018-09-19 12:06:20 +02005555 Py_ssize_t nargs = PyTuple_GET_SIZE(callargs);
5556 if (nargs > 0 && tstate->use_tracing) {
5557 /* We need to create a temporary bound method as argument
5558 for profiling.
5559
5560 If nargs == 0, then this cannot work because we have no
5561 "self". In any case, the call itself would raise
5562 TypeError (foo needs an argument), so we just skip
5563 profiling. */
5564 PyObject *self = PyTuple_GET_ITEM(callargs, 0);
5565 func = Py_TYPE(func)->tp_descr_get(func, self, (PyObject*)Py_TYPE(self));
5566 if (func == NULL) {
5567 return NULL;
5568 }
5569
Victor Stinner4d231bc2019-11-14 13:36:21 +01005570 C_TRACE(result, _PyObject_FastCallDictTstate(
5571 tstate, func,
5572 &_PyTuple_ITEMS(callargs)[1],
5573 nargs - 1,
5574 kwdict));
jdemeyere89de732018-09-19 12:06:20 +02005575 Py_DECREF(func);
5576 return result;
5577 }
Victor Stinner74319ae2016-08-25 00:04:09 +02005578 }
jdemeyere89de732018-09-19 12:06:20 +02005579 return PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00005580}
5581
Serhiy Storchaka483405b2015-02-17 10:14:30 +02005582/* Extract a slice index from a PyLong or an object with the
Guido van Rossum38fff8c2006-03-07 18:50:55 +00005583 nb_index slot defined, and store in *pi.
5584 Silently reduce values larger than PY_SSIZE_T_MAX to PY_SSIZE_T_MAX,
Xiang Zhang2ddf5a12017-05-10 18:19:41 +08005585 and silently boost values less than PY_SSIZE_T_MIN to PY_SSIZE_T_MIN.
Martin v. Löwisdde99d22006-02-17 15:57:41 +00005586 Return 0 on error, 1 on success.
Tim Peterscb479e72001-12-16 19:11:44 +00005587*/
Guido van Rossum20c6add2000-05-08 14:06:50 +00005588int
Martin v. Löwis18e16552006-02-15 17:27:45 +00005589_PyEval_SliceIndex(PyObject *v, Py_ssize_t *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005590{
Victor Stinner438a12d2019-05-24 17:01:38 +02005591 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005592 if (v != Py_None) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005593 Py_ssize_t x;
Victor Stinnera15e2602020-04-08 02:01:56 +02005594 if (_PyIndex_Check(v)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005595 x = PyNumber_AsSsize_t(v, NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02005596 if (x == -1 && _PyErr_Occurred(tstate))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005597 return 0;
5598 }
5599 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02005600 _PyErr_SetString(tstate, PyExc_TypeError,
5601 "slice indices must be integers or "
5602 "None or have an __index__ method");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005603 return 0;
5604 }
5605 *pi = x;
5606 }
5607 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005608}
5609
Serhiy Storchaka80ec8362017-03-19 19:37:40 +02005610int
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005611_PyEval_SliceIndexNotNone(PyObject *v, Py_ssize_t *pi)
Serhiy Storchaka80ec8362017-03-19 19:37:40 +02005612{
Victor Stinner438a12d2019-05-24 17:01:38 +02005613 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005614 Py_ssize_t x;
Victor Stinnera15e2602020-04-08 02:01:56 +02005615 if (_PyIndex_Check(v)) {
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005616 x = PyNumber_AsSsize_t(v, NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02005617 if (x == -1 && _PyErr_Occurred(tstate))
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005618 return 0;
5619 }
5620 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02005621 _PyErr_SetString(tstate, PyExc_TypeError,
5622 "slice indices must be integers or "
5623 "have an __index__ method");
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005624 return 0;
5625 }
5626 *pi = x;
5627 return 1;
Serhiy Storchaka80ec8362017-03-19 19:37:40 +02005628}
5629
Thomas Wouters52152252000-08-17 22:55:00 +00005630static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02005631import_name(PyThreadState *tstate, PyFrameObject *f,
5632 PyObject *name, PyObject *fromlist, PyObject *level)
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005633{
5634 _Py_IDENTIFIER(__import__);
Victor Stinnerdf142fd2016-08-20 00:44:42 +02005635 PyObject *import_func, *res;
5636 PyObject* stack[5];
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005637
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02005638 import_func = _PyDict_GetItemIdWithError(f->f_builtins, &PyId___import__);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005639 if (import_func == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005640 if (!_PyErr_Occurred(tstate)) {
5641 _PyErr_SetString(tstate, PyExc_ImportError, "__import__ not found");
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02005642 }
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005643 return NULL;
5644 }
5645
5646 /* Fast path for not overloaded __import__. */
Victor Stinner438a12d2019-05-24 17:01:38 +02005647 if (import_func == tstate->interp->import_func) {
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005648 int ilevel = _PyLong_AsInt(level);
Victor Stinner438a12d2019-05-24 17:01:38 +02005649 if (ilevel == -1 && _PyErr_Occurred(tstate)) {
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005650 return NULL;
5651 }
5652 res = PyImport_ImportModuleLevelObject(
5653 name,
5654 f->f_globals,
5655 f->f_locals == NULL ? Py_None : f->f_locals,
5656 fromlist,
5657 ilevel);
5658 return res;
5659 }
5660
5661 Py_INCREF(import_func);
Victor Stinnerdf142fd2016-08-20 00:44:42 +02005662
5663 stack[0] = name;
5664 stack[1] = f->f_globals;
5665 stack[2] = f->f_locals == NULL ? Py_None : f->f_locals;
5666 stack[3] = fromlist;
5667 stack[4] = level;
Victor Stinner559bb6a2016-08-22 22:48:54 +02005668 res = _PyObject_FastCall(import_func, stack, 5);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005669 Py_DECREF(import_func);
5670 return res;
5671}
5672
5673static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02005674import_from(PyThreadState *tstate, PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00005675{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005676 PyObject *x;
Xiang Zhang4830f582017-03-21 11:13:42 +08005677 PyObject *fullmodname, *pkgname, *pkgpath, *pkgname_or_unknown, *errmsg;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00005678
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005679 if (_PyObject_LookupAttr(v, name, &x) != 0) {
Antoine Pitrou0373a102014-10-13 20:19:45 +02005680 return x;
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005681 }
Antoine Pitrou0373a102014-10-13 20:19:45 +02005682 /* Issue #17636: in case this failed because of a circular relative
5683 import, try to fallback on reading the module directly from
5684 sys.modules. */
Antoine Pitrou0373a102014-10-13 20:19:45 +02005685 pkgname = _PyObject_GetAttrId(v, &PyId___name__);
Brett Cannon3008bc02015-08-11 18:01:31 -07005686 if (pkgname == NULL) {
5687 goto error;
5688 }
Oren Milman6db70332017-09-19 14:23:01 +03005689 if (!PyUnicode_Check(pkgname)) {
5690 Py_CLEAR(pkgname);
5691 goto error;
5692 }
Antoine Pitrou0373a102014-10-13 20:19:45 +02005693 fullmodname = PyUnicode_FromFormat("%U.%U", pkgname, name);
Brett Cannon3008bc02015-08-11 18:01:31 -07005694 if (fullmodname == NULL) {
Xiang Zhang4830f582017-03-21 11:13:42 +08005695 Py_DECREF(pkgname);
Antoine Pitrou0373a102014-10-13 20:19:45 +02005696 return NULL;
Brett Cannon3008bc02015-08-11 18:01:31 -07005697 }
Eric Snow3f9eee62017-09-15 16:35:20 -06005698 x = PyImport_GetModule(fullmodname);
Antoine Pitrou0373a102014-10-13 20:19:45 +02005699 Py_DECREF(fullmodname);
Victor Stinner438a12d2019-05-24 17:01:38 +02005700 if (x == NULL && !_PyErr_Occurred(tstate)) {
Brett Cannon3008bc02015-08-11 18:01:31 -07005701 goto error;
5702 }
Matthias Bussonnier1bc15642017-02-22 07:06:50 -08005703 Py_DECREF(pkgname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005704 return x;
Brett Cannon3008bc02015-08-11 18:01:31 -07005705 error:
Matthias Bussonnierbc4bed42017-02-14 16:05:25 -08005706 pkgpath = PyModule_GetFilenameObject(v);
Matthias Bussonnier1bc15642017-02-22 07:06:50 -08005707 if (pkgname == NULL) {
5708 pkgname_or_unknown = PyUnicode_FromString("<unknown module name>");
5709 if (pkgname_or_unknown == NULL) {
5710 Py_XDECREF(pkgpath);
5711 return NULL;
5712 }
5713 } else {
5714 pkgname_or_unknown = pkgname;
5715 }
Matthias Bussonnierbc4bed42017-02-14 16:05:25 -08005716
5717 if (pkgpath == NULL || !PyUnicode_Check(pkgpath)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005718 _PyErr_Clear(tstate);
Xiang Zhang4830f582017-03-21 11:13:42 +08005719 errmsg = PyUnicode_FromFormat(
5720 "cannot import name %R from %R (unknown location)",
5721 name, pkgname_or_unknown
5722 );
Stefan Krah027b09c2019-03-25 21:50:58 +01005723 /* NULL checks for errmsg and pkgname done by PyErr_SetImportError. */
Xiang Zhang4830f582017-03-21 11:13:42 +08005724 PyErr_SetImportError(errmsg, pkgname, NULL);
5725 }
5726 else {
Anthony Sottile65366bc2019-09-09 08:17:50 -07005727 _Py_IDENTIFIER(__spec__);
5728 PyObject *spec = _PyObject_GetAttrId(v, &PyId___spec__);
Anthony Sottile65366bc2019-09-09 08:17:50 -07005729 const char *fmt =
5730 _PyModuleSpec_IsInitializing(spec) ?
5731 "cannot import name %R from partially initialized module %R "
5732 "(most likely due to a circular import) (%S)" :
5733 "cannot import name %R from %R (%S)";
5734 Py_XDECREF(spec);
5735
5736 errmsg = PyUnicode_FromFormat(fmt, name, pkgname_or_unknown, pkgpath);
Stefan Krah027b09c2019-03-25 21:50:58 +01005737 /* NULL checks for errmsg and pkgname done by PyErr_SetImportError. */
Xiang Zhang4830f582017-03-21 11:13:42 +08005738 PyErr_SetImportError(errmsg, pkgname, pkgpath);
Matthias Bussonnierbc4bed42017-02-14 16:05:25 -08005739 }
5740
Xiang Zhang4830f582017-03-21 11:13:42 +08005741 Py_XDECREF(errmsg);
Matthias Bussonnier1bc15642017-02-22 07:06:50 -08005742 Py_XDECREF(pkgname_or_unknown);
5743 Py_XDECREF(pkgpath);
Brett Cannon3008bc02015-08-11 18:01:31 -07005744 return NULL;
Thomas Wouters52152252000-08-17 22:55:00 +00005745}
Guido van Rossumac7be682001-01-17 15:42:30 +00005746
Thomas Wouters52152252000-08-17 22:55:00 +00005747static int
Victor Stinner438a12d2019-05-24 17:01:38 +02005748import_all_from(PyThreadState *tstate, PyObject *locals, PyObject *v)
Thomas Wouters52152252000-08-17 22:55:00 +00005749{
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02005750 _Py_IDENTIFIER(__all__);
5751 _Py_IDENTIFIER(__dict__);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005752 PyObject *all, *dict, *name, *value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005753 int skip_leading_underscores = 0;
5754 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00005755
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005756 if (_PyObject_LookupAttrId(v, &PyId___all__, &all) < 0) {
5757 return -1; /* Unexpected error */
5758 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005759 if (all == NULL) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005760 if (_PyObject_LookupAttrId(v, &PyId___dict__, &dict) < 0) {
5761 return -1;
5762 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005763 if (dict == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005764 _PyErr_SetString(tstate, PyExc_ImportError,
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005765 "from-import-* object has no __dict__ and no __all__");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005766 return -1;
5767 }
5768 all = PyMapping_Keys(dict);
5769 Py_DECREF(dict);
5770 if (all == NULL)
5771 return -1;
5772 skip_leading_underscores = 1;
5773 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00005774
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005775 for (pos = 0, err = 0; ; pos++) {
5776 name = PySequence_GetItem(all, pos);
5777 if (name == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005778 if (!_PyErr_ExceptionMatches(tstate, PyExc_IndexError)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005779 err = -1;
Victor Stinner438a12d2019-05-24 17:01:38 +02005780 }
5781 else {
5782 _PyErr_Clear(tstate);
5783 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005784 break;
5785 }
Xiang Zhangd8b291a2018-03-24 18:39:36 +08005786 if (!PyUnicode_Check(name)) {
5787 PyObject *modname = _PyObject_GetAttrId(v, &PyId___name__);
5788 if (modname == NULL) {
5789 Py_DECREF(name);
5790 err = -1;
5791 break;
5792 }
5793 if (!PyUnicode_Check(modname)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005794 _PyErr_Format(tstate, PyExc_TypeError,
5795 "module __name__ must be a string, not %.100s",
5796 Py_TYPE(modname)->tp_name);
Xiang Zhangd8b291a2018-03-24 18:39:36 +08005797 }
5798 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02005799 _PyErr_Format(tstate, PyExc_TypeError,
5800 "%s in %U.%s must be str, not %.100s",
5801 skip_leading_underscores ? "Key" : "Item",
5802 modname,
5803 skip_leading_underscores ? "__dict__" : "__all__",
5804 Py_TYPE(name)->tp_name);
Xiang Zhangd8b291a2018-03-24 18:39:36 +08005805 }
5806 Py_DECREF(modname);
5807 Py_DECREF(name);
5808 err = -1;
5809 break;
5810 }
5811 if (skip_leading_underscores) {
Serhiy Storchakae3b2b4b2017-09-08 09:58:51 +03005812 if (PyUnicode_READY(name) == -1) {
5813 Py_DECREF(name);
5814 err = -1;
5815 break;
5816 }
5817 if (PyUnicode_READ_CHAR(name, 0) == '_') {
5818 Py_DECREF(name);
5819 continue;
5820 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005821 }
5822 value = PyObject_GetAttr(v, name);
5823 if (value == NULL)
5824 err = -1;
5825 else if (PyDict_CheckExact(locals))
5826 err = PyDict_SetItem(locals, name, value);
5827 else
5828 err = PyObject_SetItem(locals, name, value);
5829 Py_DECREF(name);
5830 Py_XDECREF(value);
5831 if (err != 0)
5832 break;
5833 }
5834 Py_DECREF(all);
5835 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00005836}
5837
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005838static int
Victor Stinner438a12d2019-05-24 17:01:38 +02005839check_args_iterable(PyThreadState *tstate, PyObject *func, PyObject *args)
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005840{
Victor Stinnera102ed72020-02-07 02:24:48 +01005841 if (Py_TYPE(args)->tp_iter == NULL && !PySequence_Check(args)) {
Jeroen Demeyerbf17d412019-11-05 16:48:04 +01005842 /* check_args_iterable() may be called with a live exception:
5843 * clear it to prevent calling _PyObject_FunctionStr() with an
5844 * exception set. */
Victor Stinner61f4db82020-01-28 03:37:45 +01005845 _PyErr_Clear(tstate);
Jeroen Demeyerbf17d412019-11-05 16:48:04 +01005846 PyObject *funcstr = _PyObject_FunctionStr(func);
5847 if (funcstr != NULL) {
5848 _PyErr_Format(tstate, PyExc_TypeError,
5849 "%U argument after * must be an iterable, not %.200s",
5850 funcstr, Py_TYPE(args)->tp_name);
5851 Py_DECREF(funcstr);
5852 }
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005853 return -1;
5854 }
5855 return 0;
5856}
5857
5858static void
Victor Stinner438a12d2019-05-24 17:01:38 +02005859format_kwargs_error(PyThreadState *tstate, PyObject *func, PyObject *kwargs)
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005860{
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005861 /* _PyDict_MergeEx raises attribute
5862 * error (percolated from an attempt
5863 * to get 'keys' attribute) instead of
5864 * a type error if its second argument
5865 * is not a mapping.
5866 */
Victor Stinner438a12d2019-05-24 17:01:38 +02005867 if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) {
Victor Stinner61f4db82020-01-28 03:37:45 +01005868 _PyErr_Clear(tstate);
Jeroen Demeyerbf17d412019-11-05 16:48:04 +01005869 PyObject *funcstr = _PyObject_FunctionStr(func);
5870 if (funcstr != NULL) {
5871 _PyErr_Format(
5872 tstate, PyExc_TypeError,
5873 "%U argument after ** must be a mapping, not %.200s",
5874 funcstr, Py_TYPE(kwargs)->tp_name);
5875 Py_DECREF(funcstr);
5876 }
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005877 }
Victor Stinner438a12d2019-05-24 17:01:38 +02005878 else if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005879 PyObject *exc, *val, *tb;
Victor Stinner438a12d2019-05-24 17:01:38 +02005880 _PyErr_Fetch(tstate, &exc, &val, &tb);
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005881 if (val && PyTuple_Check(val) && PyTuple_GET_SIZE(val) == 1) {
Victor Stinner61f4db82020-01-28 03:37:45 +01005882 _PyErr_Clear(tstate);
Jeroen Demeyerbf17d412019-11-05 16:48:04 +01005883 PyObject *funcstr = _PyObject_FunctionStr(func);
5884 if (funcstr != NULL) {
5885 PyObject *key = PyTuple_GET_ITEM(val, 0);
5886 _PyErr_Format(
5887 tstate, PyExc_TypeError,
5888 "%U got multiple values for keyword argument '%S'",
5889 funcstr, key);
5890 Py_DECREF(funcstr);
5891 }
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005892 Py_XDECREF(exc);
5893 Py_XDECREF(val);
5894 Py_XDECREF(tb);
5895 }
5896 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02005897 _PyErr_Restore(tstate, exc, val, tb);
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005898 }
5899 }
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005900}
5901
Guido van Rossumac7be682001-01-17 15:42:30 +00005902static void
Victor Stinner438a12d2019-05-24 17:01:38 +02005903format_exc_check_arg(PyThreadState *tstate, PyObject *exc,
5904 const char *format_str, PyObject *obj)
Paul Prescode68140d2000-08-30 20:25:01 +00005905{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005906 const char *obj_str;
Paul Prescode68140d2000-08-30 20:25:01 +00005907
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005908 if (!obj)
5909 return;
Paul Prescode68140d2000-08-30 20:25:01 +00005910
Serhiy Storchaka06515832016-11-20 09:13:07 +02005911 obj_str = PyUnicode_AsUTF8(obj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005912 if (!obj_str)
5913 return;
Paul Prescode68140d2000-08-30 20:25:01 +00005914
Victor Stinner438a12d2019-05-24 17:01:38 +02005915 _PyErr_Format(tstate, exc, format_str, obj_str);
Paul Prescode68140d2000-08-30 20:25:01 +00005916}
Guido van Rossum950361c1997-01-24 13:49:28 +00005917
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005918static void
Victor Stinner438a12d2019-05-24 17:01:38 +02005919format_exc_unbound(PyThreadState *tstate, PyCodeObject *co, int oparg)
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005920{
5921 PyObject *name;
5922 /* Don't stomp existing exception */
Victor Stinner438a12d2019-05-24 17:01:38 +02005923 if (_PyErr_Occurred(tstate))
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005924 return;
5925 if (oparg < PyTuple_GET_SIZE(co->co_cellvars)) {
5926 name = PyTuple_GET_ITEM(co->co_cellvars,
5927 oparg);
Victor Stinner438a12d2019-05-24 17:01:38 +02005928 format_exc_check_arg(tstate,
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005929 PyExc_UnboundLocalError,
5930 UNBOUNDLOCAL_ERROR_MSG,
5931 name);
5932 } else {
5933 name = PyTuple_GET_ITEM(co->co_freevars, oparg -
5934 PyTuple_GET_SIZE(co->co_cellvars));
Victor Stinner438a12d2019-05-24 17:01:38 +02005935 format_exc_check_arg(tstate, PyExc_NameError,
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005936 UNBOUNDFREE_ERROR_MSG, name);
5937 }
5938}
5939
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03005940static void
Mark Shannonfee55262019-11-21 09:11:43 +00005941format_awaitable_error(PyThreadState *tstate, PyTypeObject *type, int prevprevopcode, int prevopcode)
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03005942{
5943 if (type->tp_as_async == NULL || type->tp_as_async->am_await == NULL) {
5944 if (prevopcode == BEFORE_ASYNC_WITH) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005945 _PyErr_Format(tstate, PyExc_TypeError,
5946 "'async with' received an object from __aenter__ "
5947 "that does not implement __await__: %.100s",
5948 type->tp_name);
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03005949 }
Mark Shannonfee55262019-11-21 09:11:43 +00005950 else if (prevopcode == WITH_EXCEPT_START || (prevopcode == CALL_FUNCTION && prevprevopcode == DUP_TOP)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005951 _PyErr_Format(tstate, PyExc_TypeError,
5952 "'async with' received an object from __aexit__ "
5953 "that does not implement __await__: %.100s",
5954 type->tp_name);
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03005955 }
5956 }
5957}
5958
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005959static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02005960unicode_concatenate(PyThreadState *tstate, PyObject *v, PyObject *w,
Serhiy Storchakaab874002016-09-11 13:48:15 +03005961 PyFrameObject *f, const _Py_CODEUNIT *next_instr)
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005962{
5963 PyObject *res;
5964 if (Py_REFCNT(v) == 2) {
5965 /* In the common case, there are 2 references to the value
5966 * stored in 'variable' when the += is performed: one on the
5967 * value stack (in 'v') and one still stored in the
5968 * 'variable'. We try to delete the variable now to reduce
5969 * the refcnt to 1.
5970 */
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03005971 int opcode, oparg;
5972 NEXTOPARG();
5973 switch (opcode) {
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005974 case STORE_FAST:
5975 {
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005976 PyObject **fastlocals = f->f_localsplus;
5977 if (GETLOCAL(oparg) == v)
5978 SETLOCAL(oparg, NULL);
5979 break;
5980 }
5981 case STORE_DEREF:
5982 {
5983 PyObject **freevars = (f->f_localsplus +
5984 f->f_code->co_nlocals);
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03005985 PyObject *c = freevars[oparg];
Raymond Hettingerc32f9db2016-11-12 04:10:35 -05005986 if (PyCell_GET(c) == v) {
5987 PyCell_SET(c, NULL);
5988 Py_DECREF(v);
5989 }
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005990 break;
5991 }
5992 case STORE_NAME:
5993 {
5994 PyObject *names = f->f_code->co_names;
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03005995 PyObject *name = GETITEM(names, oparg);
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005996 PyObject *locals = f->f_locals;
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02005997 if (locals && PyDict_CheckExact(locals)) {
5998 PyObject *w = PyDict_GetItemWithError(locals, name);
5999 if ((w == v && PyDict_DelItem(locals, name) != 0) ||
Victor Stinner438a12d2019-05-24 17:01:38 +02006000 (w == NULL && _PyErr_Occurred(tstate)))
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02006001 {
6002 Py_DECREF(v);
6003 return NULL;
Victor Stinnerd2a915d2011-10-02 20:34:20 +02006004 }
6005 }
6006 break;
6007 }
6008 }
6009 }
6010 res = v;
6011 PyUnicode_Append(&res, w);
6012 return res;
6013}
6014
Guido van Rossum950361c1997-01-24 13:49:28 +00006015#ifdef DYNAMIC_EXECUTION_PROFILE
6016
Skip Montanarof118cb12001-10-15 20:51:38 +00006017static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00006018getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00006019{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006020 int i;
6021 PyObject *l = PyList_New(256);
6022 if (l == NULL) return NULL;
6023 for (i = 0; i < 256; i++) {
6024 PyObject *x = PyLong_FromLong(a[i]);
6025 if (x == NULL) {
6026 Py_DECREF(l);
6027 return NULL;
6028 }
Zackery Spytz99d56b52018-12-08 07:16:55 -07006029 PyList_SET_ITEM(l, i, x);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006030 }
6031 for (i = 0; i < 256; i++)
6032 a[i] = 0;
6033 return l;
Guido van Rossum950361c1997-01-24 13:49:28 +00006034}
6035
6036PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00006037_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00006038{
6039#ifndef DXPAIRS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006040 return getarray(dxp);
Guido van Rossum950361c1997-01-24 13:49:28 +00006041#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006042 int i;
6043 PyObject *l = PyList_New(257);
6044 if (l == NULL) return NULL;
6045 for (i = 0; i < 257; i++) {
6046 PyObject *x = getarray(dxpairs[i]);
6047 if (x == NULL) {
6048 Py_DECREF(l);
6049 return NULL;
6050 }
Zackery Spytz99d56b52018-12-08 07:16:55 -07006051 PyList_SET_ITEM(l, i, x);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006052 }
6053 return l;
Guido van Rossum950361c1997-01-24 13:49:28 +00006054#endif
6055}
6056
6057#endif
Brett Cannon5c4de282016-09-07 11:16:41 -07006058
6059Py_ssize_t
6060_PyEval_RequestCodeExtraIndex(freefunc free)
6061{
Victor Stinner81a7be32020-04-14 15:14:01 +02006062 PyInterpreterState *interp = _PyInterpreterState_GET();
Brett Cannon5c4de282016-09-07 11:16:41 -07006063 Py_ssize_t new_index;
6064
Dino Viehlandf3cffd22017-06-21 14:44:36 -07006065 if (interp->co_extra_user_count == MAX_CO_EXTRA_USERS - 1) {
Brett Cannon5c4de282016-09-07 11:16:41 -07006066 return -1;
6067 }
Dino Viehlandf3cffd22017-06-21 14:44:36 -07006068 new_index = interp->co_extra_user_count++;
6069 interp->co_extra_freefuncs[new_index] = free;
Brett Cannon5c4de282016-09-07 11:16:41 -07006070 return new_index;
6071}
Łukasz Langaa785c872016-09-09 17:37:37 -07006072
6073static void
6074dtrace_function_entry(PyFrameObject *f)
6075{
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02006076 const char *filename;
6077 const char *funcname;
Łukasz Langaa785c872016-09-09 17:37:37 -07006078 int lineno;
6079
Victor Stinner6d86a232020-04-29 00:56:58 +02006080 PyCodeObject *code = f->f_code;
6081 filename = PyUnicode_AsUTF8(code->co_filename);
6082 funcname = PyUnicode_AsUTF8(code->co_name);
6083 lineno = PyCode_Addr2Line(code, f->f_lasti);
Łukasz Langaa785c872016-09-09 17:37:37 -07006084
Andy Lestere6be9b52020-02-11 20:28:35 -06006085 PyDTrace_FUNCTION_ENTRY(filename, funcname, lineno);
Łukasz Langaa785c872016-09-09 17:37:37 -07006086}
6087
6088static void
6089dtrace_function_return(PyFrameObject *f)
6090{
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02006091 const char *filename;
6092 const char *funcname;
Łukasz Langaa785c872016-09-09 17:37:37 -07006093 int lineno;
6094
Victor Stinner6d86a232020-04-29 00:56:58 +02006095 PyCodeObject *code = f->f_code;
6096 filename = PyUnicode_AsUTF8(code->co_filename);
6097 funcname = PyUnicode_AsUTF8(code->co_name);
6098 lineno = PyCode_Addr2Line(code, f->f_lasti);
Łukasz Langaa785c872016-09-09 17:37:37 -07006099
Andy Lestere6be9b52020-02-11 20:28:35 -06006100 PyDTrace_FUNCTION_RETURN(filename, funcname, lineno);
Łukasz Langaa785c872016-09-09 17:37:37 -07006101}
6102
6103/* DTrace equivalent of maybe_call_line_trace. */
6104static void
6105maybe_dtrace_line(PyFrameObject *frame,
Mark Shannon877df852020-11-12 09:43:29 +00006106 PyCodeAddressRange *bounds, int *instr_prev)
Łukasz Langaa785c872016-09-09 17:37:37 -07006107{
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02006108 const char *co_filename, *co_name;
Łukasz Langaa785c872016-09-09 17:37:37 -07006109
6110 /* If the last instruction executed isn't in the current
6111 instruction window, reset the window.
6112 */
Mark Shannon877df852020-11-12 09:43:29 +00006113 int line = _PyCode_CheckLineNumber(frame->f_lasti, bounds);
Łukasz Langaa785c872016-09-09 17:37:37 -07006114 /* If the last instruction falls at the start of a line or if
6115 it represents a jump backwards, update the frame's line
6116 number and call the trace function. */
Mark Shannon877df852020-11-12 09:43:29 +00006117 if (line != frame->f_lineno || frame->f_lasti < *instr_prev) {
6118 if (line != -1) {
6119 frame->f_lineno = line;
6120 co_filename = PyUnicode_AsUTF8(frame->f_code->co_filename);
6121 if (!co_filename)
6122 co_filename = "?";
6123 co_name = PyUnicode_AsUTF8(frame->f_code->co_name);
6124 if (!co_name)
6125 co_name = "?";
6126 PyDTrace_LINE(co_filename, co_name, line);
6127 }
Łukasz Langaa785c872016-09-09 17:37:37 -07006128 }
6129 *instr_prev = frame->f_lasti;
6130}
Victor Stinnerf4b1e3d2019-11-04 19:48:34 +01006131
6132
6133/* Implement Py_EnterRecursiveCall() and Py_LeaveRecursiveCall() as functions
6134 for the limited API. */
6135
6136#undef Py_EnterRecursiveCall
6137
6138int Py_EnterRecursiveCall(const char *where)
6139{
Victor Stinnerbe434dc2019-11-05 00:51:22 +01006140 return _Py_EnterRecursiveCall_inline(where);
Victor Stinnerf4b1e3d2019-11-04 19:48:34 +01006141}
6142
6143#undef Py_LeaveRecursiveCall
6144
6145void Py_LeaveRecursiveCall(void)
6146{
Victor Stinnerbe434dc2019-11-05 00:51:22 +01006147 _Py_LeaveRecursiveCall_inline();
Victor Stinnerf4b1e3d2019-11-04 19:48:34 +01006148}