blob: e2b2d211fb34089e30650edd6372b9e7681c4387 [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;
3217 la->hint = _PyDict_GetItemHint((PyDictObject*)dict, name, hint, &res);
3218
3219 if (res != NULL) {
3220 if (la->hint == hint && hint >= 0) {
3221 // Our hint has helped -- cache hit.
3222 OPCACHE_STAT_ATTR_HIT();
3223 } else {
3224 // The hint we provided didn't work.
3225 // Maybe next time?
3226 OPCACHE_MAYBE_DEOPT_LOAD_ATTR();
3227 }
3228
3229 Py_INCREF(res);
3230 SET_TOP(res);
3231 Py_DECREF(owner);
3232 Py_DECREF(dict);
3233 DISPATCH();
3234 } else {
3235 // This attribute can be missing sometimes;
3236 // we don't want to optimize this lookup.
3237 OPCACHE_DEOPT_LOAD_ATTR();
3238 Py_DECREF(dict);
3239 }
3240 } else {
3241 // There is no dict, or __dict__ doesn't satisfy PyDict_CheckExact.
3242 OPCACHE_DEOPT_LOAD_ATTR();
3243 }
Pablo Galindo109826c2020-10-20 06:22:44 +01003244 }
3245 } else {
3246 // The type of the object has either been updated,
3247 // or is different. Maybe it will stabilize?
3248 OPCACHE_MAYBE_DEOPT_LOAD_ATTR();
3249 }
Pablo Galindo109826c2020-10-20 06:22:44 +01003250 OPCACHE_STAT_ATTR_MISS();
3251 }
3252
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003253 if (co_opcache != NULL && // co_opcache can be NULL after a DEOPT() call.
Pablo Galindo109826c2020-10-20 06:22:44 +01003254 type->tp_getattro == PyObject_GenericGetAttr)
3255 {
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003256 if (type->tp_dict == NULL) {
3257 if (PyType_Ready(type) < 0) {
3258 Py_DECREF(owner);
3259 SET_TOP(NULL);
3260 goto error;
Pablo Galindo109826c2020-10-20 06:22:44 +01003261 }
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003262 }
3263 PyObject *descr = _PyType_Lookup(type, name);
3264 if (descr != NULL) {
3265 // We found an attribute with a data-like descriptor.
3266 PyTypeObject *dtype = Py_TYPE(descr);
3267 if (dtype == &PyMemberDescr_Type) { // It's a slot
3268 PyMemberDescrObject *member = (PyMemberDescrObject *)descr;
3269 struct PyMemberDef *dmem = member->d_member;
3270 if (dmem->type == T_OBJECT_EX) {
3271 Py_ssize_t offset = dmem->offset;
3272 assert(offset > 0); // 0 would be confused with dict hint == -1 (miss).
Pablo Galindo109826c2020-10-20 06:22:44 +01003273
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003274 if (co_opcache->optimized == 0) {
3275 // First time we optimize this opcode.
3276 OPCACHE_STAT_ATTR_OPT();
3277 co_opcache->optimized = OPCODE_CACHE_MAX_TRIES;
3278 // fprintf(stderr, "Setting hint for %s, offset %zd\n", dmem->name, offset);
3279 }
3280
3281 la = &co_opcache->u.la;
3282 la->type = type;
3283 la->tp_version_tag = type->tp_version_tag;
3284 la->hint = ~offset;
3285
3286 char *addr = (char *)owner + offset;
3287 res = *(PyObject **)addr;
Pablo Galindo109826c2020-10-20 06:22:44 +01003288 if (res != NULL) {
3289 Py_INCREF(res);
Pablo Galindo109826c2020-10-20 06:22:44 +01003290 Py_DECREF(owner);
3291 SET_TOP(res);
3292
Pablo Galindo109826c2020-10-20 06:22:44 +01003293 DISPATCH();
3294 }
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003295 // Else slot is NULL. Fall through to slow path to raise AttributeError(name).
Pablo Galindo109826c2020-10-20 06:22:44 +01003296 }
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003297 // Else it's a slot of a different type. We don't handle those.
3298 }
3299 // Else it's some other kind of descriptor that we don't handle.
3300 OPCACHE_DEOPT_LOAD_ATTR();
3301 } else if (type->tp_dictoffset > 0) {
3302 // We found an instance with a __dict__.
3303 dictptr = (PyObject **) ((char *)owner + type->tp_dictoffset);
3304 dict = *dictptr;
3305
3306 if (dict != NULL && PyDict_CheckExact(dict)) {
3307 Py_INCREF(dict);
3308 res = NULL;
3309 Py_ssize_t hint = _PyDict_GetItemHint((PyDictObject*)dict, name, -1, &res);
3310 if (res != NULL) {
3311 Py_INCREF(res);
3312 Py_DECREF(dict);
3313 Py_DECREF(owner);
3314 SET_TOP(res);
3315
3316 if (co_opcache->optimized == 0) {
3317 // First time we optimize this opcode.
3318 OPCACHE_STAT_ATTR_OPT();
3319 co_opcache->optimized = OPCODE_CACHE_MAX_TRIES;
3320 }
3321
3322 la = &co_opcache->u.la;
3323 la->type = type;
3324 la->tp_version_tag = type->tp_version_tag;
3325 la->hint = hint;
3326
3327 DISPATCH();
3328 }
3329 Py_DECREF(dict);
Pablo Galindo109826c2020-10-20 06:22:44 +01003330 } else {
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003331 // There is no dict, or __dict__ doesn't satisfy PyDict_CheckExact.
Pablo Galindo109826c2020-10-20 06:22:44 +01003332 OPCACHE_DEOPT_LOAD_ATTR();
3333 }
3334 } else {
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003335 // The object's class does not have a tp_dictoffset we can use.
Pablo Galindo109826c2020-10-20 06:22:44 +01003336 OPCACHE_DEOPT_LOAD_ATTR();
3337 }
3338 } else if (type->tp_getattro != PyObject_GenericGetAttr) {
3339 OPCACHE_DEOPT_LOAD_ATTR();
3340 }
3341 }
3342
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003343 // Slow path.
Pablo Galindo109826c2020-10-20 06:22:44 +01003344 res = PyObject_GetAttr(owner, name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003345 Py_DECREF(owner);
3346 SET_TOP(res);
3347 if (res == NULL)
3348 goto error;
3349 DISPATCH();
3350 }
3351
Benjamin Petersonddd19492018-09-16 22:38:02 -07003352 case TARGET(COMPARE_OP): {
Mark Shannon9af0e472020-01-14 10:12:45 +00003353 assert(oparg <= Py_GE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003354 PyObject *right = POP();
3355 PyObject *left = TOP();
Mark Shannon9af0e472020-01-14 10:12:45 +00003356 PyObject *res = PyObject_RichCompare(left, right, oparg);
3357 SET_TOP(res);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003358 Py_DECREF(left);
3359 Py_DECREF(right);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003360 if (res == NULL)
3361 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003362 PREDICT(POP_JUMP_IF_FALSE);
3363 PREDICT(POP_JUMP_IF_TRUE);
3364 DISPATCH();
Victor Stinner3c1e4812012-03-26 22:10:51 +02003365 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003366
Mark Shannon9af0e472020-01-14 10:12:45 +00003367 case TARGET(IS_OP): {
3368 PyObject *right = POP();
3369 PyObject *left = TOP();
3370 int res = (left == right)^oparg;
3371 PyObject *b = res ? Py_True : Py_False;
3372 Py_INCREF(b);
3373 SET_TOP(b);
3374 Py_DECREF(left);
3375 Py_DECREF(right);
3376 PREDICT(POP_JUMP_IF_FALSE);
3377 PREDICT(POP_JUMP_IF_TRUE);
3378 FAST_DISPATCH();
3379 }
3380
3381 case TARGET(CONTAINS_OP): {
3382 PyObject *right = POP();
3383 PyObject *left = POP();
3384 int res = PySequence_Contains(right, left);
3385 Py_DECREF(left);
3386 Py_DECREF(right);
3387 if (res < 0) {
3388 goto error;
3389 }
3390 PyObject *b = (res^oparg) ? Py_True : Py_False;
3391 Py_INCREF(b);
3392 PUSH(b);
3393 PREDICT(POP_JUMP_IF_FALSE);
3394 PREDICT(POP_JUMP_IF_TRUE);
3395 FAST_DISPATCH();
3396 }
3397
3398#define CANNOT_CATCH_MSG "catching classes that do not inherit from "\
3399 "BaseException is not allowed"
3400
3401 case TARGET(JUMP_IF_NOT_EXC_MATCH): {
3402 PyObject *right = POP();
3403 PyObject *left = POP();
3404 if (PyTuple_Check(right)) {
3405 Py_ssize_t i, length;
3406 length = PyTuple_GET_SIZE(right);
3407 for (i = 0; i < length; i++) {
3408 PyObject *exc = PyTuple_GET_ITEM(right, i);
3409 if (!PyExceptionClass_Check(exc)) {
3410 _PyErr_SetString(tstate, PyExc_TypeError,
3411 CANNOT_CATCH_MSG);
3412 Py_DECREF(left);
3413 Py_DECREF(right);
3414 goto error;
3415 }
3416 }
3417 }
3418 else {
3419 if (!PyExceptionClass_Check(right)) {
3420 _PyErr_SetString(tstate, PyExc_TypeError,
3421 CANNOT_CATCH_MSG);
3422 Py_DECREF(left);
3423 Py_DECREF(right);
3424 goto error;
3425 }
3426 }
3427 int res = PyErr_GivenExceptionMatches(left, right);
3428 Py_DECREF(left);
3429 Py_DECREF(right);
3430 if (res > 0) {
3431 /* Exception matches -- Do nothing */;
3432 }
3433 else if (res == 0) {
3434 JUMPTO(oparg);
3435 }
3436 else {
3437 goto error;
3438 }
3439 DISPATCH();
3440 }
3441
Benjamin Petersonddd19492018-09-16 22:38:02 -07003442 case TARGET(IMPORT_NAME): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003443 PyObject *name = GETITEM(names, oparg);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03003444 PyObject *fromlist = POP();
3445 PyObject *level = TOP();
3446 PyObject *res;
Victor Stinner438a12d2019-05-24 17:01:38 +02003447 res = import_name(tstate, f, name, fromlist, level);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03003448 Py_DECREF(level);
3449 Py_DECREF(fromlist);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003450 SET_TOP(res);
3451 if (res == NULL)
3452 goto error;
3453 DISPATCH();
3454 }
3455
Benjamin Petersonddd19492018-09-16 22:38:02 -07003456 case TARGET(IMPORT_STAR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003457 PyObject *from = POP(), *locals;
3458 int err;
Matthias Bussonnier160edb42017-02-25 21:58:05 -08003459 if (PyFrame_FastToLocalsWithError(f) < 0) {
3460 Py_DECREF(from);
Victor Stinner41bb43a2013-10-29 01:19:37 +01003461 goto error;
Matthias Bussonnier160edb42017-02-25 21:58:05 -08003462 }
Victor Stinner41bb43a2013-10-29 01:19:37 +01003463
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003464 locals = f->f_locals;
3465 if (locals == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003466 _PyErr_SetString(tstate, PyExc_SystemError,
3467 "no locals found during 'import *'");
Matthias Bussonnier160edb42017-02-25 21:58:05 -08003468 Py_DECREF(from);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003469 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003470 }
Victor Stinner438a12d2019-05-24 17:01:38 +02003471 err = import_all_from(tstate, locals, from);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003472 PyFrame_LocalsToFast(f, 0);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003473 Py_DECREF(from);
3474 if (err != 0)
3475 goto error;
3476 DISPATCH();
3477 }
Guido van Rossum25831651993-05-19 14:50:45 +00003478
Benjamin Petersonddd19492018-09-16 22:38:02 -07003479 case TARGET(IMPORT_FROM): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003480 PyObject *name = GETITEM(names, oparg);
3481 PyObject *from = TOP();
3482 PyObject *res;
Victor Stinner438a12d2019-05-24 17:01:38 +02003483 res = import_from(tstate, from, name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003484 PUSH(res);
3485 if (res == NULL)
3486 goto error;
3487 DISPATCH();
3488 }
Thomas Wouters52152252000-08-17 22:55:00 +00003489
Benjamin Petersonddd19492018-09-16 22:38:02 -07003490 case TARGET(JUMP_FORWARD): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003491 JUMPBY(oparg);
3492 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003493 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003494
Benjamin Petersonddd19492018-09-16 22:38:02 -07003495 case TARGET(POP_JUMP_IF_FALSE): {
3496 PREDICTED(POP_JUMP_IF_FALSE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003497 PyObject *cond = POP();
3498 int err;
3499 if (cond == Py_True) {
3500 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003501 FAST_DISPATCH();
3502 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003503 if (cond == Py_False) {
3504 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003505 JUMPTO(oparg);
3506 FAST_DISPATCH();
3507 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003508 err = PyObject_IsTrue(cond);
3509 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003510 if (err > 0)
Adrian Wielgosik50c28502017-06-23 13:35:41 -07003511 ;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003512 else if (err == 0)
3513 JUMPTO(oparg);
3514 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003515 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003516 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003517 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003518
Benjamin Petersonddd19492018-09-16 22:38:02 -07003519 case TARGET(POP_JUMP_IF_TRUE): {
3520 PREDICTED(POP_JUMP_IF_TRUE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003521 PyObject *cond = POP();
3522 int err;
3523 if (cond == Py_False) {
3524 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003525 FAST_DISPATCH();
3526 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003527 if (cond == Py_True) {
3528 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003529 JUMPTO(oparg);
3530 FAST_DISPATCH();
3531 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003532 err = PyObject_IsTrue(cond);
3533 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003534 if (err > 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003535 JUMPTO(oparg);
3536 }
3537 else if (err == 0)
3538 ;
3539 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003540 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003541 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003542 }
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00003543
Benjamin Petersonddd19492018-09-16 22:38:02 -07003544 case TARGET(JUMP_IF_FALSE_OR_POP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003545 PyObject *cond = TOP();
3546 int err;
3547 if (cond == Py_True) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003548 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003549 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003550 FAST_DISPATCH();
3551 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003552 if (cond == Py_False) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003553 JUMPTO(oparg);
3554 FAST_DISPATCH();
3555 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003556 err = PyObject_IsTrue(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003557 if (err > 0) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003558 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003559 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003560 }
3561 else if (err == 0)
3562 JUMPTO(oparg);
3563 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003564 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003565 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003566 }
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00003567
Benjamin Petersonddd19492018-09-16 22:38:02 -07003568 case TARGET(JUMP_IF_TRUE_OR_POP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003569 PyObject *cond = TOP();
3570 int err;
3571 if (cond == Py_False) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003572 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003573 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003574 FAST_DISPATCH();
3575 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003576 if (cond == Py_True) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003577 JUMPTO(oparg);
3578 FAST_DISPATCH();
3579 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003580 err = PyObject_IsTrue(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003581 if (err > 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003582 JUMPTO(oparg);
3583 }
3584 else if (err == 0) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003585 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003586 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003587 }
3588 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003589 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003590 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003591 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003592
Benjamin Petersonddd19492018-09-16 22:38:02 -07003593 case TARGET(JUMP_ABSOLUTE): {
3594 PREDICTED(JUMP_ABSOLUTE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003595 JUMPTO(oparg);
Guido van Rossum58da9312007-11-10 23:39:45 +00003596#if FAST_LOOPS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003597 /* Enabling this path speeds-up all while and for-loops by bypassing
3598 the per-loop checks for signals. By default, this should be turned-off
3599 because it prevents detection of a control-break in tight loops like
3600 "while 1: pass". Compile with this option turned-on when you need
3601 the speed-up and do not need break checking inside tight loops (ones
3602 that contain only instructions ending with FAST_DISPATCH).
3603 */
3604 FAST_DISPATCH();
Guido van Rossum58da9312007-11-10 23:39:45 +00003605#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003606 DISPATCH();
Guido van Rossum58da9312007-11-10 23:39:45 +00003607#endif
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003608 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003609
Benjamin Petersonddd19492018-09-16 22:38:02 -07003610 case TARGET(GET_ITER): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003611 /* before: [obj]; after [getiter(obj)] */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003612 PyObject *iterable = TOP();
Yury Selivanov5376ba92015-06-22 12:19:30 -04003613 PyObject *iter = PyObject_GetIter(iterable);
3614 Py_DECREF(iterable);
3615 SET_TOP(iter);
3616 if (iter == NULL)
3617 goto error;
3618 PREDICT(FOR_ITER);
Serhiy Storchakada9c5132016-06-27 18:58:57 +03003619 PREDICT(CALL_FUNCTION);
Yury Selivanov5376ba92015-06-22 12:19:30 -04003620 DISPATCH();
3621 }
3622
Benjamin Petersonddd19492018-09-16 22:38:02 -07003623 case TARGET(GET_YIELD_FROM_ITER): {
Yury Selivanov5376ba92015-06-22 12:19:30 -04003624 /* before: [obj]; after [getiter(obj)] */
3625 PyObject *iterable = TOP();
Yury Selivanov75445082015-05-11 22:57:16 -04003626 PyObject *iter;
Yury Selivanov5376ba92015-06-22 12:19:30 -04003627 if (PyCoro_CheckExact(iterable)) {
3628 /* `iterable` is a coroutine */
3629 if (!(co->co_flags & (CO_COROUTINE | CO_ITERABLE_COROUTINE))) {
3630 /* and it is used in a 'yield from' expression of a
3631 regular generator. */
3632 Py_DECREF(iterable);
3633 SET_TOP(NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02003634 _PyErr_SetString(tstate, PyExc_TypeError,
3635 "cannot 'yield from' a coroutine object "
3636 "in a non-coroutine generator");
Yury Selivanov5376ba92015-06-22 12:19:30 -04003637 goto error;
3638 }
3639 }
3640 else if (!PyGen_CheckExact(iterable)) {
Yury Selivanov75445082015-05-11 22:57:16 -04003641 /* `iterable` is not a generator. */
3642 iter = PyObject_GetIter(iterable);
3643 Py_DECREF(iterable);
3644 SET_TOP(iter);
3645 if (iter == NULL)
3646 goto error;
3647 }
Serhiy Storchakada9c5132016-06-27 18:58:57 +03003648 PREDICT(LOAD_CONST);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003649 DISPATCH();
3650 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003651
Benjamin Petersonddd19492018-09-16 22:38:02 -07003652 case TARGET(FOR_ITER): {
3653 PREDICTED(FOR_ITER);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003654 /* before: [iter]; after: [iter, iter()] *or* [] */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003655 PyObject *iter = TOP();
Victor Stinnera102ed72020-02-07 02:24:48 +01003656 PyObject *next = (*Py_TYPE(iter)->tp_iternext)(iter);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003657 if (next != NULL) {
3658 PUSH(next);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003659 PREDICT(STORE_FAST);
3660 PREDICT(UNPACK_SEQUENCE);
3661 DISPATCH();
3662 }
Victor Stinner438a12d2019-05-24 17:01:38 +02003663 if (_PyErr_Occurred(tstate)) {
3664 if (!_PyErr_ExceptionMatches(tstate, PyExc_StopIteration)) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003665 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02003666 }
3667 else if (tstate->c_tracefunc != NULL) {
Mark Shannon86433452021-01-07 16:49:02 +00003668 call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj, tstate, f, &bounds);
Victor Stinner438a12d2019-05-24 17:01:38 +02003669 }
3670 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003671 }
3672 /* iterator ended normally */
costypetrisor8ed317f2018-07-31 20:55:14 +00003673 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003674 Py_DECREF(iter);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003675 JUMPBY(oparg);
3676 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003677 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003678
Benjamin Petersonddd19492018-09-16 22:38:02 -07003679 case TARGET(SETUP_FINALLY): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003680 PyFrame_BlockSetup(f, SETUP_FINALLY, INSTR_OFFSET() + oparg,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003681 STACK_LEVEL());
3682 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003683 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003684
Benjamin Petersonddd19492018-09-16 22:38:02 -07003685 case TARGET(BEFORE_ASYNC_WITH): {
Yury Selivanov75445082015-05-11 22:57:16 -04003686 _Py_IDENTIFIER(__aenter__);
Géry Ogam1d1b97a2020-01-14 12:58:29 +01003687 _Py_IDENTIFIER(__aexit__);
Yury Selivanov75445082015-05-11 22:57:16 -04003688 PyObject *mgr = TOP();
Géry Ogam1d1b97a2020-01-14 12:58:29 +01003689 PyObject *enter = special_lookup(tstate, mgr, &PyId___aenter__);
Yury Selivanov75445082015-05-11 22:57:16 -04003690 PyObject *res;
Géry Ogam1d1b97a2020-01-14 12:58:29 +01003691 if (enter == NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04003692 goto error;
Géry Ogam1d1b97a2020-01-14 12:58:29 +01003693 }
3694 PyObject *exit = special_lookup(tstate, mgr, &PyId___aexit__);
3695 if (exit == NULL) {
3696 Py_DECREF(enter);
3697 goto error;
3698 }
Yury Selivanov75445082015-05-11 22:57:16 -04003699 SET_TOP(exit);
Yury Selivanov75445082015-05-11 22:57:16 -04003700 Py_DECREF(mgr);
Victor Stinnerf17c3de2016-12-06 18:46:19 +01003701 res = _PyObject_CallNoArg(enter);
Yury Selivanov75445082015-05-11 22:57:16 -04003702 Py_DECREF(enter);
3703 if (res == NULL)
3704 goto error;
3705 PUSH(res);
Serhiy Storchakada9c5132016-06-27 18:58:57 +03003706 PREDICT(GET_AWAITABLE);
Yury Selivanov75445082015-05-11 22:57:16 -04003707 DISPATCH();
3708 }
3709
Benjamin Petersonddd19492018-09-16 22:38:02 -07003710 case TARGET(SETUP_ASYNC_WITH): {
Yury Selivanov75445082015-05-11 22:57:16 -04003711 PyObject *res = POP();
3712 /* Setup the finally block before pushing the result
3713 of __aenter__ on the stack. */
3714 PyFrame_BlockSetup(f, SETUP_FINALLY, INSTR_OFFSET() + oparg,
3715 STACK_LEVEL());
3716 PUSH(res);
3717 DISPATCH();
3718 }
3719
Benjamin Petersonddd19492018-09-16 22:38:02 -07003720 case TARGET(SETUP_WITH): {
Benjamin Petersonce798522012-01-22 11:24:29 -05003721 _Py_IDENTIFIER(__enter__);
Géry Ogam1d1b97a2020-01-14 12:58:29 +01003722 _Py_IDENTIFIER(__exit__);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003723 PyObject *mgr = TOP();
Victor Stinner438a12d2019-05-24 17:01:38 +02003724 PyObject *enter = special_lookup(tstate, mgr, &PyId___enter__);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003725 PyObject *res;
Victor Stinner438a12d2019-05-24 17:01:38 +02003726 if (enter == NULL) {
Raymond Hettingera3fec152016-11-21 17:24:23 -08003727 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02003728 }
3729 PyObject *exit = special_lookup(tstate, mgr, &PyId___exit__);
Raymond Hettinger64e2f9a2016-11-22 11:50:40 -08003730 if (exit == NULL) {
3731 Py_DECREF(enter);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003732 goto error;
Raymond Hettinger64e2f9a2016-11-22 11:50:40 -08003733 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003734 SET_TOP(exit);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003735 Py_DECREF(mgr);
Victor Stinnerf17c3de2016-12-06 18:46:19 +01003736 res = _PyObject_CallNoArg(enter);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003737 Py_DECREF(enter);
3738 if (res == NULL)
3739 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003740 /* Setup the finally block before pushing the result
3741 of __enter__ on the stack. */
3742 PyFrame_BlockSetup(f, SETUP_FINALLY, INSTR_OFFSET() + oparg,
3743 STACK_LEVEL());
Benjamin Peterson876b2f22009-06-28 03:18:59 +00003744
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003745 PUSH(res);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003746 DISPATCH();
3747 }
Benjamin Peterson876b2f22009-06-28 03:18:59 +00003748
Mark Shannonfee55262019-11-21 09:11:43 +00003749 case TARGET(WITH_EXCEPT_START): {
3750 /* At the top of the stack are 7 values:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003751 - (TOP, SECOND, THIRD) = exc_info()
Mark Shannonfee55262019-11-21 09:11:43 +00003752 - (FOURTH, FIFTH, SIXTH) = previous exception for EXCEPT_HANDLER
3753 - SEVENTH: the context.__exit__ bound method
3754 We call SEVENTH(TOP, SECOND, THIRD).
3755 Then we push again the TOP exception and the __exit__
3756 return value.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003757 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003758 PyObject *exit_func;
Victor Stinner842cfff2016-12-01 14:45:31 +01003759 PyObject *exc, *val, *tb, *res;
3760
Victor Stinner842cfff2016-12-01 14:45:31 +01003761 exc = TOP();
Mark Shannonfee55262019-11-21 09:11:43 +00003762 val = SECOND();
3763 tb = THIRD();
3764 assert(exc != Py_None);
3765 assert(!PyLong_Check(exc));
3766 exit_func = PEEK(7);
Jeroen Demeyer469d1a72019-07-03 12:52:21 +02003767 PyObject *stack[4] = {NULL, exc, val, tb};
Petr Viktorinffd97532020-02-11 17:46:57 +01003768 res = PyObject_Vectorcall(exit_func, stack + 1,
Jeroen Demeyer469d1a72019-07-03 12:52:21 +02003769 3 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003770 if (res == NULL)
3771 goto error;
Amaury Forgeot d'Arc10b24e82008-12-10 23:49:33 +00003772
Yury Selivanov75445082015-05-11 22:57:16 -04003773 PUSH(res);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003774 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003775 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00003776
Benjamin Petersonddd19492018-09-16 22:38:02 -07003777 case TARGET(LOAD_METHOD): {
Andreyb021ba52019-04-29 14:33:26 +10003778 /* Designed to work in tandem with CALL_METHOD. */
Yury Selivanovf2392132016-12-13 19:03:51 -05003779 PyObject *name = GETITEM(names, oparg);
3780 PyObject *obj = TOP();
3781 PyObject *meth = NULL;
3782
3783 int meth_found = _PyObject_GetMethod(obj, name, &meth);
3784
Yury Selivanovf2392132016-12-13 19:03:51 -05003785 if (meth == NULL) {
3786 /* Most likely attribute wasn't found. */
Yury Selivanovf2392132016-12-13 19:03:51 -05003787 goto error;
3788 }
3789
3790 if (meth_found) {
INADA Naoki015bce62017-01-16 17:23:30 +09003791 /* We can bypass temporary bound method object.
3792 meth is unbound method and obj is self.
Victor Stinnera8cb5152017-01-18 14:12:51 +01003793
INADA Naoki015bce62017-01-16 17:23:30 +09003794 meth | self | arg1 | ... | argN
3795 */
3796 SET_TOP(meth);
3797 PUSH(obj); // self
Yury Selivanovf2392132016-12-13 19:03:51 -05003798 }
3799 else {
INADA Naoki015bce62017-01-16 17:23:30 +09003800 /* meth is not an unbound method (but a regular attr, or
3801 something was returned by a descriptor protocol). Set
3802 the second element of the stack to NULL, to signal
Yury Selivanovf2392132016-12-13 19:03:51 -05003803 CALL_METHOD that it's not a method call.
INADA Naoki015bce62017-01-16 17:23:30 +09003804
3805 NULL | meth | arg1 | ... | argN
Yury Selivanovf2392132016-12-13 19:03:51 -05003806 */
INADA Naoki015bce62017-01-16 17:23:30 +09003807 SET_TOP(NULL);
Yury Selivanovf2392132016-12-13 19:03:51 -05003808 Py_DECREF(obj);
INADA Naoki015bce62017-01-16 17:23:30 +09003809 PUSH(meth);
Yury Selivanovf2392132016-12-13 19:03:51 -05003810 }
3811 DISPATCH();
3812 }
3813
Benjamin Petersonddd19492018-09-16 22:38:02 -07003814 case TARGET(CALL_METHOD): {
Yury Selivanovf2392132016-12-13 19:03:51 -05003815 /* Designed to work in tamdem with LOAD_METHOD. */
INADA Naoki015bce62017-01-16 17:23:30 +09003816 PyObject **sp, *res, *meth;
Yury Selivanovf2392132016-12-13 19:03:51 -05003817
3818 sp = stack_pointer;
3819
INADA Naoki015bce62017-01-16 17:23:30 +09003820 meth = PEEK(oparg + 2);
3821 if (meth == NULL) {
3822 /* `meth` is NULL when LOAD_METHOD thinks that it's not
3823 a method call.
Yury Selivanovf2392132016-12-13 19:03:51 -05003824
3825 Stack layout:
3826
INADA Naoki015bce62017-01-16 17:23:30 +09003827 ... | NULL | callable | arg1 | ... | argN
3828 ^- TOP()
3829 ^- (-oparg)
3830 ^- (-oparg-1)
3831 ^- (-oparg-2)
Yury Selivanovf2392132016-12-13 19:03:51 -05003832
Ville Skyttä49b27342017-08-03 09:00:59 +03003833 `callable` will be POPed by call_function.
INADA Naoki015bce62017-01-16 17:23:30 +09003834 NULL will will be POPed manually later.
Yury Selivanovf2392132016-12-13 19:03:51 -05003835 */
Mark Shannon86433452021-01-07 16:49:02 +00003836 res = call_function(tstate, &bounds, &sp, oparg, NULL);
Yury Selivanovf2392132016-12-13 19:03:51 -05003837 stack_pointer = sp;
INADA Naoki015bce62017-01-16 17:23:30 +09003838 (void)POP(); /* POP the NULL. */
Yury Selivanovf2392132016-12-13 19:03:51 -05003839 }
3840 else {
3841 /* This is a method call. Stack layout:
3842
INADA Naoki015bce62017-01-16 17:23:30 +09003843 ... | method | self | arg1 | ... | argN
Yury Selivanovf2392132016-12-13 19:03:51 -05003844 ^- TOP()
3845 ^- (-oparg)
INADA Naoki015bce62017-01-16 17:23:30 +09003846 ^- (-oparg-1)
3847 ^- (-oparg-2)
Yury Selivanovf2392132016-12-13 19:03:51 -05003848
INADA Naoki015bce62017-01-16 17:23:30 +09003849 `self` and `method` will be POPed by call_function.
Yury Selivanovf2392132016-12-13 19:03:51 -05003850 We'll be passing `oparg + 1` to call_function, to
INADA Naoki015bce62017-01-16 17:23:30 +09003851 make it accept the `self` as a first argument.
Yury Selivanovf2392132016-12-13 19:03:51 -05003852 */
Mark Shannon86433452021-01-07 16:49:02 +00003853 res = call_function(tstate, &bounds, &sp, oparg + 1, NULL);
Yury Selivanovf2392132016-12-13 19:03:51 -05003854 stack_pointer = sp;
3855 }
3856
3857 PUSH(res);
3858 if (res == NULL)
3859 goto error;
3860 DISPATCH();
3861 }
3862
Benjamin Petersonddd19492018-09-16 22:38:02 -07003863 case TARGET(CALL_FUNCTION): {
3864 PREDICTED(CALL_FUNCTION);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003865 PyObject **sp, *res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003866 sp = stack_pointer;
Mark Shannon86433452021-01-07 16:49:02 +00003867 res = call_function(tstate, &bounds, &sp, oparg, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003868 stack_pointer = sp;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003869 PUSH(res);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003870 if (res == NULL) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003871 goto error;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003872 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003873 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003874 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003875
Benjamin Petersonddd19492018-09-16 22:38:02 -07003876 case TARGET(CALL_FUNCTION_KW): {
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003877 PyObject **sp, *res, *names;
3878
3879 names = POP();
Jeroen Demeyer05677862019-08-16 12:41:27 +02003880 assert(PyTuple_Check(names));
3881 assert(PyTuple_GET_SIZE(names) <= oparg);
3882 /* We assume without checking that names contains only strings */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003883 sp = stack_pointer;
Mark Shannon86433452021-01-07 16:49:02 +00003884 res = call_function(tstate, &bounds, &sp, oparg, names);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003885 stack_pointer = sp;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003886 PUSH(res);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003887 Py_DECREF(names);
3888
3889 if (res == NULL) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003890 goto error;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003891 }
3892 DISPATCH();
3893 }
3894
Benjamin Petersonddd19492018-09-16 22:38:02 -07003895 case TARGET(CALL_FUNCTION_EX): {
Brandt Bucherf185a732019-09-28 17:12:49 -07003896 PREDICTED(CALL_FUNCTION_EX);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003897 PyObject *func, *callargs, *kwargs = NULL, *result;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003898 if (oparg & 0x01) {
3899 kwargs = POP();
Serhiy Storchakab7281052016-09-12 00:52:40 +03003900 if (!PyDict_CheckExact(kwargs)) {
3901 PyObject *d = PyDict_New();
3902 if (d == NULL)
3903 goto error;
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02003904 if (_PyDict_MergeEx(d, kwargs, 2) < 0) {
Serhiy Storchakab7281052016-09-12 00:52:40 +03003905 Py_DECREF(d);
Victor Stinner438a12d2019-05-24 17:01:38 +02003906 format_kwargs_error(tstate, SECOND(), kwargs);
Victor Stinnereece2222016-09-12 11:16:37 +02003907 Py_DECREF(kwargs);
Serhiy Storchakab7281052016-09-12 00:52:40 +03003908 goto error;
3909 }
3910 Py_DECREF(kwargs);
3911 kwargs = d;
3912 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003913 assert(PyDict_CheckExact(kwargs));
3914 }
3915 callargs = POP();
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003916 func = TOP();
Serhiy Storchaka63dc5482016-09-22 19:41:20 +03003917 if (!PyTuple_CheckExact(callargs)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003918 if (check_args_iterable(tstate, func, callargs) < 0) {
Victor Stinnereece2222016-09-12 11:16:37 +02003919 Py_DECREF(callargs);
Serhiy Storchakab7281052016-09-12 00:52:40 +03003920 goto error;
3921 }
3922 Py_SETREF(callargs, PySequence_Tuple(callargs));
3923 if (callargs == NULL) {
3924 goto error;
3925 }
3926 }
Serhiy Storchaka63dc5482016-09-22 19:41:20 +03003927 assert(PyTuple_CheckExact(callargs));
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003928
Mark Shannon86433452021-01-07 16:49:02 +00003929 result = do_call_core(tstate, &bounds, func, callargs, kwargs);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003930 Py_DECREF(func);
3931 Py_DECREF(callargs);
3932 Py_XDECREF(kwargs);
3933
3934 SET_TOP(result);
3935 if (result == NULL) {
3936 goto error;
3937 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003938 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003939 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003940
Benjamin Petersonddd19492018-09-16 22:38:02 -07003941 case TARGET(MAKE_FUNCTION): {
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003942 PyObject *qualname = POP();
3943 PyObject *codeobj = POP();
3944 PyFunctionObject *func = (PyFunctionObject *)
3945 PyFunction_NewWithQualName(codeobj, f->f_globals, qualname);
Guido van Rossum4f72a782006-10-27 23:31:49 +00003946
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003947 Py_DECREF(codeobj);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003948 Py_DECREF(qualname);
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003949 if (func == NULL) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003950 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003951 }
Neal Norwitzc1505362006-12-28 06:47:50 +00003952
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003953 if (oparg & 0x08) {
3954 assert(PyTuple_CheckExact(TOP()));
Mark Shannond6c33fb2021-01-29 13:24:55 +00003955 func->func_closure = POP();
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003956 }
3957 if (oparg & 0x04) {
Yurii Karabas73019792020-11-25 12:43:18 +02003958 assert(PyTuple_CheckExact(TOP()));
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003959 func->func_annotations = POP();
3960 }
3961 if (oparg & 0x02) {
3962 assert(PyDict_CheckExact(TOP()));
3963 func->func_kwdefaults = POP();
3964 }
3965 if (oparg & 0x01) {
3966 assert(PyTuple_CheckExact(TOP()));
3967 func->func_defaults = POP();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003968 }
Neal Norwitzc1505362006-12-28 06:47:50 +00003969
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003970 PUSH((PyObject *)func);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003971 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003972 }
Guido van Rossum8861b741996-07-30 16:49:37 +00003973
Benjamin Petersonddd19492018-09-16 22:38:02 -07003974 case TARGET(BUILD_SLICE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003975 PyObject *start, *stop, *step, *slice;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003976 if (oparg == 3)
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003977 step = POP();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003978 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003979 step = NULL;
3980 stop = POP();
3981 start = TOP();
3982 slice = PySlice_New(start, stop, step);
3983 Py_DECREF(start);
3984 Py_DECREF(stop);
3985 Py_XDECREF(step);
3986 SET_TOP(slice);
3987 if (slice == NULL)
3988 goto error;
3989 DISPATCH();
3990 }
Guido van Rossum8861b741996-07-30 16:49:37 +00003991
Benjamin Petersonddd19492018-09-16 22:38:02 -07003992 case TARGET(FORMAT_VALUE): {
Eric V. Smitha78c7952015-11-03 12:45:05 -05003993 /* Handles f-string value formatting. */
3994 PyObject *result;
3995 PyObject *fmt_spec;
3996 PyObject *value;
3997 PyObject *(*conv_fn)(PyObject *);
3998 int which_conversion = oparg & FVC_MASK;
3999 int have_fmt_spec = (oparg & FVS_MASK) == FVS_HAVE_SPEC;
4000
4001 fmt_spec = have_fmt_spec ? POP() : NULL;
Eric V. Smith135d5f42016-02-05 18:23:08 -05004002 value = POP();
Eric V. Smitha78c7952015-11-03 12:45:05 -05004003
4004 /* See if any conversion is specified. */
4005 switch (which_conversion) {
Eric V. Smith9a4135e2019-05-08 16:28:48 -04004006 case FVC_NONE: conv_fn = NULL; break;
Eric V. Smitha78c7952015-11-03 12:45:05 -05004007 case FVC_STR: conv_fn = PyObject_Str; break;
4008 case FVC_REPR: conv_fn = PyObject_Repr; break;
4009 case FVC_ASCII: conv_fn = PyObject_ASCII; break;
Eric V. Smith9a4135e2019-05-08 16:28:48 -04004010 default:
Victor Stinner438a12d2019-05-24 17:01:38 +02004011 _PyErr_Format(tstate, PyExc_SystemError,
4012 "unexpected conversion flag %d",
4013 which_conversion);
Eric V. Smith9a4135e2019-05-08 16:28:48 -04004014 goto error;
Eric V. Smitha78c7952015-11-03 12:45:05 -05004015 }
4016
4017 /* If there's a conversion function, call it and replace
4018 value with that result. Otherwise, just use value,
4019 without conversion. */
Eric V. Smitheb588a12016-02-05 18:26:20 -05004020 if (conv_fn != NULL) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05004021 result = conv_fn(value);
4022 Py_DECREF(value);
Eric V. Smitheb588a12016-02-05 18:26:20 -05004023 if (result == NULL) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05004024 Py_XDECREF(fmt_spec);
4025 goto error;
4026 }
4027 value = result;
4028 }
4029
4030 /* If value is a unicode object, and there's no fmt_spec,
4031 then we know the result of format(value) is value
4032 itself. In that case, skip calling format(). I plan to
4033 move this optimization in to PyObject_Format()
4034 itself. */
4035 if (PyUnicode_CheckExact(value) && fmt_spec == NULL) {
4036 /* Do nothing, just transfer ownership to result. */
4037 result = value;
4038 } else {
4039 /* Actually call format(). */
4040 result = PyObject_Format(value, fmt_spec);
4041 Py_DECREF(value);
4042 Py_XDECREF(fmt_spec);
Eric V. Smitheb588a12016-02-05 18:26:20 -05004043 if (result == NULL) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05004044 goto error;
Eric V. Smitheb588a12016-02-05 18:26:20 -05004045 }
Eric V. Smitha78c7952015-11-03 12:45:05 -05004046 }
4047
Eric V. Smith135d5f42016-02-05 18:23:08 -05004048 PUSH(result);
Eric V. Smitha78c7952015-11-03 12:45:05 -05004049 DISPATCH();
4050 }
4051
Benjamin Petersonddd19492018-09-16 22:38:02 -07004052 case TARGET(EXTENDED_ARG): {
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03004053 int oldoparg = oparg;
4054 NEXTOPARG();
4055 oparg |= oldoparg << 8;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004056 goto dispatch_opcode;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004057 }
Guido van Rossum8861b741996-07-30 16:49:37 +00004058
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004059
Antoine Pitrou042b1282010-08-13 21:15:58 +00004060#if USE_COMPUTED_GOTOS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004061 _unknown_opcode:
Antoine Pitroub52ec782009-01-25 16:34:23 +00004062#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004063 default:
4064 fprintf(stderr,
4065 "XXX lineno: %d, opcode: %d\n",
4066 PyFrame_GetLineNumber(f),
4067 opcode);
Victor Stinner438a12d2019-05-24 17:01:38 +02004068 _PyErr_SetString(tstate, PyExc_SystemError, "unknown opcode");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004069 goto error;
Guido van Rossum04691fc1992-08-12 15:35:34 +00004070
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004071 } /* switch */
Guido van Rossum374a9221991-04-04 10:40:29 +00004072
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004073 /* This should never be reached. Every opcode should end with DISPATCH()
4074 or goto error. */
Barry Warsawb2e57942017-09-14 18:13:16 -07004075 Py_UNREACHABLE();
Guido van Rossumac7be682001-01-17 15:42:30 +00004076
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004077error:
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004078 /* Double-check exception status. */
Victor Stinner365b6932013-07-12 00:11:58 +02004079#ifdef NDEBUG
Victor Stinner438a12d2019-05-24 17:01:38 +02004080 if (!_PyErr_Occurred(tstate)) {
4081 _PyErr_SetString(tstate, PyExc_SystemError,
4082 "error return without exception set");
4083 }
Victor Stinner365b6932013-07-12 00:11:58 +02004084#else
Victor Stinner438a12d2019-05-24 17:01:38 +02004085 assert(_PyErr_Occurred(tstate));
Victor Stinner365b6932013-07-12 00:11:58 +02004086#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00004087
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004088 /* Log traceback info. */
4089 PyTraceBack_Here(f);
Guido van Rossumac7be682001-01-17 15:42:30 +00004090
Mark Shannoncb9879b2020-07-17 11:44:23 +01004091 if (tstate->c_tracefunc != NULL) {
4092 /* Make sure state is set to FRAME_EXECUTING for tracing */
4093 assert(f->f_state == FRAME_EXECUTING);
4094 f->f_state = FRAME_UNWINDING;
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004095 call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj,
Mark Shannon86433452021-01-07 16:49:02 +00004096 tstate, f, &bounds);
Mark Shannoncb9879b2020-07-17 11:44:23 +01004097 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004098exception_unwind:
Mark Shannoncb9879b2020-07-17 11:44:23 +01004099 f->f_state = FRAME_UNWINDING;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004100 /* Unwind stacks if an exception occurred */
4101 while (f->f_iblock > 0) {
4102 /* Pop the current block. */
4103 PyTryBlock *b = &f->f_blockstack[--f->f_iblock];
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004104
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004105 if (b->b_type == EXCEPT_HANDLER) {
4106 UNWIND_EXCEPT_HANDLER(b);
4107 continue;
4108 }
4109 UNWIND_BLOCK(b);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004110 if (b->b_type == SETUP_FINALLY) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004111 PyObject *exc, *val, *tb;
4112 int handler = b->b_handler;
Mark Shannonae3087c2017-10-22 22:41:51 +01004113 _PyErr_StackItem *exc_info = tstate->exc_info;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004114 /* Beware, this invalidates all b->b_* fields */
Mark Shannonbf353f32020-12-17 13:55:28 +00004115 PyFrame_BlockSetup(f, EXCEPT_HANDLER, f->f_lasti, STACK_LEVEL());
Mark Shannonae3087c2017-10-22 22:41:51 +01004116 PUSH(exc_info->exc_traceback);
4117 PUSH(exc_info->exc_value);
4118 if (exc_info->exc_type != NULL) {
4119 PUSH(exc_info->exc_type);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004120 }
4121 else {
4122 Py_INCREF(Py_None);
4123 PUSH(Py_None);
4124 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004125 _PyErr_Fetch(tstate, &exc, &val, &tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004126 /* Make the raw exception data
4127 available to the handler,
4128 so a program can emulate the
4129 Python main loop. */
Victor Stinner438a12d2019-05-24 17:01:38 +02004130 _PyErr_NormalizeException(tstate, &exc, &val, &tb);
Victor Stinner7eab0d02013-07-15 21:16:27 +02004131 if (tb != NULL)
4132 PyException_SetTraceback(val, tb);
4133 else
4134 PyException_SetTraceback(val, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004135 Py_INCREF(exc);
Mark Shannonae3087c2017-10-22 22:41:51 +01004136 exc_info->exc_type = exc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004137 Py_INCREF(val);
Mark Shannonae3087c2017-10-22 22:41:51 +01004138 exc_info->exc_value = val;
4139 exc_info->exc_traceback = tb;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004140 if (tb == NULL)
4141 tb = Py_None;
4142 Py_INCREF(tb);
4143 PUSH(tb);
4144 PUSH(val);
4145 PUSH(exc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004146 JUMPTO(handler);
Victor Stinnerdab84232020-03-17 18:56:44 +01004147 if (_Py_TracingPossible(ceval2)) {
Mark Shannon877df852020-11-12 09:43:29 +00004148 instr_prev = INT_MAX;
Mark Shannonfee55262019-11-21 09:11:43 +00004149 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004150 /* Resume normal execution */
Mark Shannoncb9879b2020-07-17 11:44:23 +01004151 f->f_state = FRAME_EXECUTING;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004152 goto main_loop;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004153 }
4154 } /* unwind stack */
Guido van Rossum374a9221991-04-04 10:40:29 +00004155
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004156 /* End the loop as we still have an error */
4157 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004158 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00004159
Pablo Galindof00828a2019-05-09 16:52:02 +01004160 assert(retval == NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02004161 assert(_PyErr_Occurred(tstate));
Pablo Galindof00828a2019-05-09 16:52:02 +01004162
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004163 /* Pop remaining stack entries. */
4164 while (!EMPTY()) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004165 PyObject *o = POP();
4166 Py_XDECREF(o);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004167 }
Mark Shannoncb9879b2020-07-17 11:44:23 +01004168 f->f_stackdepth = 0;
4169 f->f_state = FRAME_RAISED;
Mark Shannone7c9f4a2020-01-13 12:51:26 +00004170exiting:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004171 if (tstate->use_tracing) {
Benjamin Peterson51f46162013-01-23 08:38:47 -05004172 if (tstate->c_tracefunc) {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004173 if (call_trace_protected(tstate->c_tracefunc, tstate->c_traceobj,
Mark Shannon86433452021-01-07 16:49:02 +00004174 tstate, f, &bounds, PyTrace_RETURN, retval)) {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004175 Py_CLEAR(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004176 }
4177 }
4178 if (tstate->c_profilefunc) {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004179 if (call_trace_protected(tstate->c_profilefunc, tstate->c_profileobj,
Mark Shannon86433452021-01-07 16:49:02 +00004180 tstate, f, &bounds, PyTrace_RETURN, retval)) {
Serhiy Storchaka505ff752014-02-09 13:33:53 +02004181 Py_CLEAR(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004182 }
4183 }
4184 }
Guido van Rossuma4240131997-01-21 21:18:36 +00004185
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004186 /* pop frame */
Thomas Woutersce272b62007-09-19 21:19:28 +00004187exit_eval_frame:
Łukasz Langaa785c872016-09-09 17:37:37 -07004188 if (PyDTrace_FUNCTION_RETURN_ENABLED())
4189 dtrace_function_return(f);
Victor Stinnerbe434dc2019-11-05 00:51:22 +01004190 _Py_LeaveRecursiveCall(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004191 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00004192
Victor Stinner0b72b232020-03-12 23:18:39 +01004193 return _Py_CheckFunctionResult(tstate, NULL, retval, __func__);
Guido van Rossum374a9221991-04-04 10:40:29 +00004194}
4195
Benjamin Petersonb204a422011-06-05 22:04:07 -05004196static void
Victor Stinner438a12d2019-05-24 17:01:38 +02004197format_missing(PyThreadState *tstate, const char *kind,
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004198 PyCodeObject *co, PyObject *names, PyObject *qualname)
Benjamin Petersone109c702011-06-24 09:37:26 -05004199{
4200 int err;
4201 Py_ssize_t len = PyList_GET_SIZE(names);
4202 PyObject *name_str, *comma, *tail, *tmp;
4203
4204 assert(PyList_CheckExact(names));
4205 assert(len >= 1);
4206 /* Deal with the joys of natural language. */
4207 switch (len) {
4208 case 1:
4209 name_str = PyList_GET_ITEM(names, 0);
4210 Py_INCREF(name_str);
4211 break;
4212 case 2:
4213 name_str = PyUnicode_FromFormat("%U and %U",
4214 PyList_GET_ITEM(names, len - 2),
4215 PyList_GET_ITEM(names, len - 1));
4216 break;
4217 default:
4218 tail = PyUnicode_FromFormat(", %U, and %U",
4219 PyList_GET_ITEM(names, len - 2),
4220 PyList_GET_ITEM(names, len - 1));
Benjamin Petersond1ab6082012-06-01 11:18:22 -07004221 if (tail == NULL)
4222 return;
Benjamin Petersone109c702011-06-24 09:37:26 -05004223 /* Chop off the last two objects in the list. This shouldn't actually
4224 fail, but we can't be too careful. */
4225 err = PyList_SetSlice(names, len - 2, len, NULL);
4226 if (err == -1) {
4227 Py_DECREF(tail);
4228 return;
4229 }
4230 /* Stitch everything up into a nice comma-separated list. */
4231 comma = PyUnicode_FromString(", ");
4232 if (comma == NULL) {
4233 Py_DECREF(tail);
4234 return;
4235 }
4236 tmp = PyUnicode_Join(comma, names);
4237 Py_DECREF(comma);
4238 if (tmp == NULL) {
4239 Py_DECREF(tail);
4240 return;
4241 }
4242 name_str = PyUnicode_Concat(tmp, tail);
4243 Py_DECREF(tmp);
4244 Py_DECREF(tail);
4245 break;
4246 }
4247 if (name_str == NULL)
4248 return;
Victor Stinner438a12d2019-05-24 17:01:38 +02004249 _PyErr_Format(tstate, PyExc_TypeError,
4250 "%U() missing %i required %s argument%s: %U",
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004251 qualname,
Victor Stinner438a12d2019-05-24 17:01:38 +02004252 len,
4253 kind,
4254 len == 1 ? "" : "s",
4255 name_str);
Benjamin Petersone109c702011-06-24 09:37:26 -05004256 Py_DECREF(name_str);
4257}
4258
4259static void
Victor Stinner438a12d2019-05-24 17:01:38 +02004260missing_arguments(PyThreadState *tstate, PyCodeObject *co,
4261 Py_ssize_t missing, Py_ssize_t defcount,
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004262 PyObject **fastlocals, PyObject *qualname)
Benjamin Petersone109c702011-06-24 09:37:26 -05004263{
Victor Stinner74319ae2016-08-25 00:04:09 +02004264 Py_ssize_t i, j = 0;
4265 Py_ssize_t start, end;
4266 int positional = (defcount != -1);
Benjamin Petersone109c702011-06-24 09:37:26 -05004267 const char *kind = positional ? "positional" : "keyword-only";
4268 PyObject *missing_names;
4269
4270 /* Compute the names of the arguments that are missing. */
4271 missing_names = PyList_New(missing);
4272 if (missing_names == NULL)
4273 return;
4274 if (positional) {
4275 start = 0;
Pablo Galindocd74e662019-06-01 18:08:04 +01004276 end = co->co_argcount - defcount;
Benjamin Petersone109c702011-06-24 09:37:26 -05004277 }
4278 else {
Pablo Galindocd74e662019-06-01 18:08:04 +01004279 start = co->co_argcount;
Benjamin Petersone109c702011-06-24 09:37:26 -05004280 end = start + co->co_kwonlyargcount;
4281 }
4282 for (i = start; i < end; i++) {
4283 if (GETLOCAL(i) == NULL) {
4284 PyObject *raw = PyTuple_GET_ITEM(co->co_varnames, i);
4285 PyObject *name = PyObject_Repr(raw);
4286 if (name == NULL) {
4287 Py_DECREF(missing_names);
4288 return;
4289 }
4290 PyList_SET_ITEM(missing_names, j++, name);
4291 }
4292 }
4293 assert(j == missing);
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004294 format_missing(tstate, kind, co, missing_names, qualname);
Benjamin Petersone109c702011-06-24 09:37:26 -05004295 Py_DECREF(missing_names);
4296}
4297
4298static void
Victor Stinner438a12d2019-05-24 17:01:38 +02004299too_many_positional(PyThreadState *tstate, PyCodeObject *co,
Mark Shannond6c33fb2021-01-29 13:24:55 +00004300 Py_ssize_t given, PyObject *defaults,
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004301 PyObject **fastlocals, PyObject *qualname)
Benjamin Petersonb204a422011-06-05 22:04:07 -05004302{
4303 int plural;
Victor Stinner74319ae2016-08-25 00:04:09 +02004304 Py_ssize_t kwonly_given = 0;
4305 Py_ssize_t i;
Benjamin Petersonb204a422011-06-05 22:04:07 -05004306 PyObject *sig, *kwonly_sig;
Victor Stinner74319ae2016-08-25 00:04:09 +02004307 Py_ssize_t co_argcount = co->co_argcount;
Benjamin Petersonb204a422011-06-05 22:04:07 -05004308
Benjamin Petersone109c702011-06-24 09:37:26 -05004309 assert((co->co_flags & CO_VARARGS) == 0);
4310 /* Count missing keyword-only args. */
Pablo Galindocd74e662019-06-01 18:08:04 +01004311 for (i = co_argcount; i < co_argcount + co->co_kwonlyargcount; i++) {
Victor Stinner74319ae2016-08-25 00:04:09 +02004312 if (GETLOCAL(i) != NULL) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004313 kwonly_given++;
Victor Stinner74319ae2016-08-25 00:04:09 +02004314 }
4315 }
Mark Shannond6c33fb2021-01-29 13:24:55 +00004316 Py_ssize_t defcount = defaults == NULL ? 0 : PyTuple_GET_SIZE(defaults);
Benjamin Petersone109c702011-06-24 09:37:26 -05004317 if (defcount) {
Pablo Galindocd74e662019-06-01 18:08:04 +01004318 Py_ssize_t atleast = co_argcount - defcount;
Benjamin Petersonb204a422011-06-05 22:04:07 -05004319 plural = 1;
Pablo Galindocd74e662019-06-01 18:08:04 +01004320 sig = PyUnicode_FromFormat("from %zd to %zd", atleast, co_argcount);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004321 }
4322 else {
Pablo Galindocd74e662019-06-01 18:08:04 +01004323 plural = (co_argcount != 1);
4324 sig = PyUnicode_FromFormat("%zd", co_argcount);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004325 }
4326 if (sig == NULL)
4327 return;
4328 if (kwonly_given) {
Victor Stinner74319ae2016-08-25 00:04:09 +02004329 const char *format = " positional argument%s (and %zd keyword-only argument%s)";
4330 kwonly_sig = PyUnicode_FromFormat(format,
4331 given != 1 ? "s" : "",
4332 kwonly_given,
4333 kwonly_given != 1 ? "s" : "");
Benjamin Petersonb204a422011-06-05 22:04:07 -05004334 if (kwonly_sig == NULL) {
4335 Py_DECREF(sig);
4336 return;
4337 }
4338 }
4339 else {
4340 /* This will not fail. */
4341 kwonly_sig = PyUnicode_FromString("");
Benjamin Petersone109c702011-06-24 09:37:26 -05004342 assert(kwonly_sig != NULL);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004343 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004344 _PyErr_Format(tstate, PyExc_TypeError,
4345 "%U() takes %U positional argument%s but %zd%U %s given",
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004346 qualname,
Victor Stinner438a12d2019-05-24 17:01:38 +02004347 sig,
4348 plural ? "s" : "",
4349 given,
4350 kwonly_sig,
4351 given == 1 && !kwonly_given ? "was" : "were");
Benjamin Petersonb204a422011-06-05 22:04:07 -05004352 Py_DECREF(sig);
4353 Py_DECREF(kwonly_sig);
4354}
4355
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004356static int
Victor Stinner438a12d2019-05-24 17:01:38 +02004357positional_only_passed_as_keyword(PyThreadState *tstate, PyCodeObject *co,
Mark Shannon0332e562021-02-01 10:42:03 +00004358 Py_ssize_t kwcount, PyObject* kwnames,
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004359 PyObject *qualname)
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004360{
4361 int posonly_conflicts = 0;
4362 PyObject* posonly_names = PyList_New(0);
4363
4364 for(int k=0; k < co->co_posonlyargcount; k++){
4365 PyObject* posonly_name = PyTuple_GET_ITEM(co->co_varnames, k);
4366
4367 for (int k2=0; k2<kwcount; k2++){
4368 /* Compare the pointers first and fallback to PyObject_RichCompareBool*/
Mark Shannon0332e562021-02-01 10:42:03 +00004369 PyObject* kwname = PyTuple_GET_ITEM(kwnames, k2);
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004370 if (kwname == posonly_name){
4371 if(PyList_Append(posonly_names, kwname) != 0) {
4372 goto fail;
4373 }
4374 posonly_conflicts++;
4375 continue;
4376 }
4377
4378 int cmp = PyObject_RichCompareBool(posonly_name, kwname, Py_EQ);
4379
4380 if ( cmp > 0) {
4381 if(PyList_Append(posonly_names, kwname) != 0) {
4382 goto fail;
4383 }
4384 posonly_conflicts++;
4385 } else if (cmp < 0) {
4386 goto fail;
4387 }
4388
4389 }
4390 }
4391 if (posonly_conflicts) {
4392 PyObject* comma = PyUnicode_FromString(", ");
4393 if (comma == NULL) {
4394 goto fail;
4395 }
4396 PyObject* error_names = PyUnicode_Join(comma, posonly_names);
4397 Py_DECREF(comma);
4398 if (error_names == NULL) {
4399 goto fail;
4400 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004401 _PyErr_Format(tstate, PyExc_TypeError,
4402 "%U() got some positional-only arguments passed"
4403 " as keyword arguments: '%U'",
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004404 qualname, error_names);
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004405 Py_DECREF(error_names);
4406 goto fail;
4407 }
4408
4409 Py_DECREF(posonly_names);
4410 return 0;
4411
4412fail:
4413 Py_XDECREF(posonly_names);
4414 return 1;
4415
4416}
4417
Skip Montanaro786ea6b2004-03-01 15:44:05 +00004418
Mark Shannon0332e562021-02-01 10:42:03 +00004419PyFrameObject *
4420_PyEval_MakeFrameVector(PyThreadState *tstate,
Mark Shannond6c33fb2021-01-29 13:24:55 +00004421 PyFrameConstructor *con, PyObject *locals,
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02004422 PyObject *const *args, Py_ssize_t argcount,
Mark Shannon0332e562021-02-01 10:42:03 +00004423 PyObject *kwnames)
Tim Peters5ca576e2001-06-18 22:08:13 +00004424{
Victor Stinnerda2914d2020-03-20 09:29:08 +01004425 assert(is_tstate_valid(tstate));
Victor Stinnerb5e170f2019-11-16 01:03:22 +01004426
Mark Shannond6c33fb2021-01-29 13:24:55 +00004427 PyCodeObject *co = (PyCodeObject*)con->fc_code;
4428 assert(con->fc_defaults == NULL || PyTuple_CheckExact(con->fc_defaults));
Pablo Galindocd74e662019-06-01 18:08:04 +01004429 const Py_ssize_t total_args = co->co_argcount + co->co_kwonlyargcount;
Tim Peters5ca576e2001-06-18 22:08:13 +00004430
Victor Stinnerc7020012016-08-16 23:40:29 +02004431 /* Create the frame */
Mark Shannon0332e562021-02-01 10:42:03 +00004432 PyFrameObject *f = _PyFrame_New_NoTrack(tstate, con, locals);
Victor Stinnerc7020012016-08-16 23:40:29 +02004433 if (f == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004434 return NULL;
Victor Stinnerc7020012016-08-16 23:40:29 +02004435 }
Victor Stinner232dda62020-06-04 15:19:02 +02004436 PyObject **fastlocals = f->f_localsplus;
4437 PyObject **freevars = f->f_localsplus + co->co_nlocals;
Tim Peters5ca576e2001-06-18 22:08:13 +00004438
Victor Stinnerc7020012016-08-16 23:40:29 +02004439 /* Create a dictionary for keyword parameters (**kwags) */
Victor Stinner232dda62020-06-04 15:19:02 +02004440 PyObject *kwdict;
4441 Py_ssize_t i;
Benjamin Petersonb204a422011-06-05 22:04:07 -05004442 if (co->co_flags & CO_VARKEYWORDS) {
4443 kwdict = PyDict_New();
4444 if (kwdict == NULL)
4445 goto fail;
4446 i = total_args;
Victor Stinnerc7020012016-08-16 23:40:29 +02004447 if (co->co_flags & CO_VARARGS) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004448 i++;
Victor Stinnerc7020012016-08-16 23:40:29 +02004449 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004450 SETLOCAL(i, kwdict);
4451 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004452 else {
4453 kwdict = NULL;
4454 }
4455
Pablo Galindocd74e662019-06-01 18:08:04 +01004456 /* Copy all positional arguments into local variables */
Victor Stinner232dda62020-06-04 15:19:02 +02004457 Py_ssize_t j, n;
Pablo Galindocd74e662019-06-01 18:08:04 +01004458 if (argcount > co->co_argcount) {
4459 n = co->co_argcount;
Victor Stinnerc7020012016-08-16 23:40:29 +02004460 }
4461 else {
4462 n = argcount;
4463 }
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004464 for (j = 0; j < n; j++) {
Victor Stinner232dda62020-06-04 15:19:02 +02004465 PyObject *x = args[j];
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004466 Py_INCREF(x);
4467 SETLOCAL(j, x);
4468 }
4469
Victor Stinnerc7020012016-08-16 23:40:29 +02004470 /* Pack other positional arguments into the *args argument */
Benjamin Petersonb204a422011-06-05 22:04:07 -05004471 if (co->co_flags & CO_VARARGS) {
Victor Stinner232dda62020-06-04 15:19:02 +02004472 PyObject *u = _PyTuple_FromArray(args + n, argcount - n);
Victor Stinnerc7020012016-08-16 23:40:29 +02004473 if (u == NULL) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004474 goto fail;
Victor Stinnerc7020012016-08-16 23:40:29 +02004475 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004476 SETLOCAL(total_args, u);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004477 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004478
Mark Shannon0332e562021-02-01 10:42:03 +00004479 /* Handle keyword arguments */
4480 if (kwnames != NULL) {
4481 Py_ssize_t kwcount = PyTuple_GET_SIZE(kwnames);
4482 for (i = 0; i < kwcount; i++) {
4483 PyObject **co_varnames;
4484 PyObject *keyword = PyTuple_GET_ITEM(kwnames, i);
4485 PyObject *value = args[i+argcount];
4486 Py_ssize_t j;
Victor Stinnerc7020012016-08-16 23:40:29 +02004487
Mark Shannon0332e562021-02-01 10:42:03 +00004488 if (keyword == NULL || !PyUnicode_Check(keyword)) {
4489 _PyErr_Format(tstate, PyExc_TypeError,
4490 "%U() keywords must be strings",
Mark Shannond6c33fb2021-01-29 13:24:55 +00004491 con->fc_qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004492 goto fail;
Victor Stinner6fea7f72016-08-22 23:17:30 +02004493 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004494
Mark Shannon0332e562021-02-01 10:42:03 +00004495 /* Speed hack: do raw pointer compares. As names are
4496 normally interned this should almost always hit. */
4497 co_varnames = ((PyTupleObject *)(co->co_varnames))->ob_item;
4498 for (j = co->co_posonlyargcount; j < total_args; j++) {
4499 PyObject *varname = co_varnames[j];
4500 if (varname == keyword) {
4501 goto kw_found;
4502 }
4503 }
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004504
Mark Shannon0332e562021-02-01 10:42:03 +00004505 /* Slow fallback, just in case */
4506 for (j = co->co_posonlyargcount; j < total_args; j++) {
4507 PyObject *varname = co_varnames[j];
4508 int cmp = PyObject_RichCompareBool( keyword, varname, Py_EQ);
4509 if (cmp > 0) {
4510 goto kw_found;
4511 }
4512 else if (cmp < 0) {
4513 goto fail;
4514 }
4515 }
4516
4517 assert(j >= total_args);
4518 if (kwdict == NULL) {
4519
4520 if (co->co_posonlyargcount
4521 && positional_only_passed_as_keyword(tstate, co,
4522 kwcount, kwnames,
Mark Shannond6c33fb2021-01-29 13:24:55 +00004523 con->fc_qualname))
Mark Shannon0332e562021-02-01 10:42:03 +00004524 {
4525 goto fail;
4526 }
4527
4528 _PyErr_Format(tstate, PyExc_TypeError,
4529 "%U() got an unexpected keyword argument '%S'",
4530 con->fc_qualname, keyword);
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004531 goto fail;
4532 }
4533
Mark Shannon0332e562021-02-01 10:42:03 +00004534 if (PyDict_SetItem(kwdict, keyword, value) == -1) {
4535 goto fail;
4536 }
4537 continue;
Victor Stinnerc7020012016-08-16 23:40:29 +02004538
Mark Shannon0332e562021-02-01 10:42:03 +00004539 kw_found:
4540 if (GETLOCAL(j) != NULL) {
4541 _PyErr_Format(tstate, PyExc_TypeError,
4542 "%U() got multiple values for argument '%S'",
Mark Shannond6c33fb2021-01-29 13:24:55 +00004543 con->fc_qualname, keyword);
Mark Shannon0332e562021-02-01 10:42:03 +00004544 goto fail;
4545 }
4546 Py_INCREF(value);
4547 SETLOCAL(j, value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004548 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004549 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004550
4551 /* Check the number of positional arguments */
Pablo Galindocd74e662019-06-01 18:08:04 +01004552 if ((argcount > co->co_argcount) && !(co->co_flags & CO_VARARGS)) {
Mark Shannond6c33fb2021-01-29 13:24:55 +00004553 too_many_positional(tstate, co, argcount, con->fc_defaults, fastlocals,
4554 con->fc_qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004555 goto fail;
4556 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004557
4558 /* Add missing positional arguments (copy default values from defs) */
Pablo Galindocd74e662019-06-01 18:08:04 +01004559 if (argcount < co->co_argcount) {
Mark Shannond6c33fb2021-01-29 13:24:55 +00004560 Py_ssize_t defcount = con->fc_defaults == NULL ? 0 : PyTuple_GET_SIZE(con->fc_defaults);
Pablo Galindocd74e662019-06-01 18:08:04 +01004561 Py_ssize_t m = co->co_argcount - defcount;
Victor Stinner17061a92016-08-16 23:39:42 +02004562 Py_ssize_t missing = 0;
4563 for (i = argcount; i < m; i++) {
4564 if (GETLOCAL(i) == NULL) {
Benjamin Petersone109c702011-06-24 09:37:26 -05004565 missing++;
Victor Stinner17061a92016-08-16 23:39:42 +02004566 }
4567 }
Benjamin Petersone109c702011-06-24 09:37:26 -05004568 if (missing) {
Victor Stinner232dda62020-06-04 15:19:02 +02004569 missing_arguments(tstate, co, missing, defcount, fastlocals,
Mark Shannond6c33fb2021-01-29 13:24:55 +00004570 con->fc_qualname);
Benjamin Petersone109c702011-06-24 09:37:26 -05004571 goto fail;
Benjamin Petersonb204a422011-06-05 22:04:07 -05004572 }
4573 if (n > m)
4574 i = n - m;
4575 else
4576 i = 0;
Mark Shannond6c33fb2021-01-29 13:24:55 +00004577 if (defcount) {
4578 PyObject **defs = &PyTuple_GET_ITEM(con->fc_defaults, 0);
4579 for (; i < defcount; i++) {
4580 if (GETLOCAL(m+i) == NULL) {
4581 PyObject *def = defs[i];
4582 Py_INCREF(def);
4583 SETLOCAL(m+i, def);
4584 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004585 }
4586 }
4587 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004588
4589 /* Add missing keyword arguments (copy default values from kwdefs) */
Benjamin Petersonb204a422011-06-05 22:04:07 -05004590 if (co->co_kwonlyargcount > 0) {
Victor Stinner17061a92016-08-16 23:39:42 +02004591 Py_ssize_t missing = 0;
Pablo Galindocd74e662019-06-01 18:08:04 +01004592 for (i = co->co_argcount; i < total_args; i++) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004593 if (GETLOCAL(i) != NULL)
4594 continue;
Victor Stinner232dda62020-06-04 15:19:02 +02004595 PyObject *varname = PyTuple_GET_ITEM(co->co_varnames, i);
Mark Shannond6c33fb2021-01-29 13:24:55 +00004596 if (con->fc_kwdefaults != NULL) {
4597 PyObject *def = PyDict_GetItemWithError(con->fc_kwdefaults, varname);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004598 if (def) {
4599 Py_INCREF(def);
4600 SETLOCAL(i, def);
4601 continue;
4602 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004603 else if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02004604 goto fail;
4605 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004606 }
Benjamin Petersone109c702011-06-24 09:37:26 -05004607 missing++;
4608 }
4609 if (missing) {
Victor Stinner232dda62020-06-04 15:19:02 +02004610 missing_arguments(tstate, co, missing, -1, fastlocals,
Mark Shannond6c33fb2021-01-29 13:24:55 +00004611 con->fc_qualname);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004612 goto fail;
4613 }
4614 }
4615
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004616 /* Allocate and initialize storage for cell vars, and copy free
Benjamin Peterson90037602011-06-25 22:54:45 -05004617 vars into frame. */
4618 for (i = 0; i < PyTuple_GET_SIZE(co->co_cellvars); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004619 PyObject *c;
Serhiy Storchaka5bb8b912016-12-16 19:19:02 +02004620 Py_ssize_t arg;
Benjamin Peterson90037602011-06-25 22:54:45 -05004621 /* Possibly account for the cell variable being an argument. */
4622 if (co->co_cell2arg != NULL &&
Guido van Rossum6832c812013-05-10 08:47:42 -07004623 (arg = co->co_cell2arg[i]) != CO_CELL_NOT_AN_ARG) {
Benjamin Peterson90037602011-06-25 22:54:45 -05004624 c = PyCell_New(GETLOCAL(arg));
Benjamin Peterson159ae412013-05-12 18:16:06 -05004625 /* Clear the local copy. */
4626 SETLOCAL(arg, NULL);
Guido van Rossum6832c812013-05-10 08:47:42 -07004627 }
4628 else {
Benjamin Peterson90037602011-06-25 22:54:45 -05004629 c = PyCell_New(NULL);
Guido van Rossum6832c812013-05-10 08:47:42 -07004630 }
Benjamin Peterson159ae412013-05-12 18:16:06 -05004631 if (c == NULL)
4632 goto fail;
Benjamin Peterson90037602011-06-25 22:54:45 -05004633 SETLOCAL(co->co_nlocals + i, c);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004634 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004635
4636 /* Copy closure variables to free variables */
Benjamin Peterson90037602011-06-25 22:54:45 -05004637 for (i = 0; i < PyTuple_GET_SIZE(co->co_freevars); ++i) {
Mark Shannond6c33fb2021-01-29 13:24:55 +00004638 PyObject *o = PyTuple_GET_ITEM(con->fc_closure, i);
Benjamin Peterson90037602011-06-25 22:54:45 -05004639 Py_INCREF(o);
4640 freevars[PyTuple_GET_SIZE(co->co_cellvars) + i] = o;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004641 }
Tim Peters5ca576e2001-06-18 22:08:13 +00004642
Mark Shannon0332e562021-02-01 10:42:03 +00004643 return f;
Tim Peters5ca576e2001-06-18 22:08:13 +00004644
Thomas Woutersce272b62007-09-19 21:19:28 +00004645fail: /* Jump here from prelude on failure */
Tim Peters5ca576e2001-06-18 22:08:13 +00004646
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004647 /* decref'ing the frame can cause __del__ methods to get invoked,
4648 which can call back into Python. While we're done with the
4649 current Python frame (f), the associated C stack is still in use,
4650 so recursion_depth must be boosted for the duration.
4651 */
INADA Naoki5a625d02016-12-24 20:19:08 +09004652 if (Py_REFCNT(f) > 1) {
4653 Py_DECREF(f);
4654 _PyObject_GC_TRACK(f);
4655 }
4656 else {
4657 ++tstate->recursion_depth;
4658 Py_DECREF(f);
4659 --tstate->recursion_depth;
4660 }
Mark Shannon0332e562021-02-01 10:42:03 +00004661 return NULL;
4662}
4663
4664static PyObject *
4665make_coro(PyFrameConstructor *con, PyFrameObject *f)
4666{
4667 assert (((PyCodeObject *)con->fc_code)->co_flags & (CO_GENERATOR | CO_COROUTINE | CO_ASYNC_GENERATOR));
4668 PyObject *gen;
4669 int is_coro = ((PyCodeObject *)con->fc_code)->co_flags & CO_COROUTINE;
4670
4671 /* Don't need to keep the reference to f_back, it will be set
4672 * when the generator is resumed. */
4673 Py_CLEAR(f->f_back);
4674
4675 /* Create a new generator that owns the ready to run frame
4676 * and return that as the value. */
4677 if (is_coro) {
4678 gen = PyCoro_New(f, con->fc_name, con->fc_qualname);
4679 } else if (((PyCodeObject *)con->fc_code)->co_flags & CO_ASYNC_GENERATOR) {
4680 gen = PyAsyncGen_New(f, con->fc_name, con->fc_qualname);
4681 } else {
4682 gen = PyGen_NewWithQualName(f, con->fc_name, con->fc_qualname);
4683 }
4684 if (gen == NULL) {
4685 return NULL;
4686 }
4687
4688 _PyObject_GC_TRACK(f);
4689
4690 return gen;
4691}
4692
4693PyObject *
4694_PyEval_Vector(PyThreadState *tstate, PyFrameConstructor *con,
4695 PyObject *locals,
4696 PyObject* const* args, size_t argcount,
4697 PyObject *kwnames)
4698{
4699 PyFrameObject *f = _PyEval_MakeFrameVector(
4700 tstate, con, locals, args, argcount, kwnames);
4701 if (f == NULL) {
4702 return NULL;
4703 }
4704 if (((PyCodeObject *)con->fc_code)->co_flags & (CO_GENERATOR | CO_COROUTINE | CO_ASYNC_GENERATOR)) {
4705 return make_coro(con, f);
4706 }
4707 PyObject *retval = _PyEval_EvalFrame(tstate, f, 0);
4708
4709 /* decref'ing the frame can cause __del__ methods to get invoked,
4710 which can call back into Python. While we're done with the
4711 current Python frame (f), the associated C stack is still in use,
4712 so recursion_depth must be boosted for the duration.
4713 */
4714 if (Py_REFCNT(f) > 1) {
4715 Py_DECREF(f);
4716 _PyObject_GC_TRACK(f);
4717 }
4718 else {
4719 ++tstate->recursion_depth;
4720 Py_DECREF(f);
4721 --tstate->recursion_depth;
4722 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004723 return retval;
Tim Peters5ca576e2001-06-18 22:08:13 +00004724}
4725
Mark Shannond6c33fb2021-01-29 13:24:55 +00004726/* Legacy API */
Victor Stinnerb5e170f2019-11-16 01:03:22 +01004727PyObject *
Mark Shannon0332e562021-02-01 10:42:03 +00004728PyEval_EvalCodeEx(PyObject *_co, PyObject *globals, PyObject *locals,
4729 PyObject *const *args, int argcount,
4730 PyObject *const *kws, int kwcount,
4731 PyObject *const *defs, int defcount,
4732 PyObject *kwdefs, PyObject *closure)
Victor Stinnerb5e170f2019-11-16 01:03:22 +01004733{
Victor Stinner46496f92021-02-20 15:17:18 +01004734 PyThreadState *tstate = _PyThreadState_GET();
Mark Shannon0332e562021-02-01 10:42:03 +00004735 PyObject *res;
Mark Shannond6c33fb2021-01-29 13:24:55 +00004736 PyObject *defaults = _PyTuple_FromArray(defs, defcount);
4737 if (defaults == NULL) {
4738 return NULL;
4739 }
Victor Stinner46496f92021-02-20 15:17:18 +01004740 PyObject *builtins = _PyEval_BuiltinsFromGlobals(tstate, globals);
Mark Shannond6c33fb2021-01-29 13:24:55 +00004741 if (builtins == NULL) {
4742 Py_DECREF(defaults);
4743 return NULL;
4744 }
Dong-hee Na3cf08332021-02-14 15:54:39 +09004745 assert ((((PyCodeObject *)_co)->co_flags & (CO_NEWLOCALS | CO_OPTIMIZED)) == 0);
Mark Shannon0332e562021-02-01 10:42:03 +00004746 if (locals == NULL) {
4747 locals = globals;
4748 }
4749 PyObject *kwnames;
4750 PyObject *const *allargs;
4751 PyObject **newargs;
4752 if (kwcount == 0) {
4753 allargs = args;
4754 kwnames = NULL;
4755 }
4756 else {
4757 kwnames = PyTuple_New(kwcount);
4758 if (kwnames == NULL) {
4759 res = NULL;
4760 goto fail;
4761 }
4762 newargs = PyMem_Malloc(sizeof(PyObject *)*(kwcount+argcount));
4763 if (newargs == NULL) {
4764 res = NULL;
4765 Py_DECREF(kwnames);
4766 goto fail;
4767 }
4768 for (int i = 0; i < argcount; i++) {
4769 newargs[i] = args[i];
4770 }
4771 for (int i = 0; i < kwcount; i++) {
4772 Py_INCREF(kws[2*i]);
4773 PyTuple_SET_ITEM(kwnames, i, kws[2*i]);
4774 newargs[argcount+i] = kws[2*i+1];
4775 }
4776 allargs = newargs;
4777 }
4778 PyObject **kwargs = PyMem_Malloc(sizeof(PyObject *)*kwcount);
4779 if (kwargs == NULL) {
4780 res = NULL;
4781 Py_DECREF(kwnames);
4782 goto fail;
4783 }
4784 for (int i = 0; i < kwcount; i++) {
4785 Py_INCREF(kws[2*i]);
4786 PyTuple_SET_ITEM(kwnames, i, kws[2*i]);
4787 kwargs[i] = kws[2*i+1];
4788 }
Mark Shannond6c33fb2021-01-29 13:24:55 +00004789 PyFrameConstructor constr = {
4790 .fc_globals = globals,
4791 .fc_builtins = builtins,
Mark Shannon0332e562021-02-01 10:42:03 +00004792 .fc_name = ((PyCodeObject *)_co)->co_name,
4793 .fc_qualname = ((PyCodeObject *)_co)->co_name,
Mark Shannond6c33fb2021-01-29 13:24:55 +00004794 .fc_code = _co,
4795 .fc_defaults = defaults,
4796 .fc_kwdefaults = kwdefs,
4797 .fc_closure = closure
4798 };
Mark Shannon0332e562021-02-01 10:42:03 +00004799 res = _PyEval_Vector(tstate, &constr, locals,
Victor Stinner44085a32021-02-18 19:20:16 +01004800 allargs, argcount,
4801 kwnames);
Mark Shannon0332e562021-02-01 10:42:03 +00004802 if (kwcount) {
4803 Py_DECREF(kwnames);
4804 PyMem_Free(newargs);
4805 }
4806fail:
Mark Shannond6c33fb2021-01-29 13:24:55 +00004807 Py_DECREF(defaults);
4808 Py_DECREF(builtins);
4809 return res;
Victor Stinnerb5e170f2019-11-16 01:03:22 +01004810}
4811
Tim Peters5ca576e2001-06-18 22:08:13 +00004812
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004813static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02004814special_lookup(PyThreadState *tstate, PyObject *o, _Py_Identifier *id)
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004815{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004816 PyObject *res;
Benjamin Petersonce798522012-01-22 11:24:29 -05004817 res = _PyObject_LookupSpecial(o, id);
Victor Stinner438a12d2019-05-24 17:01:38 +02004818 if (res == NULL && !_PyErr_Occurred(tstate)) {
Victor Stinner4804b5b2020-05-12 01:43:38 +02004819 _PyErr_SetObject(tstate, PyExc_AttributeError, _PyUnicode_FromId(id));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004820 return NULL;
4821 }
4822 return res;
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004823}
4824
4825
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00004826/* Logic for the raise statement (too complicated for inlining).
4827 This *consumes* a reference count to each of its arguments. */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004828static int
Victor Stinner09532fe2019-05-10 23:39:09 +02004829do_raise(PyThreadState *tstate, PyObject *exc, PyObject *cause)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00004830{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004831 PyObject *type = NULL, *value = NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00004832
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004833 if (exc == NULL) {
4834 /* Reraise */
Mark Shannonae3087c2017-10-22 22:41:51 +01004835 _PyErr_StackItem *exc_info = _PyErr_GetTopmostException(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004836 PyObject *tb;
Mark Shannonae3087c2017-10-22 22:41:51 +01004837 type = exc_info->exc_type;
4838 value = exc_info->exc_value;
4839 tb = exc_info->exc_traceback;
Victor Stinnereec93312016-08-18 18:13:10 +02004840 if (type == Py_None || type == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004841 _PyErr_SetString(tstate, PyExc_RuntimeError,
4842 "No active exception to reraise");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004843 return 0;
4844 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004845 Py_XINCREF(type);
4846 Py_XINCREF(value);
4847 Py_XINCREF(tb);
Victor Stinner438a12d2019-05-24 17:01:38 +02004848 _PyErr_Restore(tstate, type, value, tb);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004849 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004850 }
Guido van Rossumac7be682001-01-17 15:42:30 +00004851
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004852 /* We support the following forms of raise:
4853 raise
Collin Winter828f04a2007-08-31 00:04:24 +00004854 raise <instance>
4855 raise <type> */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00004856
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004857 if (PyExceptionClass_Check(exc)) {
4858 type = exc;
Victor Stinnera5ed5f02016-12-06 18:45:50 +01004859 value = _PyObject_CallNoArg(exc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004860 if (value == NULL)
4861 goto raise_error;
Benjamin Peterson5afa03a2011-07-15 14:09:26 -05004862 if (!PyExceptionInstance_Check(value)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004863 _PyErr_Format(tstate, PyExc_TypeError,
4864 "calling %R should have returned an instance of "
4865 "BaseException, not %R",
4866 type, Py_TYPE(value));
4867 goto raise_error;
Benjamin Peterson5afa03a2011-07-15 14:09:26 -05004868 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004869 }
4870 else if (PyExceptionInstance_Check(exc)) {
4871 value = exc;
4872 type = PyExceptionInstance_Class(exc);
4873 Py_INCREF(type);
4874 }
4875 else {
4876 /* Not something you can raise. You get an exception
4877 anyway, just not what you specified :-) */
4878 Py_DECREF(exc);
Victor Stinner438a12d2019-05-24 17:01:38 +02004879 _PyErr_SetString(tstate, PyExc_TypeError,
4880 "exceptions must derive from BaseException");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004881 goto raise_error;
4882 }
Collin Winter828f04a2007-08-31 00:04:24 +00004883
Serhiy Storchakac0191582016-09-27 11:37:10 +03004884 assert(type != NULL);
4885 assert(value != NULL);
4886
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004887 if (cause) {
4888 PyObject *fixed_cause;
4889 if (PyExceptionClass_Check(cause)) {
Victor Stinnera5ed5f02016-12-06 18:45:50 +01004890 fixed_cause = _PyObject_CallNoArg(cause);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004891 if (fixed_cause == NULL)
4892 goto raise_error;
Benjamin Petersond5a1c442012-05-14 22:09:31 -07004893 Py_DECREF(cause);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004894 }
Benjamin Petersond5a1c442012-05-14 22:09:31 -07004895 else if (PyExceptionInstance_Check(cause)) {
4896 fixed_cause = cause;
4897 }
4898 else if (cause == Py_None) {
4899 Py_DECREF(cause);
4900 fixed_cause = NULL;
4901 }
4902 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02004903 _PyErr_SetString(tstate, PyExc_TypeError,
4904 "exception causes must derive from "
4905 "BaseException");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004906 goto raise_error;
4907 }
Benjamin Petersond5a1c442012-05-14 22:09:31 -07004908 PyException_SetCause(value, fixed_cause);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004909 }
Collin Winter828f04a2007-08-31 00:04:24 +00004910
Victor Stinner438a12d2019-05-24 17:01:38 +02004911 _PyErr_SetObject(tstate, type, value);
Victor Stinner61f4db82020-01-28 03:37:45 +01004912 /* _PyErr_SetObject incref's its arguments */
Serhiy Storchakac0191582016-09-27 11:37:10 +03004913 Py_DECREF(value);
4914 Py_DECREF(type);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004915 return 0;
Collin Winter828f04a2007-08-31 00:04:24 +00004916
4917raise_error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004918 Py_XDECREF(value);
4919 Py_XDECREF(type);
4920 Py_XDECREF(cause);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004921 return 0;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00004922}
4923
Tim Petersd6d010b2001-06-21 02:49:55 +00004924/* Iterate v argcnt times and store the results on the stack (via decreasing
Guido van Rossum0368b722007-05-11 16:50:42 +00004925 sp). Return 1 for success, 0 if error.
Antoine Pitrou9a2310d2008-07-25 22:39:39 +00004926
Guido van Rossum0368b722007-05-11 16:50:42 +00004927 If argcntafter == -1, do a simple unpack. If it is >= 0, do an unpack
4928 with a variable target.
4929*/
Tim Petersd6d010b2001-06-21 02:49:55 +00004930
Barry Warsawe42b18f1997-08-25 22:13:04 +00004931static int
Victor Stinner438a12d2019-05-24 17:01:38 +02004932unpack_iterable(PyThreadState *tstate, PyObject *v,
4933 int argcnt, int argcntafter, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00004934{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004935 int i = 0, j = 0;
4936 Py_ssize_t ll = 0;
4937 PyObject *it; /* iter(v) */
4938 PyObject *w;
4939 PyObject *l = NULL; /* variable list */
Guido van Rossumac7be682001-01-17 15:42:30 +00004940
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004941 assert(v != NULL);
Tim Petersd6d010b2001-06-21 02:49:55 +00004942
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004943 it = PyObject_GetIter(v);
Serhiy Storchaka13a6c092017-12-26 12:30:41 +02004944 if (it == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004945 if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError) &&
Victor Stinnera102ed72020-02-07 02:24:48 +01004946 Py_TYPE(v)->tp_iter == NULL && !PySequence_Check(v))
Serhiy Storchaka13a6c092017-12-26 12:30:41 +02004947 {
Victor Stinner438a12d2019-05-24 17:01:38 +02004948 _PyErr_Format(tstate, PyExc_TypeError,
4949 "cannot unpack non-iterable %.200s object",
Victor Stinnera102ed72020-02-07 02:24:48 +01004950 Py_TYPE(v)->tp_name);
Serhiy Storchaka13a6c092017-12-26 12:30:41 +02004951 }
4952 return 0;
4953 }
Tim Petersd6d010b2001-06-21 02:49:55 +00004954
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004955 for (; i < argcnt; i++) {
4956 w = PyIter_Next(it);
4957 if (w == NULL) {
4958 /* Iterator done, via error or exhaustion. */
Victor Stinner438a12d2019-05-24 17:01:38 +02004959 if (!_PyErr_Occurred(tstate)) {
R David Murray4171bbe2015-04-15 17:08:45 -04004960 if (argcntafter == -1) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004961 _PyErr_Format(tstate, PyExc_ValueError,
4962 "not enough values to unpack "
4963 "(expected %d, got %d)",
4964 argcnt, i);
R David Murray4171bbe2015-04-15 17:08:45 -04004965 }
4966 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02004967 _PyErr_Format(tstate, PyExc_ValueError,
4968 "not enough values to unpack "
4969 "(expected at least %d, got %d)",
4970 argcnt + argcntafter, i);
R David Murray4171bbe2015-04-15 17:08:45 -04004971 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004972 }
4973 goto Error;
4974 }
4975 *--sp = w;
4976 }
Tim Petersd6d010b2001-06-21 02:49:55 +00004977
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004978 if (argcntafter == -1) {
4979 /* We better have exhausted the iterator now. */
4980 w = PyIter_Next(it);
4981 if (w == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004982 if (_PyErr_Occurred(tstate))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004983 goto Error;
4984 Py_DECREF(it);
4985 return 1;
4986 }
4987 Py_DECREF(w);
Victor Stinner438a12d2019-05-24 17:01:38 +02004988 _PyErr_Format(tstate, PyExc_ValueError,
4989 "too many values to unpack (expected %d)",
4990 argcnt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004991 goto Error;
4992 }
Guido van Rossum0368b722007-05-11 16:50:42 +00004993
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004994 l = PySequence_List(it);
4995 if (l == NULL)
4996 goto Error;
4997 *--sp = l;
4998 i++;
Guido van Rossum0368b722007-05-11 16:50:42 +00004999
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005000 ll = PyList_GET_SIZE(l);
5001 if (ll < argcntafter) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005002 _PyErr_Format(tstate, PyExc_ValueError,
R David Murray4171bbe2015-04-15 17:08:45 -04005003 "not enough values to unpack (expected at least %d, got %zd)",
5004 argcnt + argcntafter, argcnt + ll);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005005 goto Error;
5006 }
Guido van Rossum0368b722007-05-11 16:50:42 +00005007
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005008 /* Pop the "after-variable" args off the list. */
5009 for (j = argcntafter; j > 0; j--, i++) {
5010 *--sp = PyList_GET_ITEM(l, ll - j);
5011 }
5012 /* Resize the list. */
Victor Stinner60ac6ed2020-02-07 23:18:08 +01005013 Py_SET_SIZE(l, ll - argcntafter);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005014 Py_DECREF(it);
5015 return 1;
Guido van Rossum0368b722007-05-11 16:50:42 +00005016
Tim Petersd6d010b2001-06-21 02:49:55 +00005017Error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005018 for (; i > 0; i--, sp++)
5019 Py_DECREF(*sp);
5020 Py_XDECREF(it);
5021 return 0;
Barry Warsawe42b18f1997-08-25 22:13:04 +00005022}
5023
5024
Guido van Rossum96a42c81992-01-12 02:29:51 +00005025#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00005026static int
Victor Stinner438a12d2019-05-24 17:01:38 +02005027prtrace(PyThreadState *tstate, PyObject *v, const char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005028{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005029 printf("%s ", str);
Victor Stinner438a12d2019-05-24 17:01:38 +02005030 if (PyObject_Print(v, stdout, 0) != 0) {
5031 /* Don't know what else to do */
5032 _PyErr_Clear(tstate);
5033 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005034 printf("\n");
5035 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005036}
Guido van Rossum3f5da241990-12-20 15:06:42 +00005037#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005038
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00005039static void
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005040call_exc_trace(Py_tracefunc func, PyObject *self,
Mark Shannon86433452021-01-07 16:49:02 +00005041 PyThreadState *tstate,
5042 PyFrameObject *f,
5043 PyCodeAddressRange *bounds)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00005044{
Victor Stinneraaa8ed82013-07-10 13:57:55 +02005045 PyObject *type, *value, *traceback, *orig_traceback, *arg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005046 int err;
Victor Stinner438a12d2019-05-24 17:01:38 +02005047 _PyErr_Fetch(tstate, &type, &value, &orig_traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005048 if (value == NULL) {
5049 value = Py_None;
5050 Py_INCREF(value);
5051 }
Victor Stinner438a12d2019-05-24 17:01:38 +02005052 _PyErr_NormalizeException(tstate, &type, &value, &orig_traceback);
Antoine Pitrou89335212013-11-23 14:05:23 +01005053 traceback = (orig_traceback != NULL) ? orig_traceback : Py_None;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005054 arg = PyTuple_Pack(3, type, value, traceback);
5055 if (arg == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005056 _PyErr_Restore(tstate, type, value, orig_traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005057 return;
5058 }
Mark Shannon86433452021-01-07 16:49:02 +00005059 err = call_trace(func, self, tstate, f, bounds, PyTrace_EXCEPTION, arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005060 Py_DECREF(arg);
Victor Stinner438a12d2019-05-24 17:01:38 +02005061 if (err == 0) {
5062 _PyErr_Restore(tstate, type, value, orig_traceback);
5063 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005064 else {
5065 Py_XDECREF(type);
5066 Py_XDECREF(value);
Victor Stinneraaa8ed82013-07-10 13:57:55 +02005067 Py_XDECREF(orig_traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005068 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00005069}
5070
Amaury Forgeot d'Arcf05149a2007-11-13 01:05:30 +00005071static int
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005072call_trace_protected(Py_tracefunc func, PyObject *obj,
5073 PyThreadState *tstate, PyFrameObject *frame,
Mark Shannon86433452021-01-07 16:49:02 +00005074 PyCodeAddressRange *bounds,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005075 int what, PyObject *arg)
Fred Drake4ec5d562001-10-04 19:26:43 +00005076{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005077 PyObject *type, *value, *traceback;
5078 int err;
Victor Stinner438a12d2019-05-24 17:01:38 +02005079 _PyErr_Fetch(tstate, &type, &value, &traceback);
Mark Shannon86433452021-01-07 16:49:02 +00005080 err = call_trace(func, obj, tstate, frame, bounds, what, arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005081 if (err == 0)
5082 {
Victor Stinner438a12d2019-05-24 17:01:38 +02005083 _PyErr_Restore(tstate, type, value, traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005084 return 0;
5085 }
5086 else {
5087 Py_XDECREF(type);
5088 Py_XDECREF(value);
5089 Py_XDECREF(traceback);
5090 return -1;
5091 }
Fred Drake4ec5d562001-10-04 19:26:43 +00005092}
5093
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00005094static int
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005095call_trace(Py_tracefunc func, PyObject *obj,
5096 PyThreadState *tstate, PyFrameObject *frame,
Mark Shannon86433452021-01-07 16:49:02 +00005097 PyCodeAddressRange *bounds,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005098 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00005099{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005100 int result;
5101 if (tstate->tracing)
5102 return 0;
5103 tstate->tracing++;
5104 tstate->use_tracing = 0;
Mark Shannon86433452021-01-07 16:49:02 +00005105 if (frame->f_lasti < 0) {
5106 frame->f_lineno = frame->f_code->co_firstlineno;
5107 }
5108 else {
5109 frame->f_lineno = _PyCode_CheckLineNumber(frame->f_lasti, bounds);
5110 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005111 result = func(obj, frame, what, arg);
Mark Shannon86433452021-01-07 16:49:02 +00005112 frame->f_lineno = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005113 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
5114 || (tstate->c_profilefunc != NULL));
5115 tstate->tracing--;
5116 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00005117}
5118
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00005119PyObject *
5120_PyEval_CallTracing(PyObject *func, PyObject *args)
5121{
Victor Stinner50b48572018-11-01 01:51:40 +01005122 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005123 int save_tracing = tstate->tracing;
5124 int save_use_tracing = tstate->use_tracing;
5125 PyObject *result;
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00005126
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005127 tstate->tracing = 0;
5128 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
5129 || (tstate->c_profilefunc != NULL));
5130 result = PyObject_Call(func, args, NULL);
5131 tstate->tracing = save_tracing;
5132 tstate->use_tracing = save_use_tracing;
5133 return result;
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00005134}
5135
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00005136/* See Objects/lnotab_notes.txt for a description of how tracing works. */
Michael W. Hudson006c7522002-11-08 13:08:46 +00005137static int
Tim Peters8a5c3c72004-04-05 19:36:21 +00005138maybe_call_line_trace(Py_tracefunc func, PyObject *obj,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005139 PyThreadState *tstate, PyFrameObject *frame,
Mark Shannon877df852020-11-12 09:43:29 +00005140 PyCodeAddressRange *bounds, int *instr_prev)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00005141{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005142 int result = 0;
Michael W. Hudson006c7522002-11-08 13:08:46 +00005143
Nick Coghlan5a851672017-09-08 10:14:16 +10005144 /* If the last instruction falls at the start of a line or if it
5145 represents a jump backwards, update the frame's line number and
5146 then call the trace function if we're tracing source lines.
5147 */
Mark Shannonee9f98d2021-01-05 12:04:10 +00005148 int lastline = bounds->ar_line;
5149 int line = _PyCode_CheckLineNumber(frame->f_lasti, bounds);
5150 if (line != -1 && frame->f_trace_lines) {
5151 /* Trace backward edges or first instruction of a new line */
5152 if (frame->f_lasti < *instr_prev ||
5153 (line != lastline && frame->f_lasti == bounds->ar_start))
5154 {
Mark Shannon86433452021-01-07 16:49:02 +00005155 result = call_trace(func, obj, tstate, frame, bounds, PyTrace_LINE, Py_None);
Nick Coghlan5a851672017-09-08 10:14:16 +10005156 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005157 }
George King20faa682017-10-18 17:44:22 -07005158 /* Always emit an opcode event if we're tracing all opcodes. */
5159 if (frame->f_trace_opcodes) {
Mark Shannon86433452021-01-07 16:49:02 +00005160 result = call_trace(func, obj, tstate, frame, bounds, PyTrace_OPCODE, Py_None);
George King20faa682017-10-18 17:44:22 -07005161 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005162 *instr_prev = frame->f_lasti;
5163 return result;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00005164}
5165
Victor Stinner309d7cc2020-03-13 16:39:12 +01005166int
5167_PyEval_SetProfile(PyThreadState *tstate, Py_tracefunc func, PyObject *arg)
5168{
Victor Stinnerda2914d2020-03-20 09:29:08 +01005169 assert(is_tstate_valid(tstate));
Victor Stinner309d7cc2020-03-13 16:39:12 +01005170 /* The caller must hold the GIL */
5171 assert(PyGILState_Check());
5172
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005173 /* Call _PySys_Audit() in the context of the current thread state,
Victor Stinner309d7cc2020-03-13 16:39:12 +01005174 even if tstate is not the current thread state. */
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005175 PyThreadState *current_tstate = _PyThreadState_GET();
5176 if (_PySys_Audit(current_tstate, "sys.setprofile", NULL) < 0) {
Victor Stinner309d7cc2020-03-13 16:39:12 +01005177 return -1;
5178 }
5179
5180 PyObject *profileobj = tstate->c_profileobj;
5181
5182 tstate->c_profilefunc = NULL;
5183 tstate->c_profileobj = NULL;
5184 /* Must make sure that tracing is not ignored if 'profileobj' is freed */
5185 tstate->use_tracing = tstate->c_tracefunc != NULL;
5186 Py_XDECREF(profileobj);
5187
5188 Py_XINCREF(arg);
5189 tstate->c_profileobj = arg;
5190 tstate->c_profilefunc = func;
5191
5192 /* Flag that tracing or profiling is turned on */
5193 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
5194 return 0;
5195}
5196
Fred Drake5755ce62001-06-27 19:19:46 +00005197void
5198PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00005199{
Victor Stinner309d7cc2020-03-13 16:39:12 +01005200 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerf6a58502020-03-16 17:41:44 +01005201 if (_PyEval_SetProfile(tstate, func, arg) < 0) {
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005202 /* Log _PySys_Audit() error */
Victor Stinnerf6a58502020-03-16 17:41:44 +01005203 _PyErr_WriteUnraisableMsg("in PyEval_SetProfile", NULL);
5204 }
Victor Stinner309d7cc2020-03-13 16:39:12 +01005205}
5206
5207int
5208_PyEval_SetTrace(PyThreadState *tstate, Py_tracefunc func, PyObject *arg)
5209{
Victor Stinnerda2914d2020-03-20 09:29:08 +01005210 assert(is_tstate_valid(tstate));
Victor Stinner309d7cc2020-03-13 16:39:12 +01005211 /* The caller must hold the GIL */
5212 assert(PyGILState_Check());
5213
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005214 /* Call _PySys_Audit() in the context of the current thread state,
Victor Stinner309d7cc2020-03-13 16:39:12 +01005215 even if tstate is not the current thread state. */
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005216 PyThreadState *current_tstate = _PyThreadState_GET();
5217 if (_PySys_Audit(current_tstate, "sys.settrace", NULL) < 0) {
Victor Stinner309d7cc2020-03-13 16:39:12 +01005218 return -1;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005219 }
5220
Victor Stinnerda2914d2020-03-20 09:29:08 +01005221 struct _ceval_state *ceval2 = &tstate->interp->ceval;
Victor Stinner309d7cc2020-03-13 16:39:12 +01005222 PyObject *traceobj = tstate->c_traceobj;
Victor Stinnerda2914d2020-03-20 09:29:08 +01005223 ceval2->tracing_possible += (func != NULL) - (tstate->c_tracefunc != NULL);
Victor Stinner309d7cc2020-03-13 16:39:12 +01005224
5225 tstate->c_tracefunc = NULL;
5226 tstate->c_traceobj = NULL;
5227 /* Must make sure that profiling is not ignored if 'traceobj' is freed */
5228 tstate->use_tracing = (tstate->c_profilefunc != NULL);
5229 Py_XDECREF(traceobj);
5230
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005231 Py_XINCREF(arg);
Victor Stinner309d7cc2020-03-13 16:39:12 +01005232 tstate->c_traceobj = arg;
5233 tstate->c_tracefunc = func;
5234
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005235 /* Flag that tracing or profiling is turned on */
Victor Stinner309d7cc2020-03-13 16:39:12 +01005236 tstate->use_tracing = ((func != NULL)
5237 || (tstate->c_profilefunc != NULL));
5238
5239 return 0;
Fred Drake5755ce62001-06-27 19:19:46 +00005240}
5241
5242void
5243PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
5244{
Victor Stinner309d7cc2020-03-13 16:39:12 +01005245 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerf6a58502020-03-16 17:41:44 +01005246 if (_PyEval_SetTrace(tstate, func, arg) < 0) {
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005247 /* Log _PySys_Audit() error */
Victor Stinnerf6a58502020-03-16 17:41:44 +01005248 _PyErr_WriteUnraisableMsg("in PyEval_SetTrace", NULL);
5249 }
Fred Draked0838392001-06-16 21:02:31 +00005250}
5251
Victor Stinner309d7cc2020-03-13 16:39:12 +01005252
Yury Selivanov75445082015-05-11 22:57:16 -04005253void
Victor Stinner838f2642019-06-13 22:41:23 +02005254_PyEval_SetCoroutineOriginTrackingDepth(PyThreadState *tstate, int new_depth)
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08005255{
5256 assert(new_depth >= 0);
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08005257 tstate->coroutine_origin_tracking_depth = new_depth;
5258}
5259
5260int
5261_PyEval_GetCoroutineOriginTrackingDepth(void)
5262{
Victor Stinner50b48572018-11-01 01:51:40 +01005263 PyThreadState *tstate = _PyThreadState_GET();
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08005264 return tstate->coroutine_origin_tracking_depth;
5265}
5266
Zackery Spytz79ceccd2020-03-26 06:11:13 -06005267int
Yury Selivanoveb636452016-09-08 22:01:51 -07005268_PyEval_SetAsyncGenFirstiter(PyObject *firstiter)
5269{
Victor Stinner50b48572018-11-01 01:51:40 +01005270 PyThreadState *tstate = _PyThreadState_GET();
Steve Dowerb82e17e2019-05-23 08:45:22 -07005271
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005272 if (_PySys_Audit(tstate, "sys.set_asyncgen_hook_firstiter", NULL) < 0) {
Zackery Spytz79ceccd2020-03-26 06:11:13 -06005273 return -1;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005274 }
5275
Yury Selivanoveb636452016-09-08 22:01:51 -07005276 Py_XINCREF(firstiter);
5277 Py_XSETREF(tstate->async_gen_firstiter, firstiter);
Zackery Spytz79ceccd2020-03-26 06:11:13 -06005278 return 0;
Yury Selivanoveb636452016-09-08 22:01:51 -07005279}
5280
5281PyObject *
5282_PyEval_GetAsyncGenFirstiter(void)
5283{
Victor Stinner50b48572018-11-01 01:51:40 +01005284 PyThreadState *tstate = _PyThreadState_GET();
Yury Selivanoveb636452016-09-08 22:01:51 -07005285 return tstate->async_gen_firstiter;
5286}
5287
Zackery Spytz79ceccd2020-03-26 06:11:13 -06005288int
Yury Selivanoveb636452016-09-08 22:01:51 -07005289_PyEval_SetAsyncGenFinalizer(PyObject *finalizer)
5290{
Victor Stinner50b48572018-11-01 01:51:40 +01005291 PyThreadState *tstate = _PyThreadState_GET();
Steve Dowerb82e17e2019-05-23 08:45:22 -07005292
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005293 if (_PySys_Audit(tstate, "sys.set_asyncgen_hook_finalizer", NULL) < 0) {
Zackery Spytz79ceccd2020-03-26 06:11:13 -06005294 return -1;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005295 }
5296
Yury Selivanoveb636452016-09-08 22:01:51 -07005297 Py_XINCREF(finalizer);
5298 Py_XSETREF(tstate->async_gen_finalizer, finalizer);
Zackery Spytz79ceccd2020-03-26 06:11:13 -06005299 return 0;
Yury Selivanoveb636452016-09-08 22:01:51 -07005300}
5301
5302PyObject *
5303_PyEval_GetAsyncGenFinalizer(void)
5304{
Victor Stinner50b48572018-11-01 01:51:40 +01005305 PyThreadState *tstate = _PyThreadState_GET();
Yury Selivanoveb636452016-09-08 22:01:51 -07005306 return tstate->async_gen_finalizer;
5307}
5308
Victor Stinner438a12d2019-05-24 17:01:38 +02005309PyFrameObject *
5310PyEval_GetFrame(void)
5311{
5312 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner6723e932020-03-20 17:46:56 +01005313 return tstate->frame;
Victor Stinner438a12d2019-05-24 17:01:38 +02005314}
5315
Guido van Rossumb209a111997-04-29 18:18:01 +00005316PyObject *
Victor Stinner46496f92021-02-20 15:17:18 +01005317_PyEval_GetBuiltins(PyThreadState *tstate)
5318{
5319 PyFrameObject *frame = tstate->frame;
5320 if (frame != NULL) {
5321 return frame->f_builtins;
5322 }
5323 return tstate->interp->builtins;
5324}
5325
5326PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005327PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00005328{
Victor Stinner438a12d2019-05-24 17:01:38 +02005329 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner46496f92021-02-20 15:17:18 +01005330 return _PyEval_GetBuiltins(tstate);
Guido van Rossum6135a871995-01-09 17:53:26 +00005331}
5332
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02005333/* Convenience function to get a builtin from its name */
5334PyObject *
5335_PyEval_GetBuiltinId(_Py_Identifier *name)
5336{
Victor Stinner438a12d2019-05-24 17:01:38 +02005337 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02005338 PyObject *attr = _PyDict_GetItemIdWithError(PyEval_GetBuiltins(), name);
5339 if (attr) {
5340 Py_INCREF(attr);
5341 }
Victor Stinner438a12d2019-05-24 17:01:38 +02005342 else if (!_PyErr_Occurred(tstate)) {
5343 _PyErr_SetObject(tstate, PyExc_AttributeError, _PyUnicode_FromId(name));
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02005344 }
5345 return attr;
5346}
5347
Guido van Rossumb209a111997-04-29 18:18:01 +00005348PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005349PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00005350{
Victor Stinner438a12d2019-05-24 17:01:38 +02005351 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner6723e932020-03-20 17:46:56 +01005352 PyFrameObject *current_frame = tstate->frame;
Victor Stinner41bb43a2013-10-29 01:19:37 +01005353 if (current_frame == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005354 _PyErr_SetString(tstate, PyExc_SystemError, "frame does not exist");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005355 return NULL;
Victor Stinner41bb43a2013-10-29 01:19:37 +01005356 }
5357
Victor Stinner438a12d2019-05-24 17:01:38 +02005358 if (PyFrame_FastToLocalsWithError(current_frame) < 0) {
Victor Stinner41bb43a2013-10-29 01:19:37 +01005359 return NULL;
Victor Stinner438a12d2019-05-24 17:01:38 +02005360 }
Victor Stinner41bb43a2013-10-29 01:19:37 +01005361
5362 assert(current_frame->f_locals != NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005363 return current_frame->f_locals;
Guido van Rossum5b722181993-03-30 17:46:03 +00005364}
5365
Guido van Rossumb209a111997-04-29 18:18:01 +00005366PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005367PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00005368{
Victor Stinner438a12d2019-05-24 17:01:38 +02005369 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner6723e932020-03-20 17:46:56 +01005370 PyFrameObject *current_frame = tstate->frame;
Victor Stinner438a12d2019-05-24 17:01:38 +02005371 if (current_frame == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005372 return NULL;
Victor Stinner438a12d2019-05-24 17:01:38 +02005373 }
Victor Stinner41bb43a2013-10-29 01:19:37 +01005374
5375 assert(current_frame->f_globals != NULL);
5376 return current_frame->f_globals;
Guido van Rossum3f5da241990-12-20 15:06:42 +00005377}
5378
Guido van Rossum6135a871995-01-09 17:53:26 +00005379int
Tim Peters5ba58662001-07-16 02:29:45 +00005380PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
Jeremy Hylton061d1062001-03-22 02:32:48 +00005381{
Victor Stinner438a12d2019-05-24 17:01:38 +02005382 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner6723e932020-03-20 17:46:56 +01005383 PyFrameObject *current_frame = tstate->frame;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005384 int result = cf->cf_flags != 0;
Tim Peters5ba58662001-07-16 02:29:45 +00005385
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005386 if (current_frame != NULL) {
5387 const int codeflags = current_frame->f_code->co_flags;
5388 const int compilerflags = codeflags & PyCF_MASK;
5389 if (compilerflags) {
5390 result = 1;
5391 cf->cf_flags |= compilerflags;
5392 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00005393#if 0 /* future keyword */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005394 if (codeflags & CO_GENERATOR_ALLOWED) {
5395 result = 1;
5396 cf->cf_flags |= CO_GENERATOR_ALLOWED;
5397 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00005398#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005399 }
5400 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00005401}
5402
Guido van Rossum3f5da241990-12-20 15:06:42 +00005403
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00005404const char *
Tim Peters6d6c1a32001-08-02 04:15:00 +00005405PyEval_GetFuncName(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00005406{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005407 if (PyMethod_Check(func))
5408 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
5409 else if (PyFunction_Check(func))
Serhiy Storchaka06515832016-11-20 09:13:07 +02005410 return PyUnicode_AsUTF8(((PyFunctionObject*)func)->func_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005411 else if (PyCFunction_Check(func))
5412 return ((PyCFunctionObject*)func)->m_ml->ml_name;
5413 else
Victor Stinnera102ed72020-02-07 02:24:48 +01005414 return Py_TYPE(func)->tp_name;
Jeremy Hylton512a2372001-04-11 13:52:29 +00005415}
5416
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00005417const char *
Tim Peters6d6c1a32001-08-02 04:15:00 +00005418PyEval_GetFuncDesc(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00005419{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005420 if (PyMethod_Check(func))
5421 return "()";
5422 else if (PyFunction_Check(func))
5423 return "()";
5424 else if (PyCFunction_Check(func))
5425 return "()";
5426 else
5427 return " object";
Jeremy Hylton512a2372001-04-11 13:52:29 +00005428}
5429
Armin Rigo1c2d7e52005-09-20 18:34:01 +00005430#define C_TRACE(x, call) \
Nicholas Bastind858a772004-06-25 23:31:06 +00005431if (tstate->use_tracing && tstate->c_profilefunc) { \
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005432 if (call_trace(tstate->c_profilefunc, tstate->c_profileobj, \
Mark Shannon86433452021-01-07 16:49:02 +00005433 tstate, tstate->frame, bounds, \
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005434 PyTrace_C_CALL, func)) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005435 x = NULL; \
5436 } \
5437 else { \
5438 x = call; \
5439 if (tstate->c_profilefunc != NULL) { \
5440 if (x == NULL) { \
5441 call_trace_protected(tstate->c_profilefunc, \
5442 tstate->c_profileobj, \
Mark Shannon86433452021-01-07 16:49:02 +00005443 tstate, tstate->frame, bounds, \
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005444 PyTrace_C_EXCEPTION, func); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005445 /* XXX should pass (type, value, tb) */ \
5446 } else { \
5447 if (call_trace(tstate->c_profilefunc, \
5448 tstate->c_profileobj, \
Mark Shannon86433452021-01-07 16:49:02 +00005449 tstate, tstate->frame, bounds, \
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005450 PyTrace_C_RETURN, func)) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005451 Py_DECREF(x); \
5452 x = NULL; \
5453 } \
5454 } \
5455 } \
5456 } \
Nicholas Bastind858a772004-06-25 23:31:06 +00005457} else { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005458 x = call; \
5459 }
Nicholas Bastinc69ebe82004-03-24 21:57:10 +00005460
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005461
5462static PyObject *
5463trace_call_function(PyThreadState *tstate,
Mark Shannon86433452021-01-07 16:49:02 +00005464 PyCodeAddressRange *bounds,
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005465 PyObject *func,
5466 PyObject **args, Py_ssize_t nargs,
5467 PyObject *kwnames)
5468{
5469 PyObject *x;
scoder4c9ea092020-05-12 16:12:41 +02005470 if (PyCFunction_CheckExact(func) || PyCMethod_CheckExact(func)) {
Petr Viktorinffd97532020-02-11 17:46:57 +01005471 C_TRACE(x, PyObject_Vectorcall(func, args, nargs, kwnames));
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005472 return x;
5473 }
Andy Lesterdffe4c02020-03-04 07:15:20 -06005474 else if (Py_IS_TYPE(func, &PyMethodDescr_Type) && nargs > 0) {
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005475 /* We need to create a temporary bound method as argument
5476 for profiling.
5477
5478 If nargs == 0, then this cannot work because we have no
5479 "self". In any case, the call itself would raise
5480 TypeError (foo needs an argument), so we just skip
5481 profiling. */
5482 PyObject *self = args[0];
5483 func = Py_TYPE(func)->tp_descr_get(func, self, (PyObject*)Py_TYPE(self));
5484 if (func == NULL) {
5485 return NULL;
5486 }
Petr Viktorinffd97532020-02-11 17:46:57 +01005487 C_TRACE(x, PyObject_Vectorcall(func,
Jeroen Demeyer0d722f32019-07-05 14:48:24 +02005488 args+1, nargs-1,
5489 kwnames));
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005490 Py_DECREF(func);
5491 return x;
5492 }
Petr Viktorinffd97532020-02-11 17:46:57 +01005493 return PyObject_Vectorcall(func, args, nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames);
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005494}
5495
Victor Stinner415c5102017-01-11 00:54:57 +01005496/* Issue #29227: Inline call_function() into _PyEval_EvalFrameDefault()
5497 to reduce the stack consumption. */
5498Py_LOCAL_INLINE(PyObject *) _Py_HOT_FUNCTION
Mark Shannon86433452021-01-07 16:49:02 +00005499call_function(PyThreadState *tstate,
5500 PyCodeAddressRange *bounds,
5501 PyObject ***pp_stack,
5502 Py_ssize_t oparg,
5503 PyObject *kwnames)
Jeremy Hyltone8c04322002-08-16 17:47:26 +00005504{
Victor Stinnerf9b760f2016-09-09 10:17:08 -07005505 PyObject **pfunc = (*pp_stack) - oparg - 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005506 PyObject *func = *pfunc;
5507 PyObject *x, *w;
Victor Stinnerd8735722016-09-09 12:36:44 -07005508 Py_ssize_t nkwargs = (kwnames == NULL) ? 0 : PyTuple_GET_SIZE(kwnames);
5509 Py_ssize_t nargs = oparg - nkwargs;
INADA Naoki5566bbb2017-02-03 07:43:03 +09005510 PyObject **stack = (*pp_stack) - nargs - nkwargs;
Jeremy Hyltone8c04322002-08-16 17:47:26 +00005511
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005512 if (tstate->use_tracing) {
Mark Shannon86433452021-01-07 16:49:02 +00005513 x = trace_call_function(tstate, bounds, func, stack, nargs, kwnames);
INADA Naoki5566bbb2017-02-03 07:43:03 +09005514 }
Victor Stinner4a7cc882015-03-06 23:35:27 +01005515 else {
Petr Viktorinffd97532020-02-11 17:46:57 +01005516 x = PyObject_Vectorcall(func, stack, nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005517 }
Tim Peters8a5c3c72004-04-05 19:36:21 +00005518
Victor Stinner438a12d2019-05-24 17:01:38 +02005519 assert((x != NULL) ^ (_PyErr_Occurred(tstate) != NULL));
Victor Stinnerf9b760f2016-09-09 10:17:08 -07005520
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01005521 /* Clear the stack of the function object. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005522 while ((*pp_stack) > pfunc) {
5523 w = EXT_POP(*pp_stack);
5524 Py_DECREF(w);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005525 }
Victor Stinnerace47d72013-07-18 01:41:08 +02005526
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005527 return x;
Jeremy Hyltone8c04322002-08-16 17:47:26 +00005528}
5529
Jeremy Hylton52820442001-01-03 23:52:36 +00005530static PyObject *
Mark Shannon86433452021-01-07 16:49:02 +00005531do_call_core(PyThreadState *tstate,
5532 PyCodeAddressRange *bounds,
5533 PyObject *func,
5534 PyObject *callargs,
5535 PyObject *kwdict)
Jeremy Hylton52820442001-01-03 23:52:36 +00005536{
jdemeyere89de732018-09-19 12:06:20 +02005537 PyObject *result;
5538
scoder4c9ea092020-05-12 16:12:41 +02005539 if (PyCFunction_CheckExact(func) || PyCMethod_CheckExact(func)) {
Jeroen Demeyer7a6873c2019-09-11 13:01:01 +02005540 C_TRACE(result, PyObject_Call(func, callargs, kwdict));
Victor Stinnerf9b760f2016-09-09 10:17:08 -07005541 return result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005542 }
Andy Lesterdffe4c02020-03-04 07:15:20 -06005543 else if (Py_IS_TYPE(func, &PyMethodDescr_Type)) {
jdemeyere89de732018-09-19 12:06:20 +02005544 Py_ssize_t nargs = PyTuple_GET_SIZE(callargs);
5545 if (nargs > 0 && tstate->use_tracing) {
5546 /* We need to create a temporary bound method as argument
5547 for profiling.
5548
5549 If nargs == 0, then this cannot work because we have no
5550 "self". In any case, the call itself would raise
5551 TypeError (foo needs an argument), so we just skip
5552 profiling. */
5553 PyObject *self = PyTuple_GET_ITEM(callargs, 0);
5554 func = Py_TYPE(func)->tp_descr_get(func, self, (PyObject*)Py_TYPE(self));
5555 if (func == NULL) {
5556 return NULL;
5557 }
5558
Victor Stinner4d231bc2019-11-14 13:36:21 +01005559 C_TRACE(result, _PyObject_FastCallDictTstate(
5560 tstate, func,
5561 &_PyTuple_ITEMS(callargs)[1],
5562 nargs - 1,
5563 kwdict));
jdemeyere89de732018-09-19 12:06:20 +02005564 Py_DECREF(func);
5565 return result;
5566 }
Victor Stinner74319ae2016-08-25 00:04:09 +02005567 }
jdemeyere89de732018-09-19 12:06:20 +02005568 return PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00005569}
5570
Serhiy Storchaka483405b2015-02-17 10:14:30 +02005571/* Extract a slice index from a PyLong or an object with the
Guido van Rossum38fff8c2006-03-07 18:50:55 +00005572 nb_index slot defined, and store in *pi.
5573 Silently reduce values larger than PY_SSIZE_T_MAX to PY_SSIZE_T_MAX,
Xiang Zhang2ddf5a12017-05-10 18:19:41 +08005574 and silently boost values less than PY_SSIZE_T_MIN to PY_SSIZE_T_MIN.
Martin v. Löwisdde99d22006-02-17 15:57:41 +00005575 Return 0 on error, 1 on success.
Tim Peterscb479e72001-12-16 19:11:44 +00005576*/
Guido van Rossum20c6add2000-05-08 14:06:50 +00005577int
Martin v. Löwis18e16552006-02-15 17:27:45 +00005578_PyEval_SliceIndex(PyObject *v, Py_ssize_t *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005579{
Victor Stinner438a12d2019-05-24 17:01:38 +02005580 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005581 if (v != Py_None) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005582 Py_ssize_t x;
Victor Stinnera15e2602020-04-08 02:01:56 +02005583 if (_PyIndex_Check(v)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005584 x = PyNumber_AsSsize_t(v, NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02005585 if (x == -1 && _PyErr_Occurred(tstate))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005586 return 0;
5587 }
5588 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02005589 _PyErr_SetString(tstate, PyExc_TypeError,
5590 "slice indices must be integers or "
5591 "None or have an __index__ method");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005592 return 0;
5593 }
5594 *pi = x;
5595 }
5596 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005597}
5598
Serhiy Storchaka80ec8362017-03-19 19:37:40 +02005599int
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005600_PyEval_SliceIndexNotNone(PyObject *v, Py_ssize_t *pi)
Serhiy Storchaka80ec8362017-03-19 19:37:40 +02005601{
Victor Stinner438a12d2019-05-24 17:01:38 +02005602 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005603 Py_ssize_t x;
Victor Stinnera15e2602020-04-08 02:01:56 +02005604 if (_PyIndex_Check(v)) {
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005605 x = PyNumber_AsSsize_t(v, NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02005606 if (x == -1 && _PyErr_Occurred(tstate))
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005607 return 0;
5608 }
5609 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02005610 _PyErr_SetString(tstate, PyExc_TypeError,
5611 "slice indices must be integers or "
5612 "have an __index__ method");
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005613 return 0;
5614 }
5615 *pi = x;
5616 return 1;
Serhiy Storchaka80ec8362017-03-19 19:37:40 +02005617}
5618
Thomas Wouters52152252000-08-17 22:55:00 +00005619static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02005620import_name(PyThreadState *tstate, PyFrameObject *f,
5621 PyObject *name, PyObject *fromlist, PyObject *level)
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005622{
5623 _Py_IDENTIFIER(__import__);
Victor Stinnerdf142fd2016-08-20 00:44:42 +02005624 PyObject *import_func, *res;
5625 PyObject* stack[5];
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005626
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02005627 import_func = _PyDict_GetItemIdWithError(f->f_builtins, &PyId___import__);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005628 if (import_func == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005629 if (!_PyErr_Occurred(tstate)) {
5630 _PyErr_SetString(tstate, PyExc_ImportError, "__import__ not found");
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02005631 }
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005632 return NULL;
5633 }
5634
5635 /* Fast path for not overloaded __import__. */
Victor Stinner438a12d2019-05-24 17:01:38 +02005636 if (import_func == tstate->interp->import_func) {
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005637 int ilevel = _PyLong_AsInt(level);
Victor Stinner438a12d2019-05-24 17:01:38 +02005638 if (ilevel == -1 && _PyErr_Occurred(tstate)) {
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005639 return NULL;
5640 }
5641 res = PyImport_ImportModuleLevelObject(
5642 name,
5643 f->f_globals,
5644 f->f_locals == NULL ? Py_None : f->f_locals,
5645 fromlist,
5646 ilevel);
5647 return res;
5648 }
5649
5650 Py_INCREF(import_func);
Victor Stinnerdf142fd2016-08-20 00:44:42 +02005651
5652 stack[0] = name;
5653 stack[1] = f->f_globals;
5654 stack[2] = f->f_locals == NULL ? Py_None : f->f_locals;
5655 stack[3] = fromlist;
5656 stack[4] = level;
Victor Stinner559bb6a2016-08-22 22:48:54 +02005657 res = _PyObject_FastCall(import_func, stack, 5);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005658 Py_DECREF(import_func);
5659 return res;
5660}
5661
5662static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02005663import_from(PyThreadState *tstate, PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00005664{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005665 PyObject *x;
Xiang Zhang4830f582017-03-21 11:13:42 +08005666 PyObject *fullmodname, *pkgname, *pkgpath, *pkgname_or_unknown, *errmsg;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00005667
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005668 if (_PyObject_LookupAttr(v, name, &x) != 0) {
Antoine Pitrou0373a102014-10-13 20:19:45 +02005669 return x;
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005670 }
Antoine Pitrou0373a102014-10-13 20:19:45 +02005671 /* Issue #17636: in case this failed because of a circular relative
5672 import, try to fallback on reading the module directly from
5673 sys.modules. */
Antoine Pitrou0373a102014-10-13 20:19:45 +02005674 pkgname = _PyObject_GetAttrId(v, &PyId___name__);
Brett Cannon3008bc02015-08-11 18:01:31 -07005675 if (pkgname == NULL) {
5676 goto error;
5677 }
Oren Milman6db70332017-09-19 14:23:01 +03005678 if (!PyUnicode_Check(pkgname)) {
5679 Py_CLEAR(pkgname);
5680 goto error;
5681 }
Antoine Pitrou0373a102014-10-13 20:19:45 +02005682 fullmodname = PyUnicode_FromFormat("%U.%U", pkgname, name);
Brett Cannon3008bc02015-08-11 18:01:31 -07005683 if (fullmodname == NULL) {
Xiang Zhang4830f582017-03-21 11:13:42 +08005684 Py_DECREF(pkgname);
Antoine Pitrou0373a102014-10-13 20:19:45 +02005685 return NULL;
Brett Cannon3008bc02015-08-11 18:01:31 -07005686 }
Eric Snow3f9eee62017-09-15 16:35:20 -06005687 x = PyImport_GetModule(fullmodname);
Antoine Pitrou0373a102014-10-13 20:19:45 +02005688 Py_DECREF(fullmodname);
Victor Stinner438a12d2019-05-24 17:01:38 +02005689 if (x == NULL && !_PyErr_Occurred(tstate)) {
Brett Cannon3008bc02015-08-11 18:01:31 -07005690 goto error;
5691 }
Matthias Bussonnier1bc15642017-02-22 07:06:50 -08005692 Py_DECREF(pkgname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005693 return x;
Brett Cannon3008bc02015-08-11 18:01:31 -07005694 error:
Matthias Bussonnierbc4bed42017-02-14 16:05:25 -08005695 pkgpath = PyModule_GetFilenameObject(v);
Matthias Bussonnier1bc15642017-02-22 07:06:50 -08005696 if (pkgname == NULL) {
5697 pkgname_or_unknown = PyUnicode_FromString("<unknown module name>");
5698 if (pkgname_or_unknown == NULL) {
5699 Py_XDECREF(pkgpath);
5700 return NULL;
5701 }
5702 } else {
5703 pkgname_or_unknown = pkgname;
5704 }
Matthias Bussonnierbc4bed42017-02-14 16:05:25 -08005705
5706 if (pkgpath == NULL || !PyUnicode_Check(pkgpath)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005707 _PyErr_Clear(tstate);
Xiang Zhang4830f582017-03-21 11:13:42 +08005708 errmsg = PyUnicode_FromFormat(
5709 "cannot import name %R from %R (unknown location)",
5710 name, pkgname_or_unknown
5711 );
Stefan Krah027b09c2019-03-25 21:50:58 +01005712 /* NULL checks for errmsg and pkgname done by PyErr_SetImportError. */
Xiang Zhang4830f582017-03-21 11:13:42 +08005713 PyErr_SetImportError(errmsg, pkgname, NULL);
5714 }
5715 else {
Anthony Sottile65366bc2019-09-09 08:17:50 -07005716 _Py_IDENTIFIER(__spec__);
5717 PyObject *spec = _PyObject_GetAttrId(v, &PyId___spec__);
Anthony Sottile65366bc2019-09-09 08:17:50 -07005718 const char *fmt =
5719 _PyModuleSpec_IsInitializing(spec) ?
5720 "cannot import name %R from partially initialized module %R "
5721 "(most likely due to a circular import) (%S)" :
5722 "cannot import name %R from %R (%S)";
5723 Py_XDECREF(spec);
5724
5725 errmsg = PyUnicode_FromFormat(fmt, name, pkgname_or_unknown, pkgpath);
Stefan Krah027b09c2019-03-25 21:50:58 +01005726 /* NULL checks for errmsg and pkgname done by PyErr_SetImportError. */
Xiang Zhang4830f582017-03-21 11:13:42 +08005727 PyErr_SetImportError(errmsg, pkgname, pkgpath);
Matthias Bussonnierbc4bed42017-02-14 16:05:25 -08005728 }
5729
Xiang Zhang4830f582017-03-21 11:13:42 +08005730 Py_XDECREF(errmsg);
Matthias Bussonnier1bc15642017-02-22 07:06:50 -08005731 Py_XDECREF(pkgname_or_unknown);
5732 Py_XDECREF(pkgpath);
Brett Cannon3008bc02015-08-11 18:01:31 -07005733 return NULL;
Thomas Wouters52152252000-08-17 22:55:00 +00005734}
Guido van Rossumac7be682001-01-17 15:42:30 +00005735
Thomas Wouters52152252000-08-17 22:55:00 +00005736static int
Victor Stinner438a12d2019-05-24 17:01:38 +02005737import_all_from(PyThreadState *tstate, PyObject *locals, PyObject *v)
Thomas Wouters52152252000-08-17 22:55:00 +00005738{
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02005739 _Py_IDENTIFIER(__all__);
5740 _Py_IDENTIFIER(__dict__);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005741 PyObject *all, *dict, *name, *value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005742 int skip_leading_underscores = 0;
5743 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00005744
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005745 if (_PyObject_LookupAttrId(v, &PyId___all__, &all) < 0) {
5746 return -1; /* Unexpected error */
5747 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005748 if (all == NULL) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005749 if (_PyObject_LookupAttrId(v, &PyId___dict__, &dict) < 0) {
5750 return -1;
5751 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005752 if (dict == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005753 _PyErr_SetString(tstate, PyExc_ImportError,
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005754 "from-import-* object has no __dict__ and no __all__");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005755 return -1;
5756 }
5757 all = PyMapping_Keys(dict);
5758 Py_DECREF(dict);
5759 if (all == NULL)
5760 return -1;
5761 skip_leading_underscores = 1;
5762 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00005763
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005764 for (pos = 0, err = 0; ; pos++) {
5765 name = PySequence_GetItem(all, pos);
5766 if (name == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005767 if (!_PyErr_ExceptionMatches(tstate, PyExc_IndexError)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005768 err = -1;
Victor Stinner438a12d2019-05-24 17:01:38 +02005769 }
5770 else {
5771 _PyErr_Clear(tstate);
5772 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005773 break;
5774 }
Xiang Zhangd8b291a2018-03-24 18:39:36 +08005775 if (!PyUnicode_Check(name)) {
5776 PyObject *modname = _PyObject_GetAttrId(v, &PyId___name__);
5777 if (modname == NULL) {
5778 Py_DECREF(name);
5779 err = -1;
5780 break;
5781 }
5782 if (!PyUnicode_Check(modname)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005783 _PyErr_Format(tstate, PyExc_TypeError,
5784 "module __name__ must be a string, not %.100s",
5785 Py_TYPE(modname)->tp_name);
Xiang Zhangd8b291a2018-03-24 18:39:36 +08005786 }
5787 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02005788 _PyErr_Format(tstate, PyExc_TypeError,
5789 "%s in %U.%s must be str, not %.100s",
5790 skip_leading_underscores ? "Key" : "Item",
5791 modname,
5792 skip_leading_underscores ? "__dict__" : "__all__",
5793 Py_TYPE(name)->tp_name);
Xiang Zhangd8b291a2018-03-24 18:39:36 +08005794 }
5795 Py_DECREF(modname);
5796 Py_DECREF(name);
5797 err = -1;
5798 break;
5799 }
5800 if (skip_leading_underscores) {
Serhiy Storchakae3b2b4b2017-09-08 09:58:51 +03005801 if (PyUnicode_READY(name) == -1) {
5802 Py_DECREF(name);
5803 err = -1;
5804 break;
5805 }
5806 if (PyUnicode_READ_CHAR(name, 0) == '_') {
5807 Py_DECREF(name);
5808 continue;
5809 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005810 }
5811 value = PyObject_GetAttr(v, name);
5812 if (value == NULL)
5813 err = -1;
5814 else if (PyDict_CheckExact(locals))
5815 err = PyDict_SetItem(locals, name, value);
5816 else
5817 err = PyObject_SetItem(locals, name, value);
5818 Py_DECREF(name);
5819 Py_XDECREF(value);
5820 if (err != 0)
5821 break;
5822 }
5823 Py_DECREF(all);
5824 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00005825}
5826
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005827static int
Victor Stinner438a12d2019-05-24 17:01:38 +02005828check_args_iterable(PyThreadState *tstate, PyObject *func, PyObject *args)
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005829{
Victor Stinnera102ed72020-02-07 02:24:48 +01005830 if (Py_TYPE(args)->tp_iter == NULL && !PySequence_Check(args)) {
Jeroen Demeyerbf17d412019-11-05 16:48:04 +01005831 /* check_args_iterable() may be called with a live exception:
5832 * clear it to prevent calling _PyObject_FunctionStr() with an
5833 * exception set. */
Victor Stinner61f4db82020-01-28 03:37:45 +01005834 _PyErr_Clear(tstate);
Jeroen Demeyerbf17d412019-11-05 16:48:04 +01005835 PyObject *funcstr = _PyObject_FunctionStr(func);
5836 if (funcstr != NULL) {
5837 _PyErr_Format(tstate, PyExc_TypeError,
5838 "%U argument after * must be an iterable, not %.200s",
5839 funcstr, Py_TYPE(args)->tp_name);
5840 Py_DECREF(funcstr);
5841 }
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005842 return -1;
5843 }
5844 return 0;
5845}
5846
5847static void
Victor Stinner438a12d2019-05-24 17:01:38 +02005848format_kwargs_error(PyThreadState *tstate, PyObject *func, PyObject *kwargs)
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005849{
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005850 /* _PyDict_MergeEx raises attribute
5851 * error (percolated from an attempt
5852 * to get 'keys' attribute) instead of
5853 * a type error if its second argument
5854 * is not a mapping.
5855 */
Victor Stinner438a12d2019-05-24 17:01:38 +02005856 if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) {
Victor Stinner61f4db82020-01-28 03:37:45 +01005857 _PyErr_Clear(tstate);
Jeroen Demeyerbf17d412019-11-05 16:48:04 +01005858 PyObject *funcstr = _PyObject_FunctionStr(func);
5859 if (funcstr != NULL) {
5860 _PyErr_Format(
5861 tstate, PyExc_TypeError,
5862 "%U argument after ** must be a mapping, not %.200s",
5863 funcstr, Py_TYPE(kwargs)->tp_name);
5864 Py_DECREF(funcstr);
5865 }
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005866 }
Victor Stinner438a12d2019-05-24 17:01:38 +02005867 else if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005868 PyObject *exc, *val, *tb;
Victor Stinner438a12d2019-05-24 17:01:38 +02005869 _PyErr_Fetch(tstate, &exc, &val, &tb);
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005870 if (val && PyTuple_Check(val) && PyTuple_GET_SIZE(val) == 1) {
Victor Stinner61f4db82020-01-28 03:37:45 +01005871 _PyErr_Clear(tstate);
Jeroen Demeyerbf17d412019-11-05 16:48:04 +01005872 PyObject *funcstr = _PyObject_FunctionStr(func);
5873 if (funcstr != NULL) {
5874 PyObject *key = PyTuple_GET_ITEM(val, 0);
5875 _PyErr_Format(
5876 tstate, PyExc_TypeError,
5877 "%U got multiple values for keyword argument '%S'",
5878 funcstr, key);
5879 Py_DECREF(funcstr);
5880 }
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005881 Py_XDECREF(exc);
5882 Py_XDECREF(val);
5883 Py_XDECREF(tb);
5884 }
5885 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02005886 _PyErr_Restore(tstate, exc, val, tb);
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005887 }
5888 }
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005889}
5890
Guido van Rossumac7be682001-01-17 15:42:30 +00005891static void
Victor Stinner438a12d2019-05-24 17:01:38 +02005892format_exc_check_arg(PyThreadState *tstate, PyObject *exc,
5893 const char *format_str, PyObject *obj)
Paul Prescode68140d2000-08-30 20:25:01 +00005894{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005895 const char *obj_str;
Paul Prescode68140d2000-08-30 20:25:01 +00005896
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005897 if (!obj)
5898 return;
Paul Prescode68140d2000-08-30 20:25:01 +00005899
Serhiy Storchaka06515832016-11-20 09:13:07 +02005900 obj_str = PyUnicode_AsUTF8(obj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005901 if (!obj_str)
5902 return;
Paul Prescode68140d2000-08-30 20:25:01 +00005903
Victor Stinner438a12d2019-05-24 17:01:38 +02005904 _PyErr_Format(tstate, exc, format_str, obj_str);
Paul Prescode68140d2000-08-30 20:25:01 +00005905}
Guido van Rossum950361c1997-01-24 13:49:28 +00005906
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005907static void
Victor Stinner438a12d2019-05-24 17:01:38 +02005908format_exc_unbound(PyThreadState *tstate, PyCodeObject *co, int oparg)
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005909{
5910 PyObject *name;
5911 /* Don't stomp existing exception */
Victor Stinner438a12d2019-05-24 17:01:38 +02005912 if (_PyErr_Occurred(tstate))
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005913 return;
5914 if (oparg < PyTuple_GET_SIZE(co->co_cellvars)) {
5915 name = PyTuple_GET_ITEM(co->co_cellvars,
5916 oparg);
Victor Stinner438a12d2019-05-24 17:01:38 +02005917 format_exc_check_arg(tstate,
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005918 PyExc_UnboundLocalError,
5919 UNBOUNDLOCAL_ERROR_MSG,
5920 name);
5921 } else {
5922 name = PyTuple_GET_ITEM(co->co_freevars, oparg -
5923 PyTuple_GET_SIZE(co->co_cellvars));
Victor Stinner438a12d2019-05-24 17:01:38 +02005924 format_exc_check_arg(tstate, PyExc_NameError,
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005925 UNBOUNDFREE_ERROR_MSG, name);
5926 }
5927}
5928
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03005929static void
Mark Shannonfee55262019-11-21 09:11:43 +00005930format_awaitable_error(PyThreadState *tstate, PyTypeObject *type, int prevprevopcode, int prevopcode)
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03005931{
5932 if (type->tp_as_async == NULL || type->tp_as_async->am_await == NULL) {
5933 if (prevopcode == BEFORE_ASYNC_WITH) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005934 _PyErr_Format(tstate, PyExc_TypeError,
5935 "'async with' received an object from __aenter__ "
5936 "that does not implement __await__: %.100s",
5937 type->tp_name);
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03005938 }
Mark Shannonfee55262019-11-21 09:11:43 +00005939 else if (prevopcode == WITH_EXCEPT_START || (prevopcode == CALL_FUNCTION && prevprevopcode == DUP_TOP)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005940 _PyErr_Format(tstate, PyExc_TypeError,
5941 "'async with' received an object from __aexit__ "
5942 "that does not implement __await__: %.100s",
5943 type->tp_name);
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03005944 }
5945 }
5946}
5947
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005948static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02005949unicode_concatenate(PyThreadState *tstate, PyObject *v, PyObject *w,
Serhiy Storchakaab874002016-09-11 13:48:15 +03005950 PyFrameObject *f, const _Py_CODEUNIT *next_instr)
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005951{
5952 PyObject *res;
5953 if (Py_REFCNT(v) == 2) {
5954 /* In the common case, there are 2 references to the value
5955 * stored in 'variable' when the += is performed: one on the
5956 * value stack (in 'v') and one still stored in the
5957 * 'variable'. We try to delete the variable now to reduce
5958 * the refcnt to 1.
5959 */
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03005960 int opcode, oparg;
5961 NEXTOPARG();
5962 switch (opcode) {
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005963 case STORE_FAST:
5964 {
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005965 PyObject **fastlocals = f->f_localsplus;
5966 if (GETLOCAL(oparg) == v)
5967 SETLOCAL(oparg, NULL);
5968 break;
5969 }
5970 case STORE_DEREF:
5971 {
5972 PyObject **freevars = (f->f_localsplus +
5973 f->f_code->co_nlocals);
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03005974 PyObject *c = freevars[oparg];
Raymond Hettingerc32f9db2016-11-12 04:10:35 -05005975 if (PyCell_GET(c) == v) {
5976 PyCell_SET(c, NULL);
5977 Py_DECREF(v);
5978 }
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005979 break;
5980 }
5981 case STORE_NAME:
5982 {
5983 PyObject *names = f->f_code->co_names;
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03005984 PyObject *name = GETITEM(names, oparg);
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005985 PyObject *locals = f->f_locals;
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02005986 if (locals && PyDict_CheckExact(locals)) {
5987 PyObject *w = PyDict_GetItemWithError(locals, name);
5988 if ((w == v && PyDict_DelItem(locals, name) != 0) ||
Victor Stinner438a12d2019-05-24 17:01:38 +02005989 (w == NULL && _PyErr_Occurred(tstate)))
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02005990 {
5991 Py_DECREF(v);
5992 return NULL;
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005993 }
5994 }
5995 break;
5996 }
5997 }
5998 }
5999 res = v;
6000 PyUnicode_Append(&res, w);
6001 return res;
6002}
6003
Guido van Rossum950361c1997-01-24 13:49:28 +00006004#ifdef DYNAMIC_EXECUTION_PROFILE
6005
Skip Montanarof118cb12001-10-15 20:51:38 +00006006static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00006007getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00006008{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006009 int i;
6010 PyObject *l = PyList_New(256);
6011 if (l == NULL) return NULL;
6012 for (i = 0; i < 256; i++) {
6013 PyObject *x = PyLong_FromLong(a[i]);
6014 if (x == NULL) {
6015 Py_DECREF(l);
6016 return NULL;
6017 }
Zackery Spytz99d56b52018-12-08 07:16:55 -07006018 PyList_SET_ITEM(l, i, x);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006019 }
6020 for (i = 0; i < 256; i++)
6021 a[i] = 0;
6022 return l;
Guido van Rossum950361c1997-01-24 13:49:28 +00006023}
6024
6025PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00006026_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00006027{
6028#ifndef DXPAIRS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006029 return getarray(dxp);
Guido van Rossum950361c1997-01-24 13:49:28 +00006030#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006031 int i;
6032 PyObject *l = PyList_New(257);
6033 if (l == NULL) return NULL;
6034 for (i = 0; i < 257; i++) {
6035 PyObject *x = getarray(dxpairs[i]);
6036 if (x == NULL) {
6037 Py_DECREF(l);
6038 return NULL;
6039 }
Zackery Spytz99d56b52018-12-08 07:16:55 -07006040 PyList_SET_ITEM(l, i, x);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006041 }
6042 return l;
Guido van Rossum950361c1997-01-24 13:49:28 +00006043#endif
6044}
6045
6046#endif
Brett Cannon5c4de282016-09-07 11:16:41 -07006047
6048Py_ssize_t
6049_PyEval_RequestCodeExtraIndex(freefunc free)
6050{
Victor Stinner81a7be32020-04-14 15:14:01 +02006051 PyInterpreterState *interp = _PyInterpreterState_GET();
Brett Cannon5c4de282016-09-07 11:16:41 -07006052 Py_ssize_t new_index;
6053
Dino Viehlandf3cffd22017-06-21 14:44:36 -07006054 if (interp->co_extra_user_count == MAX_CO_EXTRA_USERS - 1) {
Brett Cannon5c4de282016-09-07 11:16:41 -07006055 return -1;
6056 }
Dino Viehlandf3cffd22017-06-21 14:44:36 -07006057 new_index = interp->co_extra_user_count++;
6058 interp->co_extra_freefuncs[new_index] = free;
Brett Cannon5c4de282016-09-07 11:16:41 -07006059 return new_index;
6060}
Łukasz Langaa785c872016-09-09 17:37:37 -07006061
6062static void
6063dtrace_function_entry(PyFrameObject *f)
6064{
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02006065 const char *filename;
6066 const char *funcname;
Łukasz Langaa785c872016-09-09 17:37:37 -07006067 int lineno;
6068
Victor Stinner6d86a232020-04-29 00:56:58 +02006069 PyCodeObject *code = f->f_code;
6070 filename = PyUnicode_AsUTF8(code->co_filename);
6071 funcname = PyUnicode_AsUTF8(code->co_name);
6072 lineno = PyCode_Addr2Line(code, f->f_lasti);
Łukasz Langaa785c872016-09-09 17:37:37 -07006073
Andy Lestere6be9b52020-02-11 20:28:35 -06006074 PyDTrace_FUNCTION_ENTRY(filename, funcname, lineno);
Łukasz Langaa785c872016-09-09 17:37:37 -07006075}
6076
6077static void
6078dtrace_function_return(PyFrameObject *f)
6079{
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02006080 const char *filename;
6081 const char *funcname;
Łukasz Langaa785c872016-09-09 17:37:37 -07006082 int lineno;
6083
Victor Stinner6d86a232020-04-29 00:56:58 +02006084 PyCodeObject *code = f->f_code;
6085 filename = PyUnicode_AsUTF8(code->co_filename);
6086 funcname = PyUnicode_AsUTF8(code->co_name);
6087 lineno = PyCode_Addr2Line(code, f->f_lasti);
Łukasz Langaa785c872016-09-09 17:37:37 -07006088
Andy Lestere6be9b52020-02-11 20:28:35 -06006089 PyDTrace_FUNCTION_RETURN(filename, funcname, lineno);
Łukasz Langaa785c872016-09-09 17:37:37 -07006090}
6091
6092/* DTrace equivalent of maybe_call_line_trace. */
6093static void
6094maybe_dtrace_line(PyFrameObject *frame,
Mark Shannon877df852020-11-12 09:43:29 +00006095 PyCodeAddressRange *bounds, int *instr_prev)
Łukasz Langaa785c872016-09-09 17:37:37 -07006096{
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02006097 const char *co_filename, *co_name;
Łukasz Langaa785c872016-09-09 17:37:37 -07006098
6099 /* If the last instruction executed isn't in the current
6100 instruction window, reset the window.
6101 */
Mark Shannon877df852020-11-12 09:43:29 +00006102 int line = _PyCode_CheckLineNumber(frame->f_lasti, bounds);
Łukasz Langaa785c872016-09-09 17:37:37 -07006103 /* If the last instruction falls at the start of a line or if
6104 it represents a jump backwards, update the frame's line
6105 number and call the trace function. */
Mark Shannon877df852020-11-12 09:43:29 +00006106 if (line != frame->f_lineno || frame->f_lasti < *instr_prev) {
6107 if (line != -1) {
6108 frame->f_lineno = line;
6109 co_filename = PyUnicode_AsUTF8(frame->f_code->co_filename);
6110 if (!co_filename)
6111 co_filename = "?";
6112 co_name = PyUnicode_AsUTF8(frame->f_code->co_name);
6113 if (!co_name)
6114 co_name = "?";
6115 PyDTrace_LINE(co_filename, co_name, line);
6116 }
Łukasz Langaa785c872016-09-09 17:37:37 -07006117 }
6118 *instr_prev = frame->f_lasti;
6119}
Victor Stinnerf4b1e3d2019-11-04 19:48:34 +01006120
6121
6122/* Implement Py_EnterRecursiveCall() and Py_LeaveRecursiveCall() as functions
6123 for the limited API. */
6124
6125#undef Py_EnterRecursiveCall
6126
6127int Py_EnterRecursiveCall(const char *where)
6128{
Victor Stinnerbe434dc2019-11-05 00:51:22 +01006129 return _Py_EnterRecursiveCall_inline(where);
Victor Stinnerf4b1e3d2019-11-04 19:48:34 +01006130}
6131
6132#undef Py_LeaveRecursiveCall
6133
6134void Py_LeaveRecursiveCall(void)
6135{
Victor Stinnerbe434dc2019-11-05 00:51:22 +01006136 _Py_LeaveRecursiveCall_inline();
Victor Stinnerf4b1e3d2019-11-04 19:48:34 +01006137}