blob: 686250e1a8f9437d1a8db1d62fa81fa439e56cac [file] [log] [blame]
Guido van Rossum3f5da241990-12-20 15:06:42 +00001/* Execute compiled code */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002
Guido van Rossum681d79a1995-07-18 14:51:37 +00003/* XXX TO DO:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004 XXX speed up searching for keywords by using a dictionary
Guido van Rossum681d79a1995-07-18 14:51:37 +00005 XXX document it!
6 */
7
Thomas Wouters477c8d52006-05-27 19:21:47 +00008/* enable more aggressive intra-module optimizations, where available */
db3l131d5512021-03-03 22:09:48 -05009/* affects both release and debug builds - see bpo-43271 */
Thomas Wouters477c8d52006-05-27 19:21:47 +000010#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
Mark Shannon8e1b4062021-03-05 14:45:50 +000036typedef struct {
37 PyCodeObject *code; // The code object for the bounds. May be NULL.
Mark Shannon8e1b4062021-03-05 14:45:50 +000038 PyCodeAddressRange bounds; // Only valid if code != NULL.
Mark Shannon9e7b2072021-04-13 11:08:14 +010039 CFrame cframe;
Mark Shannon8e1b4062021-03-05 14:45:50 +000040} PyTraceInfo;
41
42
Guido van Rossum408027e1996-12-30 16:17:54 +000043#ifdef Py_DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000044/* For debugging the interpreter: */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000045#define LLTRACE 1 /* Low-level trace feature */
46#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000047#endif
48
Victor Stinner5c75f372019-04-17 23:02:26 +020049#if !defined(Py_BUILD_CORE)
50# error "ceval.c must be build with Py_BUILD_CORE define for best performance"
51#endif
52
Hai Shi46874c22020-01-30 17:20:25 -060053_Py_IDENTIFIER(__name__);
Guido van Rossum5b722181993-03-30 17:46:03 +000054
Guido van Rossum374a9221991-04-04 10:40:29 +000055/* Forward declarations */
Victor Stinner09532fe2019-05-10 23:39:09 +020056Py_LOCAL_INLINE(PyObject *) call_function(
Mark Shannon8e1b4062021-03-05 14:45:50 +000057 PyThreadState *tstate, PyTraceInfo *, PyObject ***pp_stack,
Victor Stinner09532fe2019-05-10 23:39:09 +020058 Py_ssize_t oparg, PyObject *kwnames);
59static PyObject * do_call_core(
Mark Shannon8e1b4062021-03-05 14:45:50 +000060 PyThreadState *tstate, PyTraceInfo *, PyObject *func,
Victor Stinner09532fe2019-05-10 23:39:09 +020061 PyObject *callargs, PyObject *kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +000062
Guido van Rossum0a066c01992-03-27 17:29:15 +000063#ifdef LLTRACE
Guido van Rossumc2e20742006-02-27 22:32:47 +000064static int lltrace;
Victor Stinner438a12d2019-05-24 17:01:38 +020065static int prtrace(PyThreadState *, PyObject *, const char *);
Guido van Rossum0a066c01992-03-27 17:29:15 +000066#endif
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +010067static int call_trace(Py_tracefunc, PyObject *,
68 PyThreadState *, PyFrameObject *,
Mark Shannon8e1b4062021-03-05 14:45:50 +000069 PyTraceInfo *,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000070 int, PyObject *);
Amaury Forgeot d'Arcf05149a2007-11-13 01:05:30 +000071static int call_trace_protected(Py_tracefunc, PyObject *,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +010072 PyThreadState *, PyFrameObject *,
Mark Shannon8e1b4062021-03-05 14:45:50 +000073 PyTraceInfo *,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +010074 int, PyObject *);
75static void call_exc_trace(Py_tracefunc, PyObject *,
Mark Shannon86433452021-01-07 16:49:02 +000076 PyThreadState *, PyFrameObject *,
Mark Shannon8e1b4062021-03-05 14:45:50 +000077 PyTraceInfo *trace_info);
Tim Peters8a5c3c72004-04-05 19:36:21 +000078static int maybe_call_line_trace(Py_tracefunc, PyObject *,
Eric Snow2ebc5ce2017-09-07 23:51:28 -060079 PyThreadState *, PyFrameObject *,
Mark Shannon9f2c63b2021-07-08 19:21:22 +010080 PyTraceInfo *, int);
81static void maybe_dtrace_line(PyFrameObject *, PyTraceInfo *, int);
Łukasz Langaa785c872016-09-09 17:37:37 -070082static void dtrace_function_entry(PyFrameObject *);
83static void dtrace_function_return(PyFrameObject *);
Michael W. Hudsondd32a912002-08-15 14:59:02 +000084
Victor Stinner438a12d2019-05-24 17:01:38 +020085static PyObject * import_name(PyThreadState *, PyFrameObject *,
86 PyObject *, PyObject *, PyObject *);
87static PyObject * import_from(PyThreadState *, PyObject *, PyObject *);
88static int import_all_from(PyThreadState *, PyObject *, PyObject *);
89static void format_exc_check_arg(PyThreadState *, PyObject *, const char *, PyObject *);
90static void format_exc_unbound(PyThreadState *tstate, PyCodeObject *co, int oparg);
91static PyObject * unicode_concatenate(PyThreadState *, PyObject *, PyObject *,
Serhiy Storchakaab874002016-09-11 13:48:15 +030092 PyFrameObject *, const _Py_CODEUNIT *);
Victor Stinner438a12d2019-05-24 17:01:38 +020093static PyObject * special_lookup(PyThreadState *, PyObject *, _Py_Identifier *);
94static int check_args_iterable(PyThreadState *, PyObject *func, PyObject *vararg);
95static void format_kwargs_error(PyThreadState *, PyObject *func, PyObject *kwargs);
Mark Shannonfee55262019-11-21 09:11:43 +000096static void format_awaitable_error(PyThreadState *, PyTypeObject *, int, int);
Guido van Rossum374a9221991-04-04 10:40:29 +000097
Paul Prescode68140d2000-08-30 20:25:01 +000098#define NAME_ERROR_MSG \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000099 "name '%.200s' is not defined"
Paul Prescode68140d2000-08-30 20:25:01 +0000100#define UNBOUNDLOCAL_ERROR_MSG \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000101 "local variable '%.200s' referenced before assignment"
Jeremy Hyltonc76770c2001-04-13 16:51:46 +0000102#define UNBOUNDFREE_ERROR_MSG \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000103 "free variable '%.200s' referenced before assignment" \
104 " in enclosing scope"
Guido van Rossum374a9221991-04-04 10:40:29 +0000105
Guido van Rossum950361c1997-01-24 13:49:28 +0000106/* Dynamic execution profile */
107#ifdef DYNAMIC_EXECUTION_PROFILE
108#ifdef DXPAIRS
109static long dxpairs[257][256];
110#define dxp dxpairs[256]
111#else
112static long dxp[256];
113#endif
114#endif
115
Inada Naoki91234a12019-06-03 21:30:58 +0900116/* per opcode cache */
Pablo Galindoaf5fa132021-02-28 22:41:09 +0000117static int opcache_min_runs = 1024; /* create opcache when code executed this many times */
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
Pablo Galindoaf5fa132021-02-28 22:41:09 +0000121// This function allows to deactivate the opcode cache. As different cache mechanisms may hold
122// references, this can mess with the reference leak detector functionality so the cache needs
123// to be deactivated in such scenarios to avoid false positives. See bpo-3714 for more information.
124void
125_PyEval_DeactivateOpCache(void)
126{
127 opcache_min_runs = 0;
128}
129
Inada Naoki91234a12019-06-03 21:30:58 +0900130#if OPCACHE_STATS
131static size_t opcache_code_objects = 0;
132static size_t opcache_code_objects_extra_mem = 0;
133
134static size_t opcache_global_opts = 0;
135static size_t opcache_global_hits = 0;
136static size_t opcache_global_misses = 0;
Pablo Galindo109826c2020-10-20 06:22:44 +0100137
138static size_t opcache_attr_opts = 0;
139static size_t opcache_attr_hits = 0;
140static size_t opcache_attr_misses = 0;
141static size_t opcache_attr_deopts = 0;
142static size_t opcache_attr_total = 0;
Inada Naoki91234a12019-06-03 21:30:58 +0900143#endif
144
Victor Stinner5a3a71d2020-03-19 17:40:12 +0100145
Victor Stinnerda2914d2020-03-20 09:29:08 +0100146#ifndef NDEBUG
147/* Ensure that tstate is valid: sanity check for PyEval_AcquireThread() and
148 PyEval_RestoreThread(). Detect if tstate memory was freed. It can happen
149 when a thread continues to run after Python finalization, especially
150 daemon threads. */
151static int
152is_tstate_valid(PyThreadState *tstate)
153{
154 assert(!_PyMem_IsPtrFreed(tstate));
155 assert(!_PyMem_IsPtrFreed(tstate->interp));
156 return 1;
157}
158#endif
159
160
Jeffrey Yasskin39370832010-05-03 19:29:34 +0000161/* This can set eval_breaker to 0 even though gil_drop_request became
162 1. We believe this is all right because the eval loop will release
163 the GIL eventually anyway. */
Victor Stinnerda2914d2020-03-20 09:29:08 +0100164static inline void
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200165COMPUTE_EVAL_BREAKER(PyInterpreterState *interp,
Victor Stinner299b8c62020-05-05 17:40:18 +0200166 struct _ceval_runtime_state *ceval,
167 struct _ceval_state *ceval2)
Victor Stinnerda2914d2020-03-20 09:29:08 +0100168{
Victor Stinner299b8c62020-05-05 17:40:18 +0200169 _Py_atomic_store_relaxed(&ceval2->eval_breaker,
170 _Py_atomic_load_relaxed(&ceval2->gil_drop_request)
Victor Stinner0b1e3302020-05-05 16:14:31 +0200171 | (_Py_atomic_load_relaxed(&ceval->signals_pending)
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200172 && _Py_ThreadCanHandleSignals(interp))
Victor Stinner299b8c62020-05-05 17:40:18 +0200173 | (_Py_atomic_load_relaxed(&ceval2->pending.calls_to_do)
Victor Stinnerd8316882020-03-20 14:50:35 +0100174 && _Py_ThreadCanHandlePendingCalls())
Victor Stinner299b8c62020-05-05 17:40:18 +0200175 | ceval2->pending.async_exc);
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 +0200180SET_GIL_DROP_REQUEST(PyInterpreterState *interp)
Victor Stinnerda2914d2020-03-20 09:29:08 +0100181{
Victor Stinner299b8c62020-05-05 17:40:18 +0200182 struct _ceval_state *ceval2 = &interp->ceval;
183 _Py_atomic_store_relaxed(&ceval2->gil_drop_request, 1);
184 _Py_atomic_store_relaxed(&ceval2->eval_breaker, 1);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100185}
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000186
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000187
Victor Stinnerda2914d2020-03-20 09:29:08 +0100188static inline void
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200189RESET_GIL_DROP_REQUEST(PyInterpreterState *interp)
Victor Stinnerda2914d2020-03-20 09:29:08 +0100190{
Victor Stinner299b8c62020-05-05 17:40:18 +0200191 struct _ceval_runtime_state *ceval = &interp->runtime->ceval;
192 struct _ceval_state *ceval2 = &interp->ceval;
193 _Py_atomic_store_relaxed(&ceval2->gil_drop_request, 0);
194 COMPUTE_EVAL_BREAKER(interp, ceval, ceval2);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100195}
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000196
Eric Snowfdf282d2019-01-11 14:26:55 -0700197
Victor Stinnerda2914d2020-03-20 09:29:08 +0100198static inline void
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200199SIGNAL_PENDING_CALLS(PyInterpreterState *interp)
Victor Stinnerda2914d2020-03-20 09:29:08 +0100200{
Victor Stinner299b8c62020-05-05 17:40:18 +0200201 struct _ceval_runtime_state *ceval = &interp->runtime->ceval;
202 struct _ceval_state *ceval2 = &interp->ceval;
203 _Py_atomic_store_relaxed(&ceval2->pending.calls_to_do, 1);
204 COMPUTE_EVAL_BREAKER(interp, ceval, ceval2);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100205}
Eric Snowfdf282d2019-01-11 14:26:55 -0700206
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000207
Victor Stinnerda2914d2020-03-20 09:29:08 +0100208static inline void
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200209UNSIGNAL_PENDING_CALLS(PyInterpreterState *interp)
Victor Stinnerda2914d2020-03-20 09:29:08 +0100210{
Victor Stinner299b8c62020-05-05 17:40:18 +0200211 struct _ceval_runtime_state *ceval = &interp->runtime->ceval;
212 struct _ceval_state *ceval2 = &interp->ceval;
213 _Py_atomic_store_relaxed(&ceval2->pending.calls_to_do, 0);
214 COMPUTE_EVAL_BREAKER(interp, ceval, ceval2);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100215}
216
217
218static inline void
Victor Stinnerd96a7a82020-11-13 14:44:42 +0100219SIGNAL_PENDING_SIGNALS(PyInterpreterState *interp, int force)
Victor Stinnerda2914d2020-03-20 09:29:08 +0100220{
Victor Stinner299b8c62020-05-05 17:40:18 +0200221 struct _ceval_runtime_state *ceval = &interp->runtime->ceval;
222 struct _ceval_state *ceval2 = &interp->ceval;
Victor Stinner0b1e3302020-05-05 16:14:31 +0200223 _Py_atomic_store_relaxed(&ceval->signals_pending, 1);
Victor Stinnerd96a7a82020-11-13 14:44:42 +0100224 if (force) {
225 _Py_atomic_store_relaxed(&ceval2->eval_breaker, 1);
226 }
227 else {
228 /* eval_breaker is not set to 1 if thread_can_handle_signals() is false */
229 COMPUTE_EVAL_BREAKER(interp, ceval, ceval2);
230 }
Victor Stinnerda2914d2020-03-20 09:29:08 +0100231}
232
233
234static inline void
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200235UNSIGNAL_PENDING_SIGNALS(PyInterpreterState *interp)
Victor Stinnerda2914d2020-03-20 09:29:08 +0100236{
Victor Stinner299b8c62020-05-05 17:40:18 +0200237 struct _ceval_runtime_state *ceval = &interp->runtime->ceval;
238 struct _ceval_state *ceval2 = &interp->ceval;
Victor Stinner0b1e3302020-05-05 16:14:31 +0200239 _Py_atomic_store_relaxed(&ceval->signals_pending, 0);
Victor Stinner299b8c62020-05-05 17:40:18 +0200240 COMPUTE_EVAL_BREAKER(interp, ceval, ceval2);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100241}
242
243
244static inline void
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200245SIGNAL_ASYNC_EXC(PyInterpreterState *interp)
Victor Stinnerda2914d2020-03-20 09:29:08 +0100246{
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200247 struct _ceval_state *ceval2 = &interp->ceval;
Victor Stinnerda2914d2020-03-20 09:29:08 +0100248 ceval2->pending.async_exc = 1;
249 _Py_atomic_store_relaxed(&ceval2->eval_breaker, 1);
250}
251
252
253static inline void
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200254UNSIGNAL_ASYNC_EXC(PyInterpreterState *interp)
Victor Stinnerda2914d2020-03-20 09:29:08 +0100255{
Victor Stinner299b8c62020-05-05 17:40:18 +0200256 struct _ceval_runtime_state *ceval = &interp->runtime->ceval;
257 struct _ceval_state *ceval2 = &interp->ceval;
258 ceval2->pending.async_exc = 0;
259 COMPUTE_EVAL_BREAKER(interp, ceval, ceval2);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100260}
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000261
262
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000263#ifdef HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000264#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +0000265#endif
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000266#include "ceval_gil.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000267
Victor Stinner3026cad2020-06-01 16:02:40 +0200268void _Py_NO_RETURN
269_Py_FatalError_TstateNULL(const char *func)
Victor Stinnereb4e2ae2020-03-08 11:57:45 +0100270{
Victor Stinner3026cad2020-06-01 16:02:40 +0200271 _Py_FatalErrorFunc(func,
272 "the function must be called with the GIL held, "
273 "but the GIL is released "
274 "(the current Python thread state is NULL)");
Victor Stinnereb4e2ae2020-03-08 11:57:45 +0100275}
276
Victor Stinner7be4e352020-05-05 20:27:47 +0200277#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
278int
279_PyEval_ThreadsInitialized(PyInterpreterState *interp)
280{
281 return gil_created(&interp->ceval.gil);
282}
283
284int
285PyEval_ThreadsInitialized(void)
286{
287 // Fatal error if there is no current interpreter
288 PyInterpreterState *interp = PyInterpreterState_Get();
289 return _PyEval_ThreadsInitialized(interp);
290}
291#else
Tim Peters7f468f22004-10-11 02:40:51 +0000292int
Victor Stinner175a7042020-03-10 00:37:48 +0100293_PyEval_ThreadsInitialized(_PyRuntimeState *runtime)
294{
295 return gil_created(&runtime->ceval.gil);
296}
297
298int
Tim Peters7f468f22004-10-11 02:40:51 +0000299PyEval_ThreadsInitialized(void)
300{
Victor Stinner01b1cc12019-11-20 02:27:56 +0100301 _PyRuntimeState *runtime = &_PyRuntime;
Victor Stinner175a7042020-03-10 00:37:48 +0100302 return _PyEval_ThreadsInitialized(runtime);
Tim Peters7f468f22004-10-11 02:40:51 +0000303}
Victor Stinner7be4e352020-05-05 20:27:47 +0200304#endif
Tim Peters7f468f22004-10-11 02:40:51 +0000305
Victor Stinner111e4ee2020-03-09 21:24:14 +0100306PyStatus
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200307_PyEval_InitGIL(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000308{
Victor Stinner7be4e352020-05-05 20:27:47 +0200309#ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
Victor Stinner101bf692021-02-19 13:33:31 +0100310 if (!_Py_IsMainInterpreter(tstate->interp)) {
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200311 /* Currently, the GIL is shared by all interpreters,
312 and only the main interpreter is responsible to create
313 and destroy it. */
314 return _PyStatus_OK();
Victor Stinner111e4ee2020-03-09 21:24:14 +0100315 }
Victor Stinner7be4e352020-05-05 20:27:47 +0200316#endif
Victor Stinner111e4ee2020-03-09 21:24:14 +0100317
Victor Stinner7be4e352020-05-05 20:27:47 +0200318#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
319 struct _gil_runtime_state *gil = &tstate->interp->ceval.gil;
320#else
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200321 struct _gil_runtime_state *gil = &tstate->interp->runtime->ceval.gil;
Victor Stinner7be4e352020-05-05 20:27:47 +0200322#endif
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200323 assert(!gil_created(gil));
Victor Stinner85f5a692020-03-09 22:12:04 +0100324
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200325 PyThread_init_thread();
326 create_gil(gil);
327
328 take_gil(tstate);
329
330 assert(gil_created(gil));
Victor Stinner111e4ee2020-03-09 21:24:14 +0100331 return _PyStatus_OK();
332}
333
334void
Victor Stinnerbcb094b2021-02-19 15:10:45 +0100335_PyEval_FiniGIL(PyInterpreterState *interp)
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200336{
Victor Stinner7be4e352020-05-05 20:27:47 +0200337#ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
Victor Stinnerbcb094b2021-02-19 15:10:45 +0100338 if (!_Py_IsMainInterpreter(interp)) {
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200339 /* Currently, the GIL is shared by all interpreters,
340 and only the main interpreter is responsible to create
341 and destroy it. */
342 return;
343 }
Victor Stinner7be4e352020-05-05 20:27:47 +0200344#endif
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200345
Victor Stinner7be4e352020-05-05 20:27:47 +0200346#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
Victor Stinnerbcb094b2021-02-19 15:10:45 +0100347 struct _gil_runtime_state *gil = &interp->ceval.gil;
Victor Stinner7be4e352020-05-05 20:27:47 +0200348#else
Victor Stinnerbcb094b2021-02-19 15:10:45 +0100349 struct _gil_runtime_state *gil = &interp->runtime->ceval.gil;
Victor Stinner7be4e352020-05-05 20:27:47 +0200350#endif
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200351 if (!gil_created(gil)) {
352 /* First Py_InitializeFromConfig() call: the GIL doesn't exist
353 yet: do nothing. */
354 return;
355 }
356
357 destroy_gil(gil);
358 assert(!gil_created(gil));
359}
360
361void
Victor Stinner111e4ee2020-03-09 21:24:14 +0100362PyEval_InitThreads(void)
363{
Victor Stinnerb4698ec2020-03-10 01:28:54 +0100364 /* Do nothing: kept for backward compatibility */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000365}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000366
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000367void
Inada Naoki91234a12019-06-03 21:30:58 +0900368_PyEval_Fini(void)
369{
370#if OPCACHE_STATS
371 fprintf(stderr, "-- Opcode cache number of objects = %zd\n",
372 opcache_code_objects);
373
374 fprintf(stderr, "-- Opcode cache total extra mem = %zd\n",
375 opcache_code_objects_extra_mem);
376
377 fprintf(stderr, "\n");
378
379 fprintf(stderr, "-- Opcode cache LOAD_GLOBAL hits = %zd (%d%%)\n",
380 opcache_global_hits,
381 (int) (100.0 * opcache_global_hits /
382 (opcache_global_hits + opcache_global_misses)));
383
384 fprintf(stderr, "-- Opcode cache LOAD_GLOBAL misses = %zd (%d%%)\n",
385 opcache_global_misses,
386 (int) (100.0 * opcache_global_misses /
387 (opcache_global_hits + opcache_global_misses)));
388
389 fprintf(stderr, "-- Opcode cache LOAD_GLOBAL opts = %zd\n",
390 opcache_global_opts);
391
392 fprintf(stderr, "\n");
Pablo Galindo109826c2020-10-20 06:22:44 +0100393
394 fprintf(stderr, "-- Opcode cache LOAD_ATTR hits = %zd (%d%%)\n",
395 opcache_attr_hits,
396 (int) (100.0 * opcache_attr_hits /
397 opcache_attr_total));
398
399 fprintf(stderr, "-- Opcode cache LOAD_ATTR misses = %zd (%d%%)\n",
400 opcache_attr_misses,
401 (int) (100.0 * opcache_attr_misses /
402 opcache_attr_total));
403
404 fprintf(stderr, "-- Opcode cache LOAD_ATTR opts = %zd\n",
405 opcache_attr_opts);
406
407 fprintf(stderr, "-- Opcode cache LOAD_ATTR deopts = %zd\n",
408 opcache_attr_deopts);
409
410 fprintf(stderr, "-- Opcode cache LOAD_ATTR total = %zd\n",
411 opcache_attr_total);
Inada Naoki91234a12019-06-03 21:30:58 +0900412#endif
413}
414
415void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000416PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000417{
Victor Stinner09532fe2019-05-10 23:39:09 +0200418 _PyRuntimeState *runtime = &_PyRuntime;
Victor Stinner09532fe2019-05-10 23:39:09 +0200419 PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime);
Victor Stinner3026cad2020-06-01 16:02:40 +0200420 _Py_EnsureTstateNotNULL(tstate);
Victor Stinnereb4e2ae2020-03-08 11:57:45 +0100421
Victor Stinner85f5a692020-03-09 22:12:04 +0100422 take_gil(tstate);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000423}
424
425void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000426PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000427{
Victor Stinner09532fe2019-05-10 23:39:09 +0200428 _PyRuntimeState *runtime = &_PyRuntime;
Victor Stinnere225beb2019-06-03 18:14:24 +0200429 PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000430 /* This function must succeed when the current thread state is NULL.
Victor Stinner50b48572018-11-01 01:51:40 +0100431 We therefore avoid PyThreadState_Get() which dumps a fatal error
Victor Stinnerda2914d2020-03-20 09:29:08 +0100432 in debug mode. */
Victor Stinner299b8c62020-05-05 17:40:18 +0200433 struct _ceval_runtime_state *ceval = &runtime->ceval;
434 struct _ceval_state *ceval2 = &tstate->interp->ceval;
435 drop_gil(ceval, ceval2, tstate);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000436}
437
438void
Victor Stinner23ef89d2020-03-18 02:26:04 +0100439_PyEval_ReleaseLock(PyThreadState *tstate)
440{
441 struct _ceval_runtime_state *ceval = &tstate->interp->runtime->ceval;
Victor Stinner0b1e3302020-05-05 16:14:31 +0200442 struct _ceval_state *ceval2 = &tstate->interp->ceval;
443 drop_gil(ceval, ceval2, tstate);
Victor Stinner23ef89d2020-03-18 02:26:04 +0100444}
445
446void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000447PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000448{
Victor Stinner3026cad2020-06-01 16:02:40 +0200449 _Py_EnsureTstateNotNULL(tstate);
Victor Stinnereb4e2ae2020-03-08 11:57:45 +0100450
Victor Stinner85f5a692020-03-09 22:12:04 +0100451 take_gil(tstate);
Victor Stinnere225beb2019-06-03 18:14:24 +0200452
Victor Stinner85f5a692020-03-09 22:12:04 +0100453 struct _gilstate_runtime_state *gilstate = &tstate->interp->runtime->gilstate;
Victor Stinnere838a932020-05-05 19:56:48 +0200454#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
455 (void)_PyThreadState_Swap(gilstate, tstate);
456#else
Victor Stinner85f5a692020-03-09 22:12:04 +0100457 if (_PyThreadState_Swap(gilstate, tstate) != NULL) {
Victor Stinner9e5d30c2020-03-07 00:54:20 +0100458 Py_FatalError("non-NULL old thread state");
Victor Stinner09532fe2019-05-10 23:39:09 +0200459 }
Victor Stinnere838a932020-05-05 19:56:48 +0200460#endif
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000461}
462
463void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000464PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000465{
Victor Stinnerda2914d2020-03-20 09:29:08 +0100466 assert(is_tstate_valid(tstate));
Victor Stinner09532fe2019-05-10 23:39:09 +0200467
Victor Stinner01b1cc12019-11-20 02:27:56 +0100468 _PyRuntimeState *runtime = tstate->interp->runtime;
Victor Stinner09532fe2019-05-10 23:39:09 +0200469 PyThreadState *new_tstate = _PyThreadState_Swap(&runtime->gilstate, NULL);
470 if (new_tstate != tstate) {
Victor Stinner9e5d30c2020-03-07 00:54:20 +0100471 Py_FatalError("wrong thread state");
Victor Stinner09532fe2019-05-10 23:39:09 +0200472 }
Victor Stinner0b1e3302020-05-05 16:14:31 +0200473 struct _ceval_runtime_state *ceval = &runtime->ceval;
474 struct _ceval_state *ceval2 = &tstate->interp->ceval;
475 drop_gil(ceval, ceval2, tstate);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000476}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000477
Dong-hee Na62f75fe2020-04-15 01:16:24 +0900478#ifdef HAVE_FORK
Antoine Pitrouf7ecfac2017-05-28 11:35:14 +0200479/* This function is called from PyOS_AfterFork_Child to destroy all threads
Victor Stinner26881c82020-06-02 15:51:37 +0200480 which are not running in the child process, and clear internal locks
481 which might be held by those threads. */
482PyStatus
Victor Stinner317bab02020-06-02 18:44:54 +0200483_PyEval_ReInitThreads(PyThreadState *tstate)
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000484{
Victor Stinner317bab02020-06-02 18:44:54 +0200485 _PyRuntimeState *runtime = tstate->interp->runtime;
Victor Stinner7be4e352020-05-05 20:27:47 +0200486
487#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
488 struct _gil_runtime_state *gil = &tstate->interp->ceval.gil;
489#else
Victor Stinner56bfdeb2020-03-18 09:26:25 +0100490 struct _gil_runtime_state *gil = &runtime->ceval.gil;
Victor Stinner7be4e352020-05-05 20:27:47 +0200491#endif
Victor Stinner56bfdeb2020-03-18 09:26:25 +0100492 if (!gil_created(gil)) {
Victor Stinner26881c82020-06-02 15:51:37 +0200493 return _PyStatus_OK();
Victor Stinner09532fe2019-05-10 23:39:09 +0200494 }
Victor Stinner56bfdeb2020-03-18 09:26:25 +0100495 recreate_gil(gil);
Victor Stinner85f5a692020-03-09 22:12:04 +0100496
497 take_gil(tstate);
Eric Snow8479a342019-03-08 23:44:33 -0700498
Victor Stinner50e6e992020-03-19 02:41:21 +0100499 struct _pending_calls *pending = &tstate->interp->ceval.pending;
Dong-hee Na62f75fe2020-04-15 01:16:24 +0900500 if (_PyThread_at_fork_reinit(&pending->lock) < 0) {
Victor Stinner26881c82020-06-02 15:51:37 +0200501 return _PyStatus_ERR("Can't reinitialize pending calls lock");
Eric Snow8479a342019-03-08 23:44:33 -0700502 }
Jesse Nollera8513972008-07-17 16:49:17 +0000503
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200504 /* Destroy all threads except the current one */
Victor Stinnereb4e2ae2020-03-08 11:57:45 +0100505 _PyThreadState_DeleteExcept(runtime, tstate);
Victor Stinner26881c82020-06-02 15:51:37 +0200506 return _PyStatus_OK();
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000507}
Dong-hee Na62f75fe2020-04-15 01:16:24 +0900508#endif
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000509
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000510/* This function is used to signal that async exceptions are waiting to be
Zackery Spytzeef05962018-09-29 10:07:11 -0600511 raised. */
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000512
513void
Victor Stinnerbcb094b2021-02-19 15:10:45 +0100514_PyEval_SignalAsyncExc(PyInterpreterState *interp)
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000515{
Victor Stinnerbcb094b2021-02-19 15:10:45 +0100516 SIGNAL_ASYNC_EXC(interp);
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000517}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000518
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000519PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000520PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000521{
Victor Stinner09532fe2019-05-10 23:39:09 +0200522 _PyRuntimeState *runtime = &_PyRuntime;
Victor Stinnere838a932020-05-05 19:56:48 +0200523#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
524 PyThreadState *old_tstate = _PyThreadState_GET();
525 PyThreadState *tstate = _PyThreadState_Swap(&runtime->gilstate, old_tstate);
526#else
Victor Stinner09532fe2019-05-10 23:39:09 +0200527 PyThreadState *tstate = _PyThreadState_Swap(&runtime->gilstate, NULL);
Victor Stinnere838a932020-05-05 19:56:48 +0200528#endif
Victor Stinner3026cad2020-06-01 16:02:40 +0200529 _Py_EnsureTstateNotNULL(tstate);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100530
Victor Stinner0b1e3302020-05-05 16:14:31 +0200531 struct _ceval_runtime_state *ceval = &runtime->ceval;
532 struct _ceval_state *ceval2 = &tstate->interp->ceval;
Victor Stinner7be4e352020-05-05 20:27:47 +0200533#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
534 assert(gil_created(&ceval2->gil));
535#else
Victor Stinnere225beb2019-06-03 18:14:24 +0200536 assert(gil_created(&ceval->gil));
Victor Stinner7be4e352020-05-05 20:27:47 +0200537#endif
Victor Stinner0b1e3302020-05-05 16:14:31 +0200538 drop_gil(ceval, ceval2, tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000539 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000540}
541
542void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000543PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000544{
Victor Stinner3026cad2020-06-01 16:02:40 +0200545 _Py_EnsureTstateNotNULL(tstate);
Victor Stinnereb4e2ae2020-03-08 11:57:45 +0100546
Victor Stinner85f5a692020-03-09 22:12:04 +0100547 take_gil(tstate);
Victor Stinner17c68b82020-01-30 12:20:48 +0100548
Victor Stinner85f5a692020-03-09 22:12:04 +0100549 struct _gilstate_runtime_state *gilstate = &tstate->interp->runtime->gilstate;
550 _PyThreadState_Swap(gilstate, tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000551}
552
553
Guido van Rossuma9672091994-09-14 13:31:22 +0000554/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
555 signal handlers or Mac I/O completion routines) can schedule calls
556 to a function to be called synchronously.
557 The synchronous function is called with one void* argument.
558 It should return 0 for success or -1 for failure -- failure should
559 be accompanied by an exception.
560
561 If registry succeeds, the registry function returns 0; if it fails
562 (e.g. due to too many pending calls) it returns -1 (without setting
563 an exception condition).
564
565 Note that because registry may occur from within signal handlers,
566 or other asynchronous events, calling malloc() is unsafe!
567
Guido van Rossuma9672091994-09-14 13:31:22 +0000568 Any thread can schedule pending calls, but only the main thread
569 will execute them.
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000570 There is no facility to schedule calls to a particular thread, but
571 that should be easy to change, should that ever be required. In
572 that case, the static variables here should go into the python
573 threadstate.
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000574*/
Guido van Rossuma9672091994-09-14 13:31:22 +0000575
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200576void
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200577_PyEval_SignalReceived(PyInterpreterState *interp)
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200578{
Victor Stinnerd96a7a82020-11-13 14:44:42 +0100579#ifdef MS_WINDOWS
580 // bpo-42296: On Windows, _PyEval_SignalReceived() is called from a signal
581 // handler which can run in a thread different than the Python thread, in
582 // which case _Py_ThreadCanHandleSignals() is wrong. Ignore
583 // _Py_ThreadCanHandleSignals() and always set eval_breaker to 1.
584 //
585 // The next eval_frame_handle_pending() call will call
586 // _Py_ThreadCanHandleSignals() to recompute eval_breaker.
587 int force = 1;
588#else
589 int force = 0;
590#endif
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200591 /* bpo-30703: Function called when the C signal handler of Python gets a
Victor Stinner50e6e992020-03-19 02:41:21 +0100592 signal. We cannot queue a callback using _PyEval_AddPendingCall() since
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200593 that function is not async-signal-safe. */
Victor Stinnerd96a7a82020-11-13 14:44:42 +0100594 SIGNAL_PENDING_SIGNALS(interp, force);
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200595}
596
Eric Snow5be45a62019-03-08 22:47:07 -0700597/* Push one item onto the queue while holding the lock. */
598static int
Victor Stinnere225beb2019-06-03 18:14:24 +0200599_push_pending_call(struct _pending_calls *pending,
Eric Snow842a2f02019-03-15 15:47:51 -0600600 int (*func)(void *), void *arg)
Eric Snow5be45a62019-03-08 22:47:07 -0700601{
Eric Snow842a2f02019-03-15 15:47:51 -0600602 int i = pending->last;
Eric Snow5be45a62019-03-08 22:47:07 -0700603 int j = (i + 1) % NPENDINGCALLS;
Eric Snow842a2f02019-03-15 15:47:51 -0600604 if (j == pending->first) {
Eric Snow5be45a62019-03-08 22:47:07 -0700605 return -1; /* Queue full */
606 }
Eric Snow842a2f02019-03-15 15:47:51 -0600607 pending->calls[i].func = func;
608 pending->calls[i].arg = arg;
609 pending->last = j;
Eric Snow5be45a62019-03-08 22:47:07 -0700610 return 0;
611}
612
613/* Pop one item off the queue while holding the lock. */
614static void
Victor Stinnere225beb2019-06-03 18:14:24 +0200615_pop_pending_call(struct _pending_calls *pending,
Eric Snow842a2f02019-03-15 15:47:51 -0600616 int (**func)(void *), void **arg)
Eric Snow5be45a62019-03-08 22:47:07 -0700617{
Eric Snow842a2f02019-03-15 15:47:51 -0600618 int i = pending->first;
619 if (i == pending->last) {
Eric Snow5be45a62019-03-08 22:47:07 -0700620 return; /* Queue empty */
621 }
622
Eric Snow842a2f02019-03-15 15:47:51 -0600623 *func = pending->calls[i].func;
624 *arg = pending->calls[i].arg;
625 pending->first = (i + 1) % NPENDINGCALLS;
Eric Snow5be45a62019-03-08 22:47:07 -0700626}
627
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200628/* This implementation is thread-safe. It allows
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000629 scheduling to be made from any thread, and even from an executing
630 callback.
631 */
632
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000633int
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200634_PyEval_AddPendingCall(PyInterpreterState *interp,
Victor Stinner09532fe2019-05-10 23:39:09 +0200635 int (*func)(void *), void *arg)
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000636{
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200637 struct _pending_calls *pending = &interp->ceval.pending;
Eric Snow842a2f02019-03-15 15:47:51 -0600638
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200639 /* Ensure that _PyEval_InitPendingCalls() was called
640 and that _PyEval_FiniPendingCalls() is not called yet. */
641 assert(pending->lock != NULL);
642
Eric Snow842a2f02019-03-15 15:47:51 -0600643 PyThread_acquire_lock(pending->lock, WAIT_LOCK);
Victor Stinnere225beb2019-06-03 18:14:24 +0200644 int result = _push_pending_call(pending, func, arg);
Eric Snow842a2f02019-03-15 15:47:51 -0600645 PyThread_release_lock(pending->lock);
Eric Snow5be45a62019-03-08 22:47:07 -0700646
Victor Stinnere225beb2019-06-03 18:14:24 +0200647 /* signal main loop */
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200648 SIGNAL_PENDING_CALLS(interp);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000649 return result;
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000650}
651
Victor Stinner09532fe2019-05-10 23:39:09 +0200652int
653Py_AddPendingCall(int (*func)(void *), void *arg)
654{
Victor Stinner50e6e992020-03-19 02:41:21 +0100655 /* Best-effort to support subinterpreters and calls with the GIL released.
656
657 First attempt _PyThreadState_GET() since it supports subinterpreters.
658
659 If the GIL is released, _PyThreadState_GET() returns NULL . In this
660 case, use PyGILState_GetThisThreadState() which works even if the GIL
661 is released.
662
663 Sadly, PyGILState_GetThisThreadState() doesn't support subinterpreters:
664 see bpo-10915 and bpo-15751.
665
Victor Stinner8849e592020-03-18 19:28:53 +0100666 Py_AddPendingCall() doesn't require the caller to hold the GIL. */
Victor Stinner50e6e992020-03-19 02:41:21 +0100667 PyThreadState *tstate = _PyThreadState_GET();
668 if (tstate == NULL) {
669 tstate = PyGILState_GetThisThreadState();
670 }
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200671
672 PyInterpreterState *interp;
673 if (tstate != NULL) {
674 interp = tstate->interp;
675 }
676 else {
677 /* Last resort: use the main interpreter */
678 interp = _PyRuntime.interpreters.main;
679 }
680 return _PyEval_AddPendingCall(interp, func, arg);
Victor Stinner09532fe2019-05-10 23:39:09 +0200681}
682
Eric Snowfdf282d2019-01-11 14:26:55 -0700683static int
Victor Stinnerd7fabc12020-03-18 01:56:21 +0100684handle_signals(PyThreadState *tstate)
Eric Snowfdf282d2019-01-11 14:26:55 -0700685{
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200686 assert(is_tstate_valid(tstate));
687 if (!_Py_ThreadCanHandleSignals(tstate->interp)) {
Eric Snow64d6cc82019-02-23 15:40:43 -0700688 return 0;
689 }
Eric Snowfdf282d2019-01-11 14:26:55 -0700690
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200691 UNSIGNAL_PENDING_SIGNALS(tstate->interp);
Victor Stinner72818982020-03-26 22:28:11 +0100692 if (_PyErr_CheckSignalsTstate(tstate) < 0) {
693 /* On failure, re-schedule a call to handle_signals(). */
Victor Stinnerd96a7a82020-11-13 14:44:42 +0100694 SIGNAL_PENDING_SIGNALS(tstate->interp, 0);
Eric Snowfdf282d2019-01-11 14:26:55 -0700695 return -1;
696 }
697 return 0;
698}
699
700static int
Victor Stinnerbcb094b2021-02-19 15:10:45 +0100701make_pending_calls(PyInterpreterState *interp)
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000702{
Victor Stinnerd8316882020-03-20 14:50:35 +0100703 /* only execute pending calls on main thread */
704 if (!_Py_ThreadCanHandlePendingCalls()) {
Victor Stinnere225beb2019-06-03 18:14:24 +0200705 return 0;
706 }
707
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000708 /* don't perform recursive pending calls */
Victor Stinnerda2914d2020-03-20 09:29:08 +0100709 static int busy = 0;
Eric Snowfdf282d2019-01-11 14:26:55 -0700710 if (busy) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000711 return 0;
Eric Snowfdf282d2019-01-11 14:26:55 -0700712 }
Charles-François Natalif23339a2011-07-23 18:15:43 +0200713 busy = 1;
Victor Stinnerda2914d2020-03-20 09:29:08 +0100714
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200715 /* unsignal before starting to call callbacks, so that any callback
716 added in-between re-signals */
Victor Stinnerbcb094b2021-02-19 15:10:45 +0100717 UNSIGNAL_PENDING_CALLS(interp);
Eric Snowfdf282d2019-01-11 14:26:55 -0700718 int res = 0;
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200719
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000720 /* perform a bounded number of calls, in case of recursion */
Victor Stinnerbcb094b2021-02-19 15:10:45 +0100721 struct _pending_calls *pending = &interp->ceval.pending;
Eric Snowfdf282d2019-01-11 14:26:55 -0700722 for (int i=0; i<NPENDINGCALLS; i++) {
Eric Snow5be45a62019-03-08 22:47:07 -0700723 int (*func)(void *) = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000724 void *arg = NULL;
725
726 /* pop one item off the queue while holding the lock */
Eric Snow842a2f02019-03-15 15:47:51 -0600727 PyThread_acquire_lock(pending->lock, WAIT_LOCK);
Victor Stinnere225beb2019-06-03 18:14:24 +0200728 _pop_pending_call(pending, &func, &arg);
Eric Snow842a2f02019-03-15 15:47:51 -0600729 PyThread_release_lock(pending->lock);
Eric Snow5be45a62019-03-08 22:47:07 -0700730
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100731 /* having released the lock, perform the callback */
Eric Snow5be45a62019-03-08 22:47:07 -0700732 if (func == NULL) {
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100733 break;
Eric Snow5be45a62019-03-08 22:47:07 -0700734 }
Eric Snowfdf282d2019-01-11 14:26:55 -0700735 res = func(arg);
736 if (res) {
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200737 goto error;
738 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000739 }
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200740
Charles-François Natalif23339a2011-07-23 18:15:43 +0200741 busy = 0;
Eric Snowfdf282d2019-01-11 14:26:55 -0700742 return res;
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200743
744error:
745 busy = 0;
Victor Stinnerbcb094b2021-02-19 15:10:45 +0100746 SIGNAL_PENDING_CALLS(interp);
Eric Snowfdf282d2019-01-11 14:26:55 -0700747 return res;
748}
749
Eric Snow842a2f02019-03-15 15:47:51 -0600750void
Victor Stinner2b1df452020-01-13 18:46:59 +0100751_Py_FinishPendingCalls(PyThreadState *tstate)
Eric Snow842a2f02019-03-15 15:47:51 -0600752{
Eric Snow842a2f02019-03-15 15:47:51 -0600753 assert(PyGILState_Check());
Victor Stinnerbcb094b2021-02-19 15:10:45 +0100754 assert(is_tstate_valid(tstate));
Eric Snow842a2f02019-03-15 15:47:51 -0600755
Victor Stinner50e6e992020-03-19 02:41:21 +0100756 struct _pending_calls *pending = &tstate->interp->ceval.pending;
Victor Stinner09532fe2019-05-10 23:39:09 +0200757
Eric Snow842a2f02019-03-15 15:47:51 -0600758 if (!_Py_atomic_load_relaxed(&(pending->calls_to_do))) {
759 return;
760 }
761
Victor Stinnerbcb094b2021-02-19 15:10:45 +0100762 if (make_pending_calls(tstate->interp) < 0) {
Victor Stinnere225beb2019-06-03 18:14:24 +0200763 PyObject *exc, *val, *tb;
764 _PyErr_Fetch(tstate, &exc, &val, &tb);
765 PyErr_BadInternalCall();
766 _PyErr_ChainExceptions(exc, val, tb);
767 _PyErr_Print(tstate);
Eric Snow842a2f02019-03-15 15:47:51 -0600768 }
769}
770
Eric Snowfdf282d2019-01-11 14:26:55 -0700771/* Py_MakePendingCalls() is a simple wrapper for the sake
772 of backward-compatibility. */
773int
774Py_MakePendingCalls(void)
775{
776 assert(PyGILState_Check());
777
Victor Stinnerd7fabc12020-03-18 01:56:21 +0100778 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerbcb094b2021-02-19 15:10:45 +0100779 assert(is_tstate_valid(tstate));
Victor Stinnerd7fabc12020-03-18 01:56:21 +0100780
Eric Snowfdf282d2019-01-11 14:26:55 -0700781 /* Python signal handler doesn't really queue a callback: it only signals
782 that a signal was received, see _PyEval_SignalReceived(). */
Victor Stinnerd7fabc12020-03-18 01:56:21 +0100783 int res = handle_signals(tstate);
Eric Snowfdf282d2019-01-11 14:26:55 -0700784 if (res != 0) {
785 return res;
786 }
787
Victor Stinnerbcb094b2021-02-19 15:10:45 +0100788 res = make_pending_calls(tstate->interp);
Eric Snowb75b1a352019-04-12 10:20:10 -0600789 if (res != 0) {
790 return res;
791 }
792
793 return 0;
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000794}
795
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000796/* The interpreter's recursion limit */
797
Hye-Shik Changb6fa2812005-04-04 15:49:02 +0000798#ifndef Py_DEFAULT_RECURSION_LIMIT
Victor Stinner19c3ac92020-09-23 14:04:57 +0200799# define Py_DEFAULT_RECURSION_LIMIT 1000
Hye-Shik Changb6fa2812005-04-04 15:49:02 +0000800#endif
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600801
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600802void
Victor Stinnerdab84232020-03-17 18:56:44 +0100803_PyEval_InitRuntimeState(struct _ceval_runtime_state *ceval)
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600804{
Victor Stinner7be4e352020-05-05 20:27:47 +0200805#ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
Victor Stinnerdab84232020-03-17 18:56:44 +0100806 _gil_initialize(&ceval->gil);
Victor Stinner7be4e352020-05-05 20:27:47 +0200807#endif
Victor Stinnerdab84232020-03-17 18:56:44 +0100808}
809
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200810int
Victor Stinnerdab84232020-03-17 18:56:44 +0100811_PyEval_InitState(struct _ceval_state *ceval)
812{
Victor Stinner4e30ed32020-05-05 16:52:52 +0200813 ceval->recursion_limit = Py_DEFAULT_RECURSION_LIMIT;
814
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200815 struct _pending_calls *pending = &ceval->pending;
816 assert(pending->lock == NULL);
817
818 pending->lock = PyThread_allocate_lock();
819 if (pending->lock == NULL) {
820 return -1;
821 }
Victor Stinner7be4e352020-05-05 20:27:47 +0200822
823#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
824 _gil_initialize(&ceval->gil);
825#endif
826
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200827 return 0;
828}
829
830void
831_PyEval_FiniState(struct _ceval_state *ceval)
832{
833 struct _pending_calls *pending = &ceval->pending;
834 if (pending->lock != NULL) {
835 PyThread_free_lock(pending->lock);
836 pending->lock = NULL;
837 }
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600838}
839
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000840int
841Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000842{
Victor Stinner1bcc32f2020-06-10 20:08:26 +0200843 PyInterpreterState *interp = _PyInterpreterState_GET();
844 return interp->ceval.recursion_limit;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000845}
846
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000847void
848Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000849{
Victor Stinner4e30ed32020-05-05 16:52:52 +0200850 PyThreadState *tstate = _PyThreadState_GET();
851 tstate->interp->ceval.recursion_limit = new_limit;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000852}
853
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100854/* The function _Py_EnterRecursiveCall() only calls _Py_CheckRecursiveCall()
Victor Stinner19c3ac92020-09-23 14:04:57 +0200855 if the recursion_depth reaches recursion_limit.
856 If USE_STACKCHECK, the macro decrements recursion_limit
Armin Rigo2b3eb402003-10-28 12:05:48 +0000857 to guarantee that _Py_CheckRecursiveCall() is regularly called.
858 Without USE_STACKCHECK, there is no need for this. */
859int
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100860_Py_CheckRecursiveCall(PyThreadState *tstate, const char *where)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000861{
Victor Stinner4e30ed32020-05-05 16:52:52 +0200862 int recursion_limit = tstate->interp->ceval.recursion_limit;
Armin Rigo2b3eb402003-10-28 12:05:48 +0000863
864#ifdef USE_STACKCHECK
pdox18967932017-10-25 23:03:01 -0700865 tstate->stackcheck_counter = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000866 if (PyOS_CheckStack()) {
867 --tstate->recursion_depth;
Victor Stinner438a12d2019-05-24 17:01:38 +0200868 _PyErr_SetString(tstate, PyExc_MemoryError, "Stack overflow");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000869 return -1;
870 }
pdox18967932017-10-25 23:03:01 -0700871#endif
Mark Shannon4e7a69b2020-12-02 13:30:55 +0000872 if (tstate->recursion_headroom) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000873 if (tstate->recursion_depth > recursion_limit + 50) {
874 /* Overflowing while handling an overflow. Give up. */
875 Py_FatalError("Cannot recover from stack overflow.");
876 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000877 }
Mark Shannon4e7a69b2020-12-02 13:30:55 +0000878 else {
879 if (tstate->recursion_depth > recursion_limit) {
880 tstate->recursion_headroom++;
881 _PyErr_Format(tstate, PyExc_RecursionError,
882 "maximum recursion depth exceeded%s",
883 where);
884 tstate->recursion_headroom--;
885 --tstate->recursion_depth;
886 return -1;
887 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000888 }
889 return 0;
Armin Rigo2b3eb402003-10-28 12:05:48 +0000890}
891
Brandt Bucher145bf262021-02-26 14:51:55 -0800892
893// PEP 634: Structural Pattern Matching
894
895
896// Return a tuple of values corresponding to keys, with error checks for
897// duplicate/missing keys.
898static PyObject*
899match_keys(PyThreadState *tstate, PyObject *map, PyObject *keys)
900{
901 assert(PyTuple_CheckExact(keys));
902 Py_ssize_t nkeys = PyTuple_GET_SIZE(keys);
903 if (!nkeys) {
904 // No keys means no items.
905 return PyTuple_New(0);
906 }
907 PyObject *seen = NULL;
908 PyObject *dummy = NULL;
909 PyObject *values = NULL;
910 // We use the two argument form of map.get(key, default) for two reasons:
911 // - Atomically check for a key and get its value without error handling.
912 // - Don't cause key creation or resizing in dict subclasses like
913 // collections.defaultdict that define __missing__ (or similar).
914 _Py_IDENTIFIER(get);
915 PyObject *get = _PyObject_GetAttrId(map, &PyId_get);
916 if (get == NULL) {
917 goto fail;
918 }
919 seen = PySet_New(NULL);
920 if (seen == NULL) {
921 goto fail;
922 }
923 // dummy = object()
924 dummy = _PyObject_CallNoArg((PyObject *)&PyBaseObject_Type);
925 if (dummy == NULL) {
926 goto fail;
927 }
928 values = PyList_New(0);
929 if (values == NULL) {
930 goto fail;
931 }
932 for (Py_ssize_t i = 0; i < nkeys; i++) {
933 PyObject *key = PyTuple_GET_ITEM(keys, i);
934 if (PySet_Contains(seen, key) || PySet_Add(seen, key)) {
935 if (!_PyErr_Occurred(tstate)) {
936 // Seen it before!
937 _PyErr_Format(tstate, PyExc_ValueError,
938 "mapping pattern checks duplicate key (%R)", key);
939 }
940 goto fail;
941 }
942 PyObject *value = PyObject_CallFunctionObjArgs(get, key, dummy, NULL);
943 if (value == NULL) {
944 goto fail;
945 }
946 if (value == dummy) {
947 // key not in map!
948 Py_DECREF(value);
949 Py_DECREF(values);
950 // Return None:
951 Py_INCREF(Py_None);
952 values = Py_None;
953 goto done;
954 }
955 PyList_Append(values, value);
956 Py_DECREF(value);
957 }
958 Py_SETREF(values, PyList_AsTuple(values));
959 // Success:
960done:
961 Py_DECREF(get);
962 Py_DECREF(seen);
963 Py_DECREF(dummy);
964 return values;
965fail:
966 Py_XDECREF(get);
967 Py_XDECREF(seen);
968 Py_XDECREF(dummy);
969 Py_XDECREF(values);
970 return NULL;
971}
972
973// Extract a named attribute from the subject, with additional bookkeeping to
974// raise TypeErrors for repeated lookups. On failure, return NULL (with no
975// error set). Use _PyErr_Occurred(tstate) to disambiguate.
976static PyObject*
977match_class_attr(PyThreadState *tstate, PyObject *subject, PyObject *type,
978 PyObject *name, PyObject *seen)
979{
980 assert(PyUnicode_CheckExact(name));
981 assert(PySet_CheckExact(seen));
982 if (PySet_Contains(seen, name) || PySet_Add(seen, name)) {
983 if (!_PyErr_Occurred(tstate)) {
984 // Seen it before!
985 _PyErr_Format(tstate, PyExc_TypeError,
986 "%s() got multiple sub-patterns for attribute %R",
987 ((PyTypeObject*)type)->tp_name, name);
988 }
989 return NULL;
990 }
991 PyObject *attr = PyObject_GetAttr(subject, name);
992 if (attr == NULL && _PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) {
993 _PyErr_Clear(tstate);
994 }
995 return attr;
996}
997
998// On success (match), return a tuple of extracted attributes. On failure (no
999// match), return NULL. Use _PyErr_Occurred(tstate) to disambiguate.
1000static PyObject*
1001match_class(PyThreadState *tstate, PyObject *subject, PyObject *type,
1002 Py_ssize_t nargs, PyObject *kwargs)
1003{
1004 if (!PyType_Check(type)) {
1005 const char *e = "called match pattern must be a type";
1006 _PyErr_Format(tstate, PyExc_TypeError, e);
1007 return NULL;
1008 }
1009 assert(PyTuple_CheckExact(kwargs));
1010 // First, an isinstance check:
1011 if (PyObject_IsInstance(subject, type) <= 0) {
1012 return NULL;
1013 }
1014 // So far so good:
1015 PyObject *seen = PySet_New(NULL);
1016 if (seen == NULL) {
1017 return NULL;
1018 }
1019 PyObject *attrs = PyList_New(0);
1020 if (attrs == NULL) {
1021 Py_DECREF(seen);
1022 return NULL;
1023 }
1024 // NOTE: From this point on, goto fail on failure:
1025 PyObject *match_args = NULL;
1026 // First, the positional subpatterns:
1027 if (nargs) {
1028 int match_self = 0;
1029 match_args = PyObject_GetAttrString(type, "__match_args__");
1030 if (match_args) {
Brandt Bucher145bf262021-02-26 14:51:55 -08001031 if (!PyTuple_CheckExact(match_args)) {
Brandt Bucherf84d5a12021-04-05 19:17:08 -07001032 const char *e = "%s.__match_args__ must be a tuple (got %s)";
Brandt Bucher145bf262021-02-26 14:51:55 -08001033 _PyErr_Format(tstate, PyExc_TypeError, e,
1034 ((PyTypeObject *)type)->tp_name,
1035 Py_TYPE(match_args)->tp_name);
1036 goto fail;
1037 }
1038 }
1039 else if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) {
1040 _PyErr_Clear(tstate);
1041 // _Py_TPFLAGS_MATCH_SELF is only acknowledged if the type does not
1042 // define __match_args__. This is natural behavior for subclasses:
1043 // it's as if __match_args__ is some "magic" value that is lost as
1044 // soon as they redefine it.
1045 match_args = PyTuple_New(0);
1046 match_self = PyType_HasFeature((PyTypeObject*)type,
1047 _Py_TPFLAGS_MATCH_SELF);
1048 }
1049 else {
1050 goto fail;
1051 }
1052 assert(PyTuple_CheckExact(match_args));
1053 Py_ssize_t allowed = match_self ? 1 : PyTuple_GET_SIZE(match_args);
1054 if (allowed < nargs) {
1055 const char *plural = (allowed == 1) ? "" : "s";
1056 _PyErr_Format(tstate, PyExc_TypeError,
1057 "%s() accepts %d positional sub-pattern%s (%d given)",
1058 ((PyTypeObject*)type)->tp_name,
1059 allowed, plural, nargs);
1060 goto fail;
1061 }
1062 if (match_self) {
1063 // Easy. Copy the subject itself, and move on to kwargs.
1064 PyList_Append(attrs, subject);
1065 }
1066 else {
1067 for (Py_ssize_t i = 0; i < nargs; i++) {
1068 PyObject *name = PyTuple_GET_ITEM(match_args, i);
1069 if (!PyUnicode_CheckExact(name)) {
1070 _PyErr_Format(tstate, PyExc_TypeError,
1071 "__match_args__ elements must be strings "
1072 "(got %s)", Py_TYPE(name)->tp_name);
1073 goto fail;
1074 }
1075 PyObject *attr = match_class_attr(tstate, subject, type, name,
1076 seen);
1077 if (attr == NULL) {
1078 goto fail;
1079 }
1080 PyList_Append(attrs, attr);
1081 Py_DECREF(attr);
1082 }
1083 }
1084 Py_CLEAR(match_args);
1085 }
1086 // Finally, the keyword subpatterns:
1087 for (Py_ssize_t i = 0; i < PyTuple_GET_SIZE(kwargs); i++) {
1088 PyObject *name = PyTuple_GET_ITEM(kwargs, i);
1089 PyObject *attr = match_class_attr(tstate, subject, type, name, seen);
1090 if (attr == NULL) {
1091 goto fail;
1092 }
1093 PyList_Append(attrs, attr);
1094 Py_DECREF(attr);
1095 }
1096 Py_SETREF(attrs, PyList_AsTuple(attrs));
1097 Py_DECREF(seen);
1098 return attrs;
1099fail:
1100 // We really don't care whether an error was raised or not... that's our
1101 // caller's problem. All we know is that the match failed.
1102 Py_XDECREF(match_args);
1103 Py_DECREF(seen);
1104 Py_DECREF(attrs);
1105 return NULL;
1106}
1107
1108
Victor Stinner09532fe2019-05-10 23:39:09 +02001109static int do_raise(PyThreadState *tstate, PyObject *exc, PyObject *cause);
Victor Stinner438a12d2019-05-24 17:01:38 +02001110static int unpack_iterable(PyThreadState *, PyObject *, int, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +00001111
Guido van Rossum374a9221991-04-04 10:40:29 +00001112
Guido van Rossumb209a111997-04-29 18:18:01 +00001113PyObject *
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00001114PyEval_EvalCode(PyObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +00001115{
Victor Stinner46496f92021-02-20 15:17:18 +01001116 PyThreadState *tstate = PyThreadState_GET();
Mark Shannon0332e562021-02-01 10:42:03 +00001117 if (locals == NULL) {
1118 locals = globals;
1119 }
Victor Stinnerfc980e02021-03-18 14:51:24 +01001120 PyObject *builtins = _PyEval_BuiltinsFromGlobals(tstate, globals); // borrowed ref
Mark Shannon0332e562021-02-01 10:42:03 +00001121 if (builtins == NULL) {
1122 return NULL;
1123 }
1124 PyFrameConstructor desc = {
1125 .fc_globals = globals,
1126 .fc_builtins = builtins,
1127 .fc_name = ((PyCodeObject *)co)->co_name,
1128 .fc_qualname = ((PyCodeObject *)co)->co_name,
1129 .fc_code = co,
1130 .fc_defaults = NULL,
1131 .fc_kwdefaults = NULL,
1132 .fc_closure = NULL
1133 };
Victor Stinner46496f92021-02-20 15:17:18 +01001134 return _PyEval_Vector(tstate, &desc, locals, NULL, 0, NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001135}
1136
1137
1138/* Interpreter main loop */
1139
Martin v. Löwis8d97e332004-06-27 15:43:12 +00001140PyObject *
Victor Stinnerb9e68122019-11-14 12:20:46 +01001141PyEval_EvalFrame(PyFrameObject *f)
1142{
Victor Stinner0b72b232020-03-12 23:18:39 +01001143 /* Function kept for backward compatibility */
Victor Stinnerb9e68122019-11-14 12:20:46 +01001144 PyThreadState *tstate = _PyThreadState_GET();
1145 return _PyEval_EvalFrame(tstate, f, 0);
Phillip J. Eby0d6615f2005-08-02 00:46:46 +00001146}
1147
1148PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001149PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
Guido van Rossum374a9221991-04-04 10:40:29 +00001150{
Victor Stinnerb9e68122019-11-14 12:20:46 +01001151 PyThreadState *tstate = _PyThreadState_GET();
1152 return _PyEval_EvalFrame(tstate, f, throwflag);
Brett Cannon3cebf932016-09-05 15:33:46 -07001153}
1154
Victor Stinnerda2914d2020-03-20 09:29:08 +01001155
1156/* Handle signals, pending calls, GIL drop request
1157 and asynchronous exception */
1158static int
1159eval_frame_handle_pending(PyThreadState *tstate)
1160{
Victor Stinnerda2914d2020-03-20 09:29:08 +01001161 _PyRuntimeState * const runtime = &_PyRuntime;
1162 struct _ceval_runtime_state *ceval = &runtime->ceval;
Victor Stinnerb54a99d2020-04-08 23:35:05 +02001163
1164 /* Pending signals */
Victor Stinner299b8c62020-05-05 17:40:18 +02001165 if (_Py_atomic_load_relaxed(&ceval->signals_pending)) {
Victor Stinnerda2914d2020-03-20 09:29:08 +01001166 if (handle_signals(tstate) != 0) {
1167 return -1;
1168 }
1169 }
1170
1171 /* Pending calls */
Victor Stinner299b8c62020-05-05 17:40:18 +02001172 struct _ceval_state *ceval2 = &tstate->interp->ceval;
Victor Stinnerda2914d2020-03-20 09:29:08 +01001173 if (_Py_atomic_load_relaxed(&ceval2->pending.calls_to_do)) {
Victor Stinnerbcb094b2021-02-19 15:10:45 +01001174 if (make_pending_calls(tstate->interp) != 0) {
Victor Stinnerda2914d2020-03-20 09:29:08 +01001175 return -1;
1176 }
1177 }
1178
1179 /* GIL drop request */
Victor Stinner0b1e3302020-05-05 16:14:31 +02001180 if (_Py_atomic_load_relaxed(&ceval2->gil_drop_request)) {
Victor Stinnerda2914d2020-03-20 09:29:08 +01001181 /* Give another thread a chance */
1182 if (_PyThreadState_Swap(&runtime->gilstate, NULL) != tstate) {
1183 Py_FatalError("tstate mix-up");
1184 }
Victor Stinner0b1e3302020-05-05 16:14:31 +02001185 drop_gil(ceval, ceval2, tstate);
Victor Stinnerda2914d2020-03-20 09:29:08 +01001186
1187 /* Other threads may run now */
1188
1189 take_gil(tstate);
1190
Victor Stinnere838a932020-05-05 19:56:48 +02001191#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
1192 (void)_PyThreadState_Swap(&runtime->gilstate, tstate);
1193#else
Victor Stinnerda2914d2020-03-20 09:29:08 +01001194 if (_PyThreadState_Swap(&runtime->gilstate, tstate) != NULL) {
1195 Py_FatalError("orphan tstate");
1196 }
Victor Stinnere838a932020-05-05 19:56:48 +02001197#endif
Victor Stinnerda2914d2020-03-20 09:29:08 +01001198 }
1199
1200 /* Check for asynchronous exception. */
1201 if (tstate->async_exc != NULL) {
1202 PyObject *exc = tstate->async_exc;
1203 tstate->async_exc = NULL;
Victor Stinnerb54a99d2020-04-08 23:35:05 +02001204 UNSIGNAL_ASYNC_EXC(tstate->interp);
Victor Stinnerda2914d2020-03-20 09:29:08 +01001205 _PyErr_SetNone(tstate, exc);
1206 Py_DECREF(exc);
1207 return -1;
1208 }
1209
Victor Stinnerd96a7a82020-11-13 14:44:42 +01001210#ifdef MS_WINDOWS
1211 // bpo-42296: On Windows, _PyEval_SignalReceived() can be called in a
1212 // different thread than the Python thread, in which case
1213 // _Py_ThreadCanHandleSignals() is wrong. Recompute eval_breaker in the
1214 // current Python thread with the correct _Py_ThreadCanHandleSignals()
1215 // value. It prevents to interrupt the eval loop at every instruction if
1216 // the current Python thread cannot handle signals (if
1217 // _Py_ThreadCanHandleSignals() is false).
1218 COMPUTE_EVAL_BREAKER(tstate->interp, ceval, ceval2);
1219#endif
1220
Victor Stinnerda2914d2020-03-20 09:29:08 +01001221 return 0;
1222}
1223
Victor Stinner3c1e4812012-03-26 22:10:51 +02001224
Antoine Pitroub52ec782009-01-25 16:34:23 +00001225/* Computed GOTOs, or
1226 the-optimization-commonly-but-improperly-known-as-"threaded code"
1227 using gcc's labels-as-values extension
1228 (http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html).
1229
1230 The traditional bytecode evaluation loop uses a "switch" statement, which
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001231 decent compilers will optimize as a single indirect branch instruction
Antoine Pitroub52ec782009-01-25 16:34:23 +00001232 combined with a lookup table of jump addresses. However, since the
1233 indirect jump instruction is shared by all opcodes, the CPU will have a
1234 hard time making the right prediction for where to jump next (actually,
1235 it will be always wrong except in the uncommon case of a sequence of
1236 several identical opcodes).
1237
1238 "Threaded code" in contrast, uses an explicit jump table and an explicit
1239 indirect jump instruction at the end of each opcode. Since the jump
1240 instruction is at a different address for each opcode, the CPU will make a
1241 separate prediction for each of these instructions, which is equivalent to
1242 predicting the second opcode of each opcode pair. These predictions have
1243 a much better chance to turn out valid, especially in small bytecode loops.
1244
1245 A mispredicted branch on a modern CPU flushes the whole pipeline and
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001246 can cost several CPU cycles (depending on the pipeline depth),
Antoine Pitroub52ec782009-01-25 16:34:23 +00001247 and potentially many more instructions (depending on the pipeline width).
1248 A correctly predicted branch, however, is nearly free.
1249
1250 At the time of this writing, the "threaded code" version is up to 15-20%
1251 faster than the normal "switch" version, depending on the compiler and the
1252 CPU architecture.
1253
1254 We disable the optimization if DYNAMIC_EXECUTION_PROFILE is defined,
1255 because it would render the measurements invalid.
1256
1257
1258 NOTE: care must be taken that the compiler doesn't try to "optimize" the
1259 indirect jumps by sharing them between all opcodes. Such optimizations
1260 can be disabled on gcc by using the -fno-gcse flag (or possibly
1261 -fno-crossjumping).
1262*/
1263
Mark Shannon28d28e02021-04-08 11:22:55 +01001264/* Use macros rather than inline functions, to make it as clear as possible
1265 * to the C compiler that the tracing check is a simple test then branch.
1266 * We want to be sure that the compiler knows this before it generates
1267 * the CFG.
1268 */
1269#ifdef LLTRACE
1270#define OR_LLTRACE || lltrace
1271#else
1272#define OR_LLTRACE
1273#endif
1274
1275#ifdef WITH_DTRACE
1276#define OR_DTRACE_LINE || PyDTrace_LINE_ENABLED()
1277#else
1278#define OR_DTRACE_LINE
1279#endif
1280
Antoine Pitrou042b1282010-08-13 21:15:58 +00001281#ifdef DYNAMIC_EXECUTION_PROFILE
Antoine Pitroub52ec782009-01-25 16:34:23 +00001282#undef USE_COMPUTED_GOTOS
Antoine Pitrou042b1282010-08-13 21:15:58 +00001283#define USE_COMPUTED_GOTOS 0
Antoine Pitroub52ec782009-01-25 16:34:23 +00001284#endif
1285
Antoine Pitrou042b1282010-08-13 21:15:58 +00001286#ifdef HAVE_COMPUTED_GOTOS
1287 #ifndef USE_COMPUTED_GOTOS
1288 #define USE_COMPUTED_GOTOS 1
1289 #endif
1290#else
1291 #if defined(USE_COMPUTED_GOTOS) && USE_COMPUTED_GOTOS
1292 #error "Computed gotos are not supported on this compiler."
1293 #endif
1294 #undef USE_COMPUTED_GOTOS
1295 #define USE_COMPUTED_GOTOS 0
1296#endif
1297
1298#if USE_COMPUTED_GOTOS
Mark Shannon28d28e02021-04-08 11:22:55 +01001299#define TARGET(op) op: TARGET_##op
Mark Shannon28d28e02021-04-08 11:22:55 +01001300#define DISPATCH() \
1301 { \
Mark Shannon9e7b2072021-04-13 11:08:14 +01001302 if (trace_info.cframe.use_tracing OR_DTRACE_LINE OR_LLTRACE) { \
Mark Shannon28d28e02021-04-08 11:22:55 +01001303 goto tracing_dispatch; \
1304 } \
1305 f->f_lasti = INSTR_OFFSET(); \
1306 NEXTOPARG(); \
Mark Shannon2be4c372021-09-29 13:16:13 +01001307 goto *opcode_targets[opcode]; \
Mark Shannon28d28e02021-04-08 11:22:55 +01001308 }
Mark Shannon2be4c372021-09-29 13:16:13 +01001309#else
1310#define TARGET(op) op
1311#define DISPATCH() goto predispatch;
1312#endif
1313
Mark Shannon28d28e02021-04-08 11:22:55 +01001314
Mark Shannon4958f5d2021-03-24 17:56:12 +00001315#define CHECK_EVAL_BREAKER() \
1316 if (_Py_atomic_load_relaxed(eval_breaker)) { \
1317 continue; \
1318 }
1319
Antoine Pitroub52ec782009-01-25 16:34:23 +00001320
Neal Norwitza81d2202002-07-14 00:27:26 +00001321/* Tuple access macros */
1322
1323#ifndef Py_DEBUG
1324#define GETITEM(v, i) PyTuple_GET_ITEM((PyTupleObject *)(v), (i))
1325#else
1326#define GETITEM(v, i) PyTuple_GetItem((v), (i))
1327#endif
1328
Guido van Rossum374a9221991-04-04 10:40:29 +00001329/* Code access macros */
1330
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001331/* The integer overflow is checked by an assertion below. */
Mark Shannonfcb55c02021-04-01 16:00:31 +01001332#define INSTR_OFFSET() ((int)(next_instr - first_instr))
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001333#define NEXTOPARG() do { \
Serhiy Storchakaab874002016-09-11 13:48:15 +03001334 _Py_CODEUNIT word = *next_instr; \
1335 opcode = _Py_OPCODE(word); \
1336 oparg = _Py_OPARG(word); \
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001337 next_instr++; \
1338 } while (0)
Mark Shannonfcb55c02021-04-01 16:00:31 +01001339#define JUMPTO(x) (next_instr = first_instr + (x))
1340#define JUMPBY(x) (next_instr += (x))
Guido van Rossum374a9221991-04-04 10:40:29 +00001341
Raymond Hettingerf606f872003-03-16 03:11:04 +00001342/* OpCode prediction macros
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001343 Some opcodes tend to come in pairs thus making it possible to
1344 predict the second code when the first is run. For example,
Serhiy Storchakada9c5132016-06-27 18:58:57 +03001345 COMPARE_OP is often followed by POP_JUMP_IF_FALSE or POP_JUMP_IF_TRUE.
Raymond Hettingerf606f872003-03-16 03:11:04 +00001346
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001347 Verifying the prediction costs a single high-speed test of a register
1348 variable against a constant. If the pairing was good, then the
1349 processor's own internal branch predication has a high likelihood of
1350 success, resulting in a nearly zero-overhead transition to the
1351 next opcode. A successful prediction saves a trip through the eval-loop
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001352 including its unpredictable switch-case branch. Combined with the
1353 processor's internal branch prediction, a successful PREDICT has the
1354 effect of making the two opcodes run as if they were a single new opcode
1355 with the bodies combined.
Raymond Hettingerf606f872003-03-16 03:11:04 +00001356
Georg Brandl86b2fb92008-07-16 03:43:04 +00001357 If collecting opcode statistics, your choices are to either keep the
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001358 predictions turned-on and interpret the results as if some opcodes
1359 had been combined or turn-off predictions so that the opcode frequency
1360 counter updates for both opcodes.
Antoine Pitroub52ec782009-01-25 16:34:23 +00001361
1362 Opcode prediction is disabled with threaded code, since the latter allows
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001363 the CPU to record separate branch prediction information for each
1364 opcode.
Antoine Pitroub52ec782009-01-25 16:34:23 +00001365
Raymond Hettingerf606f872003-03-16 03:11:04 +00001366*/
1367
Denis Chernikovbaf29b22020-02-21 12:17:50 +03001368#define PREDICT_ID(op) PRED_##op
1369
Antoine Pitrou042b1282010-08-13 21:15:58 +00001370#if defined(DYNAMIC_EXECUTION_PROFILE) || USE_COMPUTED_GOTOS
Denis Chernikovbaf29b22020-02-21 12:17:50 +03001371#define PREDICT(op) if (0) goto PREDICT_ID(op)
Raymond Hettingera7216982004-02-08 19:59:27 +00001372#else
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001373#define PREDICT(op) \
Denis Chernikovbaf29b22020-02-21 12:17:50 +03001374 do { \
Serhiy Storchakaab874002016-09-11 13:48:15 +03001375 _Py_CODEUNIT word = *next_instr; \
1376 opcode = _Py_OPCODE(word); \
Denis Chernikovbaf29b22020-02-21 12:17:50 +03001377 if (opcode == op) { \
Serhiy Storchakaab874002016-09-11 13:48:15 +03001378 oparg = _Py_OPARG(word); \
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001379 next_instr++; \
Denis Chernikovbaf29b22020-02-21 12:17:50 +03001380 goto PREDICT_ID(op); \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001381 } \
1382 } while(0)
Antoine Pitroub52ec782009-01-25 16:34:23 +00001383#endif
Denis Chernikovbaf29b22020-02-21 12:17:50 +03001384#define PREDICTED(op) PREDICT_ID(op):
Antoine Pitroub52ec782009-01-25 16:34:23 +00001385
Raymond Hettingerf606f872003-03-16 03:11:04 +00001386
Guido van Rossum374a9221991-04-04 10:40:29 +00001387/* Stack manipulation macros */
1388
Martin v. Löwis18e16552006-02-15 17:27:45 +00001389/* The stack can grow at most MAXINT deep, as co_nlocals and
1390 co_stacksize are ints. */
Stefan Krahb7e10102010-06-23 18:42:39 +00001391#define STACK_LEVEL() ((int)(stack_pointer - f->f_valuestack))
1392#define EMPTY() (STACK_LEVEL() == 0)
1393#define TOP() (stack_pointer[-1])
1394#define SECOND() (stack_pointer[-2])
1395#define THIRD() (stack_pointer[-3])
1396#define FOURTH() (stack_pointer[-4])
1397#define PEEK(n) (stack_pointer[-(n)])
1398#define SET_TOP(v) (stack_pointer[-1] = (v))
1399#define SET_SECOND(v) (stack_pointer[-2] = (v))
1400#define SET_THIRD(v) (stack_pointer[-3] = (v))
1401#define SET_FOURTH(v) (stack_pointer[-4] = (v))
Stefan Krahb7e10102010-06-23 18:42:39 +00001402#define BASIC_STACKADJ(n) (stack_pointer += n)
1403#define BASIC_PUSH(v) (*stack_pointer++ = (v))
1404#define BASIC_POP() (*--stack_pointer)
Guido van Rossum374a9221991-04-04 10:40:29 +00001405
Guido van Rossum96a42c81992-01-12 02:29:51 +00001406#ifdef LLTRACE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001407#define PUSH(v) { (void)(BASIC_PUSH(v), \
Victor Stinner438a12d2019-05-24 17:01:38 +02001408 lltrace && prtrace(tstate, TOP(), "push")); \
Stefan Krahb7e10102010-06-23 18:42:39 +00001409 assert(STACK_LEVEL() <= co->co_stacksize); }
Victor Stinner438a12d2019-05-24 17:01:38 +02001410#define POP() ((void)(lltrace && prtrace(tstate, TOP(), "pop")), \
Stefan Krahb7e10102010-06-23 18:42:39 +00001411 BASIC_POP())
costypetrisor8ed317f2018-07-31 20:55:14 +00001412#define STACK_GROW(n) do { \
1413 assert(n >= 0); \
1414 (void)(BASIC_STACKADJ(n), \
Victor Stinner438a12d2019-05-24 17:01:38 +02001415 lltrace && prtrace(tstate, TOP(), "stackadj")); \
costypetrisor8ed317f2018-07-31 20:55:14 +00001416 assert(STACK_LEVEL() <= co->co_stacksize); \
1417 } while (0)
1418#define STACK_SHRINK(n) do { \
1419 assert(n >= 0); \
Victor Stinner438a12d2019-05-24 17:01:38 +02001420 (void)(lltrace && prtrace(tstate, TOP(), "stackadj")); \
costypetrisor8ed317f2018-07-31 20:55:14 +00001421 (void)(BASIC_STACKADJ(-n)); \
1422 assert(STACK_LEVEL() <= co->co_stacksize); \
1423 } while (0)
Christian Heimes0449f632007-12-15 01:27:15 +00001424#define EXT_POP(STACK_POINTER) ((void)(lltrace && \
Victor Stinner438a12d2019-05-24 17:01:38 +02001425 prtrace(tstate, (STACK_POINTER)[-1], "ext_pop")), \
Stefan Krahb7e10102010-06-23 18:42:39 +00001426 *--(STACK_POINTER))
Guido van Rossum374a9221991-04-04 10:40:29 +00001427#else
Stefan Krahb7e10102010-06-23 18:42:39 +00001428#define PUSH(v) BASIC_PUSH(v)
1429#define POP() BASIC_POP()
costypetrisor8ed317f2018-07-31 20:55:14 +00001430#define STACK_GROW(n) BASIC_STACKADJ(n)
1431#define STACK_SHRINK(n) BASIC_STACKADJ(-n)
Guido van Rossumc2e20742006-02-27 22:32:47 +00001432#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
Guido van Rossum374a9221991-04-04 10:40:29 +00001433#endif
1434
Guido van Rossum681d79a1995-07-18 14:51:37 +00001435/* Local variable macros */
1436
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001437#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumcfbf1a32002-03-28 20:17:52 +00001438
1439/* The SETLOCAL() macro must not DECREF the local variable in-place and
1440 then store the new value; it must copy the old value to a temporary
1441 value, then store the new value, and then DECREF the temporary value.
1442 This is because it is possible that during the DECREF the frame is
1443 accessed by other code (e.g. a __del__ method or gc.collect()) and the
1444 variable would be pointing to already-freed memory. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001445#define SETLOCAL(i, value) do { PyObject *tmp = GETLOCAL(i); \
Stefan Krahb7e10102010-06-23 18:42:39 +00001446 GETLOCAL(i) = value; \
1447 Py_XDECREF(tmp); } while (0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00001448
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001449
1450#define UNWIND_BLOCK(b) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001451 while (STACK_LEVEL() > (b)->b_level) { \
1452 PyObject *v = POP(); \
1453 Py_XDECREF(v); \
1454 }
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001455
1456#define UNWIND_EXCEPT_HANDLER(b) \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001457 do { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001458 PyObject *type, *value, *traceback; \
Mark Shannonae3087c2017-10-22 22:41:51 +01001459 _PyErr_StackItem *exc_info; \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001460 assert(STACK_LEVEL() >= (b)->b_level + 3); \
1461 while (STACK_LEVEL() > (b)->b_level + 3) { \
1462 value = POP(); \
1463 Py_XDECREF(value); \
1464 } \
Mark Shannonae3087c2017-10-22 22:41:51 +01001465 exc_info = tstate->exc_info; \
1466 type = exc_info->exc_type; \
1467 value = exc_info->exc_value; \
1468 traceback = exc_info->exc_traceback; \
1469 exc_info->exc_type = POP(); \
1470 exc_info->exc_value = POP(); \
1471 exc_info->exc_traceback = POP(); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001472 Py_XDECREF(type); \
1473 Py_XDECREF(value); \
1474 Py_XDECREF(traceback); \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001475 } while(0)
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001476
Inada Naoki91234a12019-06-03 21:30:58 +09001477 /* macros for opcode cache */
1478#define OPCACHE_CHECK() \
1479 do { \
1480 co_opcache = NULL; \
1481 if (co->co_opcache != NULL) { \
Pablo Galindo109826c2020-10-20 06:22:44 +01001482 unsigned char co_opcache_offset = \
Inada Naoki91234a12019-06-03 21:30:58 +09001483 co->co_opcache_map[next_instr - first_instr]; \
Pablo Galindo109826c2020-10-20 06:22:44 +01001484 if (co_opcache_offset > 0) { \
1485 assert(co_opcache_offset <= co->co_opcache_size); \
1486 co_opcache = &co->co_opcache[co_opcache_offset - 1]; \
Inada Naoki91234a12019-06-03 21:30:58 +09001487 assert(co_opcache != NULL); \
Inada Naoki91234a12019-06-03 21:30:58 +09001488 } \
1489 } \
1490 } while (0)
1491
Pablo Galindo109826c2020-10-20 06:22:44 +01001492#define OPCACHE_DEOPT() \
1493 do { \
1494 if (co_opcache != NULL) { \
1495 co_opcache->optimized = -1; \
1496 unsigned char co_opcache_offset = \
1497 co->co_opcache_map[next_instr - first_instr]; \
1498 assert(co_opcache_offset <= co->co_opcache_size); \
1499 co->co_opcache_map[co_opcache_offset] = 0; \
1500 co_opcache = NULL; \
1501 } \
1502 } while (0)
1503
1504#define OPCACHE_DEOPT_LOAD_ATTR() \
1505 do { \
1506 if (co_opcache != NULL) { \
1507 OPCACHE_STAT_ATTR_DEOPT(); \
1508 OPCACHE_DEOPT(); \
1509 } \
1510 } while (0)
1511
1512#define OPCACHE_MAYBE_DEOPT_LOAD_ATTR() \
1513 do { \
1514 if (co_opcache != NULL && --co_opcache->optimized <= 0) { \
1515 OPCACHE_DEOPT_LOAD_ATTR(); \
1516 } \
1517 } while (0)
1518
Inada Naoki91234a12019-06-03 21:30:58 +09001519#if OPCACHE_STATS
1520
1521#define OPCACHE_STAT_GLOBAL_HIT() \
1522 do { \
1523 if (co->co_opcache != NULL) opcache_global_hits++; \
1524 } while (0)
1525
1526#define OPCACHE_STAT_GLOBAL_MISS() \
1527 do { \
1528 if (co->co_opcache != NULL) opcache_global_misses++; \
1529 } while (0)
1530
1531#define OPCACHE_STAT_GLOBAL_OPT() \
1532 do { \
1533 if (co->co_opcache != NULL) opcache_global_opts++; \
1534 } while (0)
1535
Pablo Galindo109826c2020-10-20 06:22:44 +01001536#define OPCACHE_STAT_ATTR_HIT() \
1537 do { \
1538 if (co->co_opcache != NULL) opcache_attr_hits++; \
1539 } while (0)
1540
1541#define OPCACHE_STAT_ATTR_MISS() \
1542 do { \
1543 if (co->co_opcache != NULL) opcache_attr_misses++; \
1544 } while (0)
1545
1546#define OPCACHE_STAT_ATTR_OPT() \
1547 do { \
1548 if (co->co_opcache!= NULL) opcache_attr_opts++; \
1549 } while (0)
1550
1551#define OPCACHE_STAT_ATTR_DEOPT() \
1552 do { \
1553 if (co->co_opcache != NULL) opcache_attr_deopts++; \
1554 } while (0)
1555
1556#define OPCACHE_STAT_ATTR_TOTAL() \
1557 do { \
1558 if (co->co_opcache != NULL) opcache_attr_total++; \
1559 } while (0)
1560
Inada Naoki91234a12019-06-03 21:30:58 +09001561#else /* OPCACHE_STATS */
1562
1563#define OPCACHE_STAT_GLOBAL_HIT()
1564#define OPCACHE_STAT_GLOBAL_MISS()
1565#define OPCACHE_STAT_GLOBAL_OPT()
1566
Pablo Galindo109826c2020-10-20 06:22:44 +01001567#define OPCACHE_STAT_ATTR_HIT()
1568#define OPCACHE_STAT_ATTR_MISS()
1569#define OPCACHE_STAT_ATTR_OPT()
1570#define OPCACHE_STAT_ATTR_DEOPT()
1571#define OPCACHE_STAT_ATTR_TOTAL()
1572
Inada Naoki91234a12019-06-03 21:30:58 +09001573#endif
1574
Mark Shannond41bddd2021-03-25 12:00:30 +00001575
1576PyObject* _Py_HOT_FUNCTION
1577_PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag)
1578{
1579 _Py_EnsureTstateNotNULL(tstate);
1580
1581#if USE_COMPUTED_GOTOS
1582/* Import the static jump table */
1583#include "opcode_targets.h"
1584#endif
1585
1586#ifdef DXPAIRS
1587 int lastopcode = 0;
1588#endif
1589 PyObject **stack_pointer; /* Next free slot in value stack */
1590 const _Py_CODEUNIT *next_instr;
1591 int opcode; /* Current opcode */
1592 int oparg; /* Current opcode argument, if any */
1593 PyObject **fastlocals, **freevars;
1594 PyObject *retval = NULL; /* Return value */
Mark Shannon9e7b2072021-04-13 11:08:14 +01001595 _Py_atomic_int * const eval_breaker = &tstate->interp->ceval.eval_breaker;
Mark Shannond41bddd2021-03-25 12:00:30 +00001596 PyCodeObject *co;
1597
Mark Shannond41bddd2021-03-25 12:00:30 +00001598 const _Py_CODEUNIT *first_instr;
1599 PyObject *names;
1600 PyObject *consts;
1601 _PyOpcache *co_opcache;
1602
1603#ifdef LLTRACE
1604 _Py_IDENTIFIER(__ltrace__);
1605#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +00001606
Victor Stinnerbe434dc2019-11-05 00:51:22 +01001607 if (_Py_EnterRecursiveCall(tstate, "")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001608 return NULL;
Victor Stinnerbe434dc2019-11-05 00:51:22 +01001609 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001610
Mark Shannon8e1b4062021-03-05 14:45:50 +00001611 PyTraceInfo trace_info;
Mark Shannon28d28e02021-04-08 11:22:55 +01001612 /* Mark trace_info as uninitialized */
Mark Shannon8e1b4062021-03-05 14:45:50 +00001613 trace_info.code = NULL;
1614
Mark Shannon9e7b2072021-04-13 11:08:14 +01001615 /* WARNING: Because the CFrame lives on the C stack,
1616 * but can be accessed from a heap allocated object (tstate)
1617 * strict stack discipline must be maintained.
1618 */
1619 CFrame *prev_cframe = tstate->cframe;
1620 trace_info.cframe.use_tracing = prev_cframe->use_tracing;
1621 trace_info.cframe.previous = prev_cframe;
1622 tstate->cframe = &trace_info.cframe;
1623
Mark Shannon8e1b4062021-03-05 14:45:50 +00001624 /* push frame */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001625 tstate->frame = f;
Mark Shannon86433452021-01-07 16:49:02 +00001626 co = f->f_code;
Tim Peters5ca576e2001-06-18 22:08:13 +00001627
Mark Shannon9e7b2072021-04-13 11:08:14 +01001628 if (trace_info.cframe.use_tracing) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001629 if (tstate->c_tracefunc != NULL) {
1630 /* tstate->c_tracefunc, if defined, is a
1631 function that will be called on *every* entry
1632 to a code block. Its return value, if not
1633 None, is a function that will be called at
1634 the start of each executed line of code.
1635 (Actually, the function must return itself
1636 in order to continue tracing.) The trace
1637 functions are called with three arguments:
1638 a pointer to the current frame, a string
1639 indicating why the function is called, and
1640 an argument which depends on the situation.
1641 The global trace function is also called
1642 whenever an exception is detected. */
1643 if (call_trace_protected(tstate->c_tracefunc,
1644 tstate->c_traceobj,
Mark Shannon8e1b4062021-03-05 14:45:50 +00001645 tstate, f, &trace_info,
Mark Shannon86433452021-01-07 16:49:02 +00001646 PyTrace_CALL, Py_None)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001647 /* Trace function raised an error */
1648 goto exit_eval_frame;
1649 }
1650 }
1651 if (tstate->c_profilefunc != NULL) {
1652 /* Similar for c_profilefunc, except it needn't
1653 return itself and isn't called for "line" events */
1654 if (call_trace_protected(tstate->c_profilefunc,
1655 tstate->c_profileobj,
Mark Shannon8e1b4062021-03-05 14:45:50 +00001656 tstate, f, &trace_info,
Mark Shannon86433452021-01-07 16:49:02 +00001657 PyTrace_CALL, Py_None)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001658 /* Profile function raised an error */
1659 goto exit_eval_frame;
1660 }
1661 }
1662 }
Neil Schemenauer6c0f2002001-09-04 19:03:35 +00001663
Łukasz Langaa785c872016-09-09 17:37:37 -07001664 if (PyDTrace_FUNCTION_ENTRY_ENABLED())
1665 dtrace_function_entry(f);
1666
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001667 names = co->co_names;
1668 consts = co->co_consts;
1669 fastlocals = f->f_localsplus;
1670 freevars = f->f_localsplus + co->co_nlocals;
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001671 assert(PyBytes_Check(co->co_code));
1672 assert(PyBytes_GET_SIZE(co->co_code) <= INT_MAX);
Serhiy Storchakaab874002016-09-11 13:48:15 +03001673 assert(PyBytes_GET_SIZE(co->co_code) % sizeof(_Py_CODEUNIT) == 0);
1674 assert(_Py_IS_ALIGNED(PyBytes_AS_STRING(co->co_code), sizeof(_Py_CODEUNIT)));
1675 first_instr = (_Py_CODEUNIT *) PyBytes_AS_STRING(co->co_code);
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001676 /*
1677 f->f_lasti refers to the index of the last instruction,
1678 unless it's -1 in which case next_instr should be first_instr.
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001679
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001680 YIELD_FROM sets f_lasti to itself, in order to repeatedly yield
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05001681 multiple values.
Thomas Wouters902d6eb2007-01-09 23:18:33 +00001682
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001683 When the PREDICT() macros are enabled, some opcode pairs follow in
1684 direct succession without updating f->f_lasti. A successful
1685 prediction effectively links the two codes together as if they
1686 were a single new opcode; accordingly,f->f_lasti will point to
1687 the first code in the pair (for instance, GET_ITER followed by
1688 FOR_ITER is effectively a single opcode and f->f_lasti will point
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001689 to the beginning of the combined pair.)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001690 */
Serhiy Storchakaab874002016-09-11 13:48:15 +03001691 assert(f->f_lasti >= -1);
Mark Shannonfcb55c02021-04-01 16:00:31 +01001692 next_instr = first_instr + f->f_lasti + 1;
Mark Shannoncb9879b2020-07-17 11:44:23 +01001693 stack_pointer = f->f_valuestack + f->f_stackdepth;
1694 /* Set f->f_stackdepth to -1.
1695 * Update when returning or calling trace function.
1696 Having f_stackdepth <= 0 ensures that invalid
1697 values are not visible to the cycle GC.
1698 We choose -1 rather than 0 to assist debugging.
1699 */
1700 f->f_stackdepth = -1;
1701 f->f_state = FRAME_EXECUTING;
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001702
Pablo Galindoaf5fa132021-02-28 22:41:09 +00001703 if (co->co_opcache_flag < opcache_min_runs) {
Inada Naoki91234a12019-06-03 21:30:58 +09001704 co->co_opcache_flag++;
Pablo Galindoaf5fa132021-02-28 22:41:09 +00001705 if (co->co_opcache_flag == opcache_min_runs) {
Inada Naoki91234a12019-06-03 21:30:58 +09001706 if (_PyCode_InitOpcache(co) < 0) {
Victor Stinner25104942020-04-24 02:43:18 +02001707 goto exit_eval_frame;
Inada Naoki91234a12019-06-03 21:30:58 +09001708 }
1709#if OPCACHE_STATS
1710 opcache_code_objects_extra_mem +=
1711 PyBytes_Size(co->co_code) / sizeof(_Py_CODEUNIT) +
1712 sizeof(_PyOpcache) * co->co_opcache_size;
1713 opcache_code_objects++;
1714#endif
1715 }
1716 }
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001717
Tim Peters5ca576e2001-06-18 22:08:13 +00001718#ifdef LLTRACE
Serhiy Storchakafb5db7e2020-10-26 08:43:39 +02001719 {
1720 int r = _PyDict_ContainsId(f->f_globals, &PyId___ltrace__);
1721 if (r < 0) {
1722 goto exit_eval_frame;
1723 }
1724 lltrace = r;
1725 }
Tim Peters5ca576e2001-06-18 22:08:13 +00001726#endif
Guido van Rossumac7be682001-01-17 15:42:30 +00001727
Serhiy Storchakafb5db7e2020-10-26 08:43:39 +02001728 if (throwflag) { /* support for generator.throw() */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001729 goto error;
Serhiy Storchakafb5db7e2020-10-26 08:43:39 +02001730 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001731
Victor Stinnerace47d72013-07-18 01:41:08 +02001732#ifdef Py_DEBUG
Victor Stinner0b72b232020-03-12 23:18:39 +01001733 /* _PyEval_EvalFrameDefault() must not be called with an exception set,
Victor Stinnera8cb5152017-01-18 14:12:51 +01001734 because it can clear it (directly or indirectly) and so the
Martin Panter9955a372015-10-07 10:26:23 +00001735 caller loses its exception */
Victor Stinner438a12d2019-05-24 17:01:38 +02001736 assert(!_PyErr_Occurred(tstate));
Victor Stinnerace47d72013-07-18 01:41:08 +02001737#endif
1738
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001739main_loop:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001740 for (;;) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001741 assert(stack_pointer >= f->f_valuestack); /* else underflow */
1742 assert(STACK_LEVEL() <= co->co_stacksize); /* else overflow */
Victor Stinner438a12d2019-05-24 17:01:38 +02001743 assert(!_PyErr_Occurred(tstate));
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001744
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001745 /* Do periodic things. Doing this every time through
1746 the loop would add too much overhead, so we do it
1747 only every Nth instruction. We also do it if
Chris Jerdonek4a12d122020-05-14 19:25:45 -07001748 ``pending.calls_to_do'' is set, i.e. when an asynchronous
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001749 event needs attention (e.g. a signal handler or
1750 async I/O handler); see Py_AddPendingCall() and
1751 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +00001752
Eric Snow7bda9de2019-03-08 17:25:54 -07001753 if (_Py_atomic_load_relaxed(eval_breaker)) {
Serhiy Storchaka3f4d90d2018-07-09 15:40:14 +03001754 opcode = _Py_OPCODE(*next_instr);
Mark Shannon28d28e02021-04-08 11:22:55 +01001755 if (opcode != SETUP_FINALLY &&
1756 opcode != SETUP_WITH &&
1757 opcode != BEFORE_ASYNC_WITH &&
1758 opcode != YIELD_FROM) {
Serhiy Storchaka3f4d90d2018-07-09 15:40:14 +03001759 /* Few cases where we skip running signal handlers and other
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07001760 pending calls:
Serhiy Storchaka3f4d90d2018-07-09 15:40:14 +03001761 - If we're about to enter the 'with:'. It will prevent
1762 emitting a resource warning in the common idiom
1763 'with open(path) as file:'.
1764 - If we're about to enter the 'async with:'.
1765 - If we're about to enter the 'try:' of a try/finally (not
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07001766 *very* useful, but might help in some cases and it's
1767 traditional)
1768 - If we're resuming a chain of nested 'yield from' or
1769 'await' calls, then each frame is parked with YIELD_FROM
1770 as its next opcode. If the user hit control-C we want to
1771 wait until we've reached the innermost frame before
1772 running the signal handler and raising KeyboardInterrupt
1773 (see bpo-30039).
1774 */
Mark Shannon28d28e02021-04-08 11:22:55 +01001775 if (eval_frame_handle_pending(tstate) != 0) {
1776 goto error;
1777 }
1778 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001779 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001780
Mark Shannon28d28e02021-04-08 11:22:55 +01001781 tracing_dispatch:
Mark Shannon9f2c63b2021-07-08 19:21:22 +01001782 {
1783 int instr_prev = f->f_lasti;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001784 f->f_lasti = INSTR_OFFSET();
Mark Shannon28d28e02021-04-08 11:22:55 +01001785 NEXTOPARG();
Guido van Rossumac7be682001-01-17 15:42:30 +00001786
Łukasz Langaa785c872016-09-09 17:37:37 -07001787 if (PyDTrace_LINE_ENABLED())
Mark Shannon9f2c63b2021-07-08 19:21:22 +01001788 maybe_dtrace_line(f, &trace_info, instr_prev);
Łukasz Langaa785c872016-09-09 17:37:37 -07001789
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001790 /* line-by-line tracing support */
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001791
Mark Shannon9e7b2072021-04-13 11:08:14 +01001792 if (trace_info.cframe.use_tracing &&
Benjamin Peterson51f46162013-01-23 08:38:47 -05001793 tstate->c_tracefunc != NULL && !tstate->tracing) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001794 int err;
Victor Stinnerb7d8d8d2020-09-23 14:07:16 +02001795 /* see maybe_call_line_trace()
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001796 for expository comments */
Victor Stinnerb7d8d8d2020-09-23 14:07:16 +02001797 f->f_stackdepth = (int)(stack_pointer - f->f_valuestack);
Tim Peters8a5c3c72004-04-05 19:36:21 +00001798
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001799 err = maybe_call_line_trace(tstate->c_tracefunc,
1800 tstate->c_traceobj,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01001801 tstate, f,
Mark Shannon9f2c63b2021-07-08 19:21:22 +01001802 &trace_info, instr_prev);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001803 /* Reload possibly changed frame fields */
1804 JUMPTO(f->f_lasti);
Mark Shannoncb9879b2020-07-17 11:44:23 +01001805 stack_pointer = f->f_valuestack+f->f_stackdepth;
1806 f->f_stackdepth = -1;
Mark Shannon28d28e02021-04-08 11:22:55 +01001807 if (err) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001808 /* trace function raised an exception */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001809 goto error;
Mark Shannon28d28e02021-04-08 11:22:55 +01001810 }
1811 NEXTOPARG();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001812 }
Mark Shannon9f2c63b2021-07-08 19:21:22 +01001813 }
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001814
Guido van Rossum96a42c81992-01-12 02:29:51 +00001815#ifdef LLTRACE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001816 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +00001817
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001818 if (lltrace) {
1819 if (HAS_ARG(opcode)) {
1820 printf("%d: %d, %d\n",
1821 f->f_lasti, opcode, oparg);
1822 }
1823 else {
1824 printf("%d: %d\n",
1825 f->f_lasti, opcode);
1826 }
1827 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001828#endif
Mark Shannon2be4c372021-09-29 13:16:13 +01001829#if USE_COMPUTED_GOTOS == 0
1830 goto dispatch_opcode;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001831
Mark Shannon2be4c372021-09-29 13:16:13 +01001832 predispatch:
1833 if (trace_info.cframe.use_tracing OR_DTRACE_LINE OR_LLTRACE) {
1834 goto tracing_dispatch;
1835 }
1836 f->f_lasti = INSTR_OFFSET();
1837 NEXTOPARG();
1838#endif
Mark Shannon28d28e02021-04-08 11:22:55 +01001839 dispatch_opcode:
1840#ifdef DYNAMIC_EXECUTION_PROFILE
1841#ifdef DXPAIRS
1842 dxpairs[lastopcode][opcode]++;
1843 lastopcode = opcode;
1844#endif
1845 dxp[opcode]++;
1846#endif
1847
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001848 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +00001849
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001850 /* BEWARE!
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001851 It is essential that any operation that fails must goto error
Mark Shannon28d28e02021-04-08 11:22:55 +01001852 and that all operation that succeed call DISPATCH() ! */
Guido van Rossumac7be682001-01-17 15:42:30 +00001853
Benjamin Petersonddd19492018-09-16 22:38:02 -07001854 case TARGET(NOP): {
Mark Shannon4958f5d2021-03-24 17:56:12 +00001855 DISPATCH();
Benjamin Petersonddd19492018-09-16 22:38:02 -07001856 }
Raymond Hettinger9c18e812004-06-21 16:31:15 +00001857
Benjamin Petersonddd19492018-09-16 22:38:02 -07001858 case TARGET(LOAD_FAST): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001859 PyObject *value = GETLOCAL(oparg);
1860 if (value == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02001861 format_exc_check_arg(tstate, PyExc_UnboundLocalError,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001862 UNBOUNDLOCAL_ERROR_MSG,
1863 PyTuple_GetItem(co->co_varnames, oparg));
1864 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001865 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001866 Py_INCREF(value);
1867 PUSH(value);
Mark Shannon4958f5d2021-03-24 17:56:12 +00001868 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001869 }
1870
Benjamin Petersonddd19492018-09-16 22:38:02 -07001871 case TARGET(LOAD_CONST): {
1872 PREDICTED(LOAD_CONST);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001873 PyObject *value = GETITEM(consts, oparg);
1874 Py_INCREF(value);
1875 PUSH(value);
Mark Shannon4958f5d2021-03-24 17:56:12 +00001876 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001877 }
Neil Schemenauer63543862002-02-17 19:10:14 +00001878
Benjamin Petersonddd19492018-09-16 22:38:02 -07001879 case TARGET(STORE_FAST): {
1880 PREDICTED(STORE_FAST);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001881 PyObject *value = POP();
1882 SETLOCAL(oparg, value);
Mark Shannon4958f5d2021-03-24 17:56:12 +00001883 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001884 }
Neil Schemenauer63543862002-02-17 19:10:14 +00001885
Benjamin Petersonddd19492018-09-16 22:38:02 -07001886 case TARGET(POP_TOP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001887 PyObject *value = POP();
1888 Py_DECREF(value);
Mark Shannon4958f5d2021-03-24 17:56:12 +00001889 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001890 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001891
Benjamin Petersonddd19492018-09-16 22:38:02 -07001892 case TARGET(ROT_TWO): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001893 PyObject *top = TOP();
1894 PyObject *second = SECOND();
1895 SET_TOP(second);
1896 SET_SECOND(top);
Mark Shannon4958f5d2021-03-24 17:56:12 +00001897 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001898 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001899
Benjamin Petersonddd19492018-09-16 22:38:02 -07001900 case TARGET(ROT_THREE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001901 PyObject *top = TOP();
1902 PyObject *second = SECOND();
1903 PyObject *third = THIRD();
1904 SET_TOP(second);
1905 SET_SECOND(third);
1906 SET_THIRD(top);
Mark Shannon4958f5d2021-03-24 17:56:12 +00001907 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001908 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001909
Benjamin Petersonddd19492018-09-16 22:38:02 -07001910 case TARGET(ROT_FOUR): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001911 PyObject *top = TOP();
1912 PyObject *second = SECOND();
1913 PyObject *third = THIRD();
1914 PyObject *fourth = FOURTH();
1915 SET_TOP(second);
1916 SET_SECOND(third);
1917 SET_THIRD(fourth);
1918 SET_FOURTH(top);
Mark Shannon4958f5d2021-03-24 17:56:12 +00001919 DISPATCH();
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001920 }
1921
Benjamin Petersonddd19492018-09-16 22:38:02 -07001922 case TARGET(DUP_TOP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001923 PyObject *top = TOP();
1924 Py_INCREF(top);
1925 PUSH(top);
Mark Shannon4958f5d2021-03-24 17:56:12 +00001926 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001927 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001928
Benjamin Petersonddd19492018-09-16 22:38:02 -07001929 case TARGET(DUP_TOP_TWO): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001930 PyObject *top = TOP();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001931 PyObject *second = SECOND();
Benjamin Petersonf208df32012-10-12 11:37:56 -04001932 Py_INCREF(top);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001933 Py_INCREF(second);
costypetrisor8ed317f2018-07-31 20:55:14 +00001934 STACK_GROW(2);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001935 SET_TOP(top);
1936 SET_SECOND(second);
Mark Shannon4958f5d2021-03-24 17:56:12 +00001937 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001938 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001939
Benjamin Petersonddd19492018-09-16 22:38:02 -07001940 case TARGET(UNARY_POSITIVE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001941 PyObject *value = TOP();
1942 PyObject *res = PyNumber_Positive(value);
1943 Py_DECREF(value);
1944 SET_TOP(res);
1945 if (res == NULL)
1946 goto error;
1947 DISPATCH();
1948 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001949
Benjamin Petersonddd19492018-09-16 22:38:02 -07001950 case TARGET(UNARY_NEGATIVE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001951 PyObject *value = TOP();
1952 PyObject *res = PyNumber_Negative(value);
1953 Py_DECREF(value);
1954 SET_TOP(res);
1955 if (res == NULL)
1956 goto error;
1957 DISPATCH();
1958 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001959
Benjamin Petersonddd19492018-09-16 22:38:02 -07001960 case TARGET(UNARY_NOT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001961 PyObject *value = TOP();
1962 int err = PyObject_IsTrue(value);
1963 Py_DECREF(value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001964 if (err == 0) {
1965 Py_INCREF(Py_True);
1966 SET_TOP(Py_True);
1967 DISPATCH();
1968 }
1969 else if (err > 0) {
1970 Py_INCREF(Py_False);
1971 SET_TOP(Py_False);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001972 DISPATCH();
1973 }
costypetrisor8ed317f2018-07-31 20:55:14 +00001974 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001975 goto error;
1976 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001977
Benjamin Petersonddd19492018-09-16 22:38:02 -07001978 case TARGET(UNARY_INVERT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001979 PyObject *value = TOP();
1980 PyObject *res = PyNumber_Invert(value);
1981 Py_DECREF(value);
1982 SET_TOP(res);
1983 if (res == NULL)
1984 goto error;
1985 DISPATCH();
1986 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001987
Benjamin Petersonddd19492018-09-16 22:38:02 -07001988 case TARGET(BINARY_POWER): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001989 PyObject *exp = POP();
1990 PyObject *base = TOP();
1991 PyObject *res = PyNumber_Power(base, exp, Py_None);
1992 Py_DECREF(base);
1993 Py_DECREF(exp);
1994 SET_TOP(res);
1995 if (res == NULL)
1996 goto error;
1997 DISPATCH();
1998 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001999
Benjamin Petersonddd19492018-09-16 22:38:02 -07002000 case TARGET(BINARY_MULTIPLY): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002001 PyObject *right = POP();
2002 PyObject *left = TOP();
2003 PyObject *res = PyNumber_Multiply(left, right);
2004 Py_DECREF(left);
2005 Py_DECREF(right);
2006 SET_TOP(res);
2007 if (res == NULL)
2008 goto error;
2009 DISPATCH();
2010 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002011
Benjamin Petersonddd19492018-09-16 22:38:02 -07002012 case TARGET(BINARY_MATRIX_MULTIPLY): {
Benjamin Petersond51374e2014-04-09 23:55:56 -04002013 PyObject *right = POP();
2014 PyObject *left = TOP();
2015 PyObject *res = PyNumber_MatrixMultiply(left, right);
2016 Py_DECREF(left);
2017 Py_DECREF(right);
2018 SET_TOP(res);
2019 if (res == NULL)
2020 goto error;
2021 DISPATCH();
2022 }
2023
Benjamin Petersonddd19492018-09-16 22:38:02 -07002024 case TARGET(BINARY_TRUE_DIVIDE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002025 PyObject *divisor = POP();
2026 PyObject *dividend = TOP();
2027 PyObject *quotient = PyNumber_TrueDivide(dividend, divisor);
2028 Py_DECREF(dividend);
2029 Py_DECREF(divisor);
2030 SET_TOP(quotient);
2031 if (quotient == NULL)
2032 goto error;
2033 DISPATCH();
2034 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002035
Benjamin Petersonddd19492018-09-16 22:38:02 -07002036 case TARGET(BINARY_FLOOR_DIVIDE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002037 PyObject *divisor = POP();
2038 PyObject *dividend = TOP();
2039 PyObject *quotient = PyNumber_FloorDivide(dividend, divisor);
2040 Py_DECREF(dividend);
2041 Py_DECREF(divisor);
2042 SET_TOP(quotient);
2043 if (quotient == NULL)
2044 goto error;
2045 DISPATCH();
2046 }
Guido van Rossum4668b002001-08-08 05:00:18 +00002047
Benjamin Petersonddd19492018-09-16 22:38:02 -07002048 case TARGET(BINARY_MODULO): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002049 PyObject *divisor = POP();
2050 PyObject *dividend = TOP();
Martijn Pietersd7e64332017-02-23 13:38:04 +00002051 PyObject *res;
2052 if (PyUnicode_CheckExact(dividend) && (
2053 !PyUnicode_Check(divisor) || PyUnicode_CheckExact(divisor))) {
2054 // fast path; string formatting, but not if the RHS is a str subclass
2055 // (see issue28598)
2056 res = PyUnicode_Format(dividend, divisor);
2057 } else {
2058 res = PyNumber_Remainder(dividend, divisor);
2059 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002060 Py_DECREF(divisor);
2061 Py_DECREF(dividend);
2062 SET_TOP(res);
2063 if (res == NULL)
2064 goto error;
2065 DISPATCH();
2066 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002067
Benjamin Petersonddd19492018-09-16 22:38:02 -07002068 case TARGET(BINARY_ADD): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002069 PyObject *right = POP();
2070 PyObject *left = TOP();
2071 PyObject *sum;
Victor Stinnerbd0a08e2020-10-01 18:57:37 +02002072 /* NOTE(vstinner): Please don't try to micro-optimize int+int on
Victor Stinnerd65f42a2016-10-20 12:18:10 +02002073 CPython using bytecode, it is simply worthless.
2074 See http://bugs.python.org/issue21955 and
2075 http://bugs.python.org/issue10044 for the discussion. In short,
2076 no patch shown any impact on a realistic benchmark, only a minor
2077 speedup on microbenchmarks. */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002078 if (PyUnicode_CheckExact(left) &&
2079 PyUnicode_CheckExact(right)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002080 sum = unicode_concatenate(tstate, left, right, f, next_instr);
Martin Panter95f53c12016-07-18 08:23:26 +00002081 /* unicode_concatenate consumed the ref to left */
Victor Stinnerd2a915d2011-10-02 20:34:20 +02002082 }
2083 else {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002084 sum = PyNumber_Add(left, right);
2085 Py_DECREF(left);
Victor Stinnerd2a915d2011-10-02 20:34:20 +02002086 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002087 Py_DECREF(right);
2088 SET_TOP(sum);
2089 if (sum == NULL)
2090 goto error;
2091 DISPATCH();
2092 }
2093
Benjamin Petersonddd19492018-09-16 22:38:02 -07002094 case TARGET(BINARY_SUBTRACT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002095 PyObject *right = POP();
2096 PyObject *left = TOP();
2097 PyObject *diff = PyNumber_Subtract(left, right);
2098 Py_DECREF(right);
2099 Py_DECREF(left);
2100 SET_TOP(diff);
2101 if (diff == NULL)
2102 goto error;
2103 DISPATCH();
2104 }
2105
Benjamin Petersonddd19492018-09-16 22:38:02 -07002106 case TARGET(BINARY_SUBSCR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002107 PyObject *sub = POP();
2108 PyObject *container = TOP();
2109 PyObject *res = PyObject_GetItem(container, sub);
2110 Py_DECREF(container);
2111 Py_DECREF(sub);
2112 SET_TOP(res);
2113 if (res == NULL)
2114 goto error;
2115 DISPATCH();
2116 }
2117
Benjamin Petersonddd19492018-09-16 22:38:02 -07002118 case TARGET(BINARY_LSHIFT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002119 PyObject *right = POP();
2120 PyObject *left = TOP();
2121 PyObject *res = PyNumber_Lshift(left, right);
2122 Py_DECREF(left);
2123 Py_DECREF(right);
2124 SET_TOP(res);
2125 if (res == NULL)
2126 goto error;
2127 DISPATCH();
2128 }
2129
Benjamin Petersonddd19492018-09-16 22:38:02 -07002130 case TARGET(BINARY_RSHIFT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002131 PyObject *right = POP();
2132 PyObject *left = TOP();
2133 PyObject *res = PyNumber_Rshift(left, right);
2134 Py_DECREF(left);
2135 Py_DECREF(right);
2136 SET_TOP(res);
2137 if (res == NULL)
2138 goto error;
2139 DISPATCH();
2140 }
2141
Benjamin Petersonddd19492018-09-16 22:38:02 -07002142 case TARGET(BINARY_AND): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002143 PyObject *right = POP();
2144 PyObject *left = TOP();
2145 PyObject *res = PyNumber_And(left, right);
2146 Py_DECREF(left);
2147 Py_DECREF(right);
2148 SET_TOP(res);
2149 if (res == NULL)
2150 goto error;
2151 DISPATCH();
2152 }
2153
Benjamin Petersonddd19492018-09-16 22:38:02 -07002154 case TARGET(BINARY_XOR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002155 PyObject *right = POP();
2156 PyObject *left = TOP();
2157 PyObject *res = PyNumber_Xor(left, right);
2158 Py_DECREF(left);
2159 Py_DECREF(right);
2160 SET_TOP(res);
2161 if (res == NULL)
2162 goto error;
2163 DISPATCH();
2164 }
2165
Benjamin Petersonddd19492018-09-16 22:38:02 -07002166 case TARGET(BINARY_OR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002167 PyObject *right = POP();
2168 PyObject *left = TOP();
2169 PyObject *res = PyNumber_Or(left, right);
2170 Py_DECREF(left);
2171 Py_DECREF(right);
2172 SET_TOP(res);
2173 if (res == NULL)
2174 goto error;
2175 DISPATCH();
2176 }
2177
Benjamin Petersonddd19492018-09-16 22:38:02 -07002178 case TARGET(LIST_APPEND): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002179 PyObject *v = POP();
2180 PyObject *list = PEEK(oparg);
2181 int err;
2182 err = PyList_Append(list, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002183 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002184 if (err != 0)
2185 goto error;
2186 PREDICT(JUMP_ABSOLUTE);
2187 DISPATCH();
2188 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002189
Benjamin Petersonddd19492018-09-16 22:38:02 -07002190 case TARGET(SET_ADD): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002191 PyObject *v = POP();
Raymond Hettinger41862222016-10-15 19:03:06 -07002192 PyObject *set = PEEK(oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002193 int err;
2194 err = PySet_Add(set, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002195 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002196 if (err != 0)
2197 goto error;
2198 PREDICT(JUMP_ABSOLUTE);
2199 DISPATCH();
2200 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002201
Benjamin Petersonddd19492018-09-16 22:38:02 -07002202 case TARGET(INPLACE_POWER): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002203 PyObject *exp = POP();
2204 PyObject *base = TOP();
2205 PyObject *res = PyNumber_InPlacePower(base, exp, Py_None);
2206 Py_DECREF(base);
2207 Py_DECREF(exp);
2208 SET_TOP(res);
2209 if (res == NULL)
2210 goto error;
2211 DISPATCH();
2212 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002213
Benjamin Petersonddd19492018-09-16 22:38:02 -07002214 case TARGET(INPLACE_MULTIPLY): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002215 PyObject *right = POP();
2216 PyObject *left = TOP();
2217 PyObject *res = PyNumber_InPlaceMultiply(left, right);
2218 Py_DECREF(left);
2219 Py_DECREF(right);
2220 SET_TOP(res);
2221 if (res == NULL)
2222 goto error;
2223 DISPATCH();
2224 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002225
Benjamin Petersonddd19492018-09-16 22:38:02 -07002226 case TARGET(INPLACE_MATRIX_MULTIPLY): {
Benjamin Petersond51374e2014-04-09 23:55:56 -04002227 PyObject *right = POP();
2228 PyObject *left = TOP();
2229 PyObject *res = PyNumber_InPlaceMatrixMultiply(left, right);
2230 Py_DECREF(left);
2231 Py_DECREF(right);
2232 SET_TOP(res);
2233 if (res == NULL)
2234 goto error;
2235 DISPATCH();
2236 }
2237
Benjamin Petersonddd19492018-09-16 22:38:02 -07002238 case TARGET(INPLACE_TRUE_DIVIDE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002239 PyObject *divisor = POP();
2240 PyObject *dividend = TOP();
2241 PyObject *quotient = PyNumber_InPlaceTrueDivide(dividend, divisor);
2242 Py_DECREF(dividend);
2243 Py_DECREF(divisor);
2244 SET_TOP(quotient);
2245 if (quotient == NULL)
2246 goto error;
2247 DISPATCH();
2248 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002249
Benjamin Petersonddd19492018-09-16 22:38:02 -07002250 case TARGET(INPLACE_FLOOR_DIVIDE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002251 PyObject *divisor = POP();
2252 PyObject *dividend = TOP();
2253 PyObject *quotient = PyNumber_InPlaceFloorDivide(dividend, divisor);
2254 Py_DECREF(dividend);
2255 Py_DECREF(divisor);
2256 SET_TOP(quotient);
2257 if (quotient == NULL)
2258 goto error;
2259 DISPATCH();
2260 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002261
Benjamin Petersonddd19492018-09-16 22:38:02 -07002262 case TARGET(INPLACE_MODULO): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002263 PyObject *right = POP();
2264 PyObject *left = TOP();
2265 PyObject *mod = PyNumber_InPlaceRemainder(left, right);
2266 Py_DECREF(left);
2267 Py_DECREF(right);
2268 SET_TOP(mod);
2269 if (mod == NULL)
2270 goto error;
2271 DISPATCH();
2272 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002273
Benjamin Petersonddd19492018-09-16 22:38:02 -07002274 case TARGET(INPLACE_ADD): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002275 PyObject *right = POP();
2276 PyObject *left = TOP();
2277 PyObject *sum;
2278 if (PyUnicode_CheckExact(left) && PyUnicode_CheckExact(right)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002279 sum = unicode_concatenate(tstate, left, right, f, next_instr);
Martin Panter95f53c12016-07-18 08:23:26 +00002280 /* unicode_concatenate consumed the ref to left */
Victor Stinnerd2a915d2011-10-02 20:34:20 +02002281 }
2282 else {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002283 sum = PyNumber_InPlaceAdd(left, right);
2284 Py_DECREF(left);
Victor Stinnerd2a915d2011-10-02 20:34:20 +02002285 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002286 Py_DECREF(right);
2287 SET_TOP(sum);
2288 if (sum == NULL)
2289 goto error;
2290 DISPATCH();
2291 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002292
Benjamin Petersonddd19492018-09-16 22:38:02 -07002293 case TARGET(INPLACE_SUBTRACT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002294 PyObject *right = POP();
2295 PyObject *left = TOP();
2296 PyObject *diff = PyNumber_InPlaceSubtract(left, right);
2297 Py_DECREF(left);
2298 Py_DECREF(right);
2299 SET_TOP(diff);
2300 if (diff == NULL)
2301 goto error;
2302 DISPATCH();
2303 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002304
Benjamin Petersonddd19492018-09-16 22:38:02 -07002305 case TARGET(INPLACE_LSHIFT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002306 PyObject *right = POP();
2307 PyObject *left = TOP();
2308 PyObject *res = PyNumber_InPlaceLshift(left, right);
2309 Py_DECREF(left);
2310 Py_DECREF(right);
2311 SET_TOP(res);
2312 if (res == NULL)
2313 goto error;
2314 DISPATCH();
2315 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002316
Benjamin Petersonddd19492018-09-16 22:38:02 -07002317 case TARGET(INPLACE_RSHIFT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002318 PyObject *right = POP();
2319 PyObject *left = TOP();
2320 PyObject *res = PyNumber_InPlaceRshift(left, right);
2321 Py_DECREF(left);
2322 Py_DECREF(right);
2323 SET_TOP(res);
2324 if (res == NULL)
2325 goto error;
2326 DISPATCH();
2327 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002328
Benjamin Petersonddd19492018-09-16 22:38:02 -07002329 case TARGET(INPLACE_AND): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002330 PyObject *right = POP();
2331 PyObject *left = TOP();
2332 PyObject *res = PyNumber_InPlaceAnd(left, right);
2333 Py_DECREF(left);
2334 Py_DECREF(right);
2335 SET_TOP(res);
2336 if (res == NULL)
2337 goto error;
2338 DISPATCH();
2339 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002340
Benjamin Petersonddd19492018-09-16 22:38:02 -07002341 case TARGET(INPLACE_XOR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002342 PyObject *right = POP();
2343 PyObject *left = TOP();
2344 PyObject *res = PyNumber_InPlaceXor(left, right);
2345 Py_DECREF(left);
2346 Py_DECREF(right);
2347 SET_TOP(res);
2348 if (res == NULL)
2349 goto error;
2350 DISPATCH();
2351 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002352
Benjamin Petersonddd19492018-09-16 22:38:02 -07002353 case TARGET(INPLACE_OR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002354 PyObject *right = POP();
2355 PyObject *left = TOP();
2356 PyObject *res = PyNumber_InPlaceOr(left, right);
2357 Py_DECREF(left);
2358 Py_DECREF(right);
2359 SET_TOP(res);
2360 if (res == NULL)
2361 goto error;
2362 DISPATCH();
2363 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002364
Benjamin Petersonddd19492018-09-16 22:38:02 -07002365 case TARGET(STORE_SUBSCR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002366 PyObject *sub = TOP();
2367 PyObject *container = SECOND();
2368 PyObject *v = THIRD();
2369 int err;
costypetrisor8ed317f2018-07-31 20:55:14 +00002370 STACK_SHRINK(3);
Martin Panter95f53c12016-07-18 08:23:26 +00002371 /* container[sub] = v */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002372 err = PyObject_SetItem(container, sub, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002373 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002374 Py_DECREF(container);
2375 Py_DECREF(sub);
2376 if (err != 0)
2377 goto error;
2378 DISPATCH();
2379 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002380
Benjamin Petersonddd19492018-09-16 22:38:02 -07002381 case TARGET(DELETE_SUBSCR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002382 PyObject *sub = TOP();
2383 PyObject *container = SECOND();
2384 int err;
costypetrisor8ed317f2018-07-31 20:55:14 +00002385 STACK_SHRINK(2);
Martin Panter95f53c12016-07-18 08:23:26 +00002386 /* del container[sub] */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002387 err = PyObject_DelItem(container, sub);
2388 Py_DECREF(container);
2389 Py_DECREF(sub);
2390 if (err != 0)
2391 goto error;
2392 DISPATCH();
2393 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00002394
Benjamin Petersonddd19492018-09-16 22:38:02 -07002395 case TARGET(PRINT_EXPR): {
Victor Stinnercab75e32013-11-06 22:38:37 +01002396 _Py_IDENTIFIER(displayhook);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002397 PyObject *value = POP();
Victor Stinnercab75e32013-11-06 22:38:37 +01002398 PyObject *hook = _PySys_GetObjectId(&PyId_displayhook);
Benjamin Petersonfe1bcb62012-10-12 11:40:01 -04002399 PyObject *res;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002400 if (hook == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002401 _PyErr_SetString(tstate, PyExc_RuntimeError,
2402 "lost sys.displayhook");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002403 Py_DECREF(value);
2404 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002405 }
Petr Viktorinffd97532020-02-11 17:46:57 +01002406 res = PyObject_CallOneArg(hook, value);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002407 Py_DECREF(value);
2408 if (res == NULL)
2409 goto error;
2410 Py_DECREF(res);
2411 DISPATCH();
2412 }
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00002413
Benjamin Petersonddd19492018-09-16 22:38:02 -07002414 case TARGET(RAISE_VARARGS): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002415 PyObject *cause = NULL, *exc = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002416 switch (oparg) {
2417 case 2:
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002418 cause = POP(); /* cause */
Stefan Krahf432a322017-08-21 13:09:59 +02002419 /* fall through */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002420 case 1:
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002421 exc = POP(); /* exc */
Stefan Krahf432a322017-08-21 13:09:59 +02002422 /* fall through */
2423 case 0:
Victor Stinner09532fe2019-05-10 23:39:09 +02002424 if (do_raise(tstate, exc, cause)) {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002425 goto exception_unwind;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002426 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002427 break;
2428 default:
Victor Stinner438a12d2019-05-24 17:01:38 +02002429 _PyErr_SetString(tstate, PyExc_SystemError,
2430 "bad RAISE_VARARGS oparg");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002431 break;
2432 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002433 goto error;
2434 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002435
Benjamin Petersonddd19492018-09-16 22:38:02 -07002436 case TARGET(RETURN_VALUE): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002437 retval = POP();
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002438 assert(f->f_iblock == 0);
Mark Shannone7c9f4a2020-01-13 12:51:26 +00002439 assert(EMPTY());
Mark Shannoncb9879b2020-07-17 11:44:23 +01002440 f->f_state = FRAME_RETURNED;
2441 f->f_stackdepth = 0;
Mark Shannone7c9f4a2020-01-13 12:51:26 +00002442 goto exiting;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002443 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002444
Benjamin Petersonddd19492018-09-16 22:38:02 -07002445 case TARGET(GET_AITER): {
Yury Selivanov6ef05902015-05-28 11:21:31 -04002446 unaryfunc getter = NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04002447 PyObject *iter = NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04002448 PyObject *obj = TOP();
2449 PyTypeObject *type = Py_TYPE(obj);
2450
Yury Selivanova6f6edb2016-06-09 15:08:31 -04002451 if (type->tp_as_async != NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04002452 getter = type->tp_as_async->am_aiter;
Yury Selivanova6f6edb2016-06-09 15:08:31 -04002453 }
Yury Selivanov75445082015-05-11 22:57:16 -04002454
2455 if (getter != NULL) {
2456 iter = (*getter)(obj);
2457 Py_DECREF(obj);
2458 if (iter == NULL) {
2459 SET_TOP(NULL);
2460 goto error;
2461 }
2462 }
2463 else {
2464 SET_TOP(NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02002465 _PyErr_Format(tstate, PyExc_TypeError,
2466 "'async for' requires an object with "
2467 "__aiter__ method, got %.100s",
2468 type->tp_name);
Yury Selivanov75445082015-05-11 22:57:16 -04002469 Py_DECREF(obj);
2470 goto error;
2471 }
2472
Yury Selivanovfaa135a2017-10-06 02:08:57 -04002473 if (Py_TYPE(iter)->tp_as_async == NULL ||
2474 Py_TYPE(iter)->tp_as_async->am_anext == NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04002475
Yury Selivanov398ff912017-03-02 22:20:00 -05002476 SET_TOP(NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02002477 _PyErr_Format(tstate, PyExc_TypeError,
2478 "'async for' received an object from __aiter__ "
2479 "that does not implement __anext__: %.100s",
2480 Py_TYPE(iter)->tp_name);
Yury Selivanov75445082015-05-11 22:57:16 -04002481 Py_DECREF(iter);
2482 goto error;
Yury Selivanova6f6edb2016-06-09 15:08:31 -04002483 }
2484
Yury Selivanovfaa135a2017-10-06 02:08:57 -04002485 SET_TOP(iter);
Yury Selivanov75445082015-05-11 22:57:16 -04002486 DISPATCH();
2487 }
2488
Benjamin Petersonddd19492018-09-16 22:38:02 -07002489 case TARGET(GET_ANEXT): {
Yury Selivanov6ef05902015-05-28 11:21:31 -04002490 unaryfunc getter = NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04002491 PyObject *next_iter = NULL;
2492 PyObject *awaitable = NULL;
2493 PyObject *aiter = TOP();
2494 PyTypeObject *type = Py_TYPE(aiter);
2495
Yury Selivanoveb636452016-09-08 22:01:51 -07002496 if (PyAsyncGen_CheckExact(aiter)) {
2497 awaitable = type->tp_as_async->am_anext(aiter);
2498 if (awaitable == NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04002499 goto error;
2500 }
Yury Selivanoveb636452016-09-08 22:01:51 -07002501 } else {
2502 if (type->tp_as_async != NULL){
2503 getter = type->tp_as_async->am_anext;
2504 }
Yury Selivanov75445082015-05-11 22:57:16 -04002505
Yury Selivanoveb636452016-09-08 22:01:51 -07002506 if (getter != NULL) {
2507 next_iter = (*getter)(aiter);
2508 if (next_iter == NULL) {
2509 goto error;
2510 }
2511 }
2512 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02002513 _PyErr_Format(tstate, PyExc_TypeError,
2514 "'async for' requires an iterator with "
2515 "__anext__ method, got %.100s",
2516 type->tp_name);
Yury Selivanoveb636452016-09-08 22:01:51 -07002517 goto error;
2518 }
Yury Selivanov75445082015-05-11 22:57:16 -04002519
Yury Selivanoveb636452016-09-08 22:01:51 -07002520 awaitable = _PyCoro_GetAwaitableIter(next_iter);
2521 if (awaitable == NULL) {
Yury Selivanov398ff912017-03-02 22:20:00 -05002522 _PyErr_FormatFromCause(
Yury Selivanoveb636452016-09-08 22:01:51 -07002523 PyExc_TypeError,
2524 "'async for' received an invalid object "
2525 "from __anext__: %.100s",
2526 Py_TYPE(next_iter)->tp_name);
2527
2528 Py_DECREF(next_iter);
2529 goto error;
2530 } else {
2531 Py_DECREF(next_iter);
2532 }
2533 }
Yury Selivanov75445082015-05-11 22:57:16 -04002534
2535 PUSH(awaitable);
Serhiy Storchakada9c5132016-06-27 18:58:57 +03002536 PREDICT(LOAD_CONST);
Yury Selivanov75445082015-05-11 22:57:16 -04002537 DISPATCH();
2538 }
2539
Benjamin Petersonddd19492018-09-16 22:38:02 -07002540 case TARGET(GET_AWAITABLE): {
2541 PREDICTED(GET_AWAITABLE);
Yury Selivanov75445082015-05-11 22:57:16 -04002542 PyObject *iterable = TOP();
Yury Selivanov5376ba92015-06-22 12:19:30 -04002543 PyObject *iter = _PyCoro_GetAwaitableIter(iterable);
Yury Selivanov75445082015-05-11 22:57:16 -04002544
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03002545 if (iter == NULL) {
Mark Shannonfee55262019-11-21 09:11:43 +00002546 int opcode_at_minus_3 = 0;
2547 if ((next_instr - first_instr) > 2) {
2548 opcode_at_minus_3 = _Py_OPCODE(next_instr[-3]);
2549 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002550 format_awaitable_error(tstate, Py_TYPE(iterable),
Mark Shannonfee55262019-11-21 09:11:43 +00002551 opcode_at_minus_3,
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03002552 _Py_OPCODE(next_instr[-2]));
2553 }
2554
Yury Selivanov75445082015-05-11 22:57:16 -04002555 Py_DECREF(iterable);
2556
Yury Selivanovc724bae2016-03-02 11:30:46 -05002557 if (iter != NULL && PyCoro_CheckExact(iter)) {
2558 PyObject *yf = _PyGen_yf((PyGenObject*)iter);
2559 if (yf != NULL) {
2560 /* `iter` is a coroutine object that is being
2561 awaited, `yf` is a pointer to the current awaitable
2562 being awaited on. */
2563 Py_DECREF(yf);
2564 Py_CLEAR(iter);
Victor Stinner438a12d2019-05-24 17:01:38 +02002565 _PyErr_SetString(tstate, PyExc_RuntimeError,
2566 "coroutine is being awaited already");
Yury Selivanovc724bae2016-03-02 11:30:46 -05002567 /* The code below jumps to `error` if `iter` is NULL. */
2568 }
2569 }
2570
Yury Selivanov75445082015-05-11 22:57:16 -04002571 SET_TOP(iter); /* Even if it's NULL */
2572
2573 if (iter == NULL) {
2574 goto error;
2575 }
2576
Serhiy Storchakada9c5132016-06-27 18:58:57 +03002577 PREDICT(LOAD_CONST);
Yury Selivanov75445082015-05-11 22:57:16 -04002578 DISPATCH();
2579 }
2580
Benjamin Petersonddd19492018-09-16 22:38:02 -07002581 case TARGET(YIELD_FROM): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002582 PyObject *v = POP();
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07002583 PyObject *receiver = TOP();
Vladimir Matveev037245c2020-10-09 17:15:15 -07002584 PySendResult gen_status;
2585 if (tstate->c_tracefunc == NULL) {
2586 gen_status = PyIter_Send(receiver, v, &retval);
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05002587 } else {
Vladimir Matveev037245c2020-10-09 17:15:15 -07002588 _Py_IDENTIFIER(send);
Victor Stinner09bbebe2021-04-11 00:17:39 +02002589 if (Py_IsNone(v) && PyIter_Check(receiver)) {
Vladimir Matveev037245c2020-10-09 17:15:15 -07002590 retval = Py_TYPE(receiver)->tp_iternext(receiver);
Vladimir Matveev2b053612020-09-18 18:38:38 -07002591 }
2592 else {
Vladimir Matveev037245c2020-10-09 17:15:15 -07002593 retval = _PyObject_CallMethodIdOneArg(receiver, &PyId_send, v);
Vladimir Matveev2b053612020-09-18 18:38:38 -07002594 }
Vladimir Matveev2b053612020-09-18 18:38:38 -07002595 if (retval == NULL) {
2596 if (tstate->c_tracefunc != NULL
2597 && _PyErr_ExceptionMatches(tstate, PyExc_StopIteration))
Mark Shannon8e1b4062021-03-05 14:45:50 +00002598 call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj, tstate, f, &trace_info);
Vladimir Matveev2b053612020-09-18 18:38:38 -07002599 if (_PyGen_FetchStopIterationValue(&retval) == 0) {
2600 gen_status = PYGEN_RETURN;
2601 }
2602 else {
2603 gen_status = PYGEN_ERROR;
2604 }
2605 }
2606 else {
2607 gen_status = PYGEN_NEXT;
2608 }
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05002609 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002610 Py_DECREF(v);
Vladimir Matveev2b053612020-09-18 18:38:38 -07002611 if (gen_status == PYGEN_ERROR) {
2612 assert (retval == NULL);
2613 goto error;
2614 }
2615 if (gen_status == PYGEN_RETURN) {
2616 assert (retval != NULL);
2617
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07002618 Py_DECREF(receiver);
Vladimir Matveev2b053612020-09-18 18:38:38 -07002619 SET_TOP(retval);
2620 retval = NULL;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002621 DISPATCH();
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002622 }
Vladimir Matveev2b053612020-09-18 18:38:38 -07002623 assert (gen_status == PYGEN_NEXT);
Martin Panter95f53c12016-07-18 08:23:26 +00002624 /* receiver remains on stack, retval is value to be yielded */
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05002625 /* and repeat... */
Mark Shannonfcb55c02021-04-01 16:00:31 +01002626 assert(f->f_lasti > 0);
2627 f->f_lasti -= 1;
Mark Shannoncb9879b2020-07-17 11:44:23 +01002628 f->f_state = FRAME_SUSPENDED;
Victor Stinnerb7d8d8d2020-09-23 14:07:16 +02002629 f->f_stackdepth = (int)(stack_pointer - f->f_valuestack);
Mark Shannone7c9f4a2020-01-13 12:51:26 +00002630 goto exiting;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002631 }
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002632
Benjamin Petersonddd19492018-09-16 22:38:02 -07002633 case TARGET(YIELD_VALUE): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002634 retval = POP();
Yury Selivanoveb636452016-09-08 22:01:51 -07002635
2636 if (co->co_flags & CO_ASYNC_GENERATOR) {
2637 PyObject *w = _PyAsyncGenValueWrapperNew(retval);
2638 Py_DECREF(retval);
2639 if (w == NULL) {
2640 retval = NULL;
2641 goto error;
2642 }
2643 retval = w;
2644 }
Mark Shannoncb9879b2020-07-17 11:44:23 +01002645 f->f_state = FRAME_SUSPENDED;
Victor Stinnerb7d8d8d2020-09-23 14:07:16 +02002646 f->f_stackdepth = (int)(stack_pointer - f->f_valuestack);
Mark Shannone7c9f4a2020-01-13 12:51:26 +00002647 goto exiting;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002648 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002649
Mark Shannonb37181e2021-04-06 11:48:59 +01002650 case TARGET(GEN_START): {
2651 PyObject *none = POP();
2652 Py_DECREF(none);
Victor Stinner09bbebe2021-04-11 00:17:39 +02002653 if (!Py_IsNone(none)) {
Mark Shannonb37181e2021-04-06 11:48:59 +01002654 if (oparg > 2) {
2655 _PyErr_SetString(tstate, PyExc_SystemError,
2656 "Illegal kind for GEN_START");
2657 }
2658 else {
2659 static const char *gen_kind[3] = {
2660 "generator",
2661 "coroutine",
2662 "async generator"
2663 };
2664 _PyErr_Format(tstate, PyExc_TypeError,
2665 "can't send non-None value to a "
2666 "just-started %s",
2667 gen_kind[oparg]);
2668 }
2669 goto error;
2670 }
2671 DISPATCH();
2672 }
2673
Benjamin Petersonddd19492018-09-16 22:38:02 -07002674 case TARGET(POP_EXCEPT): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002675 PyObject *type, *value, *traceback;
2676 _PyErr_StackItem *exc_info;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002677 PyTryBlock *b = PyFrame_BlockPop(f);
2678 if (b->b_type != EXCEPT_HANDLER) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002679 _PyErr_SetString(tstate, PyExc_SystemError,
2680 "popped block is not an except handler");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002681 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002682 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002683 assert(STACK_LEVEL() >= (b)->b_level + 3 &&
2684 STACK_LEVEL() <= (b)->b_level + 4);
2685 exc_info = tstate->exc_info;
2686 type = exc_info->exc_type;
2687 value = exc_info->exc_value;
2688 traceback = exc_info->exc_traceback;
2689 exc_info->exc_type = POP();
2690 exc_info->exc_value = POP();
2691 exc_info->exc_traceback = POP();
2692 Py_XDECREF(type);
2693 Py_XDECREF(value);
2694 Py_XDECREF(traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002695 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002696 }
Benjamin Petersoneec3d712008-06-11 15:59:43 +00002697
Benjamin Petersonddd19492018-09-16 22:38:02 -07002698 case TARGET(POP_BLOCK): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002699 PyFrame_BlockPop(f);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002700 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002701 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002702
Mark Shannonfee55262019-11-21 09:11:43 +00002703 case TARGET(RERAISE): {
Mark Shannonbf353f32020-12-17 13:55:28 +00002704 assert(f->f_iblock > 0);
2705 if (oparg) {
2706 f->f_lasti = f->f_blockstack[f->f_iblock-1].b_handler;
2707 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002708 PyObject *exc = POP();
Mark Shannonfee55262019-11-21 09:11:43 +00002709 PyObject *val = POP();
2710 PyObject *tb = POP();
2711 assert(PyExceptionClass_Check(exc));
Victor Stinner61f4db82020-01-28 03:37:45 +01002712 _PyErr_Restore(tstate, exc, val, tb);
Mark Shannonfee55262019-11-21 09:11:43 +00002713 goto exception_unwind;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002714 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002715
Benjamin Petersonddd19492018-09-16 22:38:02 -07002716 case TARGET(END_ASYNC_FOR): {
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002717 PyObject *exc = POP();
2718 assert(PyExceptionClass_Check(exc));
2719 if (PyErr_GivenExceptionMatches(exc, PyExc_StopAsyncIteration)) {
2720 PyTryBlock *b = PyFrame_BlockPop(f);
2721 assert(b->b_type == EXCEPT_HANDLER);
2722 Py_DECREF(exc);
2723 UNWIND_EXCEPT_HANDLER(b);
2724 Py_DECREF(POP());
2725 JUMPBY(oparg);
Mark Shannon4958f5d2021-03-24 17:56:12 +00002726 DISPATCH();
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002727 }
2728 else {
2729 PyObject *val = POP();
2730 PyObject *tb = POP();
Victor Stinner438a12d2019-05-24 17:01:38 +02002731 _PyErr_Restore(tstate, exc, val, tb);
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002732 goto exception_unwind;
2733 }
2734 }
2735
Zackery Spytzce6a0702019-08-25 03:44:09 -06002736 case TARGET(LOAD_ASSERTION_ERROR): {
2737 PyObject *value = PyExc_AssertionError;
2738 Py_INCREF(value);
2739 PUSH(value);
Mark Shannon4958f5d2021-03-24 17:56:12 +00002740 DISPATCH();
Zackery Spytzce6a0702019-08-25 03:44:09 -06002741 }
2742
Benjamin Petersonddd19492018-09-16 22:38:02 -07002743 case TARGET(LOAD_BUILD_CLASS): {
Victor Stinner3c1e4812012-03-26 22:10:51 +02002744 _Py_IDENTIFIER(__build_class__);
Victor Stinnerb0b22422012-04-19 00:57:45 +02002745
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002746 PyObject *bc;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002747 if (PyDict_CheckExact(f->f_builtins)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002748 bc = _PyDict_GetItemIdWithError(f->f_builtins, &PyId___build_class__);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002749 if (bc == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002750 if (!_PyErr_Occurred(tstate)) {
2751 _PyErr_SetString(tstate, PyExc_NameError,
2752 "__build_class__ not found");
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002753 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002754 goto error;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002755 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002756 Py_INCREF(bc);
Victor Stinnerb0b22422012-04-19 00:57:45 +02002757 }
2758 else {
2759 PyObject *build_class_str = _PyUnicode_FromId(&PyId___build_class__);
2760 if (build_class_str == NULL)
Serhiy Storchaka70b72f02016-11-08 23:12:46 +02002761 goto error;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002762 bc = PyObject_GetItem(f->f_builtins, build_class_str);
2763 if (bc == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002764 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError))
2765 _PyErr_SetString(tstate, PyExc_NameError,
2766 "__build_class__ not found");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002767 goto error;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002768 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002769 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002770 PUSH(bc);
Benjamin Peterson00f86f22012-10-10 14:10:33 -04002771 DISPATCH();
Victor Stinner3c1e4812012-03-26 22:10:51 +02002772 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002773
Benjamin Petersonddd19492018-09-16 22:38:02 -07002774 case TARGET(STORE_NAME): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002775 PyObject *name = GETITEM(names, oparg);
2776 PyObject *v = POP();
2777 PyObject *ns = f->f_locals;
2778 int err;
2779 if (ns == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002780 _PyErr_Format(tstate, PyExc_SystemError,
2781 "no locals found when storing %R", name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002782 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002783 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002784 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002785 if (PyDict_CheckExact(ns))
2786 err = PyDict_SetItem(ns, name, v);
2787 else
2788 err = PyObject_SetItem(ns, name, v);
2789 Py_DECREF(v);
2790 if (err != 0)
2791 goto error;
2792 DISPATCH();
2793 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002794
Benjamin Petersonddd19492018-09-16 22:38:02 -07002795 case TARGET(DELETE_NAME): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002796 PyObject *name = GETITEM(names, oparg);
2797 PyObject *ns = f->f_locals;
2798 int err;
2799 if (ns == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002800 _PyErr_Format(tstate, PyExc_SystemError,
2801 "no locals when deleting %R", name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002802 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002803 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002804 err = PyObject_DelItem(ns, name);
2805 if (err != 0) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002806 format_exc_check_arg(tstate, PyExc_NameError,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002807 NAME_ERROR_MSG,
2808 name);
2809 goto error;
2810 }
2811 DISPATCH();
2812 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00002813
Benjamin Petersonddd19492018-09-16 22:38:02 -07002814 case TARGET(UNPACK_SEQUENCE): {
2815 PREDICTED(UNPACK_SEQUENCE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002816 PyObject *seq = POP(), *item, **items;
2817 if (PyTuple_CheckExact(seq) &&
2818 PyTuple_GET_SIZE(seq) == oparg) {
2819 items = ((PyTupleObject *)seq)->ob_item;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002820 while (oparg--) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002821 item = items[oparg];
2822 Py_INCREF(item);
2823 PUSH(item);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002824 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002825 } else if (PyList_CheckExact(seq) &&
2826 PyList_GET_SIZE(seq) == oparg) {
2827 items = ((PyListObject *)seq)->ob_item;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002828 while (oparg--) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002829 item = items[oparg];
2830 Py_INCREF(item);
2831 PUSH(item);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002832 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002833 } else if (unpack_iterable(tstate, seq, oparg, -1,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002834 stack_pointer + oparg)) {
costypetrisor8ed317f2018-07-31 20:55:14 +00002835 STACK_GROW(oparg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002836 } else {
2837 /* unpack_iterable() raised an exception */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002838 Py_DECREF(seq);
2839 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002840 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002841 Py_DECREF(seq);
Benjamin Peterson00f86f22012-10-10 14:10:33 -04002842 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002843 }
Guido van Rossum0368b722007-05-11 16:50:42 +00002844
Benjamin Petersonddd19492018-09-16 22:38:02 -07002845 case TARGET(UNPACK_EX): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002846 int totalargs = 1 + (oparg & 0xFF) + (oparg >> 8);
2847 PyObject *seq = POP();
2848
Victor Stinner438a12d2019-05-24 17:01:38 +02002849 if (unpack_iterable(tstate, seq, oparg & 0xFF, oparg >> 8,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002850 stack_pointer + totalargs)) {
2851 stack_pointer += totalargs;
2852 } else {
2853 Py_DECREF(seq);
2854 goto error;
2855 }
2856 Py_DECREF(seq);
2857 DISPATCH();
2858 }
2859
Benjamin Petersonddd19492018-09-16 22:38:02 -07002860 case TARGET(STORE_ATTR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002861 PyObject *name = GETITEM(names, oparg);
2862 PyObject *owner = TOP();
2863 PyObject *v = SECOND();
2864 int err;
costypetrisor8ed317f2018-07-31 20:55:14 +00002865 STACK_SHRINK(2);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002866 err = PyObject_SetAttr(owner, name, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002867 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002868 Py_DECREF(owner);
2869 if (err != 0)
2870 goto error;
2871 DISPATCH();
2872 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002873
Benjamin Petersonddd19492018-09-16 22:38:02 -07002874 case TARGET(DELETE_ATTR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002875 PyObject *name = GETITEM(names, oparg);
2876 PyObject *owner = POP();
2877 int err;
2878 err = PyObject_SetAttr(owner, name, (PyObject *)NULL);
2879 Py_DECREF(owner);
2880 if (err != 0)
2881 goto error;
2882 DISPATCH();
2883 }
2884
Benjamin Petersonddd19492018-09-16 22:38:02 -07002885 case TARGET(STORE_GLOBAL): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002886 PyObject *name = GETITEM(names, oparg);
2887 PyObject *v = POP();
2888 int err;
2889 err = PyDict_SetItem(f->f_globals, name, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002890 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002891 if (err != 0)
2892 goto error;
2893 DISPATCH();
2894 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002895
Benjamin Petersonddd19492018-09-16 22:38:02 -07002896 case TARGET(DELETE_GLOBAL): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002897 PyObject *name = GETITEM(names, oparg);
2898 int err;
2899 err = PyDict_DelItem(f->f_globals, name);
2900 if (err != 0) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002901 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
2902 format_exc_check_arg(tstate, PyExc_NameError,
2903 NAME_ERROR_MSG, name);
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002904 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002905 goto error;
Benjamin Peterson00f86f22012-10-10 14:10:33 -04002906 }
2907 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002908 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002909
Benjamin Petersonddd19492018-09-16 22:38:02 -07002910 case TARGET(LOAD_NAME): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002911 PyObject *name = GETITEM(names, oparg);
2912 PyObject *locals = f->f_locals;
2913 PyObject *v;
2914 if (locals == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002915 _PyErr_Format(tstate, PyExc_SystemError,
2916 "no locals when loading %R", name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002917 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002918 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002919 if (PyDict_CheckExact(locals)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002920 v = PyDict_GetItemWithError(locals, name);
2921 if (v != NULL) {
2922 Py_INCREF(v);
2923 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002924 else if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002925 goto error;
2926 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002927 }
2928 else {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002929 v = PyObject_GetItem(locals, name);
Victor Stinnere20310f2015-11-05 13:56:58 +01002930 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002931 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError))
Benjamin Peterson92722792012-12-15 12:51:05 -05002932 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02002933 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002934 }
2935 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002936 if (v == NULL) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002937 v = PyDict_GetItemWithError(f->f_globals, name);
2938 if (v != NULL) {
2939 Py_INCREF(v);
2940 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002941 else if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002942 goto error;
2943 }
2944 else {
Victor Stinnerb0b22422012-04-19 00:57:45 +02002945 if (PyDict_CheckExact(f->f_builtins)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002946 v = PyDict_GetItemWithError(f->f_builtins, name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002947 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002948 if (!_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002949 format_exc_check_arg(
Victor Stinner438a12d2019-05-24 17:01:38 +02002950 tstate, PyExc_NameError,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002951 NAME_ERROR_MSG, name);
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002952 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002953 goto error;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002954 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002955 Py_INCREF(v);
Victor Stinnerb0b22422012-04-19 00:57:45 +02002956 }
2957 else {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002958 v = PyObject_GetItem(f->f_builtins, name);
2959 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002960 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Victor Stinnerb0b22422012-04-19 00:57:45 +02002961 format_exc_check_arg(
Victor Stinner438a12d2019-05-24 17:01:38 +02002962 tstate, PyExc_NameError,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002963 NAME_ERROR_MSG, name);
Victor Stinner438a12d2019-05-24 17:01:38 +02002964 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002965 goto error;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002966 }
Benjamin Peterson20f9c3c2010-07-20 22:39:34 +00002967 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002968 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002969 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002970 PUSH(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002971 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002972 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002973
Benjamin Petersonddd19492018-09-16 22:38:02 -07002974 case TARGET(LOAD_GLOBAL): {
Inada Naoki91234a12019-06-03 21:30:58 +09002975 PyObject *name;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002976 PyObject *v;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002977 if (PyDict_CheckExact(f->f_globals)
Victor Stinnerb4efc962015-11-20 09:24:02 +01002978 && PyDict_CheckExact(f->f_builtins))
2979 {
Inada Naoki91234a12019-06-03 21:30:58 +09002980 OPCACHE_CHECK();
2981 if (co_opcache != NULL && co_opcache->optimized > 0) {
2982 _PyOpcache_LoadGlobal *lg = &co_opcache->u.lg;
2983
2984 if (lg->globals_ver ==
2985 ((PyDictObject *)f->f_globals)->ma_version_tag
2986 && lg->builtins_ver ==
2987 ((PyDictObject *)f->f_builtins)->ma_version_tag)
2988 {
2989 PyObject *ptr = lg->ptr;
2990 OPCACHE_STAT_GLOBAL_HIT();
2991 assert(ptr != NULL);
2992 Py_INCREF(ptr);
2993 PUSH(ptr);
2994 DISPATCH();
2995 }
2996 }
2997
2998 name = GETITEM(names, oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002999 v = _PyDict_LoadGlobal((PyDictObject *)f->f_globals,
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003000 (PyDictObject *)f->f_builtins,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003001 name);
3002 if (v == NULL) {
Victor Stinnera4860542021-02-19 15:08:54 +01003003 if (!_PyErr_Occurred(tstate)) {
Victor Stinnerb4efc962015-11-20 09:24:02 +01003004 /* _PyDict_LoadGlobal() returns NULL without raising
3005 * an exception if the key doesn't exist */
Victor Stinner438a12d2019-05-24 17:01:38 +02003006 format_exc_check_arg(tstate, PyExc_NameError,
Ezio Melotti04a29552013-03-03 15:12:44 +02003007 NAME_ERROR_MSG, name);
Victor Stinnerb4efc962015-11-20 09:24:02 +01003008 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003009 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003010 }
Inada Naoki91234a12019-06-03 21:30:58 +09003011
3012 if (co_opcache != NULL) {
3013 _PyOpcache_LoadGlobal *lg = &co_opcache->u.lg;
3014
3015 if (co_opcache->optimized == 0) {
3016 /* Wasn't optimized before. */
3017 OPCACHE_STAT_GLOBAL_OPT();
3018 } else {
3019 OPCACHE_STAT_GLOBAL_MISS();
3020 }
3021
3022 co_opcache->optimized = 1;
3023 lg->globals_ver =
3024 ((PyDictObject *)f->f_globals)->ma_version_tag;
3025 lg->builtins_ver =
3026 ((PyDictObject *)f->f_builtins)->ma_version_tag;
3027 lg->ptr = v; /* borrowed */
3028 }
3029
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003030 Py_INCREF(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003031 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003032 else {
3033 /* Slow-path if globals or builtins is not a dict */
Victor Stinnerb4efc962015-11-20 09:24:02 +01003034
3035 /* namespace 1: globals */
Inada Naoki91234a12019-06-03 21:30:58 +09003036 name = GETITEM(names, oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003037 v = PyObject_GetItem(f->f_globals, name);
3038 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003039 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Victor Stinner60a1d3c2015-11-05 13:55:20 +01003040 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02003041 }
3042 _PyErr_Clear(tstate);
Victor Stinner60a1d3c2015-11-05 13:55:20 +01003043
Victor Stinnerb4efc962015-11-20 09:24:02 +01003044 /* namespace 2: builtins */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003045 v = PyObject_GetItem(f->f_builtins, name);
3046 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003047 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003048 format_exc_check_arg(
Victor Stinner438a12d2019-05-24 17:01:38 +02003049 tstate, PyExc_NameError,
Ezio Melotti04a29552013-03-03 15:12:44 +02003050 NAME_ERROR_MSG, name);
Victor Stinner438a12d2019-05-24 17:01:38 +02003051 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003052 goto error;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04003053 }
3054 }
3055 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003056 PUSH(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003057 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003058 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003059
Benjamin Petersonddd19492018-09-16 22:38:02 -07003060 case TARGET(DELETE_FAST): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003061 PyObject *v = GETLOCAL(oparg);
3062 if (v != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003063 SETLOCAL(oparg, NULL);
3064 DISPATCH();
3065 }
3066 format_exc_check_arg(
Victor Stinner438a12d2019-05-24 17:01:38 +02003067 tstate, PyExc_UnboundLocalError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003068 UNBOUNDLOCAL_ERROR_MSG,
3069 PyTuple_GetItem(co->co_varnames, oparg)
3070 );
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003071 goto error;
3072 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003073
Benjamin Petersonddd19492018-09-16 22:38:02 -07003074 case TARGET(DELETE_DEREF): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003075 PyObject *cell = freevars[oparg];
Raymond Hettingerc32f9db2016-11-12 04:10:35 -05003076 PyObject *oldobj = PyCell_GET(cell);
3077 if (oldobj != NULL) {
3078 PyCell_SET(cell, NULL);
3079 Py_DECREF(oldobj);
Benjamin Peterson00ebe2c2010-09-10 22:02:31 +00003080 DISPATCH();
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00003081 }
Victor Stinner438a12d2019-05-24 17:01:38 +02003082 format_exc_unbound(tstate, co, oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003083 goto error;
3084 }
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00003085
Benjamin Petersonddd19492018-09-16 22:38:02 -07003086 case TARGET(LOAD_CLOSURE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003087 PyObject *cell = freevars[oparg];
3088 Py_INCREF(cell);
3089 PUSH(cell);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003090 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003091 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003092
Benjamin Petersonddd19492018-09-16 22:38:02 -07003093 case TARGET(LOAD_CLASSDEREF): {
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04003094 PyObject *name, *value, *locals = f->f_locals;
Victor Stinnerd3dfd0e2013-05-16 23:48:01 +02003095 Py_ssize_t idx;
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04003096 assert(locals);
3097 assert(oparg >= PyTuple_GET_SIZE(co->co_cellvars));
3098 idx = oparg - PyTuple_GET_SIZE(co->co_cellvars);
3099 assert(idx >= 0 && idx < PyTuple_GET_SIZE(co->co_freevars));
3100 name = PyTuple_GET_ITEM(co->co_freevars, idx);
3101 if (PyDict_CheckExact(locals)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02003102 value = PyDict_GetItemWithError(locals, name);
3103 if (value != NULL) {
3104 Py_INCREF(value);
3105 }
Victor Stinner438a12d2019-05-24 17:01:38 +02003106 else if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02003107 goto error;
3108 }
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04003109 }
3110 else {
3111 value = PyObject_GetItem(locals, name);
Victor Stinnere20310f2015-11-05 13:56:58 +01003112 if (value == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003113 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04003114 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02003115 }
3116 _PyErr_Clear(tstate);
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04003117 }
3118 }
3119 if (!value) {
3120 PyObject *cell = freevars[oparg];
3121 value = PyCell_GET(cell);
3122 if (value == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003123 format_exc_unbound(tstate, co, oparg);
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04003124 goto error;
3125 }
3126 Py_INCREF(value);
3127 }
3128 PUSH(value);
3129 DISPATCH();
3130 }
3131
Benjamin Petersonddd19492018-09-16 22:38:02 -07003132 case TARGET(LOAD_DEREF): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003133 PyObject *cell = freevars[oparg];
3134 PyObject *value = PyCell_GET(cell);
3135 if (value == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003136 format_exc_unbound(tstate, co, oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003137 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003138 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003139 Py_INCREF(value);
3140 PUSH(value);
3141 DISPATCH();
3142 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003143
Benjamin Petersonddd19492018-09-16 22:38:02 -07003144 case TARGET(STORE_DEREF): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003145 PyObject *v = POP();
3146 PyObject *cell = freevars[oparg];
Raymond Hettingerb2b15432016-11-11 04:32:11 -08003147 PyObject *oldobj = PyCell_GET(cell);
3148 PyCell_SET(cell, v);
3149 Py_XDECREF(oldobj);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003150 DISPATCH();
3151 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003152
Benjamin Petersonddd19492018-09-16 22:38:02 -07003153 case TARGET(BUILD_STRING): {
Serhiy Storchakaea525a22016-09-06 22:07:53 +03003154 PyObject *str;
3155 PyObject *empty = PyUnicode_New(0, 0);
3156 if (empty == NULL) {
3157 goto error;
3158 }
3159 str = _PyUnicode_JoinArray(empty, stack_pointer - oparg, oparg);
3160 Py_DECREF(empty);
3161 if (str == NULL)
3162 goto error;
3163 while (--oparg >= 0) {
3164 PyObject *item = POP();
3165 Py_DECREF(item);
3166 }
3167 PUSH(str);
3168 DISPATCH();
3169 }
3170
Benjamin Petersonddd19492018-09-16 22:38:02 -07003171 case TARGET(BUILD_TUPLE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003172 PyObject *tup = PyTuple_New(oparg);
3173 if (tup == NULL)
3174 goto error;
3175 while (--oparg >= 0) {
3176 PyObject *item = POP();
3177 PyTuple_SET_ITEM(tup, oparg, item);
3178 }
3179 PUSH(tup);
3180 DISPATCH();
3181 }
3182
Benjamin Petersonddd19492018-09-16 22:38:02 -07003183 case TARGET(BUILD_LIST): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003184 PyObject *list = PyList_New(oparg);
3185 if (list == NULL)
3186 goto error;
3187 while (--oparg >= 0) {
3188 PyObject *item = POP();
3189 PyList_SET_ITEM(list, oparg, item);
3190 }
3191 PUSH(list);
3192 DISPATCH();
3193 }
3194
Mark Shannon13bc1392020-01-23 09:25:17 +00003195 case TARGET(LIST_TO_TUPLE): {
3196 PyObject *list = POP();
3197 PyObject *tuple = PyList_AsTuple(list);
3198 Py_DECREF(list);
3199 if (tuple == NULL) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003200 goto error;
Mark Shannon13bc1392020-01-23 09:25:17 +00003201 }
3202 PUSH(tuple);
3203 DISPATCH();
3204 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003205
Mark Shannon13bc1392020-01-23 09:25:17 +00003206 case TARGET(LIST_EXTEND): {
3207 PyObject *iterable = POP();
3208 PyObject *list = PEEK(oparg);
3209 PyObject *none_val = _PyList_Extend((PyListObject *)list, iterable);
3210 if (none_val == NULL) {
3211 if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError) &&
Victor Stinnera102ed72020-02-07 02:24:48 +01003212 (Py_TYPE(iterable)->tp_iter == NULL && !PySequence_Check(iterable)))
Mark Shannon13bc1392020-01-23 09:25:17 +00003213 {
Victor Stinner61f4db82020-01-28 03:37:45 +01003214 _PyErr_Clear(tstate);
Mark Shannon13bc1392020-01-23 09:25:17 +00003215 _PyErr_Format(tstate, PyExc_TypeError,
3216 "Value after * must be an iterable, not %.200s",
3217 Py_TYPE(iterable)->tp_name);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003218 }
Mark Shannon13bc1392020-01-23 09:25:17 +00003219 Py_DECREF(iterable);
3220 goto error;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003221 }
Mark Shannon13bc1392020-01-23 09:25:17 +00003222 Py_DECREF(none_val);
3223 Py_DECREF(iterable);
3224 DISPATCH();
3225 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003226
Mark Shannon13bc1392020-01-23 09:25:17 +00003227 case TARGET(SET_UPDATE): {
3228 PyObject *iterable = POP();
3229 PyObject *set = PEEK(oparg);
3230 int err = _PySet_Update(set, iterable);
3231 Py_DECREF(iterable);
3232 if (err < 0) {
3233 goto error;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003234 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003235 DISPATCH();
3236 }
3237
Benjamin Petersonddd19492018-09-16 22:38:02 -07003238 case TARGET(BUILD_SET): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003239 PyObject *set = PySet_New(NULL);
3240 int err = 0;
Raymond Hettinger4c483ad2016-09-08 14:45:40 -07003241 int i;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003242 if (set == NULL)
3243 goto error;
Raymond Hettinger4c483ad2016-09-08 14:45:40 -07003244 for (i = oparg; i > 0; i--) {
3245 PyObject *item = PEEK(i);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003246 if (err == 0)
3247 err = PySet_Add(set, item);
3248 Py_DECREF(item);
3249 }
costypetrisor8ed317f2018-07-31 20:55:14 +00003250 STACK_SHRINK(oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003251 if (err != 0) {
3252 Py_DECREF(set);
3253 goto error;
3254 }
3255 PUSH(set);
3256 DISPATCH();
3257 }
3258
Benjamin Petersonddd19492018-09-16 22:38:02 -07003259 case TARGET(BUILD_MAP): {
Victor Stinner74319ae2016-08-25 00:04:09 +02003260 Py_ssize_t i;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003261 PyObject *map = _PyDict_NewPresized((Py_ssize_t)oparg);
3262 if (map == NULL)
3263 goto error;
Benjamin Petersond5d77aa2015-07-05 10:37:25 -05003264 for (i = oparg; i > 0; i--) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003265 int err;
Benjamin Petersond5d77aa2015-07-05 10:37:25 -05003266 PyObject *key = PEEK(2*i);
3267 PyObject *value = PEEK(2*i - 1);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003268 err = PyDict_SetItem(map, key, value);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003269 if (err != 0) {
3270 Py_DECREF(map);
3271 goto error;
3272 }
3273 }
Benjamin Petersond5d77aa2015-07-05 10:37:25 -05003274
3275 while (oparg--) {
3276 Py_DECREF(POP());
3277 Py_DECREF(POP());
3278 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003279 PUSH(map);
3280 DISPATCH();
3281 }
3282
Benjamin Petersonddd19492018-09-16 22:38:02 -07003283 case TARGET(SETUP_ANNOTATIONS): {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003284 _Py_IDENTIFIER(__annotations__);
3285 int err;
3286 PyObject *ann_dict;
3287 if (f->f_locals == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003288 _PyErr_Format(tstate, PyExc_SystemError,
3289 "no locals found when setting up annotations");
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003290 goto error;
3291 }
3292 /* check if __annotations__ in locals()... */
3293 if (PyDict_CheckExact(f->f_locals)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02003294 ann_dict = _PyDict_GetItemIdWithError(f->f_locals,
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003295 &PyId___annotations__);
3296 if (ann_dict == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003297 if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02003298 goto error;
3299 }
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003300 /* ...if not, create a new one */
3301 ann_dict = PyDict_New();
3302 if (ann_dict == NULL) {
3303 goto error;
3304 }
3305 err = _PyDict_SetItemId(f->f_locals,
3306 &PyId___annotations__, ann_dict);
3307 Py_DECREF(ann_dict);
3308 if (err != 0) {
3309 goto error;
3310 }
3311 }
3312 }
3313 else {
3314 /* do the same if locals() is not a dict */
3315 PyObject *ann_str = _PyUnicode_FromId(&PyId___annotations__);
3316 if (ann_str == NULL) {
Serhiy Storchaka4678b2f2016-11-08 23:13:36 +02003317 goto error;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003318 }
3319 ann_dict = PyObject_GetItem(f->f_locals, ann_str);
3320 if (ann_dict == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003321 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003322 goto error;
3323 }
Victor Stinner438a12d2019-05-24 17:01:38 +02003324 _PyErr_Clear(tstate);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003325 ann_dict = PyDict_New();
3326 if (ann_dict == NULL) {
3327 goto error;
3328 }
3329 err = PyObject_SetItem(f->f_locals, ann_str, ann_dict);
3330 Py_DECREF(ann_dict);
3331 if (err != 0) {
3332 goto error;
3333 }
3334 }
3335 else {
3336 Py_DECREF(ann_dict);
3337 }
3338 }
3339 DISPATCH();
3340 }
3341
Benjamin Petersonddd19492018-09-16 22:38:02 -07003342 case TARGET(BUILD_CONST_KEY_MAP): {
Victor Stinner74319ae2016-08-25 00:04:09 +02003343 Py_ssize_t i;
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003344 PyObject *map;
3345 PyObject *keys = TOP();
3346 if (!PyTuple_CheckExact(keys) ||
3347 PyTuple_GET_SIZE(keys) != (Py_ssize_t)oparg) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003348 _PyErr_SetString(tstate, PyExc_SystemError,
3349 "bad BUILD_CONST_KEY_MAP keys argument");
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003350 goto error;
3351 }
3352 map = _PyDict_NewPresized((Py_ssize_t)oparg);
3353 if (map == NULL) {
3354 goto error;
3355 }
3356 for (i = oparg; i > 0; i--) {
3357 int err;
3358 PyObject *key = PyTuple_GET_ITEM(keys, oparg - i);
3359 PyObject *value = PEEK(i + 1);
3360 err = PyDict_SetItem(map, key, value);
3361 if (err != 0) {
3362 Py_DECREF(map);
3363 goto error;
3364 }
3365 }
3366
3367 Py_DECREF(POP());
3368 while (oparg--) {
3369 Py_DECREF(POP());
3370 }
3371 PUSH(map);
3372 DISPATCH();
3373 }
3374
Mark Shannon8a4cd702020-01-27 09:57:45 +00003375 case TARGET(DICT_UPDATE): {
3376 PyObject *update = POP();
3377 PyObject *dict = PEEK(oparg);
3378 if (PyDict_Update(dict, update) < 0) {
3379 if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) {
3380 _PyErr_Format(tstate, PyExc_TypeError,
3381 "'%.200s' object is not a mapping",
Victor Stinnera102ed72020-02-07 02:24:48 +01003382 Py_TYPE(update)->tp_name);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003383 }
Mark Shannon8a4cd702020-01-27 09:57:45 +00003384 Py_DECREF(update);
3385 goto error;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003386 }
Mark Shannon8a4cd702020-01-27 09:57:45 +00003387 Py_DECREF(update);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003388 DISPATCH();
3389 }
3390
Mark Shannon8a4cd702020-01-27 09:57:45 +00003391 case TARGET(DICT_MERGE): {
3392 PyObject *update = POP();
3393 PyObject *dict = PEEK(oparg);
3394
3395 if (_PyDict_MergeEx(dict, update, 2) < 0) {
3396 format_kwargs_error(tstate, PEEK(2 + oparg), update);
3397 Py_DECREF(update);
Serhiy Storchakae036ef82016-10-02 11:06:43 +03003398 goto error;
Serhiy Storchakae036ef82016-10-02 11:06:43 +03003399 }
Mark Shannon8a4cd702020-01-27 09:57:45 +00003400 Py_DECREF(update);
Brandt Bucherf185a732019-09-28 17:12:49 -07003401 PREDICT(CALL_FUNCTION_EX);
Serhiy Storchakae036ef82016-10-02 11:06:43 +03003402 DISPATCH();
3403 }
3404
Benjamin Petersonddd19492018-09-16 22:38:02 -07003405 case TARGET(MAP_ADD): {
Jörn Heisslerc8a35412019-06-22 16:40:55 +02003406 PyObject *value = TOP();
3407 PyObject *key = SECOND();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003408 PyObject *map;
3409 int err;
costypetrisor8ed317f2018-07-31 20:55:14 +00003410 STACK_SHRINK(2);
Raymond Hettinger41862222016-10-15 19:03:06 -07003411 map = PEEK(oparg); /* dict */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003412 assert(PyDict_CheckExact(map));
Martin Panter95f53c12016-07-18 08:23:26 +00003413 err = PyDict_SetItem(map, key, value); /* map[key] = value */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003414 Py_DECREF(value);
3415 Py_DECREF(key);
3416 if (err != 0)
3417 goto error;
3418 PREDICT(JUMP_ABSOLUTE);
3419 DISPATCH();
3420 }
3421
Benjamin Petersonddd19492018-09-16 22:38:02 -07003422 case TARGET(LOAD_ATTR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003423 PyObject *name = GETITEM(names, oparg);
3424 PyObject *owner = TOP();
Pablo Galindo109826c2020-10-20 06:22:44 +01003425
3426 PyTypeObject *type = Py_TYPE(owner);
3427 PyObject *res;
3428 PyObject **dictptr;
3429 PyObject *dict;
3430 _PyOpCodeOpt_LoadAttr *la;
3431
3432 OPCACHE_STAT_ATTR_TOTAL();
3433
3434 OPCACHE_CHECK();
3435 if (co_opcache != NULL && PyType_HasFeature(type, Py_TPFLAGS_VALID_VERSION_TAG))
3436 {
3437 if (co_opcache->optimized > 0) {
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003438 // Fast path -- cache hit makes LOAD_ATTR ~30% faster.
Pablo Galindo109826c2020-10-20 06:22:44 +01003439 la = &co_opcache->u.la;
3440 if (la->type == type && la->tp_version_tag == type->tp_version_tag)
3441 {
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003442 // Hint >= 0 is a dict index; hint == -1 is a dict miss.
3443 // Hint < -1 is an inverted slot offset: offset is strictly > 0,
3444 // so ~offset is strictly < -1 (assuming 2's complement).
3445 if (la->hint < -1) {
3446 // Even faster path -- slot hint.
3447 Py_ssize_t offset = ~la->hint;
3448 // fprintf(stderr, "Using hint for offset %zd\n", offset);
3449 char *addr = (char *)owner + offset;
3450 res = *(PyObject **)addr;
Pablo Galindo109826c2020-10-20 06:22:44 +01003451 if (res != NULL) {
Pablo Galindo109826c2020-10-20 06:22:44 +01003452 Py_INCREF(res);
3453 SET_TOP(res);
3454 Py_DECREF(owner);
Pablo Galindo109826c2020-10-20 06:22:44 +01003455 DISPATCH();
Pablo Galindo109826c2020-10-20 06:22:44 +01003456 }
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003457 // Else slot is NULL. Fall through to slow path to raise AttributeError(name).
3458 // Don't DEOPT, since the slot is still there.
Pablo Galindo109826c2020-10-20 06:22:44 +01003459 } else {
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003460 // Fast path for dict.
3461 assert(type->tp_dict != NULL);
3462 assert(type->tp_dictoffset > 0);
3463
3464 dictptr = (PyObject **) ((char *)owner + type->tp_dictoffset);
3465 dict = *dictptr;
3466 if (dict != NULL && PyDict_CheckExact(dict)) {
3467 Py_ssize_t hint = la->hint;
3468 Py_INCREF(dict);
3469 res = NULL;
Victor Stinnerd5fc9982021-02-21 12:02:04 +01003470 assert(!_PyErr_Occurred(tstate));
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003471 la->hint = _PyDict_GetItemHint((PyDictObject*)dict, name, hint, &res);
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003472 if (res != NULL) {
Victor Stinnerd5fc9982021-02-21 12:02:04 +01003473 assert(la->hint >= 0);
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003474 if (la->hint == hint && hint >= 0) {
3475 // Our hint has helped -- cache hit.
3476 OPCACHE_STAT_ATTR_HIT();
3477 } else {
3478 // The hint we provided didn't work.
3479 // Maybe next time?
3480 OPCACHE_MAYBE_DEOPT_LOAD_ATTR();
3481 }
3482
3483 Py_INCREF(res);
3484 SET_TOP(res);
3485 Py_DECREF(owner);
3486 Py_DECREF(dict);
3487 DISPATCH();
Victor Stinnerd5fc9982021-02-21 12:02:04 +01003488 }
3489 else {
3490 _PyErr_Clear(tstate);
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003491 // This attribute can be missing sometimes;
3492 // we don't want to optimize this lookup.
3493 OPCACHE_DEOPT_LOAD_ATTR();
3494 Py_DECREF(dict);
3495 }
Victor Stinnerd5fc9982021-02-21 12:02:04 +01003496 }
3497 else {
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003498 // There is no dict, or __dict__ doesn't satisfy PyDict_CheckExact.
3499 OPCACHE_DEOPT_LOAD_ATTR();
3500 }
Pablo Galindo109826c2020-10-20 06:22:44 +01003501 }
Victor Stinnerd5fc9982021-02-21 12:02:04 +01003502 }
3503 else {
Pablo Galindo109826c2020-10-20 06:22:44 +01003504 // The type of the object has either been updated,
3505 // or is different. Maybe it will stabilize?
3506 OPCACHE_MAYBE_DEOPT_LOAD_ATTR();
3507 }
Pablo Galindo109826c2020-10-20 06:22:44 +01003508 OPCACHE_STAT_ATTR_MISS();
3509 }
3510
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003511 if (co_opcache != NULL && // co_opcache can be NULL after a DEOPT() call.
Pablo Galindo109826c2020-10-20 06:22:44 +01003512 type->tp_getattro == PyObject_GenericGetAttr)
3513 {
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003514 if (type->tp_dict == NULL) {
3515 if (PyType_Ready(type) < 0) {
3516 Py_DECREF(owner);
3517 SET_TOP(NULL);
3518 goto error;
Pablo Galindo109826c2020-10-20 06:22:44 +01003519 }
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003520 }
3521 PyObject *descr = _PyType_Lookup(type, name);
3522 if (descr != NULL) {
3523 // We found an attribute with a data-like descriptor.
3524 PyTypeObject *dtype = Py_TYPE(descr);
3525 if (dtype == &PyMemberDescr_Type) { // It's a slot
3526 PyMemberDescrObject *member = (PyMemberDescrObject *)descr;
3527 struct PyMemberDef *dmem = member->d_member;
3528 if (dmem->type == T_OBJECT_EX) {
3529 Py_ssize_t offset = dmem->offset;
3530 assert(offset > 0); // 0 would be confused with dict hint == -1 (miss).
Pablo Galindo109826c2020-10-20 06:22:44 +01003531
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003532 if (co_opcache->optimized == 0) {
3533 // First time we optimize this opcode.
3534 OPCACHE_STAT_ATTR_OPT();
3535 co_opcache->optimized = OPCODE_CACHE_MAX_TRIES;
3536 // fprintf(stderr, "Setting hint for %s, offset %zd\n", dmem->name, offset);
3537 }
3538
3539 la = &co_opcache->u.la;
3540 la->type = type;
3541 la->tp_version_tag = type->tp_version_tag;
3542 la->hint = ~offset;
3543
3544 char *addr = (char *)owner + offset;
3545 res = *(PyObject **)addr;
Pablo Galindo109826c2020-10-20 06:22:44 +01003546 if (res != NULL) {
3547 Py_INCREF(res);
Pablo Galindo109826c2020-10-20 06:22:44 +01003548 Py_DECREF(owner);
3549 SET_TOP(res);
3550
Pablo Galindo109826c2020-10-20 06:22:44 +01003551 DISPATCH();
3552 }
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003553 // Else slot is NULL. Fall through to slow path to raise AttributeError(name).
Pablo Galindo109826c2020-10-20 06:22:44 +01003554 }
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003555 // Else it's a slot of a different type. We don't handle those.
3556 }
3557 // Else it's some other kind of descriptor that we don't handle.
3558 OPCACHE_DEOPT_LOAD_ATTR();
Victor Stinnerd5fc9982021-02-21 12:02:04 +01003559 }
3560 else if (type->tp_dictoffset > 0) {
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003561 // We found an instance with a __dict__.
3562 dictptr = (PyObject **) ((char *)owner + type->tp_dictoffset);
3563 dict = *dictptr;
3564
3565 if (dict != NULL && PyDict_CheckExact(dict)) {
3566 Py_INCREF(dict);
3567 res = NULL;
Victor Stinnerd5fc9982021-02-21 12:02:04 +01003568 assert(!_PyErr_Occurred(tstate));
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003569 Py_ssize_t hint = _PyDict_GetItemHint((PyDictObject*)dict, name, -1, &res);
3570 if (res != NULL) {
3571 Py_INCREF(res);
3572 Py_DECREF(dict);
3573 Py_DECREF(owner);
3574 SET_TOP(res);
3575
3576 if (co_opcache->optimized == 0) {
3577 // First time we optimize this opcode.
3578 OPCACHE_STAT_ATTR_OPT();
3579 co_opcache->optimized = OPCODE_CACHE_MAX_TRIES;
3580 }
3581
3582 la = &co_opcache->u.la;
3583 la->type = type;
3584 la->tp_version_tag = type->tp_version_tag;
Victor Stinnerd5fc9982021-02-21 12:02:04 +01003585 assert(hint >= 0);
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003586 la->hint = hint;
3587
3588 DISPATCH();
3589 }
Victor Stinnerd5fc9982021-02-21 12:02:04 +01003590 else {
3591 _PyErr_Clear(tstate);
3592 }
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003593 Py_DECREF(dict);
Pablo Galindo109826c2020-10-20 06:22:44 +01003594 } else {
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003595 // There is no dict, or __dict__ doesn't satisfy PyDict_CheckExact.
Pablo Galindo109826c2020-10-20 06:22:44 +01003596 OPCACHE_DEOPT_LOAD_ATTR();
3597 }
3598 } else {
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003599 // The object's class does not have a tp_dictoffset we can use.
Pablo Galindo109826c2020-10-20 06:22:44 +01003600 OPCACHE_DEOPT_LOAD_ATTR();
3601 }
3602 } else if (type->tp_getattro != PyObject_GenericGetAttr) {
3603 OPCACHE_DEOPT_LOAD_ATTR();
3604 }
3605 }
3606
Guido van Rossum5c5a9382021-01-29 18:02:29 -08003607 // Slow path.
Pablo Galindo109826c2020-10-20 06:22:44 +01003608 res = PyObject_GetAttr(owner, name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003609 Py_DECREF(owner);
3610 SET_TOP(res);
3611 if (res == NULL)
3612 goto error;
3613 DISPATCH();
3614 }
3615
Benjamin Petersonddd19492018-09-16 22:38:02 -07003616 case TARGET(COMPARE_OP): {
Mark Shannon9af0e472020-01-14 10:12:45 +00003617 assert(oparg <= Py_GE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003618 PyObject *right = POP();
3619 PyObject *left = TOP();
Mark Shannon9af0e472020-01-14 10:12:45 +00003620 PyObject *res = PyObject_RichCompare(left, right, oparg);
3621 SET_TOP(res);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003622 Py_DECREF(left);
3623 Py_DECREF(right);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003624 if (res == NULL)
3625 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003626 PREDICT(POP_JUMP_IF_FALSE);
3627 PREDICT(POP_JUMP_IF_TRUE);
3628 DISPATCH();
Victor Stinner3c1e4812012-03-26 22:10:51 +02003629 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003630
Mark Shannon9af0e472020-01-14 10:12:45 +00003631 case TARGET(IS_OP): {
3632 PyObject *right = POP();
3633 PyObject *left = TOP();
Victor Stinner09bbebe2021-04-11 00:17:39 +02003634 int res = Py_Is(left, right) ^ oparg;
Mark Shannon9af0e472020-01-14 10:12:45 +00003635 PyObject *b = res ? Py_True : Py_False;
3636 Py_INCREF(b);
3637 SET_TOP(b);
3638 Py_DECREF(left);
3639 Py_DECREF(right);
3640 PREDICT(POP_JUMP_IF_FALSE);
3641 PREDICT(POP_JUMP_IF_TRUE);
Mark Shannon4958f5d2021-03-24 17:56:12 +00003642 DISPATCH();
Mark Shannon9af0e472020-01-14 10:12:45 +00003643 }
3644
3645 case TARGET(CONTAINS_OP): {
3646 PyObject *right = POP();
3647 PyObject *left = POP();
3648 int res = PySequence_Contains(right, left);
3649 Py_DECREF(left);
3650 Py_DECREF(right);
3651 if (res < 0) {
3652 goto error;
3653 }
3654 PyObject *b = (res^oparg) ? Py_True : Py_False;
3655 Py_INCREF(b);
3656 PUSH(b);
3657 PREDICT(POP_JUMP_IF_FALSE);
3658 PREDICT(POP_JUMP_IF_TRUE);
Mark Shannon4958f5d2021-03-24 17:56:12 +00003659 DISPATCH();
Mark Shannon9af0e472020-01-14 10:12:45 +00003660 }
3661
3662#define CANNOT_CATCH_MSG "catching classes that do not inherit from "\
3663 "BaseException is not allowed"
3664
3665 case TARGET(JUMP_IF_NOT_EXC_MATCH): {
3666 PyObject *right = POP();
3667 PyObject *left = POP();
3668 if (PyTuple_Check(right)) {
3669 Py_ssize_t i, length;
3670 length = PyTuple_GET_SIZE(right);
3671 for (i = 0; i < length; i++) {
3672 PyObject *exc = PyTuple_GET_ITEM(right, i);
3673 if (!PyExceptionClass_Check(exc)) {
3674 _PyErr_SetString(tstate, PyExc_TypeError,
3675 CANNOT_CATCH_MSG);
3676 Py_DECREF(left);
3677 Py_DECREF(right);
3678 goto error;
3679 }
3680 }
3681 }
3682 else {
3683 if (!PyExceptionClass_Check(right)) {
3684 _PyErr_SetString(tstate, PyExc_TypeError,
3685 CANNOT_CATCH_MSG);
3686 Py_DECREF(left);
3687 Py_DECREF(right);
3688 goto error;
3689 }
3690 }
3691 int res = PyErr_GivenExceptionMatches(left, right);
3692 Py_DECREF(left);
3693 Py_DECREF(right);
3694 if (res > 0) {
3695 /* Exception matches -- Do nothing */;
3696 }
3697 else if (res == 0) {
3698 JUMPTO(oparg);
3699 }
3700 else {
3701 goto error;
3702 }
3703 DISPATCH();
3704 }
3705
Benjamin Petersonddd19492018-09-16 22:38:02 -07003706 case TARGET(IMPORT_NAME): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003707 PyObject *name = GETITEM(names, oparg);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03003708 PyObject *fromlist = POP();
3709 PyObject *level = TOP();
3710 PyObject *res;
Victor Stinner438a12d2019-05-24 17:01:38 +02003711 res = import_name(tstate, f, name, fromlist, level);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03003712 Py_DECREF(level);
3713 Py_DECREF(fromlist);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003714 SET_TOP(res);
3715 if (res == NULL)
3716 goto error;
3717 DISPATCH();
3718 }
3719
Benjamin Petersonddd19492018-09-16 22:38:02 -07003720 case TARGET(IMPORT_STAR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003721 PyObject *from = POP(), *locals;
3722 int err;
Matthias Bussonnier160edb42017-02-25 21:58:05 -08003723 if (PyFrame_FastToLocalsWithError(f) < 0) {
3724 Py_DECREF(from);
Victor Stinner41bb43a2013-10-29 01:19:37 +01003725 goto error;
Matthias Bussonnier160edb42017-02-25 21:58:05 -08003726 }
Victor Stinner41bb43a2013-10-29 01:19:37 +01003727
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003728 locals = f->f_locals;
3729 if (locals == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003730 _PyErr_SetString(tstate, PyExc_SystemError,
3731 "no locals found during 'import *'");
Matthias Bussonnier160edb42017-02-25 21:58:05 -08003732 Py_DECREF(from);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003733 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003734 }
Victor Stinner438a12d2019-05-24 17:01:38 +02003735 err = import_all_from(tstate, locals, from);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003736 PyFrame_LocalsToFast(f, 0);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003737 Py_DECREF(from);
3738 if (err != 0)
3739 goto error;
3740 DISPATCH();
3741 }
Guido van Rossum25831651993-05-19 14:50:45 +00003742
Benjamin Petersonddd19492018-09-16 22:38:02 -07003743 case TARGET(IMPORT_FROM): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003744 PyObject *name = GETITEM(names, oparg);
3745 PyObject *from = TOP();
3746 PyObject *res;
Victor Stinner438a12d2019-05-24 17:01:38 +02003747 res = import_from(tstate, from, name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003748 PUSH(res);
3749 if (res == NULL)
3750 goto error;
3751 DISPATCH();
3752 }
Thomas Wouters52152252000-08-17 22:55:00 +00003753
Benjamin Petersonddd19492018-09-16 22:38:02 -07003754 case TARGET(JUMP_FORWARD): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003755 JUMPBY(oparg);
Mark Shannon4958f5d2021-03-24 17:56:12 +00003756 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003757 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003758
Benjamin Petersonddd19492018-09-16 22:38:02 -07003759 case TARGET(POP_JUMP_IF_FALSE): {
3760 PREDICTED(POP_JUMP_IF_FALSE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003761 PyObject *cond = POP();
3762 int err;
Victor Stinner09bbebe2021-04-11 00:17:39 +02003763 if (Py_IsTrue(cond)) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003764 Py_DECREF(cond);
Mark Shannon4958f5d2021-03-24 17:56:12 +00003765 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003766 }
Victor Stinner09bbebe2021-04-11 00:17:39 +02003767 if (Py_IsFalse(cond)) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003768 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003769 JUMPTO(oparg);
Miss Islington (bot)37bdd222021-07-19 04:15:58 -07003770 CHECK_EVAL_BREAKER();
Mark Shannon4958f5d2021-03-24 17:56:12 +00003771 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003772 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003773 err = PyObject_IsTrue(cond);
3774 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003775 if (err > 0)
Adrian Wielgosik50c28502017-06-23 13:35:41 -07003776 ;
Miss Islington (bot)37bdd222021-07-19 04:15:58 -07003777 else if (err == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003778 JUMPTO(oparg);
Miss Islington (bot)37bdd222021-07-19 04:15:58 -07003779 CHECK_EVAL_BREAKER();
3780 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003781 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003782 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003783 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003784 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003785
Benjamin Petersonddd19492018-09-16 22:38:02 -07003786 case TARGET(POP_JUMP_IF_TRUE): {
3787 PREDICTED(POP_JUMP_IF_TRUE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003788 PyObject *cond = POP();
3789 int err;
Victor Stinner09bbebe2021-04-11 00:17:39 +02003790 if (Py_IsFalse(cond)) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003791 Py_DECREF(cond);
Mark Shannon4958f5d2021-03-24 17:56:12 +00003792 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003793 }
Victor Stinner09bbebe2021-04-11 00:17:39 +02003794 if (Py_IsTrue(cond)) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003795 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003796 JUMPTO(oparg);
Miss Islington (bot)37bdd222021-07-19 04:15:58 -07003797 CHECK_EVAL_BREAKER();
Mark Shannon4958f5d2021-03-24 17:56:12 +00003798 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003799 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003800 err = PyObject_IsTrue(cond);
3801 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003802 if (err > 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003803 JUMPTO(oparg);
Miss Islington (bot)37bdd222021-07-19 04:15:58 -07003804 CHECK_EVAL_BREAKER();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003805 }
3806 else if (err == 0)
3807 ;
3808 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003809 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003810 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003811 }
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00003812
Benjamin Petersonddd19492018-09-16 22:38:02 -07003813 case TARGET(JUMP_IF_FALSE_OR_POP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003814 PyObject *cond = TOP();
3815 int err;
Victor Stinner09bbebe2021-04-11 00:17:39 +02003816 if (Py_IsTrue(cond)) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003817 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003818 Py_DECREF(cond);
Mark Shannon4958f5d2021-03-24 17:56:12 +00003819 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003820 }
Victor Stinner09bbebe2021-04-11 00:17:39 +02003821 if (Py_IsFalse(cond)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003822 JUMPTO(oparg);
Mark Shannon4958f5d2021-03-24 17:56:12 +00003823 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003824 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003825 err = PyObject_IsTrue(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003826 if (err > 0) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003827 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003828 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003829 }
3830 else if (err == 0)
3831 JUMPTO(oparg);
3832 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003833 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003834 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003835 }
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00003836
Benjamin Petersonddd19492018-09-16 22:38:02 -07003837 case TARGET(JUMP_IF_TRUE_OR_POP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003838 PyObject *cond = TOP();
3839 int err;
Victor Stinner09bbebe2021-04-11 00:17:39 +02003840 if (Py_IsFalse(cond)) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003841 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003842 Py_DECREF(cond);
Mark Shannon4958f5d2021-03-24 17:56:12 +00003843 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003844 }
Victor Stinner09bbebe2021-04-11 00:17:39 +02003845 if (Py_IsTrue(cond)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003846 JUMPTO(oparg);
Mark Shannon4958f5d2021-03-24 17:56:12 +00003847 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003848 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003849 err = PyObject_IsTrue(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003850 if (err > 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003851 JUMPTO(oparg);
3852 }
3853 else if (err == 0) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003854 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003855 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003856 }
3857 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003858 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003859 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003860 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003861
Benjamin Petersonddd19492018-09-16 22:38:02 -07003862 case TARGET(JUMP_ABSOLUTE): {
3863 PREDICTED(JUMP_ABSOLUTE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003864 JUMPTO(oparg);
Mark Shannon4958f5d2021-03-24 17:56:12 +00003865 CHECK_EVAL_BREAKER();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003866 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003867 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003868
Brandt Bucher145bf262021-02-26 14:51:55 -08003869 case TARGET(GET_LEN): {
3870 // PUSH(len(TOS))
3871 Py_ssize_t len_i = PyObject_Length(TOP());
3872 if (len_i < 0) {
3873 goto error;
3874 }
3875 PyObject *len_o = PyLong_FromSsize_t(len_i);
3876 if (len_o == NULL) {
3877 goto error;
3878 }
3879 PUSH(len_o);
3880 DISPATCH();
3881 }
3882
3883 case TARGET(MATCH_CLASS): {
3884 // Pop TOS. On success, set TOS to True and TOS1 to a tuple of
3885 // attributes. On failure, set TOS to False.
3886 PyObject *names = POP();
3887 PyObject *type = TOP();
3888 PyObject *subject = SECOND();
3889 assert(PyTuple_CheckExact(names));
3890 PyObject *attrs = match_class(tstate, subject, type, oparg, names);
3891 Py_DECREF(names);
3892 if (attrs) {
3893 // Success!
3894 assert(PyTuple_CheckExact(attrs));
3895 Py_DECREF(subject);
3896 SET_SECOND(attrs);
3897 }
3898 else if (_PyErr_Occurred(tstate)) {
3899 goto error;
3900 }
3901 Py_DECREF(type);
3902 SET_TOP(PyBool_FromLong(!!attrs));
3903 DISPATCH();
3904 }
3905
3906 case TARGET(MATCH_MAPPING): {
Brandt Bucher145bf262021-02-26 14:51:55 -08003907 PyObject *subject = TOP();
Mark Shannon069e81a2021-04-30 09:50:28 +01003908 int match = Py_TYPE(subject)->tp_flags & Py_TPFLAGS_MAPPING;
3909 PyObject *res = match ? Py_True : Py_False;
3910 Py_INCREF(res);
3911 PUSH(res);
Brandt Bucher145bf262021-02-26 14:51:55 -08003912 DISPATCH();
3913 }
3914
3915 case TARGET(MATCH_SEQUENCE): {
Brandt Bucher145bf262021-02-26 14:51:55 -08003916 PyObject *subject = TOP();
Mark Shannon069e81a2021-04-30 09:50:28 +01003917 int match = Py_TYPE(subject)->tp_flags & Py_TPFLAGS_SEQUENCE;
3918 PyObject *res = match ? Py_True : Py_False;
3919 Py_INCREF(res);
3920 PUSH(res);
Brandt Bucher145bf262021-02-26 14:51:55 -08003921 DISPATCH();
3922 }
3923
3924 case TARGET(MATCH_KEYS): {
3925 // On successful match for all keys, PUSH(values) and PUSH(True).
3926 // Otherwise, PUSH(None) and PUSH(False).
3927 PyObject *keys = TOP();
3928 PyObject *subject = SECOND();
3929 PyObject *values_or_none = match_keys(tstate, subject, keys);
3930 if (values_or_none == NULL) {
3931 goto error;
3932 }
3933 PUSH(values_or_none);
Victor Stinner09bbebe2021-04-11 00:17:39 +02003934 if (Py_IsNone(values_or_none)) {
Brandt Bucher145bf262021-02-26 14:51:55 -08003935 Py_INCREF(Py_False);
3936 PUSH(Py_False);
3937 DISPATCH();
3938 }
3939 assert(PyTuple_CheckExact(values_or_none));
3940 Py_INCREF(Py_True);
3941 PUSH(Py_True);
3942 DISPATCH();
3943 }
3944
3945 case TARGET(COPY_DICT_WITHOUT_KEYS): {
3946 // rest = dict(TOS1)
3947 // for key in TOS:
3948 // del rest[key]
3949 // SET_TOP(rest)
3950 PyObject *keys = TOP();
3951 PyObject *subject = SECOND();
3952 PyObject *rest = PyDict_New();
3953 if (rest == NULL || PyDict_Update(rest, subject)) {
3954 Py_XDECREF(rest);
3955 goto error;
3956 }
3957 // This may seem a bit inefficient, but keys is rarely big enough to
3958 // actually impact runtime.
3959 assert(PyTuple_CheckExact(keys));
3960 for (Py_ssize_t i = 0; i < PyTuple_GET_SIZE(keys); i++) {
3961 if (PyDict_DelItem(rest, PyTuple_GET_ITEM(keys, i))) {
3962 Py_DECREF(rest);
3963 goto error;
3964 }
3965 }
3966 Py_DECREF(keys);
3967 SET_TOP(rest);
3968 DISPATCH();
3969 }
3970
Benjamin Petersonddd19492018-09-16 22:38:02 -07003971 case TARGET(GET_ITER): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003972 /* before: [obj]; after [getiter(obj)] */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003973 PyObject *iterable = TOP();
Yury Selivanov5376ba92015-06-22 12:19:30 -04003974 PyObject *iter = PyObject_GetIter(iterable);
3975 Py_DECREF(iterable);
3976 SET_TOP(iter);
3977 if (iter == NULL)
3978 goto error;
3979 PREDICT(FOR_ITER);
Serhiy Storchakada9c5132016-06-27 18:58:57 +03003980 PREDICT(CALL_FUNCTION);
Yury Selivanov5376ba92015-06-22 12:19:30 -04003981 DISPATCH();
3982 }
3983
Benjamin Petersonddd19492018-09-16 22:38:02 -07003984 case TARGET(GET_YIELD_FROM_ITER): {
Yury Selivanov5376ba92015-06-22 12:19:30 -04003985 /* before: [obj]; after [getiter(obj)] */
3986 PyObject *iterable = TOP();
Yury Selivanov75445082015-05-11 22:57:16 -04003987 PyObject *iter;
Yury Selivanov5376ba92015-06-22 12:19:30 -04003988 if (PyCoro_CheckExact(iterable)) {
3989 /* `iterable` is a coroutine */
3990 if (!(co->co_flags & (CO_COROUTINE | CO_ITERABLE_COROUTINE))) {
3991 /* and it is used in a 'yield from' expression of a
3992 regular generator. */
3993 Py_DECREF(iterable);
3994 SET_TOP(NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02003995 _PyErr_SetString(tstate, PyExc_TypeError,
3996 "cannot 'yield from' a coroutine object "
3997 "in a non-coroutine generator");
Yury Selivanov5376ba92015-06-22 12:19:30 -04003998 goto error;
3999 }
4000 }
4001 else if (!PyGen_CheckExact(iterable)) {
Yury Selivanov75445082015-05-11 22:57:16 -04004002 /* `iterable` is not a generator. */
4003 iter = PyObject_GetIter(iterable);
4004 Py_DECREF(iterable);
4005 SET_TOP(iter);
4006 if (iter == NULL)
4007 goto error;
4008 }
Serhiy Storchakada9c5132016-06-27 18:58:57 +03004009 PREDICT(LOAD_CONST);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004010 DISPATCH();
4011 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00004012
Benjamin Petersonddd19492018-09-16 22:38:02 -07004013 case TARGET(FOR_ITER): {
4014 PREDICTED(FOR_ITER);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004015 /* before: [iter]; after: [iter, iter()] *or* [] */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004016 PyObject *iter = TOP();
Victor Stinnera102ed72020-02-07 02:24:48 +01004017 PyObject *next = (*Py_TYPE(iter)->tp_iternext)(iter);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004018 if (next != NULL) {
4019 PUSH(next);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004020 PREDICT(STORE_FAST);
4021 PREDICT(UNPACK_SEQUENCE);
4022 DISPATCH();
4023 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004024 if (_PyErr_Occurred(tstate)) {
4025 if (!_PyErr_ExceptionMatches(tstate, PyExc_StopIteration)) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004026 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02004027 }
4028 else if (tstate->c_tracefunc != NULL) {
Mark Shannon8e1b4062021-03-05 14:45:50 +00004029 call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj, tstate, f, &trace_info);
Victor Stinner438a12d2019-05-24 17:01:38 +02004030 }
4031 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004032 }
4033 /* iterator ended normally */
costypetrisor8ed317f2018-07-31 20:55:14 +00004034 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004035 Py_DECREF(iter);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004036 JUMPBY(oparg);
4037 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004038 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00004039
Benjamin Petersonddd19492018-09-16 22:38:02 -07004040 case TARGET(SETUP_FINALLY): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004041 PyFrame_BlockSetup(f, SETUP_FINALLY, INSTR_OFFSET() + oparg,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004042 STACK_LEVEL());
4043 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004044 }
Guido van Rossumac7be682001-01-17 15:42:30 +00004045
Benjamin Petersonddd19492018-09-16 22:38:02 -07004046 case TARGET(BEFORE_ASYNC_WITH): {
Yury Selivanov75445082015-05-11 22:57:16 -04004047 _Py_IDENTIFIER(__aenter__);
Géry Ogam1d1b97a2020-01-14 12:58:29 +01004048 _Py_IDENTIFIER(__aexit__);
Yury Selivanov75445082015-05-11 22:57:16 -04004049 PyObject *mgr = TOP();
Géry Ogam1d1b97a2020-01-14 12:58:29 +01004050 PyObject *enter = special_lookup(tstate, mgr, &PyId___aenter__);
Yury Selivanov75445082015-05-11 22:57:16 -04004051 PyObject *res;
Géry Ogam1d1b97a2020-01-14 12:58:29 +01004052 if (enter == NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04004053 goto error;
Géry Ogam1d1b97a2020-01-14 12:58:29 +01004054 }
4055 PyObject *exit = special_lookup(tstate, mgr, &PyId___aexit__);
4056 if (exit == NULL) {
4057 Py_DECREF(enter);
4058 goto error;
4059 }
Yury Selivanov75445082015-05-11 22:57:16 -04004060 SET_TOP(exit);
Yury Selivanov75445082015-05-11 22:57:16 -04004061 Py_DECREF(mgr);
Victor Stinnerf17c3de2016-12-06 18:46:19 +01004062 res = _PyObject_CallNoArg(enter);
Yury Selivanov75445082015-05-11 22:57:16 -04004063 Py_DECREF(enter);
4064 if (res == NULL)
4065 goto error;
4066 PUSH(res);
Serhiy Storchakada9c5132016-06-27 18:58:57 +03004067 PREDICT(GET_AWAITABLE);
Yury Selivanov75445082015-05-11 22:57:16 -04004068 DISPATCH();
4069 }
4070
Benjamin Petersonddd19492018-09-16 22:38:02 -07004071 case TARGET(SETUP_ASYNC_WITH): {
Yury Selivanov75445082015-05-11 22:57:16 -04004072 PyObject *res = POP();
4073 /* Setup the finally block before pushing the result
4074 of __aenter__ on the stack. */
4075 PyFrame_BlockSetup(f, SETUP_FINALLY, INSTR_OFFSET() + oparg,
4076 STACK_LEVEL());
4077 PUSH(res);
4078 DISPATCH();
4079 }
4080
Benjamin Petersonddd19492018-09-16 22:38:02 -07004081 case TARGET(SETUP_WITH): {
Benjamin Petersonce798522012-01-22 11:24:29 -05004082 _Py_IDENTIFIER(__enter__);
Géry Ogam1d1b97a2020-01-14 12:58:29 +01004083 _Py_IDENTIFIER(__exit__);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004084 PyObject *mgr = TOP();
Victor Stinner438a12d2019-05-24 17:01:38 +02004085 PyObject *enter = special_lookup(tstate, mgr, &PyId___enter__);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004086 PyObject *res;
Victor Stinner438a12d2019-05-24 17:01:38 +02004087 if (enter == NULL) {
Raymond Hettingera3fec152016-11-21 17:24:23 -08004088 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02004089 }
4090 PyObject *exit = special_lookup(tstate, mgr, &PyId___exit__);
Raymond Hettinger64e2f9a2016-11-22 11:50:40 -08004091 if (exit == NULL) {
4092 Py_DECREF(enter);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004093 goto error;
Raymond Hettinger64e2f9a2016-11-22 11:50:40 -08004094 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004095 SET_TOP(exit);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004096 Py_DECREF(mgr);
Victor Stinnerf17c3de2016-12-06 18:46:19 +01004097 res = _PyObject_CallNoArg(enter);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004098 Py_DECREF(enter);
4099 if (res == NULL)
4100 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004101 /* Setup the finally block before pushing the result
4102 of __enter__ on the stack. */
4103 PyFrame_BlockSetup(f, SETUP_FINALLY, INSTR_OFFSET() + oparg,
4104 STACK_LEVEL());
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004105
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004106 PUSH(res);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004107 DISPATCH();
4108 }
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004109
Mark Shannonfee55262019-11-21 09:11:43 +00004110 case TARGET(WITH_EXCEPT_START): {
4111 /* At the top of the stack are 7 values:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004112 - (TOP, SECOND, THIRD) = exc_info()
Mark Shannonfee55262019-11-21 09:11:43 +00004113 - (FOURTH, FIFTH, SIXTH) = previous exception for EXCEPT_HANDLER
4114 - SEVENTH: the context.__exit__ bound method
4115 We call SEVENTH(TOP, SECOND, THIRD).
4116 Then we push again the TOP exception and the __exit__
4117 return value.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004118 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004119 PyObject *exit_func;
Victor Stinner842cfff2016-12-01 14:45:31 +01004120 PyObject *exc, *val, *tb, *res;
4121
Victor Stinner842cfff2016-12-01 14:45:31 +01004122 exc = TOP();
Mark Shannonfee55262019-11-21 09:11:43 +00004123 val = SECOND();
4124 tb = THIRD();
Victor Stinner09bbebe2021-04-11 00:17:39 +02004125 assert(!Py_IsNone(exc));
Mark Shannonfee55262019-11-21 09:11:43 +00004126 assert(!PyLong_Check(exc));
4127 exit_func = PEEK(7);
Jeroen Demeyer469d1a72019-07-03 12:52:21 +02004128 PyObject *stack[4] = {NULL, exc, val, tb};
Petr Viktorinffd97532020-02-11 17:46:57 +01004129 res = PyObject_Vectorcall(exit_func, stack + 1,
Jeroen Demeyer469d1a72019-07-03 12:52:21 +02004130 3 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004131 if (res == NULL)
4132 goto error;
Amaury Forgeot d'Arc10b24e82008-12-10 23:49:33 +00004133
Yury Selivanov75445082015-05-11 22:57:16 -04004134 PUSH(res);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004135 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004136 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00004137
Benjamin Petersonddd19492018-09-16 22:38:02 -07004138 case TARGET(LOAD_METHOD): {
Andreyb021ba52019-04-29 14:33:26 +10004139 /* Designed to work in tandem with CALL_METHOD. */
Yury Selivanovf2392132016-12-13 19:03:51 -05004140 PyObject *name = GETITEM(names, oparg);
4141 PyObject *obj = TOP();
4142 PyObject *meth = NULL;
4143
4144 int meth_found = _PyObject_GetMethod(obj, name, &meth);
4145
Yury Selivanovf2392132016-12-13 19:03:51 -05004146 if (meth == NULL) {
4147 /* Most likely attribute wasn't found. */
Yury Selivanovf2392132016-12-13 19:03:51 -05004148 goto error;
4149 }
4150
4151 if (meth_found) {
INADA Naoki015bce62017-01-16 17:23:30 +09004152 /* We can bypass temporary bound method object.
4153 meth is unbound method and obj is self.
Victor Stinnera8cb5152017-01-18 14:12:51 +01004154
INADA Naoki015bce62017-01-16 17:23:30 +09004155 meth | self | arg1 | ... | argN
4156 */
4157 SET_TOP(meth);
4158 PUSH(obj); // self
Yury Selivanovf2392132016-12-13 19:03:51 -05004159 }
4160 else {
INADA Naoki015bce62017-01-16 17:23:30 +09004161 /* meth is not an unbound method (but a regular attr, or
4162 something was returned by a descriptor protocol). Set
4163 the second element of the stack to NULL, to signal
Yury Selivanovf2392132016-12-13 19:03:51 -05004164 CALL_METHOD that it's not a method call.
INADA Naoki015bce62017-01-16 17:23:30 +09004165
4166 NULL | meth | arg1 | ... | argN
Yury Selivanovf2392132016-12-13 19:03:51 -05004167 */
INADA Naoki015bce62017-01-16 17:23:30 +09004168 SET_TOP(NULL);
Yury Selivanovf2392132016-12-13 19:03:51 -05004169 Py_DECREF(obj);
INADA Naoki015bce62017-01-16 17:23:30 +09004170 PUSH(meth);
Yury Selivanovf2392132016-12-13 19:03:51 -05004171 }
4172 DISPATCH();
4173 }
4174
Benjamin Petersonddd19492018-09-16 22:38:02 -07004175 case TARGET(CALL_METHOD): {
Yury Selivanovf2392132016-12-13 19:03:51 -05004176 /* Designed to work in tamdem with LOAD_METHOD. */
INADA Naoki015bce62017-01-16 17:23:30 +09004177 PyObject **sp, *res, *meth;
Yury Selivanovf2392132016-12-13 19:03:51 -05004178
4179 sp = stack_pointer;
4180
INADA Naoki015bce62017-01-16 17:23:30 +09004181 meth = PEEK(oparg + 2);
4182 if (meth == NULL) {
4183 /* `meth` is NULL when LOAD_METHOD thinks that it's not
4184 a method call.
Yury Selivanovf2392132016-12-13 19:03:51 -05004185
4186 Stack layout:
4187
INADA Naoki015bce62017-01-16 17:23:30 +09004188 ... | NULL | callable | arg1 | ... | argN
4189 ^- TOP()
4190 ^- (-oparg)
4191 ^- (-oparg-1)
4192 ^- (-oparg-2)
Yury Selivanovf2392132016-12-13 19:03:51 -05004193
Ville Skyttä49b27342017-08-03 09:00:59 +03004194 `callable` will be POPed by call_function.
INADA Naoki015bce62017-01-16 17:23:30 +09004195 NULL will will be POPed manually later.
Yury Selivanovf2392132016-12-13 19:03:51 -05004196 */
Mark Shannon8e1b4062021-03-05 14:45:50 +00004197 res = call_function(tstate, &trace_info, &sp, oparg, NULL);
Yury Selivanovf2392132016-12-13 19:03:51 -05004198 stack_pointer = sp;
INADA Naoki015bce62017-01-16 17:23:30 +09004199 (void)POP(); /* POP the NULL. */
Yury Selivanovf2392132016-12-13 19:03:51 -05004200 }
4201 else {
4202 /* This is a method call. Stack layout:
4203
INADA Naoki015bce62017-01-16 17:23:30 +09004204 ... | method | self | arg1 | ... | argN
Yury Selivanovf2392132016-12-13 19:03:51 -05004205 ^- TOP()
4206 ^- (-oparg)
INADA Naoki015bce62017-01-16 17:23:30 +09004207 ^- (-oparg-1)
4208 ^- (-oparg-2)
Yury Selivanovf2392132016-12-13 19:03:51 -05004209
INADA Naoki015bce62017-01-16 17:23:30 +09004210 `self` and `method` will be POPed by call_function.
Yury Selivanovf2392132016-12-13 19:03:51 -05004211 We'll be passing `oparg + 1` to call_function, to
INADA Naoki015bce62017-01-16 17:23:30 +09004212 make it accept the `self` as a first argument.
Yury Selivanovf2392132016-12-13 19:03:51 -05004213 */
Mark Shannon8e1b4062021-03-05 14:45:50 +00004214 res = call_function(tstate, &trace_info, &sp, oparg + 1, NULL);
Yury Selivanovf2392132016-12-13 19:03:51 -05004215 stack_pointer = sp;
4216 }
4217
4218 PUSH(res);
4219 if (res == NULL)
4220 goto error;
Mark Shannon4958f5d2021-03-24 17:56:12 +00004221 CHECK_EVAL_BREAKER();
Yury Selivanovf2392132016-12-13 19:03:51 -05004222 DISPATCH();
4223 }
4224
Benjamin Petersonddd19492018-09-16 22:38:02 -07004225 case TARGET(CALL_FUNCTION): {
4226 PREDICTED(CALL_FUNCTION);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004227 PyObject **sp, *res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004228 sp = stack_pointer;
Mark Shannon8e1b4062021-03-05 14:45:50 +00004229 res = call_function(tstate, &trace_info, &sp, oparg, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004230 stack_pointer = sp;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004231 PUSH(res);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004232 if (res == NULL) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004233 goto error;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004234 }
Mark Shannon4958f5d2021-03-24 17:56:12 +00004235 CHECK_EVAL_BREAKER();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004236 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004237 }
Guido van Rossumac7be682001-01-17 15:42:30 +00004238
Benjamin Petersonddd19492018-09-16 22:38:02 -07004239 case TARGET(CALL_FUNCTION_KW): {
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004240 PyObject **sp, *res, *names;
4241
4242 names = POP();
Jeroen Demeyer05677862019-08-16 12:41:27 +02004243 assert(PyTuple_Check(names));
4244 assert(PyTuple_GET_SIZE(names) <= oparg);
4245 /* We assume without checking that names contains only strings */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004246 sp = stack_pointer;
Mark Shannon8e1b4062021-03-05 14:45:50 +00004247 res = call_function(tstate, &trace_info, &sp, oparg, names);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004248 stack_pointer = sp;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004249 PUSH(res);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004250 Py_DECREF(names);
4251
4252 if (res == NULL) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004253 goto error;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004254 }
Mark Shannon4958f5d2021-03-24 17:56:12 +00004255 CHECK_EVAL_BREAKER();
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004256 DISPATCH();
4257 }
4258
Benjamin Petersonddd19492018-09-16 22:38:02 -07004259 case TARGET(CALL_FUNCTION_EX): {
Brandt Bucherf185a732019-09-28 17:12:49 -07004260 PREDICTED(CALL_FUNCTION_EX);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004261 PyObject *func, *callargs, *kwargs = NULL, *result;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004262 if (oparg & 0x01) {
4263 kwargs = POP();
Serhiy Storchakab7281052016-09-12 00:52:40 +03004264 if (!PyDict_CheckExact(kwargs)) {
4265 PyObject *d = PyDict_New();
4266 if (d == NULL)
4267 goto error;
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02004268 if (_PyDict_MergeEx(d, kwargs, 2) < 0) {
Serhiy Storchakab7281052016-09-12 00:52:40 +03004269 Py_DECREF(d);
Victor Stinner438a12d2019-05-24 17:01:38 +02004270 format_kwargs_error(tstate, SECOND(), kwargs);
Victor Stinnereece2222016-09-12 11:16:37 +02004271 Py_DECREF(kwargs);
Serhiy Storchakab7281052016-09-12 00:52:40 +03004272 goto error;
4273 }
4274 Py_DECREF(kwargs);
4275 kwargs = d;
4276 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004277 assert(PyDict_CheckExact(kwargs));
4278 }
4279 callargs = POP();
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004280 func = TOP();
Serhiy Storchaka63dc5482016-09-22 19:41:20 +03004281 if (!PyTuple_CheckExact(callargs)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004282 if (check_args_iterable(tstate, func, callargs) < 0) {
Victor Stinnereece2222016-09-12 11:16:37 +02004283 Py_DECREF(callargs);
Serhiy Storchakab7281052016-09-12 00:52:40 +03004284 goto error;
4285 }
4286 Py_SETREF(callargs, PySequence_Tuple(callargs));
4287 if (callargs == NULL) {
4288 goto error;
4289 }
4290 }
Serhiy Storchaka63dc5482016-09-22 19:41:20 +03004291 assert(PyTuple_CheckExact(callargs));
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004292
Mark Shannon8e1b4062021-03-05 14:45:50 +00004293 result = do_call_core(tstate, &trace_info, func, callargs, kwargs);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004294 Py_DECREF(func);
4295 Py_DECREF(callargs);
4296 Py_XDECREF(kwargs);
4297
4298 SET_TOP(result);
4299 if (result == NULL) {
4300 goto error;
4301 }
Mark Shannon4958f5d2021-03-24 17:56:12 +00004302 CHECK_EVAL_BREAKER();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004303 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004304 }
Guido van Rossumac7be682001-01-17 15:42:30 +00004305
Benjamin Petersonddd19492018-09-16 22:38:02 -07004306 case TARGET(MAKE_FUNCTION): {
Serhiy Storchaka64204de2016-06-12 17:36:24 +03004307 PyObject *qualname = POP();
4308 PyObject *codeobj = POP();
4309 PyFunctionObject *func = (PyFunctionObject *)
4310 PyFunction_NewWithQualName(codeobj, f->f_globals, qualname);
Guido van Rossum4f72a782006-10-27 23:31:49 +00004311
Serhiy Storchaka64204de2016-06-12 17:36:24 +03004312 Py_DECREF(codeobj);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004313 Py_DECREF(qualname);
Serhiy Storchaka64204de2016-06-12 17:36:24 +03004314 if (func == NULL) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004315 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004316 }
Neal Norwitzc1505362006-12-28 06:47:50 +00004317
Serhiy Storchaka64204de2016-06-12 17:36:24 +03004318 if (oparg & 0x08) {
4319 assert(PyTuple_CheckExact(TOP()));
Mark Shannond6c33fb2021-01-29 13:24:55 +00004320 func->func_closure = POP();
Serhiy Storchaka64204de2016-06-12 17:36:24 +03004321 }
4322 if (oparg & 0x04) {
Yurii Karabas73019792020-11-25 12:43:18 +02004323 assert(PyTuple_CheckExact(TOP()));
Serhiy Storchaka64204de2016-06-12 17:36:24 +03004324 func->func_annotations = POP();
4325 }
4326 if (oparg & 0x02) {
4327 assert(PyDict_CheckExact(TOP()));
4328 func->func_kwdefaults = POP();
4329 }
4330 if (oparg & 0x01) {
4331 assert(PyTuple_CheckExact(TOP()));
4332 func->func_defaults = POP();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004333 }
Neal Norwitzc1505362006-12-28 06:47:50 +00004334
Serhiy Storchaka64204de2016-06-12 17:36:24 +03004335 PUSH((PyObject *)func);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004336 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004337 }
Guido van Rossum8861b741996-07-30 16:49:37 +00004338
Benjamin Petersonddd19492018-09-16 22:38:02 -07004339 case TARGET(BUILD_SLICE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004340 PyObject *start, *stop, *step, *slice;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004341 if (oparg == 3)
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004342 step = POP();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004343 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004344 step = NULL;
4345 stop = POP();
4346 start = TOP();
4347 slice = PySlice_New(start, stop, step);
4348 Py_DECREF(start);
4349 Py_DECREF(stop);
4350 Py_XDECREF(step);
4351 SET_TOP(slice);
4352 if (slice == NULL)
4353 goto error;
4354 DISPATCH();
4355 }
Guido van Rossum8861b741996-07-30 16:49:37 +00004356
Benjamin Petersonddd19492018-09-16 22:38:02 -07004357 case TARGET(FORMAT_VALUE): {
Eric V. Smitha78c7952015-11-03 12:45:05 -05004358 /* Handles f-string value formatting. */
4359 PyObject *result;
4360 PyObject *fmt_spec;
4361 PyObject *value;
4362 PyObject *(*conv_fn)(PyObject *);
4363 int which_conversion = oparg & FVC_MASK;
4364 int have_fmt_spec = (oparg & FVS_MASK) == FVS_HAVE_SPEC;
4365
4366 fmt_spec = have_fmt_spec ? POP() : NULL;
Eric V. Smith135d5f42016-02-05 18:23:08 -05004367 value = POP();
Eric V. Smitha78c7952015-11-03 12:45:05 -05004368
4369 /* See if any conversion is specified. */
4370 switch (which_conversion) {
Eric V. Smith9a4135e2019-05-08 16:28:48 -04004371 case FVC_NONE: conv_fn = NULL; break;
Eric V. Smitha78c7952015-11-03 12:45:05 -05004372 case FVC_STR: conv_fn = PyObject_Str; break;
4373 case FVC_REPR: conv_fn = PyObject_Repr; break;
4374 case FVC_ASCII: conv_fn = PyObject_ASCII; break;
Eric V. Smith9a4135e2019-05-08 16:28:48 -04004375 default:
Victor Stinner438a12d2019-05-24 17:01:38 +02004376 _PyErr_Format(tstate, PyExc_SystemError,
4377 "unexpected conversion flag %d",
4378 which_conversion);
Eric V. Smith9a4135e2019-05-08 16:28:48 -04004379 goto error;
Eric V. Smitha78c7952015-11-03 12:45:05 -05004380 }
4381
4382 /* If there's a conversion function, call it and replace
4383 value with that result. Otherwise, just use value,
4384 without conversion. */
Eric V. Smitheb588a12016-02-05 18:26:20 -05004385 if (conv_fn != NULL) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05004386 result = conv_fn(value);
4387 Py_DECREF(value);
Eric V. Smitheb588a12016-02-05 18:26:20 -05004388 if (result == NULL) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05004389 Py_XDECREF(fmt_spec);
4390 goto error;
4391 }
4392 value = result;
4393 }
4394
4395 /* If value is a unicode object, and there's no fmt_spec,
4396 then we know the result of format(value) is value
4397 itself. In that case, skip calling format(). I plan to
4398 move this optimization in to PyObject_Format()
4399 itself. */
4400 if (PyUnicode_CheckExact(value) && fmt_spec == NULL) {
4401 /* Do nothing, just transfer ownership to result. */
4402 result = value;
4403 } else {
4404 /* Actually call format(). */
4405 result = PyObject_Format(value, fmt_spec);
4406 Py_DECREF(value);
4407 Py_XDECREF(fmt_spec);
Eric V. Smitheb588a12016-02-05 18:26:20 -05004408 if (result == NULL) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05004409 goto error;
Eric V. Smitheb588a12016-02-05 18:26:20 -05004410 }
Eric V. Smitha78c7952015-11-03 12:45:05 -05004411 }
4412
Eric V. Smith135d5f42016-02-05 18:23:08 -05004413 PUSH(result);
Eric V. Smitha78c7952015-11-03 12:45:05 -05004414 DISPATCH();
4415 }
4416
Brandt Bucher0ad1e032021-05-02 13:02:10 -07004417 case TARGET(ROT_N): {
4418 PyObject *top = TOP();
4419 memmove(&PEEK(oparg - 1), &PEEK(oparg),
4420 sizeof(PyObject*) * (oparg - 1));
4421 PEEK(oparg) = top;
4422 DISPATCH();
4423 }
4424
Benjamin Petersonddd19492018-09-16 22:38:02 -07004425 case TARGET(EXTENDED_ARG): {
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03004426 int oldoparg = oparg;
4427 NEXTOPARG();
4428 oparg |= oldoparg << 8;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004429 goto dispatch_opcode;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004430 }
Guido van Rossum8861b741996-07-30 16:49:37 +00004431
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004432
Antoine Pitrou042b1282010-08-13 21:15:58 +00004433#if USE_COMPUTED_GOTOS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004434 _unknown_opcode:
Antoine Pitroub52ec782009-01-25 16:34:23 +00004435#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004436 default:
4437 fprintf(stderr,
4438 "XXX lineno: %d, opcode: %d\n",
4439 PyFrame_GetLineNumber(f),
4440 opcode);
Victor Stinner438a12d2019-05-24 17:01:38 +02004441 _PyErr_SetString(tstate, PyExc_SystemError, "unknown opcode");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004442 goto error;
Guido van Rossum04691fc1992-08-12 15:35:34 +00004443
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004444 } /* switch */
Guido van Rossum374a9221991-04-04 10:40:29 +00004445
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004446 /* This should never be reached. Every opcode should end with DISPATCH()
4447 or goto error. */
Barry Warsawb2e57942017-09-14 18:13:16 -07004448 Py_UNREACHABLE();
Guido van Rossumac7be682001-01-17 15:42:30 +00004449
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004450error:
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004451 /* Double-check exception status. */
Victor Stinner365b6932013-07-12 00:11:58 +02004452#ifdef NDEBUG
Victor Stinner438a12d2019-05-24 17:01:38 +02004453 if (!_PyErr_Occurred(tstate)) {
4454 _PyErr_SetString(tstate, PyExc_SystemError,
4455 "error return without exception set");
4456 }
Victor Stinner365b6932013-07-12 00:11:58 +02004457#else
Victor Stinner438a12d2019-05-24 17:01:38 +02004458 assert(_PyErr_Occurred(tstate));
Victor Stinner365b6932013-07-12 00:11:58 +02004459#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00004460
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004461 /* Log traceback info. */
4462 PyTraceBack_Here(f);
Guido van Rossumac7be682001-01-17 15:42:30 +00004463
Mark Shannoncb9879b2020-07-17 11:44:23 +01004464 if (tstate->c_tracefunc != NULL) {
4465 /* Make sure state is set to FRAME_EXECUTING for tracing */
4466 assert(f->f_state == FRAME_EXECUTING);
4467 f->f_state = FRAME_UNWINDING;
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004468 call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj,
Mark Shannon8e1b4062021-03-05 14:45:50 +00004469 tstate, f, &trace_info);
Mark Shannoncb9879b2020-07-17 11:44:23 +01004470 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004471exception_unwind:
Mark Shannoncb9879b2020-07-17 11:44:23 +01004472 f->f_state = FRAME_UNWINDING;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004473 /* Unwind stacks if an exception occurred */
4474 while (f->f_iblock > 0) {
4475 /* Pop the current block. */
4476 PyTryBlock *b = &f->f_blockstack[--f->f_iblock];
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004477
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004478 if (b->b_type == EXCEPT_HANDLER) {
4479 UNWIND_EXCEPT_HANDLER(b);
4480 continue;
4481 }
4482 UNWIND_BLOCK(b);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004483 if (b->b_type == SETUP_FINALLY) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004484 PyObject *exc, *val, *tb;
4485 int handler = b->b_handler;
Mark Shannonae3087c2017-10-22 22:41:51 +01004486 _PyErr_StackItem *exc_info = tstate->exc_info;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004487 /* Beware, this invalidates all b->b_* fields */
Mark Shannonbf353f32020-12-17 13:55:28 +00004488 PyFrame_BlockSetup(f, EXCEPT_HANDLER, f->f_lasti, STACK_LEVEL());
Mark Shannonae3087c2017-10-22 22:41:51 +01004489 PUSH(exc_info->exc_traceback);
4490 PUSH(exc_info->exc_value);
4491 if (exc_info->exc_type != NULL) {
4492 PUSH(exc_info->exc_type);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004493 }
4494 else {
4495 Py_INCREF(Py_None);
4496 PUSH(Py_None);
4497 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004498 _PyErr_Fetch(tstate, &exc, &val, &tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004499 /* Make the raw exception data
4500 available to the handler,
4501 so a program can emulate the
4502 Python main loop. */
Victor Stinner438a12d2019-05-24 17:01:38 +02004503 _PyErr_NormalizeException(tstate, &exc, &val, &tb);
Victor Stinner7eab0d02013-07-15 21:16:27 +02004504 if (tb != NULL)
4505 PyException_SetTraceback(val, tb);
4506 else
4507 PyException_SetTraceback(val, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004508 Py_INCREF(exc);
Mark Shannonae3087c2017-10-22 22:41:51 +01004509 exc_info->exc_type = exc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004510 Py_INCREF(val);
Mark Shannonae3087c2017-10-22 22:41:51 +01004511 exc_info->exc_value = val;
4512 exc_info->exc_traceback = tb;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004513 if (tb == NULL)
4514 tb = Py_None;
4515 Py_INCREF(tb);
4516 PUSH(tb);
4517 PUSH(val);
4518 PUSH(exc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004519 JUMPTO(handler);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004520 /* Resume normal execution */
Mark Shannoncb9879b2020-07-17 11:44:23 +01004521 f->f_state = FRAME_EXECUTING;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004522 goto main_loop;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004523 }
4524 } /* unwind stack */
Guido van Rossum374a9221991-04-04 10:40:29 +00004525
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004526 /* End the loop as we still have an error */
4527 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004528 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00004529
Pablo Galindof00828a2019-05-09 16:52:02 +01004530 assert(retval == NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02004531 assert(_PyErr_Occurred(tstate));
Pablo Galindof00828a2019-05-09 16:52:02 +01004532
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004533 /* Pop remaining stack entries. */
4534 while (!EMPTY()) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004535 PyObject *o = POP();
4536 Py_XDECREF(o);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004537 }
Mark Shannoncb9879b2020-07-17 11:44:23 +01004538 f->f_stackdepth = 0;
4539 f->f_state = FRAME_RAISED;
Mark Shannone7c9f4a2020-01-13 12:51:26 +00004540exiting:
Mark Shannon9e7b2072021-04-13 11:08:14 +01004541 if (trace_info.cframe.use_tracing) {
Benjamin Peterson51f46162013-01-23 08:38:47 -05004542 if (tstate->c_tracefunc) {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004543 if (call_trace_protected(tstate->c_tracefunc, tstate->c_traceobj,
Mark Shannon8e1b4062021-03-05 14:45:50 +00004544 tstate, f, &trace_info, PyTrace_RETURN, retval)) {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004545 Py_CLEAR(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004546 }
4547 }
4548 if (tstate->c_profilefunc) {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004549 if (call_trace_protected(tstate->c_profilefunc, tstate->c_profileobj,
Mark Shannon8e1b4062021-03-05 14:45:50 +00004550 tstate, f, &trace_info, PyTrace_RETURN, retval)) {
Serhiy Storchaka505ff752014-02-09 13:33:53 +02004551 Py_CLEAR(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004552 }
4553 }
4554 }
Guido van Rossuma4240131997-01-21 21:18:36 +00004555
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004556 /* pop frame */
Thomas Woutersce272b62007-09-19 21:19:28 +00004557exit_eval_frame:
Mark Shannon9e7b2072021-04-13 11:08:14 +01004558 /* Restore previous cframe */
4559 tstate->cframe = trace_info.cframe.previous;
4560 tstate->cframe->use_tracing = trace_info.cframe.use_tracing;
4561
Łukasz Langaa785c872016-09-09 17:37:37 -07004562 if (PyDTrace_FUNCTION_RETURN_ENABLED())
4563 dtrace_function_return(f);
Victor Stinnerbe434dc2019-11-05 00:51:22 +01004564 _Py_LeaveRecursiveCall(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004565 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00004566
Victor Stinner0b72b232020-03-12 23:18:39 +01004567 return _Py_CheckFunctionResult(tstate, NULL, retval, __func__);
Guido van Rossum374a9221991-04-04 10:40:29 +00004568}
4569
Benjamin Petersonb204a422011-06-05 22:04:07 -05004570static void
Victor Stinner438a12d2019-05-24 17:01:38 +02004571format_missing(PyThreadState *tstate, const char *kind,
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004572 PyCodeObject *co, PyObject *names, PyObject *qualname)
Benjamin Petersone109c702011-06-24 09:37:26 -05004573{
4574 int err;
4575 Py_ssize_t len = PyList_GET_SIZE(names);
4576 PyObject *name_str, *comma, *tail, *tmp;
4577
4578 assert(PyList_CheckExact(names));
4579 assert(len >= 1);
4580 /* Deal with the joys of natural language. */
4581 switch (len) {
4582 case 1:
4583 name_str = PyList_GET_ITEM(names, 0);
4584 Py_INCREF(name_str);
4585 break;
4586 case 2:
4587 name_str = PyUnicode_FromFormat("%U and %U",
4588 PyList_GET_ITEM(names, len - 2),
4589 PyList_GET_ITEM(names, len - 1));
4590 break;
4591 default:
4592 tail = PyUnicode_FromFormat(", %U, and %U",
4593 PyList_GET_ITEM(names, len - 2),
4594 PyList_GET_ITEM(names, len - 1));
Benjamin Petersond1ab6082012-06-01 11:18:22 -07004595 if (tail == NULL)
4596 return;
Benjamin Petersone109c702011-06-24 09:37:26 -05004597 /* Chop off the last two objects in the list. This shouldn't actually
4598 fail, but we can't be too careful. */
4599 err = PyList_SetSlice(names, len - 2, len, NULL);
4600 if (err == -1) {
4601 Py_DECREF(tail);
4602 return;
4603 }
4604 /* Stitch everything up into a nice comma-separated list. */
4605 comma = PyUnicode_FromString(", ");
4606 if (comma == NULL) {
4607 Py_DECREF(tail);
4608 return;
4609 }
4610 tmp = PyUnicode_Join(comma, names);
4611 Py_DECREF(comma);
4612 if (tmp == NULL) {
4613 Py_DECREF(tail);
4614 return;
4615 }
4616 name_str = PyUnicode_Concat(tmp, tail);
4617 Py_DECREF(tmp);
4618 Py_DECREF(tail);
4619 break;
4620 }
4621 if (name_str == NULL)
4622 return;
Victor Stinner438a12d2019-05-24 17:01:38 +02004623 _PyErr_Format(tstate, PyExc_TypeError,
4624 "%U() missing %i required %s argument%s: %U",
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004625 qualname,
Victor Stinner438a12d2019-05-24 17:01:38 +02004626 len,
4627 kind,
4628 len == 1 ? "" : "s",
4629 name_str);
Benjamin Petersone109c702011-06-24 09:37:26 -05004630 Py_DECREF(name_str);
4631}
4632
4633static void
Victor Stinner438a12d2019-05-24 17:01:38 +02004634missing_arguments(PyThreadState *tstate, PyCodeObject *co,
4635 Py_ssize_t missing, Py_ssize_t defcount,
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004636 PyObject **fastlocals, PyObject *qualname)
Benjamin Petersone109c702011-06-24 09:37:26 -05004637{
Victor Stinner74319ae2016-08-25 00:04:09 +02004638 Py_ssize_t i, j = 0;
4639 Py_ssize_t start, end;
4640 int positional = (defcount != -1);
Benjamin Petersone109c702011-06-24 09:37:26 -05004641 const char *kind = positional ? "positional" : "keyword-only";
4642 PyObject *missing_names;
4643
4644 /* Compute the names of the arguments that are missing. */
4645 missing_names = PyList_New(missing);
4646 if (missing_names == NULL)
4647 return;
4648 if (positional) {
4649 start = 0;
Pablo Galindocd74e662019-06-01 18:08:04 +01004650 end = co->co_argcount - defcount;
Benjamin Petersone109c702011-06-24 09:37:26 -05004651 }
4652 else {
Pablo Galindocd74e662019-06-01 18:08:04 +01004653 start = co->co_argcount;
Benjamin Petersone109c702011-06-24 09:37:26 -05004654 end = start + co->co_kwonlyargcount;
4655 }
4656 for (i = start; i < end; i++) {
4657 if (GETLOCAL(i) == NULL) {
4658 PyObject *raw = PyTuple_GET_ITEM(co->co_varnames, i);
4659 PyObject *name = PyObject_Repr(raw);
4660 if (name == NULL) {
4661 Py_DECREF(missing_names);
4662 return;
4663 }
4664 PyList_SET_ITEM(missing_names, j++, name);
4665 }
4666 }
4667 assert(j == missing);
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004668 format_missing(tstate, kind, co, missing_names, qualname);
Benjamin Petersone109c702011-06-24 09:37:26 -05004669 Py_DECREF(missing_names);
4670}
4671
4672static void
Victor Stinner438a12d2019-05-24 17:01:38 +02004673too_many_positional(PyThreadState *tstate, PyCodeObject *co,
Mark Shannond6c33fb2021-01-29 13:24:55 +00004674 Py_ssize_t given, PyObject *defaults,
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004675 PyObject **fastlocals, PyObject *qualname)
Benjamin Petersonb204a422011-06-05 22:04:07 -05004676{
4677 int plural;
Victor Stinner74319ae2016-08-25 00:04:09 +02004678 Py_ssize_t kwonly_given = 0;
4679 Py_ssize_t i;
Benjamin Petersonb204a422011-06-05 22:04:07 -05004680 PyObject *sig, *kwonly_sig;
Victor Stinner74319ae2016-08-25 00:04:09 +02004681 Py_ssize_t co_argcount = co->co_argcount;
Benjamin Petersonb204a422011-06-05 22:04:07 -05004682
Benjamin Petersone109c702011-06-24 09:37:26 -05004683 assert((co->co_flags & CO_VARARGS) == 0);
4684 /* Count missing keyword-only args. */
Pablo Galindocd74e662019-06-01 18:08:04 +01004685 for (i = co_argcount; i < co_argcount + co->co_kwonlyargcount; i++) {
Victor Stinner74319ae2016-08-25 00:04:09 +02004686 if (GETLOCAL(i) != NULL) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004687 kwonly_given++;
Victor Stinner74319ae2016-08-25 00:04:09 +02004688 }
4689 }
Mark Shannond6c33fb2021-01-29 13:24:55 +00004690 Py_ssize_t defcount = defaults == NULL ? 0 : PyTuple_GET_SIZE(defaults);
Benjamin Petersone109c702011-06-24 09:37:26 -05004691 if (defcount) {
Pablo Galindocd74e662019-06-01 18:08:04 +01004692 Py_ssize_t atleast = co_argcount - defcount;
Benjamin Petersonb204a422011-06-05 22:04:07 -05004693 plural = 1;
Pablo Galindocd74e662019-06-01 18:08:04 +01004694 sig = PyUnicode_FromFormat("from %zd to %zd", atleast, co_argcount);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004695 }
4696 else {
Pablo Galindocd74e662019-06-01 18:08:04 +01004697 plural = (co_argcount != 1);
4698 sig = PyUnicode_FromFormat("%zd", co_argcount);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004699 }
4700 if (sig == NULL)
4701 return;
4702 if (kwonly_given) {
Victor Stinner74319ae2016-08-25 00:04:09 +02004703 const char *format = " positional argument%s (and %zd keyword-only argument%s)";
4704 kwonly_sig = PyUnicode_FromFormat(format,
4705 given != 1 ? "s" : "",
4706 kwonly_given,
4707 kwonly_given != 1 ? "s" : "");
Benjamin Petersonb204a422011-06-05 22:04:07 -05004708 if (kwonly_sig == NULL) {
4709 Py_DECREF(sig);
4710 return;
4711 }
4712 }
4713 else {
4714 /* This will not fail. */
4715 kwonly_sig = PyUnicode_FromString("");
Benjamin Petersone109c702011-06-24 09:37:26 -05004716 assert(kwonly_sig != NULL);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004717 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004718 _PyErr_Format(tstate, PyExc_TypeError,
4719 "%U() takes %U positional argument%s but %zd%U %s given",
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004720 qualname,
Victor Stinner438a12d2019-05-24 17:01:38 +02004721 sig,
4722 plural ? "s" : "",
4723 given,
4724 kwonly_sig,
4725 given == 1 && !kwonly_given ? "was" : "were");
Benjamin Petersonb204a422011-06-05 22:04:07 -05004726 Py_DECREF(sig);
4727 Py_DECREF(kwonly_sig);
4728}
4729
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004730static int
Victor Stinner438a12d2019-05-24 17:01:38 +02004731positional_only_passed_as_keyword(PyThreadState *tstate, PyCodeObject *co,
Mark Shannon0332e562021-02-01 10:42:03 +00004732 Py_ssize_t kwcount, PyObject* kwnames,
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004733 PyObject *qualname)
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004734{
4735 int posonly_conflicts = 0;
4736 PyObject* posonly_names = PyList_New(0);
4737
4738 for(int k=0; k < co->co_posonlyargcount; k++){
4739 PyObject* posonly_name = PyTuple_GET_ITEM(co->co_varnames, k);
4740
4741 for (int k2=0; k2<kwcount; k2++){
4742 /* Compare the pointers first and fallback to PyObject_RichCompareBool*/
Mark Shannon0332e562021-02-01 10:42:03 +00004743 PyObject* kwname = PyTuple_GET_ITEM(kwnames, k2);
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004744 if (kwname == posonly_name){
4745 if(PyList_Append(posonly_names, kwname) != 0) {
4746 goto fail;
4747 }
4748 posonly_conflicts++;
4749 continue;
4750 }
4751
4752 int cmp = PyObject_RichCompareBool(posonly_name, kwname, Py_EQ);
4753
4754 if ( cmp > 0) {
4755 if(PyList_Append(posonly_names, kwname) != 0) {
4756 goto fail;
4757 }
4758 posonly_conflicts++;
4759 } else if (cmp < 0) {
4760 goto fail;
4761 }
4762
4763 }
4764 }
4765 if (posonly_conflicts) {
4766 PyObject* comma = PyUnicode_FromString(", ");
4767 if (comma == NULL) {
4768 goto fail;
4769 }
4770 PyObject* error_names = PyUnicode_Join(comma, posonly_names);
4771 Py_DECREF(comma);
4772 if (error_names == NULL) {
4773 goto fail;
4774 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004775 _PyErr_Format(tstate, PyExc_TypeError,
4776 "%U() got some positional-only arguments passed"
4777 " as keyword arguments: '%U'",
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004778 qualname, error_names);
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004779 Py_DECREF(error_names);
4780 goto fail;
4781 }
4782
4783 Py_DECREF(posonly_names);
4784 return 0;
4785
4786fail:
4787 Py_XDECREF(posonly_names);
4788 return 1;
4789
4790}
4791
Skip Montanaro786ea6b2004-03-01 15:44:05 +00004792
Mark Shannon0332e562021-02-01 10:42:03 +00004793PyFrameObject *
4794_PyEval_MakeFrameVector(PyThreadState *tstate,
Mark Shannond6c33fb2021-01-29 13:24:55 +00004795 PyFrameConstructor *con, PyObject *locals,
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02004796 PyObject *const *args, Py_ssize_t argcount,
Mark Shannon0332e562021-02-01 10:42:03 +00004797 PyObject *kwnames)
Tim Peters5ca576e2001-06-18 22:08:13 +00004798{
Victor Stinnerda2914d2020-03-20 09:29:08 +01004799 assert(is_tstate_valid(tstate));
Victor Stinnerb5e170f2019-11-16 01:03:22 +01004800
Mark Shannond6c33fb2021-01-29 13:24:55 +00004801 PyCodeObject *co = (PyCodeObject*)con->fc_code;
4802 assert(con->fc_defaults == NULL || PyTuple_CheckExact(con->fc_defaults));
Pablo Galindocd74e662019-06-01 18:08:04 +01004803 const Py_ssize_t total_args = co->co_argcount + co->co_kwonlyargcount;
Tim Peters5ca576e2001-06-18 22:08:13 +00004804
Victor Stinnerc7020012016-08-16 23:40:29 +02004805 /* Create the frame */
Mark Shannon0332e562021-02-01 10:42:03 +00004806 PyFrameObject *f = _PyFrame_New_NoTrack(tstate, con, locals);
Victor Stinnerc7020012016-08-16 23:40:29 +02004807 if (f == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004808 return NULL;
Victor Stinnerc7020012016-08-16 23:40:29 +02004809 }
Victor Stinner232dda62020-06-04 15:19:02 +02004810 PyObject **fastlocals = f->f_localsplus;
4811 PyObject **freevars = f->f_localsplus + co->co_nlocals;
Tim Peters5ca576e2001-06-18 22:08:13 +00004812
Victor Stinnerc7020012016-08-16 23:40:29 +02004813 /* Create a dictionary for keyword parameters (**kwags) */
Victor Stinner232dda62020-06-04 15:19:02 +02004814 PyObject *kwdict;
4815 Py_ssize_t i;
Benjamin Petersonb204a422011-06-05 22:04:07 -05004816 if (co->co_flags & CO_VARKEYWORDS) {
4817 kwdict = PyDict_New();
4818 if (kwdict == NULL)
4819 goto fail;
4820 i = total_args;
Victor Stinnerc7020012016-08-16 23:40:29 +02004821 if (co->co_flags & CO_VARARGS) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004822 i++;
Victor Stinnerc7020012016-08-16 23:40:29 +02004823 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004824 SETLOCAL(i, kwdict);
4825 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004826 else {
4827 kwdict = NULL;
4828 }
4829
Pablo Galindocd74e662019-06-01 18:08:04 +01004830 /* Copy all positional arguments into local variables */
Victor Stinner232dda62020-06-04 15:19:02 +02004831 Py_ssize_t j, n;
Pablo Galindocd74e662019-06-01 18:08:04 +01004832 if (argcount > co->co_argcount) {
4833 n = co->co_argcount;
Victor Stinnerc7020012016-08-16 23:40:29 +02004834 }
4835 else {
4836 n = argcount;
4837 }
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004838 for (j = 0; j < n; j++) {
Victor Stinner232dda62020-06-04 15:19:02 +02004839 PyObject *x = args[j];
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004840 Py_INCREF(x);
4841 SETLOCAL(j, x);
4842 }
4843
Victor Stinnerc7020012016-08-16 23:40:29 +02004844 /* Pack other positional arguments into the *args argument */
Benjamin Petersonb204a422011-06-05 22:04:07 -05004845 if (co->co_flags & CO_VARARGS) {
Victor Stinner232dda62020-06-04 15:19:02 +02004846 PyObject *u = _PyTuple_FromArray(args + n, argcount - n);
Victor Stinnerc7020012016-08-16 23:40:29 +02004847 if (u == NULL) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004848 goto fail;
Victor Stinnerc7020012016-08-16 23:40:29 +02004849 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004850 SETLOCAL(total_args, u);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004851 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004852
Mark Shannon0332e562021-02-01 10:42:03 +00004853 /* Handle keyword arguments */
4854 if (kwnames != NULL) {
4855 Py_ssize_t kwcount = PyTuple_GET_SIZE(kwnames);
4856 for (i = 0; i < kwcount; i++) {
4857 PyObject **co_varnames;
4858 PyObject *keyword = PyTuple_GET_ITEM(kwnames, i);
4859 PyObject *value = args[i+argcount];
4860 Py_ssize_t j;
Victor Stinnerc7020012016-08-16 23:40:29 +02004861
Mark Shannon0332e562021-02-01 10:42:03 +00004862 if (keyword == NULL || !PyUnicode_Check(keyword)) {
4863 _PyErr_Format(tstate, PyExc_TypeError,
4864 "%U() keywords must be strings",
Mark Shannond6c33fb2021-01-29 13:24:55 +00004865 con->fc_qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004866 goto fail;
Victor Stinner6fea7f72016-08-22 23:17:30 +02004867 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004868
Mark Shannon0332e562021-02-01 10:42:03 +00004869 /* Speed hack: do raw pointer compares. As names are
4870 normally interned this should almost always hit. */
4871 co_varnames = ((PyTupleObject *)(co->co_varnames))->ob_item;
4872 for (j = co->co_posonlyargcount; j < total_args; j++) {
4873 PyObject *varname = co_varnames[j];
4874 if (varname == keyword) {
4875 goto kw_found;
4876 }
4877 }
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004878
Mark Shannon0332e562021-02-01 10:42:03 +00004879 /* Slow fallback, just in case */
4880 for (j = co->co_posonlyargcount; j < total_args; j++) {
4881 PyObject *varname = co_varnames[j];
4882 int cmp = PyObject_RichCompareBool( keyword, varname, Py_EQ);
4883 if (cmp > 0) {
4884 goto kw_found;
4885 }
4886 else if (cmp < 0) {
4887 goto fail;
4888 }
4889 }
4890
4891 assert(j >= total_args);
4892 if (kwdict == NULL) {
4893
4894 if (co->co_posonlyargcount
4895 && positional_only_passed_as_keyword(tstate, co,
4896 kwcount, kwnames,
Mark Shannond6c33fb2021-01-29 13:24:55 +00004897 con->fc_qualname))
Mark Shannon0332e562021-02-01 10:42:03 +00004898 {
4899 goto fail;
4900 }
4901
4902 _PyErr_Format(tstate, PyExc_TypeError,
4903 "%U() got an unexpected keyword argument '%S'",
4904 con->fc_qualname, keyword);
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004905 goto fail;
4906 }
4907
Mark Shannon0332e562021-02-01 10:42:03 +00004908 if (PyDict_SetItem(kwdict, keyword, value) == -1) {
4909 goto fail;
4910 }
4911 continue;
Victor Stinnerc7020012016-08-16 23:40:29 +02004912
Mark Shannon0332e562021-02-01 10:42:03 +00004913 kw_found:
4914 if (GETLOCAL(j) != NULL) {
4915 _PyErr_Format(tstate, PyExc_TypeError,
4916 "%U() got multiple values for argument '%S'",
Mark Shannond6c33fb2021-01-29 13:24:55 +00004917 con->fc_qualname, keyword);
Mark Shannon0332e562021-02-01 10:42:03 +00004918 goto fail;
4919 }
4920 Py_INCREF(value);
4921 SETLOCAL(j, value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004922 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004923 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004924
4925 /* Check the number of positional arguments */
Pablo Galindocd74e662019-06-01 18:08:04 +01004926 if ((argcount > co->co_argcount) && !(co->co_flags & CO_VARARGS)) {
Mark Shannond6c33fb2021-01-29 13:24:55 +00004927 too_many_positional(tstate, co, argcount, con->fc_defaults, fastlocals,
4928 con->fc_qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004929 goto fail;
4930 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004931
4932 /* Add missing positional arguments (copy default values from defs) */
Pablo Galindocd74e662019-06-01 18:08:04 +01004933 if (argcount < co->co_argcount) {
Mark Shannond6c33fb2021-01-29 13:24:55 +00004934 Py_ssize_t defcount = con->fc_defaults == NULL ? 0 : PyTuple_GET_SIZE(con->fc_defaults);
Pablo Galindocd74e662019-06-01 18:08:04 +01004935 Py_ssize_t m = co->co_argcount - defcount;
Victor Stinner17061a92016-08-16 23:39:42 +02004936 Py_ssize_t missing = 0;
4937 for (i = argcount; i < m; i++) {
4938 if (GETLOCAL(i) == NULL) {
Benjamin Petersone109c702011-06-24 09:37:26 -05004939 missing++;
Victor Stinner17061a92016-08-16 23:39:42 +02004940 }
4941 }
Benjamin Petersone109c702011-06-24 09:37:26 -05004942 if (missing) {
Victor Stinner232dda62020-06-04 15:19:02 +02004943 missing_arguments(tstate, co, missing, defcount, fastlocals,
Mark Shannond6c33fb2021-01-29 13:24:55 +00004944 con->fc_qualname);
Benjamin Petersone109c702011-06-24 09:37:26 -05004945 goto fail;
Benjamin Petersonb204a422011-06-05 22:04:07 -05004946 }
4947 if (n > m)
4948 i = n - m;
4949 else
4950 i = 0;
Mark Shannond6c33fb2021-01-29 13:24:55 +00004951 if (defcount) {
4952 PyObject **defs = &PyTuple_GET_ITEM(con->fc_defaults, 0);
4953 for (; i < defcount; i++) {
4954 if (GETLOCAL(m+i) == NULL) {
4955 PyObject *def = defs[i];
4956 Py_INCREF(def);
4957 SETLOCAL(m+i, def);
4958 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004959 }
4960 }
4961 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004962
4963 /* Add missing keyword arguments (copy default values from kwdefs) */
Benjamin Petersonb204a422011-06-05 22:04:07 -05004964 if (co->co_kwonlyargcount > 0) {
Victor Stinner17061a92016-08-16 23:39:42 +02004965 Py_ssize_t missing = 0;
Pablo Galindocd74e662019-06-01 18:08:04 +01004966 for (i = co->co_argcount; i < total_args; i++) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004967 if (GETLOCAL(i) != NULL)
4968 continue;
Victor Stinner232dda62020-06-04 15:19:02 +02004969 PyObject *varname = PyTuple_GET_ITEM(co->co_varnames, i);
Mark Shannond6c33fb2021-01-29 13:24:55 +00004970 if (con->fc_kwdefaults != NULL) {
4971 PyObject *def = PyDict_GetItemWithError(con->fc_kwdefaults, varname);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004972 if (def) {
4973 Py_INCREF(def);
4974 SETLOCAL(i, def);
4975 continue;
4976 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004977 else if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02004978 goto fail;
4979 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004980 }
Benjamin Petersone109c702011-06-24 09:37:26 -05004981 missing++;
4982 }
4983 if (missing) {
Victor Stinner232dda62020-06-04 15:19:02 +02004984 missing_arguments(tstate, co, missing, -1, fastlocals,
Mark Shannond6c33fb2021-01-29 13:24:55 +00004985 con->fc_qualname);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004986 goto fail;
4987 }
4988 }
4989
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004990 /* Allocate and initialize storage for cell vars, and copy free
Benjamin Peterson90037602011-06-25 22:54:45 -05004991 vars into frame. */
4992 for (i = 0; i < PyTuple_GET_SIZE(co->co_cellvars); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004993 PyObject *c;
Serhiy Storchaka5bb8b912016-12-16 19:19:02 +02004994 Py_ssize_t arg;
Benjamin Peterson90037602011-06-25 22:54:45 -05004995 /* Possibly account for the cell variable being an argument. */
4996 if (co->co_cell2arg != NULL &&
Guido van Rossum6832c812013-05-10 08:47:42 -07004997 (arg = co->co_cell2arg[i]) != CO_CELL_NOT_AN_ARG) {
Benjamin Peterson90037602011-06-25 22:54:45 -05004998 c = PyCell_New(GETLOCAL(arg));
Benjamin Peterson159ae412013-05-12 18:16:06 -05004999 /* Clear the local copy. */
5000 SETLOCAL(arg, NULL);
Guido van Rossum6832c812013-05-10 08:47:42 -07005001 }
5002 else {
Benjamin Peterson90037602011-06-25 22:54:45 -05005003 c = PyCell_New(NULL);
Guido van Rossum6832c812013-05-10 08:47:42 -07005004 }
Benjamin Peterson159ae412013-05-12 18:16:06 -05005005 if (c == NULL)
5006 goto fail;
Benjamin Peterson90037602011-06-25 22:54:45 -05005007 SETLOCAL(co->co_nlocals + i, c);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005008 }
Victor Stinnerc7020012016-08-16 23:40:29 +02005009
5010 /* Copy closure variables to free variables */
Benjamin Peterson90037602011-06-25 22:54:45 -05005011 for (i = 0; i < PyTuple_GET_SIZE(co->co_freevars); ++i) {
Mark Shannond6c33fb2021-01-29 13:24:55 +00005012 PyObject *o = PyTuple_GET_ITEM(con->fc_closure, i);
Benjamin Peterson90037602011-06-25 22:54:45 -05005013 Py_INCREF(o);
5014 freevars[PyTuple_GET_SIZE(co->co_cellvars) + i] = o;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005015 }
Tim Peters5ca576e2001-06-18 22:08:13 +00005016
Mark Shannon0332e562021-02-01 10:42:03 +00005017 return f;
Tim Peters5ca576e2001-06-18 22:08:13 +00005018
Thomas Woutersce272b62007-09-19 21:19:28 +00005019fail: /* Jump here from prelude on failure */
Tim Peters5ca576e2001-06-18 22:08:13 +00005020
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005021 /* decref'ing the frame can cause __del__ methods to get invoked,
5022 which can call back into Python. While we're done with the
5023 current Python frame (f), the associated C stack is still in use,
5024 so recursion_depth must be boosted for the duration.
5025 */
INADA Naoki5a625d02016-12-24 20:19:08 +09005026 if (Py_REFCNT(f) > 1) {
5027 Py_DECREF(f);
5028 _PyObject_GC_TRACK(f);
5029 }
5030 else {
5031 ++tstate->recursion_depth;
5032 Py_DECREF(f);
5033 --tstate->recursion_depth;
5034 }
Mark Shannon0332e562021-02-01 10:42:03 +00005035 return NULL;
5036}
5037
5038static PyObject *
5039make_coro(PyFrameConstructor *con, PyFrameObject *f)
5040{
5041 assert (((PyCodeObject *)con->fc_code)->co_flags & (CO_GENERATOR | CO_COROUTINE | CO_ASYNC_GENERATOR));
5042 PyObject *gen;
5043 int is_coro = ((PyCodeObject *)con->fc_code)->co_flags & CO_COROUTINE;
5044
5045 /* Don't need to keep the reference to f_back, it will be set
5046 * when the generator is resumed. */
5047 Py_CLEAR(f->f_back);
5048
5049 /* Create a new generator that owns the ready to run frame
5050 * and return that as the value. */
5051 if (is_coro) {
5052 gen = PyCoro_New(f, con->fc_name, con->fc_qualname);
5053 } else if (((PyCodeObject *)con->fc_code)->co_flags & CO_ASYNC_GENERATOR) {
5054 gen = PyAsyncGen_New(f, con->fc_name, con->fc_qualname);
5055 } else {
5056 gen = PyGen_NewWithQualName(f, con->fc_name, con->fc_qualname);
5057 }
5058 if (gen == NULL) {
5059 return NULL;
5060 }
5061
5062 _PyObject_GC_TRACK(f);
5063
5064 return gen;
5065}
5066
5067PyObject *
5068_PyEval_Vector(PyThreadState *tstate, PyFrameConstructor *con,
5069 PyObject *locals,
5070 PyObject* const* args, size_t argcount,
5071 PyObject *kwnames)
5072{
5073 PyFrameObject *f = _PyEval_MakeFrameVector(
5074 tstate, con, locals, args, argcount, kwnames);
5075 if (f == NULL) {
5076 return NULL;
5077 }
5078 if (((PyCodeObject *)con->fc_code)->co_flags & (CO_GENERATOR | CO_COROUTINE | CO_ASYNC_GENERATOR)) {
5079 return make_coro(con, f);
5080 }
5081 PyObject *retval = _PyEval_EvalFrame(tstate, f, 0);
5082
5083 /* decref'ing the frame can cause __del__ methods to get invoked,
5084 which can call back into Python. While we're done with the
5085 current Python frame (f), the associated C stack is still in use,
5086 so recursion_depth must be boosted for the duration.
5087 */
5088 if (Py_REFCNT(f) > 1) {
5089 Py_DECREF(f);
5090 _PyObject_GC_TRACK(f);
5091 }
5092 else {
5093 ++tstate->recursion_depth;
5094 Py_DECREF(f);
5095 --tstate->recursion_depth;
5096 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005097 return retval;
Tim Peters5ca576e2001-06-18 22:08:13 +00005098}
5099
Mark Shannond6c33fb2021-01-29 13:24:55 +00005100/* Legacy API */
Victor Stinnerb5e170f2019-11-16 01:03:22 +01005101PyObject *
Mark Shannon0332e562021-02-01 10:42:03 +00005102PyEval_EvalCodeEx(PyObject *_co, PyObject *globals, PyObject *locals,
5103 PyObject *const *args, int argcount,
5104 PyObject *const *kws, int kwcount,
5105 PyObject *const *defs, int defcount,
5106 PyObject *kwdefs, PyObject *closure)
Victor Stinnerb5e170f2019-11-16 01:03:22 +01005107{
Victor Stinner46496f92021-02-20 15:17:18 +01005108 PyThreadState *tstate = _PyThreadState_GET();
Mark Shannon0332e562021-02-01 10:42:03 +00005109 PyObject *res;
Mark Shannond6c33fb2021-01-29 13:24:55 +00005110 PyObject *defaults = _PyTuple_FromArray(defs, defcount);
5111 if (defaults == NULL) {
5112 return NULL;
5113 }
Victor Stinnerfc980e02021-03-18 14:51:24 +01005114 PyObject *builtins = _PyEval_BuiltinsFromGlobals(tstate, globals); // borrowed ref
Mark Shannond6c33fb2021-01-29 13:24:55 +00005115 if (builtins == NULL) {
5116 Py_DECREF(defaults);
5117 return NULL;
5118 }
Mark Shannon0332e562021-02-01 10:42:03 +00005119 if (locals == NULL) {
5120 locals = globals;
5121 }
5122 PyObject *kwnames;
5123 PyObject *const *allargs;
5124 PyObject **newargs;
5125 if (kwcount == 0) {
5126 allargs = args;
5127 kwnames = NULL;
5128 }
5129 else {
5130 kwnames = PyTuple_New(kwcount);
5131 if (kwnames == NULL) {
5132 res = NULL;
5133 goto fail;
5134 }
5135 newargs = PyMem_Malloc(sizeof(PyObject *)*(kwcount+argcount));
5136 if (newargs == NULL) {
5137 res = NULL;
5138 Py_DECREF(kwnames);
5139 goto fail;
5140 }
5141 for (int i = 0; i < argcount; i++) {
5142 newargs[i] = args[i];
5143 }
5144 for (int i = 0; i < kwcount; i++) {
5145 Py_INCREF(kws[2*i]);
5146 PyTuple_SET_ITEM(kwnames, i, kws[2*i]);
5147 newargs[argcount+i] = kws[2*i+1];
5148 }
5149 allargs = newargs;
5150 }
5151 PyObject **kwargs = PyMem_Malloc(sizeof(PyObject *)*kwcount);
5152 if (kwargs == NULL) {
5153 res = NULL;
5154 Py_DECREF(kwnames);
5155 goto fail;
5156 }
5157 for (int i = 0; i < kwcount; i++) {
5158 Py_INCREF(kws[2*i]);
5159 PyTuple_SET_ITEM(kwnames, i, kws[2*i]);
5160 kwargs[i] = kws[2*i+1];
5161 }
Mark Shannond6c33fb2021-01-29 13:24:55 +00005162 PyFrameConstructor constr = {
5163 .fc_globals = globals,
5164 .fc_builtins = builtins,
Mark Shannon0332e562021-02-01 10:42:03 +00005165 .fc_name = ((PyCodeObject *)_co)->co_name,
5166 .fc_qualname = ((PyCodeObject *)_co)->co_name,
Mark Shannond6c33fb2021-01-29 13:24:55 +00005167 .fc_code = _co,
5168 .fc_defaults = defaults,
5169 .fc_kwdefaults = kwdefs,
5170 .fc_closure = closure
5171 };
Mark Shannon0332e562021-02-01 10:42:03 +00005172 res = _PyEval_Vector(tstate, &constr, locals,
Victor Stinner44085a32021-02-18 19:20:16 +01005173 allargs, argcount,
5174 kwnames);
Mark Shannon0332e562021-02-01 10:42:03 +00005175 if (kwcount) {
5176 Py_DECREF(kwnames);
5177 PyMem_Free(newargs);
5178 }
5179fail:
Mark Shannond6c33fb2021-01-29 13:24:55 +00005180 Py_DECREF(defaults);
Mark Shannond6c33fb2021-01-29 13:24:55 +00005181 return res;
Victor Stinnerb5e170f2019-11-16 01:03:22 +01005182}
5183
Tim Peters5ca576e2001-06-18 22:08:13 +00005184
Benjamin Peterson876b2f22009-06-28 03:18:59 +00005185static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02005186special_lookup(PyThreadState *tstate, PyObject *o, _Py_Identifier *id)
Benjamin Peterson876b2f22009-06-28 03:18:59 +00005187{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005188 PyObject *res;
Benjamin Petersonce798522012-01-22 11:24:29 -05005189 res = _PyObject_LookupSpecial(o, id);
Victor Stinner438a12d2019-05-24 17:01:38 +02005190 if (res == NULL && !_PyErr_Occurred(tstate)) {
Victor Stinner4804b5b2020-05-12 01:43:38 +02005191 _PyErr_SetObject(tstate, PyExc_AttributeError, _PyUnicode_FromId(id));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005192 return NULL;
5193 }
5194 return res;
Benjamin Peterson876b2f22009-06-28 03:18:59 +00005195}
5196
5197
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00005198/* Logic for the raise statement (too complicated for inlining).
5199 This *consumes* a reference count to each of its arguments. */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04005200static int
Victor Stinner09532fe2019-05-10 23:39:09 +02005201do_raise(PyThreadState *tstate, PyObject *exc, PyObject *cause)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00005202{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005203 PyObject *type = NULL, *value = NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00005204
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005205 if (exc == NULL) {
5206 /* Reraise */
Mark Shannonae3087c2017-10-22 22:41:51 +01005207 _PyErr_StackItem *exc_info = _PyErr_GetTopmostException(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005208 PyObject *tb;
Mark Shannonae3087c2017-10-22 22:41:51 +01005209 type = exc_info->exc_type;
5210 value = exc_info->exc_value;
5211 tb = exc_info->exc_traceback;
Victor Stinner09bbebe2021-04-11 00:17:39 +02005212 if (Py_IsNone(type) || type == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005213 _PyErr_SetString(tstate, PyExc_RuntimeError,
5214 "No active exception to reraise");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04005215 return 0;
5216 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005217 Py_XINCREF(type);
5218 Py_XINCREF(value);
5219 Py_XINCREF(tb);
Victor Stinner438a12d2019-05-24 17:01:38 +02005220 _PyErr_Restore(tstate, type, value, tb);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04005221 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005222 }
Guido van Rossumac7be682001-01-17 15:42:30 +00005223
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005224 /* We support the following forms of raise:
5225 raise
Collin Winter828f04a2007-08-31 00:04:24 +00005226 raise <instance>
5227 raise <type> */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00005228
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005229 if (PyExceptionClass_Check(exc)) {
5230 type = exc;
Victor Stinnera5ed5f02016-12-06 18:45:50 +01005231 value = _PyObject_CallNoArg(exc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005232 if (value == NULL)
5233 goto raise_error;
Benjamin Peterson5afa03a2011-07-15 14:09:26 -05005234 if (!PyExceptionInstance_Check(value)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005235 _PyErr_Format(tstate, PyExc_TypeError,
5236 "calling %R should have returned an instance of "
5237 "BaseException, not %R",
5238 type, Py_TYPE(value));
5239 goto raise_error;
Benjamin Peterson5afa03a2011-07-15 14:09:26 -05005240 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005241 }
5242 else if (PyExceptionInstance_Check(exc)) {
5243 value = exc;
5244 type = PyExceptionInstance_Class(exc);
5245 Py_INCREF(type);
5246 }
5247 else {
5248 /* Not something you can raise. You get an exception
5249 anyway, just not what you specified :-) */
5250 Py_DECREF(exc);
Victor Stinner438a12d2019-05-24 17:01:38 +02005251 _PyErr_SetString(tstate, PyExc_TypeError,
5252 "exceptions must derive from BaseException");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005253 goto raise_error;
5254 }
Collin Winter828f04a2007-08-31 00:04:24 +00005255
Serhiy Storchakac0191582016-09-27 11:37:10 +03005256 assert(type != NULL);
5257 assert(value != NULL);
5258
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005259 if (cause) {
5260 PyObject *fixed_cause;
5261 if (PyExceptionClass_Check(cause)) {
Victor Stinnera5ed5f02016-12-06 18:45:50 +01005262 fixed_cause = _PyObject_CallNoArg(cause);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005263 if (fixed_cause == NULL)
5264 goto raise_error;
Benjamin Petersond5a1c442012-05-14 22:09:31 -07005265 Py_DECREF(cause);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005266 }
Benjamin Petersond5a1c442012-05-14 22:09:31 -07005267 else if (PyExceptionInstance_Check(cause)) {
5268 fixed_cause = cause;
5269 }
Victor Stinner09bbebe2021-04-11 00:17:39 +02005270 else if (Py_IsNone(cause)) {
Benjamin Petersond5a1c442012-05-14 22:09:31 -07005271 Py_DECREF(cause);
5272 fixed_cause = NULL;
5273 }
5274 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02005275 _PyErr_SetString(tstate, PyExc_TypeError,
5276 "exception causes must derive from "
5277 "BaseException");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005278 goto raise_error;
5279 }
Benjamin Petersond5a1c442012-05-14 22:09:31 -07005280 PyException_SetCause(value, fixed_cause);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005281 }
Collin Winter828f04a2007-08-31 00:04:24 +00005282
Victor Stinner438a12d2019-05-24 17:01:38 +02005283 _PyErr_SetObject(tstate, type, value);
Victor Stinner61f4db82020-01-28 03:37:45 +01005284 /* _PyErr_SetObject incref's its arguments */
Serhiy Storchakac0191582016-09-27 11:37:10 +03005285 Py_DECREF(value);
5286 Py_DECREF(type);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04005287 return 0;
Collin Winter828f04a2007-08-31 00:04:24 +00005288
5289raise_error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005290 Py_XDECREF(value);
5291 Py_XDECREF(type);
5292 Py_XDECREF(cause);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04005293 return 0;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00005294}
5295
Tim Petersd6d010b2001-06-21 02:49:55 +00005296/* Iterate v argcnt times and store the results on the stack (via decreasing
Guido van Rossum0368b722007-05-11 16:50:42 +00005297 sp). Return 1 for success, 0 if error.
Antoine Pitrou9a2310d2008-07-25 22:39:39 +00005298
Guido van Rossum0368b722007-05-11 16:50:42 +00005299 If argcntafter == -1, do a simple unpack. If it is >= 0, do an unpack
5300 with a variable target.
5301*/
Tim Petersd6d010b2001-06-21 02:49:55 +00005302
Barry Warsawe42b18f1997-08-25 22:13:04 +00005303static int
Victor Stinner438a12d2019-05-24 17:01:38 +02005304unpack_iterable(PyThreadState *tstate, PyObject *v,
5305 int argcnt, int argcntafter, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00005306{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005307 int i = 0, j = 0;
5308 Py_ssize_t ll = 0;
5309 PyObject *it; /* iter(v) */
5310 PyObject *w;
5311 PyObject *l = NULL; /* variable list */
Guido van Rossumac7be682001-01-17 15:42:30 +00005312
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005313 assert(v != NULL);
Tim Petersd6d010b2001-06-21 02:49:55 +00005314
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005315 it = PyObject_GetIter(v);
Serhiy Storchaka13a6c092017-12-26 12:30:41 +02005316 if (it == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005317 if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError) &&
Victor Stinnera102ed72020-02-07 02:24:48 +01005318 Py_TYPE(v)->tp_iter == NULL && !PySequence_Check(v))
Serhiy Storchaka13a6c092017-12-26 12:30:41 +02005319 {
Victor Stinner438a12d2019-05-24 17:01:38 +02005320 _PyErr_Format(tstate, PyExc_TypeError,
5321 "cannot unpack non-iterable %.200s object",
Victor Stinnera102ed72020-02-07 02:24:48 +01005322 Py_TYPE(v)->tp_name);
Serhiy Storchaka13a6c092017-12-26 12:30:41 +02005323 }
5324 return 0;
5325 }
Tim Petersd6d010b2001-06-21 02:49:55 +00005326
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005327 for (; i < argcnt; i++) {
5328 w = PyIter_Next(it);
5329 if (w == NULL) {
5330 /* Iterator done, via error or exhaustion. */
Victor Stinner438a12d2019-05-24 17:01:38 +02005331 if (!_PyErr_Occurred(tstate)) {
R David Murray4171bbe2015-04-15 17:08:45 -04005332 if (argcntafter == -1) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005333 _PyErr_Format(tstate, PyExc_ValueError,
5334 "not enough values to unpack "
5335 "(expected %d, got %d)",
5336 argcnt, i);
R David Murray4171bbe2015-04-15 17:08:45 -04005337 }
5338 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02005339 _PyErr_Format(tstate, PyExc_ValueError,
5340 "not enough values to unpack "
5341 "(expected at least %d, got %d)",
5342 argcnt + argcntafter, i);
R David Murray4171bbe2015-04-15 17:08:45 -04005343 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005344 }
5345 goto Error;
5346 }
5347 *--sp = w;
5348 }
Tim Petersd6d010b2001-06-21 02:49:55 +00005349
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005350 if (argcntafter == -1) {
5351 /* We better have exhausted the iterator now. */
5352 w = PyIter_Next(it);
5353 if (w == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005354 if (_PyErr_Occurred(tstate))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005355 goto Error;
5356 Py_DECREF(it);
5357 return 1;
5358 }
5359 Py_DECREF(w);
Victor Stinner438a12d2019-05-24 17:01:38 +02005360 _PyErr_Format(tstate, PyExc_ValueError,
5361 "too many values to unpack (expected %d)",
5362 argcnt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005363 goto Error;
5364 }
Guido van Rossum0368b722007-05-11 16:50:42 +00005365
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005366 l = PySequence_List(it);
5367 if (l == NULL)
5368 goto Error;
5369 *--sp = l;
5370 i++;
Guido van Rossum0368b722007-05-11 16:50:42 +00005371
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005372 ll = PyList_GET_SIZE(l);
5373 if (ll < argcntafter) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005374 _PyErr_Format(tstate, PyExc_ValueError,
R David Murray4171bbe2015-04-15 17:08:45 -04005375 "not enough values to unpack (expected at least %d, got %zd)",
5376 argcnt + argcntafter, argcnt + ll);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005377 goto Error;
5378 }
Guido van Rossum0368b722007-05-11 16:50:42 +00005379
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005380 /* Pop the "after-variable" args off the list. */
5381 for (j = argcntafter; j > 0; j--, i++) {
5382 *--sp = PyList_GET_ITEM(l, ll - j);
5383 }
5384 /* Resize the list. */
Victor Stinner60ac6ed2020-02-07 23:18:08 +01005385 Py_SET_SIZE(l, ll - argcntafter);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005386 Py_DECREF(it);
5387 return 1;
Guido van Rossum0368b722007-05-11 16:50:42 +00005388
Tim Petersd6d010b2001-06-21 02:49:55 +00005389Error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005390 for (; i > 0; i--, sp++)
5391 Py_DECREF(*sp);
5392 Py_XDECREF(it);
5393 return 0;
Barry Warsawe42b18f1997-08-25 22:13:04 +00005394}
5395
Guido van Rossum96a42c81992-01-12 02:29:51 +00005396#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00005397static int
Victor Stinner438a12d2019-05-24 17:01:38 +02005398prtrace(PyThreadState *tstate, PyObject *v, const char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005399{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005400 printf("%s ", str);
Miss Islington (bot)4a0f1df2021-07-13 01:43:26 -07005401 PyObject *type, *value, *traceback;
5402 PyErr_Fetch(&type, &value, &traceback);
Victor Stinner438a12d2019-05-24 17:01:38 +02005403 if (PyObject_Print(v, stdout, 0) != 0) {
5404 /* Don't know what else to do */
5405 _PyErr_Clear(tstate);
5406 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005407 printf("\n");
Miss Islington (bot)4a0f1df2021-07-13 01:43:26 -07005408 PyErr_Restore(type, value, traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005409 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005410}
Guido van Rossum3f5da241990-12-20 15:06:42 +00005411#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005412
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00005413static void
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005414call_exc_trace(Py_tracefunc func, PyObject *self,
Mark Shannon86433452021-01-07 16:49:02 +00005415 PyThreadState *tstate,
5416 PyFrameObject *f,
Mark Shannon8e1b4062021-03-05 14:45:50 +00005417 PyTraceInfo *trace_info)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00005418{
Victor Stinneraaa8ed82013-07-10 13:57:55 +02005419 PyObject *type, *value, *traceback, *orig_traceback, *arg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005420 int err;
Victor Stinner438a12d2019-05-24 17:01:38 +02005421 _PyErr_Fetch(tstate, &type, &value, &orig_traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005422 if (value == NULL) {
5423 value = Py_None;
5424 Py_INCREF(value);
5425 }
Victor Stinner438a12d2019-05-24 17:01:38 +02005426 _PyErr_NormalizeException(tstate, &type, &value, &orig_traceback);
Antoine Pitrou89335212013-11-23 14:05:23 +01005427 traceback = (orig_traceback != NULL) ? orig_traceback : Py_None;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005428 arg = PyTuple_Pack(3, type, value, traceback);
5429 if (arg == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005430 _PyErr_Restore(tstate, type, value, orig_traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005431 return;
5432 }
Mark Shannon8e1b4062021-03-05 14:45:50 +00005433 err = call_trace(func, self, tstate, f, trace_info, PyTrace_EXCEPTION, arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005434 Py_DECREF(arg);
Victor Stinner438a12d2019-05-24 17:01:38 +02005435 if (err == 0) {
5436 _PyErr_Restore(tstate, type, value, orig_traceback);
5437 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005438 else {
5439 Py_XDECREF(type);
5440 Py_XDECREF(value);
Victor Stinneraaa8ed82013-07-10 13:57:55 +02005441 Py_XDECREF(orig_traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005442 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00005443}
5444
Amaury Forgeot d'Arcf05149a2007-11-13 01:05:30 +00005445static int
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005446call_trace_protected(Py_tracefunc func, PyObject *obj,
5447 PyThreadState *tstate, PyFrameObject *frame,
Mark Shannon8e1b4062021-03-05 14:45:50 +00005448 PyTraceInfo *trace_info,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005449 int what, PyObject *arg)
Fred Drake4ec5d562001-10-04 19:26:43 +00005450{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005451 PyObject *type, *value, *traceback;
5452 int err;
Victor Stinner438a12d2019-05-24 17:01:38 +02005453 _PyErr_Fetch(tstate, &type, &value, &traceback);
Mark Shannon8e1b4062021-03-05 14:45:50 +00005454 err = call_trace(func, obj, tstate, frame, trace_info, what, arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005455 if (err == 0)
5456 {
Victor Stinner438a12d2019-05-24 17:01:38 +02005457 _PyErr_Restore(tstate, type, value, traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005458 return 0;
5459 }
5460 else {
5461 Py_XDECREF(type);
5462 Py_XDECREF(value);
5463 Py_XDECREF(traceback);
5464 return -1;
5465 }
Fred Drake4ec5d562001-10-04 19:26:43 +00005466}
5467
Mark Shannon8e1b4062021-03-05 14:45:50 +00005468static void
5469initialize_trace_info(PyTraceInfo *trace_info, PyFrameObject *frame)
5470{
5471 if (trace_info->code != frame->f_code) {
5472 trace_info->code = frame->f_code;
Mark Shannon8e1b4062021-03-05 14:45:50 +00005473 _PyCode_InitAddressRange(frame->f_code, &trace_info->bounds);
5474 }
5475}
5476
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00005477static int
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005478call_trace(Py_tracefunc func, PyObject *obj,
5479 PyThreadState *tstate, PyFrameObject *frame,
Mark Shannon8e1b4062021-03-05 14:45:50 +00005480 PyTraceInfo *trace_info,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005481 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00005482{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005483 int result;
5484 if (tstate->tracing)
5485 return 0;
5486 tstate->tracing++;
Mark Shannon9e7b2072021-04-13 11:08:14 +01005487 tstate->cframe->use_tracing = 0;
Mark Shannon86433452021-01-07 16:49:02 +00005488 if (frame->f_lasti < 0) {
5489 frame->f_lineno = frame->f_code->co_firstlineno;
5490 }
5491 else {
Mark Shannon8e1b4062021-03-05 14:45:50 +00005492 initialize_trace_info(trace_info, frame);
Mark Shannonfcb55c02021-04-01 16:00:31 +01005493 frame->f_lineno = _PyCode_CheckLineNumber(frame->f_lasti*2, &trace_info->bounds);
Mark Shannon86433452021-01-07 16:49:02 +00005494 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005495 result = func(obj, frame, what, arg);
Mark Shannon86433452021-01-07 16:49:02 +00005496 frame->f_lineno = 0;
Mark Shannon9e7b2072021-04-13 11:08:14 +01005497 tstate->cframe->use_tracing = ((tstate->c_tracefunc != NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005498 || (tstate->c_profilefunc != NULL));
5499 tstate->tracing--;
5500 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00005501}
5502
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00005503PyObject *
5504_PyEval_CallTracing(PyObject *func, PyObject *args)
5505{
Victor Stinner50b48572018-11-01 01:51:40 +01005506 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005507 int save_tracing = tstate->tracing;
Mark Shannon9e7b2072021-04-13 11:08:14 +01005508 int save_use_tracing = tstate->cframe->use_tracing;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005509 PyObject *result;
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00005510
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005511 tstate->tracing = 0;
Mark Shannon9e7b2072021-04-13 11:08:14 +01005512 tstate->cframe->use_tracing = ((tstate->c_tracefunc != NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005513 || (tstate->c_profilefunc != NULL));
5514 result = PyObject_Call(func, args, NULL);
5515 tstate->tracing = save_tracing;
Mark Shannon9e7b2072021-04-13 11:08:14 +01005516 tstate->cframe->use_tracing = save_use_tracing;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005517 return result;
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00005518}
5519
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00005520/* See Objects/lnotab_notes.txt for a description of how tracing works. */
Michael W. Hudson006c7522002-11-08 13:08:46 +00005521static int
Tim Peters8a5c3c72004-04-05 19:36:21 +00005522maybe_call_line_trace(Py_tracefunc func, PyObject *obj,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005523 PyThreadState *tstate, PyFrameObject *frame,
Mark Shannon9f2c63b2021-07-08 19:21:22 +01005524 PyTraceInfo *trace_info, int instr_prev)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00005525{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005526 int result = 0;
Michael W. Hudson006c7522002-11-08 13:08:46 +00005527
Nick Coghlan5a851672017-09-08 10:14:16 +10005528 /* If the last instruction falls at the start of a line or if it
5529 represents a jump backwards, update the frame's line number and
5530 then call the trace function if we're tracing source lines.
5531 */
Mark Shannon8e1b4062021-03-05 14:45:50 +00005532 initialize_trace_info(trace_info, frame);
Mark Shannon9f2c63b2021-07-08 19:21:22 +01005533 int lastline = _PyCode_CheckLineNumber(instr_prev*2, &trace_info->bounds);
Mark Shannonfcb55c02021-04-01 16:00:31 +01005534 int line = _PyCode_CheckLineNumber(frame->f_lasti*2, &trace_info->bounds);
Mark Shannonee9f98d2021-01-05 12:04:10 +00005535 if (line != -1 && frame->f_trace_lines) {
Mark Shannon9f2c63b2021-07-08 19:21:22 +01005536 /* Trace backward edges or if line number has changed */
5537 if (frame->f_lasti < instr_prev || line != lastline) {
Mark Shannon8e1b4062021-03-05 14:45:50 +00005538 result = call_trace(func, obj, tstate, frame, trace_info, PyTrace_LINE, Py_None);
Nick Coghlan5a851672017-09-08 10:14:16 +10005539 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005540 }
George King20faa682017-10-18 17:44:22 -07005541 /* Always emit an opcode event if we're tracing all opcodes. */
5542 if (frame->f_trace_opcodes) {
Mark Shannon8e1b4062021-03-05 14:45:50 +00005543 result = call_trace(func, obj, tstate, frame, trace_info, PyTrace_OPCODE, Py_None);
George King20faa682017-10-18 17:44:22 -07005544 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005545 return result;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00005546}
5547
Victor Stinner309d7cc2020-03-13 16:39:12 +01005548int
5549_PyEval_SetProfile(PyThreadState *tstate, Py_tracefunc func, PyObject *arg)
5550{
Victor Stinnerda2914d2020-03-20 09:29:08 +01005551 assert(is_tstate_valid(tstate));
Victor Stinner309d7cc2020-03-13 16:39:12 +01005552 /* The caller must hold the GIL */
5553 assert(PyGILState_Check());
5554
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005555 /* Call _PySys_Audit() in the context of the current thread state,
Victor Stinner309d7cc2020-03-13 16:39:12 +01005556 even if tstate is not the current thread state. */
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005557 PyThreadState *current_tstate = _PyThreadState_GET();
5558 if (_PySys_Audit(current_tstate, "sys.setprofile", NULL) < 0) {
Victor Stinner309d7cc2020-03-13 16:39:12 +01005559 return -1;
5560 }
5561
5562 PyObject *profileobj = tstate->c_profileobj;
5563
5564 tstate->c_profilefunc = NULL;
5565 tstate->c_profileobj = NULL;
5566 /* Must make sure that tracing is not ignored if 'profileobj' is freed */
Mark Shannon9e7b2072021-04-13 11:08:14 +01005567 tstate->cframe->use_tracing = tstate->c_tracefunc != NULL;
Victor Stinner309d7cc2020-03-13 16:39:12 +01005568 Py_XDECREF(profileobj);
5569
5570 Py_XINCREF(arg);
5571 tstate->c_profileobj = arg;
5572 tstate->c_profilefunc = func;
5573
5574 /* Flag that tracing or profiling is turned on */
Mark Shannon9e7b2072021-04-13 11:08:14 +01005575 tstate->cframe->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
Victor Stinner309d7cc2020-03-13 16:39:12 +01005576 return 0;
5577}
5578
Fred Drake5755ce62001-06-27 19:19:46 +00005579void
5580PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00005581{
Victor Stinner309d7cc2020-03-13 16:39:12 +01005582 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerf6a58502020-03-16 17:41:44 +01005583 if (_PyEval_SetProfile(tstate, func, arg) < 0) {
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005584 /* Log _PySys_Audit() error */
Victor Stinnerf6a58502020-03-16 17:41:44 +01005585 _PyErr_WriteUnraisableMsg("in PyEval_SetProfile", NULL);
5586 }
Victor Stinner309d7cc2020-03-13 16:39:12 +01005587}
5588
5589int
5590_PyEval_SetTrace(PyThreadState *tstate, Py_tracefunc func, PyObject *arg)
5591{
Victor Stinnerda2914d2020-03-20 09:29:08 +01005592 assert(is_tstate_valid(tstate));
Victor Stinner309d7cc2020-03-13 16:39:12 +01005593 /* The caller must hold the GIL */
5594 assert(PyGILState_Check());
5595
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005596 /* Call _PySys_Audit() in the context of the current thread state,
Victor Stinner309d7cc2020-03-13 16:39:12 +01005597 even if tstate is not the current thread state. */
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005598 PyThreadState *current_tstate = _PyThreadState_GET();
5599 if (_PySys_Audit(current_tstate, "sys.settrace", NULL) < 0) {
Victor Stinner309d7cc2020-03-13 16:39:12 +01005600 return -1;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005601 }
5602
Victor Stinner309d7cc2020-03-13 16:39:12 +01005603 PyObject *traceobj = tstate->c_traceobj;
Victor Stinner309d7cc2020-03-13 16:39:12 +01005604
5605 tstate->c_tracefunc = NULL;
5606 tstate->c_traceobj = NULL;
5607 /* Must make sure that profiling is not ignored if 'traceobj' is freed */
Mark Shannon9e7b2072021-04-13 11:08:14 +01005608 tstate->cframe->use_tracing = (tstate->c_profilefunc != NULL);
Victor Stinner309d7cc2020-03-13 16:39:12 +01005609 Py_XDECREF(traceobj);
5610
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005611 Py_XINCREF(arg);
Victor Stinner309d7cc2020-03-13 16:39:12 +01005612 tstate->c_traceobj = arg;
5613 tstate->c_tracefunc = func;
5614
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005615 /* Flag that tracing or profiling is turned on */
Mark Shannon9e7b2072021-04-13 11:08:14 +01005616 tstate->cframe->use_tracing = ((func != NULL)
Victor Stinner309d7cc2020-03-13 16:39:12 +01005617 || (tstate->c_profilefunc != NULL));
5618
5619 return 0;
Fred Drake5755ce62001-06-27 19:19:46 +00005620}
5621
5622void
5623PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
5624{
Victor Stinner309d7cc2020-03-13 16:39:12 +01005625 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerf6a58502020-03-16 17:41:44 +01005626 if (_PyEval_SetTrace(tstate, func, arg) < 0) {
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005627 /* Log _PySys_Audit() error */
Victor Stinnerf6a58502020-03-16 17:41:44 +01005628 _PyErr_WriteUnraisableMsg("in PyEval_SetTrace", NULL);
5629 }
Fred Draked0838392001-06-16 21:02:31 +00005630}
5631
Victor Stinner309d7cc2020-03-13 16:39:12 +01005632
Yury Selivanov75445082015-05-11 22:57:16 -04005633void
Victor Stinner838f2642019-06-13 22:41:23 +02005634_PyEval_SetCoroutineOriginTrackingDepth(PyThreadState *tstate, int new_depth)
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08005635{
5636 assert(new_depth >= 0);
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08005637 tstate->coroutine_origin_tracking_depth = new_depth;
5638}
5639
5640int
5641_PyEval_GetCoroutineOriginTrackingDepth(void)
5642{
Victor Stinner50b48572018-11-01 01:51:40 +01005643 PyThreadState *tstate = _PyThreadState_GET();
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08005644 return tstate->coroutine_origin_tracking_depth;
5645}
5646
Zackery Spytz79ceccd2020-03-26 06:11:13 -06005647int
Yury Selivanoveb636452016-09-08 22:01:51 -07005648_PyEval_SetAsyncGenFirstiter(PyObject *firstiter)
5649{
Victor Stinner50b48572018-11-01 01:51:40 +01005650 PyThreadState *tstate = _PyThreadState_GET();
Steve Dowerb82e17e2019-05-23 08:45:22 -07005651
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005652 if (_PySys_Audit(tstate, "sys.set_asyncgen_hook_firstiter", NULL) < 0) {
Zackery Spytz79ceccd2020-03-26 06:11:13 -06005653 return -1;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005654 }
5655
Yury Selivanoveb636452016-09-08 22:01:51 -07005656 Py_XINCREF(firstiter);
5657 Py_XSETREF(tstate->async_gen_firstiter, firstiter);
Zackery Spytz79ceccd2020-03-26 06:11:13 -06005658 return 0;
Yury Selivanoveb636452016-09-08 22:01:51 -07005659}
5660
5661PyObject *
5662_PyEval_GetAsyncGenFirstiter(void)
5663{
Victor Stinner50b48572018-11-01 01:51:40 +01005664 PyThreadState *tstate = _PyThreadState_GET();
Yury Selivanoveb636452016-09-08 22:01:51 -07005665 return tstate->async_gen_firstiter;
5666}
5667
Zackery Spytz79ceccd2020-03-26 06:11:13 -06005668int
Yury Selivanoveb636452016-09-08 22:01:51 -07005669_PyEval_SetAsyncGenFinalizer(PyObject *finalizer)
5670{
Victor Stinner50b48572018-11-01 01:51:40 +01005671 PyThreadState *tstate = _PyThreadState_GET();
Steve Dowerb82e17e2019-05-23 08:45:22 -07005672
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005673 if (_PySys_Audit(tstate, "sys.set_asyncgen_hook_finalizer", NULL) < 0) {
Zackery Spytz79ceccd2020-03-26 06:11:13 -06005674 return -1;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005675 }
5676
Yury Selivanoveb636452016-09-08 22:01:51 -07005677 Py_XINCREF(finalizer);
5678 Py_XSETREF(tstate->async_gen_finalizer, finalizer);
Zackery Spytz79ceccd2020-03-26 06:11:13 -06005679 return 0;
Yury Selivanoveb636452016-09-08 22:01:51 -07005680}
5681
5682PyObject *
5683_PyEval_GetAsyncGenFinalizer(void)
5684{
Victor Stinner50b48572018-11-01 01:51:40 +01005685 PyThreadState *tstate = _PyThreadState_GET();
Yury Selivanoveb636452016-09-08 22:01:51 -07005686 return tstate->async_gen_finalizer;
5687}
5688
Victor Stinner438a12d2019-05-24 17:01:38 +02005689PyFrameObject *
5690PyEval_GetFrame(void)
5691{
5692 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner6723e932020-03-20 17:46:56 +01005693 return tstate->frame;
Victor Stinner438a12d2019-05-24 17:01:38 +02005694}
5695
Guido van Rossumb209a111997-04-29 18:18:01 +00005696PyObject *
Victor Stinner46496f92021-02-20 15:17:18 +01005697_PyEval_GetBuiltins(PyThreadState *tstate)
5698{
5699 PyFrameObject *frame = tstate->frame;
5700 if (frame != NULL) {
5701 return frame->f_builtins;
5702 }
5703 return tstate->interp->builtins;
5704}
5705
5706PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005707PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00005708{
Victor Stinner438a12d2019-05-24 17:01:38 +02005709 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner46496f92021-02-20 15:17:18 +01005710 return _PyEval_GetBuiltins(tstate);
Guido van Rossum6135a871995-01-09 17:53:26 +00005711}
5712
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02005713/* Convenience function to get a builtin from its name */
5714PyObject *
5715_PyEval_GetBuiltinId(_Py_Identifier *name)
5716{
Victor Stinner438a12d2019-05-24 17:01:38 +02005717 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02005718 PyObject *attr = _PyDict_GetItemIdWithError(PyEval_GetBuiltins(), name);
5719 if (attr) {
5720 Py_INCREF(attr);
5721 }
Victor Stinner438a12d2019-05-24 17:01:38 +02005722 else if (!_PyErr_Occurred(tstate)) {
5723 _PyErr_SetObject(tstate, PyExc_AttributeError, _PyUnicode_FromId(name));
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02005724 }
5725 return attr;
5726}
5727
Guido van Rossumb209a111997-04-29 18:18:01 +00005728PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005729PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00005730{
Victor Stinner438a12d2019-05-24 17:01:38 +02005731 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner6723e932020-03-20 17:46:56 +01005732 PyFrameObject *current_frame = tstate->frame;
Victor Stinner41bb43a2013-10-29 01:19:37 +01005733 if (current_frame == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005734 _PyErr_SetString(tstate, PyExc_SystemError, "frame does not exist");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005735 return NULL;
Victor Stinner41bb43a2013-10-29 01:19:37 +01005736 }
5737
Victor Stinner438a12d2019-05-24 17:01:38 +02005738 if (PyFrame_FastToLocalsWithError(current_frame) < 0) {
Victor Stinner41bb43a2013-10-29 01:19:37 +01005739 return NULL;
Victor Stinner438a12d2019-05-24 17:01:38 +02005740 }
Victor Stinner41bb43a2013-10-29 01:19:37 +01005741
5742 assert(current_frame->f_locals != NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005743 return current_frame->f_locals;
Guido van Rossum5b722181993-03-30 17:46:03 +00005744}
5745
Guido van Rossumb209a111997-04-29 18:18:01 +00005746PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005747PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00005748{
Victor Stinner438a12d2019-05-24 17:01:38 +02005749 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner6723e932020-03-20 17:46:56 +01005750 PyFrameObject *current_frame = tstate->frame;
Victor Stinner438a12d2019-05-24 17:01:38 +02005751 if (current_frame == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005752 return NULL;
Victor Stinner438a12d2019-05-24 17:01:38 +02005753 }
Victor Stinner41bb43a2013-10-29 01:19:37 +01005754
5755 assert(current_frame->f_globals != NULL);
5756 return current_frame->f_globals;
Guido van Rossum3f5da241990-12-20 15:06:42 +00005757}
5758
Guido van Rossum6135a871995-01-09 17:53:26 +00005759int
Tim Peters5ba58662001-07-16 02:29:45 +00005760PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
Jeremy Hylton061d1062001-03-22 02:32:48 +00005761{
Victor Stinner438a12d2019-05-24 17:01:38 +02005762 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner6723e932020-03-20 17:46:56 +01005763 PyFrameObject *current_frame = tstate->frame;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005764 int result = cf->cf_flags != 0;
Tim Peters5ba58662001-07-16 02:29:45 +00005765
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005766 if (current_frame != NULL) {
5767 const int codeflags = current_frame->f_code->co_flags;
5768 const int compilerflags = codeflags & PyCF_MASK;
5769 if (compilerflags) {
5770 result = 1;
5771 cf->cf_flags |= compilerflags;
5772 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00005773#if 0 /* future keyword */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005774 if (codeflags & CO_GENERATOR_ALLOWED) {
5775 result = 1;
5776 cf->cf_flags |= CO_GENERATOR_ALLOWED;
5777 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00005778#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005779 }
5780 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00005781}
5782
Guido van Rossum3f5da241990-12-20 15:06:42 +00005783
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00005784const char *
Tim Peters6d6c1a32001-08-02 04:15:00 +00005785PyEval_GetFuncName(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00005786{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005787 if (PyMethod_Check(func))
5788 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
5789 else if (PyFunction_Check(func))
Serhiy Storchaka06515832016-11-20 09:13:07 +02005790 return PyUnicode_AsUTF8(((PyFunctionObject*)func)->func_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005791 else if (PyCFunction_Check(func))
5792 return ((PyCFunctionObject*)func)->m_ml->ml_name;
5793 else
Victor Stinnera102ed72020-02-07 02:24:48 +01005794 return Py_TYPE(func)->tp_name;
Jeremy Hylton512a2372001-04-11 13:52:29 +00005795}
5796
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00005797const char *
Tim Peters6d6c1a32001-08-02 04:15:00 +00005798PyEval_GetFuncDesc(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00005799{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005800 if (PyMethod_Check(func))
5801 return "()";
5802 else if (PyFunction_Check(func))
5803 return "()";
5804 else if (PyCFunction_Check(func))
5805 return "()";
5806 else
5807 return " object";
Jeremy Hylton512a2372001-04-11 13:52:29 +00005808}
5809
Armin Rigo1c2d7e52005-09-20 18:34:01 +00005810#define C_TRACE(x, call) \
Mark Shannon9e7b2072021-04-13 11:08:14 +01005811if (trace_info->cframe.use_tracing && tstate->c_profilefunc) { \
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005812 if (call_trace(tstate->c_profilefunc, tstate->c_profileobj, \
Mark Shannon8e1b4062021-03-05 14:45:50 +00005813 tstate, tstate->frame, trace_info, \
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005814 PyTrace_C_CALL, func)) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005815 x = NULL; \
5816 } \
5817 else { \
5818 x = call; \
5819 if (tstate->c_profilefunc != NULL) { \
5820 if (x == NULL) { \
5821 call_trace_protected(tstate->c_profilefunc, \
5822 tstate->c_profileobj, \
Mark Shannon8e1b4062021-03-05 14:45:50 +00005823 tstate, tstate->frame, trace_info, \
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005824 PyTrace_C_EXCEPTION, func); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005825 /* XXX should pass (type, value, tb) */ \
5826 } else { \
5827 if (call_trace(tstate->c_profilefunc, \
5828 tstate->c_profileobj, \
Mark Shannon8e1b4062021-03-05 14:45:50 +00005829 tstate, tstate->frame, trace_info, \
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005830 PyTrace_C_RETURN, func)) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005831 Py_DECREF(x); \
5832 x = NULL; \
5833 } \
5834 } \
5835 } \
5836 } \
Nicholas Bastind858a772004-06-25 23:31:06 +00005837} else { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005838 x = call; \
5839 }
Nicholas Bastinc69ebe82004-03-24 21:57:10 +00005840
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005841
5842static PyObject *
5843trace_call_function(PyThreadState *tstate,
Mark Shannon8e1b4062021-03-05 14:45:50 +00005844 PyTraceInfo *trace_info,
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005845 PyObject *func,
5846 PyObject **args, Py_ssize_t nargs,
5847 PyObject *kwnames)
5848{
5849 PyObject *x;
scoder4c9ea092020-05-12 16:12:41 +02005850 if (PyCFunction_CheckExact(func) || PyCMethod_CheckExact(func)) {
Petr Viktorinffd97532020-02-11 17:46:57 +01005851 C_TRACE(x, PyObject_Vectorcall(func, args, nargs, kwnames));
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005852 return x;
5853 }
Andy Lesterdffe4c02020-03-04 07:15:20 -06005854 else if (Py_IS_TYPE(func, &PyMethodDescr_Type) && nargs > 0) {
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005855 /* We need to create a temporary bound method as argument
5856 for profiling.
5857
5858 If nargs == 0, then this cannot work because we have no
5859 "self". In any case, the call itself would raise
5860 TypeError (foo needs an argument), so we just skip
5861 profiling. */
5862 PyObject *self = args[0];
5863 func = Py_TYPE(func)->tp_descr_get(func, self, (PyObject*)Py_TYPE(self));
5864 if (func == NULL) {
5865 return NULL;
5866 }
Petr Viktorinffd97532020-02-11 17:46:57 +01005867 C_TRACE(x, PyObject_Vectorcall(func,
Jeroen Demeyer0d722f32019-07-05 14:48:24 +02005868 args+1, nargs-1,
5869 kwnames));
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005870 Py_DECREF(func);
5871 return x;
5872 }
Petr Viktorinffd97532020-02-11 17:46:57 +01005873 return PyObject_Vectorcall(func, args, nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames);
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005874}
5875
Victor Stinner415c5102017-01-11 00:54:57 +01005876/* Issue #29227: Inline call_function() into _PyEval_EvalFrameDefault()
5877 to reduce the stack consumption. */
5878Py_LOCAL_INLINE(PyObject *) _Py_HOT_FUNCTION
Mark Shannon86433452021-01-07 16:49:02 +00005879call_function(PyThreadState *tstate,
Mark Shannon8e1b4062021-03-05 14:45:50 +00005880 PyTraceInfo *trace_info,
Mark Shannon86433452021-01-07 16:49:02 +00005881 PyObject ***pp_stack,
5882 Py_ssize_t oparg,
5883 PyObject *kwnames)
Jeremy Hyltone8c04322002-08-16 17:47:26 +00005884{
Victor Stinnerf9b760f2016-09-09 10:17:08 -07005885 PyObject **pfunc = (*pp_stack) - oparg - 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005886 PyObject *func = *pfunc;
5887 PyObject *x, *w;
Victor Stinnerd8735722016-09-09 12:36:44 -07005888 Py_ssize_t nkwargs = (kwnames == NULL) ? 0 : PyTuple_GET_SIZE(kwnames);
5889 Py_ssize_t nargs = oparg - nkwargs;
INADA Naoki5566bbb2017-02-03 07:43:03 +09005890 PyObject **stack = (*pp_stack) - nargs - nkwargs;
Jeremy Hyltone8c04322002-08-16 17:47:26 +00005891
Mark Shannon9e7b2072021-04-13 11:08:14 +01005892 if (trace_info->cframe.use_tracing) {
Mark Shannon8e1b4062021-03-05 14:45:50 +00005893 x = trace_call_function(tstate, trace_info, func, stack, nargs, kwnames);
INADA Naoki5566bbb2017-02-03 07:43:03 +09005894 }
Victor Stinner4a7cc882015-03-06 23:35:27 +01005895 else {
Petr Viktorinffd97532020-02-11 17:46:57 +01005896 x = PyObject_Vectorcall(func, stack, nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005897 }
Tim Peters8a5c3c72004-04-05 19:36:21 +00005898
Victor Stinner438a12d2019-05-24 17:01:38 +02005899 assert((x != NULL) ^ (_PyErr_Occurred(tstate) != NULL));
Victor Stinnerf9b760f2016-09-09 10:17:08 -07005900
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01005901 /* Clear the stack of the function object. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005902 while ((*pp_stack) > pfunc) {
5903 w = EXT_POP(*pp_stack);
5904 Py_DECREF(w);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005905 }
Victor Stinnerace47d72013-07-18 01:41:08 +02005906
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005907 return x;
Jeremy Hyltone8c04322002-08-16 17:47:26 +00005908}
5909
Jeremy Hylton52820442001-01-03 23:52:36 +00005910static PyObject *
Mark Shannon86433452021-01-07 16:49:02 +00005911do_call_core(PyThreadState *tstate,
Mark Shannon8e1b4062021-03-05 14:45:50 +00005912 PyTraceInfo *trace_info,
Mark Shannon86433452021-01-07 16:49:02 +00005913 PyObject *func,
5914 PyObject *callargs,
5915 PyObject *kwdict)
Jeremy Hylton52820442001-01-03 23:52:36 +00005916{
jdemeyere89de732018-09-19 12:06:20 +02005917 PyObject *result;
5918
scoder4c9ea092020-05-12 16:12:41 +02005919 if (PyCFunction_CheckExact(func) || PyCMethod_CheckExact(func)) {
Jeroen Demeyer7a6873c2019-09-11 13:01:01 +02005920 C_TRACE(result, PyObject_Call(func, callargs, kwdict));
Victor Stinnerf9b760f2016-09-09 10:17:08 -07005921 return result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005922 }
Andy Lesterdffe4c02020-03-04 07:15:20 -06005923 else if (Py_IS_TYPE(func, &PyMethodDescr_Type)) {
jdemeyere89de732018-09-19 12:06:20 +02005924 Py_ssize_t nargs = PyTuple_GET_SIZE(callargs);
Mark Shannon9e7b2072021-04-13 11:08:14 +01005925 if (nargs > 0 && trace_info->cframe.use_tracing) {
jdemeyere89de732018-09-19 12:06:20 +02005926 /* We need to create a temporary bound method as argument
5927 for profiling.
5928
5929 If nargs == 0, then this cannot work because we have no
5930 "self". In any case, the call itself would raise
5931 TypeError (foo needs an argument), so we just skip
5932 profiling. */
5933 PyObject *self = PyTuple_GET_ITEM(callargs, 0);
5934 func = Py_TYPE(func)->tp_descr_get(func, self, (PyObject*)Py_TYPE(self));
5935 if (func == NULL) {
5936 return NULL;
5937 }
5938
Victor Stinner4d231bc2019-11-14 13:36:21 +01005939 C_TRACE(result, _PyObject_FastCallDictTstate(
5940 tstate, func,
5941 &_PyTuple_ITEMS(callargs)[1],
5942 nargs - 1,
5943 kwdict));
jdemeyere89de732018-09-19 12:06:20 +02005944 Py_DECREF(func);
5945 return result;
5946 }
Victor Stinner74319ae2016-08-25 00:04:09 +02005947 }
jdemeyere89de732018-09-19 12:06:20 +02005948 return PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00005949}
5950
Serhiy Storchaka483405b2015-02-17 10:14:30 +02005951/* Extract a slice index from a PyLong or an object with the
Guido van Rossum38fff8c2006-03-07 18:50:55 +00005952 nb_index slot defined, and store in *pi.
5953 Silently reduce values larger than PY_SSIZE_T_MAX to PY_SSIZE_T_MAX,
Xiang Zhang2ddf5a12017-05-10 18:19:41 +08005954 and silently boost values less than PY_SSIZE_T_MIN to PY_SSIZE_T_MIN.
Martin v. Löwisdde99d22006-02-17 15:57:41 +00005955 Return 0 on error, 1 on success.
Tim Peterscb479e72001-12-16 19:11:44 +00005956*/
Guido van Rossum20c6add2000-05-08 14:06:50 +00005957int
Martin v. Löwis18e16552006-02-15 17:27:45 +00005958_PyEval_SliceIndex(PyObject *v, Py_ssize_t *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005959{
Victor Stinner438a12d2019-05-24 17:01:38 +02005960 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner09bbebe2021-04-11 00:17:39 +02005961 if (!Py_IsNone(v)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005962 Py_ssize_t x;
Victor Stinnera15e2602020-04-08 02:01:56 +02005963 if (_PyIndex_Check(v)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005964 x = PyNumber_AsSsize_t(v, NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02005965 if (x == -1 && _PyErr_Occurred(tstate))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005966 return 0;
5967 }
5968 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02005969 _PyErr_SetString(tstate, PyExc_TypeError,
5970 "slice indices must be integers or "
5971 "None or have an __index__ method");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005972 return 0;
5973 }
5974 *pi = x;
5975 }
5976 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005977}
5978
Serhiy Storchaka80ec8362017-03-19 19:37:40 +02005979int
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005980_PyEval_SliceIndexNotNone(PyObject *v, Py_ssize_t *pi)
Serhiy Storchaka80ec8362017-03-19 19:37:40 +02005981{
Victor Stinner438a12d2019-05-24 17:01:38 +02005982 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005983 Py_ssize_t x;
Victor Stinnera15e2602020-04-08 02:01:56 +02005984 if (_PyIndex_Check(v)) {
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005985 x = PyNumber_AsSsize_t(v, NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02005986 if (x == -1 && _PyErr_Occurred(tstate))
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005987 return 0;
5988 }
5989 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02005990 _PyErr_SetString(tstate, PyExc_TypeError,
5991 "slice indices must be integers or "
5992 "have an __index__ method");
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005993 return 0;
5994 }
5995 *pi = x;
5996 return 1;
Serhiy Storchaka80ec8362017-03-19 19:37:40 +02005997}
5998
Thomas Wouters52152252000-08-17 22:55:00 +00005999static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02006000import_name(PyThreadState *tstate, PyFrameObject *f,
6001 PyObject *name, PyObject *fromlist, PyObject *level)
Serhiy Storchaka133138a2016-08-02 22:51:21 +03006002{
6003 _Py_IDENTIFIER(__import__);
Victor Stinnerdf142fd2016-08-20 00:44:42 +02006004 PyObject *import_func, *res;
6005 PyObject* stack[5];
Serhiy Storchaka133138a2016-08-02 22:51:21 +03006006
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02006007 import_func = _PyDict_GetItemIdWithError(f->f_builtins, &PyId___import__);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03006008 if (import_func == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02006009 if (!_PyErr_Occurred(tstate)) {
6010 _PyErr_SetString(tstate, PyExc_ImportError, "__import__ not found");
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02006011 }
Serhiy Storchaka133138a2016-08-02 22:51:21 +03006012 return NULL;
6013 }
6014
6015 /* Fast path for not overloaded __import__. */
Victor Stinner438a12d2019-05-24 17:01:38 +02006016 if (import_func == tstate->interp->import_func) {
Serhiy Storchaka133138a2016-08-02 22:51:21 +03006017 int ilevel = _PyLong_AsInt(level);
Victor Stinner438a12d2019-05-24 17:01:38 +02006018 if (ilevel == -1 && _PyErr_Occurred(tstate)) {
Serhiy Storchaka133138a2016-08-02 22:51:21 +03006019 return NULL;
6020 }
6021 res = PyImport_ImportModuleLevelObject(
6022 name,
6023 f->f_globals,
6024 f->f_locals == NULL ? Py_None : f->f_locals,
6025 fromlist,
6026 ilevel);
6027 return res;
6028 }
6029
6030 Py_INCREF(import_func);
Victor Stinnerdf142fd2016-08-20 00:44:42 +02006031
6032 stack[0] = name;
6033 stack[1] = f->f_globals;
6034 stack[2] = f->f_locals == NULL ? Py_None : f->f_locals;
6035 stack[3] = fromlist;
6036 stack[4] = level;
Victor Stinner559bb6a2016-08-22 22:48:54 +02006037 res = _PyObject_FastCall(import_func, stack, 5);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03006038 Py_DECREF(import_func);
6039 return res;
6040}
6041
6042static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02006043import_from(PyThreadState *tstate, PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00006044{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006045 PyObject *x;
Xiang Zhang4830f582017-03-21 11:13:42 +08006046 PyObject *fullmodname, *pkgname, *pkgpath, *pkgname_or_unknown, *errmsg;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00006047
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006048 if (_PyObject_LookupAttr(v, name, &x) != 0) {
Antoine Pitrou0373a102014-10-13 20:19:45 +02006049 return x;
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006050 }
Antoine Pitrou0373a102014-10-13 20:19:45 +02006051 /* Issue #17636: in case this failed because of a circular relative
6052 import, try to fallback on reading the module directly from
6053 sys.modules. */
Antoine Pitrou0373a102014-10-13 20:19:45 +02006054 pkgname = _PyObject_GetAttrId(v, &PyId___name__);
Brett Cannon3008bc02015-08-11 18:01:31 -07006055 if (pkgname == NULL) {
6056 goto error;
6057 }
Oren Milman6db70332017-09-19 14:23:01 +03006058 if (!PyUnicode_Check(pkgname)) {
6059 Py_CLEAR(pkgname);
6060 goto error;
6061 }
Antoine Pitrou0373a102014-10-13 20:19:45 +02006062 fullmodname = PyUnicode_FromFormat("%U.%U", pkgname, name);
Brett Cannon3008bc02015-08-11 18:01:31 -07006063 if (fullmodname == NULL) {
Xiang Zhang4830f582017-03-21 11:13:42 +08006064 Py_DECREF(pkgname);
Antoine Pitrou0373a102014-10-13 20:19:45 +02006065 return NULL;
Brett Cannon3008bc02015-08-11 18:01:31 -07006066 }
Eric Snow3f9eee62017-09-15 16:35:20 -06006067 x = PyImport_GetModule(fullmodname);
Antoine Pitrou0373a102014-10-13 20:19:45 +02006068 Py_DECREF(fullmodname);
Victor Stinner438a12d2019-05-24 17:01:38 +02006069 if (x == NULL && !_PyErr_Occurred(tstate)) {
Brett Cannon3008bc02015-08-11 18:01:31 -07006070 goto error;
6071 }
Matthias Bussonnier1bc15642017-02-22 07:06:50 -08006072 Py_DECREF(pkgname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006073 return x;
Brett Cannon3008bc02015-08-11 18:01:31 -07006074 error:
Matthias Bussonnierbc4bed42017-02-14 16:05:25 -08006075 pkgpath = PyModule_GetFilenameObject(v);
Matthias Bussonnier1bc15642017-02-22 07:06:50 -08006076 if (pkgname == NULL) {
6077 pkgname_or_unknown = PyUnicode_FromString("<unknown module name>");
6078 if (pkgname_or_unknown == NULL) {
6079 Py_XDECREF(pkgpath);
6080 return NULL;
6081 }
6082 } else {
6083 pkgname_or_unknown = pkgname;
6084 }
Matthias Bussonnierbc4bed42017-02-14 16:05:25 -08006085
6086 if (pkgpath == NULL || !PyUnicode_Check(pkgpath)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02006087 _PyErr_Clear(tstate);
Xiang Zhang4830f582017-03-21 11:13:42 +08006088 errmsg = PyUnicode_FromFormat(
6089 "cannot import name %R from %R (unknown location)",
6090 name, pkgname_or_unknown
6091 );
Stefan Krah027b09c2019-03-25 21:50:58 +01006092 /* NULL checks for errmsg and pkgname done by PyErr_SetImportError. */
Xiang Zhang4830f582017-03-21 11:13:42 +08006093 PyErr_SetImportError(errmsg, pkgname, NULL);
6094 }
6095 else {
Anthony Sottile65366bc2019-09-09 08:17:50 -07006096 _Py_IDENTIFIER(__spec__);
6097 PyObject *spec = _PyObject_GetAttrId(v, &PyId___spec__);
Anthony Sottile65366bc2019-09-09 08:17:50 -07006098 const char *fmt =
6099 _PyModuleSpec_IsInitializing(spec) ?
6100 "cannot import name %R from partially initialized module %R "
6101 "(most likely due to a circular import) (%S)" :
6102 "cannot import name %R from %R (%S)";
6103 Py_XDECREF(spec);
6104
6105 errmsg = PyUnicode_FromFormat(fmt, name, pkgname_or_unknown, pkgpath);
Stefan Krah027b09c2019-03-25 21:50:58 +01006106 /* NULL checks for errmsg and pkgname done by PyErr_SetImportError. */
Xiang Zhang4830f582017-03-21 11:13:42 +08006107 PyErr_SetImportError(errmsg, pkgname, pkgpath);
Matthias Bussonnierbc4bed42017-02-14 16:05:25 -08006108 }
6109
Xiang Zhang4830f582017-03-21 11:13:42 +08006110 Py_XDECREF(errmsg);
Matthias Bussonnier1bc15642017-02-22 07:06:50 -08006111 Py_XDECREF(pkgname_or_unknown);
6112 Py_XDECREF(pkgpath);
Brett Cannon3008bc02015-08-11 18:01:31 -07006113 return NULL;
Thomas Wouters52152252000-08-17 22:55:00 +00006114}
Guido van Rossumac7be682001-01-17 15:42:30 +00006115
Thomas Wouters52152252000-08-17 22:55:00 +00006116static int
Victor Stinner438a12d2019-05-24 17:01:38 +02006117import_all_from(PyThreadState *tstate, PyObject *locals, PyObject *v)
Thomas Wouters52152252000-08-17 22:55:00 +00006118{
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02006119 _Py_IDENTIFIER(__all__);
6120 _Py_IDENTIFIER(__dict__);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006121 PyObject *all, *dict, *name, *value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006122 int skip_leading_underscores = 0;
6123 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00006124
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006125 if (_PyObject_LookupAttrId(v, &PyId___all__, &all) < 0) {
6126 return -1; /* Unexpected error */
6127 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006128 if (all == NULL) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006129 if (_PyObject_LookupAttrId(v, &PyId___dict__, &dict) < 0) {
6130 return -1;
6131 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006132 if (dict == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02006133 _PyErr_SetString(tstate, PyExc_ImportError,
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006134 "from-import-* object has no __dict__ and no __all__");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006135 return -1;
6136 }
6137 all = PyMapping_Keys(dict);
6138 Py_DECREF(dict);
6139 if (all == NULL)
6140 return -1;
6141 skip_leading_underscores = 1;
6142 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00006143
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006144 for (pos = 0, err = 0; ; pos++) {
6145 name = PySequence_GetItem(all, pos);
6146 if (name == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02006147 if (!_PyErr_ExceptionMatches(tstate, PyExc_IndexError)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006148 err = -1;
Victor Stinner438a12d2019-05-24 17:01:38 +02006149 }
6150 else {
6151 _PyErr_Clear(tstate);
6152 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006153 break;
6154 }
Xiang Zhangd8b291a2018-03-24 18:39:36 +08006155 if (!PyUnicode_Check(name)) {
6156 PyObject *modname = _PyObject_GetAttrId(v, &PyId___name__);
6157 if (modname == NULL) {
6158 Py_DECREF(name);
6159 err = -1;
6160 break;
6161 }
6162 if (!PyUnicode_Check(modname)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02006163 _PyErr_Format(tstate, PyExc_TypeError,
6164 "module __name__ must be a string, not %.100s",
6165 Py_TYPE(modname)->tp_name);
Xiang Zhangd8b291a2018-03-24 18:39:36 +08006166 }
6167 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02006168 _PyErr_Format(tstate, PyExc_TypeError,
6169 "%s in %U.%s must be str, not %.100s",
6170 skip_leading_underscores ? "Key" : "Item",
6171 modname,
6172 skip_leading_underscores ? "__dict__" : "__all__",
6173 Py_TYPE(name)->tp_name);
Xiang Zhangd8b291a2018-03-24 18:39:36 +08006174 }
6175 Py_DECREF(modname);
6176 Py_DECREF(name);
6177 err = -1;
6178 break;
6179 }
6180 if (skip_leading_underscores) {
Serhiy Storchakae3b2b4b2017-09-08 09:58:51 +03006181 if (PyUnicode_READY(name) == -1) {
6182 Py_DECREF(name);
6183 err = -1;
6184 break;
6185 }
6186 if (PyUnicode_READ_CHAR(name, 0) == '_') {
6187 Py_DECREF(name);
6188 continue;
6189 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006190 }
6191 value = PyObject_GetAttr(v, name);
6192 if (value == NULL)
6193 err = -1;
6194 else if (PyDict_CheckExact(locals))
6195 err = PyDict_SetItem(locals, name, value);
6196 else
6197 err = PyObject_SetItem(locals, name, value);
6198 Py_DECREF(name);
6199 Py_XDECREF(value);
6200 if (err != 0)
6201 break;
6202 }
6203 Py_DECREF(all);
6204 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00006205}
6206
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03006207static int
Victor Stinner438a12d2019-05-24 17:01:38 +02006208check_args_iterable(PyThreadState *tstate, PyObject *func, PyObject *args)
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03006209{
Victor Stinnera102ed72020-02-07 02:24:48 +01006210 if (Py_TYPE(args)->tp_iter == NULL && !PySequence_Check(args)) {
Jeroen Demeyerbf17d412019-11-05 16:48:04 +01006211 /* check_args_iterable() may be called with a live exception:
6212 * clear it to prevent calling _PyObject_FunctionStr() with an
6213 * exception set. */
Victor Stinner61f4db82020-01-28 03:37:45 +01006214 _PyErr_Clear(tstate);
Jeroen Demeyerbf17d412019-11-05 16:48:04 +01006215 PyObject *funcstr = _PyObject_FunctionStr(func);
6216 if (funcstr != NULL) {
6217 _PyErr_Format(tstate, PyExc_TypeError,
6218 "%U argument after * must be an iterable, not %.200s",
6219 funcstr, Py_TYPE(args)->tp_name);
6220 Py_DECREF(funcstr);
6221 }
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03006222 return -1;
6223 }
6224 return 0;
6225}
6226
6227static void
Victor Stinner438a12d2019-05-24 17:01:38 +02006228format_kwargs_error(PyThreadState *tstate, PyObject *func, PyObject *kwargs)
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03006229{
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02006230 /* _PyDict_MergeEx raises attribute
6231 * error (percolated from an attempt
6232 * to get 'keys' attribute) instead of
6233 * a type error if its second argument
6234 * is not a mapping.
6235 */
Victor Stinner438a12d2019-05-24 17:01:38 +02006236 if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) {
Victor Stinner61f4db82020-01-28 03:37:45 +01006237 _PyErr_Clear(tstate);
Jeroen Demeyerbf17d412019-11-05 16:48:04 +01006238 PyObject *funcstr = _PyObject_FunctionStr(func);
6239 if (funcstr != NULL) {
6240 _PyErr_Format(
6241 tstate, PyExc_TypeError,
6242 "%U argument after ** must be a mapping, not %.200s",
6243 funcstr, Py_TYPE(kwargs)->tp_name);
6244 Py_DECREF(funcstr);
6245 }
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02006246 }
Victor Stinner438a12d2019-05-24 17:01:38 +02006247 else if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02006248 PyObject *exc, *val, *tb;
Victor Stinner438a12d2019-05-24 17:01:38 +02006249 _PyErr_Fetch(tstate, &exc, &val, &tb);
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02006250 if (val && PyTuple_Check(val) && PyTuple_GET_SIZE(val) == 1) {
Victor Stinner61f4db82020-01-28 03:37:45 +01006251 _PyErr_Clear(tstate);
Jeroen Demeyerbf17d412019-11-05 16:48:04 +01006252 PyObject *funcstr = _PyObject_FunctionStr(func);
6253 if (funcstr != NULL) {
6254 PyObject *key = PyTuple_GET_ITEM(val, 0);
6255 _PyErr_Format(
6256 tstate, PyExc_TypeError,
6257 "%U got multiple values for keyword argument '%S'",
6258 funcstr, key);
6259 Py_DECREF(funcstr);
6260 }
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02006261 Py_XDECREF(exc);
6262 Py_XDECREF(val);
6263 Py_XDECREF(tb);
6264 }
6265 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02006266 _PyErr_Restore(tstate, exc, val, tb);
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02006267 }
6268 }
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03006269}
6270
Guido van Rossumac7be682001-01-17 15:42:30 +00006271static void
Victor Stinner438a12d2019-05-24 17:01:38 +02006272format_exc_check_arg(PyThreadState *tstate, PyObject *exc,
6273 const char *format_str, PyObject *obj)
Paul Prescode68140d2000-08-30 20:25:01 +00006274{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006275 const char *obj_str;
Paul Prescode68140d2000-08-30 20:25:01 +00006276
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006277 if (!obj)
6278 return;
Paul Prescode68140d2000-08-30 20:25:01 +00006279
Serhiy Storchaka06515832016-11-20 09:13:07 +02006280 obj_str = PyUnicode_AsUTF8(obj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006281 if (!obj_str)
6282 return;
Paul Prescode68140d2000-08-30 20:25:01 +00006283
Victor Stinner438a12d2019-05-24 17:01:38 +02006284 _PyErr_Format(tstate, exc, format_str, obj_str);
Pablo Galindo5bf8bf22021-04-14 15:10:33 +01006285
6286 if (exc == PyExc_NameError) {
6287 // Include the name in the NameError exceptions to offer suggestions later.
6288 _Py_IDENTIFIER(name);
6289 PyObject *type, *value, *traceback;
6290 PyErr_Fetch(&type, &value, &traceback);
6291 PyErr_NormalizeException(&type, &value, &traceback);
6292 if (PyErr_GivenExceptionMatches(value, PyExc_NameError)) {
6293 // We do not care if this fails because we are going to restore the
6294 // NameError anyway.
6295 (void)_PyObject_SetAttrId(value, &PyId_name, obj);
6296 }
6297 PyErr_Restore(type, value, traceback);
6298 }
Paul Prescode68140d2000-08-30 20:25:01 +00006299}
Guido van Rossum950361c1997-01-24 13:49:28 +00006300
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00006301static void
Victor Stinner438a12d2019-05-24 17:01:38 +02006302format_exc_unbound(PyThreadState *tstate, PyCodeObject *co, int oparg)
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00006303{
6304 PyObject *name;
6305 /* Don't stomp existing exception */
Victor Stinner438a12d2019-05-24 17:01:38 +02006306 if (_PyErr_Occurred(tstate))
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00006307 return;
6308 if (oparg < PyTuple_GET_SIZE(co->co_cellvars)) {
6309 name = PyTuple_GET_ITEM(co->co_cellvars,
6310 oparg);
Victor Stinner438a12d2019-05-24 17:01:38 +02006311 format_exc_check_arg(tstate,
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00006312 PyExc_UnboundLocalError,
6313 UNBOUNDLOCAL_ERROR_MSG,
6314 name);
6315 } else {
6316 name = PyTuple_GET_ITEM(co->co_freevars, oparg -
6317 PyTuple_GET_SIZE(co->co_cellvars));
Victor Stinner438a12d2019-05-24 17:01:38 +02006318 format_exc_check_arg(tstate, PyExc_NameError,
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00006319 UNBOUNDFREE_ERROR_MSG, name);
6320 }
6321}
6322
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03006323static void
Mark Shannonfee55262019-11-21 09:11:43 +00006324format_awaitable_error(PyThreadState *tstate, PyTypeObject *type, int prevprevopcode, int prevopcode)
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03006325{
6326 if (type->tp_as_async == NULL || type->tp_as_async->am_await == NULL) {
6327 if (prevopcode == BEFORE_ASYNC_WITH) {
Victor Stinner438a12d2019-05-24 17:01:38 +02006328 _PyErr_Format(tstate, PyExc_TypeError,
6329 "'async with' received an object from __aenter__ "
6330 "that does not implement __await__: %.100s",
6331 type->tp_name);
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03006332 }
Mark Shannonfee55262019-11-21 09:11:43 +00006333 else if (prevopcode == WITH_EXCEPT_START || (prevopcode == CALL_FUNCTION && prevprevopcode == DUP_TOP)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02006334 _PyErr_Format(tstate, PyExc_TypeError,
6335 "'async with' received an object from __aexit__ "
6336 "that does not implement __await__: %.100s",
6337 type->tp_name);
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03006338 }
6339 }
6340}
6341
Victor Stinnerd2a915d2011-10-02 20:34:20 +02006342static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02006343unicode_concatenate(PyThreadState *tstate, PyObject *v, PyObject *w,
Serhiy Storchakaab874002016-09-11 13:48:15 +03006344 PyFrameObject *f, const _Py_CODEUNIT *next_instr)
Victor Stinnerd2a915d2011-10-02 20:34:20 +02006345{
6346 PyObject *res;
6347 if (Py_REFCNT(v) == 2) {
6348 /* In the common case, there are 2 references to the value
6349 * stored in 'variable' when the += is performed: one on the
6350 * value stack (in 'v') and one still stored in the
6351 * 'variable'. We try to delete the variable now to reduce
6352 * the refcnt to 1.
6353 */
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03006354 int opcode, oparg;
6355 NEXTOPARG();
6356 switch (opcode) {
Victor Stinnerd2a915d2011-10-02 20:34:20 +02006357 case STORE_FAST:
6358 {
Victor Stinnerd2a915d2011-10-02 20:34:20 +02006359 PyObject **fastlocals = f->f_localsplus;
6360 if (GETLOCAL(oparg) == v)
6361 SETLOCAL(oparg, NULL);
6362 break;
6363 }
6364 case STORE_DEREF:
6365 {
6366 PyObject **freevars = (f->f_localsplus +
6367 f->f_code->co_nlocals);
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03006368 PyObject *c = freevars[oparg];
Raymond Hettingerc32f9db2016-11-12 04:10:35 -05006369 if (PyCell_GET(c) == v) {
6370 PyCell_SET(c, NULL);
6371 Py_DECREF(v);
6372 }
Victor Stinnerd2a915d2011-10-02 20:34:20 +02006373 break;
6374 }
6375 case STORE_NAME:
6376 {
6377 PyObject *names = f->f_code->co_names;
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03006378 PyObject *name = GETITEM(names, oparg);
Victor Stinnerd2a915d2011-10-02 20:34:20 +02006379 PyObject *locals = f->f_locals;
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02006380 if (locals && PyDict_CheckExact(locals)) {
6381 PyObject *w = PyDict_GetItemWithError(locals, name);
6382 if ((w == v && PyDict_DelItem(locals, name) != 0) ||
Victor Stinner438a12d2019-05-24 17:01:38 +02006383 (w == NULL && _PyErr_Occurred(tstate)))
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02006384 {
6385 Py_DECREF(v);
6386 return NULL;
Victor Stinnerd2a915d2011-10-02 20:34:20 +02006387 }
6388 }
6389 break;
6390 }
6391 }
6392 }
6393 res = v;
6394 PyUnicode_Append(&res, w);
6395 return res;
6396}
6397
Guido van Rossum950361c1997-01-24 13:49:28 +00006398#ifdef DYNAMIC_EXECUTION_PROFILE
6399
Skip Montanarof118cb12001-10-15 20:51:38 +00006400static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00006401getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00006402{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006403 int i;
6404 PyObject *l = PyList_New(256);
6405 if (l == NULL) return NULL;
6406 for (i = 0; i < 256; i++) {
6407 PyObject *x = PyLong_FromLong(a[i]);
6408 if (x == NULL) {
6409 Py_DECREF(l);
6410 return NULL;
6411 }
Zackery Spytz99d56b52018-12-08 07:16:55 -07006412 PyList_SET_ITEM(l, i, x);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006413 }
6414 for (i = 0; i < 256; i++)
6415 a[i] = 0;
6416 return l;
Guido van Rossum950361c1997-01-24 13:49:28 +00006417}
6418
6419PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00006420_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00006421{
6422#ifndef DXPAIRS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006423 return getarray(dxp);
Guido van Rossum950361c1997-01-24 13:49:28 +00006424#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006425 int i;
6426 PyObject *l = PyList_New(257);
6427 if (l == NULL) return NULL;
6428 for (i = 0; i < 257; i++) {
6429 PyObject *x = getarray(dxpairs[i]);
6430 if (x == NULL) {
6431 Py_DECREF(l);
6432 return NULL;
6433 }
Zackery Spytz99d56b52018-12-08 07:16:55 -07006434 PyList_SET_ITEM(l, i, x);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006435 }
6436 return l;
Guido van Rossum950361c1997-01-24 13:49:28 +00006437#endif
6438}
6439
6440#endif
Brett Cannon5c4de282016-09-07 11:16:41 -07006441
6442Py_ssize_t
6443_PyEval_RequestCodeExtraIndex(freefunc free)
6444{
Victor Stinner81a7be32020-04-14 15:14:01 +02006445 PyInterpreterState *interp = _PyInterpreterState_GET();
Brett Cannon5c4de282016-09-07 11:16:41 -07006446 Py_ssize_t new_index;
6447
Dino Viehlandf3cffd22017-06-21 14:44:36 -07006448 if (interp->co_extra_user_count == MAX_CO_EXTRA_USERS - 1) {
Brett Cannon5c4de282016-09-07 11:16:41 -07006449 return -1;
6450 }
Dino Viehlandf3cffd22017-06-21 14:44:36 -07006451 new_index = interp->co_extra_user_count++;
6452 interp->co_extra_freefuncs[new_index] = free;
Brett Cannon5c4de282016-09-07 11:16:41 -07006453 return new_index;
6454}
Łukasz Langaa785c872016-09-09 17:37:37 -07006455
6456static void
6457dtrace_function_entry(PyFrameObject *f)
6458{
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02006459 const char *filename;
6460 const char *funcname;
Łukasz Langaa785c872016-09-09 17:37:37 -07006461 int lineno;
6462
Victor Stinner6d86a232020-04-29 00:56:58 +02006463 PyCodeObject *code = f->f_code;
6464 filename = PyUnicode_AsUTF8(code->co_filename);
6465 funcname = PyUnicode_AsUTF8(code->co_name);
Mark Shannonfcb55c02021-04-01 16:00:31 +01006466 lineno = PyFrame_GetLineNumber(f);
Łukasz Langaa785c872016-09-09 17:37:37 -07006467
Andy Lestere6be9b52020-02-11 20:28:35 -06006468 PyDTrace_FUNCTION_ENTRY(filename, funcname, lineno);
Łukasz Langaa785c872016-09-09 17:37:37 -07006469}
6470
6471static void
6472dtrace_function_return(PyFrameObject *f)
6473{
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02006474 const char *filename;
6475 const char *funcname;
Łukasz Langaa785c872016-09-09 17:37:37 -07006476 int lineno;
6477
Victor Stinner6d86a232020-04-29 00:56:58 +02006478 PyCodeObject *code = f->f_code;
6479 filename = PyUnicode_AsUTF8(code->co_filename);
6480 funcname = PyUnicode_AsUTF8(code->co_name);
Mark Shannonfcb55c02021-04-01 16:00:31 +01006481 lineno = PyFrame_GetLineNumber(f);
Łukasz Langaa785c872016-09-09 17:37:37 -07006482
Andy Lestere6be9b52020-02-11 20:28:35 -06006483 PyDTrace_FUNCTION_RETURN(filename, funcname, lineno);
Łukasz Langaa785c872016-09-09 17:37:37 -07006484}
6485
6486/* DTrace equivalent of maybe_call_line_trace. */
6487static void
6488maybe_dtrace_line(PyFrameObject *frame,
Mark Shannon9f2c63b2021-07-08 19:21:22 +01006489 PyTraceInfo *trace_info, int instr_prev)
Łukasz Langaa785c872016-09-09 17:37:37 -07006490{
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02006491 const char *co_filename, *co_name;
Łukasz Langaa785c872016-09-09 17:37:37 -07006492
6493 /* If the last instruction executed isn't in the current
6494 instruction window, reset the window.
6495 */
Mark Shannon8e1b4062021-03-05 14:45:50 +00006496 initialize_trace_info(trace_info, frame);
Mark Shannonfcb55c02021-04-01 16:00:31 +01006497 int line = _PyCode_CheckLineNumber(frame->f_lasti*2, &trace_info->bounds);
Łukasz Langaa785c872016-09-09 17:37:37 -07006498 /* If the last instruction falls at the start of a line or if
6499 it represents a jump backwards, update the frame's line
6500 number and call the trace function. */
Mark Shannon9f2c63b2021-07-08 19:21:22 +01006501 if (line != frame->f_lineno || frame->f_lasti < instr_prev) {
Mark Shannon877df852020-11-12 09:43:29 +00006502 if (line != -1) {
6503 frame->f_lineno = line;
6504 co_filename = PyUnicode_AsUTF8(frame->f_code->co_filename);
6505 if (!co_filename)
6506 co_filename = "?";
6507 co_name = PyUnicode_AsUTF8(frame->f_code->co_name);
6508 if (!co_name)
6509 co_name = "?";
6510 PyDTrace_LINE(co_filename, co_name, line);
6511 }
Łukasz Langaa785c872016-09-09 17:37:37 -07006512 }
Łukasz Langaa785c872016-09-09 17:37:37 -07006513}
Victor Stinnerf4b1e3d2019-11-04 19:48:34 +01006514
6515
6516/* Implement Py_EnterRecursiveCall() and Py_LeaveRecursiveCall() as functions
6517 for the limited API. */
6518
6519#undef Py_EnterRecursiveCall
6520
6521int Py_EnterRecursiveCall(const char *where)
6522{
Victor Stinnerbe434dc2019-11-05 00:51:22 +01006523 return _Py_EnterRecursiveCall_inline(where);
Victor Stinnerf4b1e3d2019-11-04 19:48:34 +01006524}
6525
6526#undef Py_LeaveRecursiveCall
6527
6528void Py_LeaveRecursiveCall(void)
6529{
Victor Stinnerbe434dc2019-11-05 00:51:22 +01006530 _Py_LeaveRecursiveCall_inline();
Victor Stinnerf4b1e3d2019-11-04 19:48:34 +01006531}