blob: 3aa2aa2c9bc198de3beee2926ecc299a547f2567 [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 Stinnerdda5d6e2020-04-08 17:54:59 +0200301 if (!_Py_IsMainInterpreter(tstate)) {
302 /* 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 Stinnerdda5d6e2020-04-08 17:54:59 +0200326_PyEval_FiniGIL(PyThreadState *tstate)
327{
Victor Stinner7be4e352020-05-05 20:27:47 +0200328#ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200329 if (!_Py_IsMainInterpreter(tstate)) {
330 /* 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
338 struct _gil_runtime_state *gil = &tstate->interp->ceval.gil;
339#else
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200340 struct _gil_runtime_state *gil = &tstate->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 Stinner56bfdeb2020-03-18 09:26:25 +0100505_PyEval_SignalAsyncExc(PyThreadState *tstate)
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000506{
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200507 assert(is_tstate_valid(tstate));
508 SIGNAL_ASYNC_EXC(tstate->interp);
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000509}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000510
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000511PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000512PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000513{
Victor Stinner09532fe2019-05-10 23:39:09 +0200514 _PyRuntimeState *runtime = &_PyRuntime;
Victor Stinnere838a932020-05-05 19:56:48 +0200515#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
516 PyThreadState *old_tstate = _PyThreadState_GET();
517 PyThreadState *tstate = _PyThreadState_Swap(&runtime->gilstate, old_tstate);
518#else
Victor Stinner09532fe2019-05-10 23:39:09 +0200519 PyThreadState *tstate = _PyThreadState_Swap(&runtime->gilstate, NULL);
Victor Stinnere838a932020-05-05 19:56:48 +0200520#endif
Victor Stinner3026cad2020-06-01 16:02:40 +0200521 _Py_EnsureTstateNotNULL(tstate);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100522
Victor Stinner0b1e3302020-05-05 16:14:31 +0200523 struct _ceval_runtime_state *ceval = &runtime->ceval;
524 struct _ceval_state *ceval2 = &tstate->interp->ceval;
Victor Stinner7be4e352020-05-05 20:27:47 +0200525#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
526 assert(gil_created(&ceval2->gil));
527#else
Victor Stinnere225beb2019-06-03 18:14:24 +0200528 assert(gil_created(&ceval->gil));
Victor Stinner7be4e352020-05-05 20:27:47 +0200529#endif
Victor Stinner0b1e3302020-05-05 16:14:31 +0200530 drop_gil(ceval, ceval2, tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000531 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000532}
533
534void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000535PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000536{
Victor Stinner3026cad2020-06-01 16:02:40 +0200537 _Py_EnsureTstateNotNULL(tstate);
Victor Stinnereb4e2ae2020-03-08 11:57:45 +0100538
Victor Stinner85f5a692020-03-09 22:12:04 +0100539 take_gil(tstate);
Victor Stinner17c68b82020-01-30 12:20:48 +0100540
Victor Stinner85f5a692020-03-09 22:12:04 +0100541 struct _gilstate_runtime_state *gilstate = &tstate->interp->runtime->gilstate;
542 _PyThreadState_Swap(gilstate, tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000543}
544
545
Guido van Rossuma9672091994-09-14 13:31:22 +0000546/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
547 signal handlers or Mac I/O completion routines) can schedule calls
548 to a function to be called synchronously.
549 The synchronous function is called with one void* argument.
550 It should return 0 for success or -1 for failure -- failure should
551 be accompanied by an exception.
552
553 If registry succeeds, the registry function returns 0; if it fails
554 (e.g. due to too many pending calls) it returns -1 (without setting
555 an exception condition).
556
557 Note that because registry may occur from within signal handlers,
558 or other asynchronous events, calling malloc() is unsafe!
559
Guido van Rossuma9672091994-09-14 13:31:22 +0000560 Any thread can schedule pending calls, but only the main thread
561 will execute them.
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000562 There is no facility to schedule calls to a particular thread, but
563 that should be easy to change, should that ever be required. In
564 that case, the static variables here should go into the python
565 threadstate.
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000566*/
Guido van Rossuma9672091994-09-14 13:31:22 +0000567
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200568void
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200569_PyEval_SignalReceived(PyInterpreterState *interp)
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200570{
Victor Stinnerd96a7a82020-11-13 14:44:42 +0100571#ifdef MS_WINDOWS
572 // bpo-42296: On Windows, _PyEval_SignalReceived() is called from a signal
573 // handler which can run in a thread different than the Python thread, in
574 // which case _Py_ThreadCanHandleSignals() is wrong. Ignore
575 // _Py_ThreadCanHandleSignals() and always set eval_breaker to 1.
576 //
577 // The next eval_frame_handle_pending() call will call
578 // _Py_ThreadCanHandleSignals() to recompute eval_breaker.
579 int force = 1;
580#else
581 int force = 0;
582#endif
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200583 /* bpo-30703: Function called when the C signal handler of Python gets a
Victor Stinner50e6e992020-03-19 02:41:21 +0100584 signal. We cannot queue a callback using _PyEval_AddPendingCall() since
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200585 that function is not async-signal-safe. */
Victor Stinnerd96a7a82020-11-13 14:44:42 +0100586 SIGNAL_PENDING_SIGNALS(interp, force);
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200587}
588
Eric Snow5be45a62019-03-08 22:47:07 -0700589/* Push one item onto the queue while holding the lock. */
590static int
Victor Stinnere225beb2019-06-03 18:14:24 +0200591_push_pending_call(struct _pending_calls *pending,
Eric Snow842a2f02019-03-15 15:47:51 -0600592 int (*func)(void *), void *arg)
Eric Snow5be45a62019-03-08 22:47:07 -0700593{
Eric Snow842a2f02019-03-15 15:47:51 -0600594 int i = pending->last;
Eric Snow5be45a62019-03-08 22:47:07 -0700595 int j = (i + 1) % NPENDINGCALLS;
Eric Snow842a2f02019-03-15 15:47:51 -0600596 if (j == pending->first) {
Eric Snow5be45a62019-03-08 22:47:07 -0700597 return -1; /* Queue full */
598 }
Eric Snow842a2f02019-03-15 15:47:51 -0600599 pending->calls[i].func = func;
600 pending->calls[i].arg = arg;
601 pending->last = j;
Eric Snow5be45a62019-03-08 22:47:07 -0700602 return 0;
603}
604
605/* Pop one item off the queue while holding the lock. */
606static void
Victor Stinnere225beb2019-06-03 18:14:24 +0200607_pop_pending_call(struct _pending_calls *pending,
Eric Snow842a2f02019-03-15 15:47:51 -0600608 int (**func)(void *), void **arg)
Eric Snow5be45a62019-03-08 22:47:07 -0700609{
Eric Snow842a2f02019-03-15 15:47:51 -0600610 int i = pending->first;
611 if (i == pending->last) {
Eric Snow5be45a62019-03-08 22:47:07 -0700612 return; /* Queue empty */
613 }
614
Eric Snow842a2f02019-03-15 15:47:51 -0600615 *func = pending->calls[i].func;
616 *arg = pending->calls[i].arg;
617 pending->first = (i + 1) % NPENDINGCALLS;
Eric Snow5be45a62019-03-08 22:47:07 -0700618}
619
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200620/* This implementation is thread-safe. It allows
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000621 scheduling to be made from any thread, and even from an executing
622 callback.
623 */
624
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000625int
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200626_PyEval_AddPendingCall(PyInterpreterState *interp,
Victor Stinner09532fe2019-05-10 23:39:09 +0200627 int (*func)(void *), void *arg)
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000628{
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200629 struct _pending_calls *pending = &interp->ceval.pending;
Eric Snow842a2f02019-03-15 15:47:51 -0600630
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200631 /* Ensure that _PyEval_InitPendingCalls() was called
632 and that _PyEval_FiniPendingCalls() is not called yet. */
633 assert(pending->lock != NULL);
634
Eric Snow842a2f02019-03-15 15:47:51 -0600635 PyThread_acquire_lock(pending->lock, WAIT_LOCK);
Victor Stinnere225beb2019-06-03 18:14:24 +0200636 int result = _push_pending_call(pending, func, arg);
Eric Snow842a2f02019-03-15 15:47:51 -0600637 PyThread_release_lock(pending->lock);
Eric Snow5be45a62019-03-08 22:47:07 -0700638
Victor Stinnere225beb2019-06-03 18:14:24 +0200639 /* signal main loop */
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200640 SIGNAL_PENDING_CALLS(interp);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000641 return result;
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000642}
643
Victor Stinner09532fe2019-05-10 23:39:09 +0200644int
645Py_AddPendingCall(int (*func)(void *), void *arg)
646{
Victor Stinner50e6e992020-03-19 02:41:21 +0100647 /* Best-effort to support subinterpreters and calls with the GIL released.
648
649 First attempt _PyThreadState_GET() since it supports subinterpreters.
650
651 If the GIL is released, _PyThreadState_GET() returns NULL . In this
652 case, use PyGILState_GetThisThreadState() which works even if the GIL
653 is released.
654
655 Sadly, PyGILState_GetThisThreadState() doesn't support subinterpreters:
656 see bpo-10915 and bpo-15751.
657
Victor Stinner8849e592020-03-18 19:28:53 +0100658 Py_AddPendingCall() doesn't require the caller to hold the GIL. */
Victor Stinner50e6e992020-03-19 02:41:21 +0100659 PyThreadState *tstate = _PyThreadState_GET();
660 if (tstate == NULL) {
661 tstate = PyGILState_GetThisThreadState();
662 }
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200663
664 PyInterpreterState *interp;
665 if (tstate != NULL) {
666 interp = tstate->interp;
667 }
668 else {
669 /* Last resort: use the main interpreter */
670 interp = _PyRuntime.interpreters.main;
671 }
672 return _PyEval_AddPendingCall(interp, func, arg);
Victor Stinner09532fe2019-05-10 23:39:09 +0200673}
674
Eric Snowfdf282d2019-01-11 14:26:55 -0700675static int
Victor Stinnerd7fabc12020-03-18 01:56:21 +0100676handle_signals(PyThreadState *tstate)
Eric Snowfdf282d2019-01-11 14:26:55 -0700677{
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200678 assert(is_tstate_valid(tstate));
679 if (!_Py_ThreadCanHandleSignals(tstate->interp)) {
Eric Snow64d6cc82019-02-23 15:40:43 -0700680 return 0;
681 }
Eric Snowfdf282d2019-01-11 14:26:55 -0700682
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200683 UNSIGNAL_PENDING_SIGNALS(tstate->interp);
Victor Stinner72818982020-03-26 22:28:11 +0100684 if (_PyErr_CheckSignalsTstate(tstate) < 0) {
685 /* On failure, re-schedule a call to handle_signals(). */
Victor Stinnerd96a7a82020-11-13 14:44:42 +0100686 SIGNAL_PENDING_SIGNALS(tstate->interp, 0);
Eric Snowfdf282d2019-01-11 14:26:55 -0700687 return -1;
688 }
689 return 0;
690}
691
692static int
Victor Stinnerd7fabc12020-03-18 01:56:21 +0100693make_pending_calls(PyThreadState *tstate)
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000694{
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200695 assert(is_tstate_valid(tstate));
696
Victor Stinnerd8316882020-03-20 14:50:35 +0100697 /* only execute pending calls on main thread */
698 if (!_Py_ThreadCanHandlePendingCalls()) {
Victor Stinnere225beb2019-06-03 18:14:24 +0200699 return 0;
700 }
701
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000702 /* don't perform recursive pending calls */
Victor Stinnerda2914d2020-03-20 09:29:08 +0100703 static int busy = 0;
Eric Snowfdf282d2019-01-11 14:26:55 -0700704 if (busy) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000705 return 0;
Eric Snowfdf282d2019-01-11 14:26:55 -0700706 }
Charles-François Natalif23339a2011-07-23 18:15:43 +0200707 busy = 1;
Victor Stinnerda2914d2020-03-20 09:29:08 +0100708
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200709 /* unsignal before starting to call callbacks, so that any callback
710 added in-between re-signals */
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200711 UNSIGNAL_PENDING_CALLS(tstate->interp);
Eric Snowfdf282d2019-01-11 14:26:55 -0700712 int res = 0;
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200713
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000714 /* perform a bounded number of calls, in case of recursion */
Victor Stinnerda2914d2020-03-20 09:29:08 +0100715 struct _pending_calls *pending = &tstate->interp->ceval.pending;
Eric Snowfdf282d2019-01-11 14:26:55 -0700716 for (int i=0; i<NPENDINGCALLS; i++) {
Eric Snow5be45a62019-03-08 22:47:07 -0700717 int (*func)(void *) = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000718 void *arg = NULL;
719
720 /* pop one item off the queue while holding the lock */
Eric Snow842a2f02019-03-15 15:47:51 -0600721 PyThread_acquire_lock(pending->lock, WAIT_LOCK);
Victor Stinnere225beb2019-06-03 18:14:24 +0200722 _pop_pending_call(pending, &func, &arg);
Eric Snow842a2f02019-03-15 15:47:51 -0600723 PyThread_release_lock(pending->lock);
Eric Snow5be45a62019-03-08 22:47:07 -0700724
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100725 /* having released the lock, perform the callback */
Eric Snow5be45a62019-03-08 22:47:07 -0700726 if (func == NULL) {
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100727 break;
Eric Snow5be45a62019-03-08 22:47:07 -0700728 }
Eric Snowfdf282d2019-01-11 14:26:55 -0700729 res = func(arg);
730 if (res) {
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200731 goto error;
732 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000733 }
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200734
Charles-François Natalif23339a2011-07-23 18:15:43 +0200735 busy = 0;
Eric Snowfdf282d2019-01-11 14:26:55 -0700736 return res;
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200737
738error:
739 busy = 0;
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200740 SIGNAL_PENDING_CALLS(tstate->interp);
Eric Snowfdf282d2019-01-11 14:26:55 -0700741 return res;
742}
743
Eric Snow842a2f02019-03-15 15:47:51 -0600744void
Victor Stinner2b1df452020-01-13 18:46:59 +0100745_Py_FinishPendingCalls(PyThreadState *tstate)
Eric Snow842a2f02019-03-15 15:47:51 -0600746{
Eric Snow842a2f02019-03-15 15:47:51 -0600747 assert(PyGILState_Check());
748
Victor Stinner50e6e992020-03-19 02:41:21 +0100749 struct _pending_calls *pending = &tstate->interp->ceval.pending;
Victor Stinner09532fe2019-05-10 23:39:09 +0200750
Eric Snow842a2f02019-03-15 15:47:51 -0600751 if (!_Py_atomic_load_relaxed(&(pending->calls_to_do))) {
752 return;
753 }
754
Victor Stinnerd7fabc12020-03-18 01:56:21 +0100755 if (make_pending_calls(tstate) < 0) {
Victor Stinnere225beb2019-06-03 18:14:24 +0200756 PyObject *exc, *val, *tb;
757 _PyErr_Fetch(tstate, &exc, &val, &tb);
758 PyErr_BadInternalCall();
759 _PyErr_ChainExceptions(exc, val, tb);
760 _PyErr_Print(tstate);
Eric Snow842a2f02019-03-15 15:47:51 -0600761 }
762}
763
Eric Snowfdf282d2019-01-11 14:26:55 -0700764/* Py_MakePendingCalls() is a simple wrapper for the sake
765 of backward-compatibility. */
766int
767Py_MakePendingCalls(void)
768{
769 assert(PyGILState_Check());
770
Victor Stinnerd7fabc12020-03-18 01:56:21 +0100771 PyThreadState *tstate = _PyThreadState_GET();
772
Eric Snowfdf282d2019-01-11 14:26:55 -0700773 /* Python signal handler doesn't really queue a callback: it only signals
774 that a signal was received, see _PyEval_SignalReceived(). */
Victor Stinnerd7fabc12020-03-18 01:56:21 +0100775 int res = handle_signals(tstate);
Eric Snowfdf282d2019-01-11 14:26:55 -0700776 if (res != 0) {
777 return res;
778 }
779
Victor Stinnerd7fabc12020-03-18 01:56:21 +0100780 res = make_pending_calls(tstate);
Eric Snowb75b1a352019-04-12 10:20:10 -0600781 if (res != 0) {
782 return res;
783 }
784
785 return 0;
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000786}
787
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000788/* The interpreter's recursion limit */
789
Hye-Shik Changb6fa2812005-04-04 15:49:02 +0000790#ifndef Py_DEFAULT_RECURSION_LIMIT
Victor Stinner19c3ac92020-09-23 14:04:57 +0200791# define Py_DEFAULT_RECURSION_LIMIT 1000
Hye-Shik Changb6fa2812005-04-04 15:49:02 +0000792#endif
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600793
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600794void
Victor Stinnerdab84232020-03-17 18:56:44 +0100795_PyEval_InitRuntimeState(struct _ceval_runtime_state *ceval)
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600796{
Victor Stinner7be4e352020-05-05 20:27:47 +0200797#ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
Victor Stinnerdab84232020-03-17 18:56:44 +0100798 _gil_initialize(&ceval->gil);
Victor Stinner7be4e352020-05-05 20:27:47 +0200799#endif
Victor Stinnerdab84232020-03-17 18:56:44 +0100800}
801
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200802int
Victor Stinnerdab84232020-03-17 18:56:44 +0100803_PyEval_InitState(struct _ceval_state *ceval)
804{
Victor Stinner4e30ed32020-05-05 16:52:52 +0200805 ceval->recursion_limit = Py_DEFAULT_RECURSION_LIMIT;
806
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200807 struct _pending_calls *pending = &ceval->pending;
808 assert(pending->lock == NULL);
809
810 pending->lock = PyThread_allocate_lock();
811 if (pending->lock == NULL) {
812 return -1;
813 }
Victor Stinner7be4e352020-05-05 20:27:47 +0200814
815#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
816 _gil_initialize(&ceval->gil);
817#endif
818
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200819 return 0;
820}
821
822void
823_PyEval_FiniState(struct _ceval_state *ceval)
824{
825 struct _pending_calls *pending = &ceval->pending;
826 if (pending->lock != NULL) {
827 PyThread_free_lock(pending->lock);
828 pending->lock = NULL;
829 }
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600830}
831
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000832int
833Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000834{
Victor Stinner1bcc32f2020-06-10 20:08:26 +0200835 PyInterpreterState *interp = _PyInterpreterState_GET();
836 return interp->ceval.recursion_limit;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000837}
838
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000839void
840Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000841{
Victor Stinner4e30ed32020-05-05 16:52:52 +0200842 PyThreadState *tstate = _PyThreadState_GET();
843 tstate->interp->ceval.recursion_limit = new_limit;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000844}
845
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100846/* The function _Py_EnterRecursiveCall() only calls _Py_CheckRecursiveCall()
Victor Stinner19c3ac92020-09-23 14:04:57 +0200847 if the recursion_depth reaches recursion_limit.
848 If USE_STACKCHECK, the macro decrements recursion_limit
Armin Rigo2b3eb402003-10-28 12:05:48 +0000849 to guarantee that _Py_CheckRecursiveCall() is regularly called.
850 Without USE_STACKCHECK, there is no need for this. */
851int
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100852_Py_CheckRecursiveCall(PyThreadState *tstate, const char *where)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000853{
Victor Stinner4e30ed32020-05-05 16:52:52 +0200854 int recursion_limit = tstate->interp->ceval.recursion_limit;
Armin Rigo2b3eb402003-10-28 12:05:48 +0000855
856#ifdef USE_STACKCHECK
pdox18967932017-10-25 23:03:01 -0700857 tstate->stackcheck_counter = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000858 if (PyOS_CheckStack()) {
859 --tstate->recursion_depth;
Victor Stinner438a12d2019-05-24 17:01:38 +0200860 _PyErr_SetString(tstate, PyExc_MemoryError, "Stack overflow");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000861 return -1;
862 }
pdox18967932017-10-25 23:03:01 -0700863#endif
Mark Shannon4e7a69b2020-12-02 13:30:55 +0000864 if (tstate->recursion_headroom) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000865 if (tstate->recursion_depth > recursion_limit + 50) {
866 /* Overflowing while handling an overflow. Give up. */
867 Py_FatalError("Cannot recover from stack overflow.");
868 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000869 }
Mark Shannon4e7a69b2020-12-02 13:30:55 +0000870 else {
871 if (tstate->recursion_depth > recursion_limit) {
872 tstate->recursion_headroom++;
873 _PyErr_Format(tstate, PyExc_RecursionError,
874 "maximum recursion depth exceeded%s",
875 where);
876 tstate->recursion_headroom--;
877 --tstate->recursion_depth;
878 return -1;
879 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000880 }
881 return 0;
Armin Rigo2b3eb402003-10-28 12:05:48 +0000882}
883
Victor Stinner09532fe2019-05-10 23:39:09 +0200884static int do_raise(PyThreadState *tstate, PyObject *exc, PyObject *cause);
Victor Stinner438a12d2019-05-24 17:01:38 +0200885static int unpack_iterable(PyThreadState *, PyObject *, int, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000886
Victor Stinnere225beb2019-06-03 18:14:24 +0200887#define _Py_TracingPossible(ceval) ((ceval)->tracing_possible)
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000888
Guido van Rossum374a9221991-04-04 10:40:29 +0000889
Guido van Rossumb209a111997-04-29 18:18:01 +0000890PyObject *
Martin v. Löwis4d0d4712010-12-03 20:14:31 +0000891PyEval_EvalCode(PyObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000892{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000893 return PyEval_EvalCodeEx(co,
894 globals, locals,
895 (PyObject **)NULL, 0,
896 (PyObject **)NULL, 0,
897 (PyObject **)NULL, 0,
898 NULL, NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000899}
900
901
902/* Interpreter main loop */
903
Martin v. Löwis8d97e332004-06-27 15:43:12 +0000904PyObject *
Victor Stinnerb9e68122019-11-14 12:20:46 +0100905PyEval_EvalFrame(PyFrameObject *f)
906{
Victor Stinner0b72b232020-03-12 23:18:39 +0100907 /* Function kept for backward compatibility */
Victor Stinnerb9e68122019-11-14 12:20:46 +0100908 PyThreadState *tstate = _PyThreadState_GET();
909 return _PyEval_EvalFrame(tstate, f, 0);
Phillip J. Eby0d6615f2005-08-02 00:46:46 +0000910}
911
912PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000913PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
Guido van Rossum374a9221991-04-04 10:40:29 +0000914{
Victor Stinnerb9e68122019-11-14 12:20:46 +0100915 PyThreadState *tstate = _PyThreadState_GET();
916 return _PyEval_EvalFrame(tstate, f, throwflag);
Brett Cannon3cebf932016-09-05 15:33:46 -0700917}
918
Victor Stinnerda2914d2020-03-20 09:29:08 +0100919
920/* Handle signals, pending calls, GIL drop request
921 and asynchronous exception */
922static int
923eval_frame_handle_pending(PyThreadState *tstate)
924{
Victor Stinnerda2914d2020-03-20 09:29:08 +0100925 _PyRuntimeState * const runtime = &_PyRuntime;
926 struct _ceval_runtime_state *ceval = &runtime->ceval;
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200927
928 /* Pending signals */
Victor Stinner299b8c62020-05-05 17:40:18 +0200929 if (_Py_atomic_load_relaxed(&ceval->signals_pending)) {
Victor Stinnerda2914d2020-03-20 09:29:08 +0100930 if (handle_signals(tstate) != 0) {
931 return -1;
932 }
933 }
934
935 /* Pending calls */
Victor Stinner299b8c62020-05-05 17:40:18 +0200936 struct _ceval_state *ceval2 = &tstate->interp->ceval;
Victor Stinnerda2914d2020-03-20 09:29:08 +0100937 if (_Py_atomic_load_relaxed(&ceval2->pending.calls_to_do)) {
938 if (make_pending_calls(tstate) != 0) {
939 return -1;
940 }
941 }
942
943 /* GIL drop request */
Victor Stinner0b1e3302020-05-05 16:14:31 +0200944 if (_Py_atomic_load_relaxed(&ceval2->gil_drop_request)) {
Victor Stinnerda2914d2020-03-20 09:29:08 +0100945 /* Give another thread a chance */
946 if (_PyThreadState_Swap(&runtime->gilstate, NULL) != tstate) {
947 Py_FatalError("tstate mix-up");
948 }
Victor Stinner0b1e3302020-05-05 16:14:31 +0200949 drop_gil(ceval, ceval2, tstate);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100950
951 /* Other threads may run now */
952
953 take_gil(tstate);
954
Victor Stinnere838a932020-05-05 19:56:48 +0200955#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
956 (void)_PyThreadState_Swap(&runtime->gilstate, tstate);
957#else
Victor Stinnerda2914d2020-03-20 09:29:08 +0100958 if (_PyThreadState_Swap(&runtime->gilstate, tstate) != NULL) {
959 Py_FatalError("orphan tstate");
960 }
Victor Stinnere838a932020-05-05 19:56:48 +0200961#endif
Victor Stinnerda2914d2020-03-20 09:29:08 +0100962 }
963
964 /* Check for asynchronous exception. */
965 if (tstate->async_exc != NULL) {
966 PyObject *exc = tstate->async_exc;
967 tstate->async_exc = NULL;
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200968 UNSIGNAL_ASYNC_EXC(tstate->interp);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100969 _PyErr_SetNone(tstate, exc);
970 Py_DECREF(exc);
971 return -1;
972 }
973
Victor Stinnerd96a7a82020-11-13 14:44:42 +0100974#ifdef MS_WINDOWS
975 // bpo-42296: On Windows, _PyEval_SignalReceived() can be called in a
976 // different thread than the Python thread, in which case
977 // _Py_ThreadCanHandleSignals() is wrong. Recompute eval_breaker in the
978 // current Python thread with the correct _Py_ThreadCanHandleSignals()
979 // value. It prevents to interrupt the eval loop at every instruction if
980 // the current Python thread cannot handle signals (if
981 // _Py_ThreadCanHandleSignals() is false).
982 COMPUTE_EVAL_BREAKER(tstate->interp, ceval, ceval2);
983#endif
984
Victor Stinnerda2914d2020-03-20 09:29:08 +0100985 return 0;
986}
987
Victor Stinnerc6944e72016-11-11 02:13:35 +0100988PyObject* _Py_HOT_FUNCTION
Victor Stinner0b72b232020-03-12 23:18:39 +0100989_PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag)
Brett Cannon3cebf932016-09-05 15:33:46 -0700990{
Victor Stinner3026cad2020-06-01 16:02:40 +0200991 _Py_EnsureTstateNotNULL(tstate);
Victor Stinner0b72b232020-03-12 23:18:39 +0100992
Guido van Rossum950361c1997-01-24 13:49:28 +0000993#ifdef DXPAIRS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000994 int lastopcode = 0;
Guido van Rossum950361c1997-01-24 13:49:28 +0000995#endif
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200996 PyObject **stack_pointer; /* Next free slot in value stack */
Serhiy Storchakaab874002016-09-11 13:48:15 +0300997 const _Py_CODEUNIT *next_instr;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200998 int opcode; /* Current opcode */
999 int oparg; /* Current opcode argument, if any */
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001000 PyObject **fastlocals, **freevars;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001001 PyObject *retval = NULL; /* Return value */
Victor Stinnerdab84232020-03-17 18:56:44 +01001002 struct _ceval_state * const ceval2 = &tstate->interp->ceval;
Victor Stinner50e6e992020-03-19 02:41:21 +01001003 _Py_atomic_int * const eval_breaker = &ceval2->eval_breaker;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001004 PyCodeObject *co;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001005
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001006 /* when tracing we set things up so that
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001007
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001008 not (instr_lb <= current_bytecode_offset < instr_ub)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001009
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001010 is true when the line being executed has changed. The
1011 initial values are such as to make this false the first
1012 time it is tested. */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001013
Serhiy Storchakaab874002016-09-11 13:48:15 +03001014 const _Py_CODEUNIT *first_instr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001015 PyObject *names;
1016 PyObject *consts;
Inada Naoki91234a12019-06-03 21:30:58 +09001017 _PyOpcache *co_opcache;
Guido van Rossum374a9221991-04-04 10:40:29 +00001018
Brett Cannon368b4b72012-04-02 12:17:59 -04001019#ifdef LLTRACE
Victor Stinner3c1e4812012-03-26 22:10:51 +02001020 _Py_IDENTIFIER(__ltrace__);
Brett Cannon368b4b72012-04-02 12:17:59 -04001021#endif
Victor Stinner3c1e4812012-03-26 22:10:51 +02001022
Antoine Pitroub52ec782009-01-25 16:34:23 +00001023/* Computed GOTOs, or
1024 the-optimization-commonly-but-improperly-known-as-"threaded code"
1025 using gcc's labels-as-values extension
1026 (http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html).
1027
1028 The traditional bytecode evaluation loop uses a "switch" statement, which
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001029 decent compilers will optimize as a single indirect branch instruction
Antoine Pitroub52ec782009-01-25 16:34:23 +00001030 combined with a lookup table of jump addresses. However, since the
1031 indirect jump instruction is shared by all opcodes, the CPU will have a
1032 hard time making the right prediction for where to jump next (actually,
1033 it will be always wrong except in the uncommon case of a sequence of
1034 several identical opcodes).
1035
1036 "Threaded code" in contrast, uses an explicit jump table and an explicit
1037 indirect jump instruction at the end of each opcode. Since the jump
1038 instruction is at a different address for each opcode, the CPU will make a
1039 separate prediction for each of these instructions, which is equivalent to
1040 predicting the second opcode of each opcode pair. These predictions have
1041 a much better chance to turn out valid, especially in small bytecode loops.
1042
1043 A mispredicted branch on a modern CPU flushes the whole pipeline and
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001044 can cost several CPU cycles (depending on the pipeline depth),
Antoine Pitroub52ec782009-01-25 16:34:23 +00001045 and potentially many more instructions (depending on the pipeline width).
1046 A correctly predicted branch, however, is nearly free.
1047
1048 At the time of this writing, the "threaded code" version is up to 15-20%
1049 faster than the normal "switch" version, depending on the compiler and the
1050 CPU architecture.
1051
1052 We disable the optimization if DYNAMIC_EXECUTION_PROFILE is defined,
1053 because it would render the measurements invalid.
1054
1055
1056 NOTE: care must be taken that the compiler doesn't try to "optimize" the
1057 indirect jumps by sharing them between all opcodes. Such optimizations
1058 can be disabled on gcc by using the -fno-gcse flag (or possibly
1059 -fno-crossjumping).
1060*/
1061
Antoine Pitrou042b1282010-08-13 21:15:58 +00001062#ifdef DYNAMIC_EXECUTION_PROFILE
Antoine Pitroub52ec782009-01-25 16:34:23 +00001063#undef USE_COMPUTED_GOTOS
Antoine Pitrou042b1282010-08-13 21:15:58 +00001064#define USE_COMPUTED_GOTOS 0
Antoine Pitroub52ec782009-01-25 16:34:23 +00001065#endif
1066
Antoine Pitrou042b1282010-08-13 21:15:58 +00001067#ifdef HAVE_COMPUTED_GOTOS
1068 #ifndef USE_COMPUTED_GOTOS
1069 #define USE_COMPUTED_GOTOS 1
1070 #endif
1071#else
1072 #if defined(USE_COMPUTED_GOTOS) && USE_COMPUTED_GOTOS
1073 #error "Computed gotos are not supported on this compiler."
1074 #endif
1075 #undef USE_COMPUTED_GOTOS
1076 #define USE_COMPUTED_GOTOS 0
1077#endif
1078
1079#if USE_COMPUTED_GOTOS
Antoine Pitroub52ec782009-01-25 16:34:23 +00001080/* Import the static jump table */
1081#include "opcode_targets.h"
1082
Antoine Pitroub52ec782009-01-25 16:34:23 +00001083#define TARGET(op) \
Benjamin Petersonddd19492018-09-16 22:38:02 -07001084 op: \
1085 TARGET_##op
Antoine Pitroub52ec782009-01-25 16:34:23 +00001086
Antoine Pitroub52ec782009-01-25 16:34:23 +00001087#ifdef LLTRACE
1088#define FAST_DISPATCH() \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001089 { \
Victor Stinnerdab84232020-03-17 18:56:44 +01001090 if (!lltrace && !_Py_TracingPossible(ceval2) && !PyDTrace_LINE_ENABLED()) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001091 f->f_lasti = INSTR_OFFSET(); \
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001092 NEXTOPARG(); \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001093 goto *opcode_targets[opcode]; \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001094 } \
1095 goto fast_next_opcode; \
1096 }
Antoine Pitroub52ec782009-01-25 16:34:23 +00001097#else
1098#define FAST_DISPATCH() \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001099 { \
Victor Stinnerdab84232020-03-17 18:56:44 +01001100 if (!_Py_TracingPossible(ceval2) && !PyDTrace_LINE_ENABLED()) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001101 f->f_lasti = INSTR_OFFSET(); \
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001102 NEXTOPARG(); \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001103 goto *opcode_targets[opcode]; \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001104 } \
1105 goto fast_next_opcode; \
1106 }
Antoine Pitroub52ec782009-01-25 16:34:23 +00001107#endif
1108
Victor Stinner09532fe2019-05-10 23:39:09 +02001109#define DISPATCH() \
1110 { \
1111 if (!_Py_atomic_load_relaxed(eval_breaker)) { \
1112 FAST_DISPATCH(); \
1113 } \
1114 continue; \
1115 }
1116
Antoine Pitroub52ec782009-01-25 16:34:23 +00001117#else
Benjamin Petersonddd19492018-09-16 22:38:02 -07001118#define TARGET(op) op
Antoine Pitroub52ec782009-01-25 16:34:23 +00001119#define FAST_DISPATCH() goto fast_next_opcode
Victor Stinner09532fe2019-05-10 23:39:09 +02001120#define DISPATCH() continue
Antoine Pitroub52ec782009-01-25 16:34:23 +00001121#endif
1122
1123
Neal Norwitza81d2202002-07-14 00:27:26 +00001124/* Tuple access macros */
1125
1126#ifndef Py_DEBUG
1127#define GETITEM(v, i) PyTuple_GET_ITEM((PyTupleObject *)(v), (i))
1128#else
1129#define GETITEM(v, i) PyTuple_GetItem((v), (i))
1130#endif
1131
Guido van Rossum374a9221991-04-04 10:40:29 +00001132/* Code access macros */
1133
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001134/* The integer overflow is checked by an assertion below. */
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001135#define INSTR_OFFSET() \
1136 (sizeof(_Py_CODEUNIT) * (int)(next_instr - first_instr))
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001137#define NEXTOPARG() do { \
Serhiy Storchakaab874002016-09-11 13:48:15 +03001138 _Py_CODEUNIT word = *next_instr; \
1139 opcode = _Py_OPCODE(word); \
1140 oparg = _Py_OPARG(word); \
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001141 next_instr++; \
1142 } while (0)
Serhiy Storchakaab874002016-09-11 13:48:15 +03001143#define JUMPTO(x) (next_instr = first_instr + (x) / sizeof(_Py_CODEUNIT))
1144#define JUMPBY(x) (next_instr += (x) / sizeof(_Py_CODEUNIT))
Guido van Rossum374a9221991-04-04 10:40:29 +00001145
Raymond Hettingerf606f872003-03-16 03:11:04 +00001146/* OpCode prediction macros
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001147 Some opcodes tend to come in pairs thus making it possible to
1148 predict the second code when the first is run. For example,
Serhiy Storchakada9c5132016-06-27 18:58:57 +03001149 COMPARE_OP is often followed by POP_JUMP_IF_FALSE or POP_JUMP_IF_TRUE.
Raymond Hettingerf606f872003-03-16 03:11:04 +00001150
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001151 Verifying the prediction costs a single high-speed test of a register
1152 variable against a constant. If the pairing was good, then the
1153 processor's own internal branch predication has a high likelihood of
1154 success, resulting in a nearly zero-overhead transition to the
1155 next opcode. A successful prediction saves a trip through the eval-loop
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001156 including its unpredictable switch-case branch. Combined with the
1157 processor's internal branch prediction, a successful PREDICT has the
1158 effect of making the two opcodes run as if they were a single new opcode
1159 with the bodies combined.
Raymond Hettingerf606f872003-03-16 03:11:04 +00001160
Georg Brandl86b2fb92008-07-16 03:43:04 +00001161 If collecting opcode statistics, your choices are to either keep the
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001162 predictions turned-on and interpret the results as if some opcodes
1163 had been combined or turn-off predictions so that the opcode frequency
1164 counter updates for both opcodes.
Antoine Pitroub52ec782009-01-25 16:34:23 +00001165
1166 Opcode prediction is disabled with threaded code, since the latter allows
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001167 the CPU to record separate branch prediction information for each
1168 opcode.
Antoine Pitroub52ec782009-01-25 16:34:23 +00001169
Raymond Hettingerf606f872003-03-16 03:11:04 +00001170*/
1171
Denis Chernikovbaf29b22020-02-21 12:17:50 +03001172#define PREDICT_ID(op) PRED_##op
1173
Antoine Pitrou042b1282010-08-13 21:15:58 +00001174#if defined(DYNAMIC_EXECUTION_PROFILE) || USE_COMPUTED_GOTOS
Denis Chernikovbaf29b22020-02-21 12:17:50 +03001175#define PREDICT(op) if (0) goto PREDICT_ID(op)
Raymond Hettingera7216982004-02-08 19:59:27 +00001176#else
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001177#define PREDICT(op) \
Denis Chernikovbaf29b22020-02-21 12:17:50 +03001178 do { \
Serhiy Storchakaab874002016-09-11 13:48:15 +03001179 _Py_CODEUNIT word = *next_instr; \
1180 opcode = _Py_OPCODE(word); \
Denis Chernikovbaf29b22020-02-21 12:17:50 +03001181 if (opcode == op) { \
Serhiy Storchakaab874002016-09-11 13:48:15 +03001182 oparg = _Py_OPARG(word); \
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001183 next_instr++; \
Denis Chernikovbaf29b22020-02-21 12:17:50 +03001184 goto PREDICT_ID(op); \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001185 } \
1186 } while(0)
Antoine Pitroub52ec782009-01-25 16:34:23 +00001187#endif
Denis Chernikovbaf29b22020-02-21 12:17:50 +03001188#define PREDICTED(op) PREDICT_ID(op):
Antoine Pitroub52ec782009-01-25 16:34:23 +00001189
Raymond Hettingerf606f872003-03-16 03:11:04 +00001190
Guido van Rossum374a9221991-04-04 10:40:29 +00001191/* Stack manipulation macros */
1192
Martin v. Löwis18e16552006-02-15 17:27:45 +00001193/* The stack can grow at most MAXINT deep, as co_nlocals and
1194 co_stacksize are ints. */
Stefan Krahb7e10102010-06-23 18:42:39 +00001195#define STACK_LEVEL() ((int)(stack_pointer - f->f_valuestack))
1196#define EMPTY() (STACK_LEVEL() == 0)
1197#define TOP() (stack_pointer[-1])
1198#define SECOND() (stack_pointer[-2])
1199#define THIRD() (stack_pointer[-3])
1200#define FOURTH() (stack_pointer[-4])
1201#define PEEK(n) (stack_pointer[-(n)])
1202#define SET_TOP(v) (stack_pointer[-1] = (v))
1203#define SET_SECOND(v) (stack_pointer[-2] = (v))
1204#define SET_THIRD(v) (stack_pointer[-3] = (v))
1205#define SET_FOURTH(v) (stack_pointer[-4] = (v))
Stefan Krahb7e10102010-06-23 18:42:39 +00001206#define BASIC_STACKADJ(n) (stack_pointer += n)
1207#define BASIC_PUSH(v) (*stack_pointer++ = (v))
1208#define BASIC_POP() (*--stack_pointer)
Guido van Rossum374a9221991-04-04 10:40:29 +00001209
Guido van Rossum96a42c81992-01-12 02:29:51 +00001210#ifdef LLTRACE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001211#define PUSH(v) { (void)(BASIC_PUSH(v), \
Victor Stinner438a12d2019-05-24 17:01:38 +02001212 lltrace && prtrace(tstate, TOP(), "push")); \
Stefan Krahb7e10102010-06-23 18:42:39 +00001213 assert(STACK_LEVEL() <= co->co_stacksize); }
Victor Stinner438a12d2019-05-24 17:01:38 +02001214#define POP() ((void)(lltrace && prtrace(tstate, TOP(), "pop")), \
Stefan Krahb7e10102010-06-23 18:42:39 +00001215 BASIC_POP())
costypetrisor8ed317f2018-07-31 20:55:14 +00001216#define STACK_GROW(n) do { \
1217 assert(n >= 0); \
1218 (void)(BASIC_STACKADJ(n), \
Victor Stinner438a12d2019-05-24 17:01:38 +02001219 lltrace && prtrace(tstate, TOP(), "stackadj")); \
costypetrisor8ed317f2018-07-31 20:55:14 +00001220 assert(STACK_LEVEL() <= co->co_stacksize); \
1221 } while (0)
1222#define STACK_SHRINK(n) do { \
1223 assert(n >= 0); \
Victor Stinner438a12d2019-05-24 17:01:38 +02001224 (void)(lltrace && prtrace(tstate, TOP(), "stackadj")); \
costypetrisor8ed317f2018-07-31 20:55:14 +00001225 (void)(BASIC_STACKADJ(-n)); \
1226 assert(STACK_LEVEL() <= co->co_stacksize); \
1227 } while (0)
Christian Heimes0449f632007-12-15 01:27:15 +00001228#define EXT_POP(STACK_POINTER) ((void)(lltrace && \
Victor Stinner438a12d2019-05-24 17:01:38 +02001229 prtrace(tstate, (STACK_POINTER)[-1], "ext_pop")), \
Stefan Krahb7e10102010-06-23 18:42:39 +00001230 *--(STACK_POINTER))
Guido van Rossum374a9221991-04-04 10:40:29 +00001231#else
Stefan Krahb7e10102010-06-23 18:42:39 +00001232#define PUSH(v) BASIC_PUSH(v)
1233#define POP() BASIC_POP()
costypetrisor8ed317f2018-07-31 20:55:14 +00001234#define STACK_GROW(n) BASIC_STACKADJ(n)
1235#define STACK_SHRINK(n) BASIC_STACKADJ(-n)
Guido van Rossumc2e20742006-02-27 22:32:47 +00001236#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
Guido van Rossum374a9221991-04-04 10:40:29 +00001237#endif
1238
Guido van Rossum681d79a1995-07-18 14:51:37 +00001239/* Local variable macros */
1240
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001241#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumcfbf1a32002-03-28 20:17:52 +00001242
1243/* The SETLOCAL() macro must not DECREF the local variable in-place and
1244 then store the new value; it must copy the old value to a temporary
1245 value, then store the new value, and then DECREF the temporary value.
1246 This is because it is possible that during the DECREF the frame is
1247 accessed by other code (e.g. a __del__ method or gc.collect()) and the
1248 variable would be pointing to already-freed memory. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001249#define SETLOCAL(i, value) do { PyObject *tmp = GETLOCAL(i); \
Stefan Krahb7e10102010-06-23 18:42:39 +00001250 GETLOCAL(i) = value; \
1251 Py_XDECREF(tmp); } while (0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00001252
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001253
1254#define UNWIND_BLOCK(b) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001255 while (STACK_LEVEL() > (b)->b_level) { \
1256 PyObject *v = POP(); \
1257 Py_XDECREF(v); \
1258 }
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001259
1260#define UNWIND_EXCEPT_HANDLER(b) \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001261 do { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001262 PyObject *type, *value, *traceback; \
Mark Shannonae3087c2017-10-22 22:41:51 +01001263 _PyErr_StackItem *exc_info; \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001264 assert(STACK_LEVEL() >= (b)->b_level + 3); \
1265 while (STACK_LEVEL() > (b)->b_level + 3) { \
1266 value = POP(); \
1267 Py_XDECREF(value); \
1268 } \
Mark Shannonae3087c2017-10-22 22:41:51 +01001269 exc_info = tstate->exc_info; \
1270 type = exc_info->exc_type; \
1271 value = exc_info->exc_value; \
1272 traceback = exc_info->exc_traceback; \
1273 exc_info->exc_type = POP(); \
1274 exc_info->exc_value = POP(); \
1275 exc_info->exc_traceback = POP(); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001276 Py_XDECREF(type); \
1277 Py_XDECREF(value); \
1278 Py_XDECREF(traceback); \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001279 } while(0)
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001280
Inada Naoki91234a12019-06-03 21:30:58 +09001281 /* macros for opcode cache */
1282#define OPCACHE_CHECK() \
1283 do { \
1284 co_opcache = NULL; \
1285 if (co->co_opcache != NULL) { \
Pablo Galindo109826c2020-10-20 06:22:44 +01001286 unsigned char co_opcache_offset = \
Inada Naoki91234a12019-06-03 21:30:58 +09001287 co->co_opcache_map[next_instr - first_instr]; \
Pablo Galindo109826c2020-10-20 06:22:44 +01001288 if (co_opcache_offset > 0) { \
1289 assert(co_opcache_offset <= co->co_opcache_size); \
1290 co_opcache = &co->co_opcache[co_opcache_offset - 1]; \
Inada Naoki91234a12019-06-03 21:30:58 +09001291 assert(co_opcache != NULL); \
Inada Naoki91234a12019-06-03 21:30:58 +09001292 } \
1293 } \
1294 } while (0)
1295
Pablo Galindo109826c2020-10-20 06:22:44 +01001296#define OPCACHE_DEOPT() \
1297 do { \
1298 if (co_opcache != NULL) { \
1299 co_opcache->optimized = -1; \
1300 unsigned char co_opcache_offset = \
1301 co->co_opcache_map[next_instr - first_instr]; \
1302 assert(co_opcache_offset <= co->co_opcache_size); \
1303 co->co_opcache_map[co_opcache_offset] = 0; \
1304 co_opcache = NULL; \
1305 } \
1306 } while (0)
1307
1308#define OPCACHE_DEOPT_LOAD_ATTR() \
1309 do { \
1310 if (co_opcache != NULL) { \
1311 OPCACHE_STAT_ATTR_DEOPT(); \
1312 OPCACHE_DEOPT(); \
1313 } \
1314 } while (0)
1315
1316#define OPCACHE_MAYBE_DEOPT_LOAD_ATTR() \
1317 do { \
1318 if (co_opcache != NULL && --co_opcache->optimized <= 0) { \
1319 OPCACHE_DEOPT_LOAD_ATTR(); \
1320 } \
1321 } while (0)
1322
Inada Naoki91234a12019-06-03 21:30:58 +09001323#if OPCACHE_STATS
1324
1325#define OPCACHE_STAT_GLOBAL_HIT() \
1326 do { \
1327 if (co->co_opcache != NULL) opcache_global_hits++; \
1328 } while (0)
1329
1330#define OPCACHE_STAT_GLOBAL_MISS() \
1331 do { \
1332 if (co->co_opcache != NULL) opcache_global_misses++; \
1333 } while (0)
1334
1335#define OPCACHE_STAT_GLOBAL_OPT() \
1336 do { \
1337 if (co->co_opcache != NULL) opcache_global_opts++; \
1338 } while (0)
1339
Pablo Galindo109826c2020-10-20 06:22:44 +01001340#define OPCACHE_STAT_ATTR_HIT() \
1341 do { \
1342 if (co->co_opcache != NULL) opcache_attr_hits++; \
1343 } while (0)
1344
1345#define OPCACHE_STAT_ATTR_MISS() \
1346 do { \
1347 if (co->co_opcache != NULL) opcache_attr_misses++; \
1348 } while (0)
1349
1350#define OPCACHE_STAT_ATTR_OPT() \
1351 do { \
1352 if (co->co_opcache!= NULL) opcache_attr_opts++; \
1353 } while (0)
1354
1355#define OPCACHE_STAT_ATTR_DEOPT() \
1356 do { \
1357 if (co->co_opcache != NULL) opcache_attr_deopts++; \
1358 } while (0)
1359
1360#define OPCACHE_STAT_ATTR_TOTAL() \
1361 do { \
1362 if (co->co_opcache != NULL) opcache_attr_total++; \
1363 } while (0)
1364
Inada Naoki91234a12019-06-03 21:30:58 +09001365#else /* OPCACHE_STATS */
1366
1367#define OPCACHE_STAT_GLOBAL_HIT()
1368#define OPCACHE_STAT_GLOBAL_MISS()
1369#define OPCACHE_STAT_GLOBAL_OPT()
1370
Pablo Galindo109826c2020-10-20 06:22:44 +01001371#define OPCACHE_STAT_ATTR_HIT()
1372#define OPCACHE_STAT_ATTR_MISS()
1373#define OPCACHE_STAT_ATTR_OPT()
1374#define OPCACHE_STAT_ATTR_DEOPT()
1375#define OPCACHE_STAT_ATTR_TOTAL()
1376
Inada Naoki91234a12019-06-03 21:30:58 +09001377#endif
1378
Guido van Rossuma027efa1997-05-05 20:56:21 +00001379/* Start of code */
1380
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001381 /* push frame */
Victor Stinnerbe434dc2019-11-05 00:51:22 +01001382 if (_Py_EnterRecursiveCall(tstate, "")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001383 return NULL;
Victor Stinnerbe434dc2019-11-05 00:51:22 +01001384 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001385
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001386 tstate->frame = f;
Mark Shannon86433452021-01-07 16:49:02 +00001387 co = f->f_code;
1388 PyCodeAddressRange bounds;
1389 _PyCode_InitAddressRange(co, &bounds);
Tim Peters5ca576e2001-06-18 22:08:13 +00001390
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001391 if (tstate->use_tracing) {
1392 if (tstate->c_tracefunc != NULL) {
1393 /* tstate->c_tracefunc, if defined, is a
1394 function that will be called on *every* entry
1395 to a code block. Its return value, if not
1396 None, is a function that will be called at
1397 the start of each executed line of code.
1398 (Actually, the function must return itself
1399 in order to continue tracing.) The trace
1400 functions are called with three arguments:
1401 a pointer to the current frame, a string
1402 indicating why the function is called, and
1403 an argument which depends on the situation.
1404 The global trace function is also called
1405 whenever an exception is detected. */
1406 if (call_trace_protected(tstate->c_tracefunc,
1407 tstate->c_traceobj,
Mark Shannon86433452021-01-07 16:49:02 +00001408 tstate, f, &bounds,
1409 PyTrace_CALL, Py_None)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001410 /* Trace function raised an error */
1411 goto exit_eval_frame;
1412 }
1413 }
1414 if (tstate->c_profilefunc != NULL) {
1415 /* Similar for c_profilefunc, except it needn't
1416 return itself and isn't called for "line" events */
1417 if (call_trace_protected(tstate->c_profilefunc,
1418 tstate->c_profileobj,
Mark Shannon86433452021-01-07 16:49:02 +00001419 tstate, f, &bounds,
1420 PyTrace_CALL, Py_None)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001421 /* Profile function raised an error */
1422 goto exit_eval_frame;
1423 }
1424 }
1425 }
Neil Schemenauer6c0f2002001-09-04 19:03:35 +00001426
Łukasz Langaa785c872016-09-09 17:37:37 -07001427 if (PyDTrace_FUNCTION_ENTRY_ENABLED())
1428 dtrace_function_entry(f);
1429
Mark Shannon877df852020-11-12 09:43:29 +00001430 int instr_prev = -1;
1431
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001432 names = co->co_names;
1433 consts = co->co_consts;
1434 fastlocals = f->f_localsplus;
1435 freevars = f->f_localsplus + co->co_nlocals;
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001436 assert(PyBytes_Check(co->co_code));
1437 assert(PyBytes_GET_SIZE(co->co_code) <= INT_MAX);
Serhiy Storchakaab874002016-09-11 13:48:15 +03001438 assert(PyBytes_GET_SIZE(co->co_code) % sizeof(_Py_CODEUNIT) == 0);
1439 assert(_Py_IS_ALIGNED(PyBytes_AS_STRING(co->co_code), sizeof(_Py_CODEUNIT)));
1440 first_instr = (_Py_CODEUNIT *) PyBytes_AS_STRING(co->co_code);
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001441 /*
1442 f->f_lasti refers to the index of the last instruction,
1443 unless it's -1 in which case next_instr should be first_instr.
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001444
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001445 YIELD_FROM sets f_lasti to itself, in order to repeatedly yield
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05001446 multiple values.
Thomas Wouters902d6eb2007-01-09 23:18:33 +00001447
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001448 When the PREDICT() macros are enabled, some opcode pairs follow in
1449 direct succession without updating f->f_lasti. A successful
1450 prediction effectively links the two codes together as if they
1451 were a single new opcode; accordingly,f->f_lasti will point to
1452 the first code in the pair (for instance, GET_ITER followed by
1453 FOR_ITER is effectively a single opcode and f->f_lasti will point
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001454 to the beginning of the combined pair.)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001455 */
Serhiy Storchakaab874002016-09-11 13:48:15 +03001456 assert(f->f_lasti >= -1);
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001457 next_instr = first_instr;
1458 if (f->f_lasti >= 0) {
Serhiy Storchakaab874002016-09-11 13:48:15 +03001459 assert(f->f_lasti % sizeof(_Py_CODEUNIT) == 0);
1460 next_instr += f->f_lasti / sizeof(_Py_CODEUNIT) + 1;
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001461 }
Mark Shannoncb9879b2020-07-17 11:44:23 +01001462 stack_pointer = f->f_valuestack + f->f_stackdepth;
1463 /* Set f->f_stackdepth to -1.
1464 * Update when returning or calling trace function.
1465 Having f_stackdepth <= 0 ensures that invalid
1466 values are not visible to the cycle GC.
1467 We choose -1 rather than 0 to assist debugging.
1468 */
1469 f->f_stackdepth = -1;
1470 f->f_state = FRAME_EXECUTING;
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001471
Inada Naoki91234a12019-06-03 21:30:58 +09001472 if (co->co_opcache_flag < OPCACHE_MIN_RUNS) {
1473 co->co_opcache_flag++;
1474 if (co->co_opcache_flag == OPCACHE_MIN_RUNS) {
1475 if (_PyCode_InitOpcache(co) < 0) {
Victor Stinner25104942020-04-24 02:43:18 +02001476 goto exit_eval_frame;
Inada Naoki91234a12019-06-03 21:30:58 +09001477 }
1478#if OPCACHE_STATS
1479 opcache_code_objects_extra_mem +=
1480 PyBytes_Size(co->co_code) / sizeof(_Py_CODEUNIT) +
1481 sizeof(_PyOpcache) * co->co_opcache_size;
1482 opcache_code_objects++;
1483#endif
1484 }
1485 }
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001486
Tim Peters5ca576e2001-06-18 22:08:13 +00001487#ifdef LLTRACE
Serhiy Storchakafb5db7e2020-10-26 08:43:39 +02001488 {
1489 int r = _PyDict_ContainsId(f->f_globals, &PyId___ltrace__);
1490 if (r < 0) {
1491 goto exit_eval_frame;
1492 }
1493 lltrace = r;
1494 }
Tim Peters5ca576e2001-06-18 22:08:13 +00001495#endif
Guido van Rossumac7be682001-01-17 15:42:30 +00001496
Serhiy Storchakafb5db7e2020-10-26 08:43:39 +02001497 if (throwflag) { /* support for generator.throw() */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001498 goto error;
Serhiy Storchakafb5db7e2020-10-26 08:43:39 +02001499 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001500
Victor Stinnerace47d72013-07-18 01:41:08 +02001501#ifdef Py_DEBUG
Victor Stinner0b72b232020-03-12 23:18:39 +01001502 /* _PyEval_EvalFrameDefault() must not be called with an exception set,
Victor Stinnera8cb5152017-01-18 14:12:51 +01001503 because it can clear it (directly or indirectly) and so the
Martin Panter9955a372015-10-07 10:26:23 +00001504 caller loses its exception */
Victor Stinner438a12d2019-05-24 17:01:38 +02001505 assert(!_PyErr_Occurred(tstate));
Victor Stinnerace47d72013-07-18 01:41:08 +02001506#endif
1507
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001508main_loop:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001509 for (;;) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001510 assert(stack_pointer >= f->f_valuestack); /* else underflow */
1511 assert(STACK_LEVEL() <= co->co_stacksize); /* else overflow */
Victor Stinner438a12d2019-05-24 17:01:38 +02001512 assert(!_PyErr_Occurred(tstate));
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001513
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001514 /* Do periodic things. Doing this every time through
1515 the loop would add too much overhead, so we do it
1516 only every Nth instruction. We also do it if
Chris Jerdonek4a12d122020-05-14 19:25:45 -07001517 ``pending.calls_to_do'' is set, i.e. when an asynchronous
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001518 event needs attention (e.g. a signal handler or
1519 async I/O handler); see Py_AddPendingCall() and
1520 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +00001521
Eric Snow7bda9de2019-03-08 17:25:54 -07001522 if (_Py_atomic_load_relaxed(eval_breaker)) {
Serhiy Storchaka3f4d90d2018-07-09 15:40:14 +03001523 opcode = _Py_OPCODE(*next_instr);
1524 if (opcode == SETUP_FINALLY ||
1525 opcode == SETUP_WITH ||
1526 opcode == BEFORE_ASYNC_WITH ||
1527 opcode == YIELD_FROM) {
1528 /* Few cases where we skip running signal handlers and other
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07001529 pending calls:
Serhiy Storchaka3f4d90d2018-07-09 15:40:14 +03001530 - If we're about to enter the 'with:'. It will prevent
1531 emitting a resource warning in the common idiom
1532 'with open(path) as file:'.
1533 - If we're about to enter the 'async with:'.
1534 - If we're about to enter the 'try:' of a try/finally (not
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07001535 *very* useful, but might help in some cases and it's
1536 traditional)
1537 - If we're resuming a chain of nested 'yield from' or
1538 'await' calls, then each frame is parked with YIELD_FROM
1539 as its next opcode. If the user hit control-C we want to
1540 wait until we've reached the innermost frame before
1541 running the signal handler and raising KeyboardInterrupt
1542 (see bpo-30039).
1543 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001544 goto fast_next_opcode;
1545 }
Eric Snowfdf282d2019-01-11 14:26:55 -07001546
Victor Stinnerda2914d2020-03-20 09:29:08 +01001547 if (eval_frame_handle_pending(tstate) != 0) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001548 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001549 }
1550 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001551
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001552 fast_next_opcode:
1553 f->f_lasti = INSTR_OFFSET();
Guido van Rossumac7be682001-01-17 15:42:30 +00001554
Łukasz Langaa785c872016-09-09 17:37:37 -07001555 if (PyDTrace_LINE_ENABLED())
Mark Shannon877df852020-11-12 09:43:29 +00001556 maybe_dtrace_line(f, &bounds, &instr_prev);
Łukasz Langaa785c872016-09-09 17:37:37 -07001557
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001558 /* line-by-line tracing support */
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001559
Victor Stinnerdab84232020-03-17 18:56:44 +01001560 if (_Py_TracingPossible(ceval2) &&
Benjamin Peterson51f46162013-01-23 08:38:47 -05001561 tstate->c_tracefunc != NULL && !tstate->tracing) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001562 int err;
Victor Stinnerb7d8d8d2020-09-23 14:07:16 +02001563 /* see maybe_call_line_trace()
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001564 for expository comments */
Victor Stinnerb7d8d8d2020-09-23 14:07:16 +02001565 f->f_stackdepth = (int)(stack_pointer - f->f_valuestack);
Tim Peters8a5c3c72004-04-05 19:36:21 +00001566
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001567 err = maybe_call_line_trace(tstate->c_tracefunc,
1568 tstate->c_traceobj,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01001569 tstate, f,
Mark Shannon877df852020-11-12 09:43:29 +00001570 &bounds, &instr_prev);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001571 /* Reload possibly changed frame fields */
1572 JUMPTO(f->f_lasti);
Mark Shannoncb9879b2020-07-17 11:44:23 +01001573 stack_pointer = f->f_valuestack+f->f_stackdepth;
1574 f->f_stackdepth = -1;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001575 if (err)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001576 /* trace function raised an exception */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001577 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001578 }
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001579
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001580 /* Extract opcode and argument */
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001581
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001582 NEXTOPARG();
Stefan Krahb7e10102010-06-23 18:42:39 +00001583 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +00001584#ifdef DYNAMIC_EXECUTION_PROFILE
1585#ifdef DXPAIRS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001586 dxpairs[lastopcode][opcode]++;
1587 lastopcode = opcode;
Guido van Rossum950361c1997-01-24 13:49:28 +00001588#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001589 dxp[opcode]++;
Guido van Rossum950361c1997-01-24 13:49:28 +00001590#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001591
Guido van Rossum96a42c81992-01-12 02:29:51 +00001592#ifdef LLTRACE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001593 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +00001594
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001595 if (lltrace) {
1596 if (HAS_ARG(opcode)) {
1597 printf("%d: %d, %d\n",
1598 f->f_lasti, opcode, oparg);
1599 }
1600 else {
1601 printf("%d: %d\n",
1602 f->f_lasti, opcode);
1603 }
1604 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001605#endif
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001606
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001607 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +00001608
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001609 /* BEWARE!
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001610 It is essential that any operation that fails must goto error
1611 and that all operation that succeed call [FAST_]DISPATCH() ! */
Guido van Rossumac7be682001-01-17 15:42:30 +00001612
Benjamin Petersonddd19492018-09-16 22:38:02 -07001613 case TARGET(NOP): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001614 FAST_DISPATCH();
Benjamin Petersonddd19492018-09-16 22:38:02 -07001615 }
Raymond Hettinger9c18e812004-06-21 16:31:15 +00001616
Benjamin Petersonddd19492018-09-16 22:38:02 -07001617 case TARGET(LOAD_FAST): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001618 PyObject *value = GETLOCAL(oparg);
1619 if (value == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02001620 format_exc_check_arg(tstate, PyExc_UnboundLocalError,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001621 UNBOUNDLOCAL_ERROR_MSG,
1622 PyTuple_GetItem(co->co_varnames, oparg));
1623 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001624 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001625 Py_INCREF(value);
1626 PUSH(value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001627 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001628 }
1629
Benjamin Petersonddd19492018-09-16 22:38:02 -07001630 case TARGET(LOAD_CONST): {
1631 PREDICTED(LOAD_CONST);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001632 PyObject *value = GETITEM(consts, oparg);
1633 Py_INCREF(value);
1634 PUSH(value);
1635 FAST_DISPATCH();
1636 }
Neil Schemenauer63543862002-02-17 19:10:14 +00001637
Benjamin Petersonddd19492018-09-16 22:38:02 -07001638 case TARGET(STORE_FAST): {
1639 PREDICTED(STORE_FAST);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001640 PyObject *value = POP();
1641 SETLOCAL(oparg, value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001642 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001643 }
Neil Schemenauer63543862002-02-17 19:10:14 +00001644
Benjamin Petersonddd19492018-09-16 22:38:02 -07001645 case TARGET(POP_TOP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001646 PyObject *value = POP();
1647 Py_DECREF(value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001648 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001649 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001650
Benjamin Petersonddd19492018-09-16 22:38:02 -07001651 case TARGET(ROT_TWO): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001652 PyObject *top = TOP();
1653 PyObject *second = SECOND();
1654 SET_TOP(second);
1655 SET_SECOND(top);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001656 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001657 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001658
Benjamin Petersonddd19492018-09-16 22:38:02 -07001659 case TARGET(ROT_THREE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001660 PyObject *top = TOP();
1661 PyObject *second = SECOND();
1662 PyObject *third = THIRD();
1663 SET_TOP(second);
1664 SET_SECOND(third);
1665 SET_THIRD(top);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001666 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001667 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001668
Benjamin Petersonddd19492018-09-16 22:38:02 -07001669 case TARGET(ROT_FOUR): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001670 PyObject *top = TOP();
1671 PyObject *second = SECOND();
1672 PyObject *third = THIRD();
1673 PyObject *fourth = FOURTH();
1674 SET_TOP(second);
1675 SET_SECOND(third);
1676 SET_THIRD(fourth);
1677 SET_FOURTH(top);
1678 FAST_DISPATCH();
1679 }
1680
Benjamin Petersonddd19492018-09-16 22:38:02 -07001681 case TARGET(DUP_TOP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001682 PyObject *top = TOP();
1683 Py_INCREF(top);
1684 PUSH(top);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001685 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001686 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001687
Benjamin Petersonddd19492018-09-16 22:38:02 -07001688 case TARGET(DUP_TOP_TWO): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001689 PyObject *top = TOP();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001690 PyObject *second = SECOND();
Benjamin Petersonf208df32012-10-12 11:37:56 -04001691 Py_INCREF(top);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001692 Py_INCREF(second);
costypetrisor8ed317f2018-07-31 20:55:14 +00001693 STACK_GROW(2);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001694 SET_TOP(top);
1695 SET_SECOND(second);
Antoine Pitrou74a69fa2010-09-04 18:43:52 +00001696 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001697 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001698
Benjamin Petersonddd19492018-09-16 22:38:02 -07001699 case TARGET(UNARY_POSITIVE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001700 PyObject *value = TOP();
1701 PyObject *res = PyNumber_Positive(value);
1702 Py_DECREF(value);
1703 SET_TOP(res);
1704 if (res == NULL)
1705 goto error;
1706 DISPATCH();
1707 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001708
Benjamin Petersonddd19492018-09-16 22:38:02 -07001709 case TARGET(UNARY_NEGATIVE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001710 PyObject *value = TOP();
1711 PyObject *res = PyNumber_Negative(value);
1712 Py_DECREF(value);
1713 SET_TOP(res);
1714 if (res == NULL)
1715 goto error;
1716 DISPATCH();
1717 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001718
Benjamin Petersonddd19492018-09-16 22:38:02 -07001719 case TARGET(UNARY_NOT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001720 PyObject *value = TOP();
1721 int err = PyObject_IsTrue(value);
1722 Py_DECREF(value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001723 if (err == 0) {
1724 Py_INCREF(Py_True);
1725 SET_TOP(Py_True);
1726 DISPATCH();
1727 }
1728 else if (err > 0) {
1729 Py_INCREF(Py_False);
1730 SET_TOP(Py_False);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001731 DISPATCH();
1732 }
costypetrisor8ed317f2018-07-31 20:55:14 +00001733 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001734 goto error;
1735 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001736
Benjamin Petersonddd19492018-09-16 22:38:02 -07001737 case TARGET(UNARY_INVERT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001738 PyObject *value = TOP();
1739 PyObject *res = PyNumber_Invert(value);
1740 Py_DECREF(value);
1741 SET_TOP(res);
1742 if (res == NULL)
1743 goto error;
1744 DISPATCH();
1745 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001746
Benjamin Petersonddd19492018-09-16 22:38:02 -07001747 case TARGET(BINARY_POWER): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001748 PyObject *exp = POP();
1749 PyObject *base = TOP();
1750 PyObject *res = PyNumber_Power(base, exp, Py_None);
1751 Py_DECREF(base);
1752 Py_DECREF(exp);
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_MULTIPLY): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001760 PyObject *right = POP();
1761 PyObject *left = TOP();
1762 PyObject *res = PyNumber_Multiply(left, right);
1763 Py_DECREF(left);
1764 Py_DECREF(right);
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_MATRIX_MULTIPLY): {
Benjamin Petersond51374e2014-04-09 23:55:56 -04001772 PyObject *right = POP();
1773 PyObject *left = TOP();
1774 PyObject *res = PyNumber_MatrixMultiply(left, right);
1775 Py_DECREF(left);
1776 Py_DECREF(right);
1777 SET_TOP(res);
1778 if (res == NULL)
1779 goto error;
1780 DISPATCH();
1781 }
1782
Benjamin Petersonddd19492018-09-16 22:38:02 -07001783 case TARGET(BINARY_TRUE_DIVIDE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001784 PyObject *divisor = POP();
1785 PyObject *dividend = TOP();
1786 PyObject *quotient = PyNumber_TrueDivide(dividend, divisor);
1787 Py_DECREF(dividend);
1788 Py_DECREF(divisor);
1789 SET_TOP(quotient);
1790 if (quotient == NULL)
1791 goto error;
1792 DISPATCH();
1793 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001794
Benjamin Petersonddd19492018-09-16 22:38:02 -07001795 case TARGET(BINARY_FLOOR_DIVIDE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001796 PyObject *divisor = POP();
1797 PyObject *dividend = TOP();
1798 PyObject *quotient = PyNumber_FloorDivide(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 Rossum4668b002001-08-08 05:00:18 +00001806
Benjamin Petersonddd19492018-09-16 22:38:02 -07001807 case TARGET(BINARY_MODULO): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001808 PyObject *divisor = POP();
1809 PyObject *dividend = TOP();
Martijn Pietersd7e64332017-02-23 13:38:04 +00001810 PyObject *res;
1811 if (PyUnicode_CheckExact(dividend) && (
1812 !PyUnicode_Check(divisor) || PyUnicode_CheckExact(divisor))) {
1813 // fast path; string formatting, but not if the RHS is a str subclass
1814 // (see issue28598)
1815 res = PyUnicode_Format(dividend, divisor);
1816 } else {
1817 res = PyNumber_Remainder(dividend, divisor);
1818 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001819 Py_DECREF(divisor);
1820 Py_DECREF(dividend);
1821 SET_TOP(res);
1822 if (res == NULL)
1823 goto error;
1824 DISPATCH();
1825 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001826
Benjamin Petersonddd19492018-09-16 22:38:02 -07001827 case TARGET(BINARY_ADD): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001828 PyObject *right = POP();
1829 PyObject *left = TOP();
1830 PyObject *sum;
Victor Stinnerbd0a08e2020-10-01 18:57:37 +02001831 /* NOTE(vstinner): Please don't try to micro-optimize int+int on
Victor Stinnerd65f42a2016-10-20 12:18:10 +02001832 CPython using bytecode, it is simply worthless.
1833 See http://bugs.python.org/issue21955 and
1834 http://bugs.python.org/issue10044 for the discussion. In short,
1835 no patch shown any impact on a realistic benchmark, only a minor
1836 speedup on microbenchmarks. */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001837 if (PyUnicode_CheckExact(left) &&
1838 PyUnicode_CheckExact(right)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02001839 sum = unicode_concatenate(tstate, left, right, f, next_instr);
Martin Panter95f53c12016-07-18 08:23:26 +00001840 /* unicode_concatenate consumed the ref to left */
Victor Stinnerd2a915d2011-10-02 20:34:20 +02001841 }
1842 else {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001843 sum = PyNumber_Add(left, right);
1844 Py_DECREF(left);
Victor Stinnerd2a915d2011-10-02 20:34:20 +02001845 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001846 Py_DECREF(right);
1847 SET_TOP(sum);
1848 if (sum == NULL)
1849 goto error;
1850 DISPATCH();
1851 }
1852
Benjamin Petersonddd19492018-09-16 22:38:02 -07001853 case TARGET(BINARY_SUBTRACT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001854 PyObject *right = POP();
1855 PyObject *left = TOP();
1856 PyObject *diff = PyNumber_Subtract(left, right);
1857 Py_DECREF(right);
1858 Py_DECREF(left);
1859 SET_TOP(diff);
1860 if (diff == NULL)
1861 goto error;
1862 DISPATCH();
1863 }
1864
Benjamin Petersonddd19492018-09-16 22:38:02 -07001865 case TARGET(BINARY_SUBSCR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001866 PyObject *sub = POP();
1867 PyObject *container = TOP();
1868 PyObject *res = PyObject_GetItem(container, sub);
1869 Py_DECREF(container);
1870 Py_DECREF(sub);
1871 SET_TOP(res);
1872 if (res == NULL)
1873 goto error;
1874 DISPATCH();
1875 }
1876
Benjamin Petersonddd19492018-09-16 22:38:02 -07001877 case TARGET(BINARY_LSHIFT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001878 PyObject *right = POP();
1879 PyObject *left = TOP();
1880 PyObject *res = PyNumber_Lshift(left, right);
1881 Py_DECREF(left);
1882 Py_DECREF(right);
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_RSHIFT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001890 PyObject *right = POP();
1891 PyObject *left = TOP();
1892 PyObject *res = PyNumber_Rshift(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_AND): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001902 PyObject *right = POP();
1903 PyObject *left = TOP();
1904 PyObject *res = PyNumber_And(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_XOR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001914 PyObject *right = POP();
1915 PyObject *left = TOP();
1916 PyObject *res = PyNumber_Xor(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_OR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001926 PyObject *right = POP();
1927 PyObject *left = TOP();
1928 PyObject *res = PyNumber_Or(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(LIST_APPEND): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001938 PyObject *v = POP();
1939 PyObject *list = PEEK(oparg);
1940 int err;
1941 err = PyList_Append(list, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001942 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001943 if (err != 0)
1944 goto error;
1945 PREDICT(JUMP_ABSOLUTE);
1946 DISPATCH();
1947 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001948
Benjamin Petersonddd19492018-09-16 22:38:02 -07001949 case TARGET(SET_ADD): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001950 PyObject *v = POP();
Raymond Hettinger41862222016-10-15 19:03:06 -07001951 PyObject *set = PEEK(oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001952 int err;
1953 err = PySet_Add(set, 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(INPLACE_POWER): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001962 PyObject *exp = POP();
1963 PyObject *base = TOP();
1964 PyObject *res = PyNumber_InPlacePower(base, exp, Py_None);
1965 Py_DECREF(base);
1966 Py_DECREF(exp);
1967 SET_TOP(res);
1968 if (res == NULL)
1969 goto error;
1970 DISPATCH();
1971 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001972
Benjamin Petersonddd19492018-09-16 22:38:02 -07001973 case TARGET(INPLACE_MULTIPLY): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001974 PyObject *right = POP();
1975 PyObject *left = TOP();
1976 PyObject *res = PyNumber_InPlaceMultiply(left, right);
1977 Py_DECREF(left);
1978 Py_DECREF(right);
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_MATRIX_MULTIPLY): {
Benjamin Petersond51374e2014-04-09 23:55:56 -04001986 PyObject *right = POP();
1987 PyObject *left = TOP();
1988 PyObject *res = PyNumber_InPlaceMatrixMultiply(left, right);
1989 Py_DECREF(left);
1990 Py_DECREF(right);
1991 SET_TOP(res);
1992 if (res == NULL)
1993 goto error;
1994 DISPATCH();
1995 }
1996
Benjamin Petersonddd19492018-09-16 22:38:02 -07001997 case TARGET(INPLACE_TRUE_DIVIDE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001998 PyObject *divisor = POP();
1999 PyObject *dividend = TOP();
2000 PyObject *quotient = PyNumber_InPlaceTrueDivide(dividend, divisor);
2001 Py_DECREF(dividend);
2002 Py_DECREF(divisor);
2003 SET_TOP(quotient);
2004 if (quotient == NULL)
2005 goto error;
2006 DISPATCH();
2007 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002008
Benjamin Petersonddd19492018-09-16 22:38:02 -07002009 case TARGET(INPLACE_FLOOR_DIVIDE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002010 PyObject *divisor = POP();
2011 PyObject *dividend = TOP();
2012 PyObject *quotient = PyNumber_InPlaceFloorDivide(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_MODULO): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002022 PyObject *right = POP();
2023 PyObject *left = TOP();
2024 PyObject *mod = PyNumber_InPlaceRemainder(left, right);
2025 Py_DECREF(left);
2026 Py_DECREF(right);
2027 SET_TOP(mod);
2028 if (mod == 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_ADD): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002034 PyObject *right = POP();
2035 PyObject *left = TOP();
2036 PyObject *sum;
2037 if (PyUnicode_CheckExact(left) && PyUnicode_CheckExact(right)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002038 sum = unicode_concatenate(tstate, left, right, f, next_instr);
Martin Panter95f53c12016-07-18 08:23:26 +00002039 /* unicode_concatenate consumed the ref to left */
Victor Stinnerd2a915d2011-10-02 20:34:20 +02002040 }
2041 else {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002042 sum = PyNumber_InPlaceAdd(left, right);
2043 Py_DECREF(left);
Victor Stinnerd2a915d2011-10-02 20:34:20 +02002044 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002045 Py_DECREF(right);
2046 SET_TOP(sum);
2047 if (sum == NULL)
2048 goto error;
2049 DISPATCH();
2050 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002051
Benjamin Petersonddd19492018-09-16 22:38:02 -07002052 case TARGET(INPLACE_SUBTRACT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002053 PyObject *right = POP();
2054 PyObject *left = TOP();
2055 PyObject *diff = PyNumber_InPlaceSubtract(left, right);
2056 Py_DECREF(left);
2057 Py_DECREF(right);
2058 SET_TOP(diff);
2059 if (diff == 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_LSHIFT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002065 PyObject *right = POP();
2066 PyObject *left = TOP();
2067 PyObject *res = PyNumber_InPlaceLshift(left, right);
2068 Py_DECREF(left);
2069 Py_DECREF(right);
2070 SET_TOP(res);
2071 if (res == 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_RSHIFT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002077 PyObject *right = POP();
2078 PyObject *left = TOP();
2079 PyObject *res = PyNumber_InPlaceRshift(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_AND): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002089 PyObject *right = POP();
2090 PyObject *left = TOP();
2091 PyObject *res = PyNumber_InPlaceAnd(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_XOR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002101 PyObject *right = POP();
2102 PyObject *left = TOP();
2103 PyObject *res = PyNumber_InPlaceXor(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_OR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002113 PyObject *right = POP();
2114 PyObject *left = TOP();
2115 PyObject *res = PyNumber_InPlaceOr(left, right);
2116 Py_DECREF(left);
2117 Py_DECREF(right);
2118 SET_TOP(res);
2119 if (res == NULL)
2120 goto error;
2121 DISPATCH();
2122 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002123
Benjamin Petersonddd19492018-09-16 22:38:02 -07002124 case TARGET(STORE_SUBSCR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002125 PyObject *sub = TOP();
2126 PyObject *container = SECOND();
2127 PyObject *v = THIRD();
2128 int err;
costypetrisor8ed317f2018-07-31 20:55:14 +00002129 STACK_SHRINK(3);
Martin Panter95f53c12016-07-18 08:23:26 +00002130 /* container[sub] = v */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002131 err = PyObject_SetItem(container, sub, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002132 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002133 Py_DECREF(container);
2134 Py_DECREF(sub);
2135 if (err != 0)
2136 goto error;
2137 DISPATCH();
2138 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002139
Benjamin Petersonddd19492018-09-16 22:38:02 -07002140 case TARGET(DELETE_SUBSCR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002141 PyObject *sub = TOP();
2142 PyObject *container = SECOND();
2143 int err;
costypetrisor8ed317f2018-07-31 20:55:14 +00002144 STACK_SHRINK(2);
Martin Panter95f53c12016-07-18 08:23:26 +00002145 /* del container[sub] */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002146 err = PyObject_DelItem(container, sub);
2147 Py_DECREF(container);
2148 Py_DECREF(sub);
2149 if (err != 0)
2150 goto error;
2151 DISPATCH();
2152 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00002153
Benjamin Petersonddd19492018-09-16 22:38:02 -07002154 case TARGET(PRINT_EXPR): {
Victor Stinnercab75e32013-11-06 22:38:37 +01002155 _Py_IDENTIFIER(displayhook);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002156 PyObject *value = POP();
Victor Stinnercab75e32013-11-06 22:38:37 +01002157 PyObject *hook = _PySys_GetObjectId(&PyId_displayhook);
Benjamin Petersonfe1bcb62012-10-12 11:40:01 -04002158 PyObject *res;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002159 if (hook == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002160 _PyErr_SetString(tstate, PyExc_RuntimeError,
2161 "lost sys.displayhook");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002162 Py_DECREF(value);
2163 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002164 }
Petr Viktorinffd97532020-02-11 17:46:57 +01002165 res = PyObject_CallOneArg(hook, value);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002166 Py_DECREF(value);
2167 if (res == NULL)
2168 goto error;
2169 Py_DECREF(res);
2170 DISPATCH();
2171 }
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00002172
Benjamin Petersonddd19492018-09-16 22:38:02 -07002173 case TARGET(RAISE_VARARGS): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002174 PyObject *cause = NULL, *exc = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002175 switch (oparg) {
2176 case 2:
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002177 cause = POP(); /* cause */
Stefan Krahf432a322017-08-21 13:09:59 +02002178 /* fall through */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002179 case 1:
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002180 exc = POP(); /* exc */
Stefan Krahf432a322017-08-21 13:09:59 +02002181 /* fall through */
2182 case 0:
Victor Stinner09532fe2019-05-10 23:39:09 +02002183 if (do_raise(tstate, exc, cause)) {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002184 goto exception_unwind;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002185 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002186 break;
2187 default:
Victor Stinner438a12d2019-05-24 17:01:38 +02002188 _PyErr_SetString(tstate, PyExc_SystemError,
2189 "bad RAISE_VARARGS oparg");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002190 break;
2191 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002192 goto error;
2193 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002194
Benjamin Petersonddd19492018-09-16 22:38:02 -07002195 case TARGET(RETURN_VALUE): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002196 retval = POP();
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002197 assert(f->f_iblock == 0);
Mark Shannone7c9f4a2020-01-13 12:51:26 +00002198 assert(EMPTY());
Mark Shannoncb9879b2020-07-17 11:44:23 +01002199 f->f_state = FRAME_RETURNED;
2200 f->f_stackdepth = 0;
Mark Shannone7c9f4a2020-01-13 12:51:26 +00002201 goto exiting;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002202 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002203
Benjamin Petersonddd19492018-09-16 22:38:02 -07002204 case TARGET(GET_AITER): {
Yury Selivanov6ef05902015-05-28 11:21:31 -04002205 unaryfunc getter = NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04002206 PyObject *iter = NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04002207 PyObject *obj = TOP();
2208 PyTypeObject *type = Py_TYPE(obj);
2209
Yury Selivanova6f6edb2016-06-09 15:08:31 -04002210 if (type->tp_as_async != NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04002211 getter = type->tp_as_async->am_aiter;
Yury Selivanova6f6edb2016-06-09 15:08:31 -04002212 }
Yury Selivanov75445082015-05-11 22:57:16 -04002213
2214 if (getter != NULL) {
2215 iter = (*getter)(obj);
2216 Py_DECREF(obj);
2217 if (iter == NULL) {
2218 SET_TOP(NULL);
2219 goto error;
2220 }
2221 }
2222 else {
2223 SET_TOP(NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02002224 _PyErr_Format(tstate, PyExc_TypeError,
2225 "'async for' requires an object with "
2226 "__aiter__ method, got %.100s",
2227 type->tp_name);
Yury Selivanov75445082015-05-11 22:57:16 -04002228 Py_DECREF(obj);
2229 goto error;
2230 }
2231
Yury Selivanovfaa135a2017-10-06 02:08:57 -04002232 if (Py_TYPE(iter)->tp_as_async == NULL ||
2233 Py_TYPE(iter)->tp_as_async->am_anext == NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04002234
Yury Selivanov398ff912017-03-02 22:20:00 -05002235 SET_TOP(NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02002236 _PyErr_Format(tstate, PyExc_TypeError,
2237 "'async for' received an object from __aiter__ "
2238 "that does not implement __anext__: %.100s",
2239 Py_TYPE(iter)->tp_name);
Yury Selivanov75445082015-05-11 22:57:16 -04002240 Py_DECREF(iter);
2241 goto error;
Yury Selivanova6f6edb2016-06-09 15:08:31 -04002242 }
2243
Yury Selivanovfaa135a2017-10-06 02:08:57 -04002244 SET_TOP(iter);
Yury Selivanov75445082015-05-11 22:57:16 -04002245 DISPATCH();
2246 }
2247
Benjamin Petersonddd19492018-09-16 22:38:02 -07002248 case TARGET(GET_ANEXT): {
Yury Selivanov6ef05902015-05-28 11:21:31 -04002249 unaryfunc getter = NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04002250 PyObject *next_iter = NULL;
2251 PyObject *awaitable = NULL;
2252 PyObject *aiter = TOP();
2253 PyTypeObject *type = Py_TYPE(aiter);
2254
Yury Selivanoveb636452016-09-08 22:01:51 -07002255 if (PyAsyncGen_CheckExact(aiter)) {
2256 awaitable = type->tp_as_async->am_anext(aiter);
2257 if (awaitable == NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04002258 goto error;
2259 }
Yury Selivanoveb636452016-09-08 22:01:51 -07002260 } else {
2261 if (type->tp_as_async != NULL){
2262 getter = type->tp_as_async->am_anext;
2263 }
Yury Selivanov75445082015-05-11 22:57:16 -04002264
Yury Selivanoveb636452016-09-08 22:01:51 -07002265 if (getter != NULL) {
2266 next_iter = (*getter)(aiter);
2267 if (next_iter == NULL) {
2268 goto error;
2269 }
2270 }
2271 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02002272 _PyErr_Format(tstate, PyExc_TypeError,
2273 "'async for' requires an iterator with "
2274 "__anext__ method, got %.100s",
2275 type->tp_name);
Yury Selivanoveb636452016-09-08 22:01:51 -07002276 goto error;
2277 }
Yury Selivanov75445082015-05-11 22:57:16 -04002278
Yury Selivanoveb636452016-09-08 22:01:51 -07002279 awaitable = _PyCoro_GetAwaitableIter(next_iter);
2280 if (awaitable == NULL) {
Yury Selivanov398ff912017-03-02 22:20:00 -05002281 _PyErr_FormatFromCause(
Yury Selivanoveb636452016-09-08 22:01:51 -07002282 PyExc_TypeError,
2283 "'async for' received an invalid object "
2284 "from __anext__: %.100s",
2285 Py_TYPE(next_iter)->tp_name);
2286
2287 Py_DECREF(next_iter);
2288 goto error;
2289 } else {
2290 Py_DECREF(next_iter);
2291 }
2292 }
Yury Selivanov75445082015-05-11 22:57:16 -04002293
2294 PUSH(awaitable);
Serhiy Storchakada9c5132016-06-27 18:58:57 +03002295 PREDICT(LOAD_CONST);
Yury Selivanov75445082015-05-11 22:57:16 -04002296 DISPATCH();
2297 }
2298
Benjamin Petersonddd19492018-09-16 22:38:02 -07002299 case TARGET(GET_AWAITABLE): {
2300 PREDICTED(GET_AWAITABLE);
Yury Selivanov75445082015-05-11 22:57:16 -04002301 PyObject *iterable = TOP();
Yury Selivanov5376ba92015-06-22 12:19:30 -04002302 PyObject *iter = _PyCoro_GetAwaitableIter(iterable);
Yury Selivanov75445082015-05-11 22:57:16 -04002303
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03002304 if (iter == NULL) {
Mark Shannonfee55262019-11-21 09:11:43 +00002305 int opcode_at_minus_3 = 0;
2306 if ((next_instr - first_instr) > 2) {
2307 opcode_at_minus_3 = _Py_OPCODE(next_instr[-3]);
2308 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002309 format_awaitable_error(tstate, Py_TYPE(iterable),
Mark Shannonfee55262019-11-21 09:11:43 +00002310 opcode_at_minus_3,
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03002311 _Py_OPCODE(next_instr[-2]));
2312 }
2313
Yury Selivanov75445082015-05-11 22:57:16 -04002314 Py_DECREF(iterable);
2315
Yury Selivanovc724bae2016-03-02 11:30:46 -05002316 if (iter != NULL && PyCoro_CheckExact(iter)) {
2317 PyObject *yf = _PyGen_yf((PyGenObject*)iter);
2318 if (yf != NULL) {
2319 /* `iter` is a coroutine object that is being
2320 awaited, `yf` is a pointer to the current awaitable
2321 being awaited on. */
2322 Py_DECREF(yf);
2323 Py_CLEAR(iter);
Victor Stinner438a12d2019-05-24 17:01:38 +02002324 _PyErr_SetString(tstate, PyExc_RuntimeError,
2325 "coroutine is being awaited already");
Yury Selivanovc724bae2016-03-02 11:30:46 -05002326 /* The code below jumps to `error` if `iter` is NULL. */
2327 }
2328 }
2329
Yury Selivanov75445082015-05-11 22:57:16 -04002330 SET_TOP(iter); /* Even if it's NULL */
2331
2332 if (iter == NULL) {
2333 goto error;
2334 }
2335
Serhiy Storchakada9c5132016-06-27 18:58:57 +03002336 PREDICT(LOAD_CONST);
Yury Selivanov75445082015-05-11 22:57:16 -04002337 DISPATCH();
2338 }
2339
Benjamin Petersonddd19492018-09-16 22:38:02 -07002340 case TARGET(YIELD_FROM): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002341 PyObject *v = POP();
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07002342 PyObject *receiver = TOP();
Vladimir Matveev037245c2020-10-09 17:15:15 -07002343 PySendResult gen_status;
2344 if (tstate->c_tracefunc == NULL) {
2345 gen_status = PyIter_Send(receiver, v, &retval);
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05002346 } else {
Vladimir Matveev037245c2020-10-09 17:15:15 -07002347 _Py_IDENTIFIER(send);
2348 if (v == Py_None && PyIter_Check(receiver)) {
2349 retval = Py_TYPE(receiver)->tp_iternext(receiver);
Vladimir Matveev2b053612020-09-18 18:38:38 -07002350 }
2351 else {
Vladimir Matveev037245c2020-10-09 17:15:15 -07002352 retval = _PyObject_CallMethodIdOneArg(receiver, &PyId_send, v);
Vladimir Matveev2b053612020-09-18 18:38:38 -07002353 }
Vladimir Matveev2b053612020-09-18 18:38:38 -07002354 if (retval == NULL) {
2355 if (tstate->c_tracefunc != NULL
2356 && _PyErr_ExceptionMatches(tstate, PyExc_StopIteration))
Mark Shannon86433452021-01-07 16:49:02 +00002357 call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj, tstate, f, &bounds);
Vladimir Matveev2b053612020-09-18 18:38:38 -07002358 if (_PyGen_FetchStopIterationValue(&retval) == 0) {
2359 gen_status = PYGEN_RETURN;
2360 }
2361 else {
2362 gen_status = PYGEN_ERROR;
2363 }
2364 }
2365 else {
2366 gen_status = PYGEN_NEXT;
2367 }
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05002368 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002369 Py_DECREF(v);
Vladimir Matveev2b053612020-09-18 18:38:38 -07002370 if (gen_status == PYGEN_ERROR) {
2371 assert (retval == NULL);
2372 goto error;
2373 }
2374 if (gen_status == PYGEN_RETURN) {
2375 assert (retval != NULL);
2376
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07002377 Py_DECREF(receiver);
Vladimir Matveev2b053612020-09-18 18:38:38 -07002378 SET_TOP(retval);
2379 retval = NULL;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002380 DISPATCH();
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002381 }
Vladimir Matveev2b053612020-09-18 18:38:38 -07002382 assert (gen_status == PYGEN_NEXT);
Martin Panter95f53c12016-07-18 08:23:26 +00002383 /* receiver remains on stack, retval is value to be yielded */
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05002384 /* and repeat... */
Victor Stinnerf7d199f2016-11-24 22:33:01 +01002385 assert(f->f_lasti >= (int)sizeof(_Py_CODEUNIT));
Serhiy Storchakaab874002016-09-11 13:48:15 +03002386 f->f_lasti -= sizeof(_Py_CODEUNIT);
Mark Shannoncb9879b2020-07-17 11:44:23 +01002387 f->f_state = FRAME_SUSPENDED;
Victor Stinnerb7d8d8d2020-09-23 14:07:16 +02002388 f->f_stackdepth = (int)(stack_pointer - f->f_valuestack);
Mark Shannone7c9f4a2020-01-13 12:51:26 +00002389 goto exiting;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002390 }
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002391
Benjamin Petersonddd19492018-09-16 22:38:02 -07002392 case TARGET(YIELD_VALUE): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002393 retval = POP();
Yury Selivanoveb636452016-09-08 22:01:51 -07002394
2395 if (co->co_flags & CO_ASYNC_GENERATOR) {
2396 PyObject *w = _PyAsyncGenValueWrapperNew(retval);
2397 Py_DECREF(retval);
2398 if (w == NULL) {
2399 retval = NULL;
2400 goto error;
2401 }
2402 retval = w;
2403 }
Mark Shannoncb9879b2020-07-17 11:44:23 +01002404 f->f_state = FRAME_SUSPENDED;
Victor Stinnerb7d8d8d2020-09-23 14:07:16 +02002405 f->f_stackdepth = (int)(stack_pointer - f->f_valuestack);
Mark Shannone7c9f4a2020-01-13 12:51:26 +00002406 goto exiting;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002407 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002408
Benjamin Petersonddd19492018-09-16 22:38:02 -07002409 case TARGET(POP_EXCEPT): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002410 PyObject *type, *value, *traceback;
2411 _PyErr_StackItem *exc_info;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002412 PyTryBlock *b = PyFrame_BlockPop(f);
2413 if (b->b_type != EXCEPT_HANDLER) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002414 _PyErr_SetString(tstate, PyExc_SystemError,
2415 "popped block is not an except handler");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002416 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002417 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002418 assert(STACK_LEVEL() >= (b)->b_level + 3 &&
2419 STACK_LEVEL() <= (b)->b_level + 4);
2420 exc_info = tstate->exc_info;
2421 type = exc_info->exc_type;
2422 value = exc_info->exc_value;
2423 traceback = exc_info->exc_traceback;
2424 exc_info->exc_type = POP();
2425 exc_info->exc_value = POP();
2426 exc_info->exc_traceback = POP();
2427 Py_XDECREF(type);
2428 Py_XDECREF(value);
2429 Py_XDECREF(traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002430 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002431 }
Benjamin Petersoneec3d712008-06-11 15:59:43 +00002432
Benjamin Petersonddd19492018-09-16 22:38:02 -07002433 case TARGET(POP_BLOCK): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002434 PyFrame_BlockPop(f);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002435 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002436 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002437
Mark Shannonfee55262019-11-21 09:11:43 +00002438 case TARGET(RERAISE): {
Mark Shannonbf353f32020-12-17 13:55:28 +00002439 assert(f->f_iblock > 0);
2440 if (oparg) {
2441 f->f_lasti = f->f_blockstack[f->f_iblock-1].b_handler;
2442 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002443 PyObject *exc = POP();
Mark Shannonfee55262019-11-21 09:11:43 +00002444 PyObject *val = POP();
2445 PyObject *tb = POP();
2446 assert(PyExceptionClass_Check(exc));
Victor Stinner61f4db82020-01-28 03:37:45 +01002447 _PyErr_Restore(tstate, exc, val, tb);
Mark Shannonfee55262019-11-21 09:11:43 +00002448 goto exception_unwind;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002449 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002450
Benjamin Petersonddd19492018-09-16 22:38:02 -07002451 case TARGET(END_ASYNC_FOR): {
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002452 PyObject *exc = POP();
2453 assert(PyExceptionClass_Check(exc));
2454 if (PyErr_GivenExceptionMatches(exc, PyExc_StopAsyncIteration)) {
2455 PyTryBlock *b = PyFrame_BlockPop(f);
2456 assert(b->b_type == EXCEPT_HANDLER);
2457 Py_DECREF(exc);
2458 UNWIND_EXCEPT_HANDLER(b);
2459 Py_DECREF(POP());
2460 JUMPBY(oparg);
2461 FAST_DISPATCH();
2462 }
2463 else {
2464 PyObject *val = POP();
2465 PyObject *tb = POP();
Victor Stinner438a12d2019-05-24 17:01:38 +02002466 _PyErr_Restore(tstate, exc, val, tb);
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002467 goto exception_unwind;
2468 }
2469 }
2470
Zackery Spytzce6a0702019-08-25 03:44:09 -06002471 case TARGET(LOAD_ASSERTION_ERROR): {
2472 PyObject *value = PyExc_AssertionError;
2473 Py_INCREF(value);
2474 PUSH(value);
2475 FAST_DISPATCH();
2476 }
2477
Benjamin Petersonddd19492018-09-16 22:38:02 -07002478 case TARGET(LOAD_BUILD_CLASS): {
Victor Stinner3c1e4812012-03-26 22:10:51 +02002479 _Py_IDENTIFIER(__build_class__);
Victor Stinnerb0b22422012-04-19 00:57:45 +02002480
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002481 PyObject *bc;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002482 if (PyDict_CheckExact(f->f_builtins)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002483 bc = _PyDict_GetItemIdWithError(f->f_builtins, &PyId___build_class__);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002484 if (bc == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002485 if (!_PyErr_Occurred(tstate)) {
2486 _PyErr_SetString(tstate, PyExc_NameError,
2487 "__build_class__ not found");
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002488 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002489 goto error;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002490 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002491 Py_INCREF(bc);
Victor Stinnerb0b22422012-04-19 00:57:45 +02002492 }
2493 else {
2494 PyObject *build_class_str = _PyUnicode_FromId(&PyId___build_class__);
2495 if (build_class_str == NULL)
Serhiy Storchaka70b72f02016-11-08 23:12:46 +02002496 goto error;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002497 bc = PyObject_GetItem(f->f_builtins, build_class_str);
2498 if (bc == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002499 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError))
2500 _PyErr_SetString(tstate, PyExc_NameError,
2501 "__build_class__ not found");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002502 goto error;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002503 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002504 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002505 PUSH(bc);
Benjamin Peterson00f86f22012-10-10 14:10:33 -04002506 DISPATCH();
Victor Stinner3c1e4812012-03-26 22:10:51 +02002507 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002508
Benjamin Petersonddd19492018-09-16 22:38:02 -07002509 case TARGET(STORE_NAME): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002510 PyObject *name = GETITEM(names, oparg);
2511 PyObject *v = POP();
2512 PyObject *ns = f->f_locals;
2513 int err;
2514 if (ns == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002515 _PyErr_Format(tstate, PyExc_SystemError,
2516 "no locals found when storing %R", name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002517 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002518 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002519 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002520 if (PyDict_CheckExact(ns))
2521 err = PyDict_SetItem(ns, name, v);
2522 else
2523 err = PyObject_SetItem(ns, name, v);
2524 Py_DECREF(v);
2525 if (err != 0)
2526 goto error;
2527 DISPATCH();
2528 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002529
Benjamin Petersonddd19492018-09-16 22:38:02 -07002530 case TARGET(DELETE_NAME): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002531 PyObject *name = GETITEM(names, oparg);
2532 PyObject *ns = f->f_locals;
2533 int err;
2534 if (ns == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002535 _PyErr_Format(tstate, PyExc_SystemError,
2536 "no locals when deleting %R", name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002537 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002538 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002539 err = PyObject_DelItem(ns, name);
2540 if (err != 0) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002541 format_exc_check_arg(tstate, PyExc_NameError,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002542 NAME_ERROR_MSG,
2543 name);
2544 goto error;
2545 }
2546 DISPATCH();
2547 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00002548
Benjamin Petersonddd19492018-09-16 22:38:02 -07002549 case TARGET(UNPACK_SEQUENCE): {
2550 PREDICTED(UNPACK_SEQUENCE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002551 PyObject *seq = POP(), *item, **items;
2552 if (PyTuple_CheckExact(seq) &&
2553 PyTuple_GET_SIZE(seq) == oparg) {
2554 items = ((PyTupleObject *)seq)->ob_item;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002555 while (oparg--) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002556 item = items[oparg];
2557 Py_INCREF(item);
2558 PUSH(item);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002559 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002560 } else if (PyList_CheckExact(seq) &&
2561 PyList_GET_SIZE(seq) == oparg) {
2562 items = ((PyListObject *)seq)->ob_item;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002563 while (oparg--) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002564 item = items[oparg];
2565 Py_INCREF(item);
2566 PUSH(item);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002567 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002568 } else if (unpack_iterable(tstate, seq, oparg, -1,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002569 stack_pointer + oparg)) {
costypetrisor8ed317f2018-07-31 20:55:14 +00002570 STACK_GROW(oparg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002571 } else {
2572 /* unpack_iterable() raised an exception */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002573 Py_DECREF(seq);
2574 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002575 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002576 Py_DECREF(seq);
Benjamin Peterson00f86f22012-10-10 14:10:33 -04002577 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002578 }
Guido van Rossum0368b722007-05-11 16:50:42 +00002579
Benjamin Petersonddd19492018-09-16 22:38:02 -07002580 case TARGET(UNPACK_EX): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002581 int totalargs = 1 + (oparg & 0xFF) + (oparg >> 8);
2582 PyObject *seq = POP();
2583
Victor Stinner438a12d2019-05-24 17:01:38 +02002584 if (unpack_iterable(tstate, seq, oparg & 0xFF, oparg >> 8,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002585 stack_pointer + totalargs)) {
2586 stack_pointer += totalargs;
2587 } else {
2588 Py_DECREF(seq);
2589 goto error;
2590 }
2591 Py_DECREF(seq);
2592 DISPATCH();
2593 }
2594
Benjamin Petersonddd19492018-09-16 22:38:02 -07002595 case TARGET(STORE_ATTR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002596 PyObject *name = GETITEM(names, oparg);
2597 PyObject *owner = TOP();
2598 PyObject *v = SECOND();
2599 int err;
costypetrisor8ed317f2018-07-31 20:55:14 +00002600 STACK_SHRINK(2);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002601 err = PyObject_SetAttr(owner, name, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002602 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002603 Py_DECREF(owner);
2604 if (err != 0)
2605 goto error;
2606 DISPATCH();
2607 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002608
Benjamin Petersonddd19492018-09-16 22:38:02 -07002609 case TARGET(DELETE_ATTR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002610 PyObject *name = GETITEM(names, oparg);
2611 PyObject *owner = POP();
2612 int err;
2613 err = PyObject_SetAttr(owner, name, (PyObject *)NULL);
2614 Py_DECREF(owner);
2615 if (err != 0)
2616 goto error;
2617 DISPATCH();
2618 }
2619
Benjamin Petersonddd19492018-09-16 22:38:02 -07002620 case TARGET(STORE_GLOBAL): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002621 PyObject *name = GETITEM(names, oparg);
2622 PyObject *v = POP();
2623 int err;
2624 err = PyDict_SetItem(f->f_globals, name, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002625 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002626 if (err != 0)
2627 goto error;
2628 DISPATCH();
2629 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002630
Benjamin Petersonddd19492018-09-16 22:38:02 -07002631 case TARGET(DELETE_GLOBAL): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002632 PyObject *name = GETITEM(names, oparg);
2633 int err;
2634 err = PyDict_DelItem(f->f_globals, name);
2635 if (err != 0) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002636 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
2637 format_exc_check_arg(tstate, PyExc_NameError,
2638 NAME_ERROR_MSG, name);
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002639 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002640 goto error;
Benjamin Peterson00f86f22012-10-10 14:10:33 -04002641 }
2642 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002643 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002644
Benjamin Petersonddd19492018-09-16 22:38:02 -07002645 case TARGET(LOAD_NAME): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002646 PyObject *name = GETITEM(names, oparg);
2647 PyObject *locals = f->f_locals;
2648 PyObject *v;
2649 if (locals == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002650 _PyErr_Format(tstate, PyExc_SystemError,
2651 "no locals when loading %R", name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002652 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002653 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002654 if (PyDict_CheckExact(locals)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002655 v = PyDict_GetItemWithError(locals, name);
2656 if (v != NULL) {
2657 Py_INCREF(v);
2658 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002659 else if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002660 goto error;
2661 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002662 }
2663 else {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002664 v = PyObject_GetItem(locals, name);
Victor Stinnere20310f2015-11-05 13:56:58 +01002665 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002666 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError))
Benjamin Peterson92722792012-12-15 12:51:05 -05002667 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02002668 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002669 }
2670 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002671 if (v == NULL) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002672 v = PyDict_GetItemWithError(f->f_globals, name);
2673 if (v != NULL) {
2674 Py_INCREF(v);
2675 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002676 else if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002677 goto error;
2678 }
2679 else {
Victor Stinnerb0b22422012-04-19 00:57:45 +02002680 if (PyDict_CheckExact(f->f_builtins)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002681 v = PyDict_GetItemWithError(f->f_builtins, name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002682 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002683 if (!_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002684 format_exc_check_arg(
Victor Stinner438a12d2019-05-24 17:01:38 +02002685 tstate, PyExc_NameError,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002686 NAME_ERROR_MSG, name);
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002687 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002688 goto error;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002689 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002690 Py_INCREF(v);
Victor Stinnerb0b22422012-04-19 00:57:45 +02002691 }
2692 else {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002693 v = PyObject_GetItem(f->f_builtins, name);
2694 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002695 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Victor Stinnerb0b22422012-04-19 00:57:45 +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);
Victor Stinner438a12d2019-05-24 17:01:38 +02002699 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002700 goto error;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002701 }
Benjamin Peterson20f9c3c2010-07-20 22:39:34 +00002702 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002703 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002704 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002705 PUSH(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002706 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002707 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002708
Benjamin Petersonddd19492018-09-16 22:38:02 -07002709 case TARGET(LOAD_GLOBAL): {
Inada Naoki91234a12019-06-03 21:30:58 +09002710 PyObject *name;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002711 PyObject *v;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002712 if (PyDict_CheckExact(f->f_globals)
Victor Stinnerb4efc962015-11-20 09:24:02 +01002713 && PyDict_CheckExact(f->f_builtins))
2714 {
Inada Naoki91234a12019-06-03 21:30:58 +09002715 OPCACHE_CHECK();
2716 if (co_opcache != NULL && co_opcache->optimized > 0) {
2717 _PyOpcache_LoadGlobal *lg = &co_opcache->u.lg;
2718
2719 if (lg->globals_ver ==
2720 ((PyDictObject *)f->f_globals)->ma_version_tag
2721 && lg->builtins_ver ==
2722 ((PyDictObject *)f->f_builtins)->ma_version_tag)
2723 {
2724 PyObject *ptr = lg->ptr;
2725 OPCACHE_STAT_GLOBAL_HIT();
2726 assert(ptr != NULL);
2727 Py_INCREF(ptr);
2728 PUSH(ptr);
2729 DISPATCH();
2730 }
2731 }
2732
2733 name = GETITEM(names, oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002734 v = _PyDict_LoadGlobal((PyDictObject *)f->f_globals,
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002735 (PyDictObject *)f->f_builtins,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002736 name);
2737 if (v == NULL) {
Victor Stinnerb4efc962015-11-20 09:24:02 +01002738 if (!_PyErr_OCCURRED()) {
2739 /* _PyDict_LoadGlobal() returns NULL without raising
2740 * an exception if the key doesn't exist */
Victor Stinner438a12d2019-05-24 17:01:38 +02002741 format_exc_check_arg(tstate, PyExc_NameError,
Ezio Melotti04a29552013-03-03 15:12:44 +02002742 NAME_ERROR_MSG, name);
Victor Stinnerb4efc962015-11-20 09:24:02 +01002743 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002744 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002745 }
Inada Naoki91234a12019-06-03 21:30:58 +09002746
2747 if (co_opcache != NULL) {
2748 _PyOpcache_LoadGlobal *lg = &co_opcache->u.lg;
2749
2750 if (co_opcache->optimized == 0) {
2751 /* Wasn't optimized before. */
2752 OPCACHE_STAT_GLOBAL_OPT();
2753 } else {
2754 OPCACHE_STAT_GLOBAL_MISS();
2755 }
2756
2757 co_opcache->optimized = 1;
2758 lg->globals_ver =
2759 ((PyDictObject *)f->f_globals)->ma_version_tag;
2760 lg->builtins_ver =
2761 ((PyDictObject *)f->f_builtins)->ma_version_tag;
2762 lg->ptr = v; /* borrowed */
2763 }
2764
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002765 Py_INCREF(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002766 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002767 else {
2768 /* Slow-path if globals or builtins is not a dict */
Victor Stinnerb4efc962015-11-20 09:24:02 +01002769
2770 /* namespace 1: globals */
Inada Naoki91234a12019-06-03 21:30:58 +09002771 name = GETITEM(names, oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002772 v = PyObject_GetItem(f->f_globals, name);
2773 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002774 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Victor Stinner60a1d3c2015-11-05 13:55:20 +01002775 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02002776 }
2777 _PyErr_Clear(tstate);
Victor Stinner60a1d3c2015-11-05 13:55:20 +01002778
Victor Stinnerb4efc962015-11-20 09:24:02 +01002779 /* namespace 2: builtins */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002780 v = PyObject_GetItem(f->f_builtins, name);
2781 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002782 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002783 format_exc_check_arg(
Victor Stinner438a12d2019-05-24 17:01:38 +02002784 tstate, PyExc_NameError,
Ezio Melotti04a29552013-03-03 15:12:44 +02002785 NAME_ERROR_MSG, name);
Victor Stinner438a12d2019-05-24 17:01:38 +02002786 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002787 goto error;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002788 }
2789 }
2790 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002791 PUSH(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002792 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002793 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002794
Benjamin Petersonddd19492018-09-16 22:38:02 -07002795 case TARGET(DELETE_FAST): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002796 PyObject *v = GETLOCAL(oparg);
2797 if (v != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002798 SETLOCAL(oparg, NULL);
2799 DISPATCH();
2800 }
2801 format_exc_check_arg(
Victor Stinner438a12d2019-05-24 17:01:38 +02002802 tstate, PyExc_UnboundLocalError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002803 UNBOUNDLOCAL_ERROR_MSG,
2804 PyTuple_GetItem(co->co_varnames, oparg)
2805 );
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002806 goto error;
2807 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002808
Benjamin Petersonddd19492018-09-16 22:38:02 -07002809 case TARGET(DELETE_DEREF): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002810 PyObject *cell = freevars[oparg];
Raymond Hettingerc32f9db2016-11-12 04:10:35 -05002811 PyObject *oldobj = PyCell_GET(cell);
2812 if (oldobj != NULL) {
2813 PyCell_SET(cell, NULL);
2814 Py_DECREF(oldobj);
Benjamin Peterson00ebe2c2010-09-10 22:02:31 +00002815 DISPATCH();
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00002816 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002817 format_exc_unbound(tstate, co, oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002818 goto error;
2819 }
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00002820
Benjamin Petersonddd19492018-09-16 22:38:02 -07002821 case TARGET(LOAD_CLOSURE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002822 PyObject *cell = freevars[oparg];
2823 Py_INCREF(cell);
2824 PUSH(cell);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002825 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002826 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002827
Benjamin Petersonddd19492018-09-16 22:38:02 -07002828 case TARGET(LOAD_CLASSDEREF): {
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002829 PyObject *name, *value, *locals = f->f_locals;
Victor Stinnerd3dfd0e2013-05-16 23:48:01 +02002830 Py_ssize_t idx;
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002831 assert(locals);
2832 assert(oparg >= PyTuple_GET_SIZE(co->co_cellvars));
2833 idx = oparg - PyTuple_GET_SIZE(co->co_cellvars);
2834 assert(idx >= 0 && idx < PyTuple_GET_SIZE(co->co_freevars));
2835 name = PyTuple_GET_ITEM(co->co_freevars, idx);
2836 if (PyDict_CheckExact(locals)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002837 value = PyDict_GetItemWithError(locals, name);
2838 if (value != NULL) {
2839 Py_INCREF(value);
2840 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002841 else if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002842 goto error;
2843 }
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002844 }
2845 else {
2846 value = PyObject_GetItem(locals, name);
Victor Stinnere20310f2015-11-05 13:56:58 +01002847 if (value == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002848 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002849 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02002850 }
2851 _PyErr_Clear(tstate);
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002852 }
2853 }
2854 if (!value) {
2855 PyObject *cell = freevars[oparg];
2856 value = PyCell_GET(cell);
2857 if (value == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002858 format_exc_unbound(tstate, co, oparg);
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002859 goto error;
2860 }
2861 Py_INCREF(value);
2862 }
2863 PUSH(value);
2864 DISPATCH();
2865 }
2866
Benjamin Petersonddd19492018-09-16 22:38:02 -07002867 case TARGET(LOAD_DEREF): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002868 PyObject *cell = freevars[oparg];
2869 PyObject *value = PyCell_GET(cell);
2870 if (value == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002871 format_exc_unbound(tstate, co, oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002872 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002873 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002874 Py_INCREF(value);
2875 PUSH(value);
2876 DISPATCH();
2877 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002878
Benjamin Petersonddd19492018-09-16 22:38:02 -07002879 case TARGET(STORE_DEREF): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002880 PyObject *v = POP();
2881 PyObject *cell = freevars[oparg];
Raymond Hettingerb2b15432016-11-11 04:32:11 -08002882 PyObject *oldobj = PyCell_GET(cell);
2883 PyCell_SET(cell, v);
2884 Py_XDECREF(oldobj);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002885 DISPATCH();
2886 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002887
Benjamin Petersonddd19492018-09-16 22:38:02 -07002888 case TARGET(BUILD_STRING): {
Serhiy Storchakaea525a22016-09-06 22:07:53 +03002889 PyObject *str;
2890 PyObject *empty = PyUnicode_New(0, 0);
2891 if (empty == NULL) {
2892 goto error;
2893 }
2894 str = _PyUnicode_JoinArray(empty, stack_pointer - oparg, oparg);
2895 Py_DECREF(empty);
2896 if (str == NULL)
2897 goto error;
2898 while (--oparg >= 0) {
2899 PyObject *item = POP();
2900 Py_DECREF(item);
2901 }
2902 PUSH(str);
2903 DISPATCH();
2904 }
2905
Benjamin Petersonddd19492018-09-16 22:38:02 -07002906 case TARGET(BUILD_TUPLE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002907 PyObject *tup = PyTuple_New(oparg);
2908 if (tup == NULL)
2909 goto error;
2910 while (--oparg >= 0) {
2911 PyObject *item = POP();
2912 PyTuple_SET_ITEM(tup, oparg, item);
2913 }
2914 PUSH(tup);
2915 DISPATCH();
2916 }
2917
Benjamin Petersonddd19492018-09-16 22:38:02 -07002918 case TARGET(BUILD_LIST): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002919 PyObject *list = PyList_New(oparg);
2920 if (list == NULL)
2921 goto error;
2922 while (--oparg >= 0) {
2923 PyObject *item = POP();
2924 PyList_SET_ITEM(list, oparg, item);
2925 }
2926 PUSH(list);
2927 DISPATCH();
2928 }
2929
Mark Shannon13bc1392020-01-23 09:25:17 +00002930 case TARGET(LIST_TO_TUPLE): {
2931 PyObject *list = POP();
2932 PyObject *tuple = PyList_AsTuple(list);
2933 Py_DECREF(list);
2934 if (tuple == NULL) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002935 goto error;
Mark Shannon13bc1392020-01-23 09:25:17 +00002936 }
2937 PUSH(tuple);
2938 DISPATCH();
2939 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002940
Mark Shannon13bc1392020-01-23 09:25:17 +00002941 case TARGET(LIST_EXTEND): {
2942 PyObject *iterable = POP();
2943 PyObject *list = PEEK(oparg);
2944 PyObject *none_val = _PyList_Extend((PyListObject *)list, iterable);
2945 if (none_val == NULL) {
2946 if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError) &&
Victor Stinnera102ed72020-02-07 02:24:48 +01002947 (Py_TYPE(iterable)->tp_iter == NULL && !PySequence_Check(iterable)))
Mark Shannon13bc1392020-01-23 09:25:17 +00002948 {
Victor Stinner61f4db82020-01-28 03:37:45 +01002949 _PyErr_Clear(tstate);
Mark Shannon13bc1392020-01-23 09:25:17 +00002950 _PyErr_Format(tstate, PyExc_TypeError,
2951 "Value after * must be an iterable, not %.200s",
2952 Py_TYPE(iterable)->tp_name);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002953 }
Mark Shannon13bc1392020-01-23 09:25:17 +00002954 Py_DECREF(iterable);
2955 goto error;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002956 }
Mark Shannon13bc1392020-01-23 09:25:17 +00002957 Py_DECREF(none_val);
2958 Py_DECREF(iterable);
2959 DISPATCH();
2960 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002961
Mark Shannon13bc1392020-01-23 09:25:17 +00002962 case TARGET(SET_UPDATE): {
2963 PyObject *iterable = POP();
2964 PyObject *set = PEEK(oparg);
2965 int err = _PySet_Update(set, iterable);
2966 Py_DECREF(iterable);
2967 if (err < 0) {
2968 goto error;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002969 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002970 DISPATCH();
2971 }
2972
Benjamin Petersonddd19492018-09-16 22:38:02 -07002973 case TARGET(BUILD_SET): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002974 PyObject *set = PySet_New(NULL);
2975 int err = 0;
Raymond Hettinger4c483ad2016-09-08 14:45:40 -07002976 int i;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002977 if (set == NULL)
2978 goto error;
Raymond Hettinger4c483ad2016-09-08 14:45:40 -07002979 for (i = oparg; i > 0; i--) {
2980 PyObject *item = PEEK(i);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002981 if (err == 0)
2982 err = PySet_Add(set, item);
2983 Py_DECREF(item);
2984 }
costypetrisor8ed317f2018-07-31 20:55:14 +00002985 STACK_SHRINK(oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002986 if (err != 0) {
2987 Py_DECREF(set);
2988 goto error;
2989 }
2990 PUSH(set);
2991 DISPATCH();
2992 }
2993
Benjamin Petersonddd19492018-09-16 22:38:02 -07002994 case TARGET(BUILD_MAP): {
Victor Stinner74319ae2016-08-25 00:04:09 +02002995 Py_ssize_t i;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002996 PyObject *map = _PyDict_NewPresized((Py_ssize_t)oparg);
2997 if (map == NULL)
2998 goto error;
Benjamin Petersond5d77aa2015-07-05 10:37:25 -05002999 for (i = oparg; i > 0; i--) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003000 int err;
Benjamin Petersond5d77aa2015-07-05 10:37:25 -05003001 PyObject *key = PEEK(2*i);
3002 PyObject *value = PEEK(2*i - 1);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003003 err = PyDict_SetItem(map, key, value);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003004 if (err != 0) {
3005 Py_DECREF(map);
3006 goto error;
3007 }
3008 }
Benjamin Petersond5d77aa2015-07-05 10:37:25 -05003009
3010 while (oparg--) {
3011 Py_DECREF(POP());
3012 Py_DECREF(POP());
3013 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003014 PUSH(map);
3015 DISPATCH();
3016 }
3017
Benjamin Petersonddd19492018-09-16 22:38:02 -07003018 case TARGET(SETUP_ANNOTATIONS): {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003019 _Py_IDENTIFIER(__annotations__);
3020 int err;
3021 PyObject *ann_dict;
3022 if (f->f_locals == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003023 _PyErr_Format(tstate, PyExc_SystemError,
3024 "no locals found when setting up annotations");
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003025 goto error;
3026 }
3027 /* check if __annotations__ in locals()... */
3028 if (PyDict_CheckExact(f->f_locals)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02003029 ann_dict = _PyDict_GetItemIdWithError(f->f_locals,
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003030 &PyId___annotations__);
3031 if (ann_dict == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003032 if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02003033 goto error;
3034 }
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003035 /* ...if not, create a new one */
3036 ann_dict = PyDict_New();
3037 if (ann_dict == NULL) {
3038 goto error;
3039 }
3040 err = _PyDict_SetItemId(f->f_locals,
3041 &PyId___annotations__, ann_dict);
3042 Py_DECREF(ann_dict);
3043 if (err != 0) {
3044 goto error;
3045 }
3046 }
3047 }
3048 else {
3049 /* do the same if locals() is not a dict */
3050 PyObject *ann_str = _PyUnicode_FromId(&PyId___annotations__);
3051 if (ann_str == NULL) {
Serhiy Storchaka4678b2f2016-11-08 23:13:36 +02003052 goto error;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003053 }
3054 ann_dict = PyObject_GetItem(f->f_locals, ann_str);
3055 if (ann_dict == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003056 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003057 goto error;
3058 }
Victor Stinner438a12d2019-05-24 17:01:38 +02003059 _PyErr_Clear(tstate);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003060 ann_dict = PyDict_New();
3061 if (ann_dict == NULL) {
3062 goto error;
3063 }
3064 err = PyObject_SetItem(f->f_locals, ann_str, ann_dict);
3065 Py_DECREF(ann_dict);
3066 if (err != 0) {
3067 goto error;
3068 }
3069 }
3070 else {
3071 Py_DECREF(ann_dict);
3072 }
3073 }
3074 DISPATCH();
3075 }
3076
Benjamin Petersonddd19492018-09-16 22:38:02 -07003077 case TARGET(BUILD_CONST_KEY_MAP): {
Victor Stinner74319ae2016-08-25 00:04:09 +02003078 Py_ssize_t i;
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003079 PyObject *map;
3080 PyObject *keys = TOP();
3081 if (!PyTuple_CheckExact(keys) ||
3082 PyTuple_GET_SIZE(keys) != (Py_ssize_t)oparg) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003083 _PyErr_SetString(tstate, PyExc_SystemError,
3084 "bad BUILD_CONST_KEY_MAP keys argument");
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003085 goto error;
3086 }
3087 map = _PyDict_NewPresized((Py_ssize_t)oparg);
3088 if (map == NULL) {
3089 goto error;
3090 }
3091 for (i = oparg; i > 0; i--) {
3092 int err;
3093 PyObject *key = PyTuple_GET_ITEM(keys, oparg - i);
3094 PyObject *value = PEEK(i + 1);
3095 err = PyDict_SetItem(map, key, value);
3096 if (err != 0) {
3097 Py_DECREF(map);
3098 goto error;
3099 }
3100 }
3101
3102 Py_DECREF(POP());
3103 while (oparg--) {
3104 Py_DECREF(POP());
3105 }
3106 PUSH(map);
3107 DISPATCH();
3108 }
3109
Mark Shannon8a4cd702020-01-27 09:57:45 +00003110 case TARGET(DICT_UPDATE): {
3111 PyObject *update = POP();
3112 PyObject *dict = PEEK(oparg);
3113 if (PyDict_Update(dict, update) < 0) {
3114 if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) {
3115 _PyErr_Format(tstate, PyExc_TypeError,
3116 "'%.200s' object is not a mapping",
Victor Stinnera102ed72020-02-07 02:24:48 +01003117 Py_TYPE(update)->tp_name);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003118 }
Mark Shannon8a4cd702020-01-27 09:57:45 +00003119 Py_DECREF(update);
3120 goto error;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003121 }
Mark Shannon8a4cd702020-01-27 09:57:45 +00003122 Py_DECREF(update);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003123 DISPATCH();
3124 }
3125
Mark Shannon8a4cd702020-01-27 09:57:45 +00003126 case TARGET(DICT_MERGE): {
3127 PyObject *update = POP();
3128 PyObject *dict = PEEK(oparg);
3129
3130 if (_PyDict_MergeEx(dict, update, 2) < 0) {
3131 format_kwargs_error(tstate, PEEK(2 + oparg), update);
3132 Py_DECREF(update);
Serhiy Storchakae036ef82016-10-02 11:06:43 +03003133 goto error;
Serhiy Storchakae036ef82016-10-02 11:06:43 +03003134 }
Mark Shannon8a4cd702020-01-27 09:57:45 +00003135 Py_DECREF(update);
Brandt Bucherf185a732019-09-28 17:12:49 -07003136 PREDICT(CALL_FUNCTION_EX);
Serhiy Storchakae036ef82016-10-02 11:06:43 +03003137 DISPATCH();
3138 }
3139
Benjamin Petersonddd19492018-09-16 22:38:02 -07003140 case TARGET(MAP_ADD): {
Jörn Heisslerc8a35412019-06-22 16:40:55 +02003141 PyObject *value = TOP();
3142 PyObject *key = SECOND();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003143 PyObject *map;
3144 int err;
costypetrisor8ed317f2018-07-31 20:55:14 +00003145 STACK_SHRINK(2);
Raymond Hettinger41862222016-10-15 19:03:06 -07003146 map = PEEK(oparg); /* dict */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003147 assert(PyDict_CheckExact(map));
Martin Panter95f53c12016-07-18 08:23:26 +00003148 err = PyDict_SetItem(map, key, value); /* map[key] = value */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003149 Py_DECREF(value);
3150 Py_DECREF(key);
3151 if (err != 0)
3152 goto error;
3153 PREDICT(JUMP_ABSOLUTE);
3154 DISPATCH();
3155 }
3156
Benjamin Petersonddd19492018-09-16 22:38:02 -07003157 case TARGET(LOAD_ATTR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003158 PyObject *name = GETITEM(names, oparg);
3159 PyObject *owner = TOP();
Pablo Galindo109826c2020-10-20 06:22:44 +01003160
3161 PyTypeObject *type = Py_TYPE(owner);
3162 PyObject *res;
3163 PyObject **dictptr;
3164 PyObject *dict;
3165 _PyOpCodeOpt_LoadAttr *la;
3166
3167 OPCACHE_STAT_ATTR_TOTAL();
3168
3169 OPCACHE_CHECK();
3170 if (co_opcache != NULL && PyType_HasFeature(type, Py_TPFLAGS_VALID_VERSION_TAG))
3171 {
3172 if (co_opcache->optimized > 0) {
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003173 // Fast path -- cache hit makes LOAD_ATTR ~30% faster.
Pablo Galindo109826c2020-10-20 06:22:44 +01003174 la = &co_opcache->u.la;
3175 if (la->type == type && la->tp_version_tag == type->tp_version_tag)
3176 {
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003177 // Hint >= 0 is a dict index; hint == -1 is a dict miss.
3178 // Hint < -1 is an inverted slot offset: offset is strictly > 0,
3179 // so ~offset is strictly < -1 (assuming 2's complement).
3180 if (la->hint < -1) {
3181 // Even faster path -- slot hint.
3182 Py_ssize_t offset = ~la->hint;
3183 // fprintf(stderr, "Using hint for offset %zd\n", offset);
3184 char *addr = (char *)owner + offset;
3185 res = *(PyObject **)addr;
Pablo Galindo109826c2020-10-20 06:22:44 +01003186 if (res != NULL) {
Pablo Galindo109826c2020-10-20 06:22:44 +01003187 Py_INCREF(res);
3188 SET_TOP(res);
3189 Py_DECREF(owner);
Pablo Galindo109826c2020-10-20 06:22:44 +01003190 DISPATCH();
Pablo Galindo109826c2020-10-20 06:22:44 +01003191 }
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003192 // Else slot is NULL. Fall through to slow path to raise AttributeError(name).
3193 // Don't DEOPT, since the slot is still there.
Pablo Galindo109826c2020-10-20 06:22:44 +01003194 } else {
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003195 // Fast path for dict.
3196 assert(type->tp_dict != NULL);
3197 assert(type->tp_dictoffset > 0);
3198
3199 dictptr = (PyObject **) ((char *)owner + type->tp_dictoffset);
3200 dict = *dictptr;
3201 if (dict != NULL && PyDict_CheckExact(dict)) {
3202 Py_ssize_t hint = la->hint;
3203 Py_INCREF(dict);
3204 res = NULL;
3205 la->hint = _PyDict_GetItemHint((PyDictObject*)dict, name, hint, &res);
3206
3207 if (res != NULL) {
3208 if (la->hint == hint && hint >= 0) {
3209 // Our hint has helped -- cache hit.
3210 OPCACHE_STAT_ATTR_HIT();
3211 } else {
3212 // The hint we provided didn't work.
3213 // Maybe next time?
3214 OPCACHE_MAYBE_DEOPT_LOAD_ATTR();
3215 }
3216
3217 Py_INCREF(res);
3218 SET_TOP(res);
3219 Py_DECREF(owner);
3220 Py_DECREF(dict);
3221 DISPATCH();
3222 } else {
3223 // This attribute can be missing sometimes;
3224 // we don't want to optimize this lookup.
3225 OPCACHE_DEOPT_LOAD_ATTR();
3226 Py_DECREF(dict);
3227 }
3228 } else {
3229 // There is no dict, or __dict__ doesn't satisfy PyDict_CheckExact.
3230 OPCACHE_DEOPT_LOAD_ATTR();
3231 }
Pablo Galindo109826c2020-10-20 06:22:44 +01003232 }
3233 } else {
3234 // The type of the object has either been updated,
3235 // or is different. Maybe it will stabilize?
3236 OPCACHE_MAYBE_DEOPT_LOAD_ATTR();
3237 }
Pablo Galindo109826c2020-10-20 06:22:44 +01003238 OPCACHE_STAT_ATTR_MISS();
3239 }
3240
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003241 if (co_opcache != NULL && // co_opcache can be NULL after a DEOPT() call.
Pablo Galindo109826c2020-10-20 06:22:44 +01003242 type->tp_getattro == PyObject_GenericGetAttr)
3243 {
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003244 if (type->tp_dict == NULL) {
3245 if (PyType_Ready(type) < 0) {
3246 Py_DECREF(owner);
3247 SET_TOP(NULL);
3248 goto error;
Pablo Galindo109826c2020-10-20 06:22:44 +01003249 }
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003250 }
3251 PyObject *descr = _PyType_Lookup(type, name);
3252 if (descr != NULL) {
3253 // We found an attribute with a data-like descriptor.
3254 PyTypeObject *dtype = Py_TYPE(descr);
3255 if (dtype == &PyMemberDescr_Type) { // It's a slot
3256 PyMemberDescrObject *member = (PyMemberDescrObject *)descr;
3257 struct PyMemberDef *dmem = member->d_member;
3258 if (dmem->type == T_OBJECT_EX) {
3259 Py_ssize_t offset = dmem->offset;
3260 assert(offset > 0); // 0 would be confused with dict hint == -1 (miss).
Pablo Galindo109826c2020-10-20 06:22:44 +01003261
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003262 if (co_opcache->optimized == 0) {
3263 // First time we optimize this opcode.
3264 OPCACHE_STAT_ATTR_OPT();
3265 co_opcache->optimized = OPCODE_CACHE_MAX_TRIES;
3266 // fprintf(stderr, "Setting hint for %s, offset %zd\n", dmem->name, offset);
3267 }
3268
3269 la = &co_opcache->u.la;
3270 la->type = type;
3271 la->tp_version_tag = type->tp_version_tag;
3272 la->hint = ~offset;
3273
3274 char *addr = (char *)owner + offset;
3275 res = *(PyObject **)addr;
Pablo Galindo109826c2020-10-20 06:22:44 +01003276 if (res != NULL) {
3277 Py_INCREF(res);
Pablo Galindo109826c2020-10-20 06:22:44 +01003278 Py_DECREF(owner);
3279 SET_TOP(res);
3280
Pablo Galindo109826c2020-10-20 06:22:44 +01003281 DISPATCH();
3282 }
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003283 // Else slot is NULL. Fall through to slow path to raise AttributeError(name).
Pablo Galindo109826c2020-10-20 06:22:44 +01003284 }
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003285 // Else it's a slot of a different type. We don't handle those.
3286 }
3287 // Else it's some other kind of descriptor that we don't handle.
3288 OPCACHE_DEOPT_LOAD_ATTR();
3289 } else if (type->tp_dictoffset > 0) {
3290 // We found an instance with a __dict__.
3291 dictptr = (PyObject **) ((char *)owner + type->tp_dictoffset);
3292 dict = *dictptr;
3293
3294 if (dict != NULL && PyDict_CheckExact(dict)) {
3295 Py_INCREF(dict);
3296 res = NULL;
3297 Py_ssize_t hint = _PyDict_GetItemHint((PyDictObject*)dict, name, -1, &res);
3298 if (res != NULL) {
3299 Py_INCREF(res);
3300 Py_DECREF(dict);
3301 Py_DECREF(owner);
3302 SET_TOP(res);
3303
3304 if (co_opcache->optimized == 0) {
3305 // First time we optimize this opcode.
3306 OPCACHE_STAT_ATTR_OPT();
3307 co_opcache->optimized = OPCODE_CACHE_MAX_TRIES;
3308 }
3309
3310 la = &co_opcache->u.la;
3311 la->type = type;
3312 la->tp_version_tag = type->tp_version_tag;
3313 la->hint = hint;
3314
3315 DISPATCH();
3316 }
3317 Py_DECREF(dict);
Pablo Galindo109826c2020-10-20 06:22:44 +01003318 } else {
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003319 // There is no dict, or __dict__ doesn't satisfy PyDict_CheckExact.
Pablo Galindo109826c2020-10-20 06:22:44 +01003320 OPCACHE_DEOPT_LOAD_ATTR();
3321 }
3322 } else {
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003323 // The object's class does not have a tp_dictoffset we can use.
Pablo Galindo109826c2020-10-20 06:22:44 +01003324 OPCACHE_DEOPT_LOAD_ATTR();
3325 }
3326 } else if (type->tp_getattro != PyObject_GenericGetAttr) {
3327 OPCACHE_DEOPT_LOAD_ATTR();
3328 }
3329 }
3330
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003331 // Slow path.
Pablo Galindo109826c2020-10-20 06:22:44 +01003332 res = PyObject_GetAttr(owner, name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003333 Py_DECREF(owner);
3334 SET_TOP(res);
3335 if (res == NULL)
3336 goto error;
3337 DISPATCH();
3338 }
3339
Benjamin Petersonddd19492018-09-16 22:38:02 -07003340 case TARGET(COMPARE_OP): {
Mark Shannon9af0e472020-01-14 10:12:45 +00003341 assert(oparg <= Py_GE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003342 PyObject *right = POP();
3343 PyObject *left = TOP();
Mark Shannon9af0e472020-01-14 10:12:45 +00003344 PyObject *res = PyObject_RichCompare(left, right, oparg);
3345 SET_TOP(res);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003346 Py_DECREF(left);
3347 Py_DECREF(right);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003348 if (res == NULL)
3349 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003350 PREDICT(POP_JUMP_IF_FALSE);
3351 PREDICT(POP_JUMP_IF_TRUE);
3352 DISPATCH();
Victor Stinner3c1e4812012-03-26 22:10:51 +02003353 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003354
Mark Shannon9af0e472020-01-14 10:12:45 +00003355 case TARGET(IS_OP): {
3356 PyObject *right = POP();
3357 PyObject *left = TOP();
3358 int res = (left == right)^oparg;
3359 PyObject *b = res ? Py_True : Py_False;
3360 Py_INCREF(b);
3361 SET_TOP(b);
3362 Py_DECREF(left);
3363 Py_DECREF(right);
3364 PREDICT(POP_JUMP_IF_FALSE);
3365 PREDICT(POP_JUMP_IF_TRUE);
3366 FAST_DISPATCH();
3367 }
3368
3369 case TARGET(CONTAINS_OP): {
3370 PyObject *right = POP();
3371 PyObject *left = POP();
3372 int res = PySequence_Contains(right, left);
3373 Py_DECREF(left);
3374 Py_DECREF(right);
3375 if (res < 0) {
3376 goto error;
3377 }
3378 PyObject *b = (res^oparg) ? Py_True : Py_False;
3379 Py_INCREF(b);
3380 PUSH(b);
3381 PREDICT(POP_JUMP_IF_FALSE);
3382 PREDICT(POP_JUMP_IF_TRUE);
3383 FAST_DISPATCH();
3384 }
3385
3386#define CANNOT_CATCH_MSG "catching classes that do not inherit from "\
3387 "BaseException is not allowed"
3388
3389 case TARGET(JUMP_IF_NOT_EXC_MATCH): {
3390 PyObject *right = POP();
3391 PyObject *left = POP();
3392 if (PyTuple_Check(right)) {
3393 Py_ssize_t i, length;
3394 length = PyTuple_GET_SIZE(right);
3395 for (i = 0; i < length; i++) {
3396 PyObject *exc = PyTuple_GET_ITEM(right, i);
3397 if (!PyExceptionClass_Check(exc)) {
3398 _PyErr_SetString(tstate, PyExc_TypeError,
3399 CANNOT_CATCH_MSG);
3400 Py_DECREF(left);
3401 Py_DECREF(right);
3402 goto error;
3403 }
3404 }
3405 }
3406 else {
3407 if (!PyExceptionClass_Check(right)) {
3408 _PyErr_SetString(tstate, PyExc_TypeError,
3409 CANNOT_CATCH_MSG);
3410 Py_DECREF(left);
3411 Py_DECREF(right);
3412 goto error;
3413 }
3414 }
3415 int res = PyErr_GivenExceptionMatches(left, right);
3416 Py_DECREF(left);
3417 Py_DECREF(right);
3418 if (res > 0) {
3419 /* Exception matches -- Do nothing */;
3420 }
3421 else if (res == 0) {
3422 JUMPTO(oparg);
3423 }
3424 else {
3425 goto error;
3426 }
3427 DISPATCH();
3428 }
3429
Benjamin Petersonddd19492018-09-16 22:38:02 -07003430 case TARGET(IMPORT_NAME): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003431 PyObject *name = GETITEM(names, oparg);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03003432 PyObject *fromlist = POP();
3433 PyObject *level = TOP();
3434 PyObject *res;
Victor Stinner438a12d2019-05-24 17:01:38 +02003435 res = import_name(tstate, f, name, fromlist, level);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03003436 Py_DECREF(level);
3437 Py_DECREF(fromlist);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003438 SET_TOP(res);
3439 if (res == NULL)
3440 goto error;
3441 DISPATCH();
3442 }
3443
Benjamin Petersonddd19492018-09-16 22:38:02 -07003444 case TARGET(IMPORT_STAR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003445 PyObject *from = POP(), *locals;
3446 int err;
Matthias Bussonnier160edb42017-02-25 21:58:05 -08003447 if (PyFrame_FastToLocalsWithError(f) < 0) {
3448 Py_DECREF(from);
Victor Stinner41bb43a2013-10-29 01:19:37 +01003449 goto error;
Matthias Bussonnier160edb42017-02-25 21:58:05 -08003450 }
Victor Stinner41bb43a2013-10-29 01:19:37 +01003451
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003452 locals = f->f_locals;
3453 if (locals == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003454 _PyErr_SetString(tstate, PyExc_SystemError,
3455 "no locals found during 'import *'");
Matthias Bussonnier160edb42017-02-25 21:58:05 -08003456 Py_DECREF(from);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003457 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003458 }
Victor Stinner438a12d2019-05-24 17:01:38 +02003459 err = import_all_from(tstate, locals, from);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003460 PyFrame_LocalsToFast(f, 0);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003461 Py_DECREF(from);
3462 if (err != 0)
3463 goto error;
3464 DISPATCH();
3465 }
Guido van Rossum25831651993-05-19 14:50:45 +00003466
Benjamin Petersonddd19492018-09-16 22:38:02 -07003467 case TARGET(IMPORT_FROM): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003468 PyObject *name = GETITEM(names, oparg);
3469 PyObject *from = TOP();
3470 PyObject *res;
Victor Stinner438a12d2019-05-24 17:01:38 +02003471 res = import_from(tstate, from, name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003472 PUSH(res);
3473 if (res == NULL)
3474 goto error;
3475 DISPATCH();
3476 }
Thomas Wouters52152252000-08-17 22:55:00 +00003477
Benjamin Petersonddd19492018-09-16 22:38:02 -07003478 case TARGET(JUMP_FORWARD): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003479 JUMPBY(oparg);
3480 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003481 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003482
Benjamin Petersonddd19492018-09-16 22:38:02 -07003483 case TARGET(POP_JUMP_IF_FALSE): {
3484 PREDICTED(POP_JUMP_IF_FALSE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003485 PyObject *cond = POP();
3486 int err;
3487 if (cond == Py_True) {
3488 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003489 FAST_DISPATCH();
3490 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003491 if (cond == Py_False) {
3492 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003493 JUMPTO(oparg);
3494 FAST_DISPATCH();
3495 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003496 err = PyObject_IsTrue(cond);
3497 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003498 if (err > 0)
Adrian Wielgosik50c28502017-06-23 13:35:41 -07003499 ;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003500 else if (err == 0)
3501 JUMPTO(oparg);
3502 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003503 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003504 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003505 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003506
Benjamin Petersonddd19492018-09-16 22:38:02 -07003507 case TARGET(POP_JUMP_IF_TRUE): {
3508 PREDICTED(POP_JUMP_IF_TRUE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003509 PyObject *cond = POP();
3510 int err;
3511 if (cond == Py_False) {
3512 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003513 FAST_DISPATCH();
3514 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003515 if (cond == Py_True) {
3516 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003517 JUMPTO(oparg);
3518 FAST_DISPATCH();
3519 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003520 err = PyObject_IsTrue(cond);
3521 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003522 if (err > 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003523 JUMPTO(oparg);
3524 }
3525 else if (err == 0)
3526 ;
3527 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003528 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003529 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003530 }
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00003531
Benjamin Petersonddd19492018-09-16 22:38:02 -07003532 case TARGET(JUMP_IF_FALSE_OR_POP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003533 PyObject *cond = TOP();
3534 int err;
3535 if (cond == Py_True) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003536 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003537 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003538 FAST_DISPATCH();
3539 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003540 if (cond == Py_False) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003541 JUMPTO(oparg);
3542 FAST_DISPATCH();
3543 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003544 err = PyObject_IsTrue(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003545 if (err > 0) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003546 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003547 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003548 }
3549 else if (err == 0)
3550 JUMPTO(oparg);
3551 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003552 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003553 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003554 }
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00003555
Benjamin Petersonddd19492018-09-16 22:38:02 -07003556 case TARGET(JUMP_IF_TRUE_OR_POP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003557 PyObject *cond = TOP();
3558 int err;
3559 if (cond == Py_False) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003560 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003561 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003562 FAST_DISPATCH();
3563 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003564 if (cond == Py_True) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003565 JUMPTO(oparg);
3566 FAST_DISPATCH();
3567 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003568 err = PyObject_IsTrue(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003569 if (err > 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003570 JUMPTO(oparg);
3571 }
3572 else if (err == 0) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003573 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003574 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003575 }
3576 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003577 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003578 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003579 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003580
Benjamin Petersonddd19492018-09-16 22:38:02 -07003581 case TARGET(JUMP_ABSOLUTE): {
3582 PREDICTED(JUMP_ABSOLUTE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003583 JUMPTO(oparg);
Guido van Rossum58da9312007-11-10 23:39:45 +00003584#if FAST_LOOPS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003585 /* Enabling this path speeds-up all while and for-loops by bypassing
3586 the per-loop checks for signals. By default, this should be turned-off
3587 because it prevents detection of a control-break in tight loops like
3588 "while 1: pass". Compile with this option turned-on when you need
3589 the speed-up and do not need break checking inside tight loops (ones
3590 that contain only instructions ending with FAST_DISPATCH).
3591 */
3592 FAST_DISPATCH();
Guido van Rossum58da9312007-11-10 23:39:45 +00003593#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003594 DISPATCH();
Guido van Rossum58da9312007-11-10 23:39:45 +00003595#endif
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003596 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003597
Benjamin Petersonddd19492018-09-16 22:38:02 -07003598 case TARGET(GET_ITER): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003599 /* before: [obj]; after [getiter(obj)] */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003600 PyObject *iterable = TOP();
Yury Selivanov5376ba92015-06-22 12:19:30 -04003601 PyObject *iter = PyObject_GetIter(iterable);
3602 Py_DECREF(iterable);
3603 SET_TOP(iter);
3604 if (iter == NULL)
3605 goto error;
3606 PREDICT(FOR_ITER);
Serhiy Storchakada9c5132016-06-27 18:58:57 +03003607 PREDICT(CALL_FUNCTION);
Yury Selivanov5376ba92015-06-22 12:19:30 -04003608 DISPATCH();
3609 }
3610
Benjamin Petersonddd19492018-09-16 22:38:02 -07003611 case TARGET(GET_YIELD_FROM_ITER): {
Yury Selivanov5376ba92015-06-22 12:19:30 -04003612 /* before: [obj]; after [getiter(obj)] */
3613 PyObject *iterable = TOP();
Yury Selivanov75445082015-05-11 22:57:16 -04003614 PyObject *iter;
Yury Selivanov5376ba92015-06-22 12:19:30 -04003615 if (PyCoro_CheckExact(iterable)) {
3616 /* `iterable` is a coroutine */
3617 if (!(co->co_flags & (CO_COROUTINE | CO_ITERABLE_COROUTINE))) {
3618 /* and it is used in a 'yield from' expression of a
3619 regular generator. */
3620 Py_DECREF(iterable);
3621 SET_TOP(NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02003622 _PyErr_SetString(tstate, PyExc_TypeError,
3623 "cannot 'yield from' a coroutine object "
3624 "in a non-coroutine generator");
Yury Selivanov5376ba92015-06-22 12:19:30 -04003625 goto error;
3626 }
3627 }
3628 else if (!PyGen_CheckExact(iterable)) {
Yury Selivanov75445082015-05-11 22:57:16 -04003629 /* `iterable` is not a generator. */
3630 iter = PyObject_GetIter(iterable);
3631 Py_DECREF(iterable);
3632 SET_TOP(iter);
3633 if (iter == NULL)
3634 goto error;
3635 }
Serhiy Storchakada9c5132016-06-27 18:58:57 +03003636 PREDICT(LOAD_CONST);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003637 DISPATCH();
3638 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003639
Benjamin Petersonddd19492018-09-16 22:38:02 -07003640 case TARGET(FOR_ITER): {
3641 PREDICTED(FOR_ITER);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003642 /* before: [iter]; after: [iter, iter()] *or* [] */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003643 PyObject *iter = TOP();
Victor Stinnera102ed72020-02-07 02:24:48 +01003644 PyObject *next = (*Py_TYPE(iter)->tp_iternext)(iter);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003645 if (next != NULL) {
3646 PUSH(next);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003647 PREDICT(STORE_FAST);
3648 PREDICT(UNPACK_SEQUENCE);
3649 DISPATCH();
3650 }
Victor Stinner438a12d2019-05-24 17:01:38 +02003651 if (_PyErr_Occurred(tstate)) {
3652 if (!_PyErr_ExceptionMatches(tstate, PyExc_StopIteration)) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003653 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02003654 }
3655 else if (tstate->c_tracefunc != NULL) {
Mark Shannon86433452021-01-07 16:49:02 +00003656 call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj, tstate, f, &bounds);
Victor Stinner438a12d2019-05-24 17:01:38 +02003657 }
3658 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003659 }
3660 /* iterator ended normally */
costypetrisor8ed317f2018-07-31 20:55:14 +00003661 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003662 Py_DECREF(iter);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003663 JUMPBY(oparg);
3664 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003665 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003666
Benjamin Petersonddd19492018-09-16 22:38:02 -07003667 case TARGET(SETUP_FINALLY): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003668 PyFrame_BlockSetup(f, SETUP_FINALLY, INSTR_OFFSET() + oparg,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003669 STACK_LEVEL());
3670 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003671 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003672
Benjamin Petersonddd19492018-09-16 22:38:02 -07003673 case TARGET(BEFORE_ASYNC_WITH): {
Yury Selivanov75445082015-05-11 22:57:16 -04003674 _Py_IDENTIFIER(__aenter__);
Géry Ogam1d1b97a2020-01-14 12:58:29 +01003675 _Py_IDENTIFIER(__aexit__);
Yury Selivanov75445082015-05-11 22:57:16 -04003676 PyObject *mgr = TOP();
Géry Ogam1d1b97a2020-01-14 12:58:29 +01003677 PyObject *enter = special_lookup(tstate, mgr, &PyId___aenter__);
Yury Selivanov75445082015-05-11 22:57:16 -04003678 PyObject *res;
Géry Ogam1d1b97a2020-01-14 12:58:29 +01003679 if (enter == NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04003680 goto error;
Géry Ogam1d1b97a2020-01-14 12:58:29 +01003681 }
3682 PyObject *exit = special_lookup(tstate, mgr, &PyId___aexit__);
3683 if (exit == NULL) {
3684 Py_DECREF(enter);
3685 goto error;
3686 }
Yury Selivanov75445082015-05-11 22:57:16 -04003687 SET_TOP(exit);
Yury Selivanov75445082015-05-11 22:57:16 -04003688 Py_DECREF(mgr);
Victor Stinnerf17c3de2016-12-06 18:46:19 +01003689 res = _PyObject_CallNoArg(enter);
Yury Selivanov75445082015-05-11 22:57:16 -04003690 Py_DECREF(enter);
3691 if (res == NULL)
3692 goto error;
3693 PUSH(res);
Serhiy Storchakada9c5132016-06-27 18:58:57 +03003694 PREDICT(GET_AWAITABLE);
Yury Selivanov75445082015-05-11 22:57:16 -04003695 DISPATCH();
3696 }
3697
Benjamin Petersonddd19492018-09-16 22:38:02 -07003698 case TARGET(SETUP_ASYNC_WITH): {
Yury Selivanov75445082015-05-11 22:57:16 -04003699 PyObject *res = POP();
3700 /* Setup the finally block before pushing the result
3701 of __aenter__ on the stack. */
3702 PyFrame_BlockSetup(f, SETUP_FINALLY, INSTR_OFFSET() + oparg,
3703 STACK_LEVEL());
3704 PUSH(res);
3705 DISPATCH();
3706 }
3707
Benjamin Petersonddd19492018-09-16 22:38:02 -07003708 case TARGET(SETUP_WITH): {
Benjamin Petersonce798522012-01-22 11:24:29 -05003709 _Py_IDENTIFIER(__enter__);
Géry Ogam1d1b97a2020-01-14 12:58:29 +01003710 _Py_IDENTIFIER(__exit__);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003711 PyObject *mgr = TOP();
Victor Stinner438a12d2019-05-24 17:01:38 +02003712 PyObject *enter = special_lookup(tstate, mgr, &PyId___enter__);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003713 PyObject *res;
Victor Stinner438a12d2019-05-24 17:01:38 +02003714 if (enter == NULL) {
Raymond Hettingera3fec152016-11-21 17:24:23 -08003715 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02003716 }
3717 PyObject *exit = special_lookup(tstate, mgr, &PyId___exit__);
Raymond Hettinger64e2f9a2016-11-22 11:50:40 -08003718 if (exit == NULL) {
3719 Py_DECREF(enter);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003720 goto error;
Raymond Hettinger64e2f9a2016-11-22 11:50:40 -08003721 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003722 SET_TOP(exit);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003723 Py_DECREF(mgr);
Victor Stinnerf17c3de2016-12-06 18:46:19 +01003724 res = _PyObject_CallNoArg(enter);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003725 Py_DECREF(enter);
3726 if (res == NULL)
3727 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003728 /* Setup the finally block before pushing the result
3729 of __enter__ on the stack. */
3730 PyFrame_BlockSetup(f, SETUP_FINALLY, INSTR_OFFSET() + oparg,
3731 STACK_LEVEL());
Benjamin Peterson876b2f22009-06-28 03:18:59 +00003732
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003733 PUSH(res);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003734 DISPATCH();
3735 }
Benjamin Peterson876b2f22009-06-28 03:18:59 +00003736
Mark Shannonfee55262019-11-21 09:11:43 +00003737 case TARGET(WITH_EXCEPT_START): {
3738 /* At the top of the stack are 7 values:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003739 - (TOP, SECOND, THIRD) = exc_info()
Mark Shannonfee55262019-11-21 09:11:43 +00003740 - (FOURTH, FIFTH, SIXTH) = previous exception for EXCEPT_HANDLER
3741 - SEVENTH: the context.__exit__ bound method
3742 We call SEVENTH(TOP, SECOND, THIRD).
3743 Then we push again the TOP exception and the __exit__
3744 return value.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003745 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003746 PyObject *exit_func;
Victor Stinner842cfff2016-12-01 14:45:31 +01003747 PyObject *exc, *val, *tb, *res;
3748
Victor Stinner842cfff2016-12-01 14:45:31 +01003749 exc = TOP();
Mark Shannonfee55262019-11-21 09:11:43 +00003750 val = SECOND();
3751 tb = THIRD();
3752 assert(exc != Py_None);
3753 assert(!PyLong_Check(exc));
3754 exit_func = PEEK(7);
Jeroen Demeyer469d1a72019-07-03 12:52:21 +02003755 PyObject *stack[4] = {NULL, exc, val, tb};
Petr Viktorinffd97532020-02-11 17:46:57 +01003756 res = PyObject_Vectorcall(exit_func, stack + 1,
Jeroen Demeyer469d1a72019-07-03 12:52:21 +02003757 3 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003758 if (res == NULL)
3759 goto error;
Amaury Forgeot d'Arc10b24e82008-12-10 23:49:33 +00003760
Yury Selivanov75445082015-05-11 22:57:16 -04003761 PUSH(res);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003762 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003763 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00003764
Benjamin Petersonddd19492018-09-16 22:38:02 -07003765 case TARGET(LOAD_METHOD): {
Andreyb021ba52019-04-29 14:33:26 +10003766 /* Designed to work in tandem with CALL_METHOD. */
Yury Selivanovf2392132016-12-13 19:03:51 -05003767 PyObject *name = GETITEM(names, oparg);
3768 PyObject *obj = TOP();
3769 PyObject *meth = NULL;
3770
3771 int meth_found = _PyObject_GetMethod(obj, name, &meth);
3772
Yury Selivanovf2392132016-12-13 19:03:51 -05003773 if (meth == NULL) {
3774 /* Most likely attribute wasn't found. */
Yury Selivanovf2392132016-12-13 19:03:51 -05003775 goto error;
3776 }
3777
3778 if (meth_found) {
INADA Naoki015bce62017-01-16 17:23:30 +09003779 /* We can bypass temporary bound method object.
3780 meth is unbound method and obj is self.
Victor Stinnera8cb5152017-01-18 14:12:51 +01003781
INADA Naoki015bce62017-01-16 17:23:30 +09003782 meth | self | arg1 | ... | argN
3783 */
3784 SET_TOP(meth);
3785 PUSH(obj); // self
Yury Selivanovf2392132016-12-13 19:03:51 -05003786 }
3787 else {
INADA Naoki015bce62017-01-16 17:23:30 +09003788 /* meth is not an unbound method (but a regular attr, or
3789 something was returned by a descriptor protocol). Set
3790 the second element of the stack to NULL, to signal
Yury Selivanovf2392132016-12-13 19:03:51 -05003791 CALL_METHOD that it's not a method call.
INADA Naoki015bce62017-01-16 17:23:30 +09003792
3793 NULL | meth | arg1 | ... | argN
Yury Selivanovf2392132016-12-13 19:03:51 -05003794 */
INADA Naoki015bce62017-01-16 17:23:30 +09003795 SET_TOP(NULL);
Yury Selivanovf2392132016-12-13 19:03:51 -05003796 Py_DECREF(obj);
INADA Naoki015bce62017-01-16 17:23:30 +09003797 PUSH(meth);
Yury Selivanovf2392132016-12-13 19:03:51 -05003798 }
3799 DISPATCH();
3800 }
3801
Benjamin Petersonddd19492018-09-16 22:38:02 -07003802 case TARGET(CALL_METHOD): {
Yury Selivanovf2392132016-12-13 19:03:51 -05003803 /* Designed to work in tamdem with LOAD_METHOD. */
INADA Naoki015bce62017-01-16 17:23:30 +09003804 PyObject **sp, *res, *meth;
Yury Selivanovf2392132016-12-13 19:03:51 -05003805
3806 sp = stack_pointer;
3807
INADA Naoki015bce62017-01-16 17:23:30 +09003808 meth = PEEK(oparg + 2);
3809 if (meth == NULL) {
3810 /* `meth` is NULL when LOAD_METHOD thinks that it's not
3811 a method call.
Yury Selivanovf2392132016-12-13 19:03:51 -05003812
3813 Stack layout:
3814
INADA Naoki015bce62017-01-16 17:23:30 +09003815 ... | NULL | callable | arg1 | ... | argN
3816 ^- TOP()
3817 ^- (-oparg)
3818 ^- (-oparg-1)
3819 ^- (-oparg-2)
Yury Selivanovf2392132016-12-13 19:03:51 -05003820
Ville Skyttä49b27342017-08-03 09:00:59 +03003821 `callable` will be POPed by call_function.
INADA Naoki015bce62017-01-16 17:23:30 +09003822 NULL will will be POPed manually later.
Yury Selivanovf2392132016-12-13 19:03:51 -05003823 */
Mark Shannon86433452021-01-07 16:49:02 +00003824 res = call_function(tstate, &bounds, &sp, oparg, NULL);
Yury Selivanovf2392132016-12-13 19:03:51 -05003825 stack_pointer = sp;
INADA Naoki015bce62017-01-16 17:23:30 +09003826 (void)POP(); /* POP the NULL. */
Yury Selivanovf2392132016-12-13 19:03:51 -05003827 }
3828 else {
3829 /* This is a method call. Stack layout:
3830
INADA Naoki015bce62017-01-16 17:23:30 +09003831 ... | method | self | arg1 | ... | argN
Yury Selivanovf2392132016-12-13 19:03:51 -05003832 ^- TOP()
3833 ^- (-oparg)
INADA Naoki015bce62017-01-16 17:23:30 +09003834 ^- (-oparg-1)
3835 ^- (-oparg-2)
Yury Selivanovf2392132016-12-13 19:03:51 -05003836
INADA Naoki015bce62017-01-16 17:23:30 +09003837 `self` and `method` will be POPed by call_function.
Yury Selivanovf2392132016-12-13 19:03:51 -05003838 We'll be passing `oparg + 1` to call_function, to
INADA Naoki015bce62017-01-16 17:23:30 +09003839 make it accept the `self` as a first argument.
Yury Selivanovf2392132016-12-13 19:03:51 -05003840 */
Mark Shannon86433452021-01-07 16:49:02 +00003841 res = call_function(tstate, &bounds, &sp, oparg + 1, NULL);
Yury Selivanovf2392132016-12-13 19:03:51 -05003842 stack_pointer = sp;
3843 }
3844
3845 PUSH(res);
3846 if (res == NULL)
3847 goto error;
3848 DISPATCH();
3849 }
3850
Benjamin Petersonddd19492018-09-16 22:38:02 -07003851 case TARGET(CALL_FUNCTION): {
3852 PREDICTED(CALL_FUNCTION);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003853 PyObject **sp, *res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003854 sp = stack_pointer;
Mark Shannon86433452021-01-07 16:49:02 +00003855 res = call_function(tstate, &bounds, &sp, oparg, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003856 stack_pointer = sp;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003857 PUSH(res);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003858 if (res == NULL) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003859 goto error;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003860 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003861 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003862 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003863
Benjamin Petersonddd19492018-09-16 22:38:02 -07003864 case TARGET(CALL_FUNCTION_KW): {
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003865 PyObject **sp, *res, *names;
3866
3867 names = POP();
Jeroen Demeyer05677862019-08-16 12:41:27 +02003868 assert(PyTuple_Check(names));
3869 assert(PyTuple_GET_SIZE(names) <= oparg);
3870 /* We assume without checking that names contains only strings */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003871 sp = stack_pointer;
Mark Shannon86433452021-01-07 16:49:02 +00003872 res = call_function(tstate, &bounds, &sp, oparg, names);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003873 stack_pointer = sp;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003874 PUSH(res);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003875 Py_DECREF(names);
3876
3877 if (res == NULL) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003878 goto error;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003879 }
3880 DISPATCH();
3881 }
3882
Benjamin Petersonddd19492018-09-16 22:38:02 -07003883 case TARGET(CALL_FUNCTION_EX): {
Brandt Bucherf185a732019-09-28 17:12:49 -07003884 PREDICTED(CALL_FUNCTION_EX);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003885 PyObject *func, *callargs, *kwargs = NULL, *result;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003886 if (oparg & 0x01) {
3887 kwargs = POP();
Serhiy Storchakab7281052016-09-12 00:52:40 +03003888 if (!PyDict_CheckExact(kwargs)) {
3889 PyObject *d = PyDict_New();
3890 if (d == NULL)
3891 goto error;
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02003892 if (_PyDict_MergeEx(d, kwargs, 2) < 0) {
Serhiy Storchakab7281052016-09-12 00:52:40 +03003893 Py_DECREF(d);
Victor Stinner438a12d2019-05-24 17:01:38 +02003894 format_kwargs_error(tstate, SECOND(), kwargs);
Victor Stinnereece2222016-09-12 11:16:37 +02003895 Py_DECREF(kwargs);
Serhiy Storchakab7281052016-09-12 00:52:40 +03003896 goto error;
3897 }
3898 Py_DECREF(kwargs);
3899 kwargs = d;
3900 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003901 assert(PyDict_CheckExact(kwargs));
3902 }
3903 callargs = POP();
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003904 func = TOP();
Serhiy Storchaka63dc5482016-09-22 19:41:20 +03003905 if (!PyTuple_CheckExact(callargs)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003906 if (check_args_iterable(tstate, func, callargs) < 0) {
Victor Stinnereece2222016-09-12 11:16:37 +02003907 Py_DECREF(callargs);
Serhiy Storchakab7281052016-09-12 00:52:40 +03003908 goto error;
3909 }
3910 Py_SETREF(callargs, PySequence_Tuple(callargs));
3911 if (callargs == NULL) {
3912 goto error;
3913 }
3914 }
Serhiy Storchaka63dc5482016-09-22 19:41:20 +03003915 assert(PyTuple_CheckExact(callargs));
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003916
Mark Shannon86433452021-01-07 16:49:02 +00003917 result = do_call_core(tstate, &bounds, func, callargs, kwargs);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003918 Py_DECREF(func);
3919 Py_DECREF(callargs);
3920 Py_XDECREF(kwargs);
3921
3922 SET_TOP(result);
3923 if (result == NULL) {
3924 goto error;
3925 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003926 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003927 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003928
Benjamin Petersonddd19492018-09-16 22:38:02 -07003929 case TARGET(MAKE_FUNCTION): {
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003930 PyObject *qualname = POP();
3931 PyObject *codeobj = POP();
3932 PyFunctionObject *func = (PyFunctionObject *)
3933 PyFunction_NewWithQualName(codeobj, f->f_globals, qualname);
Guido van Rossum4f72a782006-10-27 23:31:49 +00003934
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003935 Py_DECREF(codeobj);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003936 Py_DECREF(qualname);
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003937 if (func == NULL) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003938 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003939 }
Neal Norwitzc1505362006-12-28 06:47:50 +00003940
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003941 if (oparg & 0x08) {
3942 assert(PyTuple_CheckExact(TOP()));
Mark Shannond6c33fb2021-01-29 13:24:55 +00003943 func->func_closure = POP();
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003944 }
3945 if (oparg & 0x04) {
Yurii Karabas73019792020-11-25 12:43:18 +02003946 assert(PyTuple_CheckExact(TOP()));
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003947 func->func_annotations = POP();
3948 }
3949 if (oparg & 0x02) {
3950 assert(PyDict_CheckExact(TOP()));
3951 func->func_kwdefaults = POP();
3952 }
3953 if (oparg & 0x01) {
3954 assert(PyTuple_CheckExact(TOP()));
3955 func->func_defaults = POP();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003956 }
Neal Norwitzc1505362006-12-28 06:47:50 +00003957
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003958 PUSH((PyObject *)func);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003959 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003960 }
Guido van Rossum8861b741996-07-30 16:49:37 +00003961
Benjamin Petersonddd19492018-09-16 22:38:02 -07003962 case TARGET(BUILD_SLICE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003963 PyObject *start, *stop, *step, *slice;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003964 if (oparg == 3)
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003965 step = POP();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003966 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003967 step = NULL;
3968 stop = POP();
3969 start = TOP();
3970 slice = PySlice_New(start, stop, step);
3971 Py_DECREF(start);
3972 Py_DECREF(stop);
3973 Py_XDECREF(step);
3974 SET_TOP(slice);
3975 if (slice == NULL)
3976 goto error;
3977 DISPATCH();
3978 }
Guido van Rossum8861b741996-07-30 16:49:37 +00003979
Benjamin Petersonddd19492018-09-16 22:38:02 -07003980 case TARGET(FORMAT_VALUE): {
Eric V. Smitha78c7952015-11-03 12:45:05 -05003981 /* Handles f-string value formatting. */
3982 PyObject *result;
3983 PyObject *fmt_spec;
3984 PyObject *value;
3985 PyObject *(*conv_fn)(PyObject *);
3986 int which_conversion = oparg & FVC_MASK;
3987 int have_fmt_spec = (oparg & FVS_MASK) == FVS_HAVE_SPEC;
3988
3989 fmt_spec = have_fmt_spec ? POP() : NULL;
Eric V. Smith135d5f42016-02-05 18:23:08 -05003990 value = POP();
Eric V. Smitha78c7952015-11-03 12:45:05 -05003991
3992 /* See if any conversion is specified. */
3993 switch (which_conversion) {
Eric V. Smith9a4135e2019-05-08 16:28:48 -04003994 case FVC_NONE: conv_fn = NULL; break;
Eric V. Smitha78c7952015-11-03 12:45:05 -05003995 case FVC_STR: conv_fn = PyObject_Str; break;
3996 case FVC_REPR: conv_fn = PyObject_Repr; break;
3997 case FVC_ASCII: conv_fn = PyObject_ASCII; break;
Eric V. Smith9a4135e2019-05-08 16:28:48 -04003998 default:
Victor Stinner438a12d2019-05-24 17:01:38 +02003999 _PyErr_Format(tstate, PyExc_SystemError,
4000 "unexpected conversion flag %d",
4001 which_conversion);
Eric V. Smith9a4135e2019-05-08 16:28:48 -04004002 goto error;
Eric V. Smitha78c7952015-11-03 12:45:05 -05004003 }
4004
4005 /* If there's a conversion function, call it and replace
4006 value with that result. Otherwise, just use value,
4007 without conversion. */
Eric V. Smitheb588a12016-02-05 18:26:20 -05004008 if (conv_fn != NULL) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05004009 result = conv_fn(value);
4010 Py_DECREF(value);
Eric V. Smitheb588a12016-02-05 18:26:20 -05004011 if (result == NULL) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05004012 Py_XDECREF(fmt_spec);
4013 goto error;
4014 }
4015 value = result;
4016 }
4017
4018 /* If value is a unicode object, and there's no fmt_spec,
4019 then we know the result of format(value) is value
4020 itself. In that case, skip calling format(). I plan to
4021 move this optimization in to PyObject_Format()
4022 itself. */
4023 if (PyUnicode_CheckExact(value) && fmt_spec == NULL) {
4024 /* Do nothing, just transfer ownership to result. */
4025 result = value;
4026 } else {
4027 /* Actually call format(). */
4028 result = PyObject_Format(value, fmt_spec);
4029 Py_DECREF(value);
4030 Py_XDECREF(fmt_spec);
Eric V. Smitheb588a12016-02-05 18:26:20 -05004031 if (result == NULL) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05004032 goto error;
Eric V. Smitheb588a12016-02-05 18:26:20 -05004033 }
Eric V. Smitha78c7952015-11-03 12:45:05 -05004034 }
4035
Eric V. Smith135d5f42016-02-05 18:23:08 -05004036 PUSH(result);
Eric V. Smitha78c7952015-11-03 12:45:05 -05004037 DISPATCH();
4038 }
4039
Benjamin Petersonddd19492018-09-16 22:38:02 -07004040 case TARGET(EXTENDED_ARG): {
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03004041 int oldoparg = oparg;
4042 NEXTOPARG();
4043 oparg |= oldoparg << 8;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004044 goto dispatch_opcode;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004045 }
Guido van Rossum8861b741996-07-30 16:49:37 +00004046
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004047
Antoine Pitrou042b1282010-08-13 21:15:58 +00004048#if USE_COMPUTED_GOTOS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004049 _unknown_opcode:
Antoine Pitroub52ec782009-01-25 16:34:23 +00004050#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004051 default:
4052 fprintf(stderr,
4053 "XXX lineno: %d, opcode: %d\n",
4054 PyFrame_GetLineNumber(f),
4055 opcode);
Victor Stinner438a12d2019-05-24 17:01:38 +02004056 _PyErr_SetString(tstate, PyExc_SystemError, "unknown opcode");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004057 goto error;
Guido van Rossum04691fc1992-08-12 15:35:34 +00004058
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004059 } /* switch */
Guido van Rossum374a9221991-04-04 10:40:29 +00004060
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004061 /* This should never be reached. Every opcode should end with DISPATCH()
4062 or goto error. */
Barry Warsawb2e57942017-09-14 18:13:16 -07004063 Py_UNREACHABLE();
Guido van Rossumac7be682001-01-17 15:42:30 +00004064
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004065error:
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004066 /* Double-check exception status. */
Victor Stinner365b6932013-07-12 00:11:58 +02004067#ifdef NDEBUG
Victor Stinner438a12d2019-05-24 17:01:38 +02004068 if (!_PyErr_Occurred(tstate)) {
4069 _PyErr_SetString(tstate, PyExc_SystemError,
4070 "error return without exception set");
4071 }
Victor Stinner365b6932013-07-12 00:11:58 +02004072#else
Victor Stinner438a12d2019-05-24 17:01:38 +02004073 assert(_PyErr_Occurred(tstate));
Victor Stinner365b6932013-07-12 00:11:58 +02004074#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00004075
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004076 /* Log traceback info. */
4077 PyTraceBack_Here(f);
Guido van Rossumac7be682001-01-17 15:42:30 +00004078
Mark Shannoncb9879b2020-07-17 11:44:23 +01004079 if (tstate->c_tracefunc != NULL) {
4080 /* Make sure state is set to FRAME_EXECUTING for tracing */
4081 assert(f->f_state == FRAME_EXECUTING);
4082 f->f_state = FRAME_UNWINDING;
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004083 call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj,
Mark Shannon86433452021-01-07 16:49:02 +00004084 tstate, f, &bounds);
Mark Shannoncb9879b2020-07-17 11:44:23 +01004085 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004086exception_unwind:
Mark Shannoncb9879b2020-07-17 11:44:23 +01004087 f->f_state = FRAME_UNWINDING;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004088 /* Unwind stacks if an exception occurred */
4089 while (f->f_iblock > 0) {
4090 /* Pop the current block. */
4091 PyTryBlock *b = &f->f_blockstack[--f->f_iblock];
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004092
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004093 if (b->b_type == EXCEPT_HANDLER) {
4094 UNWIND_EXCEPT_HANDLER(b);
4095 continue;
4096 }
4097 UNWIND_BLOCK(b);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004098 if (b->b_type == SETUP_FINALLY) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004099 PyObject *exc, *val, *tb;
4100 int handler = b->b_handler;
Mark Shannonae3087c2017-10-22 22:41:51 +01004101 _PyErr_StackItem *exc_info = tstate->exc_info;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004102 /* Beware, this invalidates all b->b_* fields */
Mark Shannonbf353f32020-12-17 13:55:28 +00004103 PyFrame_BlockSetup(f, EXCEPT_HANDLER, f->f_lasti, STACK_LEVEL());
Mark Shannonae3087c2017-10-22 22:41:51 +01004104 PUSH(exc_info->exc_traceback);
4105 PUSH(exc_info->exc_value);
4106 if (exc_info->exc_type != NULL) {
4107 PUSH(exc_info->exc_type);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004108 }
4109 else {
4110 Py_INCREF(Py_None);
4111 PUSH(Py_None);
4112 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004113 _PyErr_Fetch(tstate, &exc, &val, &tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004114 /* Make the raw exception data
4115 available to the handler,
4116 so a program can emulate the
4117 Python main loop. */
Victor Stinner438a12d2019-05-24 17:01:38 +02004118 _PyErr_NormalizeException(tstate, &exc, &val, &tb);
Victor Stinner7eab0d02013-07-15 21:16:27 +02004119 if (tb != NULL)
4120 PyException_SetTraceback(val, tb);
4121 else
4122 PyException_SetTraceback(val, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004123 Py_INCREF(exc);
Mark Shannonae3087c2017-10-22 22:41:51 +01004124 exc_info->exc_type = exc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004125 Py_INCREF(val);
Mark Shannonae3087c2017-10-22 22:41:51 +01004126 exc_info->exc_value = val;
4127 exc_info->exc_traceback = tb;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004128 if (tb == NULL)
4129 tb = Py_None;
4130 Py_INCREF(tb);
4131 PUSH(tb);
4132 PUSH(val);
4133 PUSH(exc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004134 JUMPTO(handler);
Victor Stinnerdab84232020-03-17 18:56:44 +01004135 if (_Py_TracingPossible(ceval2)) {
Mark Shannon877df852020-11-12 09:43:29 +00004136 instr_prev = INT_MAX;
Mark Shannonfee55262019-11-21 09:11:43 +00004137 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004138 /* Resume normal execution */
Mark Shannoncb9879b2020-07-17 11:44:23 +01004139 f->f_state = FRAME_EXECUTING;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004140 goto main_loop;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004141 }
4142 } /* unwind stack */
Guido van Rossum374a9221991-04-04 10:40:29 +00004143
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004144 /* End the loop as we still have an error */
4145 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004146 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00004147
Pablo Galindof00828a2019-05-09 16:52:02 +01004148 assert(retval == NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02004149 assert(_PyErr_Occurred(tstate));
Pablo Galindof00828a2019-05-09 16:52:02 +01004150
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004151 /* Pop remaining stack entries. */
4152 while (!EMPTY()) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004153 PyObject *o = POP();
4154 Py_XDECREF(o);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004155 }
Mark Shannoncb9879b2020-07-17 11:44:23 +01004156 f->f_stackdepth = 0;
4157 f->f_state = FRAME_RAISED;
Mark Shannone7c9f4a2020-01-13 12:51:26 +00004158exiting:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004159 if (tstate->use_tracing) {
Benjamin Peterson51f46162013-01-23 08:38:47 -05004160 if (tstate->c_tracefunc) {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004161 if (call_trace_protected(tstate->c_tracefunc, tstate->c_traceobj,
Mark Shannon86433452021-01-07 16:49:02 +00004162 tstate, f, &bounds, PyTrace_RETURN, retval)) {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004163 Py_CLEAR(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004164 }
4165 }
4166 if (tstate->c_profilefunc) {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004167 if (call_trace_protected(tstate->c_profilefunc, tstate->c_profileobj,
Mark Shannon86433452021-01-07 16:49:02 +00004168 tstate, f, &bounds, PyTrace_RETURN, retval)) {
Serhiy Storchaka505ff752014-02-09 13:33:53 +02004169 Py_CLEAR(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004170 }
4171 }
4172 }
Guido van Rossuma4240131997-01-21 21:18:36 +00004173
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004174 /* pop frame */
Thomas Woutersce272b62007-09-19 21:19:28 +00004175exit_eval_frame:
Łukasz Langaa785c872016-09-09 17:37:37 -07004176 if (PyDTrace_FUNCTION_RETURN_ENABLED())
4177 dtrace_function_return(f);
Victor Stinnerbe434dc2019-11-05 00:51:22 +01004178 _Py_LeaveRecursiveCall(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004179 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00004180
Victor Stinner0b72b232020-03-12 23:18:39 +01004181 return _Py_CheckFunctionResult(tstate, NULL, retval, __func__);
Guido van Rossum374a9221991-04-04 10:40:29 +00004182}
4183
Benjamin Petersonb204a422011-06-05 22:04:07 -05004184static void
Victor Stinner438a12d2019-05-24 17:01:38 +02004185format_missing(PyThreadState *tstate, const char *kind,
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004186 PyCodeObject *co, PyObject *names, PyObject *qualname)
Benjamin Petersone109c702011-06-24 09:37:26 -05004187{
4188 int err;
4189 Py_ssize_t len = PyList_GET_SIZE(names);
4190 PyObject *name_str, *comma, *tail, *tmp;
4191
4192 assert(PyList_CheckExact(names));
4193 assert(len >= 1);
4194 /* Deal with the joys of natural language. */
4195 switch (len) {
4196 case 1:
4197 name_str = PyList_GET_ITEM(names, 0);
4198 Py_INCREF(name_str);
4199 break;
4200 case 2:
4201 name_str = PyUnicode_FromFormat("%U and %U",
4202 PyList_GET_ITEM(names, len - 2),
4203 PyList_GET_ITEM(names, len - 1));
4204 break;
4205 default:
4206 tail = PyUnicode_FromFormat(", %U, and %U",
4207 PyList_GET_ITEM(names, len - 2),
4208 PyList_GET_ITEM(names, len - 1));
Benjamin Petersond1ab6082012-06-01 11:18:22 -07004209 if (tail == NULL)
4210 return;
Benjamin Petersone109c702011-06-24 09:37:26 -05004211 /* Chop off the last two objects in the list. This shouldn't actually
4212 fail, but we can't be too careful. */
4213 err = PyList_SetSlice(names, len - 2, len, NULL);
4214 if (err == -1) {
4215 Py_DECREF(tail);
4216 return;
4217 }
4218 /* Stitch everything up into a nice comma-separated list. */
4219 comma = PyUnicode_FromString(", ");
4220 if (comma == NULL) {
4221 Py_DECREF(tail);
4222 return;
4223 }
4224 tmp = PyUnicode_Join(comma, names);
4225 Py_DECREF(comma);
4226 if (tmp == NULL) {
4227 Py_DECREF(tail);
4228 return;
4229 }
4230 name_str = PyUnicode_Concat(tmp, tail);
4231 Py_DECREF(tmp);
4232 Py_DECREF(tail);
4233 break;
4234 }
4235 if (name_str == NULL)
4236 return;
Victor Stinner438a12d2019-05-24 17:01:38 +02004237 _PyErr_Format(tstate, PyExc_TypeError,
4238 "%U() missing %i required %s argument%s: %U",
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004239 qualname,
Victor Stinner438a12d2019-05-24 17:01:38 +02004240 len,
4241 kind,
4242 len == 1 ? "" : "s",
4243 name_str);
Benjamin Petersone109c702011-06-24 09:37:26 -05004244 Py_DECREF(name_str);
4245}
4246
4247static void
Victor Stinner438a12d2019-05-24 17:01:38 +02004248missing_arguments(PyThreadState *tstate, PyCodeObject *co,
4249 Py_ssize_t missing, Py_ssize_t defcount,
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004250 PyObject **fastlocals, PyObject *qualname)
Benjamin Petersone109c702011-06-24 09:37:26 -05004251{
Victor Stinner74319ae2016-08-25 00:04:09 +02004252 Py_ssize_t i, j = 0;
4253 Py_ssize_t start, end;
4254 int positional = (defcount != -1);
Benjamin Petersone109c702011-06-24 09:37:26 -05004255 const char *kind = positional ? "positional" : "keyword-only";
4256 PyObject *missing_names;
4257
4258 /* Compute the names of the arguments that are missing. */
4259 missing_names = PyList_New(missing);
4260 if (missing_names == NULL)
4261 return;
4262 if (positional) {
4263 start = 0;
Pablo Galindocd74e662019-06-01 18:08:04 +01004264 end = co->co_argcount - defcount;
Benjamin Petersone109c702011-06-24 09:37:26 -05004265 }
4266 else {
Pablo Galindocd74e662019-06-01 18:08:04 +01004267 start = co->co_argcount;
Benjamin Petersone109c702011-06-24 09:37:26 -05004268 end = start + co->co_kwonlyargcount;
4269 }
4270 for (i = start; i < end; i++) {
4271 if (GETLOCAL(i) == NULL) {
4272 PyObject *raw = PyTuple_GET_ITEM(co->co_varnames, i);
4273 PyObject *name = PyObject_Repr(raw);
4274 if (name == NULL) {
4275 Py_DECREF(missing_names);
4276 return;
4277 }
4278 PyList_SET_ITEM(missing_names, j++, name);
4279 }
4280 }
4281 assert(j == missing);
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004282 format_missing(tstate, kind, co, missing_names, qualname);
Benjamin Petersone109c702011-06-24 09:37:26 -05004283 Py_DECREF(missing_names);
4284}
4285
4286static void
Victor Stinner438a12d2019-05-24 17:01:38 +02004287too_many_positional(PyThreadState *tstate, PyCodeObject *co,
Mark Shannond6c33fb2021-01-29 13:24:55 +00004288 Py_ssize_t given, PyObject *defaults,
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004289 PyObject **fastlocals, PyObject *qualname)
Benjamin Petersonb204a422011-06-05 22:04:07 -05004290{
4291 int plural;
Victor Stinner74319ae2016-08-25 00:04:09 +02004292 Py_ssize_t kwonly_given = 0;
4293 Py_ssize_t i;
Benjamin Petersonb204a422011-06-05 22:04:07 -05004294 PyObject *sig, *kwonly_sig;
Victor Stinner74319ae2016-08-25 00:04:09 +02004295 Py_ssize_t co_argcount = co->co_argcount;
Benjamin Petersonb204a422011-06-05 22:04:07 -05004296
Benjamin Petersone109c702011-06-24 09:37:26 -05004297 assert((co->co_flags & CO_VARARGS) == 0);
4298 /* Count missing keyword-only args. */
Pablo Galindocd74e662019-06-01 18:08:04 +01004299 for (i = co_argcount; i < co_argcount + co->co_kwonlyargcount; i++) {
Victor Stinner74319ae2016-08-25 00:04:09 +02004300 if (GETLOCAL(i) != NULL) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004301 kwonly_given++;
Victor Stinner74319ae2016-08-25 00:04:09 +02004302 }
4303 }
Mark Shannond6c33fb2021-01-29 13:24:55 +00004304 Py_ssize_t defcount = defaults == NULL ? 0 : PyTuple_GET_SIZE(defaults);
Benjamin Petersone109c702011-06-24 09:37:26 -05004305 if (defcount) {
Pablo Galindocd74e662019-06-01 18:08:04 +01004306 Py_ssize_t atleast = co_argcount - defcount;
Benjamin Petersonb204a422011-06-05 22:04:07 -05004307 plural = 1;
Pablo Galindocd74e662019-06-01 18:08:04 +01004308 sig = PyUnicode_FromFormat("from %zd to %zd", atleast, co_argcount);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004309 }
4310 else {
Pablo Galindocd74e662019-06-01 18:08:04 +01004311 plural = (co_argcount != 1);
4312 sig = PyUnicode_FromFormat("%zd", co_argcount);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004313 }
4314 if (sig == NULL)
4315 return;
4316 if (kwonly_given) {
Victor Stinner74319ae2016-08-25 00:04:09 +02004317 const char *format = " positional argument%s (and %zd keyword-only argument%s)";
4318 kwonly_sig = PyUnicode_FromFormat(format,
4319 given != 1 ? "s" : "",
4320 kwonly_given,
4321 kwonly_given != 1 ? "s" : "");
Benjamin Petersonb204a422011-06-05 22:04:07 -05004322 if (kwonly_sig == NULL) {
4323 Py_DECREF(sig);
4324 return;
4325 }
4326 }
4327 else {
4328 /* This will not fail. */
4329 kwonly_sig = PyUnicode_FromString("");
Benjamin Petersone109c702011-06-24 09:37:26 -05004330 assert(kwonly_sig != NULL);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004331 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004332 _PyErr_Format(tstate, PyExc_TypeError,
4333 "%U() takes %U positional argument%s but %zd%U %s given",
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004334 qualname,
Victor Stinner438a12d2019-05-24 17:01:38 +02004335 sig,
4336 plural ? "s" : "",
4337 given,
4338 kwonly_sig,
4339 given == 1 && !kwonly_given ? "was" : "were");
Benjamin Petersonb204a422011-06-05 22:04:07 -05004340 Py_DECREF(sig);
4341 Py_DECREF(kwonly_sig);
4342}
4343
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004344static int
Victor Stinner438a12d2019-05-24 17:01:38 +02004345positional_only_passed_as_keyword(PyThreadState *tstate, PyCodeObject *co,
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004346 Py_ssize_t kwcount, PyObject* const* kwnames,
4347 PyObject *qualname)
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004348{
4349 int posonly_conflicts = 0;
4350 PyObject* posonly_names = PyList_New(0);
4351
4352 for(int k=0; k < co->co_posonlyargcount; k++){
4353 PyObject* posonly_name = PyTuple_GET_ITEM(co->co_varnames, k);
4354
4355 for (int k2=0; k2<kwcount; k2++){
4356 /* Compare the pointers first and fallback to PyObject_RichCompareBool*/
4357 PyObject* kwname = kwnames[k2];
4358 if (kwname == posonly_name){
4359 if(PyList_Append(posonly_names, kwname) != 0) {
4360 goto fail;
4361 }
4362 posonly_conflicts++;
4363 continue;
4364 }
4365
4366 int cmp = PyObject_RichCompareBool(posonly_name, kwname, Py_EQ);
4367
4368 if ( cmp > 0) {
4369 if(PyList_Append(posonly_names, kwname) != 0) {
4370 goto fail;
4371 }
4372 posonly_conflicts++;
4373 } else if (cmp < 0) {
4374 goto fail;
4375 }
4376
4377 }
4378 }
4379 if (posonly_conflicts) {
4380 PyObject* comma = PyUnicode_FromString(", ");
4381 if (comma == NULL) {
4382 goto fail;
4383 }
4384 PyObject* error_names = PyUnicode_Join(comma, posonly_names);
4385 Py_DECREF(comma);
4386 if (error_names == NULL) {
4387 goto fail;
4388 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004389 _PyErr_Format(tstate, PyExc_TypeError,
4390 "%U() got some positional-only arguments passed"
4391 " as keyword arguments: '%U'",
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004392 qualname, error_names);
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004393 Py_DECREF(error_names);
4394 goto fail;
4395 }
4396
4397 Py_DECREF(posonly_names);
4398 return 0;
4399
4400fail:
4401 Py_XDECREF(posonly_names);
4402 return 1;
4403
4404}
4405
Guido van Rossumc2e20742006-02-27 22:32:47 +00004406/* This is gonna seem *real weird*, but if you put some other code between
Marcel Plch3a9ccee2018-04-06 23:22:04 +02004407 PyEval_EvalFrame() and _PyEval_EvalFrameDefault() you will need to adjust
Guido van Rossumc2e20742006-02-27 22:32:47 +00004408 the test in the if statements in Misc/gdbinit (pystack and pystackv). */
Skip Montanaro786ea6b2004-03-01 15:44:05 +00004409
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01004410PyObject *
Victor Stinnerb5e170f2019-11-16 01:03:22 +01004411_PyEval_EvalCode(PyThreadState *tstate,
Mark Shannond6c33fb2021-01-29 13:24:55 +00004412 PyFrameConstructor *con, PyObject *locals,
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02004413 PyObject *const *args, Py_ssize_t argcount,
4414 PyObject *const *kwnames, PyObject *const *kwargs,
Mark Shannond6c33fb2021-01-29 13:24:55 +00004415 Py_ssize_t kwcount, int kwstep)
Tim Peters5ca576e2001-06-18 22:08:13 +00004416{
Victor Stinnerda2914d2020-03-20 09:29:08 +01004417 assert(is_tstate_valid(tstate));
Victor Stinnerb5e170f2019-11-16 01:03:22 +01004418
Mark Shannond6c33fb2021-01-29 13:24:55 +00004419 PyCodeObject *co = (PyCodeObject*)con->fc_code;
4420 assert(con->fc_defaults == NULL || PyTuple_CheckExact(con->fc_defaults));
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02004421 PyObject *retval = NULL;
Pablo Galindocd74e662019-06-01 18:08:04 +01004422 const Py_ssize_t total_args = co->co_argcount + co->co_kwonlyargcount;
Tim Peters5ca576e2001-06-18 22:08:13 +00004423
Victor Stinnerc7020012016-08-16 23:40:29 +02004424 /* Create the frame */
Mark Shannond6c33fb2021-01-29 13:24:55 +00004425 PyFrameObject *f = _PyFrame_New_NoTrack(tstate, co, con->fc_globals, con->fc_builtins, locals);
Victor Stinnerc7020012016-08-16 23:40:29 +02004426 if (f == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004427 return NULL;
Victor Stinnerc7020012016-08-16 23:40:29 +02004428 }
Victor Stinner232dda62020-06-04 15:19:02 +02004429 PyObject **fastlocals = f->f_localsplus;
4430 PyObject **freevars = f->f_localsplus + co->co_nlocals;
Tim Peters5ca576e2001-06-18 22:08:13 +00004431
Victor Stinnerc7020012016-08-16 23:40:29 +02004432 /* Create a dictionary for keyword parameters (**kwags) */
Victor Stinner232dda62020-06-04 15:19:02 +02004433 PyObject *kwdict;
4434 Py_ssize_t i;
Benjamin Petersonb204a422011-06-05 22:04:07 -05004435 if (co->co_flags & CO_VARKEYWORDS) {
4436 kwdict = PyDict_New();
4437 if (kwdict == NULL)
4438 goto fail;
4439 i = total_args;
Victor Stinnerc7020012016-08-16 23:40:29 +02004440 if (co->co_flags & CO_VARARGS) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004441 i++;
Victor Stinnerc7020012016-08-16 23:40:29 +02004442 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004443 SETLOCAL(i, kwdict);
4444 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004445 else {
4446 kwdict = NULL;
4447 }
4448
Pablo Galindocd74e662019-06-01 18:08:04 +01004449 /* Copy all positional arguments into local variables */
Victor Stinner232dda62020-06-04 15:19:02 +02004450 Py_ssize_t j, n;
Pablo Galindocd74e662019-06-01 18:08:04 +01004451 if (argcount > co->co_argcount) {
4452 n = co->co_argcount;
Victor Stinnerc7020012016-08-16 23:40:29 +02004453 }
4454 else {
4455 n = argcount;
4456 }
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004457 for (j = 0; j < n; j++) {
Victor Stinner232dda62020-06-04 15:19:02 +02004458 PyObject *x = args[j];
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004459 Py_INCREF(x);
4460 SETLOCAL(j, x);
4461 }
4462
Victor Stinnerc7020012016-08-16 23:40:29 +02004463 /* Pack other positional arguments into the *args argument */
Benjamin Petersonb204a422011-06-05 22:04:07 -05004464 if (co->co_flags & CO_VARARGS) {
Victor Stinner232dda62020-06-04 15:19:02 +02004465 PyObject *u = _PyTuple_FromArray(args + n, argcount - n);
Victor Stinnerc7020012016-08-16 23:40:29 +02004466 if (u == NULL) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004467 goto fail;
Victor Stinnerc7020012016-08-16 23:40:29 +02004468 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004469 SETLOCAL(total_args, u);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004470 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004471
Serhiy Storchakab7281052016-09-12 00:52:40 +03004472 /* Handle keyword arguments passed as two strided arrays */
4473 kwcount *= kwstep;
4474 for (i = 0; i < kwcount; i += kwstep) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004475 PyObject **co_varnames;
Serhiy Storchakab7281052016-09-12 00:52:40 +03004476 PyObject *keyword = kwnames[i];
4477 PyObject *value = kwargs[i];
Victor Stinner17061a92016-08-16 23:39:42 +02004478 Py_ssize_t j;
Victor Stinnerc7020012016-08-16 23:40:29 +02004479
Benjamin Petersonb204a422011-06-05 22:04:07 -05004480 if (keyword == NULL || !PyUnicode_Check(keyword)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004481 _PyErr_Format(tstate, PyExc_TypeError,
4482 "%U() keywords must be strings",
Mark Shannond6c33fb2021-01-29 13:24:55 +00004483 con->fc_qualname);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004484 goto fail;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004485 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004486
Benjamin Petersonb204a422011-06-05 22:04:07 -05004487 /* Speed hack: do raw pointer compares. As names are
4488 normally interned this should almost always hit. */
4489 co_varnames = ((PyTupleObject *)(co->co_varnames))->ob_item;
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004490 for (j = co->co_posonlyargcount; j < total_args; j++) {
Victor Stinner232dda62020-06-04 15:19:02 +02004491 PyObject *varname = co_varnames[j];
4492 if (varname == keyword) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004493 goto kw_found;
Victor Stinner6fea7f72016-08-22 23:17:30 +02004494 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004495 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004496
Benjamin Petersonb204a422011-06-05 22:04:07 -05004497 /* Slow fallback, just in case */
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004498 for (j = co->co_posonlyargcount; j < total_args; j++) {
Victor Stinner232dda62020-06-04 15:19:02 +02004499 PyObject *varname = co_varnames[j];
4500 int cmp = PyObject_RichCompareBool( keyword, varname, Py_EQ);
Victor Stinner6fea7f72016-08-22 23:17:30 +02004501 if (cmp > 0) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004502 goto kw_found;
Victor Stinner6fea7f72016-08-22 23:17:30 +02004503 }
4504 else if (cmp < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004505 goto fail;
Victor Stinner6fea7f72016-08-22 23:17:30 +02004506 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004507 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004508
Victor Stinner231d1f32017-01-11 02:12:06 +01004509 assert(j >= total_args);
4510 if (kwdict == NULL) {
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004511
Victor Stinner438a12d2019-05-24 17:01:38 +02004512 if (co->co_posonlyargcount
4513 && positional_only_passed_as_keyword(tstate, co,
Victor Stinner232dda62020-06-04 15:19:02 +02004514 kwcount, kwnames,
Mark Shannond6c33fb2021-01-29 13:24:55 +00004515 con->fc_qualname))
Victor Stinner438a12d2019-05-24 17:01:38 +02004516 {
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004517 goto fail;
4518 }
4519
Victor Stinner438a12d2019-05-24 17:01:38 +02004520 _PyErr_Format(tstate, PyExc_TypeError,
4521 "%U() got an unexpected keyword argument '%S'",
Mark Shannond6c33fb2021-01-29 13:24:55 +00004522 con->fc_qualname, keyword);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004523 goto fail;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004524 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004525
Christian Heimes0bd447f2013-07-20 14:48:10 +02004526 if (PyDict_SetItem(kwdict, keyword, value) == -1) {
4527 goto fail;
4528 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004529 continue;
Victor Stinnerc7020012016-08-16 23:40:29 +02004530
Benjamin Petersonb204a422011-06-05 22:04:07 -05004531 kw_found:
4532 if (GETLOCAL(j) != NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004533 _PyErr_Format(tstate, PyExc_TypeError,
4534 "%U() got multiple values for argument '%S'",
Mark Shannond6c33fb2021-01-29 13:24:55 +00004535 con->fc_qualname, keyword);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004536 goto fail;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004537 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004538 Py_INCREF(value);
4539 SETLOCAL(j, value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004540 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004541
4542 /* Check the number of positional arguments */
Pablo Galindocd74e662019-06-01 18:08:04 +01004543 if ((argcount > co->co_argcount) && !(co->co_flags & CO_VARARGS)) {
Mark Shannond6c33fb2021-01-29 13:24:55 +00004544 too_many_positional(tstate, co, argcount, con->fc_defaults, fastlocals,
4545 con->fc_qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004546 goto fail;
4547 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004548
4549 /* Add missing positional arguments (copy default values from defs) */
Pablo Galindocd74e662019-06-01 18:08:04 +01004550 if (argcount < co->co_argcount) {
Mark Shannond6c33fb2021-01-29 13:24:55 +00004551 Py_ssize_t defcount = con->fc_defaults == NULL ? 0 : PyTuple_GET_SIZE(con->fc_defaults);
Pablo Galindocd74e662019-06-01 18:08:04 +01004552 Py_ssize_t m = co->co_argcount - defcount;
Victor Stinner17061a92016-08-16 23:39:42 +02004553 Py_ssize_t missing = 0;
4554 for (i = argcount; i < m; i++) {
4555 if (GETLOCAL(i) == NULL) {
Benjamin Petersone109c702011-06-24 09:37:26 -05004556 missing++;
Victor Stinner17061a92016-08-16 23:39:42 +02004557 }
4558 }
Benjamin Petersone109c702011-06-24 09:37:26 -05004559 if (missing) {
Victor Stinner232dda62020-06-04 15:19:02 +02004560 missing_arguments(tstate, co, missing, defcount, fastlocals,
Mark Shannond6c33fb2021-01-29 13:24:55 +00004561 con->fc_qualname);
Benjamin Petersone109c702011-06-24 09:37:26 -05004562 goto fail;
Benjamin Petersonb204a422011-06-05 22:04:07 -05004563 }
4564 if (n > m)
4565 i = n - m;
4566 else
4567 i = 0;
Mark Shannond6c33fb2021-01-29 13:24:55 +00004568 if (defcount) {
4569 PyObject **defs = &PyTuple_GET_ITEM(con->fc_defaults, 0);
4570 for (; i < defcount; i++) {
4571 if (GETLOCAL(m+i) == NULL) {
4572 PyObject *def = defs[i];
4573 Py_INCREF(def);
4574 SETLOCAL(m+i, def);
4575 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004576 }
4577 }
4578 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004579
4580 /* Add missing keyword arguments (copy default values from kwdefs) */
Benjamin Petersonb204a422011-06-05 22:04:07 -05004581 if (co->co_kwonlyargcount > 0) {
Victor Stinner17061a92016-08-16 23:39:42 +02004582 Py_ssize_t missing = 0;
Pablo Galindocd74e662019-06-01 18:08:04 +01004583 for (i = co->co_argcount; i < total_args; i++) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004584 if (GETLOCAL(i) != NULL)
4585 continue;
Victor Stinner232dda62020-06-04 15:19:02 +02004586 PyObject *varname = PyTuple_GET_ITEM(co->co_varnames, i);
Mark Shannond6c33fb2021-01-29 13:24:55 +00004587 if (con->fc_kwdefaults != NULL) {
4588 PyObject *def = PyDict_GetItemWithError(con->fc_kwdefaults, varname);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004589 if (def) {
4590 Py_INCREF(def);
4591 SETLOCAL(i, def);
4592 continue;
4593 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004594 else if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02004595 goto fail;
4596 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004597 }
Benjamin Petersone109c702011-06-24 09:37:26 -05004598 missing++;
4599 }
4600 if (missing) {
Victor Stinner232dda62020-06-04 15:19:02 +02004601 missing_arguments(tstate, co, missing, -1, fastlocals,
Mark Shannond6c33fb2021-01-29 13:24:55 +00004602 con->fc_qualname);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004603 goto fail;
4604 }
4605 }
4606
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004607 /* Allocate and initialize storage for cell vars, and copy free
Benjamin Peterson90037602011-06-25 22:54:45 -05004608 vars into frame. */
4609 for (i = 0; i < PyTuple_GET_SIZE(co->co_cellvars); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004610 PyObject *c;
Serhiy Storchaka5bb8b912016-12-16 19:19:02 +02004611 Py_ssize_t arg;
Benjamin Peterson90037602011-06-25 22:54:45 -05004612 /* Possibly account for the cell variable being an argument. */
4613 if (co->co_cell2arg != NULL &&
Guido van Rossum6832c812013-05-10 08:47:42 -07004614 (arg = co->co_cell2arg[i]) != CO_CELL_NOT_AN_ARG) {
Benjamin Peterson90037602011-06-25 22:54:45 -05004615 c = PyCell_New(GETLOCAL(arg));
Benjamin Peterson159ae412013-05-12 18:16:06 -05004616 /* Clear the local copy. */
4617 SETLOCAL(arg, NULL);
Guido van Rossum6832c812013-05-10 08:47:42 -07004618 }
4619 else {
Benjamin Peterson90037602011-06-25 22:54:45 -05004620 c = PyCell_New(NULL);
Guido van Rossum6832c812013-05-10 08:47:42 -07004621 }
Benjamin Peterson159ae412013-05-12 18:16:06 -05004622 if (c == NULL)
4623 goto fail;
Benjamin Peterson90037602011-06-25 22:54:45 -05004624 SETLOCAL(co->co_nlocals + i, c);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004625 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004626
4627 /* Copy closure variables to free variables */
Benjamin Peterson90037602011-06-25 22:54:45 -05004628 for (i = 0; i < PyTuple_GET_SIZE(co->co_freevars); ++i) {
Mark Shannond6c33fb2021-01-29 13:24:55 +00004629 PyObject *o = PyTuple_GET_ITEM(con->fc_closure, i);
Benjamin Peterson90037602011-06-25 22:54:45 -05004630 Py_INCREF(o);
4631 freevars[PyTuple_GET_SIZE(co->co_cellvars) + i] = o;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004632 }
Tim Peters5ca576e2001-06-18 22:08:13 +00004633
Yury Selivanoveb636452016-09-08 22:01:51 -07004634 /* Handle generator/coroutine/asynchronous generator */
4635 if (co->co_flags & (CO_GENERATOR | CO_COROUTINE | CO_ASYNC_GENERATOR)) {
Yury Selivanov75445082015-05-11 22:57:16 -04004636 PyObject *gen;
Yury Selivanov5376ba92015-06-22 12:19:30 -04004637 int is_coro = co->co_flags & CO_COROUTINE;
Yury Selivanov94c22632015-06-04 10:16:51 -04004638
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004639 /* Don't need to keep the reference to f_back, it will be set
4640 * when the generator is resumed. */
Serhiy Storchaka505ff752014-02-09 13:33:53 +02004641 Py_CLEAR(f->f_back);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00004642
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004643 /* Create a new generator that owns the ready to run frame
4644 * and return that as the value. */
Yury Selivanov5376ba92015-06-22 12:19:30 -04004645 if (is_coro) {
Mark Shannond6c33fb2021-01-29 13:24:55 +00004646 gen = PyCoro_New(f, con->fc_name, con->fc_qualname);
Yury Selivanoveb636452016-09-08 22:01:51 -07004647 } else if (co->co_flags & CO_ASYNC_GENERATOR) {
Mark Shannond6c33fb2021-01-29 13:24:55 +00004648 gen = PyAsyncGen_New(f, con->fc_name, con->fc_qualname);
Yury Selivanov5376ba92015-06-22 12:19:30 -04004649 } else {
Mark Shannond6c33fb2021-01-29 13:24:55 +00004650 gen = PyGen_NewWithQualName(f, con->fc_name, con->fc_qualname);
Yury Selivanov5376ba92015-06-22 12:19:30 -04004651 }
INADA Naoki6a3cedf2016-12-26 18:01:46 +09004652 if (gen == NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04004653 return NULL;
INADA Naoki6a3cedf2016-12-26 18:01:46 +09004654 }
INADA Naoki9c157762016-12-26 18:52:46 +09004655
INADA Naoki6a3cedf2016-12-26 18:01:46 +09004656 _PyObject_GC_TRACK(f);
Yury Selivanov75445082015-05-11 22:57:16 -04004657
Yury Selivanov75445082015-05-11 22:57:16 -04004658 return gen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004659 }
Tim Peters5ca576e2001-06-18 22:08:13 +00004660
Victor Stinnerb9e68122019-11-14 12:20:46 +01004661 retval = _PyEval_EvalFrame(tstate, f, 0);
Tim Peters5ca576e2001-06-18 22:08:13 +00004662
Thomas Woutersce272b62007-09-19 21:19:28 +00004663fail: /* Jump here from prelude on failure */
Tim Peters5ca576e2001-06-18 22:08:13 +00004664
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004665 /* decref'ing the frame can cause __del__ methods to get invoked,
4666 which can call back into Python. While we're done with the
4667 current Python frame (f), the associated C stack is still in use,
4668 so recursion_depth must be boosted for the duration.
4669 */
INADA Naoki5a625d02016-12-24 20:19:08 +09004670 if (Py_REFCNT(f) > 1) {
4671 Py_DECREF(f);
4672 _PyObject_GC_TRACK(f);
4673 }
4674 else {
4675 ++tstate->recursion_depth;
4676 Py_DECREF(f);
4677 --tstate->recursion_depth;
4678 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004679 return retval;
Tim Peters5ca576e2001-06-18 22:08:13 +00004680}
4681
Mark Shannond6c33fb2021-01-29 13:24:55 +00004682/* Legacy API */
Victor Stinnerb5e170f2019-11-16 01:03:22 +01004683PyObject *
4684_PyEval_EvalCodeWithName(PyObject *_co, PyObject *globals, PyObject *locals,
4685 PyObject *const *args, Py_ssize_t argcount,
4686 PyObject *const *kwnames, PyObject *const *kwargs,
4687 Py_ssize_t kwcount, int kwstep,
4688 PyObject *const *defs, Py_ssize_t defcount,
4689 PyObject *kwdefs, PyObject *closure,
4690 PyObject *name, PyObject *qualname)
4691{
Mark Shannond6c33fb2021-01-29 13:24:55 +00004692 PyObject *defaults = _PyTuple_FromArray(defs, defcount);
4693 if (defaults == NULL) {
4694 return NULL;
4695 }
4696 PyObject *builtins = _PyEval_BuiltinsFromGlobals(globals);
4697 if (builtins == NULL) {
4698 Py_DECREF(defaults);
4699 return NULL;
4700 }
4701 PyFrameConstructor constr = {
4702 .fc_globals = globals,
4703 .fc_builtins = builtins,
4704 .fc_name = name,
4705 .fc_qualname = qualname,
4706 .fc_code = _co,
4707 .fc_defaults = defaults,
4708 .fc_kwdefaults = kwdefs,
4709 .fc_closure = closure
4710 };
Victor Stinnerb5e170f2019-11-16 01:03:22 +01004711 PyThreadState *tstate = _PyThreadState_GET();
Mark Shannond6c33fb2021-01-29 13:24:55 +00004712 PyObject *res = _PyEval_EvalCode(tstate, &constr, locals,
4713 args, argcount,
4714 kwnames, kwargs,
4715 kwcount, kwstep);
4716 Py_DECREF(defaults);
4717 Py_DECREF(builtins);
4718 return res;
Victor Stinnerb5e170f2019-11-16 01:03:22 +01004719}
4720
Mark Shannond6c33fb2021-01-29 13:24:55 +00004721/* Legacy API */
Victor Stinner40ee3012014-06-16 15:59:28 +02004722PyObject *
4723PyEval_EvalCodeEx(PyObject *_co, PyObject *globals, PyObject *locals,
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02004724 PyObject *const *args, int argcount,
4725 PyObject *const *kws, int kwcount,
4726 PyObject *const *defs, int defcount,
4727 PyObject *kwdefs, PyObject *closure)
Victor Stinner40ee3012014-06-16 15:59:28 +02004728{
Mark Shannond6c33fb2021-01-29 13:24:55 +00004729 return _PyEval_EvalCodeWithName(
4730 _co, globals, locals,
4731 args, argcount,
4732 kws, kws != NULL ? kws + 1 : NULL,
4733 kwcount, 2,
4734 defs, defcount,
4735 kwdefs, closure,
4736 ((PyCodeObject *)_co)->co_name,
4737 ((PyCodeObject *)_co)->co_name);
Victor Stinner40ee3012014-06-16 15:59:28 +02004738}
Tim Peters5ca576e2001-06-18 22:08:13 +00004739
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004740static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02004741special_lookup(PyThreadState *tstate, PyObject *o, _Py_Identifier *id)
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004742{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004743 PyObject *res;
Benjamin Petersonce798522012-01-22 11:24:29 -05004744 res = _PyObject_LookupSpecial(o, id);
Victor Stinner438a12d2019-05-24 17:01:38 +02004745 if (res == NULL && !_PyErr_Occurred(tstate)) {
Victor Stinner4804b5b2020-05-12 01:43:38 +02004746 _PyErr_SetObject(tstate, PyExc_AttributeError, _PyUnicode_FromId(id));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004747 return NULL;
4748 }
4749 return res;
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004750}
4751
4752
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00004753/* Logic for the raise statement (too complicated for inlining).
4754 This *consumes* a reference count to each of its arguments. */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004755static int
Victor Stinner09532fe2019-05-10 23:39:09 +02004756do_raise(PyThreadState *tstate, PyObject *exc, PyObject *cause)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00004757{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004758 PyObject *type = NULL, *value = NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00004759
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004760 if (exc == NULL) {
4761 /* Reraise */
Mark Shannonae3087c2017-10-22 22:41:51 +01004762 _PyErr_StackItem *exc_info = _PyErr_GetTopmostException(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004763 PyObject *tb;
Mark Shannonae3087c2017-10-22 22:41:51 +01004764 type = exc_info->exc_type;
4765 value = exc_info->exc_value;
4766 tb = exc_info->exc_traceback;
Victor Stinnereec93312016-08-18 18:13:10 +02004767 if (type == Py_None || type == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004768 _PyErr_SetString(tstate, PyExc_RuntimeError,
4769 "No active exception to reraise");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004770 return 0;
4771 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004772 Py_XINCREF(type);
4773 Py_XINCREF(value);
4774 Py_XINCREF(tb);
Victor Stinner438a12d2019-05-24 17:01:38 +02004775 _PyErr_Restore(tstate, type, value, tb);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004776 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004777 }
Guido van Rossumac7be682001-01-17 15:42:30 +00004778
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004779 /* We support the following forms of raise:
4780 raise
Collin Winter828f04a2007-08-31 00:04:24 +00004781 raise <instance>
4782 raise <type> */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00004783
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004784 if (PyExceptionClass_Check(exc)) {
4785 type = exc;
Victor Stinnera5ed5f02016-12-06 18:45:50 +01004786 value = _PyObject_CallNoArg(exc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004787 if (value == NULL)
4788 goto raise_error;
Benjamin Peterson5afa03a2011-07-15 14:09:26 -05004789 if (!PyExceptionInstance_Check(value)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004790 _PyErr_Format(tstate, PyExc_TypeError,
4791 "calling %R should have returned an instance of "
4792 "BaseException, not %R",
4793 type, Py_TYPE(value));
4794 goto raise_error;
Benjamin Peterson5afa03a2011-07-15 14:09:26 -05004795 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004796 }
4797 else if (PyExceptionInstance_Check(exc)) {
4798 value = exc;
4799 type = PyExceptionInstance_Class(exc);
4800 Py_INCREF(type);
4801 }
4802 else {
4803 /* Not something you can raise. You get an exception
4804 anyway, just not what you specified :-) */
4805 Py_DECREF(exc);
Victor Stinner438a12d2019-05-24 17:01:38 +02004806 _PyErr_SetString(tstate, PyExc_TypeError,
4807 "exceptions must derive from BaseException");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004808 goto raise_error;
4809 }
Collin Winter828f04a2007-08-31 00:04:24 +00004810
Serhiy Storchakac0191582016-09-27 11:37:10 +03004811 assert(type != NULL);
4812 assert(value != NULL);
4813
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004814 if (cause) {
4815 PyObject *fixed_cause;
4816 if (PyExceptionClass_Check(cause)) {
Victor Stinnera5ed5f02016-12-06 18:45:50 +01004817 fixed_cause = _PyObject_CallNoArg(cause);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004818 if (fixed_cause == NULL)
4819 goto raise_error;
Benjamin Petersond5a1c442012-05-14 22:09:31 -07004820 Py_DECREF(cause);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004821 }
Benjamin Petersond5a1c442012-05-14 22:09:31 -07004822 else if (PyExceptionInstance_Check(cause)) {
4823 fixed_cause = cause;
4824 }
4825 else if (cause == Py_None) {
4826 Py_DECREF(cause);
4827 fixed_cause = NULL;
4828 }
4829 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02004830 _PyErr_SetString(tstate, PyExc_TypeError,
4831 "exception causes must derive from "
4832 "BaseException");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004833 goto raise_error;
4834 }
Benjamin Petersond5a1c442012-05-14 22:09:31 -07004835 PyException_SetCause(value, fixed_cause);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004836 }
Collin Winter828f04a2007-08-31 00:04:24 +00004837
Victor Stinner438a12d2019-05-24 17:01:38 +02004838 _PyErr_SetObject(tstate, type, value);
Victor Stinner61f4db82020-01-28 03:37:45 +01004839 /* _PyErr_SetObject incref's its arguments */
Serhiy Storchakac0191582016-09-27 11:37:10 +03004840 Py_DECREF(value);
4841 Py_DECREF(type);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004842 return 0;
Collin Winter828f04a2007-08-31 00:04:24 +00004843
4844raise_error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004845 Py_XDECREF(value);
4846 Py_XDECREF(type);
4847 Py_XDECREF(cause);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004848 return 0;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00004849}
4850
Tim Petersd6d010b2001-06-21 02:49:55 +00004851/* Iterate v argcnt times and store the results on the stack (via decreasing
Guido van Rossum0368b722007-05-11 16:50:42 +00004852 sp). Return 1 for success, 0 if error.
Antoine Pitrou9a2310d2008-07-25 22:39:39 +00004853
Guido van Rossum0368b722007-05-11 16:50:42 +00004854 If argcntafter == -1, do a simple unpack. If it is >= 0, do an unpack
4855 with a variable target.
4856*/
Tim Petersd6d010b2001-06-21 02:49:55 +00004857
Barry Warsawe42b18f1997-08-25 22:13:04 +00004858static int
Victor Stinner438a12d2019-05-24 17:01:38 +02004859unpack_iterable(PyThreadState *tstate, PyObject *v,
4860 int argcnt, int argcntafter, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00004861{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004862 int i = 0, j = 0;
4863 Py_ssize_t ll = 0;
4864 PyObject *it; /* iter(v) */
4865 PyObject *w;
4866 PyObject *l = NULL; /* variable list */
Guido van Rossumac7be682001-01-17 15:42:30 +00004867
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004868 assert(v != NULL);
Tim Petersd6d010b2001-06-21 02:49:55 +00004869
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004870 it = PyObject_GetIter(v);
Serhiy Storchaka13a6c092017-12-26 12:30:41 +02004871 if (it == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004872 if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError) &&
Victor Stinnera102ed72020-02-07 02:24:48 +01004873 Py_TYPE(v)->tp_iter == NULL && !PySequence_Check(v))
Serhiy Storchaka13a6c092017-12-26 12:30:41 +02004874 {
Victor Stinner438a12d2019-05-24 17:01:38 +02004875 _PyErr_Format(tstate, PyExc_TypeError,
4876 "cannot unpack non-iterable %.200s object",
Victor Stinnera102ed72020-02-07 02:24:48 +01004877 Py_TYPE(v)->tp_name);
Serhiy Storchaka13a6c092017-12-26 12:30:41 +02004878 }
4879 return 0;
4880 }
Tim Petersd6d010b2001-06-21 02:49:55 +00004881
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004882 for (; i < argcnt; i++) {
4883 w = PyIter_Next(it);
4884 if (w == NULL) {
4885 /* Iterator done, via error or exhaustion. */
Victor Stinner438a12d2019-05-24 17:01:38 +02004886 if (!_PyErr_Occurred(tstate)) {
R David Murray4171bbe2015-04-15 17:08:45 -04004887 if (argcntafter == -1) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004888 _PyErr_Format(tstate, PyExc_ValueError,
4889 "not enough values to unpack "
4890 "(expected %d, got %d)",
4891 argcnt, i);
R David Murray4171bbe2015-04-15 17:08:45 -04004892 }
4893 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02004894 _PyErr_Format(tstate, PyExc_ValueError,
4895 "not enough values to unpack "
4896 "(expected at least %d, got %d)",
4897 argcnt + argcntafter, i);
R David Murray4171bbe2015-04-15 17:08:45 -04004898 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004899 }
4900 goto Error;
4901 }
4902 *--sp = w;
4903 }
Tim Petersd6d010b2001-06-21 02:49:55 +00004904
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004905 if (argcntafter == -1) {
4906 /* We better have exhausted the iterator now. */
4907 w = PyIter_Next(it);
4908 if (w == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004909 if (_PyErr_Occurred(tstate))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004910 goto Error;
4911 Py_DECREF(it);
4912 return 1;
4913 }
4914 Py_DECREF(w);
Victor Stinner438a12d2019-05-24 17:01:38 +02004915 _PyErr_Format(tstate, PyExc_ValueError,
4916 "too many values to unpack (expected %d)",
4917 argcnt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004918 goto Error;
4919 }
Guido van Rossum0368b722007-05-11 16:50:42 +00004920
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004921 l = PySequence_List(it);
4922 if (l == NULL)
4923 goto Error;
4924 *--sp = l;
4925 i++;
Guido van Rossum0368b722007-05-11 16:50:42 +00004926
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004927 ll = PyList_GET_SIZE(l);
4928 if (ll < argcntafter) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004929 _PyErr_Format(tstate, PyExc_ValueError,
R David Murray4171bbe2015-04-15 17:08:45 -04004930 "not enough values to unpack (expected at least %d, got %zd)",
4931 argcnt + argcntafter, argcnt + ll);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004932 goto Error;
4933 }
Guido van Rossum0368b722007-05-11 16:50:42 +00004934
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004935 /* Pop the "after-variable" args off the list. */
4936 for (j = argcntafter; j > 0; j--, i++) {
4937 *--sp = PyList_GET_ITEM(l, ll - j);
4938 }
4939 /* Resize the list. */
Victor Stinner60ac6ed2020-02-07 23:18:08 +01004940 Py_SET_SIZE(l, ll - argcntafter);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004941 Py_DECREF(it);
4942 return 1;
Guido van Rossum0368b722007-05-11 16:50:42 +00004943
Tim Petersd6d010b2001-06-21 02:49:55 +00004944Error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004945 for (; i > 0; i--, sp++)
4946 Py_DECREF(*sp);
4947 Py_XDECREF(it);
4948 return 0;
Barry Warsawe42b18f1997-08-25 22:13:04 +00004949}
4950
4951
Guido van Rossum96a42c81992-01-12 02:29:51 +00004952#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00004953static int
Victor Stinner438a12d2019-05-24 17:01:38 +02004954prtrace(PyThreadState *tstate, PyObject *v, const char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004955{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004956 printf("%s ", str);
Victor Stinner438a12d2019-05-24 17:01:38 +02004957 if (PyObject_Print(v, stdout, 0) != 0) {
4958 /* Don't know what else to do */
4959 _PyErr_Clear(tstate);
4960 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004961 printf("\n");
4962 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004963}
Guido van Rossum3f5da241990-12-20 15:06:42 +00004964#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004965
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00004966static void
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004967call_exc_trace(Py_tracefunc func, PyObject *self,
Mark Shannon86433452021-01-07 16:49:02 +00004968 PyThreadState *tstate,
4969 PyFrameObject *f,
4970 PyCodeAddressRange *bounds)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00004971{
Victor Stinneraaa8ed82013-07-10 13:57:55 +02004972 PyObject *type, *value, *traceback, *orig_traceback, *arg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004973 int err;
Victor Stinner438a12d2019-05-24 17:01:38 +02004974 _PyErr_Fetch(tstate, &type, &value, &orig_traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004975 if (value == NULL) {
4976 value = Py_None;
4977 Py_INCREF(value);
4978 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004979 _PyErr_NormalizeException(tstate, &type, &value, &orig_traceback);
Antoine Pitrou89335212013-11-23 14:05:23 +01004980 traceback = (orig_traceback != NULL) ? orig_traceback : Py_None;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004981 arg = PyTuple_Pack(3, type, value, traceback);
4982 if (arg == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004983 _PyErr_Restore(tstate, type, value, orig_traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004984 return;
4985 }
Mark Shannon86433452021-01-07 16:49:02 +00004986 err = call_trace(func, self, tstate, f, bounds, PyTrace_EXCEPTION, arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004987 Py_DECREF(arg);
Victor Stinner438a12d2019-05-24 17:01:38 +02004988 if (err == 0) {
4989 _PyErr_Restore(tstate, type, value, orig_traceback);
4990 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004991 else {
4992 Py_XDECREF(type);
4993 Py_XDECREF(value);
Victor Stinneraaa8ed82013-07-10 13:57:55 +02004994 Py_XDECREF(orig_traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004995 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00004996}
4997
Amaury Forgeot d'Arcf05149a2007-11-13 01:05:30 +00004998static int
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004999call_trace_protected(Py_tracefunc func, PyObject *obj,
5000 PyThreadState *tstate, PyFrameObject *frame,
Mark Shannon86433452021-01-07 16:49:02 +00005001 PyCodeAddressRange *bounds,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005002 int what, PyObject *arg)
Fred Drake4ec5d562001-10-04 19:26:43 +00005003{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005004 PyObject *type, *value, *traceback;
5005 int err;
Victor Stinner438a12d2019-05-24 17:01:38 +02005006 _PyErr_Fetch(tstate, &type, &value, &traceback);
Mark Shannon86433452021-01-07 16:49:02 +00005007 err = call_trace(func, obj, tstate, frame, bounds, what, arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005008 if (err == 0)
5009 {
Victor Stinner438a12d2019-05-24 17:01:38 +02005010 _PyErr_Restore(tstate, type, value, traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005011 return 0;
5012 }
5013 else {
5014 Py_XDECREF(type);
5015 Py_XDECREF(value);
5016 Py_XDECREF(traceback);
5017 return -1;
5018 }
Fred Drake4ec5d562001-10-04 19:26:43 +00005019}
5020
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00005021static int
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005022call_trace(Py_tracefunc func, PyObject *obj,
5023 PyThreadState *tstate, PyFrameObject *frame,
Mark Shannon86433452021-01-07 16:49:02 +00005024 PyCodeAddressRange *bounds,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005025 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00005026{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005027 int result;
5028 if (tstate->tracing)
5029 return 0;
5030 tstate->tracing++;
5031 tstate->use_tracing = 0;
Mark Shannon86433452021-01-07 16:49:02 +00005032 if (frame->f_lasti < 0) {
5033 frame->f_lineno = frame->f_code->co_firstlineno;
5034 }
5035 else {
5036 frame->f_lineno = _PyCode_CheckLineNumber(frame->f_lasti, bounds);
5037 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005038 result = func(obj, frame, what, arg);
Mark Shannon86433452021-01-07 16:49:02 +00005039 frame->f_lineno = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005040 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
5041 || (tstate->c_profilefunc != NULL));
5042 tstate->tracing--;
5043 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00005044}
5045
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00005046PyObject *
5047_PyEval_CallTracing(PyObject *func, PyObject *args)
5048{
Victor Stinner50b48572018-11-01 01:51:40 +01005049 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005050 int save_tracing = tstate->tracing;
5051 int save_use_tracing = tstate->use_tracing;
5052 PyObject *result;
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00005053
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005054 tstate->tracing = 0;
5055 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
5056 || (tstate->c_profilefunc != NULL));
5057 result = PyObject_Call(func, args, NULL);
5058 tstate->tracing = save_tracing;
5059 tstate->use_tracing = save_use_tracing;
5060 return result;
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00005061}
5062
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00005063/* See Objects/lnotab_notes.txt for a description of how tracing works. */
Michael W. Hudson006c7522002-11-08 13:08:46 +00005064static int
Tim Peters8a5c3c72004-04-05 19:36:21 +00005065maybe_call_line_trace(Py_tracefunc func, PyObject *obj,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005066 PyThreadState *tstate, PyFrameObject *frame,
Mark Shannon877df852020-11-12 09:43:29 +00005067 PyCodeAddressRange *bounds, int *instr_prev)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00005068{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005069 int result = 0;
Michael W. Hudson006c7522002-11-08 13:08:46 +00005070
Nick Coghlan5a851672017-09-08 10:14:16 +10005071 /* If the last instruction falls at the start of a line or if it
5072 represents a jump backwards, update the frame's line number and
5073 then call the trace function if we're tracing source lines.
5074 */
Mark Shannonee9f98d2021-01-05 12:04:10 +00005075 int lastline = bounds->ar_line;
5076 int line = _PyCode_CheckLineNumber(frame->f_lasti, bounds);
5077 if (line != -1 && frame->f_trace_lines) {
5078 /* Trace backward edges or first instruction of a new line */
5079 if (frame->f_lasti < *instr_prev ||
5080 (line != lastline && frame->f_lasti == bounds->ar_start))
5081 {
Mark Shannon86433452021-01-07 16:49:02 +00005082 result = call_trace(func, obj, tstate, frame, bounds, PyTrace_LINE, Py_None);
Nick Coghlan5a851672017-09-08 10:14:16 +10005083 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005084 }
George King20faa682017-10-18 17:44:22 -07005085 /* Always emit an opcode event if we're tracing all opcodes. */
5086 if (frame->f_trace_opcodes) {
Mark Shannon86433452021-01-07 16:49:02 +00005087 result = call_trace(func, obj, tstate, frame, bounds, PyTrace_OPCODE, Py_None);
George King20faa682017-10-18 17:44:22 -07005088 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005089 *instr_prev = frame->f_lasti;
5090 return result;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00005091}
5092
Victor Stinner309d7cc2020-03-13 16:39:12 +01005093int
5094_PyEval_SetProfile(PyThreadState *tstate, Py_tracefunc func, PyObject *arg)
5095{
Victor Stinnerda2914d2020-03-20 09:29:08 +01005096 assert(is_tstate_valid(tstate));
Victor Stinner309d7cc2020-03-13 16:39:12 +01005097 /* The caller must hold the GIL */
5098 assert(PyGILState_Check());
5099
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005100 /* Call _PySys_Audit() in the context of the current thread state,
Victor Stinner309d7cc2020-03-13 16:39:12 +01005101 even if tstate is not the current thread state. */
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005102 PyThreadState *current_tstate = _PyThreadState_GET();
5103 if (_PySys_Audit(current_tstate, "sys.setprofile", NULL) < 0) {
Victor Stinner309d7cc2020-03-13 16:39:12 +01005104 return -1;
5105 }
5106
5107 PyObject *profileobj = tstate->c_profileobj;
5108
5109 tstate->c_profilefunc = NULL;
5110 tstate->c_profileobj = NULL;
5111 /* Must make sure that tracing is not ignored if 'profileobj' is freed */
5112 tstate->use_tracing = tstate->c_tracefunc != NULL;
5113 Py_XDECREF(profileobj);
5114
5115 Py_XINCREF(arg);
5116 tstate->c_profileobj = arg;
5117 tstate->c_profilefunc = func;
5118
5119 /* Flag that tracing or profiling is turned on */
5120 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
5121 return 0;
5122}
5123
Fred Drake5755ce62001-06-27 19:19:46 +00005124void
5125PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00005126{
Victor Stinner309d7cc2020-03-13 16:39:12 +01005127 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerf6a58502020-03-16 17:41:44 +01005128 if (_PyEval_SetProfile(tstate, func, arg) < 0) {
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005129 /* Log _PySys_Audit() error */
Victor Stinnerf6a58502020-03-16 17:41:44 +01005130 _PyErr_WriteUnraisableMsg("in PyEval_SetProfile", NULL);
5131 }
Victor Stinner309d7cc2020-03-13 16:39:12 +01005132}
5133
5134int
5135_PyEval_SetTrace(PyThreadState *tstate, Py_tracefunc func, PyObject *arg)
5136{
Victor Stinnerda2914d2020-03-20 09:29:08 +01005137 assert(is_tstate_valid(tstate));
Victor Stinner309d7cc2020-03-13 16:39:12 +01005138 /* The caller must hold the GIL */
5139 assert(PyGILState_Check());
5140
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005141 /* Call _PySys_Audit() in the context of the current thread state,
Victor Stinner309d7cc2020-03-13 16:39:12 +01005142 even if tstate is not the current thread state. */
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005143 PyThreadState *current_tstate = _PyThreadState_GET();
5144 if (_PySys_Audit(current_tstate, "sys.settrace", NULL) < 0) {
Victor Stinner309d7cc2020-03-13 16:39:12 +01005145 return -1;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005146 }
5147
Victor Stinnerda2914d2020-03-20 09:29:08 +01005148 struct _ceval_state *ceval2 = &tstate->interp->ceval;
Victor Stinner309d7cc2020-03-13 16:39:12 +01005149 PyObject *traceobj = tstate->c_traceobj;
Victor Stinnerda2914d2020-03-20 09:29:08 +01005150 ceval2->tracing_possible += (func != NULL) - (tstate->c_tracefunc != NULL);
Victor Stinner309d7cc2020-03-13 16:39:12 +01005151
5152 tstate->c_tracefunc = NULL;
5153 tstate->c_traceobj = NULL;
5154 /* Must make sure that profiling is not ignored if 'traceobj' is freed */
5155 tstate->use_tracing = (tstate->c_profilefunc != NULL);
5156 Py_XDECREF(traceobj);
5157
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005158 Py_XINCREF(arg);
Victor Stinner309d7cc2020-03-13 16:39:12 +01005159 tstate->c_traceobj = arg;
5160 tstate->c_tracefunc = func;
5161
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005162 /* Flag that tracing or profiling is turned on */
Victor Stinner309d7cc2020-03-13 16:39:12 +01005163 tstate->use_tracing = ((func != NULL)
5164 || (tstate->c_profilefunc != NULL));
5165
5166 return 0;
Fred Drake5755ce62001-06-27 19:19:46 +00005167}
5168
5169void
5170PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
5171{
Victor Stinner309d7cc2020-03-13 16:39:12 +01005172 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerf6a58502020-03-16 17:41:44 +01005173 if (_PyEval_SetTrace(tstate, func, arg) < 0) {
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005174 /* Log _PySys_Audit() error */
Victor Stinnerf6a58502020-03-16 17:41:44 +01005175 _PyErr_WriteUnraisableMsg("in PyEval_SetTrace", NULL);
5176 }
Fred Draked0838392001-06-16 21:02:31 +00005177}
5178
Victor Stinner309d7cc2020-03-13 16:39:12 +01005179
Yury Selivanov75445082015-05-11 22:57:16 -04005180void
Victor Stinner838f2642019-06-13 22:41:23 +02005181_PyEval_SetCoroutineOriginTrackingDepth(PyThreadState *tstate, int new_depth)
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08005182{
5183 assert(new_depth >= 0);
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08005184 tstate->coroutine_origin_tracking_depth = new_depth;
5185}
5186
5187int
5188_PyEval_GetCoroutineOriginTrackingDepth(void)
5189{
Victor Stinner50b48572018-11-01 01:51:40 +01005190 PyThreadState *tstate = _PyThreadState_GET();
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08005191 return tstate->coroutine_origin_tracking_depth;
5192}
5193
Zackery Spytz79ceccd2020-03-26 06:11:13 -06005194int
Yury Selivanoveb636452016-09-08 22:01:51 -07005195_PyEval_SetAsyncGenFirstiter(PyObject *firstiter)
5196{
Victor Stinner50b48572018-11-01 01:51:40 +01005197 PyThreadState *tstate = _PyThreadState_GET();
Steve Dowerb82e17e2019-05-23 08:45:22 -07005198
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005199 if (_PySys_Audit(tstate, "sys.set_asyncgen_hook_firstiter", NULL) < 0) {
Zackery Spytz79ceccd2020-03-26 06:11:13 -06005200 return -1;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005201 }
5202
Yury Selivanoveb636452016-09-08 22:01:51 -07005203 Py_XINCREF(firstiter);
5204 Py_XSETREF(tstate->async_gen_firstiter, firstiter);
Zackery Spytz79ceccd2020-03-26 06:11:13 -06005205 return 0;
Yury Selivanoveb636452016-09-08 22:01:51 -07005206}
5207
5208PyObject *
5209_PyEval_GetAsyncGenFirstiter(void)
5210{
Victor Stinner50b48572018-11-01 01:51:40 +01005211 PyThreadState *tstate = _PyThreadState_GET();
Yury Selivanoveb636452016-09-08 22:01:51 -07005212 return tstate->async_gen_firstiter;
5213}
5214
Zackery Spytz79ceccd2020-03-26 06:11:13 -06005215int
Yury Selivanoveb636452016-09-08 22:01:51 -07005216_PyEval_SetAsyncGenFinalizer(PyObject *finalizer)
5217{
Victor Stinner50b48572018-11-01 01:51:40 +01005218 PyThreadState *tstate = _PyThreadState_GET();
Steve Dowerb82e17e2019-05-23 08:45:22 -07005219
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005220 if (_PySys_Audit(tstate, "sys.set_asyncgen_hook_finalizer", NULL) < 0) {
Zackery Spytz79ceccd2020-03-26 06:11:13 -06005221 return -1;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005222 }
5223
Yury Selivanoveb636452016-09-08 22:01:51 -07005224 Py_XINCREF(finalizer);
5225 Py_XSETREF(tstate->async_gen_finalizer, finalizer);
Zackery Spytz79ceccd2020-03-26 06:11:13 -06005226 return 0;
Yury Selivanoveb636452016-09-08 22:01:51 -07005227}
5228
5229PyObject *
5230_PyEval_GetAsyncGenFinalizer(void)
5231{
Victor Stinner50b48572018-11-01 01:51:40 +01005232 PyThreadState *tstate = _PyThreadState_GET();
Yury Selivanoveb636452016-09-08 22:01:51 -07005233 return tstate->async_gen_finalizer;
5234}
5235
Victor Stinner438a12d2019-05-24 17:01:38 +02005236PyFrameObject *
5237PyEval_GetFrame(void)
5238{
5239 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner6723e932020-03-20 17:46:56 +01005240 return tstate->frame;
Victor Stinner438a12d2019-05-24 17:01:38 +02005241}
5242
Guido van Rossumb209a111997-04-29 18:18:01 +00005243PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005244PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00005245{
Victor Stinner438a12d2019-05-24 17:01:38 +02005246 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner6723e932020-03-20 17:46:56 +01005247 PyFrameObject *current_frame = tstate->frame;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005248 if (current_frame == NULL)
Victor Stinner438a12d2019-05-24 17:01:38 +02005249 return tstate->interp->builtins;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005250 else
5251 return current_frame->f_builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00005252}
5253
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02005254/* Convenience function to get a builtin from its name */
5255PyObject *
5256_PyEval_GetBuiltinId(_Py_Identifier *name)
5257{
Victor Stinner438a12d2019-05-24 17:01:38 +02005258 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02005259 PyObject *attr = _PyDict_GetItemIdWithError(PyEval_GetBuiltins(), name);
5260 if (attr) {
5261 Py_INCREF(attr);
5262 }
Victor Stinner438a12d2019-05-24 17:01:38 +02005263 else if (!_PyErr_Occurred(tstate)) {
5264 _PyErr_SetObject(tstate, PyExc_AttributeError, _PyUnicode_FromId(name));
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02005265 }
5266 return attr;
5267}
5268
Guido van Rossumb209a111997-04-29 18:18:01 +00005269PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005270PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00005271{
Victor Stinner438a12d2019-05-24 17:01:38 +02005272 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner6723e932020-03-20 17:46:56 +01005273 PyFrameObject *current_frame = tstate->frame;
Victor Stinner41bb43a2013-10-29 01:19:37 +01005274 if (current_frame == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005275 _PyErr_SetString(tstate, PyExc_SystemError, "frame does not exist");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005276 return NULL;
Victor Stinner41bb43a2013-10-29 01:19:37 +01005277 }
5278
Victor Stinner438a12d2019-05-24 17:01:38 +02005279 if (PyFrame_FastToLocalsWithError(current_frame) < 0) {
Victor Stinner41bb43a2013-10-29 01:19:37 +01005280 return NULL;
Victor Stinner438a12d2019-05-24 17:01:38 +02005281 }
Victor Stinner41bb43a2013-10-29 01:19:37 +01005282
5283 assert(current_frame->f_locals != NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005284 return current_frame->f_locals;
Guido van Rossum5b722181993-03-30 17:46:03 +00005285}
5286
Guido van Rossumb209a111997-04-29 18:18:01 +00005287PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005288PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00005289{
Victor Stinner438a12d2019-05-24 17:01:38 +02005290 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner6723e932020-03-20 17:46:56 +01005291 PyFrameObject *current_frame = tstate->frame;
Victor Stinner438a12d2019-05-24 17:01:38 +02005292 if (current_frame == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005293 return NULL;
Victor Stinner438a12d2019-05-24 17:01:38 +02005294 }
Victor Stinner41bb43a2013-10-29 01:19:37 +01005295
5296 assert(current_frame->f_globals != NULL);
5297 return current_frame->f_globals;
Guido van Rossum3f5da241990-12-20 15:06:42 +00005298}
5299
Guido van Rossum6135a871995-01-09 17:53:26 +00005300int
Tim Peters5ba58662001-07-16 02:29:45 +00005301PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
Jeremy Hylton061d1062001-03-22 02:32:48 +00005302{
Victor Stinner438a12d2019-05-24 17:01:38 +02005303 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner6723e932020-03-20 17:46:56 +01005304 PyFrameObject *current_frame = tstate->frame;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005305 int result = cf->cf_flags != 0;
Tim Peters5ba58662001-07-16 02:29:45 +00005306
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005307 if (current_frame != NULL) {
5308 const int codeflags = current_frame->f_code->co_flags;
5309 const int compilerflags = codeflags & PyCF_MASK;
5310 if (compilerflags) {
5311 result = 1;
5312 cf->cf_flags |= compilerflags;
5313 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00005314#if 0 /* future keyword */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005315 if (codeflags & CO_GENERATOR_ALLOWED) {
5316 result = 1;
5317 cf->cf_flags |= CO_GENERATOR_ALLOWED;
5318 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00005319#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005320 }
5321 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00005322}
5323
Guido van Rossum3f5da241990-12-20 15:06:42 +00005324
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00005325const char *
Tim Peters6d6c1a32001-08-02 04:15:00 +00005326PyEval_GetFuncName(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00005327{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005328 if (PyMethod_Check(func))
5329 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
5330 else if (PyFunction_Check(func))
Serhiy Storchaka06515832016-11-20 09:13:07 +02005331 return PyUnicode_AsUTF8(((PyFunctionObject*)func)->func_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005332 else if (PyCFunction_Check(func))
5333 return ((PyCFunctionObject*)func)->m_ml->ml_name;
5334 else
Victor Stinnera102ed72020-02-07 02:24:48 +01005335 return Py_TYPE(func)->tp_name;
Jeremy Hylton512a2372001-04-11 13:52:29 +00005336}
5337
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00005338const char *
Tim Peters6d6c1a32001-08-02 04:15:00 +00005339PyEval_GetFuncDesc(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00005340{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005341 if (PyMethod_Check(func))
5342 return "()";
5343 else if (PyFunction_Check(func))
5344 return "()";
5345 else if (PyCFunction_Check(func))
5346 return "()";
5347 else
5348 return " object";
Jeremy Hylton512a2372001-04-11 13:52:29 +00005349}
5350
Armin Rigo1c2d7e52005-09-20 18:34:01 +00005351#define C_TRACE(x, call) \
Nicholas Bastind858a772004-06-25 23:31:06 +00005352if (tstate->use_tracing && tstate->c_profilefunc) { \
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005353 if (call_trace(tstate->c_profilefunc, tstate->c_profileobj, \
Mark Shannon86433452021-01-07 16:49:02 +00005354 tstate, tstate->frame, bounds, \
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005355 PyTrace_C_CALL, func)) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005356 x = NULL; \
5357 } \
5358 else { \
5359 x = call; \
5360 if (tstate->c_profilefunc != NULL) { \
5361 if (x == NULL) { \
5362 call_trace_protected(tstate->c_profilefunc, \
5363 tstate->c_profileobj, \
Mark Shannon86433452021-01-07 16:49:02 +00005364 tstate, tstate->frame, bounds, \
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005365 PyTrace_C_EXCEPTION, func); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005366 /* XXX should pass (type, value, tb) */ \
5367 } else { \
5368 if (call_trace(tstate->c_profilefunc, \
5369 tstate->c_profileobj, \
Mark Shannon86433452021-01-07 16:49:02 +00005370 tstate, tstate->frame, bounds, \
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005371 PyTrace_C_RETURN, func)) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005372 Py_DECREF(x); \
5373 x = NULL; \
5374 } \
5375 } \
5376 } \
5377 } \
Nicholas Bastind858a772004-06-25 23:31:06 +00005378} else { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005379 x = call; \
5380 }
Nicholas Bastinc69ebe82004-03-24 21:57:10 +00005381
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005382
5383static PyObject *
5384trace_call_function(PyThreadState *tstate,
Mark Shannon86433452021-01-07 16:49:02 +00005385 PyCodeAddressRange *bounds,
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005386 PyObject *func,
5387 PyObject **args, Py_ssize_t nargs,
5388 PyObject *kwnames)
5389{
5390 PyObject *x;
scoder4c9ea092020-05-12 16:12:41 +02005391 if (PyCFunction_CheckExact(func) || PyCMethod_CheckExact(func)) {
Petr Viktorinffd97532020-02-11 17:46:57 +01005392 C_TRACE(x, PyObject_Vectorcall(func, args, nargs, kwnames));
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005393 return x;
5394 }
Andy Lesterdffe4c02020-03-04 07:15:20 -06005395 else if (Py_IS_TYPE(func, &PyMethodDescr_Type) && nargs > 0) {
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005396 /* We need to create a temporary bound method as argument
5397 for profiling.
5398
5399 If nargs == 0, then this cannot work because we have no
5400 "self". In any case, the call itself would raise
5401 TypeError (foo needs an argument), so we just skip
5402 profiling. */
5403 PyObject *self = args[0];
5404 func = Py_TYPE(func)->tp_descr_get(func, self, (PyObject*)Py_TYPE(self));
5405 if (func == NULL) {
5406 return NULL;
5407 }
Petr Viktorinffd97532020-02-11 17:46:57 +01005408 C_TRACE(x, PyObject_Vectorcall(func,
Jeroen Demeyer0d722f32019-07-05 14:48:24 +02005409 args+1, nargs-1,
5410 kwnames));
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005411 Py_DECREF(func);
5412 return x;
5413 }
Petr Viktorinffd97532020-02-11 17:46:57 +01005414 return PyObject_Vectorcall(func, args, nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames);
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005415}
5416
Victor Stinner415c5102017-01-11 00:54:57 +01005417/* Issue #29227: Inline call_function() into _PyEval_EvalFrameDefault()
5418 to reduce the stack consumption. */
5419Py_LOCAL_INLINE(PyObject *) _Py_HOT_FUNCTION
Mark Shannon86433452021-01-07 16:49:02 +00005420call_function(PyThreadState *tstate,
5421 PyCodeAddressRange *bounds,
5422 PyObject ***pp_stack,
5423 Py_ssize_t oparg,
5424 PyObject *kwnames)
Jeremy Hyltone8c04322002-08-16 17:47:26 +00005425{
Victor Stinnerf9b760f2016-09-09 10:17:08 -07005426 PyObject **pfunc = (*pp_stack) - oparg - 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005427 PyObject *func = *pfunc;
5428 PyObject *x, *w;
Victor Stinnerd8735722016-09-09 12:36:44 -07005429 Py_ssize_t nkwargs = (kwnames == NULL) ? 0 : PyTuple_GET_SIZE(kwnames);
5430 Py_ssize_t nargs = oparg - nkwargs;
INADA Naoki5566bbb2017-02-03 07:43:03 +09005431 PyObject **stack = (*pp_stack) - nargs - nkwargs;
Jeremy Hyltone8c04322002-08-16 17:47:26 +00005432
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005433 if (tstate->use_tracing) {
Mark Shannon86433452021-01-07 16:49:02 +00005434 x = trace_call_function(tstate, bounds, func, stack, nargs, kwnames);
INADA Naoki5566bbb2017-02-03 07:43:03 +09005435 }
Victor Stinner4a7cc882015-03-06 23:35:27 +01005436 else {
Petr Viktorinffd97532020-02-11 17:46:57 +01005437 x = PyObject_Vectorcall(func, stack, nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005438 }
Tim Peters8a5c3c72004-04-05 19:36:21 +00005439
Victor Stinner438a12d2019-05-24 17:01:38 +02005440 assert((x != NULL) ^ (_PyErr_Occurred(tstate) != NULL));
Victor Stinnerf9b760f2016-09-09 10:17:08 -07005441
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01005442 /* Clear the stack of the function object. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005443 while ((*pp_stack) > pfunc) {
5444 w = EXT_POP(*pp_stack);
5445 Py_DECREF(w);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005446 }
Victor Stinnerace47d72013-07-18 01:41:08 +02005447
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005448 return x;
Jeremy Hyltone8c04322002-08-16 17:47:26 +00005449}
5450
Jeremy Hylton52820442001-01-03 23:52:36 +00005451static PyObject *
Mark Shannon86433452021-01-07 16:49:02 +00005452do_call_core(PyThreadState *tstate,
5453 PyCodeAddressRange *bounds,
5454 PyObject *func,
5455 PyObject *callargs,
5456 PyObject *kwdict)
Jeremy Hylton52820442001-01-03 23:52:36 +00005457{
jdemeyere89de732018-09-19 12:06:20 +02005458 PyObject *result;
5459
scoder4c9ea092020-05-12 16:12:41 +02005460 if (PyCFunction_CheckExact(func) || PyCMethod_CheckExact(func)) {
Jeroen Demeyer7a6873c2019-09-11 13:01:01 +02005461 C_TRACE(result, PyObject_Call(func, callargs, kwdict));
Victor Stinnerf9b760f2016-09-09 10:17:08 -07005462 return result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005463 }
Andy Lesterdffe4c02020-03-04 07:15:20 -06005464 else if (Py_IS_TYPE(func, &PyMethodDescr_Type)) {
jdemeyere89de732018-09-19 12:06:20 +02005465 Py_ssize_t nargs = PyTuple_GET_SIZE(callargs);
5466 if (nargs > 0 && tstate->use_tracing) {
5467 /* We need to create a temporary bound method as argument
5468 for profiling.
5469
5470 If nargs == 0, then this cannot work because we have no
5471 "self". In any case, the call itself would raise
5472 TypeError (foo needs an argument), so we just skip
5473 profiling. */
5474 PyObject *self = PyTuple_GET_ITEM(callargs, 0);
5475 func = Py_TYPE(func)->tp_descr_get(func, self, (PyObject*)Py_TYPE(self));
5476 if (func == NULL) {
5477 return NULL;
5478 }
5479
Victor Stinner4d231bc2019-11-14 13:36:21 +01005480 C_TRACE(result, _PyObject_FastCallDictTstate(
5481 tstate, func,
5482 &_PyTuple_ITEMS(callargs)[1],
5483 nargs - 1,
5484 kwdict));
jdemeyere89de732018-09-19 12:06:20 +02005485 Py_DECREF(func);
5486 return result;
5487 }
Victor Stinner74319ae2016-08-25 00:04:09 +02005488 }
jdemeyere89de732018-09-19 12:06:20 +02005489 return PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00005490}
5491
Serhiy Storchaka483405b2015-02-17 10:14:30 +02005492/* Extract a slice index from a PyLong or an object with the
Guido van Rossum38fff8c2006-03-07 18:50:55 +00005493 nb_index slot defined, and store in *pi.
5494 Silently reduce values larger than PY_SSIZE_T_MAX to PY_SSIZE_T_MAX,
Xiang Zhang2ddf5a12017-05-10 18:19:41 +08005495 and silently boost values less than PY_SSIZE_T_MIN to PY_SSIZE_T_MIN.
Martin v. Löwisdde99d22006-02-17 15:57:41 +00005496 Return 0 on error, 1 on success.
Tim Peterscb479e72001-12-16 19:11:44 +00005497*/
Guido van Rossum20c6add2000-05-08 14:06:50 +00005498int
Martin v. Löwis18e16552006-02-15 17:27:45 +00005499_PyEval_SliceIndex(PyObject *v, Py_ssize_t *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005500{
Victor Stinner438a12d2019-05-24 17:01:38 +02005501 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005502 if (v != Py_None) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005503 Py_ssize_t x;
Victor Stinnera15e2602020-04-08 02:01:56 +02005504 if (_PyIndex_Check(v)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005505 x = PyNumber_AsSsize_t(v, NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02005506 if (x == -1 && _PyErr_Occurred(tstate))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005507 return 0;
5508 }
5509 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02005510 _PyErr_SetString(tstate, PyExc_TypeError,
5511 "slice indices must be integers or "
5512 "None or have an __index__ method");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005513 return 0;
5514 }
5515 *pi = x;
5516 }
5517 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005518}
5519
Serhiy Storchaka80ec8362017-03-19 19:37:40 +02005520int
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005521_PyEval_SliceIndexNotNone(PyObject *v, Py_ssize_t *pi)
Serhiy Storchaka80ec8362017-03-19 19:37:40 +02005522{
Victor Stinner438a12d2019-05-24 17:01:38 +02005523 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005524 Py_ssize_t x;
Victor Stinnera15e2602020-04-08 02:01:56 +02005525 if (_PyIndex_Check(v)) {
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005526 x = PyNumber_AsSsize_t(v, NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02005527 if (x == -1 && _PyErr_Occurred(tstate))
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005528 return 0;
5529 }
5530 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02005531 _PyErr_SetString(tstate, PyExc_TypeError,
5532 "slice indices must be integers or "
5533 "have an __index__ method");
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005534 return 0;
5535 }
5536 *pi = x;
5537 return 1;
Serhiy Storchaka80ec8362017-03-19 19:37:40 +02005538}
5539
Thomas Wouters52152252000-08-17 22:55:00 +00005540static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02005541import_name(PyThreadState *tstate, PyFrameObject *f,
5542 PyObject *name, PyObject *fromlist, PyObject *level)
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005543{
5544 _Py_IDENTIFIER(__import__);
Victor Stinnerdf142fd2016-08-20 00:44:42 +02005545 PyObject *import_func, *res;
5546 PyObject* stack[5];
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005547
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02005548 import_func = _PyDict_GetItemIdWithError(f->f_builtins, &PyId___import__);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005549 if (import_func == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005550 if (!_PyErr_Occurred(tstate)) {
5551 _PyErr_SetString(tstate, PyExc_ImportError, "__import__ not found");
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02005552 }
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005553 return NULL;
5554 }
5555
5556 /* Fast path for not overloaded __import__. */
Victor Stinner438a12d2019-05-24 17:01:38 +02005557 if (import_func == tstate->interp->import_func) {
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005558 int ilevel = _PyLong_AsInt(level);
Victor Stinner438a12d2019-05-24 17:01:38 +02005559 if (ilevel == -1 && _PyErr_Occurred(tstate)) {
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005560 return NULL;
5561 }
5562 res = PyImport_ImportModuleLevelObject(
5563 name,
5564 f->f_globals,
5565 f->f_locals == NULL ? Py_None : f->f_locals,
5566 fromlist,
5567 ilevel);
5568 return res;
5569 }
5570
5571 Py_INCREF(import_func);
Victor Stinnerdf142fd2016-08-20 00:44:42 +02005572
5573 stack[0] = name;
5574 stack[1] = f->f_globals;
5575 stack[2] = f->f_locals == NULL ? Py_None : f->f_locals;
5576 stack[3] = fromlist;
5577 stack[4] = level;
Victor Stinner559bb6a2016-08-22 22:48:54 +02005578 res = _PyObject_FastCall(import_func, stack, 5);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005579 Py_DECREF(import_func);
5580 return res;
5581}
5582
5583static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02005584import_from(PyThreadState *tstate, PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00005585{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005586 PyObject *x;
Xiang Zhang4830f582017-03-21 11:13:42 +08005587 PyObject *fullmodname, *pkgname, *pkgpath, *pkgname_or_unknown, *errmsg;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00005588
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005589 if (_PyObject_LookupAttr(v, name, &x) != 0) {
Antoine Pitrou0373a102014-10-13 20:19:45 +02005590 return x;
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005591 }
Antoine Pitrou0373a102014-10-13 20:19:45 +02005592 /* Issue #17636: in case this failed because of a circular relative
5593 import, try to fallback on reading the module directly from
5594 sys.modules. */
Antoine Pitrou0373a102014-10-13 20:19:45 +02005595 pkgname = _PyObject_GetAttrId(v, &PyId___name__);
Brett Cannon3008bc02015-08-11 18:01:31 -07005596 if (pkgname == NULL) {
5597 goto error;
5598 }
Oren Milman6db70332017-09-19 14:23:01 +03005599 if (!PyUnicode_Check(pkgname)) {
5600 Py_CLEAR(pkgname);
5601 goto error;
5602 }
Antoine Pitrou0373a102014-10-13 20:19:45 +02005603 fullmodname = PyUnicode_FromFormat("%U.%U", pkgname, name);
Brett Cannon3008bc02015-08-11 18:01:31 -07005604 if (fullmodname == NULL) {
Xiang Zhang4830f582017-03-21 11:13:42 +08005605 Py_DECREF(pkgname);
Antoine Pitrou0373a102014-10-13 20:19:45 +02005606 return NULL;
Brett Cannon3008bc02015-08-11 18:01:31 -07005607 }
Eric Snow3f9eee62017-09-15 16:35:20 -06005608 x = PyImport_GetModule(fullmodname);
Antoine Pitrou0373a102014-10-13 20:19:45 +02005609 Py_DECREF(fullmodname);
Victor Stinner438a12d2019-05-24 17:01:38 +02005610 if (x == NULL && !_PyErr_Occurred(tstate)) {
Brett Cannon3008bc02015-08-11 18:01:31 -07005611 goto error;
5612 }
Matthias Bussonnier1bc15642017-02-22 07:06:50 -08005613 Py_DECREF(pkgname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005614 return x;
Brett Cannon3008bc02015-08-11 18:01:31 -07005615 error:
Matthias Bussonnierbc4bed42017-02-14 16:05:25 -08005616 pkgpath = PyModule_GetFilenameObject(v);
Matthias Bussonnier1bc15642017-02-22 07:06:50 -08005617 if (pkgname == NULL) {
5618 pkgname_or_unknown = PyUnicode_FromString("<unknown module name>");
5619 if (pkgname_or_unknown == NULL) {
5620 Py_XDECREF(pkgpath);
5621 return NULL;
5622 }
5623 } else {
5624 pkgname_or_unknown = pkgname;
5625 }
Matthias Bussonnierbc4bed42017-02-14 16:05:25 -08005626
5627 if (pkgpath == NULL || !PyUnicode_Check(pkgpath)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005628 _PyErr_Clear(tstate);
Xiang Zhang4830f582017-03-21 11:13:42 +08005629 errmsg = PyUnicode_FromFormat(
5630 "cannot import name %R from %R (unknown location)",
5631 name, pkgname_or_unknown
5632 );
Stefan Krah027b09c2019-03-25 21:50:58 +01005633 /* NULL checks for errmsg and pkgname done by PyErr_SetImportError. */
Xiang Zhang4830f582017-03-21 11:13:42 +08005634 PyErr_SetImportError(errmsg, pkgname, NULL);
5635 }
5636 else {
Anthony Sottile65366bc2019-09-09 08:17:50 -07005637 _Py_IDENTIFIER(__spec__);
5638 PyObject *spec = _PyObject_GetAttrId(v, &PyId___spec__);
Anthony Sottile65366bc2019-09-09 08:17:50 -07005639 const char *fmt =
5640 _PyModuleSpec_IsInitializing(spec) ?
5641 "cannot import name %R from partially initialized module %R "
5642 "(most likely due to a circular import) (%S)" :
5643 "cannot import name %R from %R (%S)";
5644 Py_XDECREF(spec);
5645
5646 errmsg = PyUnicode_FromFormat(fmt, name, pkgname_or_unknown, pkgpath);
Stefan Krah027b09c2019-03-25 21:50:58 +01005647 /* NULL checks for errmsg and pkgname done by PyErr_SetImportError. */
Xiang Zhang4830f582017-03-21 11:13:42 +08005648 PyErr_SetImportError(errmsg, pkgname, pkgpath);
Matthias Bussonnierbc4bed42017-02-14 16:05:25 -08005649 }
5650
Xiang Zhang4830f582017-03-21 11:13:42 +08005651 Py_XDECREF(errmsg);
Matthias Bussonnier1bc15642017-02-22 07:06:50 -08005652 Py_XDECREF(pkgname_or_unknown);
5653 Py_XDECREF(pkgpath);
Brett Cannon3008bc02015-08-11 18:01:31 -07005654 return NULL;
Thomas Wouters52152252000-08-17 22:55:00 +00005655}
Guido van Rossumac7be682001-01-17 15:42:30 +00005656
Thomas Wouters52152252000-08-17 22:55:00 +00005657static int
Victor Stinner438a12d2019-05-24 17:01:38 +02005658import_all_from(PyThreadState *tstate, PyObject *locals, PyObject *v)
Thomas Wouters52152252000-08-17 22:55:00 +00005659{
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02005660 _Py_IDENTIFIER(__all__);
5661 _Py_IDENTIFIER(__dict__);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005662 PyObject *all, *dict, *name, *value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005663 int skip_leading_underscores = 0;
5664 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00005665
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005666 if (_PyObject_LookupAttrId(v, &PyId___all__, &all) < 0) {
5667 return -1; /* Unexpected error */
5668 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005669 if (all == NULL) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005670 if (_PyObject_LookupAttrId(v, &PyId___dict__, &dict) < 0) {
5671 return -1;
5672 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005673 if (dict == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005674 _PyErr_SetString(tstate, PyExc_ImportError,
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005675 "from-import-* object has no __dict__ and no __all__");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005676 return -1;
5677 }
5678 all = PyMapping_Keys(dict);
5679 Py_DECREF(dict);
5680 if (all == NULL)
5681 return -1;
5682 skip_leading_underscores = 1;
5683 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00005684
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005685 for (pos = 0, err = 0; ; pos++) {
5686 name = PySequence_GetItem(all, pos);
5687 if (name == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005688 if (!_PyErr_ExceptionMatches(tstate, PyExc_IndexError)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005689 err = -1;
Victor Stinner438a12d2019-05-24 17:01:38 +02005690 }
5691 else {
5692 _PyErr_Clear(tstate);
5693 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005694 break;
5695 }
Xiang Zhangd8b291a2018-03-24 18:39:36 +08005696 if (!PyUnicode_Check(name)) {
5697 PyObject *modname = _PyObject_GetAttrId(v, &PyId___name__);
5698 if (modname == NULL) {
5699 Py_DECREF(name);
5700 err = -1;
5701 break;
5702 }
5703 if (!PyUnicode_Check(modname)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005704 _PyErr_Format(tstate, PyExc_TypeError,
5705 "module __name__ must be a string, not %.100s",
5706 Py_TYPE(modname)->tp_name);
Xiang Zhangd8b291a2018-03-24 18:39:36 +08005707 }
5708 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02005709 _PyErr_Format(tstate, PyExc_TypeError,
5710 "%s in %U.%s must be str, not %.100s",
5711 skip_leading_underscores ? "Key" : "Item",
5712 modname,
5713 skip_leading_underscores ? "__dict__" : "__all__",
5714 Py_TYPE(name)->tp_name);
Xiang Zhangd8b291a2018-03-24 18:39:36 +08005715 }
5716 Py_DECREF(modname);
5717 Py_DECREF(name);
5718 err = -1;
5719 break;
5720 }
5721 if (skip_leading_underscores) {
Serhiy Storchakae3b2b4b2017-09-08 09:58:51 +03005722 if (PyUnicode_READY(name) == -1) {
5723 Py_DECREF(name);
5724 err = -1;
5725 break;
5726 }
5727 if (PyUnicode_READ_CHAR(name, 0) == '_') {
5728 Py_DECREF(name);
5729 continue;
5730 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005731 }
5732 value = PyObject_GetAttr(v, name);
5733 if (value == NULL)
5734 err = -1;
5735 else if (PyDict_CheckExact(locals))
5736 err = PyDict_SetItem(locals, name, value);
5737 else
5738 err = PyObject_SetItem(locals, name, value);
5739 Py_DECREF(name);
5740 Py_XDECREF(value);
5741 if (err != 0)
5742 break;
5743 }
5744 Py_DECREF(all);
5745 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00005746}
5747
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005748static int
Victor Stinner438a12d2019-05-24 17:01:38 +02005749check_args_iterable(PyThreadState *tstate, PyObject *func, PyObject *args)
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005750{
Victor Stinnera102ed72020-02-07 02:24:48 +01005751 if (Py_TYPE(args)->tp_iter == NULL && !PySequence_Check(args)) {
Jeroen Demeyerbf17d412019-11-05 16:48:04 +01005752 /* check_args_iterable() may be called with a live exception:
5753 * clear it to prevent calling _PyObject_FunctionStr() with an
5754 * exception set. */
Victor Stinner61f4db82020-01-28 03:37:45 +01005755 _PyErr_Clear(tstate);
Jeroen Demeyerbf17d412019-11-05 16:48:04 +01005756 PyObject *funcstr = _PyObject_FunctionStr(func);
5757 if (funcstr != NULL) {
5758 _PyErr_Format(tstate, PyExc_TypeError,
5759 "%U argument after * must be an iterable, not %.200s",
5760 funcstr, Py_TYPE(args)->tp_name);
5761 Py_DECREF(funcstr);
5762 }
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005763 return -1;
5764 }
5765 return 0;
5766}
5767
5768static void
Victor Stinner438a12d2019-05-24 17:01:38 +02005769format_kwargs_error(PyThreadState *tstate, PyObject *func, PyObject *kwargs)
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005770{
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005771 /* _PyDict_MergeEx raises attribute
5772 * error (percolated from an attempt
5773 * to get 'keys' attribute) instead of
5774 * a type error if its second argument
5775 * is not a mapping.
5776 */
Victor Stinner438a12d2019-05-24 17:01:38 +02005777 if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) {
Victor Stinner61f4db82020-01-28 03:37:45 +01005778 _PyErr_Clear(tstate);
Jeroen Demeyerbf17d412019-11-05 16:48:04 +01005779 PyObject *funcstr = _PyObject_FunctionStr(func);
5780 if (funcstr != NULL) {
5781 _PyErr_Format(
5782 tstate, PyExc_TypeError,
5783 "%U argument after ** must be a mapping, not %.200s",
5784 funcstr, Py_TYPE(kwargs)->tp_name);
5785 Py_DECREF(funcstr);
5786 }
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005787 }
Victor Stinner438a12d2019-05-24 17:01:38 +02005788 else if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005789 PyObject *exc, *val, *tb;
Victor Stinner438a12d2019-05-24 17:01:38 +02005790 _PyErr_Fetch(tstate, &exc, &val, &tb);
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005791 if (val && PyTuple_Check(val) && PyTuple_GET_SIZE(val) == 1) {
Victor Stinner61f4db82020-01-28 03:37:45 +01005792 _PyErr_Clear(tstate);
Jeroen Demeyerbf17d412019-11-05 16:48:04 +01005793 PyObject *funcstr = _PyObject_FunctionStr(func);
5794 if (funcstr != NULL) {
5795 PyObject *key = PyTuple_GET_ITEM(val, 0);
5796 _PyErr_Format(
5797 tstate, PyExc_TypeError,
5798 "%U got multiple values for keyword argument '%S'",
5799 funcstr, key);
5800 Py_DECREF(funcstr);
5801 }
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005802 Py_XDECREF(exc);
5803 Py_XDECREF(val);
5804 Py_XDECREF(tb);
5805 }
5806 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02005807 _PyErr_Restore(tstate, exc, val, tb);
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005808 }
5809 }
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005810}
5811
Guido van Rossumac7be682001-01-17 15:42:30 +00005812static void
Victor Stinner438a12d2019-05-24 17:01:38 +02005813format_exc_check_arg(PyThreadState *tstate, PyObject *exc,
5814 const char *format_str, PyObject *obj)
Paul Prescode68140d2000-08-30 20:25:01 +00005815{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005816 const char *obj_str;
Paul Prescode68140d2000-08-30 20:25:01 +00005817
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005818 if (!obj)
5819 return;
Paul Prescode68140d2000-08-30 20:25:01 +00005820
Serhiy Storchaka06515832016-11-20 09:13:07 +02005821 obj_str = PyUnicode_AsUTF8(obj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005822 if (!obj_str)
5823 return;
Paul Prescode68140d2000-08-30 20:25:01 +00005824
Victor Stinner438a12d2019-05-24 17:01:38 +02005825 _PyErr_Format(tstate, exc, format_str, obj_str);
Paul Prescode68140d2000-08-30 20:25:01 +00005826}
Guido van Rossum950361c1997-01-24 13:49:28 +00005827
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005828static void
Victor Stinner438a12d2019-05-24 17:01:38 +02005829format_exc_unbound(PyThreadState *tstate, PyCodeObject *co, int oparg)
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005830{
5831 PyObject *name;
5832 /* Don't stomp existing exception */
Victor Stinner438a12d2019-05-24 17:01:38 +02005833 if (_PyErr_Occurred(tstate))
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005834 return;
5835 if (oparg < PyTuple_GET_SIZE(co->co_cellvars)) {
5836 name = PyTuple_GET_ITEM(co->co_cellvars,
5837 oparg);
Victor Stinner438a12d2019-05-24 17:01:38 +02005838 format_exc_check_arg(tstate,
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005839 PyExc_UnboundLocalError,
5840 UNBOUNDLOCAL_ERROR_MSG,
5841 name);
5842 } else {
5843 name = PyTuple_GET_ITEM(co->co_freevars, oparg -
5844 PyTuple_GET_SIZE(co->co_cellvars));
Victor Stinner438a12d2019-05-24 17:01:38 +02005845 format_exc_check_arg(tstate, PyExc_NameError,
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005846 UNBOUNDFREE_ERROR_MSG, name);
5847 }
5848}
5849
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03005850static void
Mark Shannonfee55262019-11-21 09:11:43 +00005851format_awaitable_error(PyThreadState *tstate, PyTypeObject *type, int prevprevopcode, int prevopcode)
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03005852{
5853 if (type->tp_as_async == NULL || type->tp_as_async->am_await == NULL) {
5854 if (prevopcode == BEFORE_ASYNC_WITH) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005855 _PyErr_Format(tstate, PyExc_TypeError,
5856 "'async with' received an object from __aenter__ "
5857 "that does not implement __await__: %.100s",
5858 type->tp_name);
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03005859 }
Mark Shannonfee55262019-11-21 09:11:43 +00005860 else if (prevopcode == WITH_EXCEPT_START || (prevopcode == CALL_FUNCTION && prevprevopcode == DUP_TOP)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005861 _PyErr_Format(tstate, PyExc_TypeError,
5862 "'async with' received an object from __aexit__ "
5863 "that does not implement __await__: %.100s",
5864 type->tp_name);
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03005865 }
5866 }
5867}
5868
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005869static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02005870unicode_concatenate(PyThreadState *tstate, PyObject *v, PyObject *w,
Serhiy Storchakaab874002016-09-11 13:48:15 +03005871 PyFrameObject *f, const _Py_CODEUNIT *next_instr)
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005872{
5873 PyObject *res;
5874 if (Py_REFCNT(v) == 2) {
5875 /* In the common case, there are 2 references to the value
5876 * stored in 'variable' when the += is performed: one on the
5877 * value stack (in 'v') and one still stored in the
5878 * 'variable'. We try to delete the variable now to reduce
5879 * the refcnt to 1.
5880 */
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03005881 int opcode, oparg;
5882 NEXTOPARG();
5883 switch (opcode) {
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005884 case STORE_FAST:
5885 {
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005886 PyObject **fastlocals = f->f_localsplus;
5887 if (GETLOCAL(oparg) == v)
5888 SETLOCAL(oparg, NULL);
5889 break;
5890 }
5891 case STORE_DEREF:
5892 {
5893 PyObject **freevars = (f->f_localsplus +
5894 f->f_code->co_nlocals);
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03005895 PyObject *c = freevars[oparg];
Raymond Hettingerc32f9db2016-11-12 04:10:35 -05005896 if (PyCell_GET(c) == v) {
5897 PyCell_SET(c, NULL);
5898 Py_DECREF(v);
5899 }
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005900 break;
5901 }
5902 case STORE_NAME:
5903 {
5904 PyObject *names = f->f_code->co_names;
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03005905 PyObject *name = GETITEM(names, oparg);
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005906 PyObject *locals = f->f_locals;
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02005907 if (locals && PyDict_CheckExact(locals)) {
5908 PyObject *w = PyDict_GetItemWithError(locals, name);
5909 if ((w == v && PyDict_DelItem(locals, name) != 0) ||
Victor Stinner438a12d2019-05-24 17:01:38 +02005910 (w == NULL && _PyErr_Occurred(tstate)))
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02005911 {
5912 Py_DECREF(v);
5913 return NULL;
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005914 }
5915 }
5916 break;
5917 }
5918 }
5919 }
5920 res = v;
5921 PyUnicode_Append(&res, w);
5922 return res;
5923}
5924
Guido van Rossum950361c1997-01-24 13:49:28 +00005925#ifdef DYNAMIC_EXECUTION_PROFILE
5926
Skip Montanarof118cb12001-10-15 20:51:38 +00005927static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005928getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00005929{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005930 int i;
5931 PyObject *l = PyList_New(256);
5932 if (l == NULL) return NULL;
5933 for (i = 0; i < 256; i++) {
5934 PyObject *x = PyLong_FromLong(a[i]);
5935 if (x == NULL) {
5936 Py_DECREF(l);
5937 return NULL;
5938 }
Zackery Spytz99d56b52018-12-08 07:16:55 -07005939 PyList_SET_ITEM(l, i, x);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005940 }
5941 for (i = 0; i < 256; i++)
5942 a[i] = 0;
5943 return l;
Guido van Rossum950361c1997-01-24 13:49:28 +00005944}
5945
5946PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005947_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00005948{
5949#ifndef DXPAIRS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005950 return getarray(dxp);
Guido van Rossum950361c1997-01-24 13:49:28 +00005951#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005952 int i;
5953 PyObject *l = PyList_New(257);
5954 if (l == NULL) return NULL;
5955 for (i = 0; i < 257; i++) {
5956 PyObject *x = getarray(dxpairs[i]);
5957 if (x == NULL) {
5958 Py_DECREF(l);
5959 return NULL;
5960 }
Zackery Spytz99d56b52018-12-08 07:16:55 -07005961 PyList_SET_ITEM(l, i, x);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005962 }
5963 return l;
Guido van Rossum950361c1997-01-24 13:49:28 +00005964#endif
5965}
5966
5967#endif
Brett Cannon5c4de282016-09-07 11:16:41 -07005968
5969Py_ssize_t
5970_PyEval_RequestCodeExtraIndex(freefunc free)
5971{
Victor Stinner81a7be32020-04-14 15:14:01 +02005972 PyInterpreterState *interp = _PyInterpreterState_GET();
Brett Cannon5c4de282016-09-07 11:16:41 -07005973 Py_ssize_t new_index;
5974
Dino Viehlandf3cffd22017-06-21 14:44:36 -07005975 if (interp->co_extra_user_count == MAX_CO_EXTRA_USERS - 1) {
Brett Cannon5c4de282016-09-07 11:16:41 -07005976 return -1;
5977 }
Dino Viehlandf3cffd22017-06-21 14:44:36 -07005978 new_index = interp->co_extra_user_count++;
5979 interp->co_extra_freefuncs[new_index] = free;
Brett Cannon5c4de282016-09-07 11:16:41 -07005980 return new_index;
5981}
Łukasz Langaa785c872016-09-09 17:37:37 -07005982
5983static void
5984dtrace_function_entry(PyFrameObject *f)
5985{
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02005986 const char *filename;
5987 const char *funcname;
Łukasz Langaa785c872016-09-09 17:37:37 -07005988 int lineno;
5989
Victor Stinner6d86a232020-04-29 00:56:58 +02005990 PyCodeObject *code = f->f_code;
5991 filename = PyUnicode_AsUTF8(code->co_filename);
5992 funcname = PyUnicode_AsUTF8(code->co_name);
5993 lineno = PyCode_Addr2Line(code, f->f_lasti);
Łukasz Langaa785c872016-09-09 17:37:37 -07005994
Andy Lestere6be9b52020-02-11 20:28:35 -06005995 PyDTrace_FUNCTION_ENTRY(filename, funcname, lineno);
Łukasz Langaa785c872016-09-09 17:37:37 -07005996}
5997
5998static void
5999dtrace_function_return(PyFrameObject *f)
6000{
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02006001 const char *filename;
6002 const char *funcname;
Łukasz Langaa785c872016-09-09 17:37:37 -07006003 int lineno;
6004
Victor Stinner6d86a232020-04-29 00:56:58 +02006005 PyCodeObject *code = f->f_code;
6006 filename = PyUnicode_AsUTF8(code->co_filename);
6007 funcname = PyUnicode_AsUTF8(code->co_name);
6008 lineno = PyCode_Addr2Line(code, f->f_lasti);
Łukasz Langaa785c872016-09-09 17:37:37 -07006009
Andy Lestere6be9b52020-02-11 20:28:35 -06006010 PyDTrace_FUNCTION_RETURN(filename, funcname, lineno);
Łukasz Langaa785c872016-09-09 17:37:37 -07006011}
6012
6013/* DTrace equivalent of maybe_call_line_trace. */
6014static void
6015maybe_dtrace_line(PyFrameObject *frame,
Mark Shannon877df852020-11-12 09:43:29 +00006016 PyCodeAddressRange *bounds, int *instr_prev)
Łukasz Langaa785c872016-09-09 17:37:37 -07006017{
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02006018 const char *co_filename, *co_name;
Łukasz Langaa785c872016-09-09 17:37:37 -07006019
6020 /* If the last instruction executed isn't in the current
6021 instruction window, reset the window.
6022 */
Mark Shannon877df852020-11-12 09:43:29 +00006023 int line = _PyCode_CheckLineNumber(frame->f_lasti, bounds);
Łukasz Langaa785c872016-09-09 17:37:37 -07006024 /* If the last instruction falls at the start of a line or if
6025 it represents a jump backwards, update the frame's line
6026 number and call the trace function. */
Mark Shannon877df852020-11-12 09:43:29 +00006027 if (line != frame->f_lineno || frame->f_lasti < *instr_prev) {
6028 if (line != -1) {
6029 frame->f_lineno = line;
6030 co_filename = PyUnicode_AsUTF8(frame->f_code->co_filename);
6031 if (!co_filename)
6032 co_filename = "?";
6033 co_name = PyUnicode_AsUTF8(frame->f_code->co_name);
6034 if (!co_name)
6035 co_name = "?";
6036 PyDTrace_LINE(co_filename, co_name, line);
6037 }
Łukasz Langaa785c872016-09-09 17:37:37 -07006038 }
6039 *instr_prev = frame->f_lasti;
6040}
Victor Stinnerf4b1e3d2019-11-04 19:48:34 +01006041
6042
6043/* Implement Py_EnterRecursiveCall() and Py_LeaveRecursiveCall() as functions
6044 for the limited API. */
6045
6046#undef Py_EnterRecursiveCall
6047
6048int Py_EnterRecursiveCall(const char *where)
6049{
Victor Stinnerbe434dc2019-11-05 00:51:22 +01006050 return _Py_EnterRecursiveCall_inline(where);
Victor Stinnerf4b1e3d2019-11-04 19:48:34 +01006051}
6052
6053#undef Py_LeaveRecursiveCall
6054
6055void Py_LeaveRecursiveCall(void)
6056{
Victor Stinnerbe434dc2019-11-05 00:51:22 +01006057 _Py_LeaveRecursiveCall_inline();
Victor Stinnerf4b1e3d2019-11-04 19:48:34 +01006058}