blob: 6430e792b8c5d8b69529ca9ab5836737be170627 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum3f5da241990-12-20 15:06:42 +00002/* Execute compiled code */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003
Guido van Rossum681d79a1995-07-18 14:51:37 +00004/* XXX TO DO:
Guido van Rossum681d79a1995-07-18 14:51:37 +00005 XXX speed up searching for keywords by using a dictionary
Guido van Rossum681d79a1995-07-18 14:51:37 +00006 XXX document it!
7 */
8
Thomas Wouters477c8d52006-05-27 19:21:47 +00009/* enable more aggressive intra-module optimizations, where available */
10#define PY_LOCAL_AGGRESSIVE
11
Guido van Rossumb209a111997-04-29 18:18:01 +000012#include "Python.h"
Victor Stinnere560f902020-04-14 18:30:41 +020013#include "pycore_abstract.h" // _PyIndex_Check()
Victor Stinner384621c2020-06-22 17:27:35 +020014#include "pycore_call.h" // _PyObject_FastCallDictTstate()
15#include "pycore_ceval.h" // _PyEval_SignalAsyncExc()
16#include "pycore_code.h" // _PyCode_InitOpcache()
17#include "pycore_initconfig.h" // _PyStatus_OK()
18#include "pycore_object.h" // _PyObject_GC_TRACK()
19#include "pycore_pyerrors.h" // _PyErr_Fetch()
20#include "pycore_pylifecycle.h" // _PyErr_Print()
Victor Stinnere560f902020-04-14 18:30:41 +020021#include "pycore_pymem.h" // _PyMem_IsPtrFreed()
22#include "pycore_pystate.h" // _PyInterpreterState_GET()
Victor Stinner384621c2020-06-22 17:27:35 +020023#include "pycore_sysmodule.h" // _PySys_Audit()
24#include "pycore_tuple.h" // _PyTuple_ITEMS()
Guido van Rossum10dc2e81990-11-18 17:27:39 +000025
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000026#include "code.h"
Benjamin Peterson025e9eb2015-05-05 20:16:41 -040027#include "dictobject.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000028#include "frameobject.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000029#include "opcode.h"
Łukasz Langaa785c872016-09-09 17:37:37 -070030#include "pydtrace.h"
Benjamin Peterson025e9eb2015-05-05 20:16:41 -040031#include "setobject.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000032
Guido van Rossumc6004111993-11-05 10:22:19 +000033#include <ctype.h>
34
Guido van Rossum408027e1996-12-30 16:17:54 +000035#ifdef Py_DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000036/* For debugging the interpreter: */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000037#define LLTRACE 1 /* Low-level trace feature */
38#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000039#endif
40
Victor Stinner5c75f372019-04-17 23:02:26 +020041#if !defined(Py_BUILD_CORE)
42# error "ceval.c must be build with Py_BUILD_CORE define for best performance"
43#endif
44
Hai Shi46874c22020-01-30 17:20:25 -060045_Py_IDENTIFIER(__name__);
Guido van Rossum5b722181993-03-30 17:46:03 +000046
Guido van Rossum374a9221991-04-04 10:40:29 +000047/* Forward declarations */
Victor Stinner09532fe2019-05-10 23:39:09 +020048Py_LOCAL_INLINE(PyObject *) call_function(
49 PyThreadState *tstate, PyObject ***pp_stack,
50 Py_ssize_t oparg, PyObject *kwnames);
51static PyObject * do_call_core(
52 PyThreadState *tstate, PyObject *func,
53 PyObject *callargs, PyObject *kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +000054
Guido van Rossum0a066c01992-03-27 17:29:15 +000055#ifdef LLTRACE
Guido van Rossumc2e20742006-02-27 22:32:47 +000056static int lltrace;
Victor Stinner438a12d2019-05-24 17:01:38 +020057static int prtrace(PyThreadState *, PyObject *, const char *);
Guido van Rossum0a066c01992-03-27 17:29:15 +000058#endif
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +010059static int call_trace(Py_tracefunc, PyObject *,
60 PyThreadState *, PyFrameObject *,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000061 int, PyObject *);
Amaury Forgeot d'Arcf05149a2007-11-13 01:05:30 +000062static int call_trace_protected(Py_tracefunc, PyObject *,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +010063 PyThreadState *, PyFrameObject *,
64 int, PyObject *);
65static void call_exc_trace(Py_tracefunc, PyObject *,
66 PyThreadState *, PyFrameObject *);
Tim Peters8a5c3c72004-04-05 19:36:21 +000067static int maybe_call_line_trace(Py_tracefunc, PyObject *,
Eric Snow2ebc5ce2017-09-07 23:51:28 -060068 PyThreadState *, PyFrameObject *,
69 int *, int *, int *);
Łukasz Langaa785c872016-09-09 17:37:37 -070070static void maybe_dtrace_line(PyFrameObject *, int *, int *, int *);
71static void dtrace_function_entry(PyFrameObject *);
72static void dtrace_function_return(PyFrameObject *);
Michael W. Hudsondd32a912002-08-15 14:59:02 +000073
Victor Stinner438a12d2019-05-24 17:01:38 +020074static PyObject * import_name(PyThreadState *, PyFrameObject *,
75 PyObject *, PyObject *, PyObject *);
76static PyObject * import_from(PyThreadState *, PyObject *, PyObject *);
77static int import_all_from(PyThreadState *, PyObject *, PyObject *);
78static void format_exc_check_arg(PyThreadState *, PyObject *, const char *, PyObject *);
79static void format_exc_unbound(PyThreadState *tstate, PyCodeObject *co, int oparg);
80static PyObject * unicode_concatenate(PyThreadState *, PyObject *, PyObject *,
Serhiy Storchakaab874002016-09-11 13:48:15 +030081 PyFrameObject *, const _Py_CODEUNIT *);
Victor Stinner438a12d2019-05-24 17:01:38 +020082static PyObject * special_lookup(PyThreadState *, PyObject *, _Py_Identifier *);
83static int check_args_iterable(PyThreadState *, PyObject *func, PyObject *vararg);
84static void format_kwargs_error(PyThreadState *, PyObject *func, PyObject *kwargs);
Mark Shannonfee55262019-11-21 09:11:43 +000085static void format_awaitable_error(PyThreadState *, PyTypeObject *, int, int);
Guido van Rossum374a9221991-04-04 10:40:29 +000086
Paul Prescode68140d2000-08-30 20:25:01 +000087#define NAME_ERROR_MSG \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000088 "name '%.200s' is not defined"
Paul Prescode68140d2000-08-30 20:25:01 +000089#define UNBOUNDLOCAL_ERROR_MSG \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000090 "local variable '%.200s' referenced before assignment"
Jeremy Hyltonc76770c2001-04-13 16:51:46 +000091#define UNBOUNDFREE_ERROR_MSG \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000092 "free variable '%.200s' referenced before assignment" \
93 " in enclosing scope"
Guido van Rossum374a9221991-04-04 10:40:29 +000094
Guido van Rossum950361c1997-01-24 13:49:28 +000095/* Dynamic execution profile */
96#ifdef DYNAMIC_EXECUTION_PROFILE
97#ifdef DXPAIRS
98static long dxpairs[257][256];
99#define dxp dxpairs[256]
100#else
101static long dxp[256];
102#endif
103#endif
104
Inada Naoki91234a12019-06-03 21:30:58 +0900105/* per opcode cache */
Inada Naokieddef862019-06-04 07:38:10 +0900106#ifdef Py_DEBUG
107// --with-pydebug is used to find memory leak. opcache makes it harder.
108// So we disable opcache when Py_DEBUG is defined.
109// See bpo-37146
110#define OPCACHE_MIN_RUNS 0 /* disable opcache */
111#else
Inada Naoki91234a12019-06-03 21:30:58 +0900112#define OPCACHE_MIN_RUNS 1024 /* create opcache when code executed this time */
Inada Naokieddef862019-06-04 07:38:10 +0900113#endif
Inada Naoki91234a12019-06-03 21:30:58 +0900114#define OPCACHE_STATS 0 /* Enable stats */
115
116#if OPCACHE_STATS
117static size_t opcache_code_objects = 0;
118static size_t opcache_code_objects_extra_mem = 0;
119
120static size_t opcache_global_opts = 0;
121static size_t opcache_global_hits = 0;
122static size_t opcache_global_misses = 0;
123#endif
124
Victor Stinner5a3a71d2020-03-19 17:40:12 +0100125
Victor Stinnerda2914d2020-03-20 09:29:08 +0100126#ifndef NDEBUG
127/* Ensure that tstate is valid: sanity check for PyEval_AcquireThread() and
128 PyEval_RestoreThread(). Detect if tstate memory was freed. It can happen
129 when a thread continues to run after Python finalization, especially
130 daemon threads. */
131static int
132is_tstate_valid(PyThreadState *tstate)
133{
134 assert(!_PyMem_IsPtrFreed(tstate));
135 assert(!_PyMem_IsPtrFreed(tstate->interp));
136 return 1;
137}
138#endif
139
140
Jeffrey Yasskin39370832010-05-03 19:29:34 +0000141/* This can set eval_breaker to 0 even though gil_drop_request became
142 1. We believe this is all right because the eval loop will release
143 the GIL eventually anyway. */
Victor Stinnerda2914d2020-03-20 09:29:08 +0100144static inline void
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200145COMPUTE_EVAL_BREAKER(PyInterpreterState *interp,
Victor Stinner299b8c62020-05-05 17:40:18 +0200146 struct _ceval_runtime_state *ceval,
147 struct _ceval_state *ceval2)
Victor Stinnerda2914d2020-03-20 09:29:08 +0100148{
Victor Stinner299b8c62020-05-05 17:40:18 +0200149 _Py_atomic_store_relaxed(&ceval2->eval_breaker,
150 _Py_atomic_load_relaxed(&ceval2->gil_drop_request)
Victor Stinner0b1e3302020-05-05 16:14:31 +0200151 | (_Py_atomic_load_relaxed(&ceval->signals_pending)
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200152 && _Py_ThreadCanHandleSignals(interp))
Victor Stinner299b8c62020-05-05 17:40:18 +0200153 | (_Py_atomic_load_relaxed(&ceval2->pending.calls_to_do)
Victor Stinnerd8316882020-03-20 14:50:35 +0100154 && _Py_ThreadCanHandlePendingCalls())
Victor Stinner299b8c62020-05-05 17:40:18 +0200155 | ceval2->pending.async_exc);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100156}
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000157
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000158
Victor Stinnerda2914d2020-03-20 09:29:08 +0100159static inline void
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200160SET_GIL_DROP_REQUEST(PyInterpreterState *interp)
Victor Stinnerda2914d2020-03-20 09:29:08 +0100161{
Victor Stinner299b8c62020-05-05 17:40:18 +0200162 struct _ceval_state *ceval2 = &interp->ceval;
163 _Py_atomic_store_relaxed(&ceval2->gil_drop_request, 1);
164 _Py_atomic_store_relaxed(&ceval2->eval_breaker, 1);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100165}
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000166
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000167
Victor Stinnerda2914d2020-03-20 09:29:08 +0100168static inline void
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200169RESET_GIL_DROP_REQUEST(PyInterpreterState *interp)
Victor Stinnerda2914d2020-03-20 09:29:08 +0100170{
Victor Stinner299b8c62020-05-05 17:40:18 +0200171 struct _ceval_runtime_state *ceval = &interp->runtime->ceval;
172 struct _ceval_state *ceval2 = &interp->ceval;
173 _Py_atomic_store_relaxed(&ceval2->gil_drop_request, 0);
174 COMPUTE_EVAL_BREAKER(interp, ceval, ceval2);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100175}
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000176
Eric Snowfdf282d2019-01-11 14:26:55 -0700177
Victor Stinnerda2914d2020-03-20 09:29:08 +0100178static inline void
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200179SIGNAL_PENDING_CALLS(PyInterpreterState *interp)
Victor Stinnerda2914d2020-03-20 09:29:08 +0100180{
Victor Stinner299b8c62020-05-05 17:40:18 +0200181 struct _ceval_runtime_state *ceval = &interp->runtime->ceval;
182 struct _ceval_state *ceval2 = &interp->ceval;
183 _Py_atomic_store_relaxed(&ceval2->pending.calls_to_do, 1);
184 COMPUTE_EVAL_BREAKER(interp, ceval, ceval2);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100185}
Eric Snowfdf282d2019-01-11 14:26:55 -0700186
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 +0200189UNSIGNAL_PENDING_CALLS(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->pending.calls_to_do, 0);
194 COMPUTE_EVAL_BREAKER(interp, ceval, ceval2);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100195}
196
197
198static inline void
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200199SIGNAL_PENDING_SIGNALS(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;
Victor Stinner0b1e3302020-05-05 16:14:31 +0200203 _Py_atomic_store_relaxed(&ceval->signals_pending, 1);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100204 /* eval_breaker is not set to 1 if thread_can_handle_signals() is false */
Victor Stinner299b8c62020-05-05 17:40:18 +0200205 COMPUTE_EVAL_BREAKER(interp, ceval, ceval2);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100206}
207
208
209static inline void
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200210UNSIGNAL_PENDING_SIGNALS(PyInterpreterState *interp)
Victor Stinnerda2914d2020-03-20 09:29:08 +0100211{
Victor Stinner299b8c62020-05-05 17:40:18 +0200212 struct _ceval_runtime_state *ceval = &interp->runtime->ceval;
213 struct _ceval_state *ceval2 = &interp->ceval;
Victor Stinner0b1e3302020-05-05 16:14:31 +0200214 _Py_atomic_store_relaxed(&ceval->signals_pending, 0);
Victor Stinner299b8c62020-05-05 17:40:18 +0200215 COMPUTE_EVAL_BREAKER(interp, ceval, ceval2);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100216}
217
218
219static inline void
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200220SIGNAL_ASYNC_EXC(PyInterpreterState *interp)
Victor Stinnerda2914d2020-03-20 09:29:08 +0100221{
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200222 struct _ceval_state *ceval2 = &interp->ceval;
Victor Stinnerda2914d2020-03-20 09:29:08 +0100223 ceval2->pending.async_exc = 1;
224 _Py_atomic_store_relaxed(&ceval2->eval_breaker, 1);
225}
226
227
228static inline void
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200229UNSIGNAL_ASYNC_EXC(PyInterpreterState *interp)
Victor Stinnerda2914d2020-03-20 09:29:08 +0100230{
Victor Stinner299b8c62020-05-05 17:40:18 +0200231 struct _ceval_runtime_state *ceval = &interp->runtime->ceval;
232 struct _ceval_state *ceval2 = &interp->ceval;
233 ceval2->pending.async_exc = 0;
234 COMPUTE_EVAL_BREAKER(interp, ceval, ceval2);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100235}
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000236
237
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000238#ifdef HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000239#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +0000240#endif
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000241#include "ceval_gil.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000242
Victor Stinner3026cad2020-06-01 16:02:40 +0200243void _Py_NO_RETURN
244_Py_FatalError_TstateNULL(const char *func)
Victor Stinnereb4e2ae2020-03-08 11:57:45 +0100245{
Victor Stinner3026cad2020-06-01 16:02:40 +0200246 _Py_FatalErrorFunc(func,
247 "the function must be called with the GIL held, "
248 "but the GIL is released "
249 "(the current Python thread state is NULL)");
Victor Stinnereb4e2ae2020-03-08 11:57:45 +0100250}
251
Victor Stinner7be4e352020-05-05 20:27:47 +0200252#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
253int
254_PyEval_ThreadsInitialized(PyInterpreterState *interp)
255{
256 return gil_created(&interp->ceval.gil);
257}
258
259int
260PyEval_ThreadsInitialized(void)
261{
262 // Fatal error if there is no current interpreter
263 PyInterpreterState *interp = PyInterpreterState_Get();
264 return _PyEval_ThreadsInitialized(interp);
265}
266#else
Tim Peters7f468f22004-10-11 02:40:51 +0000267int
Victor Stinner175a7042020-03-10 00:37:48 +0100268_PyEval_ThreadsInitialized(_PyRuntimeState *runtime)
269{
270 return gil_created(&runtime->ceval.gil);
271}
272
273int
Tim Peters7f468f22004-10-11 02:40:51 +0000274PyEval_ThreadsInitialized(void)
275{
Victor Stinner01b1cc12019-11-20 02:27:56 +0100276 _PyRuntimeState *runtime = &_PyRuntime;
Victor Stinner175a7042020-03-10 00:37:48 +0100277 return _PyEval_ThreadsInitialized(runtime);
Tim Peters7f468f22004-10-11 02:40:51 +0000278}
Victor Stinner7be4e352020-05-05 20:27:47 +0200279#endif
Tim Peters7f468f22004-10-11 02:40:51 +0000280
Victor Stinner111e4ee2020-03-09 21:24:14 +0100281PyStatus
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200282_PyEval_InitGIL(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000283{
Victor Stinner7be4e352020-05-05 20:27:47 +0200284#ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200285 if (!_Py_IsMainInterpreter(tstate)) {
286 /* Currently, the GIL is shared by all interpreters,
287 and only the main interpreter is responsible to create
288 and destroy it. */
289 return _PyStatus_OK();
Victor Stinner111e4ee2020-03-09 21:24:14 +0100290 }
Victor Stinner7be4e352020-05-05 20:27:47 +0200291#endif
Victor Stinner111e4ee2020-03-09 21:24:14 +0100292
Victor Stinner7be4e352020-05-05 20:27:47 +0200293#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
294 struct _gil_runtime_state *gil = &tstate->interp->ceval.gil;
295#else
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200296 struct _gil_runtime_state *gil = &tstate->interp->runtime->ceval.gil;
Victor Stinner7be4e352020-05-05 20:27:47 +0200297#endif
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200298 assert(!gil_created(gil));
Victor Stinner85f5a692020-03-09 22:12:04 +0100299
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200300 PyThread_init_thread();
301 create_gil(gil);
302
303 take_gil(tstate);
304
305 assert(gil_created(gil));
Victor Stinner111e4ee2020-03-09 21:24:14 +0100306 return _PyStatus_OK();
307}
308
309void
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200310_PyEval_FiniGIL(PyThreadState *tstate)
311{
Victor Stinner7be4e352020-05-05 20:27:47 +0200312#ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200313 if (!_Py_IsMainInterpreter(tstate)) {
314 /* Currently, the GIL is shared by all interpreters,
315 and only the main interpreter is responsible to create
316 and destroy it. */
317 return;
318 }
Victor Stinner7be4e352020-05-05 20:27:47 +0200319#endif
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200320
Victor Stinner7be4e352020-05-05 20:27:47 +0200321#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
322 struct _gil_runtime_state *gil = &tstate->interp->ceval.gil;
323#else
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200324 struct _gil_runtime_state *gil = &tstate->interp->runtime->ceval.gil;
Victor Stinner7be4e352020-05-05 20:27:47 +0200325#endif
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200326 if (!gil_created(gil)) {
327 /* First Py_InitializeFromConfig() call: the GIL doesn't exist
328 yet: do nothing. */
329 return;
330 }
331
332 destroy_gil(gil);
333 assert(!gil_created(gil));
334}
335
336void
Victor Stinner111e4ee2020-03-09 21:24:14 +0100337PyEval_InitThreads(void)
338{
Victor Stinnerb4698ec2020-03-10 01:28:54 +0100339 /* Do nothing: kept for backward compatibility */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000340}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000341
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000342void
Inada Naoki91234a12019-06-03 21:30:58 +0900343_PyEval_Fini(void)
344{
345#if OPCACHE_STATS
346 fprintf(stderr, "-- Opcode cache number of objects = %zd\n",
347 opcache_code_objects);
348
349 fprintf(stderr, "-- Opcode cache total extra mem = %zd\n",
350 opcache_code_objects_extra_mem);
351
352 fprintf(stderr, "\n");
353
354 fprintf(stderr, "-- Opcode cache LOAD_GLOBAL hits = %zd (%d%%)\n",
355 opcache_global_hits,
356 (int) (100.0 * opcache_global_hits /
357 (opcache_global_hits + opcache_global_misses)));
358
359 fprintf(stderr, "-- Opcode cache LOAD_GLOBAL misses = %zd (%d%%)\n",
360 opcache_global_misses,
361 (int) (100.0 * opcache_global_misses /
362 (opcache_global_hits + opcache_global_misses)));
363
364 fprintf(stderr, "-- Opcode cache LOAD_GLOBAL opts = %zd\n",
365 opcache_global_opts);
366
367 fprintf(stderr, "\n");
368#endif
369}
370
371void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000372PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000373{
Victor Stinner09532fe2019-05-10 23:39:09 +0200374 _PyRuntimeState *runtime = &_PyRuntime;
Victor Stinner09532fe2019-05-10 23:39:09 +0200375 PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime);
Victor Stinner3026cad2020-06-01 16:02:40 +0200376 _Py_EnsureTstateNotNULL(tstate);
Victor Stinnereb4e2ae2020-03-08 11:57:45 +0100377
Victor Stinner85f5a692020-03-09 22:12:04 +0100378 take_gil(tstate);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000379}
380
381void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000382PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000383{
Victor Stinner09532fe2019-05-10 23:39:09 +0200384 _PyRuntimeState *runtime = &_PyRuntime;
Victor Stinnere225beb2019-06-03 18:14:24 +0200385 PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000386 /* This function must succeed when the current thread state is NULL.
Victor Stinner50b48572018-11-01 01:51:40 +0100387 We therefore avoid PyThreadState_Get() which dumps a fatal error
Victor Stinnerda2914d2020-03-20 09:29:08 +0100388 in debug mode. */
Victor Stinner299b8c62020-05-05 17:40:18 +0200389 struct _ceval_runtime_state *ceval = &runtime->ceval;
390 struct _ceval_state *ceval2 = &tstate->interp->ceval;
391 drop_gil(ceval, ceval2, tstate);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000392}
393
394void
Victor Stinner23ef89d2020-03-18 02:26:04 +0100395_PyEval_ReleaseLock(PyThreadState *tstate)
396{
397 struct _ceval_runtime_state *ceval = &tstate->interp->runtime->ceval;
Victor Stinner0b1e3302020-05-05 16:14:31 +0200398 struct _ceval_state *ceval2 = &tstate->interp->ceval;
399 drop_gil(ceval, ceval2, tstate);
Victor Stinner23ef89d2020-03-18 02:26:04 +0100400}
401
402void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000403PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000404{
Victor Stinner3026cad2020-06-01 16:02:40 +0200405 _Py_EnsureTstateNotNULL(tstate);
Victor Stinnereb4e2ae2020-03-08 11:57:45 +0100406
Victor Stinner85f5a692020-03-09 22:12:04 +0100407 take_gil(tstate);
Victor Stinnere225beb2019-06-03 18:14:24 +0200408
Victor Stinner85f5a692020-03-09 22:12:04 +0100409 struct _gilstate_runtime_state *gilstate = &tstate->interp->runtime->gilstate;
Victor Stinnere838a932020-05-05 19:56:48 +0200410#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
411 (void)_PyThreadState_Swap(gilstate, tstate);
412#else
Victor Stinner85f5a692020-03-09 22:12:04 +0100413 if (_PyThreadState_Swap(gilstate, tstate) != NULL) {
Victor Stinner9e5d30c2020-03-07 00:54:20 +0100414 Py_FatalError("non-NULL old thread state");
Victor Stinner09532fe2019-05-10 23:39:09 +0200415 }
Victor Stinnere838a932020-05-05 19:56:48 +0200416#endif
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000417}
418
419void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000420PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000421{
Victor Stinnerda2914d2020-03-20 09:29:08 +0100422 assert(is_tstate_valid(tstate));
Victor Stinner09532fe2019-05-10 23:39:09 +0200423
Victor Stinner01b1cc12019-11-20 02:27:56 +0100424 _PyRuntimeState *runtime = tstate->interp->runtime;
Victor Stinner09532fe2019-05-10 23:39:09 +0200425 PyThreadState *new_tstate = _PyThreadState_Swap(&runtime->gilstate, NULL);
426 if (new_tstate != tstate) {
Victor Stinner9e5d30c2020-03-07 00:54:20 +0100427 Py_FatalError("wrong thread state");
Victor Stinner09532fe2019-05-10 23:39:09 +0200428 }
Victor Stinner0b1e3302020-05-05 16:14:31 +0200429 struct _ceval_runtime_state *ceval = &runtime->ceval;
430 struct _ceval_state *ceval2 = &tstate->interp->ceval;
431 drop_gil(ceval, ceval2, tstate);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000432}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000433
Dong-hee Na62f75fe2020-04-15 01:16:24 +0900434#ifdef HAVE_FORK
Antoine Pitrouf7ecfac2017-05-28 11:35:14 +0200435/* This function is called from PyOS_AfterFork_Child to destroy all threads
Victor Stinner26881c82020-06-02 15:51:37 +0200436 which are not running in the child process, and clear internal locks
437 which might be held by those threads. */
438PyStatus
Victor Stinner317bab02020-06-02 18:44:54 +0200439_PyEval_ReInitThreads(PyThreadState *tstate)
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000440{
Victor Stinner317bab02020-06-02 18:44:54 +0200441 _PyRuntimeState *runtime = tstate->interp->runtime;
Victor Stinner7be4e352020-05-05 20:27:47 +0200442
443#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
444 struct _gil_runtime_state *gil = &tstate->interp->ceval.gil;
445#else
Victor Stinner56bfdeb2020-03-18 09:26:25 +0100446 struct _gil_runtime_state *gil = &runtime->ceval.gil;
Victor Stinner7be4e352020-05-05 20:27:47 +0200447#endif
Victor Stinner56bfdeb2020-03-18 09:26:25 +0100448 if (!gil_created(gil)) {
Victor Stinner26881c82020-06-02 15:51:37 +0200449 return _PyStatus_OK();
Victor Stinner09532fe2019-05-10 23:39:09 +0200450 }
Victor Stinner56bfdeb2020-03-18 09:26:25 +0100451 recreate_gil(gil);
Victor Stinner85f5a692020-03-09 22:12:04 +0100452
453 take_gil(tstate);
Eric Snow8479a342019-03-08 23:44:33 -0700454
Victor Stinner50e6e992020-03-19 02:41:21 +0100455 struct _pending_calls *pending = &tstate->interp->ceval.pending;
Dong-hee Na62f75fe2020-04-15 01:16:24 +0900456 if (_PyThread_at_fork_reinit(&pending->lock) < 0) {
Victor Stinner26881c82020-06-02 15:51:37 +0200457 return _PyStatus_ERR("Can't reinitialize pending calls lock");
Eric Snow8479a342019-03-08 23:44:33 -0700458 }
Jesse Nollera8513972008-07-17 16:49:17 +0000459
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200460 /* Destroy all threads except the current one */
Victor Stinnereb4e2ae2020-03-08 11:57:45 +0100461 _PyThreadState_DeleteExcept(runtime, tstate);
Victor Stinner26881c82020-06-02 15:51:37 +0200462 return _PyStatus_OK();
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000463}
Dong-hee Na62f75fe2020-04-15 01:16:24 +0900464#endif
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000465
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000466/* This function is used to signal that async exceptions are waiting to be
Zackery Spytzeef05962018-09-29 10:07:11 -0600467 raised. */
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000468
469void
Victor Stinner56bfdeb2020-03-18 09:26:25 +0100470_PyEval_SignalAsyncExc(PyThreadState *tstate)
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000471{
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200472 assert(is_tstate_valid(tstate));
473 SIGNAL_ASYNC_EXC(tstate->interp);
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000474}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000475
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000476PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000477PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000478{
Victor Stinner09532fe2019-05-10 23:39:09 +0200479 _PyRuntimeState *runtime = &_PyRuntime;
Victor Stinnere838a932020-05-05 19:56:48 +0200480#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
481 PyThreadState *old_tstate = _PyThreadState_GET();
482 PyThreadState *tstate = _PyThreadState_Swap(&runtime->gilstate, old_tstate);
483#else
Victor Stinner09532fe2019-05-10 23:39:09 +0200484 PyThreadState *tstate = _PyThreadState_Swap(&runtime->gilstate, NULL);
Victor Stinnere838a932020-05-05 19:56:48 +0200485#endif
Victor Stinner3026cad2020-06-01 16:02:40 +0200486 _Py_EnsureTstateNotNULL(tstate);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100487
Victor Stinner0b1e3302020-05-05 16:14:31 +0200488 struct _ceval_runtime_state *ceval = &runtime->ceval;
489 struct _ceval_state *ceval2 = &tstate->interp->ceval;
Victor Stinner7be4e352020-05-05 20:27:47 +0200490#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
491 assert(gil_created(&ceval2->gil));
492#else
Victor Stinnere225beb2019-06-03 18:14:24 +0200493 assert(gil_created(&ceval->gil));
Victor Stinner7be4e352020-05-05 20:27:47 +0200494#endif
Victor Stinner0b1e3302020-05-05 16:14:31 +0200495 drop_gil(ceval, ceval2, tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000496 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000497}
498
499void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000500PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000501{
Victor Stinner3026cad2020-06-01 16:02:40 +0200502 _Py_EnsureTstateNotNULL(tstate);
Victor Stinnereb4e2ae2020-03-08 11:57:45 +0100503
Victor Stinner85f5a692020-03-09 22:12:04 +0100504 take_gil(tstate);
Victor Stinner17c68b82020-01-30 12:20:48 +0100505
Victor Stinner85f5a692020-03-09 22:12:04 +0100506 struct _gilstate_runtime_state *gilstate = &tstate->interp->runtime->gilstate;
507 _PyThreadState_Swap(gilstate, tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000508}
509
510
Guido van Rossuma9672091994-09-14 13:31:22 +0000511/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
512 signal handlers or Mac I/O completion routines) can schedule calls
513 to a function to be called synchronously.
514 The synchronous function is called with one void* argument.
515 It should return 0 for success or -1 for failure -- failure should
516 be accompanied by an exception.
517
518 If registry succeeds, the registry function returns 0; if it fails
519 (e.g. due to too many pending calls) it returns -1 (without setting
520 an exception condition).
521
522 Note that because registry may occur from within signal handlers,
523 or other asynchronous events, calling malloc() is unsafe!
524
Guido van Rossuma9672091994-09-14 13:31:22 +0000525 Any thread can schedule pending calls, but only the main thread
526 will execute them.
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000527 There is no facility to schedule calls to a particular thread, but
528 that should be easy to change, should that ever be required. In
529 that case, the static variables here should go into the python
530 threadstate.
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000531*/
Guido van Rossuma9672091994-09-14 13:31:22 +0000532
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200533void
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200534_PyEval_SignalReceived(PyInterpreterState *interp)
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200535{
536 /* bpo-30703: Function called when the C signal handler of Python gets a
Victor Stinner50e6e992020-03-19 02:41:21 +0100537 signal. We cannot queue a callback using _PyEval_AddPendingCall() since
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200538 that function is not async-signal-safe. */
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200539 SIGNAL_PENDING_SIGNALS(interp);
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200540}
541
Eric Snow5be45a62019-03-08 22:47:07 -0700542/* Push one item onto the queue while holding the lock. */
543static int
Victor Stinnere225beb2019-06-03 18:14:24 +0200544_push_pending_call(struct _pending_calls *pending,
Eric Snow842a2f02019-03-15 15:47:51 -0600545 int (*func)(void *), void *arg)
Eric Snow5be45a62019-03-08 22:47:07 -0700546{
Eric Snow842a2f02019-03-15 15:47:51 -0600547 int i = pending->last;
Eric Snow5be45a62019-03-08 22:47:07 -0700548 int j = (i + 1) % NPENDINGCALLS;
Eric Snow842a2f02019-03-15 15:47:51 -0600549 if (j == pending->first) {
Eric Snow5be45a62019-03-08 22:47:07 -0700550 return -1; /* Queue full */
551 }
Eric Snow842a2f02019-03-15 15:47:51 -0600552 pending->calls[i].func = func;
553 pending->calls[i].arg = arg;
554 pending->last = j;
Eric Snow5be45a62019-03-08 22:47:07 -0700555 return 0;
556}
557
558/* Pop one item off the queue while holding the lock. */
559static void
Victor Stinnere225beb2019-06-03 18:14:24 +0200560_pop_pending_call(struct _pending_calls *pending,
Eric Snow842a2f02019-03-15 15:47:51 -0600561 int (**func)(void *), void **arg)
Eric Snow5be45a62019-03-08 22:47:07 -0700562{
Eric Snow842a2f02019-03-15 15:47:51 -0600563 int i = pending->first;
564 if (i == pending->last) {
Eric Snow5be45a62019-03-08 22:47:07 -0700565 return; /* Queue empty */
566 }
567
Eric Snow842a2f02019-03-15 15:47:51 -0600568 *func = pending->calls[i].func;
569 *arg = pending->calls[i].arg;
570 pending->first = (i + 1) % NPENDINGCALLS;
Eric Snow5be45a62019-03-08 22:47:07 -0700571}
572
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200573/* This implementation is thread-safe. It allows
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000574 scheduling to be made from any thread, and even from an executing
575 callback.
576 */
577
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000578int
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200579_PyEval_AddPendingCall(PyInterpreterState *interp,
Victor Stinner09532fe2019-05-10 23:39:09 +0200580 int (*func)(void *), void *arg)
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000581{
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200582 struct _pending_calls *pending = &interp->ceval.pending;
Eric Snow842a2f02019-03-15 15:47:51 -0600583
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200584 /* Ensure that _PyEval_InitPendingCalls() was called
585 and that _PyEval_FiniPendingCalls() is not called yet. */
586 assert(pending->lock != NULL);
587
Eric Snow842a2f02019-03-15 15:47:51 -0600588 PyThread_acquire_lock(pending->lock, WAIT_LOCK);
Victor Stinnere225beb2019-06-03 18:14:24 +0200589 int result = _push_pending_call(pending, func, arg);
Eric Snow842a2f02019-03-15 15:47:51 -0600590 PyThread_release_lock(pending->lock);
Eric Snow5be45a62019-03-08 22:47:07 -0700591
Victor Stinnere225beb2019-06-03 18:14:24 +0200592 /* signal main loop */
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200593 SIGNAL_PENDING_CALLS(interp);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000594 return result;
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000595}
596
Victor Stinner09532fe2019-05-10 23:39:09 +0200597int
598Py_AddPendingCall(int (*func)(void *), void *arg)
599{
Victor Stinner50e6e992020-03-19 02:41:21 +0100600 /* Best-effort to support subinterpreters and calls with the GIL released.
601
602 First attempt _PyThreadState_GET() since it supports subinterpreters.
603
604 If the GIL is released, _PyThreadState_GET() returns NULL . In this
605 case, use PyGILState_GetThisThreadState() which works even if the GIL
606 is released.
607
608 Sadly, PyGILState_GetThisThreadState() doesn't support subinterpreters:
609 see bpo-10915 and bpo-15751.
610
Victor Stinner8849e592020-03-18 19:28:53 +0100611 Py_AddPendingCall() doesn't require the caller to hold the GIL. */
Victor Stinner50e6e992020-03-19 02:41:21 +0100612 PyThreadState *tstate = _PyThreadState_GET();
613 if (tstate == NULL) {
614 tstate = PyGILState_GetThisThreadState();
615 }
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200616
617 PyInterpreterState *interp;
618 if (tstate != NULL) {
619 interp = tstate->interp;
620 }
621 else {
622 /* Last resort: use the main interpreter */
623 interp = _PyRuntime.interpreters.main;
624 }
625 return _PyEval_AddPendingCall(interp, func, arg);
Victor Stinner09532fe2019-05-10 23:39:09 +0200626}
627
Eric Snowfdf282d2019-01-11 14:26:55 -0700628static int
Victor Stinnerd7fabc12020-03-18 01:56:21 +0100629handle_signals(PyThreadState *tstate)
Eric Snowfdf282d2019-01-11 14:26:55 -0700630{
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200631 assert(is_tstate_valid(tstate));
632 if (!_Py_ThreadCanHandleSignals(tstate->interp)) {
Eric Snow64d6cc82019-02-23 15:40:43 -0700633 return 0;
634 }
Eric Snowfdf282d2019-01-11 14:26:55 -0700635
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200636 UNSIGNAL_PENDING_SIGNALS(tstate->interp);
Victor Stinner72818982020-03-26 22:28:11 +0100637 if (_PyErr_CheckSignalsTstate(tstate) < 0) {
638 /* On failure, re-schedule a call to handle_signals(). */
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200639 SIGNAL_PENDING_SIGNALS(tstate->interp);
Eric Snowfdf282d2019-01-11 14:26:55 -0700640 return -1;
641 }
642 return 0;
643}
644
645static int
Victor Stinnerd7fabc12020-03-18 01:56:21 +0100646make_pending_calls(PyThreadState *tstate)
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000647{
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200648 assert(is_tstate_valid(tstate));
649
Victor Stinnerd8316882020-03-20 14:50:35 +0100650 /* only execute pending calls on main thread */
651 if (!_Py_ThreadCanHandlePendingCalls()) {
Victor Stinnere225beb2019-06-03 18:14:24 +0200652 return 0;
653 }
654
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000655 /* don't perform recursive pending calls */
Victor Stinnerda2914d2020-03-20 09:29:08 +0100656 static int busy = 0;
Eric Snowfdf282d2019-01-11 14:26:55 -0700657 if (busy) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000658 return 0;
Eric Snowfdf282d2019-01-11 14:26:55 -0700659 }
Charles-François Natalif23339a2011-07-23 18:15:43 +0200660 busy = 1;
Victor Stinnerda2914d2020-03-20 09:29:08 +0100661
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200662 /* unsignal before starting to call callbacks, so that any callback
663 added in-between re-signals */
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200664 UNSIGNAL_PENDING_CALLS(tstate->interp);
Eric Snowfdf282d2019-01-11 14:26:55 -0700665 int res = 0;
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200666
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000667 /* perform a bounded number of calls, in case of recursion */
Victor Stinnerda2914d2020-03-20 09:29:08 +0100668 struct _pending_calls *pending = &tstate->interp->ceval.pending;
Eric Snowfdf282d2019-01-11 14:26:55 -0700669 for (int i=0; i<NPENDINGCALLS; i++) {
Eric Snow5be45a62019-03-08 22:47:07 -0700670 int (*func)(void *) = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000671 void *arg = NULL;
672
673 /* pop one item off the queue while holding the lock */
Eric Snow842a2f02019-03-15 15:47:51 -0600674 PyThread_acquire_lock(pending->lock, WAIT_LOCK);
Victor Stinnere225beb2019-06-03 18:14:24 +0200675 _pop_pending_call(pending, &func, &arg);
Eric Snow842a2f02019-03-15 15:47:51 -0600676 PyThread_release_lock(pending->lock);
Eric Snow5be45a62019-03-08 22:47:07 -0700677
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100678 /* having released the lock, perform the callback */
Eric Snow5be45a62019-03-08 22:47:07 -0700679 if (func == NULL) {
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100680 break;
Eric Snow5be45a62019-03-08 22:47:07 -0700681 }
Eric Snowfdf282d2019-01-11 14:26:55 -0700682 res = func(arg);
683 if (res) {
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200684 goto error;
685 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000686 }
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200687
Charles-François Natalif23339a2011-07-23 18:15:43 +0200688 busy = 0;
Eric Snowfdf282d2019-01-11 14:26:55 -0700689 return res;
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200690
691error:
692 busy = 0;
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200693 SIGNAL_PENDING_CALLS(tstate->interp);
Eric Snowfdf282d2019-01-11 14:26:55 -0700694 return res;
695}
696
Eric Snow842a2f02019-03-15 15:47:51 -0600697void
Victor Stinner2b1df452020-01-13 18:46:59 +0100698_Py_FinishPendingCalls(PyThreadState *tstate)
Eric Snow842a2f02019-03-15 15:47:51 -0600699{
Eric Snow842a2f02019-03-15 15:47:51 -0600700 assert(PyGILState_Check());
701
Victor Stinner50e6e992020-03-19 02:41:21 +0100702 struct _pending_calls *pending = &tstate->interp->ceval.pending;
Victor Stinner09532fe2019-05-10 23:39:09 +0200703
Eric Snow842a2f02019-03-15 15:47:51 -0600704 if (!_Py_atomic_load_relaxed(&(pending->calls_to_do))) {
705 return;
706 }
707
Victor Stinnerd7fabc12020-03-18 01:56:21 +0100708 if (make_pending_calls(tstate) < 0) {
Victor Stinnere225beb2019-06-03 18:14:24 +0200709 PyObject *exc, *val, *tb;
710 _PyErr_Fetch(tstate, &exc, &val, &tb);
711 PyErr_BadInternalCall();
712 _PyErr_ChainExceptions(exc, val, tb);
713 _PyErr_Print(tstate);
Eric Snow842a2f02019-03-15 15:47:51 -0600714 }
715}
716
Eric Snowfdf282d2019-01-11 14:26:55 -0700717/* Py_MakePendingCalls() is a simple wrapper for the sake
718 of backward-compatibility. */
719int
720Py_MakePendingCalls(void)
721{
722 assert(PyGILState_Check());
723
Victor Stinnerd7fabc12020-03-18 01:56:21 +0100724 PyThreadState *tstate = _PyThreadState_GET();
725
Eric Snowfdf282d2019-01-11 14:26:55 -0700726 /* Python signal handler doesn't really queue a callback: it only signals
727 that a signal was received, see _PyEval_SignalReceived(). */
Victor Stinnerd7fabc12020-03-18 01:56:21 +0100728 int res = handle_signals(tstate);
Eric Snowfdf282d2019-01-11 14:26:55 -0700729 if (res != 0) {
730 return res;
731 }
732
Victor Stinnerd7fabc12020-03-18 01:56:21 +0100733 res = make_pending_calls(tstate);
Eric Snowb75b1a352019-04-12 10:20:10 -0600734 if (res != 0) {
735 return res;
736 }
737
738 return 0;
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000739}
740
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000741/* The interpreter's recursion limit */
742
Hye-Shik Changb6fa2812005-04-04 15:49:02 +0000743#ifndef Py_DEFAULT_RECURSION_LIMIT
Victor Stinner19c3ac92020-09-23 14:04:57 +0200744# define Py_DEFAULT_RECURSION_LIMIT 1000
Hye-Shik Changb6fa2812005-04-04 15:49:02 +0000745#endif
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600746
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600747void
Victor Stinnerdab84232020-03-17 18:56:44 +0100748_PyEval_InitRuntimeState(struct _ceval_runtime_state *ceval)
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600749{
Victor Stinner7be4e352020-05-05 20:27:47 +0200750#ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
Victor Stinnerdab84232020-03-17 18:56:44 +0100751 _gil_initialize(&ceval->gil);
Victor Stinner7be4e352020-05-05 20:27:47 +0200752#endif
Victor Stinnerdab84232020-03-17 18:56:44 +0100753}
754
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200755int
Victor Stinnerdab84232020-03-17 18:56:44 +0100756_PyEval_InitState(struct _ceval_state *ceval)
757{
Victor Stinner4e30ed32020-05-05 16:52:52 +0200758 ceval->recursion_limit = Py_DEFAULT_RECURSION_LIMIT;
759
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200760 struct _pending_calls *pending = &ceval->pending;
761 assert(pending->lock == NULL);
762
763 pending->lock = PyThread_allocate_lock();
764 if (pending->lock == NULL) {
765 return -1;
766 }
Victor Stinner7be4e352020-05-05 20:27:47 +0200767
768#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
769 _gil_initialize(&ceval->gil);
770#endif
771
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200772 return 0;
773}
774
775void
776_PyEval_FiniState(struct _ceval_state *ceval)
777{
778 struct _pending_calls *pending = &ceval->pending;
779 if (pending->lock != NULL) {
780 PyThread_free_lock(pending->lock);
781 pending->lock = NULL;
782 }
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600783}
784
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000785int
786Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000787{
Victor Stinner1bcc32f2020-06-10 20:08:26 +0200788 PyInterpreterState *interp = _PyInterpreterState_GET();
789 return interp->ceval.recursion_limit;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000790}
791
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000792void
793Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000794{
Victor Stinner4e30ed32020-05-05 16:52:52 +0200795 PyThreadState *tstate = _PyThreadState_GET();
796 tstate->interp->ceval.recursion_limit = new_limit;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000797}
798
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100799/* The function _Py_EnterRecursiveCall() only calls _Py_CheckRecursiveCall()
Victor Stinner19c3ac92020-09-23 14:04:57 +0200800 if the recursion_depth reaches recursion_limit.
801 If USE_STACKCHECK, the macro decrements recursion_limit
Armin Rigo2b3eb402003-10-28 12:05:48 +0000802 to guarantee that _Py_CheckRecursiveCall() is regularly called.
803 Without USE_STACKCHECK, there is no need for this. */
804int
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100805_Py_CheckRecursiveCall(PyThreadState *tstate, const char *where)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000806{
Victor Stinner4e30ed32020-05-05 16:52:52 +0200807 int recursion_limit = tstate->interp->ceval.recursion_limit;
Armin Rigo2b3eb402003-10-28 12:05:48 +0000808
809#ifdef USE_STACKCHECK
pdox18967932017-10-25 23:03:01 -0700810 tstate->stackcheck_counter = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000811 if (PyOS_CheckStack()) {
812 --tstate->recursion_depth;
Victor Stinner438a12d2019-05-24 17:01:38 +0200813 _PyErr_SetString(tstate, PyExc_MemoryError, "Stack overflow");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000814 return -1;
815 }
pdox18967932017-10-25 23:03:01 -0700816#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000817 if (tstate->recursion_critical)
818 /* Somebody asked that we don't check for recursion. */
819 return 0;
820 if (tstate->overflowed) {
821 if (tstate->recursion_depth > recursion_limit + 50) {
822 /* Overflowing while handling an overflow. Give up. */
823 Py_FatalError("Cannot recover from stack overflow.");
824 }
825 return 0;
826 }
827 if (tstate->recursion_depth > recursion_limit) {
828 --tstate->recursion_depth;
829 tstate->overflowed = 1;
Victor Stinner438a12d2019-05-24 17:01:38 +0200830 _PyErr_Format(tstate, PyExc_RecursionError,
831 "maximum recursion depth exceeded%s",
832 where);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000833 return -1;
834 }
835 return 0;
Armin Rigo2b3eb402003-10-28 12:05:48 +0000836}
837
Victor Stinner09532fe2019-05-10 23:39:09 +0200838static int do_raise(PyThreadState *tstate, PyObject *exc, PyObject *cause);
Victor Stinner438a12d2019-05-24 17:01:38 +0200839static int unpack_iterable(PyThreadState *, PyObject *, int, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000840
Victor Stinnere225beb2019-06-03 18:14:24 +0200841#define _Py_TracingPossible(ceval) ((ceval)->tracing_possible)
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000842
Guido van Rossum374a9221991-04-04 10:40:29 +0000843
Guido van Rossumb209a111997-04-29 18:18:01 +0000844PyObject *
Martin v. Löwis4d0d4712010-12-03 20:14:31 +0000845PyEval_EvalCode(PyObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000846{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000847 return PyEval_EvalCodeEx(co,
848 globals, locals,
849 (PyObject **)NULL, 0,
850 (PyObject **)NULL, 0,
851 (PyObject **)NULL, 0,
852 NULL, NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000853}
854
855
856/* Interpreter main loop */
857
Martin v. Löwis8d97e332004-06-27 15:43:12 +0000858PyObject *
Victor Stinnerb9e68122019-11-14 12:20:46 +0100859PyEval_EvalFrame(PyFrameObject *f)
860{
Victor Stinner0b72b232020-03-12 23:18:39 +0100861 /* Function kept for backward compatibility */
Victor Stinnerb9e68122019-11-14 12:20:46 +0100862 PyThreadState *tstate = _PyThreadState_GET();
863 return _PyEval_EvalFrame(tstate, f, 0);
Phillip J. Eby0d6615f2005-08-02 00:46:46 +0000864}
865
866PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000867PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
Guido van Rossum374a9221991-04-04 10:40:29 +0000868{
Victor Stinnerb9e68122019-11-14 12:20:46 +0100869 PyThreadState *tstate = _PyThreadState_GET();
870 return _PyEval_EvalFrame(tstate, f, throwflag);
Brett Cannon3cebf932016-09-05 15:33:46 -0700871}
872
Victor Stinnerda2914d2020-03-20 09:29:08 +0100873
874/* Handle signals, pending calls, GIL drop request
875 and asynchronous exception */
876static int
877eval_frame_handle_pending(PyThreadState *tstate)
878{
Victor Stinnerda2914d2020-03-20 09:29:08 +0100879 _PyRuntimeState * const runtime = &_PyRuntime;
880 struct _ceval_runtime_state *ceval = &runtime->ceval;
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200881
882 /* Pending signals */
Victor Stinner299b8c62020-05-05 17:40:18 +0200883 if (_Py_atomic_load_relaxed(&ceval->signals_pending)) {
Victor Stinnerda2914d2020-03-20 09:29:08 +0100884 if (handle_signals(tstate) != 0) {
885 return -1;
886 }
887 }
888
889 /* Pending calls */
Victor Stinner299b8c62020-05-05 17:40:18 +0200890 struct _ceval_state *ceval2 = &tstate->interp->ceval;
Victor Stinnerda2914d2020-03-20 09:29:08 +0100891 if (_Py_atomic_load_relaxed(&ceval2->pending.calls_to_do)) {
892 if (make_pending_calls(tstate) != 0) {
893 return -1;
894 }
895 }
896
897 /* GIL drop request */
Victor Stinner0b1e3302020-05-05 16:14:31 +0200898 if (_Py_atomic_load_relaxed(&ceval2->gil_drop_request)) {
Victor Stinnerda2914d2020-03-20 09:29:08 +0100899 /* Give another thread a chance */
900 if (_PyThreadState_Swap(&runtime->gilstate, NULL) != tstate) {
901 Py_FatalError("tstate mix-up");
902 }
Victor Stinner0b1e3302020-05-05 16:14:31 +0200903 drop_gil(ceval, ceval2, tstate);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100904
905 /* Other threads may run now */
906
907 take_gil(tstate);
908
Victor Stinnere838a932020-05-05 19:56:48 +0200909#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
910 (void)_PyThreadState_Swap(&runtime->gilstate, tstate);
911#else
Victor Stinnerda2914d2020-03-20 09:29:08 +0100912 if (_PyThreadState_Swap(&runtime->gilstate, tstate) != NULL) {
913 Py_FatalError("orphan tstate");
914 }
Victor Stinnere838a932020-05-05 19:56:48 +0200915#endif
Victor Stinnerda2914d2020-03-20 09:29:08 +0100916 }
917
918 /* Check for asynchronous exception. */
919 if (tstate->async_exc != NULL) {
920 PyObject *exc = tstate->async_exc;
921 tstate->async_exc = NULL;
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200922 UNSIGNAL_ASYNC_EXC(tstate->interp);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100923 _PyErr_SetNone(tstate, exc);
924 Py_DECREF(exc);
925 return -1;
926 }
927
928 return 0;
929}
930
Victor Stinnerc6944e72016-11-11 02:13:35 +0100931PyObject* _Py_HOT_FUNCTION
Victor Stinner0b72b232020-03-12 23:18:39 +0100932_PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag)
Brett Cannon3cebf932016-09-05 15:33:46 -0700933{
Victor Stinner3026cad2020-06-01 16:02:40 +0200934 _Py_EnsureTstateNotNULL(tstate);
Victor Stinner0b72b232020-03-12 23:18:39 +0100935
Guido van Rossum950361c1997-01-24 13:49:28 +0000936#ifdef DXPAIRS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000937 int lastopcode = 0;
Guido van Rossum950361c1997-01-24 13:49:28 +0000938#endif
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200939 PyObject **stack_pointer; /* Next free slot in value stack */
Serhiy Storchakaab874002016-09-11 13:48:15 +0300940 const _Py_CODEUNIT *next_instr;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200941 int opcode; /* Current opcode */
942 int oparg; /* Current opcode argument, if any */
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200943 PyObject **fastlocals, **freevars;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000944 PyObject *retval = NULL; /* Return value */
Victor Stinnerdab84232020-03-17 18:56:44 +0100945 struct _ceval_state * const ceval2 = &tstate->interp->ceval;
Victor Stinner50e6e992020-03-19 02:41:21 +0100946 _Py_atomic_int * const eval_breaker = &ceval2->eval_breaker;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000947 PyCodeObject *co;
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000948
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000949 /* when tracing we set things up so that
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000950
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000951 not (instr_lb <= current_bytecode_offset < instr_ub)
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000952
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000953 is true when the line being executed has changed. The
954 initial values are such as to make this false the first
955 time it is tested. */
956 int instr_ub = -1, instr_lb = 0, instr_prev = -1;
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000957
Serhiy Storchakaab874002016-09-11 13:48:15 +0300958 const _Py_CODEUNIT *first_instr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000959 PyObject *names;
960 PyObject *consts;
Inada Naoki91234a12019-06-03 21:30:58 +0900961 _PyOpcache *co_opcache;
Guido van Rossum374a9221991-04-04 10:40:29 +0000962
Brett Cannon368b4b72012-04-02 12:17:59 -0400963#ifdef LLTRACE
Victor Stinner3c1e4812012-03-26 22:10:51 +0200964 _Py_IDENTIFIER(__ltrace__);
Brett Cannon368b4b72012-04-02 12:17:59 -0400965#endif
Victor Stinner3c1e4812012-03-26 22:10:51 +0200966
Antoine Pitroub52ec782009-01-25 16:34:23 +0000967/* Computed GOTOs, or
968 the-optimization-commonly-but-improperly-known-as-"threaded code"
969 using gcc's labels-as-values extension
970 (http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html).
971
972 The traditional bytecode evaluation loop uses a "switch" statement, which
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000973 decent compilers will optimize as a single indirect branch instruction
Antoine Pitroub52ec782009-01-25 16:34:23 +0000974 combined with a lookup table of jump addresses. However, since the
975 indirect jump instruction is shared by all opcodes, the CPU will have a
976 hard time making the right prediction for where to jump next (actually,
977 it will be always wrong except in the uncommon case of a sequence of
978 several identical opcodes).
979
980 "Threaded code" in contrast, uses an explicit jump table and an explicit
981 indirect jump instruction at the end of each opcode. Since the jump
982 instruction is at a different address for each opcode, the CPU will make a
983 separate prediction for each of these instructions, which is equivalent to
984 predicting the second opcode of each opcode pair. These predictions have
985 a much better chance to turn out valid, especially in small bytecode loops.
986
987 A mispredicted branch on a modern CPU flushes the whole pipeline and
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000988 can cost several CPU cycles (depending on the pipeline depth),
Antoine Pitroub52ec782009-01-25 16:34:23 +0000989 and potentially many more instructions (depending on the pipeline width).
990 A correctly predicted branch, however, is nearly free.
991
992 At the time of this writing, the "threaded code" version is up to 15-20%
993 faster than the normal "switch" version, depending on the compiler and the
994 CPU architecture.
995
996 We disable the optimization if DYNAMIC_EXECUTION_PROFILE is defined,
997 because it would render the measurements invalid.
998
999
1000 NOTE: care must be taken that the compiler doesn't try to "optimize" the
1001 indirect jumps by sharing them between all opcodes. Such optimizations
1002 can be disabled on gcc by using the -fno-gcse flag (or possibly
1003 -fno-crossjumping).
1004*/
1005
Antoine Pitrou042b1282010-08-13 21:15:58 +00001006#ifdef DYNAMIC_EXECUTION_PROFILE
Antoine Pitroub52ec782009-01-25 16:34:23 +00001007#undef USE_COMPUTED_GOTOS
Antoine Pitrou042b1282010-08-13 21:15:58 +00001008#define USE_COMPUTED_GOTOS 0
Antoine Pitroub52ec782009-01-25 16:34:23 +00001009#endif
1010
Antoine Pitrou042b1282010-08-13 21:15:58 +00001011#ifdef HAVE_COMPUTED_GOTOS
1012 #ifndef USE_COMPUTED_GOTOS
1013 #define USE_COMPUTED_GOTOS 1
1014 #endif
1015#else
1016 #if defined(USE_COMPUTED_GOTOS) && USE_COMPUTED_GOTOS
1017 #error "Computed gotos are not supported on this compiler."
1018 #endif
1019 #undef USE_COMPUTED_GOTOS
1020 #define USE_COMPUTED_GOTOS 0
1021#endif
1022
1023#if USE_COMPUTED_GOTOS
Antoine Pitroub52ec782009-01-25 16:34:23 +00001024/* Import the static jump table */
1025#include "opcode_targets.h"
1026
Antoine Pitroub52ec782009-01-25 16:34:23 +00001027#define TARGET(op) \
Benjamin Petersonddd19492018-09-16 22:38:02 -07001028 op: \
1029 TARGET_##op
Antoine Pitroub52ec782009-01-25 16:34:23 +00001030
Antoine Pitroub52ec782009-01-25 16:34:23 +00001031#ifdef LLTRACE
1032#define FAST_DISPATCH() \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001033 { \
Victor Stinnerdab84232020-03-17 18:56:44 +01001034 if (!lltrace && !_Py_TracingPossible(ceval2) && !PyDTrace_LINE_ENABLED()) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001035 f->f_lasti = INSTR_OFFSET(); \
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001036 NEXTOPARG(); \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001037 goto *opcode_targets[opcode]; \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001038 } \
1039 goto fast_next_opcode; \
1040 }
Antoine Pitroub52ec782009-01-25 16:34:23 +00001041#else
1042#define FAST_DISPATCH() \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001043 { \
Victor Stinnerdab84232020-03-17 18:56:44 +01001044 if (!_Py_TracingPossible(ceval2) && !PyDTrace_LINE_ENABLED()) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001045 f->f_lasti = INSTR_OFFSET(); \
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001046 NEXTOPARG(); \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001047 goto *opcode_targets[opcode]; \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001048 } \
1049 goto fast_next_opcode; \
1050 }
Antoine Pitroub52ec782009-01-25 16:34:23 +00001051#endif
1052
Victor Stinner09532fe2019-05-10 23:39:09 +02001053#define DISPATCH() \
1054 { \
1055 if (!_Py_atomic_load_relaxed(eval_breaker)) { \
1056 FAST_DISPATCH(); \
1057 } \
1058 continue; \
1059 }
1060
Antoine Pitroub52ec782009-01-25 16:34:23 +00001061#else
Benjamin Petersonddd19492018-09-16 22:38:02 -07001062#define TARGET(op) op
Antoine Pitroub52ec782009-01-25 16:34:23 +00001063#define FAST_DISPATCH() goto fast_next_opcode
Victor Stinner09532fe2019-05-10 23:39:09 +02001064#define DISPATCH() continue
Antoine Pitroub52ec782009-01-25 16:34:23 +00001065#endif
1066
1067
Neal Norwitza81d2202002-07-14 00:27:26 +00001068/* Tuple access macros */
1069
1070#ifndef Py_DEBUG
1071#define GETITEM(v, i) PyTuple_GET_ITEM((PyTupleObject *)(v), (i))
1072#else
1073#define GETITEM(v, i) PyTuple_GetItem((v), (i))
1074#endif
1075
Guido van Rossum374a9221991-04-04 10:40:29 +00001076/* Code access macros */
1077
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001078/* The integer overflow is checked by an assertion below. */
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001079#define INSTR_OFFSET() \
1080 (sizeof(_Py_CODEUNIT) * (int)(next_instr - first_instr))
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001081#define NEXTOPARG() do { \
Serhiy Storchakaab874002016-09-11 13:48:15 +03001082 _Py_CODEUNIT word = *next_instr; \
1083 opcode = _Py_OPCODE(word); \
1084 oparg = _Py_OPARG(word); \
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001085 next_instr++; \
1086 } while (0)
Serhiy Storchakaab874002016-09-11 13:48:15 +03001087#define JUMPTO(x) (next_instr = first_instr + (x) / sizeof(_Py_CODEUNIT))
1088#define JUMPBY(x) (next_instr += (x) / sizeof(_Py_CODEUNIT))
Guido van Rossum374a9221991-04-04 10:40:29 +00001089
Raymond Hettingerf606f872003-03-16 03:11:04 +00001090/* OpCode prediction macros
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001091 Some opcodes tend to come in pairs thus making it possible to
1092 predict the second code when the first is run. For example,
Serhiy Storchakada9c5132016-06-27 18:58:57 +03001093 COMPARE_OP is often followed by POP_JUMP_IF_FALSE or POP_JUMP_IF_TRUE.
Raymond Hettingerf606f872003-03-16 03:11:04 +00001094
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001095 Verifying the prediction costs a single high-speed test of a register
1096 variable against a constant. If the pairing was good, then the
1097 processor's own internal branch predication has a high likelihood of
1098 success, resulting in a nearly zero-overhead transition to the
1099 next opcode. A successful prediction saves a trip through the eval-loop
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001100 including its unpredictable switch-case branch. Combined with the
1101 processor's internal branch prediction, a successful PREDICT has the
1102 effect of making the two opcodes run as if they were a single new opcode
1103 with the bodies combined.
Raymond Hettingerf606f872003-03-16 03:11:04 +00001104
Georg Brandl86b2fb92008-07-16 03:43:04 +00001105 If collecting opcode statistics, your choices are to either keep the
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001106 predictions turned-on and interpret the results as if some opcodes
1107 had been combined or turn-off predictions so that the opcode frequency
1108 counter updates for both opcodes.
Antoine Pitroub52ec782009-01-25 16:34:23 +00001109
1110 Opcode prediction is disabled with threaded code, since the latter allows
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001111 the CPU to record separate branch prediction information for each
1112 opcode.
Antoine Pitroub52ec782009-01-25 16:34:23 +00001113
Raymond Hettingerf606f872003-03-16 03:11:04 +00001114*/
1115
Denis Chernikovbaf29b22020-02-21 12:17:50 +03001116#define PREDICT_ID(op) PRED_##op
1117
Antoine Pitrou042b1282010-08-13 21:15:58 +00001118#if defined(DYNAMIC_EXECUTION_PROFILE) || USE_COMPUTED_GOTOS
Denis Chernikovbaf29b22020-02-21 12:17:50 +03001119#define PREDICT(op) if (0) goto PREDICT_ID(op)
Raymond Hettingera7216982004-02-08 19:59:27 +00001120#else
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001121#define PREDICT(op) \
Denis Chernikovbaf29b22020-02-21 12:17:50 +03001122 do { \
Serhiy Storchakaab874002016-09-11 13:48:15 +03001123 _Py_CODEUNIT word = *next_instr; \
1124 opcode = _Py_OPCODE(word); \
Denis Chernikovbaf29b22020-02-21 12:17:50 +03001125 if (opcode == op) { \
Serhiy Storchakaab874002016-09-11 13:48:15 +03001126 oparg = _Py_OPARG(word); \
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001127 next_instr++; \
Denis Chernikovbaf29b22020-02-21 12:17:50 +03001128 goto PREDICT_ID(op); \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001129 } \
1130 } while(0)
Antoine Pitroub52ec782009-01-25 16:34:23 +00001131#endif
Denis Chernikovbaf29b22020-02-21 12:17:50 +03001132#define PREDICTED(op) PREDICT_ID(op):
Antoine Pitroub52ec782009-01-25 16:34:23 +00001133
Raymond Hettingerf606f872003-03-16 03:11:04 +00001134
Guido van Rossum374a9221991-04-04 10:40:29 +00001135/* Stack manipulation macros */
1136
Martin v. Löwis18e16552006-02-15 17:27:45 +00001137/* The stack can grow at most MAXINT deep, as co_nlocals and
1138 co_stacksize are ints. */
Stefan Krahb7e10102010-06-23 18:42:39 +00001139#define STACK_LEVEL() ((int)(stack_pointer - f->f_valuestack))
1140#define EMPTY() (STACK_LEVEL() == 0)
1141#define TOP() (stack_pointer[-1])
1142#define SECOND() (stack_pointer[-2])
1143#define THIRD() (stack_pointer[-3])
1144#define FOURTH() (stack_pointer[-4])
1145#define PEEK(n) (stack_pointer[-(n)])
1146#define SET_TOP(v) (stack_pointer[-1] = (v))
1147#define SET_SECOND(v) (stack_pointer[-2] = (v))
1148#define SET_THIRD(v) (stack_pointer[-3] = (v))
1149#define SET_FOURTH(v) (stack_pointer[-4] = (v))
Stefan Krahb7e10102010-06-23 18:42:39 +00001150#define BASIC_STACKADJ(n) (stack_pointer += n)
1151#define BASIC_PUSH(v) (*stack_pointer++ = (v))
1152#define BASIC_POP() (*--stack_pointer)
Guido van Rossum374a9221991-04-04 10:40:29 +00001153
Guido van Rossum96a42c81992-01-12 02:29:51 +00001154#ifdef LLTRACE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001155#define PUSH(v) { (void)(BASIC_PUSH(v), \
Victor Stinner438a12d2019-05-24 17:01:38 +02001156 lltrace && prtrace(tstate, TOP(), "push")); \
Stefan Krahb7e10102010-06-23 18:42:39 +00001157 assert(STACK_LEVEL() <= co->co_stacksize); }
Victor Stinner438a12d2019-05-24 17:01:38 +02001158#define POP() ((void)(lltrace && prtrace(tstate, TOP(), "pop")), \
Stefan Krahb7e10102010-06-23 18:42:39 +00001159 BASIC_POP())
costypetrisor8ed317f2018-07-31 20:55:14 +00001160#define STACK_GROW(n) do { \
1161 assert(n >= 0); \
1162 (void)(BASIC_STACKADJ(n), \
Victor Stinner438a12d2019-05-24 17:01:38 +02001163 lltrace && prtrace(tstate, TOP(), "stackadj")); \
costypetrisor8ed317f2018-07-31 20:55:14 +00001164 assert(STACK_LEVEL() <= co->co_stacksize); \
1165 } while (0)
1166#define STACK_SHRINK(n) do { \
1167 assert(n >= 0); \
Victor Stinner438a12d2019-05-24 17:01:38 +02001168 (void)(lltrace && prtrace(tstate, TOP(), "stackadj")); \
costypetrisor8ed317f2018-07-31 20:55:14 +00001169 (void)(BASIC_STACKADJ(-n)); \
1170 assert(STACK_LEVEL() <= co->co_stacksize); \
1171 } while (0)
Christian Heimes0449f632007-12-15 01:27:15 +00001172#define EXT_POP(STACK_POINTER) ((void)(lltrace && \
Victor Stinner438a12d2019-05-24 17:01:38 +02001173 prtrace(tstate, (STACK_POINTER)[-1], "ext_pop")), \
Stefan Krahb7e10102010-06-23 18:42:39 +00001174 *--(STACK_POINTER))
Guido van Rossum374a9221991-04-04 10:40:29 +00001175#else
Stefan Krahb7e10102010-06-23 18:42:39 +00001176#define PUSH(v) BASIC_PUSH(v)
1177#define POP() BASIC_POP()
costypetrisor8ed317f2018-07-31 20:55:14 +00001178#define STACK_GROW(n) BASIC_STACKADJ(n)
1179#define STACK_SHRINK(n) BASIC_STACKADJ(-n)
Guido van Rossumc2e20742006-02-27 22:32:47 +00001180#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
Guido van Rossum374a9221991-04-04 10:40:29 +00001181#endif
1182
Guido van Rossum681d79a1995-07-18 14:51:37 +00001183/* Local variable macros */
1184
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001185#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumcfbf1a32002-03-28 20:17:52 +00001186
1187/* The SETLOCAL() macro must not DECREF the local variable in-place and
1188 then store the new value; it must copy the old value to a temporary
1189 value, then store the new value, and then DECREF the temporary value.
1190 This is because it is possible that during the DECREF the frame is
1191 accessed by other code (e.g. a __del__ method or gc.collect()) and the
1192 variable would be pointing to already-freed memory. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001193#define SETLOCAL(i, value) do { PyObject *tmp = GETLOCAL(i); \
Stefan Krahb7e10102010-06-23 18:42:39 +00001194 GETLOCAL(i) = value; \
1195 Py_XDECREF(tmp); } while (0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00001196
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001197
1198#define UNWIND_BLOCK(b) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001199 while (STACK_LEVEL() > (b)->b_level) { \
1200 PyObject *v = POP(); \
1201 Py_XDECREF(v); \
1202 }
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001203
1204#define UNWIND_EXCEPT_HANDLER(b) \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001205 do { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001206 PyObject *type, *value, *traceback; \
Mark Shannonae3087c2017-10-22 22:41:51 +01001207 _PyErr_StackItem *exc_info; \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001208 assert(STACK_LEVEL() >= (b)->b_level + 3); \
1209 while (STACK_LEVEL() > (b)->b_level + 3) { \
1210 value = POP(); \
1211 Py_XDECREF(value); \
1212 } \
Mark Shannonae3087c2017-10-22 22:41:51 +01001213 exc_info = tstate->exc_info; \
1214 type = exc_info->exc_type; \
1215 value = exc_info->exc_value; \
1216 traceback = exc_info->exc_traceback; \
1217 exc_info->exc_type = POP(); \
1218 exc_info->exc_value = POP(); \
1219 exc_info->exc_traceback = POP(); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001220 Py_XDECREF(type); \
1221 Py_XDECREF(value); \
1222 Py_XDECREF(traceback); \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001223 } while(0)
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001224
Inada Naoki91234a12019-06-03 21:30:58 +09001225 /* macros for opcode cache */
1226#define OPCACHE_CHECK() \
1227 do { \
1228 co_opcache = NULL; \
1229 if (co->co_opcache != NULL) { \
1230 unsigned char co_opt_offset = \
1231 co->co_opcache_map[next_instr - first_instr]; \
1232 if (co_opt_offset > 0) { \
1233 assert(co_opt_offset <= co->co_opcache_size); \
1234 co_opcache = &co->co_opcache[co_opt_offset - 1]; \
1235 assert(co_opcache != NULL); \
Inada Naoki91234a12019-06-03 21:30:58 +09001236 } \
1237 } \
1238 } while (0)
1239
1240#if OPCACHE_STATS
1241
1242#define OPCACHE_STAT_GLOBAL_HIT() \
1243 do { \
1244 if (co->co_opcache != NULL) opcache_global_hits++; \
1245 } while (0)
1246
1247#define OPCACHE_STAT_GLOBAL_MISS() \
1248 do { \
1249 if (co->co_opcache != NULL) opcache_global_misses++; \
1250 } while (0)
1251
1252#define OPCACHE_STAT_GLOBAL_OPT() \
1253 do { \
1254 if (co->co_opcache != NULL) opcache_global_opts++; \
1255 } while (0)
1256
1257#else /* OPCACHE_STATS */
1258
1259#define OPCACHE_STAT_GLOBAL_HIT()
1260#define OPCACHE_STAT_GLOBAL_MISS()
1261#define OPCACHE_STAT_GLOBAL_OPT()
1262
1263#endif
1264
Guido van Rossuma027efa1997-05-05 20:56:21 +00001265/* Start of code */
1266
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001267 /* push frame */
Victor Stinnerbe434dc2019-11-05 00:51:22 +01001268 if (_Py_EnterRecursiveCall(tstate, "")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001269 return NULL;
Victor Stinnerbe434dc2019-11-05 00:51:22 +01001270 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001271
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001272 tstate->frame = f;
Tim Peters5ca576e2001-06-18 22:08:13 +00001273
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001274 if (tstate->use_tracing) {
1275 if (tstate->c_tracefunc != NULL) {
1276 /* tstate->c_tracefunc, if defined, is a
1277 function that will be called on *every* entry
1278 to a code block. Its return value, if not
1279 None, is a function that will be called at
1280 the start of each executed line of code.
1281 (Actually, the function must return itself
1282 in order to continue tracing.) The trace
1283 functions are called with three arguments:
1284 a pointer to the current frame, a string
1285 indicating why the function is called, and
1286 an argument which depends on the situation.
1287 The global trace function is also called
1288 whenever an exception is detected. */
1289 if (call_trace_protected(tstate->c_tracefunc,
1290 tstate->c_traceobj,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01001291 tstate, f, PyTrace_CALL, Py_None)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001292 /* Trace function raised an error */
1293 goto exit_eval_frame;
1294 }
1295 }
1296 if (tstate->c_profilefunc != NULL) {
1297 /* Similar for c_profilefunc, except it needn't
1298 return itself and isn't called for "line" events */
1299 if (call_trace_protected(tstate->c_profilefunc,
1300 tstate->c_profileobj,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01001301 tstate, f, PyTrace_CALL, Py_None)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001302 /* Profile function raised an error */
1303 goto exit_eval_frame;
1304 }
1305 }
1306 }
Neil Schemenauer6c0f2002001-09-04 19:03:35 +00001307
Łukasz Langaa785c872016-09-09 17:37:37 -07001308 if (PyDTrace_FUNCTION_ENTRY_ENABLED())
1309 dtrace_function_entry(f);
1310
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001311 co = f->f_code;
1312 names = co->co_names;
1313 consts = co->co_consts;
1314 fastlocals = f->f_localsplus;
1315 freevars = f->f_localsplus + co->co_nlocals;
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001316 assert(PyBytes_Check(co->co_code));
1317 assert(PyBytes_GET_SIZE(co->co_code) <= INT_MAX);
Serhiy Storchakaab874002016-09-11 13:48:15 +03001318 assert(PyBytes_GET_SIZE(co->co_code) % sizeof(_Py_CODEUNIT) == 0);
1319 assert(_Py_IS_ALIGNED(PyBytes_AS_STRING(co->co_code), sizeof(_Py_CODEUNIT)));
1320 first_instr = (_Py_CODEUNIT *) PyBytes_AS_STRING(co->co_code);
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001321 /*
1322 f->f_lasti refers to the index of the last instruction,
1323 unless it's -1 in which case next_instr should be first_instr.
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001324
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001325 YIELD_FROM sets f_lasti to itself, in order to repeatedly yield
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05001326 multiple values.
Thomas Wouters902d6eb2007-01-09 23:18:33 +00001327
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001328 When the PREDICT() macros are enabled, some opcode pairs follow in
1329 direct succession without updating f->f_lasti. A successful
1330 prediction effectively links the two codes together as if they
1331 were a single new opcode; accordingly,f->f_lasti will point to
1332 the first code in the pair (for instance, GET_ITER followed by
1333 FOR_ITER is effectively a single opcode and f->f_lasti will point
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001334 to the beginning of the combined pair.)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001335 */
Serhiy Storchakaab874002016-09-11 13:48:15 +03001336 assert(f->f_lasti >= -1);
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001337 next_instr = first_instr;
1338 if (f->f_lasti >= 0) {
Serhiy Storchakaab874002016-09-11 13:48:15 +03001339 assert(f->f_lasti % sizeof(_Py_CODEUNIT) == 0);
1340 next_instr += f->f_lasti / sizeof(_Py_CODEUNIT) + 1;
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001341 }
Mark Shannoncb9879b2020-07-17 11:44:23 +01001342 stack_pointer = f->f_valuestack + f->f_stackdepth;
1343 /* Set f->f_stackdepth to -1.
1344 * Update when returning or calling trace function.
1345 Having f_stackdepth <= 0 ensures that invalid
1346 values are not visible to the cycle GC.
1347 We choose -1 rather than 0 to assist debugging.
1348 */
1349 f->f_stackdepth = -1;
1350 f->f_state = FRAME_EXECUTING;
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001351
Inada Naoki91234a12019-06-03 21:30:58 +09001352 if (co->co_opcache_flag < OPCACHE_MIN_RUNS) {
1353 co->co_opcache_flag++;
1354 if (co->co_opcache_flag == OPCACHE_MIN_RUNS) {
1355 if (_PyCode_InitOpcache(co) < 0) {
Victor Stinner25104942020-04-24 02:43:18 +02001356 goto exit_eval_frame;
Inada Naoki91234a12019-06-03 21:30:58 +09001357 }
1358#if OPCACHE_STATS
1359 opcache_code_objects_extra_mem +=
1360 PyBytes_Size(co->co_code) / sizeof(_Py_CODEUNIT) +
1361 sizeof(_PyOpcache) * co->co_opcache_size;
1362 opcache_code_objects++;
1363#endif
1364 }
1365 }
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001366
Tim Peters5ca576e2001-06-18 22:08:13 +00001367#ifdef LLTRACE
Victor Stinner3c1e4812012-03-26 22:10:51 +02001368 lltrace = _PyDict_GetItemId(f->f_globals, &PyId___ltrace__) != NULL;
Tim Peters5ca576e2001-06-18 22:08:13 +00001369#endif
Guido van Rossumac7be682001-01-17 15:42:30 +00001370
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001371 if (throwflag) /* support for generator.throw() */
1372 goto error;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001373
Victor Stinnerace47d72013-07-18 01:41:08 +02001374#ifdef Py_DEBUG
Victor Stinner0b72b232020-03-12 23:18:39 +01001375 /* _PyEval_EvalFrameDefault() must not be called with an exception set,
Victor Stinnera8cb5152017-01-18 14:12:51 +01001376 because it can clear it (directly or indirectly) and so the
Martin Panter9955a372015-10-07 10:26:23 +00001377 caller loses its exception */
Victor Stinner438a12d2019-05-24 17:01:38 +02001378 assert(!_PyErr_Occurred(tstate));
Victor Stinnerace47d72013-07-18 01:41:08 +02001379#endif
1380
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001381main_loop:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001382 for (;;) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001383 assert(stack_pointer >= f->f_valuestack); /* else underflow */
1384 assert(STACK_LEVEL() <= co->co_stacksize); /* else overflow */
Victor Stinner438a12d2019-05-24 17:01:38 +02001385 assert(!_PyErr_Occurred(tstate));
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001386
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001387 /* Do periodic things. Doing this every time through
1388 the loop would add too much overhead, so we do it
1389 only every Nth instruction. We also do it if
Chris Jerdonek4a12d122020-05-14 19:25:45 -07001390 ``pending.calls_to_do'' is set, i.e. when an asynchronous
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001391 event needs attention (e.g. a signal handler or
1392 async I/O handler); see Py_AddPendingCall() and
1393 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +00001394
Eric Snow7bda9de2019-03-08 17:25:54 -07001395 if (_Py_atomic_load_relaxed(eval_breaker)) {
Serhiy Storchaka3f4d90d2018-07-09 15:40:14 +03001396 opcode = _Py_OPCODE(*next_instr);
1397 if (opcode == SETUP_FINALLY ||
1398 opcode == SETUP_WITH ||
1399 opcode == BEFORE_ASYNC_WITH ||
1400 opcode == YIELD_FROM) {
1401 /* Few cases where we skip running signal handlers and other
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07001402 pending calls:
Serhiy Storchaka3f4d90d2018-07-09 15:40:14 +03001403 - If we're about to enter the 'with:'. It will prevent
1404 emitting a resource warning in the common idiom
1405 'with open(path) as file:'.
1406 - If we're about to enter the 'async with:'.
1407 - If we're about to enter the 'try:' of a try/finally (not
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07001408 *very* useful, but might help in some cases and it's
1409 traditional)
1410 - If we're resuming a chain of nested 'yield from' or
1411 'await' calls, then each frame is parked with YIELD_FROM
1412 as its next opcode. If the user hit control-C we want to
1413 wait until we've reached the innermost frame before
1414 running the signal handler and raising KeyboardInterrupt
1415 (see bpo-30039).
1416 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001417 goto fast_next_opcode;
1418 }
Eric Snowfdf282d2019-01-11 14:26:55 -07001419
Victor Stinnerda2914d2020-03-20 09:29:08 +01001420 if (eval_frame_handle_pending(tstate) != 0) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001421 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001422 }
1423 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001424
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001425 fast_next_opcode:
1426 f->f_lasti = INSTR_OFFSET();
Guido van Rossumac7be682001-01-17 15:42:30 +00001427
Łukasz Langaa785c872016-09-09 17:37:37 -07001428 if (PyDTrace_LINE_ENABLED())
1429 maybe_dtrace_line(f, &instr_lb, &instr_ub, &instr_prev);
1430
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001431 /* line-by-line tracing support */
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001432
Victor Stinnerdab84232020-03-17 18:56:44 +01001433 if (_Py_TracingPossible(ceval2) &&
Benjamin Peterson51f46162013-01-23 08:38:47 -05001434 tstate->c_tracefunc != NULL && !tstate->tracing) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001435 int err;
Victor Stinnerb7d8d8d2020-09-23 14:07:16 +02001436 /* see maybe_call_line_trace()
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001437 for expository comments */
Victor Stinnerb7d8d8d2020-09-23 14:07:16 +02001438 f->f_stackdepth = (int)(stack_pointer - f->f_valuestack);
Tim Peters8a5c3c72004-04-05 19:36:21 +00001439
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001440 err = maybe_call_line_trace(tstate->c_tracefunc,
1441 tstate->c_traceobj,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01001442 tstate, f,
1443 &instr_lb, &instr_ub, &instr_prev);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001444 /* Reload possibly changed frame fields */
1445 JUMPTO(f->f_lasti);
Mark Shannoncb9879b2020-07-17 11:44:23 +01001446 stack_pointer = f->f_valuestack+f->f_stackdepth;
1447 f->f_stackdepth = -1;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001448 if (err)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001449 /* trace function raised an exception */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001450 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001451 }
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001452
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001453 /* Extract opcode and argument */
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001454
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001455 NEXTOPARG();
Stefan Krahb7e10102010-06-23 18:42:39 +00001456 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +00001457#ifdef DYNAMIC_EXECUTION_PROFILE
1458#ifdef DXPAIRS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001459 dxpairs[lastopcode][opcode]++;
1460 lastopcode = opcode;
Guido van Rossum950361c1997-01-24 13:49:28 +00001461#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001462 dxp[opcode]++;
Guido van Rossum950361c1997-01-24 13:49:28 +00001463#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001464
Guido van Rossum96a42c81992-01-12 02:29:51 +00001465#ifdef LLTRACE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001466 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +00001467
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001468 if (lltrace) {
1469 if (HAS_ARG(opcode)) {
1470 printf("%d: %d, %d\n",
1471 f->f_lasti, opcode, oparg);
1472 }
1473 else {
1474 printf("%d: %d\n",
1475 f->f_lasti, opcode);
1476 }
1477 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001478#endif
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001479
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001480 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +00001481
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001482 /* BEWARE!
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001483 It is essential that any operation that fails must goto error
1484 and that all operation that succeed call [FAST_]DISPATCH() ! */
Guido van Rossumac7be682001-01-17 15:42:30 +00001485
Benjamin Petersonddd19492018-09-16 22:38:02 -07001486 case TARGET(NOP): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001487 FAST_DISPATCH();
Benjamin Petersonddd19492018-09-16 22:38:02 -07001488 }
Raymond Hettinger9c18e812004-06-21 16:31:15 +00001489
Benjamin Petersonddd19492018-09-16 22:38:02 -07001490 case TARGET(LOAD_FAST): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001491 PyObject *value = GETLOCAL(oparg);
1492 if (value == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02001493 format_exc_check_arg(tstate, PyExc_UnboundLocalError,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001494 UNBOUNDLOCAL_ERROR_MSG,
1495 PyTuple_GetItem(co->co_varnames, oparg));
1496 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001497 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001498 Py_INCREF(value);
1499 PUSH(value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001500 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001501 }
1502
Benjamin Petersonddd19492018-09-16 22:38:02 -07001503 case TARGET(LOAD_CONST): {
1504 PREDICTED(LOAD_CONST);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001505 PyObject *value = GETITEM(consts, oparg);
1506 Py_INCREF(value);
1507 PUSH(value);
1508 FAST_DISPATCH();
1509 }
Neil Schemenauer63543862002-02-17 19:10:14 +00001510
Benjamin Petersonddd19492018-09-16 22:38:02 -07001511 case TARGET(STORE_FAST): {
1512 PREDICTED(STORE_FAST);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001513 PyObject *value = POP();
1514 SETLOCAL(oparg, value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001515 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001516 }
Neil Schemenauer63543862002-02-17 19:10:14 +00001517
Benjamin Petersonddd19492018-09-16 22:38:02 -07001518 case TARGET(POP_TOP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001519 PyObject *value = POP();
1520 Py_DECREF(value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001521 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001522 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001523
Benjamin Petersonddd19492018-09-16 22:38:02 -07001524 case TARGET(ROT_TWO): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001525 PyObject *top = TOP();
1526 PyObject *second = SECOND();
1527 SET_TOP(second);
1528 SET_SECOND(top);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001529 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001530 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001531
Benjamin Petersonddd19492018-09-16 22:38:02 -07001532 case TARGET(ROT_THREE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001533 PyObject *top = TOP();
1534 PyObject *second = SECOND();
1535 PyObject *third = THIRD();
1536 SET_TOP(second);
1537 SET_SECOND(third);
1538 SET_THIRD(top);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001539 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001540 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001541
Benjamin Petersonddd19492018-09-16 22:38:02 -07001542 case TARGET(ROT_FOUR): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001543 PyObject *top = TOP();
1544 PyObject *second = SECOND();
1545 PyObject *third = THIRD();
1546 PyObject *fourth = FOURTH();
1547 SET_TOP(second);
1548 SET_SECOND(third);
1549 SET_THIRD(fourth);
1550 SET_FOURTH(top);
1551 FAST_DISPATCH();
1552 }
1553
Benjamin Petersonddd19492018-09-16 22:38:02 -07001554 case TARGET(DUP_TOP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001555 PyObject *top = TOP();
1556 Py_INCREF(top);
1557 PUSH(top);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001558 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001559 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001560
Benjamin Petersonddd19492018-09-16 22:38:02 -07001561 case TARGET(DUP_TOP_TWO): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001562 PyObject *top = TOP();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001563 PyObject *second = SECOND();
Benjamin Petersonf208df32012-10-12 11:37:56 -04001564 Py_INCREF(top);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001565 Py_INCREF(second);
costypetrisor8ed317f2018-07-31 20:55:14 +00001566 STACK_GROW(2);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001567 SET_TOP(top);
1568 SET_SECOND(second);
Antoine Pitrou74a69fa2010-09-04 18:43:52 +00001569 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001570 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001571
Benjamin Petersonddd19492018-09-16 22:38:02 -07001572 case TARGET(UNARY_POSITIVE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001573 PyObject *value = TOP();
1574 PyObject *res = PyNumber_Positive(value);
1575 Py_DECREF(value);
1576 SET_TOP(res);
1577 if (res == NULL)
1578 goto error;
1579 DISPATCH();
1580 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001581
Benjamin Petersonddd19492018-09-16 22:38:02 -07001582 case TARGET(UNARY_NEGATIVE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001583 PyObject *value = TOP();
1584 PyObject *res = PyNumber_Negative(value);
1585 Py_DECREF(value);
1586 SET_TOP(res);
1587 if (res == NULL)
1588 goto error;
1589 DISPATCH();
1590 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001591
Benjamin Petersonddd19492018-09-16 22:38:02 -07001592 case TARGET(UNARY_NOT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001593 PyObject *value = TOP();
1594 int err = PyObject_IsTrue(value);
1595 Py_DECREF(value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001596 if (err == 0) {
1597 Py_INCREF(Py_True);
1598 SET_TOP(Py_True);
1599 DISPATCH();
1600 }
1601 else if (err > 0) {
1602 Py_INCREF(Py_False);
1603 SET_TOP(Py_False);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001604 DISPATCH();
1605 }
costypetrisor8ed317f2018-07-31 20:55:14 +00001606 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001607 goto error;
1608 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001609
Benjamin Petersonddd19492018-09-16 22:38:02 -07001610 case TARGET(UNARY_INVERT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001611 PyObject *value = TOP();
1612 PyObject *res = PyNumber_Invert(value);
1613 Py_DECREF(value);
1614 SET_TOP(res);
1615 if (res == NULL)
1616 goto error;
1617 DISPATCH();
1618 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001619
Benjamin Petersonddd19492018-09-16 22:38:02 -07001620 case TARGET(BINARY_POWER): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001621 PyObject *exp = POP();
1622 PyObject *base = TOP();
1623 PyObject *res = PyNumber_Power(base, exp, Py_None);
1624 Py_DECREF(base);
1625 Py_DECREF(exp);
1626 SET_TOP(res);
1627 if (res == NULL)
1628 goto error;
1629 DISPATCH();
1630 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001631
Benjamin Petersonddd19492018-09-16 22:38:02 -07001632 case TARGET(BINARY_MULTIPLY): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001633 PyObject *right = POP();
1634 PyObject *left = TOP();
1635 PyObject *res = PyNumber_Multiply(left, right);
1636 Py_DECREF(left);
1637 Py_DECREF(right);
1638 SET_TOP(res);
1639 if (res == NULL)
1640 goto error;
1641 DISPATCH();
1642 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001643
Benjamin Petersonddd19492018-09-16 22:38:02 -07001644 case TARGET(BINARY_MATRIX_MULTIPLY): {
Benjamin Petersond51374e2014-04-09 23:55:56 -04001645 PyObject *right = POP();
1646 PyObject *left = TOP();
1647 PyObject *res = PyNumber_MatrixMultiply(left, right);
1648 Py_DECREF(left);
1649 Py_DECREF(right);
1650 SET_TOP(res);
1651 if (res == NULL)
1652 goto error;
1653 DISPATCH();
1654 }
1655
Benjamin Petersonddd19492018-09-16 22:38:02 -07001656 case TARGET(BINARY_TRUE_DIVIDE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001657 PyObject *divisor = POP();
1658 PyObject *dividend = TOP();
1659 PyObject *quotient = PyNumber_TrueDivide(dividend, divisor);
1660 Py_DECREF(dividend);
1661 Py_DECREF(divisor);
1662 SET_TOP(quotient);
1663 if (quotient == NULL)
1664 goto error;
1665 DISPATCH();
1666 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001667
Benjamin Petersonddd19492018-09-16 22:38:02 -07001668 case TARGET(BINARY_FLOOR_DIVIDE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001669 PyObject *divisor = POP();
1670 PyObject *dividend = TOP();
1671 PyObject *quotient = PyNumber_FloorDivide(dividend, divisor);
1672 Py_DECREF(dividend);
1673 Py_DECREF(divisor);
1674 SET_TOP(quotient);
1675 if (quotient == NULL)
1676 goto error;
1677 DISPATCH();
1678 }
Guido van Rossum4668b002001-08-08 05:00:18 +00001679
Benjamin Petersonddd19492018-09-16 22:38:02 -07001680 case TARGET(BINARY_MODULO): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001681 PyObject *divisor = POP();
1682 PyObject *dividend = TOP();
Martijn Pietersd7e64332017-02-23 13:38:04 +00001683 PyObject *res;
1684 if (PyUnicode_CheckExact(dividend) && (
1685 !PyUnicode_Check(divisor) || PyUnicode_CheckExact(divisor))) {
1686 // fast path; string formatting, but not if the RHS is a str subclass
1687 // (see issue28598)
1688 res = PyUnicode_Format(dividend, divisor);
1689 } else {
1690 res = PyNumber_Remainder(dividend, divisor);
1691 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001692 Py_DECREF(divisor);
1693 Py_DECREF(dividend);
1694 SET_TOP(res);
1695 if (res == NULL)
1696 goto error;
1697 DISPATCH();
1698 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001699
Benjamin Petersonddd19492018-09-16 22:38:02 -07001700 case TARGET(BINARY_ADD): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001701 PyObject *right = POP();
1702 PyObject *left = TOP();
1703 PyObject *sum;
Victor Stinnerd65f42a2016-10-20 12:18:10 +02001704 /* NOTE(haypo): Please don't try to micro-optimize int+int on
1705 CPython using bytecode, it is simply worthless.
1706 See http://bugs.python.org/issue21955 and
1707 http://bugs.python.org/issue10044 for the discussion. In short,
1708 no patch shown any impact on a realistic benchmark, only a minor
1709 speedup on microbenchmarks. */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001710 if (PyUnicode_CheckExact(left) &&
1711 PyUnicode_CheckExact(right)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02001712 sum = unicode_concatenate(tstate, left, right, f, next_instr);
Martin Panter95f53c12016-07-18 08:23:26 +00001713 /* unicode_concatenate consumed the ref to left */
Victor Stinnerd2a915d2011-10-02 20:34:20 +02001714 }
1715 else {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001716 sum = PyNumber_Add(left, right);
1717 Py_DECREF(left);
Victor Stinnerd2a915d2011-10-02 20:34:20 +02001718 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001719 Py_DECREF(right);
1720 SET_TOP(sum);
1721 if (sum == NULL)
1722 goto error;
1723 DISPATCH();
1724 }
1725
Benjamin Petersonddd19492018-09-16 22:38:02 -07001726 case TARGET(BINARY_SUBTRACT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001727 PyObject *right = POP();
1728 PyObject *left = TOP();
1729 PyObject *diff = PyNumber_Subtract(left, right);
1730 Py_DECREF(right);
1731 Py_DECREF(left);
1732 SET_TOP(diff);
1733 if (diff == NULL)
1734 goto error;
1735 DISPATCH();
1736 }
1737
Benjamin Petersonddd19492018-09-16 22:38:02 -07001738 case TARGET(BINARY_SUBSCR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001739 PyObject *sub = POP();
1740 PyObject *container = TOP();
1741 PyObject *res = PyObject_GetItem(container, sub);
1742 Py_DECREF(container);
1743 Py_DECREF(sub);
1744 SET_TOP(res);
1745 if (res == NULL)
1746 goto error;
1747 DISPATCH();
1748 }
1749
Benjamin Petersonddd19492018-09-16 22:38:02 -07001750 case TARGET(BINARY_LSHIFT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001751 PyObject *right = POP();
1752 PyObject *left = TOP();
1753 PyObject *res = PyNumber_Lshift(left, right);
1754 Py_DECREF(left);
1755 Py_DECREF(right);
1756 SET_TOP(res);
1757 if (res == NULL)
1758 goto error;
1759 DISPATCH();
1760 }
1761
Benjamin Petersonddd19492018-09-16 22:38:02 -07001762 case TARGET(BINARY_RSHIFT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001763 PyObject *right = POP();
1764 PyObject *left = TOP();
1765 PyObject *res = PyNumber_Rshift(left, right);
1766 Py_DECREF(left);
1767 Py_DECREF(right);
1768 SET_TOP(res);
1769 if (res == NULL)
1770 goto error;
1771 DISPATCH();
1772 }
1773
Benjamin Petersonddd19492018-09-16 22:38:02 -07001774 case TARGET(BINARY_AND): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001775 PyObject *right = POP();
1776 PyObject *left = TOP();
1777 PyObject *res = PyNumber_And(left, right);
1778 Py_DECREF(left);
1779 Py_DECREF(right);
1780 SET_TOP(res);
1781 if (res == NULL)
1782 goto error;
1783 DISPATCH();
1784 }
1785
Benjamin Petersonddd19492018-09-16 22:38:02 -07001786 case TARGET(BINARY_XOR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001787 PyObject *right = POP();
1788 PyObject *left = TOP();
1789 PyObject *res = PyNumber_Xor(left, right);
1790 Py_DECREF(left);
1791 Py_DECREF(right);
1792 SET_TOP(res);
1793 if (res == NULL)
1794 goto error;
1795 DISPATCH();
1796 }
1797
Benjamin Petersonddd19492018-09-16 22:38:02 -07001798 case TARGET(BINARY_OR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001799 PyObject *right = POP();
1800 PyObject *left = TOP();
1801 PyObject *res = PyNumber_Or(left, right);
1802 Py_DECREF(left);
1803 Py_DECREF(right);
1804 SET_TOP(res);
1805 if (res == NULL)
1806 goto error;
1807 DISPATCH();
1808 }
1809
Benjamin Petersonddd19492018-09-16 22:38:02 -07001810 case TARGET(LIST_APPEND): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001811 PyObject *v = POP();
1812 PyObject *list = PEEK(oparg);
1813 int err;
1814 err = PyList_Append(list, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001815 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001816 if (err != 0)
1817 goto error;
1818 PREDICT(JUMP_ABSOLUTE);
1819 DISPATCH();
1820 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001821
Benjamin Petersonddd19492018-09-16 22:38:02 -07001822 case TARGET(SET_ADD): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001823 PyObject *v = POP();
Raymond Hettinger41862222016-10-15 19:03:06 -07001824 PyObject *set = PEEK(oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001825 int err;
1826 err = PySet_Add(set, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001827 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001828 if (err != 0)
1829 goto error;
1830 PREDICT(JUMP_ABSOLUTE);
1831 DISPATCH();
1832 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001833
Benjamin Petersonddd19492018-09-16 22:38:02 -07001834 case TARGET(INPLACE_POWER): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001835 PyObject *exp = POP();
1836 PyObject *base = TOP();
1837 PyObject *res = PyNumber_InPlacePower(base, exp, Py_None);
1838 Py_DECREF(base);
1839 Py_DECREF(exp);
1840 SET_TOP(res);
1841 if (res == NULL)
1842 goto error;
1843 DISPATCH();
1844 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001845
Benjamin Petersonddd19492018-09-16 22:38:02 -07001846 case TARGET(INPLACE_MULTIPLY): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001847 PyObject *right = POP();
1848 PyObject *left = TOP();
1849 PyObject *res = PyNumber_InPlaceMultiply(left, right);
1850 Py_DECREF(left);
1851 Py_DECREF(right);
1852 SET_TOP(res);
1853 if (res == NULL)
1854 goto error;
1855 DISPATCH();
1856 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001857
Benjamin Petersonddd19492018-09-16 22:38:02 -07001858 case TARGET(INPLACE_MATRIX_MULTIPLY): {
Benjamin Petersond51374e2014-04-09 23:55:56 -04001859 PyObject *right = POP();
1860 PyObject *left = TOP();
1861 PyObject *res = PyNumber_InPlaceMatrixMultiply(left, right);
1862 Py_DECREF(left);
1863 Py_DECREF(right);
1864 SET_TOP(res);
1865 if (res == NULL)
1866 goto error;
1867 DISPATCH();
1868 }
1869
Benjamin Petersonddd19492018-09-16 22:38:02 -07001870 case TARGET(INPLACE_TRUE_DIVIDE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001871 PyObject *divisor = POP();
1872 PyObject *dividend = TOP();
1873 PyObject *quotient = PyNumber_InPlaceTrueDivide(dividend, divisor);
1874 Py_DECREF(dividend);
1875 Py_DECREF(divisor);
1876 SET_TOP(quotient);
1877 if (quotient == NULL)
1878 goto error;
1879 DISPATCH();
1880 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001881
Benjamin Petersonddd19492018-09-16 22:38:02 -07001882 case TARGET(INPLACE_FLOOR_DIVIDE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001883 PyObject *divisor = POP();
1884 PyObject *dividend = TOP();
1885 PyObject *quotient = PyNumber_InPlaceFloorDivide(dividend, divisor);
1886 Py_DECREF(dividend);
1887 Py_DECREF(divisor);
1888 SET_TOP(quotient);
1889 if (quotient == NULL)
1890 goto error;
1891 DISPATCH();
1892 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001893
Benjamin Petersonddd19492018-09-16 22:38:02 -07001894 case TARGET(INPLACE_MODULO): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001895 PyObject *right = POP();
1896 PyObject *left = TOP();
1897 PyObject *mod = PyNumber_InPlaceRemainder(left, right);
1898 Py_DECREF(left);
1899 Py_DECREF(right);
1900 SET_TOP(mod);
1901 if (mod == NULL)
1902 goto error;
1903 DISPATCH();
1904 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001905
Benjamin Petersonddd19492018-09-16 22:38:02 -07001906 case TARGET(INPLACE_ADD): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001907 PyObject *right = POP();
1908 PyObject *left = TOP();
1909 PyObject *sum;
1910 if (PyUnicode_CheckExact(left) && PyUnicode_CheckExact(right)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02001911 sum = unicode_concatenate(tstate, left, right, f, next_instr);
Martin Panter95f53c12016-07-18 08:23:26 +00001912 /* unicode_concatenate consumed the ref to left */
Victor Stinnerd2a915d2011-10-02 20:34:20 +02001913 }
1914 else {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001915 sum = PyNumber_InPlaceAdd(left, right);
1916 Py_DECREF(left);
Victor Stinnerd2a915d2011-10-02 20:34:20 +02001917 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001918 Py_DECREF(right);
1919 SET_TOP(sum);
1920 if (sum == NULL)
1921 goto error;
1922 DISPATCH();
1923 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001924
Benjamin Petersonddd19492018-09-16 22:38:02 -07001925 case TARGET(INPLACE_SUBTRACT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001926 PyObject *right = POP();
1927 PyObject *left = TOP();
1928 PyObject *diff = PyNumber_InPlaceSubtract(left, right);
1929 Py_DECREF(left);
1930 Py_DECREF(right);
1931 SET_TOP(diff);
1932 if (diff == NULL)
1933 goto error;
1934 DISPATCH();
1935 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001936
Benjamin Petersonddd19492018-09-16 22:38:02 -07001937 case TARGET(INPLACE_LSHIFT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001938 PyObject *right = POP();
1939 PyObject *left = TOP();
1940 PyObject *res = PyNumber_InPlaceLshift(left, right);
1941 Py_DECREF(left);
1942 Py_DECREF(right);
1943 SET_TOP(res);
1944 if (res == NULL)
1945 goto error;
1946 DISPATCH();
1947 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001948
Benjamin Petersonddd19492018-09-16 22:38:02 -07001949 case TARGET(INPLACE_RSHIFT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001950 PyObject *right = POP();
1951 PyObject *left = TOP();
1952 PyObject *res = PyNumber_InPlaceRshift(left, right);
1953 Py_DECREF(left);
1954 Py_DECREF(right);
1955 SET_TOP(res);
1956 if (res == NULL)
1957 goto error;
1958 DISPATCH();
1959 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001960
Benjamin Petersonddd19492018-09-16 22:38:02 -07001961 case TARGET(INPLACE_AND): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001962 PyObject *right = POP();
1963 PyObject *left = TOP();
1964 PyObject *res = PyNumber_InPlaceAnd(left, right);
1965 Py_DECREF(left);
1966 Py_DECREF(right);
1967 SET_TOP(res);
1968 if (res == NULL)
1969 goto error;
1970 DISPATCH();
1971 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001972
Benjamin Petersonddd19492018-09-16 22:38:02 -07001973 case TARGET(INPLACE_XOR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001974 PyObject *right = POP();
1975 PyObject *left = TOP();
1976 PyObject *res = PyNumber_InPlaceXor(left, right);
1977 Py_DECREF(left);
1978 Py_DECREF(right);
1979 SET_TOP(res);
1980 if (res == NULL)
1981 goto error;
1982 DISPATCH();
1983 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001984
Benjamin Petersonddd19492018-09-16 22:38:02 -07001985 case TARGET(INPLACE_OR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001986 PyObject *right = POP();
1987 PyObject *left = TOP();
1988 PyObject *res = PyNumber_InPlaceOr(left, right);
1989 Py_DECREF(left);
1990 Py_DECREF(right);
1991 SET_TOP(res);
1992 if (res == NULL)
1993 goto error;
1994 DISPATCH();
1995 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001996
Benjamin Petersonddd19492018-09-16 22:38:02 -07001997 case TARGET(STORE_SUBSCR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001998 PyObject *sub = TOP();
1999 PyObject *container = SECOND();
2000 PyObject *v = THIRD();
2001 int err;
costypetrisor8ed317f2018-07-31 20:55:14 +00002002 STACK_SHRINK(3);
Martin Panter95f53c12016-07-18 08:23:26 +00002003 /* container[sub] = v */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002004 err = PyObject_SetItem(container, sub, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002005 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002006 Py_DECREF(container);
2007 Py_DECREF(sub);
2008 if (err != 0)
2009 goto error;
2010 DISPATCH();
2011 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002012
Benjamin Petersonddd19492018-09-16 22:38:02 -07002013 case TARGET(DELETE_SUBSCR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002014 PyObject *sub = TOP();
2015 PyObject *container = SECOND();
2016 int err;
costypetrisor8ed317f2018-07-31 20:55:14 +00002017 STACK_SHRINK(2);
Martin Panter95f53c12016-07-18 08:23:26 +00002018 /* del container[sub] */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002019 err = PyObject_DelItem(container, sub);
2020 Py_DECREF(container);
2021 Py_DECREF(sub);
2022 if (err != 0)
2023 goto error;
2024 DISPATCH();
2025 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00002026
Benjamin Petersonddd19492018-09-16 22:38:02 -07002027 case TARGET(PRINT_EXPR): {
Victor Stinnercab75e32013-11-06 22:38:37 +01002028 _Py_IDENTIFIER(displayhook);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002029 PyObject *value = POP();
Victor Stinnercab75e32013-11-06 22:38:37 +01002030 PyObject *hook = _PySys_GetObjectId(&PyId_displayhook);
Benjamin Petersonfe1bcb62012-10-12 11:40:01 -04002031 PyObject *res;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002032 if (hook == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002033 _PyErr_SetString(tstate, PyExc_RuntimeError,
2034 "lost sys.displayhook");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002035 Py_DECREF(value);
2036 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002037 }
Petr Viktorinffd97532020-02-11 17:46:57 +01002038 res = PyObject_CallOneArg(hook, value);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002039 Py_DECREF(value);
2040 if (res == NULL)
2041 goto error;
2042 Py_DECREF(res);
2043 DISPATCH();
2044 }
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00002045
Benjamin Petersonddd19492018-09-16 22:38:02 -07002046 case TARGET(RAISE_VARARGS): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002047 PyObject *cause = NULL, *exc = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002048 switch (oparg) {
2049 case 2:
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002050 cause = POP(); /* cause */
Stefan Krahf432a322017-08-21 13:09:59 +02002051 /* fall through */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002052 case 1:
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002053 exc = POP(); /* exc */
Stefan Krahf432a322017-08-21 13:09:59 +02002054 /* fall through */
2055 case 0:
Victor Stinner09532fe2019-05-10 23:39:09 +02002056 if (do_raise(tstate, exc, cause)) {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002057 goto exception_unwind;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002058 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002059 break;
2060 default:
Victor Stinner438a12d2019-05-24 17:01:38 +02002061 _PyErr_SetString(tstate, PyExc_SystemError,
2062 "bad RAISE_VARARGS oparg");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002063 break;
2064 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002065 goto error;
2066 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002067
Benjamin Petersonddd19492018-09-16 22:38:02 -07002068 case TARGET(RETURN_VALUE): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002069 retval = POP();
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002070 assert(f->f_iblock == 0);
Mark Shannone7c9f4a2020-01-13 12:51:26 +00002071 assert(EMPTY());
Mark Shannoncb9879b2020-07-17 11:44:23 +01002072 f->f_state = FRAME_RETURNED;
2073 f->f_stackdepth = 0;
Mark Shannone7c9f4a2020-01-13 12:51:26 +00002074 goto exiting;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002075 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002076
Benjamin Petersonddd19492018-09-16 22:38:02 -07002077 case TARGET(GET_AITER): {
Yury Selivanov6ef05902015-05-28 11:21:31 -04002078 unaryfunc getter = NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04002079 PyObject *iter = NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04002080 PyObject *obj = TOP();
2081 PyTypeObject *type = Py_TYPE(obj);
2082
Yury Selivanova6f6edb2016-06-09 15:08:31 -04002083 if (type->tp_as_async != NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04002084 getter = type->tp_as_async->am_aiter;
Yury Selivanova6f6edb2016-06-09 15:08:31 -04002085 }
Yury Selivanov75445082015-05-11 22:57:16 -04002086
2087 if (getter != NULL) {
2088 iter = (*getter)(obj);
2089 Py_DECREF(obj);
2090 if (iter == NULL) {
2091 SET_TOP(NULL);
2092 goto error;
2093 }
2094 }
2095 else {
2096 SET_TOP(NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02002097 _PyErr_Format(tstate, PyExc_TypeError,
2098 "'async for' requires an object with "
2099 "__aiter__ method, got %.100s",
2100 type->tp_name);
Yury Selivanov75445082015-05-11 22:57:16 -04002101 Py_DECREF(obj);
2102 goto error;
2103 }
2104
Yury Selivanovfaa135a2017-10-06 02:08:57 -04002105 if (Py_TYPE(iter)->tp_as_async == NULL ||
2106 Py_TYPE(iter)->tp_as_async->am_anext == NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04002107
Yury Selivanov398ff912017-03-02 22:20:00 -05002108 SET_TOP(NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02002109 _PyErr_Format(tstate, PyExc_TypeError,
2110 "'async for' received an object from __aiter__ "
2111 "that does not implement __anext__: %.100s",
2112 Py_TYPE(iter)->tp_name);
Yury Selivanov75445082015-05-11 22:57:16 -04002113 Py_DECREF(iter);
2114 goto error;
Yury Selivanova6f6edb2016-06-09 15:08:31 -04002115 }
2116
Yury Selivanovfaa135a2017-10-06 02:08:57 -04002117 SET_TOP(iter);
Yury Selivanov75445082015-05-11 22:57:16 -04002118 DISPATCH();
2119 }
2120
Benjamin Petersonddd19492018-09-16 22:38:02 -07002121 case TARGET(GET_ANEXT): {
Yury Selivanov6ef05902015-05-28 11:21:31 -04002122 unaryfunc getter = NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04002123 PyObject *next_iter = NULL;
2124 PyObject *awaitable = NULL;
2125 PyObject *aiter = TOP();
2126 PyTypeObject *type = Py_TYPE(aiter);
2127
Yury Selivanoveb636452016-09-08 22:01:51 -07002128 if (PyAsyncGen_CheckExact(aiter)) {
2129 awaitable = type->tp_as_async->am_anext(aiter);
2130 if (awaitable == NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04002131 goto error;
2132 }
Yury Selivanoveb636452016-09-08 22:01:51 -07002133 } else {
2134 if (type->tp_as_async != NULL){
2135 getter = type->tp_as_async->am_anext;
2136 }
Yury Selivanov75445082015-05-11 22:57:16 -04002137
Yury Selivanoveb636452016-09-08 22:01:51 -07002138 if (getter != NULL) {
2139 next_iter = (*getter)(aiter);
2140 if (next_iter == NULL) {
2141 goto error;
2142 }
2143 }
2144 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02002145 _PyErr_Format(tstate, PyExc_TypeError,
2146 "'async for' requires an iterator with "
2147 "__anext__ method, got %.100s",
2148 type->tp_name);
Yury Selivanoveb636452016-09-08 22:01:51 -07002149 goto error;
2150 }
Yury Selivanov75445082015-05-11 22:57:16 -04002151
Yury Selivanoveb636452016-09-08 22:01:51 -07002152 awaitable = _PyCoro_GetAwaitableIter(next_iter);
2153 if (awaitable == NULL) {
Yury Selivanov398ff912017-03-02 22:20:00 -05002154 _PyErr_FormatFromCause(
Yury Selivanoveb636452016-09-08 22:01:51 -07002155 PyExc_TypeError,
2156 "'async for' received an invalid object "
2157 "from __anext__: %.100s",
2158 Py_TYPE(next_iter)->tp_name);
2159
2160 Py_DECREF(next_iter);
2161 goto error;
2162 } else {
2163 Py_DECREF(next_iter);
2164 }
2165 }
Yury Selivanov75445082015-05-11 22:57:16 -04002166
2167 PUSH(awaitable);
Serhiy Storchakada9c5132016-06-27 18:58:57 +03002168 PREDICT(LOAD_CONST);
Yury Selivanov75445082015-05-11 22:57:16 -04002169 DISPATCH();
2170 }
2171
Benjamin Petersonddd19492018-09-16 22:38:02 -07002172 case TARGET(GET_AWAITABLE): {
2173 PREDICTED(GET_AWAITABLE);
Yury Selivanov75445082015-05-11 22:57:16 -04002174 PyObject *iterable = TOP();
Yury Selivanov5376ba92015-06-22 12:19:30 -04002175 PyObject *iter = _PyCoro_GetAwaitableIter(iterable);
Yury Selivanov75445082015-05-11 22:57:16 -04002176
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03002177 if (iter == NULL) {
Mark Shannonfee55262019-11-21 09:11:43 +00002178 int opcode_at_minus_3 = 0;
2179 if ((next_instr - first_instr) > 2) {
2180 opcode_at_minus_3 = _Py_OPCODE(next_instr[-3]);
2181 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002182 format_awaitable_error(tstate, Py_TYPE(iterable),
Mark Shannonfee55262019-11-21 09:11:43 +00002183 opcode_at_minus_3,
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03002184 _Py_OPCODE(next_instr[-2]));
2185 }
2186
Yury Selivanov75445082015-05-11 22:57:16 -04002187 Py_DECREF(iterable);
2188
Yury Selivanovc724bae2016-03-02 11:30:46 -05002189 if (iter != NULL && PyCoro_CheckExact(iter)) {
2190 PyObject *yf = _PyGen_yf((PyGenObject*)iter);
2191 if (yf != NULL) {
2192 /* `iter` is a coroutine object that is being
2193 awaited, `yf` is a pointer to the current awaitable
2194 being awaited on. */
2195 Py_DECREF(yf);
2196 Py_CLEAR(iter);
Victor Stinner438a12d2019-05-24 17:01:38 +02002197 _PyErr_SetString(tstate, PyExc_RuntimeError,
2198 "coroutine is being awaited already");
Yury Selivanovc724bae2016-03-02 11:30:46 -05002199 /* The code below jumps to `error` if `iter` is NULL. */
2200 }
2201 }
2202
Yury Selivanov75445082015-05-11 22:57:16 -04002203 SET_TOP(iter); /* Even if it's NULL */
2204
2205 if (iter == NULL) {
2206 goto error;
2207 }
2208
Serhiy Storchakada9c5132016-06-27 18:58:57 +03002209 PREDICT(LOAD_CONST);
Yury Selivanov75445082015-05-11 22:57:16 -04002210 DISPATCH();
2211 }
2212
Benjamin Petersonddd19492018-09-16 22:38:02 -07002213 case TARGET(YIELD_FROM): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002214 PyObject *v = POP();
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07002215 PyObject *receiver = TOP();
Vladimir Matveev2b053612020-09-18 18:38:38 -07002216 int is_gen_or_coro = PyGen_CheckExact(receiver) || PyCoro_CheckExact(receiver);
2217 int gen_status;
2218 if (tstate->c_tracefunc == NULL && is_gen_or_coro) {
2219 gen_status = PyGen_Send((PyGenObject *)receiver, v, &retval);
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05002220 } else {
Vladimir Matveev2b053612020-09-18 18:38:38 -07002221 if (is_gen_or_coro) {
2222 retval = _PyGen_Send((PyGenObject *)receiver, v);
2223 }
2224 else {
2225 _Py_IDENTIFIER(send);
2226 if (v == Py_None) {
2227 retval = Py_TYPE(receiver)->tp_iternext(receiver);
2228 }
2229 else {
2230 retval = _PyObject_CallMethodIdOneArg(receiver, &PyId_send, v);
2231 }
2232 }
2233
2234 if (retval == NULL) {
2235 if (tstate->c_tracefunc != NULL
2236 && _PyErr_ExceptionMatches(tstate, PyExc_StopIteration))
2237 call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj, tstate, f);
2238 if (_PyGen_FetchStopIterationValue(&retval) == 0) {
2239 gen_status = PYGEN_RETURN;
2240 }
2241 else {
2242 gen_status = PYGEN_ERROR;
2243 }
2244 }
2245 else {
2246 gen_status = PYGEN_NEXT;
2247 }
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05002248 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002249 Py_DECREF(v);
Vladimir Matveev2b053612020-09-18 18:38:38 -07002250 if (gen_status == PYGEN_ERROR) {
2251 assert (retval == NULL);
2252 goto error;
2253 }
2254 if (gen_status == PYGEN_RETURN) {
2255 assert (retval != NULL);
2256
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07002257 Py_DECREF(receiver);
Vladimir Matveev2b053612020-09-18 18:38:38 -07002258 SET_TOP(retval);
2259 retval = NULL;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002260 DISPATCH();
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002261 }
Vladimir Matveev2b053612020-09-18 18:38:38 -07002262 assert (gen_status == PYGEN_NEXT);
Martin Panter95f53c12016-07-18 08:23:26 +00002263 /* receiver remains on stack, retval is value to be yielded */
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05002264 /* and repeat... */
Victor Stinnerf7d199f2016-11-24 22:33:01 +01002265 assert(f->f_lasti >= (int)sizeof(_Py_CODEUNIT));
Serhiy Storchakaab874002016-09-11 13:48:15 +03002266 f->f_lasti -= sizeof(_Py_CODEUNIT);
Mark Shannoncb9879b2020-07-17 11:44:23 +01002267 f->f_state = FRAME_SUSPENDED;
Victor Stinnerb7d8d8d2020-09-23 14:07:16 +02002268 f->f_stackdepth = (int)(stack_pointer - f->f_valuestack);
Mark Shannone7c9f4a2020-01-13 12:51:26 +00002269 goto exiting;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002270 }
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002271
Benjamin Petersonddd19492018-09-16 22:38:02 -07002272 case TARGET(YIELD_VALUE): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002273 retval = POP();
Yury Selivanoveb636452016-09-08 22:01:51 -07002274
2275 if (co->co_flags & CO_ASYNC_GENERATOR) {
2276 PyObject *w = _PyAsyncGenValueWrapperNew(retval);
2277 Py_DECREF(retval);
2278 if (w == NULL) {
2279 retval = NULL;
2280 goto error;
2281 }
2282 retval = w;
2283 }
Mark Shannoncb9879b2020-07-17 11:44:23 +01002284 f->f_state = FRAME_SUSPENDED;
Victor Stinnerb7d8d8d2020-09-23 14:07:16 +02002285 f->f_stackdepth = (int)(stack_pointer - f->f_valuestack);
Mark Shannone7c9f4a2020-01-13 12:51:26 +00002286 goto exiting;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002287 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002288
Benjamin Petersonddd19492018-09-16 22:38:02 -07002289 case TARGET(POP_EXCEPT): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002290 PyObject *type, *value, *traceback;
2291 _PyErr_StackItem *exc_info;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002292 PyTryBlock *b = PyFrame_BlockPop(f);
2293 if (b->b_type != EXCEPT_HANDLER) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002294 _PyErr_SetString(tstate, PyExc_SystemError,
2295 "popped block is not an except handler");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002296 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002297 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002298 assert(STACK_LEVEL() >= (b)->b_level + 3 &&
2299 STACK_LEVEL() <= (b)->b_level + 4);
2300 exc_info = tstate->exc_info;
2301 type = exc_info->exc_type;
2302 value = exc_info->exc_value;
2303 traceback = exc_info->exc_traceback;
2304 exc_info->exc_type = POP();
2305 exc_info->exc_value = POP();
2306 exc_info->exc_traceback = POP();
2307 Py_XDECREF(type);
2308 Py_XDECREF(value);
2309 Py_XDECREF(traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002310 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002311 }
Benjamin Petersoneec3d712008-06-11 15:59:43 +00002312
Benjamin Petersonddd19492018-09-16 22:38:02 -07002313 case TARGET(POP_BLOCK): {
2314 PREDICTED(POP_BLOCK);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002315 PyFrame_BlockPop(f);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002316 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002317 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002318
Mark Shannonfee55262019-11-21 09:11:43 +00002319 case TARGET(RERAISE): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002320 PyObject *exc = POP();
Mark Shannonfee55262019-11-21 09:11:43 +00002321 PyObject *val = POP();
2322 PyObject *tb = POP();
2323 assert(PyExceptionClass_Check(exc));
Victor Stinner61f4db82020-01-28 03:37:45 +01002324 _PyErr_Restore(tstate, exc, val, tb);
Mark Shannonfee55262019-11-21 09:11:43 +00002325 goto exception_unwind;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002326 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002327
Benjamin Petersonddd19492018-09-16 22:38:02 -07002328 case TARGET(END_ASYNC_FOR): {
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002329 PyObject *exc = POP();
2330 assert(PyExceptionClass_Check(exc));
2331 if (PyErr_GivenExceptionMatches(exc, PyExc_StopAsyncIteration)) {
2332 PyTryBlock *b = PyFrame_BlockPop(f);
2333 assert(b->b_type == EXCEPT_HANDLER);
2334 Py_DECREF(exc);
2335 UNWIND_EXCEPT_HANDLER(b);
2336 Py_DECREF(POP());
2337 JUMPBY(oparg);
2338 FAST_DISPATCH();
2339 }
2340 else {
2341 PyObject *val = POP();
2342 PyObject *tb = POP();
Victor Stinner438a12d2019-05-24 17:01:38 +02002343 _PyErr_Restore(tstate, exc, val, tb);
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002344 goto exception_unwind;
2345 }
2346 }
2347
Zackery Spytzce6a0702019-08-25 03:44:09 -06002348 case TARGET(LOAD_ASSERTION_ERROR): {
2349 PyObject *value = PyExc_AssertionError;
2350 Py_INCREF(value);
2351 PUSH(value);
2352 FAST_DISPATCH();
2353 }
2354
Benjamin Petersonddd19492018-09-16 22:38:02 -07002355 case TARGET(LOAD_BUILD_CLASS): {
Victor Stinner3c1e4812012-03-26 22:10:51 +02002356 _Py_IDENTIFIER(__build_class__);
Victor Stinnerb0b22422012-04-19 00:57:45 +02002357
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002358 PyObject *bc;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002359 if (PyDict_CheckExact(f->f_builtins)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002360 bc = _PyDict_GetItemIdWithError(f->f_builtins, &PyId___build_class__);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002361 if (bc == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002362 if (!_PyErr_Occurred(tstate)) {
2363 _PyErr_SetString(tstate, PyExc_NameError,
2364 "__build_class__ not found");
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002365 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002366 goto error;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002367 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002368 Py_INCREF(bc);
Victor Stinnerb0b22422012-04-19 00:57:45 +02002369 }
2370 else {
2371 PyObject *build_class_str = _PyUnicode_FromId(&PyId___build_class__);
2372 if (build_class_str == NULL)
Serhiy Storchaka70b72f02016-11-08 23:12:46 +02002373 goto error;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002374 bc = PyObject_GetItem(f->f_builtins, build_class_str);
2375 if (bc == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002376 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError))
2377 _PyErr_SetString(tstate, PyExc_NameError,
2378 "__build_class__ not found");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002379 goto error;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002380 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002381 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002382 PUSH(bc);
Benjamin Peterson00f86f22012-10-10 14:10:33 -04002383 DISPATCH();
Victor Stinner3c1e4812012-03-26 22:10:51 +02002384 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002385
Benjamin Petersonddd19492018-09-16 22:38:02 -07002386 case TARGET(STORE_NAME): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002387 PyObject *name = GETITEM(names, oparg);
2388 PyObject *v = POP();
2389 PyObject *ns = f->f_locals;
2390 int err;
2391 if (ns == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002392 _PyErr_Format(tstate, PyExc_SystemError,
2393 "no locals found when storing %R", name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002394 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002395 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002396 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002397 if (PyDict_CheckExact(ns))
2398 err = PyDict_SetItem(ns, name, v);
2399 else
2400 err = PyObject_SetItem(ns, name, v);
2401 Py_DECREF(v);
2402 if (err != 0)
2403 goto error;
2404 DISPATCH();
2405 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002406
Benjamin Petersonddd19492018-09-16 22:38:02 -07002407 case TARGET(DELETE_NAME): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002408 PyObject *name = GETITEM(names, oparg);
2409 PyObject *ns = f->f_locals;
2410 int err;
2411 if (ns == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002412 _PyErr_Format(tstate, PyExc_SystemError,
2413 "no locals when deleting %R", name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002414 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002415 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002416 err = PyObject_DelItem(ns, name);
2417 if (err != 0) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002418 format_exc_check_arg(tstate, PyExc_NameError,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002419 NAME_ERROR_MSG,
2420 name);
2421 goto error;
2422 }
2423 DISPATCH();
2424 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00002425
Benjamin Petersonddd19492018-09-16 22:38:02 -07002426 case TARGET(UNPACK_SEQUENCE): {
2427 PREDICTED(UNPACK_SEQUENCE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002428 PyObject *seq = POP(), *item, **items;
2429 if (PyTuple_CheckExact(seq) &&
2430 PyTuple_GET_SIZE(seq) == oparg) {
2431 items = ((PyTupleObject *)seq)->ob_item;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002432 while (oparg--) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002433 item = items[oparg];
2434 Py_INCREF(item);
2435 PUSH(item);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002436 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002437 } else if (PyList_CheckExact(seq) &&
2438 PyList_GET_SIZE(seq) == oparg) {
2439 items = ((PyListObject *)seq)->ob_item;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002440 while (oparg--) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002441 item = items[oparg];
2442 Py_INCREF(item);
2443 PUSH(item);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002444 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002445 } else if (unpack_iterable(tstate, seq, oparg, -1,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002446 stack_pointer + oparg)) {
costypetrisor8ed317f2018-07-31 20:55:14 +00002447 STACK_GROW(oparg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002448 } else {
2449 /* unpack_iterable() raised an exception */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002450 Py_DECREF(seq);
2451 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002452 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002453 Py_DECREF(seq);
Benjamin Peterson00f86f22012-10-10 14:10:33 -04002454 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002455 }
Guido van Rossum0368b722007-05-11 16:50:42 +00002456
Benjamin Petersonddd19492018-09-16 22:38:02 -07002457 case TARGET(UNPACK_EX): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002458 int totalargs = 1 + (oparg & 0xFF) + (oparg >> 8);
2459 PyObject *seq = POP();
2460
Victor Stinner438a12d2019-05-24 17:01:38 +02002461 if (unpack_iterable(tstate, seq, oparg & 0xFF, oparg >> 8,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002462 stack_pointer + totalargs)) {
2463 stack_pointer += totalargs;
2464 } else {
2465 Py_DECREF(seq);
2466 goto error;
2467 }
2468 Py_DECREF(seq);
2469 DISPATCH();
2470 }
2471
Benjamin Petersonddd19492018-09-16 22:38:02 -07002472 case TARGET(STORE_ATTR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002473 PyObject *name = GETITEM(names, oparg);
2474 PyObject *owner = TOP();
2475 PyObject *v = SECOND();
2476 int err;
costypetrisor8ed317f2018-07-31 20:55:14 +00002477 STACK_SHRINK(2);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002478 err = PyObject_SetAttr(owner, name, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002479 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002480 Py_DECREF(owner);
2481 if (err != 0)
2482 goto error;
2483 DISPATCH();
2484 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002485
Benjamin Petersonddd19492018-09-16 22:38:02 -07002486 case TARGET(DELETE_ATTR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002487 PyObject *name = GETITEM(names, oparg);
2488 PyObject *owner = POP();
2489 int err;
2490 err = PyObject_SetAttr(owner, name, (PyObject *)NULL);
2491 Py_DECREF(owner);
2492 if (err != 0)
2493 goto error;
2494 DISPATCH();
2495 }
2496
Benjamin Petersonddd19492018-09-16 22:38:02 -07002497 case TARGET(STORE_GLOBAL): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002498 PyObject *name = GETITEM(names, oparg);
2499 PyObject *v = POP();
2500 int err;
2501 err = PyDict_SetItem(f->f_globals, name, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002502 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002503 if (err != 0)
2504 goto error;
2505 DISPATCH();
2506 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002507
Benjamin Petersonddd19492018-09-16 22:38:02 -07002508 case TARGET(DELETE_GLOBAL): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002509 PyObject *name = GETITEM(names, oparg);
2510 int err;
2511 err = PyDict_DelItem(f->f_globals, name);
2512 if (err != 0) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002513 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
2514 format_exc_check_arg(tstate, PyExc_NameError,
2515 NAME_ERROR_MSG, name);
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002516 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002517 goto error;
Benjamin Peterson00f86f22012-10-10 14:10:33 -04002518 }
2519 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002520 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002521
Benjamin Petersonddd19492018-09-16 22:38:02 -07002522 case TARGET(LOAD_NAME): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002523 PyObject *name = GETITEM(names, oparg);
2524 PyObject *locals = f->f_locals;
2525 PyObject *v;
2526 if (locals == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002527 _PyErr_Format(tstate, PyExc_SystemError,
2528 "no locals when loading %R", name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002529 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002530 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002531 if (PyDict_CheckExact(locals)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002532 v = PyDict_GetItemWithError(locals, name);
2533 if (v != NULL) {
2534 Py_INCREF(v);
2535 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002536 else if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002537 goto error;
2538 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002539 }
2540 else {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002541 v = PyObject_GetItem(locals, name);
Victor Stinnere20310f2015-11-05 13:56:58 +01002542 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002543 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError))
Benjamin Peterson92722792012-12-15 12:51:05 -05002544 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02002545 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002546 }
2547 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002548 if (v == NULL) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002549 v = PyDict_GetItemWithError(f->f_globals, name);
2550 if (v != NULL) {
2551 Py_INCREF(v);
2552 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002553 else if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002554 goto error;
2555 }
2556 else {
Victor Stinnerb0b22422012-04-19 00:57:45 +02002557 if (PyDict_CheckExact(f->f_builtins)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002558 v = PyDict_GetItemWithError(f->f_builtins, name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002559 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002560 if (!_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002561 format_exc_check_arg(
Victor Stinner438a12d2019-05-24 17:01:38 +02002562 tstate, PyExc_NameError,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002563 NAME_ERROR_MSG, name);
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002564 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002565 goto error;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002566 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002567 Py_INCREF(v);
Victor Stinnerb0b22422012-04-19 00:57:45 +02002568 }
2569 else {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002570 v = PyObject_GetItem(f->f_builtins, name);
2571 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002572 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Victor Stinnerb0b22422012-04-19 00:57:45 +02002573 format_exc_check_arg(
Victor Stinner438a12d2019-05-24 17:01:38 +02002574 tstate, PyExc_NameError,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002575 NAME_ERROR_MSG, name);
Victor Stinner438a12d2019-05-24 17:01:38 +02002576 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002577 goto error;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002578 }
Benjamin Peterson20f9c3c2010-07-20 22:39:34 +00002579 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002580 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002581 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002582 PUSH(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002583 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002584 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002585
Benjamin Petersonddd19492018-09-16 22:38:02 -07002586 case TARGET(LOAD_GLOBAL): {
Inada Naoki91234a12019-06-03 21:30:58 +09002587 PyObject *name;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002588 PyObject *v;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002589 if (PyDict_CheckExact(f->f_globals)
Victor Stinnerb4efc962015-11-20 09:24:02 +01002590 && PyDict_CheckExact(f->f_builtins))
2591 {
Inada Naoki91234a12019-06-03 21:30:58 +09002592 OPCACHE_CHECK();
2593 if (co_opcache != NULL && co_opcache->optimized > 0) {
2594 _PyOpcache_LoadGlobal *lg = &co_opcache->u.lg;
2595
2596 if (lg->globals_ver ==
2597 ((PyDictObject *)f->f_globals)->ma_version_tag
2598 && lg->builtins_ver ==
2599 ((PyDictObject *)f->f_builtins)->ma_version_tag)
2600 {
2601 PyObject *ptr = lg->ptr;
2602 OPCACHE_STAT_GLOBAL_HIT();
2603 assert(ptr != NULL);
2604 Py_INCREF(ptr);
2605 PUSH(ptr);
2606 DISPATCH();
2607 }
2608 }
2609
2610 name = GETITEM(names, oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002611 v = _PyDict_LoadGlobal((PyDictObject *)f->f_globals,
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002612 (PyDictObject *)f->f_builtins,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002613 name);
2614 if (v == NULL) {
Victor Stinnerb4efc962015-11-20 09:24:02 +01002615 if (!_PyErr_OCCURRED()) {
2616 /* _PyDict_LoadGlobal() returns NULL without raising
2617 * an exception if the key doesn't exist */
Victor Stinner438a12d2019-05-24 17:01:38 +02002618 format_exc_check_arg(tstate, PyExc_NameError,
Ezio Melotti04a29552013-03-03 15:12:44 +02002619 NAME_ERROR_MSG, name);
Victor Stinnerb4efc962015-11-20 09:24:02 +01002620 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002621 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002622 }
Inada Naoki91234a12019-06-03 21:30:58 +09002623
2624 if (co_opcache != NULL) {
2625 _PyOpcache_LoadGlobal *lg = &co_opcache->u.lg;
2626
2627 if (co_opcache->optimized == 0) {
2628 /* Wasn't optimized before. */
2629 OPCACHE_STAT_GLOBAL_OPT();
2630 } else {
2631 OPCACHE_STAT_GLOBAL_MISS();
2632 }
2633
2634 co_opcache->optimized = 1;
2635 lg->globals_ver =
2636 ((PyDictObject *)f->f_globals)->ma_version_tag;
2637 lg->builtins_ver =
2638 ((PyDictObject *)f->f_builtins)->ma_version_tag;
2639 lg->ptr = v; /* borrowed */
2640 }
2641
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002642 Py_INCREF(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002643 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002644 else {
2645 /* Slow-path if globals or builtins is not a dict */
Victor Stinnerb4efc962015-11-20 09:24:02 +01002646
2647 /* namespace 1: globals */
Inada Naoki91234a12019-06-03 21:30:58 +09002648 name = GETITEM(names, oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002649 v = PyObject_GetItem(f->f_globals, name);
2650 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002651 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Victor Stinner60a1d3c2015-11-05 13:55:20 +01002652 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02002653 }
2654 _PyErr_Clear(tstate);
Victor Stinner60a1d3c2015-11-05 13:55:20 +01002655
Victor Stinnerb4efc962015-11-20 09:24:02 +01002656 /* namespace 2: builtins */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002657 v = PyObject_GetItem(f->f_builtins, name);
2658 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002659 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002660 format_exc_check_arg(
Victor Stinner438a12d2019-05-24 17:01:38 +02002661 tstate, PyExc_NameError,
Ezio Melotti04a29552013-03-03 15:12:44 +02002662 NAME_ERROR_MSG, name);
Victor Stinner438a12d2019-05-24 17:01:38 +02002663 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002664 goto error;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002665 }
2666 }
2667 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002668 PUSH(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002669 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002670 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002671
Benjamin Petersonddd19492018-09-16 22:38:02 -07002672 case TARGET(DELETE_FAST): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002673 PyObject *v = GETLOCAL(oparg);
2674 if (v != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002675 SETLOCAL(oparg, NULL);
2676 DISPATCH();
2677 }
2678 format_exc_check_arg(
Victor Stinner438a12d2019-05-24 17:01:38 +02002679 tstate, PyExc_UnboundLocalError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002680 UNBOUNDLOCAL_ERROR_MSG,
2681 PyTuple_GetItem(co->co_varnames, oparg)
2682 );
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002683 goto error;
2684 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002685
Benjamin Petersonddd19492018-09-16 22:38:02 -07002686 case TARGET(DELETE_DEREF): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002687 PyObject *cell = freevars[oparg];
Raymond Hettingerc32f9db2016-11-12 04:10:35 -05002688 PyObject *oldobj = PyCell_GET(cell);
2689 if (oldobj != NULL) {
2690 PyCell_SET(cell, NULL);
2691 Py_DECREF(oldobj);
Benjamin Peterson00ebe2c2010-09-10 22:02:31 +00002692 DISPATCH();
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00002693 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002694 format_exc_unbound(tstate, co, oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002695 goto error;
2696 }
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00002697
Benjamin Petersonddd19492018-09-16 22:38:02 -07002698 case TARGET(LOAD_CLOSURE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002699 PyObject *cell = freevars[oparg];
2700 Py_INCREF(cell);
2701 PUSH(cell);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002702 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002703 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002704
Benjamin Petersonddd19492018-09-16 22:38:02 -07002705 case TARGET(LOAD_CLASSDEREF): {
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002706 PyObject *name, *value, *locals = f->f_locals;
Victor Stinnerd3dfd0e2013-05-16 23:48:01 +02002707 Py_ssize_t idx;
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002708 assert(locals);
2709 assert(oparg >= PyTuple_GET_SIZE(co->co_cellvars));
2710 idx = oparg - PyTuple_GET_SIZE(co->co_cellvars);
2711 assert(idx >= 0 && idx < PyTuple_GET_SIZE(co->co_freevars));
2712 name = PyTuple_GET_ITEM(co->co_freevars, idx);
2713 if (PyDict_CheckExact(locals)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002714 value = PyDict_GetItemWithError(locals, name);
2715 if (value != NULL) {
2716 Py_INCREF(value);
2717 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002718 else if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002719 goto error;
2720 }
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002721 }
2722 else {
2723 value = PyObject_GetItem(locals, name);
Victor Stinnere20310f2015-11-05 13:56:58 +01002724 if (value == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002725 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002726 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02002727 }
2728 _PyErr_Clear(tstate);
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002729 }
2730 }
2731 if (!value) {
2732 PyObject *cell = freevars[oparg];
2733 value = PyCell_GET(cell);
2734 if (value == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002735 format_exc_unbound(tstate, co, oparg);
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002736 goto error;
2737 }
2738 Py_INCREF(value);
2739 }
2740 PUSH(value);
2741 DISPATCH();
2742 }
2743
Benjamin Petersonddd19492018-09-16 22:38:02 -07002744 case TARGET(LOAD_DEREF): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002745 PyObject *cell = freevars[oparg];
2746 PyObject *value = PyCell_GET(cell);
2747 if (value == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002748 format_exc_unbound(tstate, co, oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002749 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002750 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002751 Py_INCREF(value);
2752 PUSH(value);
2753 DISPATCH();
2754 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002755
Benjamin Petersonddd19492018-09-16 22:38:02 -07002756 case TARGET(STORE_DEREF): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002757 PyObject *v = POP();
2758 PyObject *cell = freevars[oparg];
Raymond Hettingerb2b15432016-11-11 04:32:11 -08002759 PyObject *oldobj = PyCell_GET(cell);
2760 PyCell_SET(cell, v);
2761 Py_XDECREF(oldobj);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002762 DISPATCH();
2763 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002764
Benjamin Petersonddd19492018-09-16 22:38:02 -07002765 case TARGET(BUILD_STRING): {
Serhiy Storchakaea525a22016-09-06 22:07:53 +03002766 PyObject *str;
2767 PyObject *empty = PyUnicode_New(0, 0);
2768 if (empty == NULL) {
2769 goto error;
2770 }
2771 str = _PyUnicode_JoinArray(empty, stack_pointer - oparg, oparg);
2772 Py_DECREF(empty);
2773 if (str == NULL)
2774 goto error;
2775 while (--oparg >= 0) {
2776 PyObject *item = POP();
2777 Py_DECREF(item);
2778 }
2779 PUSH(str);
2780 DISPATCH();
2781 }
2782
Benjamin Petersonddd19492018-09-16 22:38:02 -07002783 case TARGET(BUILD_TUPLE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002784 PyObject *tup = PyTuple_New(oparg);
2785 if (tup == NULL)
2786 goto error;
2787 while (--oparg >= 0) {
2788 PyObject *item = POP();
2789 PyTuple_SET_ITEM(tup, oparg, item);
2790 }
2791 PUSH(tup);
2792 DISPATCH();
2793 }
2794
Benjamin Petersonddd19492018-09-16 22:38:02 -07002795 case TARGET(BUILD_LIST): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002796 PyObject *list = PyList_New(oparg);
2797 if (list == NULL)
2798 goto error;
2799 while (--oparg >= 0) {
2800 PyObject *item = POP();
2801 PyList_SET_ITEM(list, oparg, item);
2802 }
2803 PUSH(list);
2804 DISPATCH();
2805 }
2806
Mark Shannon13bc1392020-01-23 09:25:17 +00002807 case TARGET(LIST_TO_TUPLE): {
2808 PyObject *list = POP();
2809 PyObject *tuple = PyList_AsTuple(list);
2810 Py_DECREF(list);
2811 if (tuple == NULL) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002812 goto error;
Mark Shannon13bc1392020-01-23 09:25:17 +00002813 }
2814 PUSH(tuple);
2815 DISPATCH();
2816 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002817
Mark Shannon13bc1392020-01-23 09:25:17 +00002818 case TARGET(LIST_EXTEND): {
2819 PyObject *iterable = POP();
2820 PyObject *list = PEEK(oparg);
2821 PyObject *none_val = _PyList_Extend((PyListObject *)list, iterable);
2822 if (none_val == NULL) {
2823 if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError) &&
Victor Stinnera102ed72020-02-07 02:24:48 +01002824 (Py_TYPE(iterable)->tp_iter == NULL && !PySequence_Check(iterable)))
Mark Shannon13bc1392020-01-23 09:25:17 +00002825 {
Victor Stinner61f4db82020-01-28 03:37:45 +01002826 _PyErr_Clear(tstate);
Mark Shannon13bc1392020-01-23 09:25:17 +00002827 _PyErr_Format(tstate, PyExc_TypeError,
2828 "Value after * must be an iterable, not %.200s",
2829 Py_TYPE(iterable)->tp_name);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002830 }
Mark Shannon13bc1392020-01-23 09:25:17 +00002831 Py_DECREF(iterable);
2832 goto error;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002833 }
Mark Shannon13bc1392020-01-23 09:25:17 +00002834 Py_DECREF(none_val);
2835 Py_DECREF(iterable);
2836 DISPATCH();
2837 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002838
Mark Shannon13bc1392020-01-23 09:25:17 +00002839 case TARGET(SET_UPDATE): {
2840 PyObject *iterable = POP();
2841 PyObject *set = PEEK(oparg);
2842 int err = _PySet_Update(set, iterable);
2843 Py_DECREF(iterable);
2844 if (err < 0) {
2845 goto error;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002846 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002847 DISPATCH();
2848 }
2849
Benjamin Petersonddd19492018-09-16 22:38:02 -07002850 case TARGET(BUILD_SET): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002851 PyObject *set = PySet_New(NULL);
2852 int err = 0;
Raymond Hettinger4c483ad2016-09-08 14:45:40 -07002853 int i;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002854 if (set == NULL)
2855 goto error;
Raymond Hettinger4c483ad2016-09-08 14:45:40 -07002856 for (i = oparg; i > 0; i--) {
2857 PyObject *item = PEEK(i);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002858 if (err == 0)
2859 err = PySet_Add(set, item);
2860 Py_DECREF(item);
2861 }
costypetrisor8ed317f2018-07-31 20:55:14 +00002862 STACK_SHRINK(oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002863 if (err != 0) {
2864 Py_DECREF(set);
2865 goto error;
2866 }
2867 PUSH(set);
2868 DISPATCH();
2869 }
2870
Benjamin Petersonddd19492018-09-16 22:38:02 -07002871 case TARGET(BUILD_MAP): {
Victor Stinner74319ae2016-08-25 00:04:09 +02002872 Py_ssize_t i;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002873 PyObject *map = _PyDict_NewPresized((Py_ssize_t)oparg);
2874 if (map == NULL)
2875 goto error;
Benjamin Petersond5d77aa2015-07-05 10:37:25 -05002876 for (i = oparg; i > 0; i--) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002877 int err;
Benjamin Petersond5d77aa2015-07-05 10:37:25 -05002878 PyObject *key = PEEK(2*i);
2879 PyObject *value = PEEK(2*i - 1);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002880 err = PyDict_SetItem(map, key, value);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002881 if (err != 0) {
2882 Py_DECREF(map);
2883 goto error;
2884 }
2885 }
Benjamin Petersond5d77aa2015-07-05 10:37:25 -05002886
2887 while (oparg--) {
2888 Py_DECREF(POP());
2889 Py_DECREF(POP());
2890 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002891 PUSH(map);
2892 DISPATCH();
2893 }
2894
Benjamin Petersonddd19492018-09-16 22:38:02 -07002895 case TARGET(SETUP_ANNOTATIONS): {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002896 _Py_IDENTIFIER(__annotations__);
2897 int err;
2898 PyObject *ann_dict;
2899 if (f->f_locals == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002900 _PyErr_Format(tstate, PyExc_SystemError,
2901 "no locals found when setting up annotations");
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002902 goto error;
2903 }
2904 /* check if __annotations__ in locals()... */
2905 if (PyDict_CheckExact(f->f_locals)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002906 ann_dict = _PyDict_GetItemIdWithError(f->f_locals,
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002907 &PyId___annotations__);
2908 if (ann_dict == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002909 if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002910 goto error;
2911 }
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002912 /* ...if not, create a new one */
2913 ann_dict = PyDict_New();
2914 if (ann_dict == NULL) {
2915 goto error;
2916 }
2917 err = _PyDict_SetItemId(f->f_locals,
2918 &PyId___annotations__, ann_dict);
2919 Py_DECREF(ann_dict);
2920 if (err != 0) {
2921 goto error;
2922 }
2923 }
2924 }
2925 else {
2926 /* do the same if locals() is not a dict */
2927 PyObject *ann_str = _PyUnicode_FromId(&PyId___annotations__);
2928 if (ann_str == NULL) {
Serhiy Storchaka4678b2f2016-11-08 23:13:36 +02002929 goto error;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002930 }
2931 ann_dict = PyObject_GetItem(f->f_locals, ann_str);
2932 if (ann_dict == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002933 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002934 goto error;
2935 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002936 _PyErr_Clear(tstate);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002937 ann_dict = PyDict_New();
2938 if (ann_dict == NULL) {
2939 goto error;
2940 }
2941 err = PyObject_SetItem(f->f_locals, ann_str, ann_dict);
2942 Py_DECREF(ann_dict);
2943 if (err != 0) {
2944 goto error;
2945 }
2946 }
2947 else {
2948 Py_DECREF(ann_dict);
2949 }
2950 }
2951 DISPATCH();
2952 }
2953
Benjamin Petersonddd19492018-09-16 22:38:02 -07002954 case TARGET(BUILD_CONST_KEY_MAP): {
Victor Stinner74319ae2016-08-25 00:04:09 +02002955 Py_ssize_t i;
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03002956 PyObject *map;
2957 PyObject *keys = TOP();
2958 if (!PyTuple_CheckExact(keys) ||
2959 PyTuple_GET_SIZE(keys) != (Py_ssize_t)oparg) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002960 _PyErr_SetString(tstate, PyExc_SystemError,
2961 "bad BUILD_CONST_KEY_MAP keys argument");
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03002962 goto error;
2963 }
2964 map = _PyDict_NewPresized((Py_ssize_t)oparg);
2965 if (map == NULL) {
2966 goto error;
2967 }
2968 for (i = oparg; i > 0; i--) {
2969 int err;
2970 PyObject *key = PyTuple_GET_ITEM(keys, oparg - i);
2971 PyObject *value = PEEK(i + 1);
2972 err = PyDict_SetItem(map, key, value);
2973 if (err != 0) {
2974 Py_DECREF(map);
2975 goto error;
2976 }
2977 }
2978
2979 Py_DECREF(POP());
2980 while (oparg--) {
2981 Py_DECREF(POP());
2982 }
2983 PUSH(map);
2984 DISPATCH();
2985 }
2986
Mark Shannon8a4cd702020-01-27 09:57:45 +00002987 case TARGET(DICT_UPDATE): {
2988 PyObject *update = POP();
2989 PyObject *dict = PEEK(oparg);
2990 if (PyDict_Update(dict, update) < 0) {
2991 if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) {
2992 _PyErr_Format(tstate, PyExc_TypeError,
2993 "'%.200s' object is not a mapping",
Victor Stinnera102ed72020-02-07 02:24:48 +01002994 Py_TYPE(update)->tp_name);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002995 }
Mark Shannon8a4cd702020-01-27 09:57:45 +00002996 Py_DECREF(update);
2997 goto error;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002998 }
Mark Shannon8a4cd702020-01-27 09:57:45 +00002999 Py_DECREF(update);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003000 DISPATCH();
3001 }
3002
Mark Shannon8a4cd702020-01-27 09:57:45 +00003003 case TARGET(DICT_MERGE): {
3004 PyObject *update = POP();
3005 PyObject *dict = PEEK(oparg);
3006
3007 if (_PyDict_MergeEx(dict, update, 2) < 0) {
3008 format_kwargs_error(tstate, PEEK(2 + oparg), update);
3009 Py_DECREF(update);
Serhiy Storchakae036ef82016-10-02 11:06:43 +03003010 goto error;
Serhiy Storchakae036ef82016-10-02 11:06:43 +03003011 }
Mark Shannon8a4cd702020-01-27 09:57:45 +00003012 Py_DECREF(update);
Brandt Bucherf185a732019-09-28 17:12:49 -07003013 PREDICT(CALL_FUNCTION_EX);
Serhiy Storchakae036ef82016-10-02 11:06:43 +03003014 DISPATCH();
3015 }
3016
Benjamin Petersonddd19492018-09-16 22:38:02 -07003017 case TARGET(MAP_ADD): {
Jörn Heisslerc8a35412019-06-22 16:40:55 +02003018 PyObject *value = TOP();
3019 PyObject *key = SECOND();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003020 PyObject *map;
3021 int err;
costypetrisor8ed317f2018-07-31 20:55:14 +00003022 STACK_SHRINK(2);
Raymond Hettinger41862222016-10-15 19:03:06 -07003023 map = PEEK(oparg); /* dict */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003024 assert(PyDict_CheckExact(map));
Martin Panter95f53c12016-07-18 08:23:26 +00003025 err = PyDict_SetItem(map, key, value); /* map[key] = value */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003026 Py_DECREF(value);
3027 Py_DECREF(key);
3028 if (err != 0)
3029 goto error;
3030 PREDICT(JUMP_ABSOLUTE);
3031 DISPATCH();
3032 }
3033
Benjamin Petersonddd19492018-09-16 22:38:02 -07003034 case TARGET(LOAD_ATTR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003035 PyObject *name = GETITEM(names, oparg);
3036 PyObject *owner = TOP();
3037 PyObject *res = PyObject_GetAttr(owner, name);
3038 Py_DECREF(owner);
3039 SET_TOP(res);
3040 if (res == NULL)
3041 goto error;
3042 DISPATCH();
3043 }
3044
Benjamin Petersonddd19492018-09-16 22:38:02 -07003045 case TARGET(COMPARE_OP): {
Mark Shannon9af0e472020-01-14 10:12:45 +00003046 assert(oparg <= Py_GE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003047 PyObject *right = POP();
3048 PyObject *left = TOP();
Mark Shannon9af0e472020-01-14 10:12:45 +00003049 PyObject *res = PyObject_RichCompare(left, right, oparg);
3050 SET_TOP(res);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003051 Py_DECREF(left);
3052 Py_DECREF(right);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003053 if (res == NULL)
3054 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003055 PREDICT(POP_JUMP_IF_FALSE);
3056 PREDICT(POP_JUMP_IF_TRUE);
3057 DISPATCH();
Victor Stinner3c1e4812012-03-26 22:10:51 +02003058 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003059
Mark Shannon9af0e472020-01-14 10:12:45 +00003060 case TARGET(IS_OP): {
3061 PyObject *right = POP();
3062 PyObject *left = TOP();
3063 int res = (left == right)^oparg;
3064 PyObject *b = res ? Py_True : Py_False;
3065 Py_INCREF(b);
3066 SET_TOP(b);
3067 Py_DECREF(left);
3068 Py_DECREF(right);
3069 PREDICT(POP_JUMP_IF_FALSE);
3070 PREDICT(POP_JUMP_IF_TRUE);
3071 FAST_DISPATCH();
3072 }
3073
3074 case TARGET(CONTAINS_OP): {
3075 PyObject *right = POP();
3076 PyObject *left = POP();
3077 int res = PySequence_Contains(right, left);
3078 Py_DECREF(left);
3079 Py_DECREF(right);
3080 if (res < 0) {
3081 goto error;
3082 }
3083 PyObject *b = (res^oparg) ? Py_True : Py_False;
3084 Py_INCREF(b);
3085 PUSH(b);
3086 PREDICT(POP_JUMP_IF_FALSE);
3087 PREDICT(POP_JUMP_IF_TRUE);
3088 FAST_DISPATCH();
3089 }
3090
3091#define CANNOT_CATCH_MSG "catching classes that do not inherit from "\
3092 "BaseException is not allowed"
3093
3094 case TARGET(JUMP_IF_NOT_EXC_MATCH): {
3095 PyObject *right = POP();
3096 PyObject *left = POP();
3097 if (PyTuple_Check(right)) {
3098 Py_ssize_t i, length;
3099 length = PyTuple_GET_SIZE(right);
3100 for (i = 0; i < length; i++) {
3101 PyObject *exc = PyTuple_GET_ITEM(right, i);
3102 if (!PyExceptionClass_Check(exc)) {
3103 _PyErr_SetString(tstate, PyExc_TypeError,
3104 CANNOT_CATCH_MSG);
3105 Py_DECREF(left);
3106 Py_DECREF(right);
3107 goto error;
3108 }
3109 }
3110 }
3111 else {
3112 if (!PyExceptionClass_Check(right)) {
3113 _PyErr_SetString(tstate, PyExc_TypeError,
3114 CANNOT_CATCH_MSG);
3115 Py_DECREF(left);
3116 Py_DECREF(right);
3117 goto error;
3118 }
3119 }
3120 int res = PyErr_GivenExceptionMatches(left, right);
3121 Py_DECREF(left);
3122 Py_DECREF(right);
3123 if (res > 0) {
3124 /* Exception matches -- Do nothing */;
3125 }
3126 else if (res == 0) {
3127 JUMPTO(oparg);
3128 }
3129 else {
3130 goto error;
3131 }
3132 DISPATCH();
3133 }
3134
Benjamin Petersonddd19492018-09-16 22:38:02 -07003135 case TARGET(IMPORT_NAME): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003136 PyObject *name = GETITEM(names, oparg);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03003137 PyObject *fromlist = POP();
3138 PyObject *level = TOP();
3139 PyObject *res;
Victor Stinner438a12d2019-05-24 17:01:38 +02003140 res = import_name(tstate, f, name, fromlist, level);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03003141 Py_DECREF(level);
3142 Py_DECREF(fromlist);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003143 SET_TOP(res);
3144 if (res == NULL)
3145 goto error;
3146 DISPATCH();
3147 }
3148
Benjamin Petersonddd19492018-09-16 22:38:02 -07003149 case TARGET(IMPORT_STAR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003150 PyObject *from = POP(), *locals;
3151 int err;
Matthias Bussonnier160edb42017-02-25 21:58:05 -08003152 if (PyFrame_FastToLocalsWithError(f) < 0) {
3153 Py_DECREF(from);
Victor Stinner41bb43a2013-10-29 01:19:37 +01003154 goto error;
Matthias Bussonnier160edb42017-02-25 21:58:05 -08003155 }
Victor Stinner41bb43a2013-10-29 01:19:37 +01003156
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003157 locals = f->f_locals;
3158 if (locals == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003159 _PyErr_SetString(tstate, PyExc_SystemError,
3160 "no locals found during 'import *'");
Matthias Bussonnier160edb42017-02-25 21:58:05 -08003161 Py_DECREF(from);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003162 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003163 }
Victor Stinner438a12d2019-05-24 17:01:38 +02003164 err = import_all_from(tstate, locals, from);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003165 PyFrame_LocalsToFast(f, 0);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003166 Py_DECREF(from);
3167 if (err != 0)
3168 goto error;
3169 DISPATCH();
3170 }
Guido van Rossum25831651993-05-19 14:50:45 +00003171
Benjamin Petersonddd19492018-09-16 22:38:02 -07003172 case TARGET(IMPORT_FROM): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003173 PyObject *name = GETITEM(names, oparg);
3174 PyObject *from = TOP();
3175 PyObject *res;
Victor Stinner438a12d2019-05-24 17:01:38 +02003176 res = import_from(tstate, from, name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003177 PUSH(res);
3178 if (res == NULL)
3179 goto error;
3180 DISPATCH();
3181 }
Thomas Wouters52152252000-08-17 22:55:00 +00003182
Benjamin Petersonddd19492018-09-16 22:38:02 -07003183 case TARGET(JUMP_FORWARD): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003184 JUMPBY(oparg);
3185 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003186 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003187
Benjamin Petersonddd19492018-09-16 22:38:02 -07003188 case TARGET(POP_JUMP_IF_FALSE): {
3189 PREDICTED(POP_JUMP_IF_FALSE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003190 PyObject *cond = POP();
3191 int err;
3192 if (cond == Py_True) {
3193 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003194 FAST_DISPATCH();
3195 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003196 if (cond == Py_False) {
3197 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003198 JUMPTO(oparg);
3199 FAST_DISPATCH();
3200 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003201 err = PyObject_IsTrue(cond);
3202 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003203 if (err > 0)
Adrian Wielgosik50c28502017-06-23 13:35:41 -07003204 ;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003205 else if (err == 0)
3206 JUMPTO(oparg);
3207 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003208 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003209 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003210 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003211
Benjamin Petersonddd19492018-09-16 22:38:02 -07003212 case TARGET(POP_JUMP_IF_TRUE): {
3213 PREDICTED(POP_JUMP_IF_TRUE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003214 PyObject *cond = POP();
3215 int err;
3216 if (cond == Py_False) {
3217 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003218 FAST_DISPATCH();
3219 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003220 if (cond == Py_True) {
3221 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003222 JUMPTO(oparg);
3223 FAST_DISPATCH();
3224 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003225 err = PyObject_IsTrue(cond);
3226 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003227 if (err > 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003228 JUMPTO(oparg);
3229 }
3230 else if (err == 0)
3231 ;
3232 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003233 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003234 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003235 }
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00003236
Benjamin Petersonddd19492018-09-16 22:38:02 -07003237 case TARGET(JUMP_IF_FALSE_OR_POP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003238 PyObject *cond = TOP();
3239 int err;
3240 if (cond == Py_True) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003241 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003242 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003243 FAST_DISPATCH();
3244 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003245 if (cond == Py_False) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003246 JUMPTO(oparg);
3247 FAST_DISPATCH();
3248 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003249 err = PyObject_IsTrue(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003250 if (err > 0) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003251 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003252 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003253 }
3254 else if (err == 0)
3255 JUMPTO(oparg);
3256 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003257 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003258 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003259 }
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00003260
Benjamin Petersonddd19492018-09-16 22:38:02 -07003261 case TARGET(JUMP_IF_TRUE_OR_POP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003262 PyObject *cond = TOP();
3263 int err;
3264 if (cond == Py_False) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003265 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003266 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003267 FAST_DISPATCH();
3268 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003269 if (cond == Py_True) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003270 JUMPTO(oparg);
3271 FAST_DISPATCH();
3272 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003273 err = PyObject_IsTrue(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003274 if (err > 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003275 JUMPTO(oparg);
3276 }
3277 else if (err == 0) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003278 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003279 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003280 }
3281 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003282 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003283 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003284 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003285
Benjamin Petersonddd19492018-09-16 22:38:02 -07003286 case TARGET(JUMP_ABSOLUTE): {
3287 PREDICTED(JUMP_ABSOLUTE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003288 JUMPTO(oparg);
Guido van Rossum58da9312007-11-10 23:39:45 +00003289#if FAST_LOOPS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003290 /* Enabling this path speeds-up all while and for-loops by bypassing
3291 the per-loop checks for signals. By default, this should be turned-off
3292 because it prevents detection of a control-break in tight loops like
3293 "while 1: pass". Compile with this option turned-on when you need
3294 the speed-up and do not need break checking inside tight loops (ones
3295 that contain only instructions ending with FAST_DISPATCH).
3296 */
3297 FAST_DISPATCH();
Guido van Rossum58da9312007-11-10 23:39:45 +00003298#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003299 DISPATCH();
Guido van Rossum58da9312007-11-10 23:39:45 +00003300#endif
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003301 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003302
Benjamin Petersonddd19492018-09-16 22:38:02 -07003303 case TARGET(GET_ITER): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003304 /* before: [obj]; after [getiter(obj)] */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003305 PyObject *iterable = TOP();
Yury Selivanov5376ba92015-06-22 12:19:30 -04003306 PyObject *iter = PyObject_GetIter(iterable);
3307 Py_DECREF(iterable);
3308 SET_TOP(iter);
3309 if (iter == NULL)
3310 goto error;
3311 PREDICT(FOR_ITER);
Serhiy Storchakada9c5132016-06-27 18:58:57 +03003312 PREDICT(CALL_FUNCTION);
Yury Selivanov5376ba92015-06-22 12:19:30 -04003313 DISPATCH();
3314 }
3315
Benjamin Petersonddd19492018-09-16 22:38:02 -07003316 case TARGET(GET_YIELD_FROM_ITER): {
Yury Selivanov5376ba92015-06-22 12:19:30 -04003317 /* before: [obj]; after [getiter(obj)] */
3318 PyObject *iterable = TOP();
Yury Selivanov75445082015-05-11 22:57:16 -04003319 PyObject *iter;
Yury Selivanov5376ba92015-06-22 12:19:30 -04003320 if (PyCoro_CheckExact(iterable)) {
3321 /* `iterable` is a coroutine */
3322 if (!(co->co_flags & (CO_COROUTINE | CO_ITERABLE_COROUTINE))) {
3323 /* and it is used in a 'yield from' expression of a
3324 regular generator. */
3325 Py_DECREF(iterable);
3326 SET_TOP(NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02003327 _PyErr_SetString(tstate, PyExc_TypeError,
3328 "cannot 'yield from' a coroutine object "
3329 "in a non-coroutine generator");
Yury Selivanov5376ba92015-06-22 12:19:30 -04003330 goto error;
3331 }
3332 }
3333 else if (!PyGen_CheckExact(iterable)) {
Yury Selivanov75445082015-05-11 22:57:16 -04003334 /* `iterable` is not a generator. */
3335 iter = PyObject_GetIter(iterable);
3336 Py_DECREF(iterable);
3337 SET_TOP(iter);
3338 if (iter == NULL)
3339 goto error;
3340 }
Serhiy Storchakada9c5132016-06-27 18:58:57 +03003341 PREDICT(LOAD_CONST);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003342 DISPATCH();
3343 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003344
Benjamin Petersonddd19492018-09-16 22:38:02 -07003345 case TARGET(FOR_ITER): {
3346 PREDICTED(FOR_ITER);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003347 /* before: [iter]; after: [iter, iter()] *or* [] */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003348 PyObject *iter = TOP();
Victor Stinnera102ed72020-02-07 02:24:48 +01003349 PyObject *next = (*Py_TYPE(iter)->tp_iternext)(iter);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003350 if (next != NULL) {
3351 PUSH(next);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003352 PREDICT(STORE_FAST);
3353 PREDICT(UNPACK_SEQUENCE);
3354 DISPATCH();
3355 }
Victor Stinner438a12d2019-05-24 17:01:38 +02003356 if (_PyErr_Occurred(tstate)) {
3357 if (!_PyErr_ExceptionMatches(tstate, PyExc_StopIteration)) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003358 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02003359 }
3360 else if (tstate->c_tracefunc != NULL) {
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003361 call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj, tstate, f);
Victor Stinner438a12d2019-05-24 17:01:38 +02003362 }
3363 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003364 }
3365 /* iterator ended normally */
costypetrisor8ed317f2018-07-31 20:55:14 +00003366 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003367 Py_DECREF(iter);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003368 JUMPBY(oparg);
Serhiy Storchakada9c5132016-06-27 18:58:57 +03003369 PREDICT(POP_BLOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003370 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003371 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003372
Benjamin Petersonddd19492018-09-16 22:38:02 -07003373 case TARGET(SETUP_FINALLY): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003374 PyFrame_BlockSetup(f, SETUP_FINALLY, INSTR_OFFSET() + oparg,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003375 STACK_LEVEL());
3376 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003377 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003378
Benjamin Petersonddd19492018-09-16 22:38:02 -07003379 case TARGET(BEFORE_ASYNC_WITH): {
Yury Selivanov75445082015-05-11 22:57:16 -04003380 _Py_IDENTIFIER(__aenter__);
Géry Ogam1d1b97a2020-01-14 12:58:29 +01003381 _Py_IDENTIFIER(__aexit__);
Yury Selivanov75445082015-05-11 22:57:16 -04003382 PyObject *mgr = TOP();
Géry Ogam1d1b97a2020-01-14 12:58:29 +01003383 PyObject *enter = special_lookup(tstate, mgr, &PyId___aenter__);
Yury Selivanov75445082015-05-11 22:57:16 -04003384 PyObject *res;
Géry Ogam1d1b97a2020-01-14 12:58:29 +01003385 if (enter == NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04003386 goto error;
Géry Ogam1d1b97a2020-01-14 12:58:29 +01003387 }
3388 PyObject *exit = special_lookup(tstate, mgr, &PyId___aexit__);
3389 if (exit == NULL) {
3390 Py_DECREF(enter);
3391 goto error;
3392 }
Yury Selivanov75445082015-05-11 22:57:16 -04003393 SET_TOP(exit);
Yury Selivanov75445082015-05-11 22:57:16 -04003394 Py_DECREF(mgr);
Victor Stinnerf17c3de2016-12-06 18:46:19 +01003395 res = _PyObject_CallNoArg(enter);
Yury Selivanov75445082015-05-11 22:57:16 -04003396 Py_DECREF(enter);
3397 if (res == NULL)
3398 goto error;
3399 PUSH(res);
Serhiy Storchakada9c5132016-06-27 18:58:57 +03003400 PREDICT(GET_AWAITABLE);
Yury Selivanov75445082015-05-11 22:57:16 -04003401 DISPATCH();
3402 }
3403
Benjamin Petersonddd19492018-09-16 22:38:02 -07003404 case TARGET(SETUP_ASYNC_WITH): {
Yury Selivanov75445082015-05-11 22:57:16 -04003405 PyObject *res = POP();
3406 /* Setup the finally block before pushing the result
3407 of __aenter__ on the stack. */
3408 PyFrame_BlockSetup(f, SETUP_FINALLY, INSTR_OFFSET() + oparg,
3409 STACK_LEVEL());
3410 PUSH(res);
3411 DISPATCH();
3412 }
3413
Benjamin Petersonddd19492018-09-16 22:38:02 -07003414 case TARGET(SETUP_WITH): {
Benjamin Petersonce798522012-01-22 11:24:29 -05003415 _Py_IDENTIFIER(__enter__);
Géry Ogam1d1b97a2020-01-14 12:58:29 +01003416 _Py_IDENTIFIER(__exit__);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003417 PyObject *mgr = TOP();
Victor Stinner438a12d2019-05-24 17:01:38 +02003418 PyObject *enter = special_lookup(tstate, mgr, &PyId___enter__);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003419 PyObject *res;
Victor Stinner438a12d2019-05-24 17:01:38 +02003420 if (enter == NULL) {
Raymond Hettingera3fec152016-11-21 17:24:23 -08003421 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02003422 }
3423 PyObject *exit = special_lookup(tstate, mgr, &PyId___exit__);
Raymond Hettinger64e2f9a2016-11-22 11:50:40 -08003424 if (exit == NULL) {
3425 Py_DECREF(enter);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003426 goto error;
Raymond Hettinger64e2f9a2016-11-22 11:50:40 -08003427 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003428 SET_TOP(exit);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003429 Py_DECREF(mgr);
Victor Stinnerf17c3de2016-12-06 18:46:19 +01003430 res = _PyObject_CallNoArg(enter);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003431 Py_DECREF(enter);
3432 if (res == NULL)
3433 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003434 /* Setup the finally block before pushing the result
3435 of __enter__ on the stack. */
3436 PyFrame_BlockSetup(f, SETUP_FINALLY, INSTR_OFFSET() + oparg,
3437 STACK_LEVEL());
Benjamin Peterson876b2f22009-06-28 03:18:59 +00003438
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003439 PUSH(res);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003440 DISPATCH();
3441 }
Benjamin Peterson876b2f22009-06-28 03:18:59 +00003442
Mark Shannonfee55262019-11-21 09:11:43 +00003443 case TARGET(WITH_EXCEPT_START): {
3444 /* At the top of the stack are 7 values:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003445 - (TOP, SECOND, THIRD) = exc_info()
Mark Shannonfee55262019-11-21 09:11:43 +00003446 - (FOURTH, FIFTH, SIXTH) = previous exception for EXCEPT_HANDLER
3447 - SEVENTH: the context.__exit__ bound method
3448 We call SEVENTH(TOP, SECOND, THIRD).
3449 Then we push again the TOP exception and the __exit__
3450 return value.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003451 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003452 PyObject *exit_func;
Victor Stinner842cfff2016-12-01 14:45:31 +01003453 PyObject *exc, *val, *tb, *res;
3454
Victor Stinner842cfff2016-12-01 14:45:31 +01003455 exc = TOP();
Mark Shannonfee55262019-11-21 09:11:43 +00003456 val = SECOND();
3457 tb = THIRD();
3458 assert(exc != Py_None);
3459 assert(!PyLong_Check(exc));
3460 exit_func = PEEK(7);
Jeroen Demeyer469d1a72019-07-03 12:52:21 +02003461 PyObject *stack[4] = {NULL, exc, val, tb};
Petr Viktorinffd97532020-02-11 17:46:57 +01003462 res = PyObject_Vectorcall(exit_func, stack + 1,
Jeroen Demeyer469d1a72019-07-03 12:52:21 +02003463 3 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003464 if (res == NULL)
3465 goto error;
Amaury Forgeot d'Arc10b24e82008-12-10 23:49:33 +00003466
Yury Selivanov75445082015-05-11 22:57:16 -04003467 PUSH(res);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003468 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003469 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00003470
Benjamin Petersonddd19492018-09-16 22:38:02 -07003471 case TARGET(LOAD_METHOD): {
Andreyb021ba52019-04-29 14:33:26 +10003472 /* Designed to work in tandem with CALL_METHOD. */
Yury Selivanovf2392132016-12-13 19:03:51 -05003473 PyObject *name = GETITEM(names, oparg);
3474 PyObject *obj = TOP();
3475 PyObject *meth = NULL;
3476
3477 int meth_found = _PyObject_GetMethod(obj, name, &meth);
3478
Yury Selivanovf2392132016-12-13 19:03:51 -05003479 if (meth == NULL) {
3480 /* Most likely attribute wasn't found. */
Yury Selivanovf2392132016-12-13 19:03:51 -05003481 goto error;
3482 }
3483
3484 if (meth_found) {
INADA Naoki015bce62017-01-16 17:23:30 +09003485 /* We can bypass temporary bound method object.
3486 meth is unbound method and obj is self.
Victor Stinnera8cb5152017-01-18 14:12:51 +01003487
INADA Naoki015bce62017-01-16 17:23:30 +09003488 meth | self | arg1 | ... | argN
3489 */
3490 SET_TOP(meth);
3491 PUSH(obj); // self
Yury Selivanovf2392132016-12-13 19:03:51 -05003492 }
3493 else {
INADA Naoki015bce62017-01-16 17:23:30 +09003494 /* meth is not an unbound method (but a regular attr, or
3495 something was returned by a descriptor protocol). Set
3496 the second element of the stack to NULL, to signal
Yury Selivanovf2392132016-12-13 19:03:51 -05003497 CALL_METHOD that it's not a method call.
INADA Naoki015bce62017-01-16 17:23:30 +09003498
3499 NULL | meth | arg1 | ... | argN
Yury Selivanovf2392132016-12-13 19:03:51 -05003500 */
INADA Naoki015bce62017-01-16 17:23:30 +09003501 SET_TOP(NULL);
Yury Selivanovf2392132016-12-13 19:03:51 -05003502 Py_DECREF(obj);
INADA Naoki015bce62017-01-16 17:23:30 +09003503 PUSH(meth);
Yury Selivanovf2392132016-12-13 19:03:51 -05003504 }
3505 DISPATCH();
3506 }
3507
Benjamin Petersonddd19492018-09-16 22:38:02 -07003508 case TARGET(CALL_METHOD): {
Yury Selivanovf2392132016-12-13 19:03:51 -05003509 /* Designed to work in tamdem with LOAD_METHOD. */
INADA Naoki015bce62017-01-16 17:23:30 +09003510 PyObject **sp, *res, *meth;
Yury Selivanovf2392132016-12-13 19:03:51 -05003511
3512 sp = stack_pointer;
3513
INADA Naoki015bce62017-01-16 17:23:30 +09003514 meth = PEEK(oparg + 2);
3515 if (meth == NULL) {
3516 /* `meth` is NULL when LOAD_METHOD thinks that it's not
3517 a method call.
Yury Selivanovf2392132016-12-13 19:03:51 -05003518
3519 Stack layout:
3520
INADA Naoki015bce62017-01-16 17:23:30 +09003521 ... | NULL | callable | arg1 | ... | argN
3522 ^- TOP()
3523 ^- (-oparg)
3524 ^- (-oparg-1)
3525 ^- (-oparg-2)
Yury Selivanovf2392132016-12-13 19:03:51 -05003526
Ville Skyttä49b27342017-08-03 09:00:59 +03003527 `callable` will be POPed by call_function.
INADA Naoki015bce62017-01-16 17:23:30 +09003528 NULL will will be POPed manually later.
Yury Selivanovf2392132016-12-13 19:03:51 -05003529 */
Victor Stinner09532fe2019-05-10 23:39:09 +02003530 res = call_function(tstate, &sp, oparg, NULL);
Yury Selivanovf2392132016-12-13 19:03:51 -05003531 stack_pointer = sp;
INADA Naoki015bce62017-01-16 17:23:30 +09003532 (void)POP(); /* POP the NULL. */
Yury Selivanovf2392132016-12-13 19:03:51 -05003533 }
3534 else {
3535 /* This is a method call. Stack layout:
3536
INADA Naoki015bce62017-01-16 17:23:30 +09003537 ... | method | self | arg1 | ... | argN
Yury Selivanovf2392132016-12-13 19:03:51 -05003538 ^- TOP()
3539 ^- (-oparg)
INADA Naoki015bce62017-01-16 17:23:30 +09003540 ^- (-oparg-1)
3541 ^- (-oparg-2)
Yury Selivanovf2392132016-12-13 19:03:51 -05003542
INADA Naoki015bce62017-01-16 17:23:30 +09003543 `self` and `method` will be POPed by call_function.
Yury Selivanovf2392132016-12-13 19:03:51 -05003544 We'll be passing `oparg + 1` to call_function, to
INADA Naoki015bce62017-01-16 17:23:30 +09003545 make it accept the `self` as a first argument.
Yury Selivanovf2392132016-12-13 19:03:51 -05003546 */
Victor Stinner09532fe2019-05-10 23:39:09 +02003547 res = call_function(tstate, &sp, oparg + 1, NULL);
Yury Selivanovf2392132016-12-13 19:03:51 -05003548 stack_pointer = sp;
3549 }
3550
3551 PUSH(res);
3552 if (res == NULL)
3553 goto error;
3554 DISPATCH();
3555 }
3556
Benjamin Petersonddd19492018-09-16 22:38:02 -07003557 case TARGET(CALL_FUNCTION): {
3558 PREDICTED(CALL_FUNCTION);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003559 PyObject **sp, *res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003560 sp = stack_pointer;
Victor Stinner09532fe2019-05-10 23:39:09 +02003561 res = call_function(tstate, &sp, oparg, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003562 stack_pointer = sp;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003563 PUSH(res);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003564 if (res == NULL) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003565 goto error;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003566 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003567 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003568 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003569
Benjamin Petersonddd19492018-09-16 22:38:02 -07003570 case TARGET(CALL_FUNCTION_KW): {
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003571 PyObject **sp, *res, *names;
3572
3573 names = POP();
Jeroen Demeyer05677862019-08-16 12:41:27 +02003574 assert(PyTuple_Check(names));
3575 assert(PyTuple_GET_SIZE(names) <= oparg);
3576 /* We assume without checking that names contains only strings */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003577 sp = stack_pointer;
Victor Stinner09532fe2019-05-10 23:39:09 +02003578 res = call_function(tstate, &sp, oparg, names);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003579 stack_pointer = sp;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003580 PUSH(res);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003581 Py_DECREF(names);
3582
3583 if (res == NULL) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003584 goto error;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003585 }
3586 DISPATCH();
3587 }
3588
Benjamin Petersonddd19492018-09-16 22:38:02 -07003589 case TARGET(CALL_FUNCTION_EX): {
Brandt Bucherf185a732019-09-28 17:12:49 -07003590 PREDICTED(CALL_FUNCTION_EX);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003591 PyObject *func, *callargs, *kwargs = NULL, *result;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003592 if (oparg & 0x01) {
3593 kwargs = POP();
Serhiy Storchakab7281052016-09-12 00:52:40 +03003594 if (!PyDict_CheckExact(kwargs)) {
3595 PyObject *d = PyDict_New();
3596 if (d == NULL)
3597 goto error;
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02003598 if (_PyDict_MergeEx(d, kwargs, 2) < 0) {
Serhiy Storchakab7281052016-09-12 00:52:40 +03003599 Py_DECREF(d);
Victor Stinner438a12d2019-05-24 17:01:38 +02003600 format_kwargs_error(tstate, SECOND(), kwargs);
Victor Stinnereece2222016-09-12 11:16:37 +02003601 Py_DECREF(kwargs);
Serhiy Storchakab7281052016-09-12 00:52:40 +03003602 goto error;
3603 }
3604 Py_DECREF(kwargs);
3605 kwargs = d;
3606 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003607 assert(PyDict_CheckExact(kwargs));
3608 }
3609 callargs = POP();
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003610 func = TOP();
Serhiy Storchaka63dc5482016-09-22 19:41:20 +03003611 if (!PyTuple_CheckExact(callargs)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003612 if (check_args_iterable(tstate, func, callargs) < 0) {
Victor Stinnereece2222016-09-12 11:16:37 +02003613 Py_DECREF(callargs);
Serhiy Storchakab7281052016-09-12 00:52:40 +03003614 goto error;
3615 }
3616 Py_SETREF(callargs, PySequence_Tuple(callargs));
3617 if (callargs == NULL) {
3618 goto error;
3619 }
3620 }
Serhiy Storchaka63dc5482016-09-22 19:41:20 +03003621 assert(PyTuple_CheckExact(callargs));
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003622
Victor Stinner09532fe2019-05-10 23:39:09 +02003623 result = do_call_core(tstate, func, callargs, kwargs);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003624 Py_DECREF(func);
3625 Py_DECREF(callargs);
3626 Py_XDECREF(kwargs);
3627
3628 SET_TOP(result);
3629 if (result == NULL) {
3630 goto error;
3631 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003632 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003633 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003634
Benjamin Petersonddd19492018-09-16 22:38:02 -07003635 case TARGET(MAKE_FUNCTION): {
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003636 PyObject *qualname = POP();
3637 PyObject *codeobj = POP();
3638 PyFunctionObject *func = (PyFunctionObject *)
3639 PyFunction_NewWithQualName(codeobj, f->f_globals, qualname);
Guido van Rossum4f72a782006-10-27 23:31:49 +00003640
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003641 Py_DECREF(codeobj);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003642 Py_DECREF(qualname);
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003643 if (func == NULL) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003644 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003645 }
Neal Norwitzc1505362006-12-28 06:47:50 +00003646
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003647 if (oparg & 0x08) {
3648 assert(PyTuple_CheckExact(TOP()));
3649 func ->func_closure = POP();
3650 }
3651 if (oparg & 0x04) {
3652 assert(PyDict_CheckExact(TOP()));
3653 func->func_annotations = POP();
3654 }
3655 if (oparg & 0x02) {
3656 assert(PyDict_CheckExact(TOP()));
3657 func->func_kwdefaults = POP();
3658 }
3659 if (oparg & 0x01) {
3660 assert(PyTuple_CheckExact(TOP()));
3661 func->func_defaults = POP();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003662 }
Neal Norwitzc1505362006-12-28 06:47:50 +00003663
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003664 PUSH((PyObject *)func);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003665 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003666 }
Guido van Rossum8861b741996-07-30 16:49:37 +00003667
Benjamin Petersonddd19492018-09-16 22:38:02 -07003668 case TARGET(BUILD_SLICE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003669 PyObject *start, *stop, *step, *slice;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003670 if (oparg == 3)
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003671 step = POP();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003672 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003673 step = NULL;
3674 stop = POP();
3675 start = TOP();
3676 slice = PySlice_New(start, stop, step);
3677 Py_DECREF(start);
3678 Py_DECREF(stop);
3679 Py_XDECREF(step);
3680 SET_TOP(slice);
3681 if (slice == NULL)
3682 goto error;
3683 DISPATCH();
3684 }
Guido van Rossum8861b741996-07-30 16:49:37 +00003685
Benjamin Petersonddd19492018-09-16 22:38:02 -07003686 case TARGET(FORMAT_VALUE): {
Eric V. Smitha78c7952015-11-03 12:45:05 -05003687 /* Handles f-string value formatting. */
3688 PyObject *result;
3689 PyObject *fmt_spec;
3690 PyObject *value;
3691 PyObject *(*conv_fn)(PyObject *);
3692 int which_conversion = oparg & FVC_MASK;
3693 int have_fmt_spec = (oparg & FVS_MASK) == FVS_HAVE_SPEC;
3694
3695 fmt_spec = have_fmt_spec ? POP() : NULL;
Eric V. Smith135d5f42016-02-05 18:23:08 -05003696 value = POP();
Eric V. Smitha78c7952015-11-03 12:45:05 -05003697
3698 /* See if any conversion is specified. */
3699 switch (which_conversion) {
Eric V. Smith9a4135e2019-05-08 16:28:48 -04003700 case FVC_NONE: conv_fn = NULL; break;
Eric V. Smitha78c7952015-11-03 12:45:05 -05003701 case FVC_STR: conv_fn = PyObject_Str; break;
3702 case FVC_REPR: conv_fn = PyObject_Repr; break;
3703 case FVC_ASCII: conv_fn = PyObject_ASCII; break;
Eric V. Smith9a4135e2019-05-08 16:28:48 -04003704 default:
Victor Stinner438a12d2019-05-24 17:01:38 +02003705 _PyErr_Format(tstate, PyExc_SystemError,
3706 "unexpected conversion flag %d",
3707 which_conversion);
Eric V. Smith9a4135e2019-05-08 16:28:48 -04003708 goto error;
Eric V. Smitha78c7952015-11-03 12:45:05 -05003709 }
3710
3711 /* If there's a conversion function, call it and replace
3712 value with that result. Otherwise, just use value,
3713 without conversion. */
Eric V. Smitheb588a12016-02-05 18:26:20 -05003714 if (conv_fn != NULL) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05003715 result = conv_fn(value);
3716 Py_DECREF(value);
Eric V. Smitheb588a12016-02-05 18:26:20 -05003717 if (result == NULL) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05003718 Py_XDECREF(fmt_spec);
3719 goto error;
3720 }
3721 value = result;
3722 }
3723
3724 /* If value is a unicode object, and there's no fmt_spec,
3725 then we know the result of format(value) is value
3726 itself. In that case, skip calling format(). I plan to
3727 move this optimization in to PyObject_Format()
3728 itself. */
3729 if (PyUnicode_CheckExact(value) && fmt_spec == NULL) {
3730 /* Do nothing, just transfer ownership to result. */
3731 result = value;
3732 } else {
3733 /* Actually call format(). */
3734 result = PyObject_Format(value, fmt_spec);
3735 Py_DECREF(value);
3736 Py_XDECREF(fmt_spec);
Eric V. Smitheb588a12016-02-05 18:26:20 -05003737 if (result == NULL) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05003738 goto error;
Eric V. Smitheb588a12016-02-05 18:26:20 -05003739 }
Eric V. Smitha78c7952015-11-03 12:45:05 -05003740 }
3741
Eric V. Smith135d5f42016-02-05 18:23:08 -05003742 PUSH(result);
Eric V. Smitha78c7952015-11-03 12:45:05 -05003743 DISPATCH();
3744 }
3745
Benjamin Petersonddd19492018-09-16 22:38:02 -07003746 case TARGET(EXTENDED_ARG): {
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03003747 int oldoparg = oparg;
3748 NEXTOPARG();
3749 oparg |= oldoparg << 8;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003750 goto dispatch_opcode;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003751 }
Guido van Rossum8861b741996-07-30 16:49:37 +00003752
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003753
Antoine Pitrou042b1282010-08-13 21:15:58 +00003754#if USE_COMPUTED_GOTOS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003755 _unknown_opcode:
Antoine Pitroub52ec782009-01-25 16:34:23 +00003756#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003757 default:
3758 fprintf(stderr,
3759 "XXX lineno: %d, opcode: %d\n",
3760 PyFrame_GetLineNumber(f),
3761 opcode);
Victor Stinner438a12d2019-05-24 17:01:38 +02003762 _PyErr_SetString(tstate, PyExc_SystemError, "unknown opcode");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003763 goto error;
Guido van Rossum04691fc1992-08-12 15:35:34 +00003764
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003765 } /* switch */
Guido van Rossum374a9221991-04-04 10:40:29 +00003766
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003767 /* This should never be reached. Every opcode should end with DISPATCH()
3768 or goto error. */
Barry Warsawb2e57942017-09-14 18:13:16 -07003769 Py_UNREACHABLE();
Guido van Rossumac7be682001-01-17 15:42:30 +00003770
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003771error:
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003772 /* Double-check exception status. */
Victor Stinner365b6932013-07-12 00:11:58 +02003773#ifdef NDEBUG
Victor Stinner438a12d2019-05-24 17:01:38 +02003774 if (!_PyErr_Occurred(tstate)) {
3775 _PyErr_SetString(tstate, PyExc_SystemError,
3776 "error return without exception set");
3777 }
Victor Stinner365b6932013-07-12 00:11:58 +02003778#else
Victor Stinner438a12d2019-05-24 17:01:38 +02003779 assert(_PyErr_Occurred(tstate));
Victor Stinner365b6932013-07-12 00:11:58 +02003780#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00003781
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003782 /* Log traceback info. */
3783 PyTraceBack_Here(f);
Guido van Rossumac7be682001-01-17 15:42:30 +00003784
Mark Shannoncb9879b2020-07-17 11:44:23 +01003785 if (tstate->c_tracefunc != NULL) {
3786 /* Make sure state is set to FRAME_EXECUTING for tracing */
3787 assert(f->f_state == FRAME_EXECUTING);
3788 f->f_state = FRAME_UNWINDING;
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003789 call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj,
3790 tstate, f);
Mark Shannoncb9879b2020-07-17 11:44:23 +01003791 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003792exception_unwind:
Mark Shannoncb9879b2020-07-17 11:44:23 +01003793 f->f_state = FRAME_UNWINDING;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003794 /* Unwind stacks if an exception occurred */
3795 while (f->f_iblock > 0) {
3796 /* Pop the current block. */
3797 PyTryBlock *b = &f->f_blockstack[--f->f_iblock];
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003798
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003799 if (b->b_type == EXCEPT_HANDLER) {
3800 UNWIND_EXCEPT_HANDLER(b);
3801 continue;
3802 }
3803 UNWIND_BLOCK(b);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003804 if (b->b_type == SETUP_FINALLY) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003805 PyObject *exc, *val, *tb;
3806 int handler = b->b_handler;
Mark Shannonae3087c2017-10-22 22:41:51 +01003807 _PyErr_StackItem *exc_info = tstate->exc_info;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003808 /* Beware, this invalidates all b->b_* fields */
3809 PyFrame_BlockSetup(f, EXCEPT_HANDLER, -1, STACK_LEVEL());
Mark Shannonae3087c2017-10-22 22:41:51 +01003810 PUSH(exc_info->exc_traceback);
3811 PUSH(exc_info->exc_value);
3812 if (exc_info->exc_type != NULL) {
3813 PUSH(exc_info->exc_type);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003814 }
3815 else {
3816 Py_INCREF(Py_None);
3817 PUSH(Py_None);
3818 }
Victor Stinner438a12d2019-05-24 17:01:38 +02003819 _PyErr_Fetch(tstate, &exc, &val, &tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003820 /* Make the raw exception data
3821 available to the handler,
3822 so a program can emulate the
3823 Python main loop. */
Victor Stinner438a12d2019-05-24 17:01:38 +02003824 _PyErr_NormalizeException(tstate, &exc, &val, &tb);
Victor Stinner7eab0d02013-07-15 21:16:27 +02003825 if (tb != NULL)
3826 PyException_SetTraceback(val, tb);
3827 else
3828 PyException_SetTraceback(val, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003829 Py_INCREF(exc);
Mark Shannonae3087c2017-10-22 22:41:51 +01003830 exc_info->exc_type = exc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003831 Py_INCREF(val);
Mark Shannonae3087c2017-10-22 22:41:51 +01003832 exc_info->exc_value = val;
3833 exc_info->exc_traceback = tb;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003834 if (tb == NULL)
3835 tb = Py_None;
3836 Py_INCREF(tb);
3837 PUSH(tb);
3838 PUSH(val);
3839 PUSH(exc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003840 JUMPTO(handler);
Victor Stinnerdab84232020-03-17 18:56:44 +01003841 if (_Py_TracingPossible(ceval2)) {
Pablo Galindo4c53e632020-01-10 09:24:22 +00003842 int needs_new_execution_window = (f->f_lasti < instr_lb || f->f_lasti >= instr_ub);
3843 int needs_line_update = (f->f_lasti == instr_lb || f->f_lasti < instr_prev);
3844 /* Make sure that we trace line after exception if we are in a new execution
3845 * window or we don't need a line update and we are not in the first instruction
3846 * of the line. */
3847 if (needs_new_execution_window || (!needs_line_update && instr_lb > 0)) {
3848 instr_prev = INT_MAX;
3849 }
Mark Shannonfee55262019-11-21 09:11:43 +00003850 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003851 /* Resume normal execution */
Mark Shannoncb9879b2020-07-17 11:44:23 +01003852 f->f_state = FRAME_EXECUTING;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003853 goto main_loop;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003854 }
3855 } /* unwind stack */
Guido van Rossum374a9221991-04-04 10:40:29 +00003856
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003857 /* End the loop as we still have an error */
3858 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003859 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00003860
Pablo Galindof00828a2019-05-09 16:52:02 +01003861 assert(retval == NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02003862 assert(_PyErr_Occurred(tstate));
Pablo Galindof00828a2019-05-09 16:52:02 +01003863
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003864 /* Pop remaining stack entries. */
3865 while (!EMPTY()) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003866 PyObject *o = POP();
3867 Py_XDECREF(o);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003868 }
Mark Shannoncb9879b2020-07-17 11:44:23 +01003869 f->f_stackdepth = 0;
3870 f->f_state = FRAME_RAISED;
Mark Shannone7c9f4a2020-01-13 12:51:26 +00003871exiting:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003872 if (tstate->use_tracing) {
Benjamin Peterson51f46162013-01-23 08:38:47 -05003873 if (tstate->c_tracefunc) {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003874 if (call_trace_protected(tstate->c_tracefunc, tstate->c_traceobj,
3875 tstate, f, PyTrace_RETURN, retval)) {
3876 Py_CLEAR(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003877 }
3878 }
3879 if (tstate->c_profilefunc) {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003880 if (call_trace_protected(tstate->c_profilefunc, tstate->c_profileobj,
3881 tstate, f, PyTrace_RETURN, retval)) {
Serhiy Storchaka505ff752014-02-09 13:33:53 +02003882 Py_CLEAR(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003883 }
3884 }
3885 }
Guido van Rossuma4240131997-01-21 21:18:36 +00003886
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003887 /* pop frame */
Thomas Woutersce272b62007-09-19 21:19:28 +00003888exit_eval_frame:
Łukasz Langaa785c872016-09-09 17:37:37 -07003889 if (PyDTrace_FUNCTION_RETURN_ENABLED())
3890 dtrace_function_return(f);
Victor Stinnerbe434dc2019-11-05 00:51:22 +01003891 _Py_LeaveRecursiveCall(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003892 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00003893
Victor Stinner0b72b232020-03-12 23:18:39 +01003894 return _Py_CheckFunctionResult(tstate, NULL, retval, __func__);
Guido van Rossum374a9221991-04-04 10:40:29 +00003895}
3896
Benjamin Petersonb204a422011-06-05 22:04:07 -05003897static void
Victor Stinner438a12d2019-05-24 17:01:38 +02003898format_missing(PyThreadState *tstate, const char *kind,
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04003899 PyCodeObject *co, PyObject *names, PyObject *qualname)
Benjamin Petersone109c702011-06-24 09:37:26 -05003900{
3901 int err;
3902 Py_ssize_t len = PyList_GET_SIZE(names);
3903 PyObject *name_str, *comma, *tail, *tmp;
3904
3905 assert(PyList_CheckExact(names));
3906 assert(len >= 1);
3907 /* Deal with the joys of natural language. */
3908 switch (len) {
3909 case 1:
3910 name_str = PyList_GET_ITEM(names, 0);
3911 Py_INCREF(name_str);
3912 break;
3913 case 2:
3914 name_str = PyUnicode_FromFormat("%U and %U",
3915 PyList_GET_ITEM(names, len - 2),
3916 PyList_GET_ITEM(names, len - 1));
3917 break;
3918 default:
3919 tail = PyUnicode_FromFormat(", %U, and %U",
3920 PyList_GET_ITEM(names, len - 2),
3921 PyList_GET_ITEM(names, len - 1));
Benjamin Petersond1ab6082012-06-01 11:18:22 -07003922 if (tail == NULL)
3923 return;
Benjamin Petersone109c702011-06-24 09:37:26 -05003924 /* Chop off the last two objects in the list. This shouldn't actually
3925 fail, but we can't be too careful. */
3926 err = PyList_SetSlice(names, len - 2, len, NULL);
3927 if (err == -1) {
3928 Py_DECREF(tail);
3929 return;
3930 }
3931 /* Stitch everything up into a nice comma-separated list. */
3932 comma = PyUnicode_FromString(", ");
3933 if (comma == NULL) {
3934 Py_DECREF(tail);
3935 return;
3936 }
3937 tmp = PyUnicode_Join(comma, names);
3938 Py_DECREF(comma);
3939 if (tmp == NULL) {
3940 Py_DECREF(tail);
3941 return;
3942 }
3943 name_str = PyUnicode_Concat(tmp, tail);
3944 Py_DECREF(tmp);
3945 Py_DECREF(tail);
3946 break;
3947 }
3948 if (name_str == NULL)
3949 return;
Victor Stinner438a12d2019-05-24 17:01:38 +02003950 _PyErr_Format(tstate, PyExc_TypeError,
3951 "%U() missing %i required %s argument%s: %U",
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04003952 qualname,
Victor Stinner438a12d2019-05-24 17:01:38 +02003953 len,
3954 kind,
3955 len == 1 ? "" : "s",
3956 name_str);
Benjamin Petersone109c702011-06-24 09:37:26 -05003957 Py_DECREF(name_str);
3958}
3959
3960static void
Victor Stinner438a12d2019-05-24 17:01:38 +02003961missing_arguments(PyThreadState *tstate, PyCodeObject *co,
3962 Py_ssize_t missing, Py_ssize_t defcount,
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04003963 PyObject **fastlocals, PyObject *qualname)
Benjamin Petersone109c702011-06-24 09:37:26 -05003964{
Victor Stinner74319ae2016-08-25 00:04:09 +02003965 Py_ssize_t i, j = 0;
3966 Py_ssize_t start, end;
3967 int positional = (defcount != -1);
Benjamin Petersone109c702011-06-24 09:37:26 -05003968 const char *kind = positional ? "positional" : "keyword-only";
3969 PyObject *missing_names;
3970
3971 /* Compute the names of the arguments that are missing. */
3972 missing_names = PyList_New(missing);
3973 if (missing_names == NULL)
3974 return;
3975 if (positional) {
3976 start = 0;
Pablo Galindocd74e662019-06-01 18:08:04 +01003977 end = co->co_argcount - defcount;
Benjamin Petersone109c702011-06-24 09:37:26 -05003978 }
3979 else {
Pablo Galindocd74e662019-06-01 18:08:04 +01003980 start = co->co_argcount;
Benjamin Petersone109c702011-06-24 09:37:26 -05003981 end = start + co->co_kwonlyargcount;
3982 }
3983 for (i = start; i < end; i++) {
3984 if (GETLOCAL(i) == NULL) {
3985 PyObject *raw = PyTuple_GET_ITEM(co->co_varnames, i);
3986 PyObject *name = PyObject_Repr(raw);
3987 if (name == NULL) {
3988 Py_DECREF(missing_names);
3989 return;
3990 }
3991 PyList_SET_ITEM(missing_names, j++, name);
3992 }
3993 }
3994 assert(j == missing);
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04003995 format_missing(tstate, kind, co, missing_names, qualname);
Benjamin Petersone109c702011-06-24 09:37:26 -05003996 Py_DECREF(missing_names);
3997}
3998
3999static void
Victor Stinner438a12d2019-05-24 17:01:38 +02004000too_many_positional(PyThreadState *tstate, PyCodeObject *co,
4001 Py_ssize_t given, Py_ssize_t defcount,
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004002 PyObject **fastlocals, PyObject *qualname)
Benjamin Petersonb204a422011-06-05 22:04:07 -05004003{
4004 int plural;
Victor Stinner74319ae2016-08-25 00:04:09 +02004005 Py_ssize_t kwonly_given = 0;
4006 Py_ssize_t i;
Benjamin Petersonb204a422011-06-05 22:04:07 -05004007 PyObject *sig, *kwonly_sig;
Victor Stinner74319ae2016-08-25 00:04:09 +02004008 Py_ssize_t co_argcount = co->co_argcount;
Benjamin Petersonb204a422011-06-05 22:04:07 -05004009
Benjamin Petersone109c702011-06-24 09:37:26 -05004010 assert((co->co_flags & CO_VARARGS) == 0);
4011 /* Count missing keyword-only args. */
Pablo Galindocd74e662019-06-01 18:08:04 +01004012 for (i = co_argcount; i < co_argcount + co->co_kwonlyargcount; i++) {
Victor Stinner74319ae2016-08-25 00:04:09 +02004013 if (GETLOCAL(i) != NULL) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004014 kwonly_given++;
Victor Stinner74319ae2016-08-25 00:04:09 +02004015 }
4016 }
Benjamin Petersone109c702011-06-24 09:37:26 -05004017 if (defcount) {
Pablo Galindocd74e662019-06-01 18:08:04 +01004018 Py_ssize_t atleast = co_argcount - defcount;
Benjamin Petersonb204a422011-06-05 22:04:07 -05004019 plural = 1;
Pablo Galindocd74e662019-06-01 18:08:04 +01004020 sig = PyUnicode_FromFormat("from %zd to %zd", atleast, co_argcount);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004021 }
4022 else {
Pablo Galindocd74e662019-06-01 18:08:04 +01004023 plural = (co_argcount != 1);
4024 sig = PyUnicode_FromFormat("%zd", co_argcount);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004025 }
4026 if (sig == NULL)
4027 return;
4028 if (kwonly_given) {
Victor Stinner74319ae2016-08-25 00:04:09 +02004029 const char *format = " positional argument%s (and %zd keyword-only argument%s)";
4030 kwonly_sig = PyUnicode_FromFormat(format,
4031 given != 1 ? "s" : "",
4032 kwonly_given,
4033 kwonly_given != 1 ? "s" : "");
Benjamin Petersonb204a422011-06-05 22:04:07 -05004034 if (kwonly_sig == NULL) {
4035 Py_DECREF(sig);
4036 return;
4037 }
4038 }
4039 else {
4040 /* This will not fail. */
4041 kwonly_sig = PyUnicode_FromString("");
Benjamin Petersone109c702011-06-24 09:37:26 -05004042 assert(kwonly_sig != NULL);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004043 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004044 _PyErr_Format(tstate, PyExc_TypeError,
4045 "%U() takes %U positional argument%s but %zd%U %s given",
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004046 qualname,
Victor Stinner438a12d2019-05-24 17:01:38 +02004047 sig,
4048 plural ? "s" : "",
4049 given,
4050 kwonly_sig,
4051 given == 1 && !kwonly_given ? "was" : "were");
Benjamin Petersonb204a422011-06-05 22:04:07 -05004052 Py_DECREF(sig);
4053 Py_DECREF(kwonly_sig);
4054}
4055
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004056static int
Victor Stinner438a12d2019-05-24 17:01:38 +02004057positional_only_passed_as_keyword(PyThreadState *tstate, PyCodeObject *co,
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004058 Py_ssize_t kwcount, PyObject* const* kwnames,
4059 PyObject *qualname)
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004060{
4061 int posonly_conflicts = 0;
4062 PyObject* posonly_names = PyList_New(0);
4063
4064 for(int k=0; k < co->co_posonlyargcount; k++){
4065 PyObject* posonly_name = PyTuple_GET_ITEM(co->co_varnames, k);
4066
4067 for (int k2=0; k2<kwcount; k2++){
4068 /* Compare the pointers first and fallback to PyObject_RichCompareBool*/
4069 PyObject* kwname = kwnames[k2];
4070 if (kwname == posonly_name){
4071 if(PyList_Append(posonly_names, kwname) != 0) {
4072 goto fail;
4073 }
4074 posonly_conflicts++;
4075 continue;
4076 }
4077
4078 int cmp = PyObject_RichCompareBool(posonly_name, kwname, Py_EQ);
4079
4080 if ( cmp > 0) {
4081 if(PyList_Append(posonly_names, kwname) != 0) {
4082 goto fail;
4083 }
4084 posonly_conflicts++;
4085 } else if (cmp < 0) {
4086 goto fail;
4087 }
4088
4089 }
4090 }
4091 if (posonly_conflicts) {
4092 PyObject* comma = PyUnicode_FromString(", ");
4093 if (comma == NULL) {
4094 goto fail;
4095 }
4096 PyObject* error_names = PyUnicode_Join(comma, posonly_names);
4097 Py_DECREF(comma);
4098 if (error_names == NULL) {
4099 goto fail;
4100 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004101 _PyErr_Format(tstate, PyExc_TypeError,
4102 "%U() got some positional-only arguments passed"
4103 " as keyword arguments: '%U'",
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004104 qualname, error_names);
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004105 Py_DECREF(error_names);
4106 goto fail;
4107 }
4108
4109 Py_DECREF(posonly_names);
4110 return 0;
4111
4112fail:
4113 Py_XDECREF(posonly_names);
4114 return 1;
4115
4116}
4117
Guido van Rossumc2e20742006-02-27 22:32:47 +00004118/* This is gonna seem *real weird*, but if you put some other code between
Marcel Plch3a9ccee2018-04-06 23:22:04 +02004119 PyEval_EvalFrame() and _PyEval_EvalFrameDefault() you will need to adjust
Guido van Rossumc2e20742006-02-27 22:32:47 +00004120 the test in the if statements in Misc/gdbinit (pystack and pystackv). */
Skip Montanaro786ea6b2004-03-01 15:44:05 +00004121
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01004122PyObject *
Victor Stinnerb5e170f2019-11-16 01:03:22 +01004123_PyEval_EvalCode(PyThreadState *tstate,
4124 PyObject *_co, PyObject *globals, PyObject *locals,
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02004125 PyObject *const *args, Py_ssize_t argcount,
4126 PyObject *const *kwnames, PyObject *const *kwargs,
Serhiy Storchakab7281052016-09-12 00:52:40 +03004127 Py_ssize_t kwcount, int kwstep,
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02004128 PyObject *const *defs, Py_ssize_t defcount,
Victor Stinner74319ae2016-08-25 00:04:09 +02004129 PyObject *kwdefs, PyObject *closure,
Victor Stinner40ee3012014-06-16 15:59:28 +02004130 PyObject *name, PyObject *qualname)
Tim Peters5ca576e2001-06-18 22:08:13 +00004131{
Victor Stinnerda2914d2020-03-20 09:29:08 +01004132 assert(is_tstate_valid(tstate));
Victor Stinnerb5e170f2019-11-16 01:03:22 +01004133
Victor Stinner232dda62020-06-04 15:19:02 +02004134 PyCodeObject *co = (PyCodeObject*)_co;
4135
4136 if (!name) {
4137 name = co->co_name;
4138 }
4139 assert(name != NULL);
4140 assert(PyUnicode_Check(name));
4141
4142 if (!qualname) {
4143 qualname = name;
4144 }
4145 assert(qualname != NULL);
4146 assert(PyUnicode_Check(qualname));
4147
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02004148 PyObject *retval = NULL;
Pablo Galindocd74e662019-06-01 18:08:04 +01004149 const Py_ssize_t total_args = co->co_argcount + co->co_kwonlyargcount;
Tim Peters5ca576e2001-06-18 22:08:13 +00004150
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004151 if (globals == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004152 _PyErr_SetString(tstate, PyExc_SystemError,
4153 "PyEval_EvalCodeEx: NULL globals");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004154 return NULL;
4155 }
Tim Peters5ca576e2001-06-18 22:08:13 +00004156
Victor Stinnerc7020012016-08-16 23:40:29 +02004157 /* Create the frame */
Victor Stinner232dda62020-06-04 15:19:02 +02004158 PyFrameObject *f = _PyFrame_New_NoTrack(tstate, co, globals, locals);
Victor Stinnerc7020012016-08-16 23:40:29 +02004159 if (f == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004160 return NULL;
Victor Stinnerc7020012016-08-16 23:40:29 +02004161 }
Victor Stinner232dda62020-06-04 15:19:02 +02004162 PyObject **fastlocals = f->f_localsplus;
4163 PyObject **freevars = f->f_localsplus + co->co_nlocals;
Tim Peters5ca576e2001-06-18 22:08:13 +00004164
Victor Stinnerc7020012016-08-16 23:40:29 +02004165 /* Create a dictionary for keyword parameters (**kwags) */
Victor Stinner232dda62020-06-04 15:19:02 +02004166 PyObject *kwdict;
4167 Py_ssize_t i;
Benjamin Petersonb204a422011-06-05 22:04:07 -05004168 if (co->co_flags & CO_VARKEYWORDS) {
4169 kwdict = PyDict_New();
4170 if (kwdict == NULL)
4171 goto fail;
4172 i = total_args;
Victor Stinnerc7020012016-08-16 23:40:29 +02004173 if (co->co_flags & CO_VARARGS) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004174 i++;
Victor Stinnerc7020012016-08-16 23:40:29 +02004175 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004176 SETLOCAL(i, kwdict);
4177 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004178 else {
4179 kwdict = NULL;
4180 }
4181
Pablo Galindocd74e662019-06-01 18:08:04 +01004182 /* Copy all positional arguments into local variables */
Victor Stinner232dda62020-06-04 15:19:02 +02004183 Py_ssize_t j, n;
Pablo Galindocd74e662019-06-01 18:08:04 +01004184 if (argcount > co->co_argcount) {
4185 n = co->co_argcount;
Victor Stinnerc7020012016-08-16 23:40:29 +02004186 }
4187 else {
4188 n = argcount;
4189 }
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004190 for (j = 0; j < n; j++) {
Victor Stinner232dda62020-06-04 15:19:02 +02004191 PyObject *x = args[j];
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004192 Py_INCREF(x);
4193 SETLOCAL(j, x);
4194 }
4195
Victor Stinnerc7020012016-08-16 23:40:29 +02004196 /* Pack other positional arguments into the *args argument */
Benjamin Petersonb204a422011-06-05 22:04:07 -05004197 if (co->co_flags & CO_VARARGS) {
Victor Stinner232dda62020-06-04 15:19:02 +02004198 PyObject *u = _PyTuple_FromArray(args + n, argcount - n);
Victor Stinnerc7020012016-08-16 23:40:29 +02004199 if (u == NULL) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004200 goto fail;
Victor Stinnerc7020012016-08-16 23:40:29 +02004201 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004202 SETLOCAL(total_args, u);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004203 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004204
Serhiy Storchakab7281052016-09-12 00:52:40 +03004205 /* Handle keyword arguments passed as two strided arrays */
4206 kwcount *= kwstep;
4207 for (i = 0; i < kwcount; i += kwstep) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004208 PyObject **co_varnames;
Serhiy Storchakab7281052016-09-12 00:52:40 +03004209 PyObject *keyword = kwnames[i];
4210 PyObject *value = kwargs[i];
Victor Stinner17061a92016-08-16 23:39:42 +02004211 Py_ssize_t j;
Victor Stinnerc7020012016-08-16 23:40:29 +02004212
Benjamin Petersonb204a422011-06-05 22:04:07 -05004213 if (keyword == NULL || !PyUnicode_Check(keyword)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004214 _PyErr_Format(tstate, PyExc_TypeError,
4215 "%U() keywords must be strings",
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004216 qualname);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004217 goto fail;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004218 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004219
Benjamin Petersonb204a422011-06-05 22:04:07 -05004220 /* Speed hack: do raw pointer compares. As names are
4221 normally interned this should almost always hit. */
4222 co_varnames = ((PyTupleObject *)(co->co_varnames))->ob_item;
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004223 for (j = co->co_posonlyargcount; j < total_args; j++) {
Victor Stinner232dda62020-06-04 15:19:02 +02004224 PyObject *varname = co_varnames[j];
4225 if (varname == keyword) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004226 goto kw_found;
Victor Stinner6fea7f72016-08-22 23:17:30 +02004227 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004228 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004229
Benjamin Petersonb204a422011-06-05 22:04:07 -05004230 /* Slow fallback, just in case */
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004231 for (j = co->co_posonlyargcount; j < total_args; j++) {
Victor Stinner232dda62020-06-04 15:19:02 +02004232 PyObject *varname = co_varnames[j];
4233 int cmp = PyObject_RichCompareBool( keyword, varname, Py_EQ);
Victor Stinner6fea7f72016-08-22 23:17:30 +02004234 if (cmp > 0) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004235 goto kw_found;
Victor Stinner6fea7f72016-08-22 23:17:30 +02004236 }
4237 else if (cmp < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004238 goto fail;
Victor Stinner6fea7f72016-08-22 23:17:30 +02004239 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004240 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004241
Victor Stinner231d1f32017-01-11 02:12:06 +01004242 assert(j >= total_args);
4243 if (kwdict == NULL) {
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004244
Victor Stinner438a12d2019-05-24 17:01:38 +02004245 if (co->co_posonlyargcount
4246 && positional_only_passed_as_keyword(tstate, co,
Victor Stinner232dda62020-06-04 15:19:02 +02004247 kwcount, kwnames,
4248 qualname))
Victor Stinner438a12d2019-05-24 17:01:38 +02004249 {
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004250 goto fail;
4251 }
4252
Victor Stinner438a12d2019-05-24 17:01:38 +02004253 _PyErr_Format(tstate, PyExc_TypeError,
4254 "%U() got an unexpected keyword argument '%S'",
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004255 qualname, keyword);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004256 goto fail;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004257 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004258
Christian Heimes0bd447f2013-07-20 14:48:10 +02004259 if (PyDict_SetItem(kwdict, keyword, value) == -1) {
4260 goto fail;
4261 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004262 continue;
Victor Stinnerc7020012016-08-16 23:40:29 +02004263
Benjamin Petersonb204a422011-06-05 22:04:07 -05004264 kw_found:
4265 if (GETLOCAL(j) != NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004266 _PyErr_Format(tstate, PyExc_TypeError,
4267 "%U() got multiple values for argument '%S'",
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004268 qualname, keyword);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004269 goto fail;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004270 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004271 Py_INCREF(value);
4272 SETLOCAL(j, value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004273 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004274
4275 /* Check the number of positional arguments */
Pablo Galindocd74e662019-06-01 18:08:04 +01004276 if ((argcount > co->co_argcount) && !(co->co_flags & CO_VARARGS)) {
Victor Stinner232dda62020-06-04 15:19:02 +02004277 too_many_positional(tstate, co, argcount, defcount, fastlocals,
4278 qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004279 goto fail;
4280 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004281
4282 /* Add missing positional arguments (copy default values from defs) */
Pablo Galindocd74e662019-06-01 18:08:04 +01004283 if (argcount < co->co_argcount) {
4284 Py_ssize_t m = co->co_argcount - defcount;
Victor Stinner17061a92016-08-16 23:39:42 +02004285 Py_ssize_t missing = 0;
4286 for (i = argcount; i < m; i++) {
4287 if (GETLOCAL(i) == NULL) {
Benjamin Petersone109c702011-06-24 09:37:26 -05004288 missing++;
Victor Stinner17061a92016-08-16 23:39:42 +02004289 }
4290 }
Benjamin Petersone109c702011-06-24 09:37:26 -05004291 if (missing) {
Victor Stinner232dda62020-06-04 15:19:02 +02004292 missing_arguments(tstate, co, missing, defcount, fastlocals,
4293 qualname);
Benjamin Petersone109c702011-06-24 09:37:26 -05004294 goto fail;
Benjamin Petersonb204a422011-06-05 22:04:07 -05004295 }
4296 if (n > m)
4297 i = n - m;
4298 else
4299 i = 0;
4300 for (; i < defcount; i++) {
4301 if (GETLOCAL(m+i) == NULL) {
4302 PyObject *def = defs[i];
4303 Py_INCREF(def);
4304 SETLOCAL(m+i, def);
4305 }
4306 }
4307 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004308
4309 /* Add missing keyword arguments (copy default values from kwdefs) */
Benjamin Petersonb204a422011-06-05 22:04:07 -05004310 if (co->co_kwonlyargcount > 0) {
Victor Stinner17061a92016-08-16 23:39:42 +02004311 Py_ssize_t missing = 0;
Pablo Galindocd74e662019-06-01 18:08:04 +01004312 for (i = co->co_argcount; i < total_args; i++) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004313 if (GETLOCAL(i) != NULL)
4314 continue;
Victor Stinner232dda62020-06-04 15:19:02 +02004315 PyObject *varname = PyTuple_GET_ITEM(co->co_varnames, i);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004316 if (kwdefs != NULL) {
Victor Stinner232dda62020-06-04 15:19:02 +02004317 PyObject *def = PyDict_GetItemWithError(kwdefs, varname);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004318 if (def) {
4319 Py_INCREF(def);
4320 SETLOCAL(i, def);
4321 continue;
4322 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004323 else if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02004324 goto fail;
4325 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004326 }
Benjamin Petersone109c702011-06-24 09:37:26 -05004327 missing++;
4328 }
4329 if (missing) {
Victor Stinner232dda62020-06-04 15:19:02 +02004330 missing_arguments(tstate, co, missing, -1, fastlocals,
4331 qualname);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004332 goto fail;
4333 }
4334 }
4335
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004336 /* Allocate and initialize storage for cell vars, and copy free
Benjamin Peterson90037602011-06-25 22:54:45 -05004337 vars into frame. */
4338 for (i = 0; i < PyTuple_GET_SIZE(co->co_cellvars); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004339 PyObject *c;
Serhiy Storchaka5bb8b912016-12-16 19:19:02 +02004340 Py_ssize_t arg;
Benjamin Peterson90037602011-06-25 22:54:45 -05004341 /* Possibly account for the cell variable being an argument. */
4342 if (co->co_cell2arg != NULL &&
Guido van Rossum6832c812013-05-10 08:47:42 -07004343 (arg = co->co_cell2arg[i]) != CO_CELL_NOT_AN_ARG) {
Benjamin Peterson90037602011-06-25 22:54:45 -05004344 c = PyCell_New(GETLOCAL(arg));
Benjamin Peterson159ae412013-05-12 18:16:06 -05004345 /* Clear the local copy. */
4346 SETLOCAL(arg, NULL);
Guido van Rossum6832c812013-05-10 08:47:42 -07004347 }
4348 else {
Benjamin Peterson90037602011-06-25 22:54:45 -05004349 c = PyCell_New(NULL);
Guido van Rossum6832c812013-05-10 08:47:42 -07004350 }
Benjamin Peterson159ae412013-05-12 18:16:06 -05004351 if (c == NULL)
4352 goto fail;
Benjamin Peterson90037602011-06-25 22:54:45 -05004353 SETLOCAL(co->co_nlocals + i, c);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004354 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004355
4356 /* Copy closure variables to free variables */
Benjamin Peterson90037602011-06-25 22:54:45 -05004357 for (i = 0; i < PyTuple_GET_SIZE(co->co_freevars); ++i) {
4358 PyObject *o = PyTuple_GET_ITEM(closure, i);
4359 Py_INCREF(o);
4360 freevars[PyTuple_GET_SIZE(co->co_cellvars) + i] = o;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004361 }
Tim Peters5ca576e2001-06-18 22:08:13 +00004362
Yury Selivanoveb636452016-09-08 22:01:51 -07004363 /* Handle generator/coroutine/asynchronous generator */
4364 if (co->co_flags & (CO_GENERATOR | CO_COROUTINE | CO_ASYNC_GENERATOR)) {
Yury Selivanov75445082015-05-11 22:57:16 -04004365 PyObject *gen;
Yury Selivanov5376ba92015-06-22 12:19:30 -04004366 int is_coro = co->co_flags & CO_COROUTINE;
Yury Selivanov94c22632015-06-04 10:16:51 -04004367
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004368 /* Don't need to keep the reference to f_back, it will be set
4369 * when the generator is resumed. */
Serhiy Storchaka505ff752014-02-09 13:33:53 +02004370 Py_CLEAR(f->f_back);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00004371
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004372 /* Create a new generator that owns the ready to run frame
4373 * and return that as the value. */
Yury Selivanov5376ba92015-06-22 12:19:30 -04004374 if (is_coro) {
4375 gen = PyCoro_New(f, name, qualname);
Yury Selivanoveb636452016-09-08 22:01:51 -07004376 } else if (co->co_flags & CO_ASYNC_GENERATOR) {
4377 gen = PyAsyncGen_New(f, name, qualname);
Yury Selivanov5376ba92015-06-22 12:19:30 -04004378 } else {
4379 gen = PyGen_NewWithQualName(f, name, qualname);
4380 }
INADA Naoki6a3cedf2016-12-26 18:01:46 +09004381 if (gen == NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04004382 return NULL;
INADA Naoki6a3cedf2016-12-26 18:01:46 +09004383 }
INADA Naoki9c157762016-12-26 18:52:46 +09004384
INADA Naoki6a3cedf2016-12-26 18:01:46 +09004385 _PyObject_GC_TRACK(f);
Yury Selivanov75445082015-05-11 22:57:16 -04004386
Yury Selivanov75445082015-05-11 22:57:16 -04004387 return gen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004388 }
Tim Peters5ca576e2001-06-18 22:08:13 +00004389
Victor Stinnerb9e68122019-11-14 12:20:46 +01004390 retval = _PyEval_EvalFrame(tstate, f, 0);
Tim Peters5ca576e2001-06-18 22:08:13 +00004391
Thomas Woutersce272b62007-09-19 21:19:28 +00004392fail: /* Jump here from prelude on failure */
Tim Peters5ca576e2001-06-18 22:08:13 +00004393
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004394 /* decref'ing the frame can cause __del__ methods to get invoked,
4395 which can call back into Python. While we're done with the
4396 current Python frame (f), the associated C stack is still in use,
4397 so recursion_depth must be boosted for the duration.
4398 */
INADA Naoki5a625d02016-12-24 20:19:08 +09004399 if (Py_REFCNT(f) > 1) {
4400 Py_DECREF(f);
4401 _PyObject_GC_TRACK(f);
4402 }
4403 else {
4404 ++tstate->recursion_depth;
4405 Py_DECREF(f);
4406 --tstate->recursion_depth;
4407 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004408 return retval;
Tim Peters5ca576e2001-06-18 22:08:13 +00004409}
4410
Victor Stinnerb5e170f2019-11-16 01:03:22 +01004411
4412PyObject *
4413_PyEval_EvalCodeWithName(PyObject *_co, PyObject *globals, PyObject *locals,
4414 PyObject *const *args, Py_ssize_t argcount,
4415 PyObject *const *kwnames, PyObject *const *kwargs,
4416 Py_ssize_t kwcount, int kwstep,
4417 PyObject *const *defs, Py_ssize_t defcount,
4418 PyObject *kwdefs, PyObject *closure,
4419 PyObject *name, PyObject *qualname)
4420{
4421 PyThreadState *tstate = _PyThreadState_GET();
4422 return _PyEval_EvalCode(tstate, _co, globals, locals,
4423 args, argcount,
4424 kwnames, kwargs,
4425 kwcount, kwstep,
4426 defs, defcount,
4427 kwdefs, closure,
4428 name, qualname);
4429}
4430
Victor Stinner40ee3012014-06-16 15:59:28 +02004431PyObject *
4432PyEval_EvalCodeEx(PyObject *_co, PyObject *globals, PyObject *locals,
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02004433 PyObject *const *args, int argcount,
4434 PyObject *const *kws, int kwcount,
4435 PyObject *const *defs, int defcount,
4436 PyObject *kwdefs, PyObject *closure)
Victor Stinner40ee3012014-06-16 15:59:28 +02004437{
4438 return _PyEval_EvalCodeWithName(_co, globals, locals,
Victor Stinner9be7e7b2016-08-19 16:11:43 +02004439 args, argcount,
Zackery Spytzc6ea8972017-07-31 08:24:37 -06004440 kws, kws != NULL ? kws + 1 : NULL,
4441 kwcount, 2,
Victor Stinner9be7e7b2016-08-19 16:11:43 +02004442 defs, defcount,
4443 kwdefs, closure,
Victor Stinner40ee3012014-06-16 15:59:28 +02004444 NULL, NULL);
4445}
Tim Peters5ca576e2001-06-18 22:08:13 +00004446
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004447static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02004448special_lookup(PyThreadState *tstate, PyObject *o, _Py_Identifier *id)
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004449{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004450 PyObject *res;
Benjamin Petersonce798522012-01-22 11:24:29 -05004451 res = _PyObject_LookupSpecial(o, id);
Victor Stinner438a12d2019-05-24 17:01:38 +02004452 if (res == NULL && !_PyErr_Occurred(tstate)) {
Victor Stinner4804b5b2020-05-12 01:43:38 +02004453 _PyErr_SetObject(tstate, PyExc_AttributeError, _PyUnicode_FromId(id));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004454 return NULL;
4455 }
4456 return res;
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004457}
4458
4459
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00004460/* Logic for the raise statement (too complicated for inlining).
4461 This *consumes* a reference count to each of its arguments. */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004462static int
Victor Stinner09532fe2019-05-10 23:39:09 +02004463do_raise(PyThreadState *tstate, PyObject *exc, PyObject *cause)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00004464{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004465 PyObject *type = NULL, *value = NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00004466
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004467 if (exc == NULL) {
4468 /* Reraise */
Mark Shannonae3087c2017-10-22 22:41:51 +01004469 _PyErr_StackItem *exc_info = _PyErr_GetTopmostException(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004470 PyObject *tb;
Mark Shannonae3087c2017-10-22 22:41:51 +01004471 type = exc_info->exc_type;
4472 value = exc_info->exc_value;
4473 tb = exc_info->exc_traceback;
Victor Stinnereec93312016-08-18 18:13:10 +02004474 if (type == Py_None || type == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004475 _PyErr_SetString(tstate, PyExc_RuntimeError,
4476 "No active exception to reraise");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004477 return 0;
4478 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004479 Py_XINCREF(type);
4480 Py_XINCREF(value);
4481 Py_XINCREF(tb);
Victor Stinner438a12d2019-05-24 17:01:38 +02004482 _PyErr_Restore(tstate, type, value, tb);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004483 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004484 }
Guido van Rossumac7be682001-01-17 15:42:30 +00004485
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004486 /* We support the following forms of raise:
4487 raise
Collin Winter828f04a2007-08-31 00:04:24 +00004488 raise <instance>
4489 raise <type> */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00004490
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004491 if (PyExceptionClass_Check(exc)) {
4492 type = exc;
Victor Stinnera5ed5f02016-12-06 18:45:50 +01004493 value = _PyObject_CallNoArg(exc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004494 if (value == NULL)
4495 goto raise_error;
Benjamin Peterson5afa03a2011-07-15 14:09:26 -05004496 if (!PyExceptionInstance_Check(value)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004497 _PyErr_Format(tstate, PyExc_TypeError,
4498 "calling %R should have returned an instance of "
4499 "BaseException, not %R",
4500 type, Py_TYPE(value));
4501 goto raise_error;
Benjamin Peterson5afa03a2011-07-15 14:09:26 -05004502 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004503 }
4504 else if (PyExceptionInstance_Check(exc)) {
4505 value = exc;
4506 type = PyExceptionInstance_Class(exc);
4507 Py_INCREF(type);
4508 }
4509 else {
4510 /* Not something you can raise. You get an exception
4511 anyway, just not what you specified :-) */
4512 Py_DECREF(exc);
Victor Stinner438a12d2019-05-24 17:01:38 +02004513 _PyErr_SetString(tstate, PyExc_TypeError,
4514 "exceptions must derive from BaseException");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004515 goto raise_error;
4516 }
Collin Winter828f04a2007-08-31 00:04:24 +00004517
Serhiy Storchakac0191582016-09-27 11:37:10 +03004518 assert(type != NULL);
4519 assert(value != NULL);
4520
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004521 if (cause) {
4522 PyObject *fixed_cause;
4523 if (PyExceptionClass_Check(cause)) {
Victor Stinnera5ed5f02016-12-06 18:45:50 +01004524 fixed_cause = _PyObject_CallNoArg(cause);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004525 if (fixed_cause == NULL)
4526 goto raise_error;
Benjamin Petersond5a1c442012-05-14 22:09:31 -07004527 Py_DECREF(cause);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004528 }
Benjamin Petersond5a1c442012-05-14 22:09:31 -07004529 else if (PyExceptionInstance_Check(cause)) {
4530 fixed_cause = cause;
4531 }
4532 else if (cause == Py_None) {
4533 Py_DECREF(cause);
4534 fixed_cause = NULL;
4535 }
4536 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02004537 _PyErr_SetString(tstate, PyExc_TypeError,
4538 "exception causes must derive from "
4539 "BaseException");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004540 goto raise_error;
4541 }
Benjamin Petersond5a1c442012-05-14 22:09:31 -07004542 PyException_SetCause(value, fixed_cause);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004543 }
Collin Winter828f04a2007-08-31 00:04:24 +00004544
Victor Stinner438a12d2019-05-24 17:01:38 +02004545 _PyErr_SetObject(tstate, type, value);
Victor Stinner61f4db82020-01-28 03:37:45 +01004546 /* _PyErr_SetObject incref's its arguments */
Serhiy Storchakac0191582016-09-27 11:37:10 +03004547 Py_DECREF(value);
4548 Py_DECREF(type);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004549 return 0;
Collin Winter828f04a2007-08-31 00:04:24 +00004550
4551raise_error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004552 Py_XDECREF(value);
4553 Py_XDECREF(type);
4554 Py_XDECREF(cause);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004555 return 0;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00004556}
4557
Tim Petersd6d010b2001-06-21 02:49:55 +00004558/* Iterate v argcnt times and store the results on the stack (via decreasing
Guido van Rossum0368b722007-05-11 16:50:42 +00004559 sp). Return 1 for success, 0 if error.
Antoine Pitrou9a2310d2008-07-25 22:39:39 +00004560
Guido van Rossum0368b722007-05-11 16:50:42 +00004561 If argcntafter == -1, do a simple unpack. If it is >= 0, do an unpack
4562 with a variable target.
4563*/
Tim Petersd6d010b2001-06-21 02:49:55 +00004564
Barry Warsawe42b18f1997-08-25 22:13:04 +00004565static int
Victor Stinner438a12d2019-05-24 17:01:38 +02004566unpack_iterable(PyThreadState *tstate, PyObject *v,
4567 int argcnt, int argcntafter, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00004568{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004569 int i = 0, j = 0;
4570 Py_ssize_t ll = 0;
4571 PyObject *it; /* iter(v) */
4572 PyObject *w;
4573 PyObject *l = NULL; /* variable list */
Guido van Rossumac7be682001-01-17 15:42:30 +00004574
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004575 assert(v != NULL);
Tim Petersd6d010b2001-06-21 02:49:55 +00004576
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004577 it = PyObject_GetIter(v);
Serhiy Storchaka13a6c092017-12-26 12:30:41 +02004578 if (it == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004579 if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError) &&
Victor Stinnera102ed72020-02-07 02:24:48 +01004580 Py_TYPE(v)->tp_iter == NULL && !PySequence_Check(v))
Serhiy Storchaka13a6c092017-12-26 12:30:41 +02004581 {
Victor Stinner438a12d2019-05-24 17:01:38 +02004582 _PyErr_Format(tstate, PyExc_TypeError,
4583 "cannot unpack non-iterable %.200s object",
Victor Stinnera102ed72020-02-07 02:24:48 +01004584 Py_TYPE(v)->tp_name);
Serhiy Storchaka13a6c092017-12-26 12:30:41 +02004585 }
4586 return 0;
4587 }
Tim Petersd6d010b2001-06-21 02:49:55 +00004588
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004589 for (; i < argcnt; i++) {
4590 w = PyIter_Next(it);
4591 if (w == NULL) {
4592 /* Iterator done, via error or exhaustion. */
Victor Stinner438a12d2019-05-24 17:01:38 +02004593 if (!_PyErr_Occurred(tstate)) {
R David Murray4171bbe2015-04-15 17:08:45 -04004594 if (argcntafter == -1) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004595 _PyErr_Format(tstate, PyExc_ValueError,
4596 "not enough values to unpack "
4597 "(expected %d, got %d)",
4598 argcnt, i);
R David Murray4171bbe2015-04-15 17:08:45 -04004599 }
4600 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02004601 _PyErr_Format(tstate, PyExc_ValueError,
4602 "not enough values to unpack "
4603 "(expected at least %d, got %d)",
4604 argcnt + argcntafter, i);
R David Murray4171bbe2015-04-15 17:08:45 -04004605 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004606 }
4607 goto Error;
4608 }
4609 *--sp = w;
4610 }
Tim Petersd6d010b2001-06-21 02:49:55 +00004611
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004612 if (argcntafter == -1) {
4613 /* We better have exhausted the iterator now. */
4614 w = PyIter_Next(it);
4615 if (w == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004616 if (_PyErr_Occurred(tstate))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004617 goto Error;
4618 Py_DECREF(it);
4619 return 1;
4620 }
4621 Py_DECREF(w);
Victor Stinner438a12d2019-05-24 17:01:38 +02004622 _PyErr_Format(tstate, PyExc_ValueError,
4623 "too many values to unpack (expected %d)",
4624 argcnt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004625 goto Error;
4626 }
Guido van Rossum0368b722007-05-11 16:50:42 +00004627
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004628 l = PySequence_List(it);
4629 if (l == NULL)
4630 goto Error;
4631 *--sp = l;
4632 i++;
Guido van Rossum0368b722007-05-11 16:50:42 +00004633
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004634 ll = PyList_GET_SIZE(l);
4635 if (ll < argcntafter) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004636 _PyErr_Format(tstate, PyExc_ValueError,
R David Murray4171bbe2015-04-15 17:08:45 -04004637 "not enough values to unpack (expected at least %d, got %zd)",
4638 argcnt + argcntafter, argcnt + ll);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004639 goto Error;
4640 }
Guido van Rossum0368b722007-05-11 16:50:42 +00004641
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004642 /* Pop the "after-variable" args off the list. */
4643 for (j = argcntafter; j > 0; j--, i++) {
4644 *--sp = PyList_GET_ITEM(l, ll - j);
4645 }
4646 /* Resize the list. */
Victor Stinner60ac6ed2020-02-07 23:18:08 +01004647 Py_SET_SIZE(l, ll - argcntafter);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004648 Py_DECREF(it);
4649 return 1;
Guido van Rossum0368b722007-05-11 16:50:42 +00004650
Tim Petersd6d010b2001-06-21 02:49:55 +00004651Error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004652 for (; i > 0; i--, sp++)
4653 Py_DECREF(*sp);
4654 Py_XDECREF(it);
4655 return 0;
Barry Warsawe42b18f1997-08-25 22:13:04 +00004656}
4657
4658
Guido van Rossum96a42c81992-01-12 02:29:51 +00004659#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00004660static int
Victor Stinner438a12d2019-05-24 17:01:38 +02004661prtrace(PyThreadState *tstate, PyObject *v, const char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004662{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004663 printf("%s ", str);
Victor Stinner438a12d2019-05-24 17:01:38 +02004664 if (PyObject_Print(v, stdout, 0) != 0) {
4665 /* Don't know what else to do */
4666 _PyErr_Clear(tstate);
4667 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004668 printf("\n");
4669 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004670}
Guido van Rossum3f5da241990-12-20 15:06:42 +00004671#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004672
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00004673static void
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004674call_exc_trace(Py_tracefunc func, PyObject *self,
4675 PyThreadState *tstate, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00004676{
Victor Stinneraaa8ed82013-07-10 13:57:55 +02004677 PyObject *type, *value, *traceback, *orig_traceback, *arg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004678 int err;
Victor Stinner438a12d2019-05-24 17:01:38 +02004679 _PyErr_Fetch(tstate, &type, &value, &orig_traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004680 if (value == NULL) {
4681 value = Py_None;
4682 Py_INCREF(value);
4683 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004684 _PyErr_NormalizeException(tstate, &type, &value, &orig_traceback);
Antoine Pitrou89335212013-11-23 14:05:23 +01004685 traceback = (orig_traceback != NULL) ? orig_traceback : Py_None;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004686 arg = PyTuple_Pack(3, type, value, traceback);
4687 if (arg == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004688 _PyErr_Restore(tstate, type, value, orig_traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004689 return;
4690 }
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004691 err = call_trace(func, self, tstate, f, PyTrace_EXCEPTION, arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004692 Py_DECREF(arg);
Victor Stinner438a12d2019-05-24 17:01:38 +02004693 if (err == 0) {
4694 _PyErr_Restore(tstate, type, value, orig_traceback);
4695 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004696 else {
4697 Py_XDECREF(type);
4698 Py_XDECREF(value);
Victor Stinneraaa8ed82013-07-10 13:57:55 +02004699 Py_XDECREF(orig_traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004700 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00004701}
4702
Amaury Forgeot d'Arcf05149a2007-11-13 01:05:30 +00004703static int
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004704call_trace_protected(Py_tracefunc func, PyObject *obj,
4705 PyThreadState *tstate, PyFrameObject *frame,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004706 int what, PyObject *arg)
Fred Drake4ec5d562001-10-04 19:26:43 +00004707{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004708 PyObject *type, *value, *traceback;
4709 int err;
Victor Stinner438a12d2019-05-24 17:01:38 +02004710 _PyErr_Fetch(tstate, &type, &value, &traceback);
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004711 err = call_trace(func, obj, tstate, frame, what, arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004712 if (err == 0)
4713 {
Victor Stinner438a12d2019-05-24 17:01:38 +02004714 _PyErr_Restore(tstate, type, value, traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004715 return 0;
4716 }
4717 else {
4718 Py_XDECREF(type);
4719 Py_XDECREF(value);
4720 Py_XDECREF(traceback);
4721 return -1;
4722 }
Fred Drake4ec5d562001-10-04 19:26:43 +00004723}
4724
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00004725static int
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004726call_trace(Py_tracefunc func, PyObject *obj,
4727 PyThreadState *tstate, PyFrameObject *frame,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004728 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00004729{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004730 int result;
4731 if (tstate->tracing)
4732 return 0;
4733 tstate->tracing++;
4734 tstate->use_tracing = 0;
4735 result = func(obj, frame, what, arg);
4736 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
4737 || (tstate->c_profilefunc != NULL));
4738 tstate->tracing--;
4739 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00004740}
4741
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00004742PyObject *
4743_PyEval_CallTracing(PyObject *func, PyObject *args)
4744{
Victor Stinner50b48572018-11-01 01:51:40 +01004745 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004746 int save_tracing = tstate->tracing;
4747 int save_use_tracing = tstate->use_tracing;
4748 PyObject *result;
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00004749
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004750 tstate->tracing = 0;
4751 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
4752 || (tstate->c_profilefunc != NULL));
4753 result = PyObject_Call(func, args, NULL);
4754 tstate->tracing = save_tracing;
4755 tstate->use_tracing = save_use_tracing;
4756 return result;
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00004757}
4758
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00004759/* See Objects/lnotab_notes.txt for a description of how tracing works. */
Michael W. Hudson006c7522002-11-08 13:08:46 +00004760static int
Tim Peters8a5c3c72004-04-05 19:36:21 +00004761maybe_call_line_trace(Py_tracefunc func, PyObject *obj,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004762 PyThreadState *tstate, PyFrameObject *frame,
4763 int *instr_lb, int *instr_ub, int *instr_prev)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004764{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004765 int result = 0;
4766 int line = frame->f_lineno;
Michael W. Hudson006c7522002-11-08 13:08:46 +00004767
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004768 /* If the last instruction executed isn't in the current
4769 instruction window, reset the window.
4770 */
4771 if (frame->f_lasti < *instr_lb || frame->f_lasti >= *instr_ub) {
4772 PyAddrPair bounds;
4773 line = _PyCode_CheckLineNumber(frame->f_code, frame->f_lasti,
4774 &bounds);
4775 *instr_lb = bounds.ap_lower;
4776 *instr_ub = bounds.ap_upper;
4777 }
Nick Coghlan5a851672017-09-08 10:14:16 +10004778 /* If the last instruction falls at the start of a line or if it
4779 represents a jump backwards, update the frame's line number and
4780 then call the trace function if we're tracing source lines.
4781 */
4782 if ((frame->f_lasti == *instr_lb || frame->f_lasti < *instr_prev)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004783 frame->f_lineno = line;
Nick Coghlan5a851672017-09-08 10:14:16 +10004784 if (frame->f_trace_lines) {
4785 result = call_trace(func, obj, tstate, frame, PyTrace_LINE, Py_None);
4786 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004787 }
George King20faa682017-10-18 17:44:22 -07004788 /* Always emit an opcode event if we're tracing all opcodes. */
4789 if (frame->f_trace_opcodes) {
4790 result = call_trace(func, obj, tstate, frame, PyTrace_OPCODE, Py_None);
4791 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004792 *instr_prev = frame->f_lasti;
4793 return result;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004794}
4795
Victor Stinner309d7cc2020-03-13 16:39:12 +01004796int
4797_PyEval_SetProfile(PyThreadState *tstate, Py_tracefunc func, PyObject *arg)
4798{
Victor Stinnerda2914d2020-03-20 09:29:08 +01004799 assert(is_tstate_valid(tstate));
Victor Stinner309d7cc2020-03-13 16:39:12 +01004800 /* The caller must hold the GIL */
4801 assert(PyGILState_Check());
4802
Victor Stinner1c1e68c2020-03-27 15:11:45 +01004803 /* Call _PySys_Audit() in the context of the current thread state,
Victor Stinner309d7cc2020-03-13 16:39:12 +01004804 even if tstate is not the current thread state. */
Victor Stinner1c1e68c2020-03-27 15:11:45 +01004805 PyThreadState *current_tstate = _PyThreadState_GET();
4806 if (_PySys_Audit(current_tstate, "sys.setprofile", NULL) < 0) {
Victor Stinner309d7cc2020-03-13 16:39:12 +01004807 return -1;
4808 }
4809
4810 PyObject *profileobj = tstate->c_profileobj;
4811
4812 tstate->c_profilefunc = NULL;
4813 tstate->c_profileobj = NULL;
4814 /* Must make sure that tracing is not ignored if 'profileobj' is freed */
4815 tstate->use_tracing = tstate->c_tracefunc != NULL;
4816 Py_XDECREF(profileobj);
4817
4818 Py_XINCREF(arg);
4819 tstate->c_profileobj = arg;
4820 tstate->c_profilefunc = func;
4821
4822 /* Flag that tracing or profiling is turned on */
4823 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
4824 return 0;
4825}
4826
Fred Drake5755ce62001-06-27 19:19:46 +00004827void
4828PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00004829{
Victor Stinner309d7cc2020-03-13 16:39:12 +01004830 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerf6a58502020-03-16 17:41:44 +01004831 if (_PyEval_SetProfile(tstate, func, arg) < 0) {
Victor Stinner1c1e68c2020-03-27 15:11:45 +01004832 /* Log _PySys_Audit() error */
Victor Stinnerf6a58502020-03-16 17:41:44 +01004833 _PyErr_WriteUnraisableMsg("in PyEval_SetProfile", NULL);
4834 }
Victor Stinner309d7cc2020-03-13 16:39:12 +01004835}
4836
4837int
4838_PyEval_SetTrace(PyThreadState *tstate, Py_tracefunc func, PyObject *arg)
4839{
Victor Stinnerda2914d2020-03-20 09:29:08 +01004840 assert(is_tstate_valid(tstate));
Victor Stinner309d7cc2020-03-13 16:39:12 +01004841 /* The caller must hold the GIL */
4842 assert(PyGILState_Check());
4843
Victor Stinner1c1e68c2020-03-27 15:11:45 +01004844 /* Call _PySys_Audit() in the context of the current thread state,
Victor Stinner309d7cc2020-03-13 16:39:12 +01004845 even if tstate is not the current thread state. */
Victor Stinner1c1e68c2020-03-27 15:11:45 +01004846 PyThreadState *current_tstate = _PyThreadState_GET();
4847 if (_PySys_Audit(current_tstate, "sys.settrace", NULL) < 0) {
Victor Stinner309d7cc2020-03-13 16:39:12 +01004848 return -1;
Steve Dowerb82e17e2019-05-23 08:45:22 -07004849 }
4850
Victor Stinnerda2914d2020-03-20 09:29:08 +01004851 struct _ceval_state *ceval2 = &tstate->interp->ceval;
Victor Stinner309d7cc2020-03-13 16:39:12 +01004852 PyObject *traceobj = tstate->c_traceobj;
Victor Stinnerda2914d2020-03-20 09:29:08 +01004853 ceval2->tracing_possible += (func != NULL) - (tstate->c_tracefunc != NULL);
Victor Stinner309d7cc2020-03-13 16:39:12 +01004854
4855 tstate->c_tracefunc = NULL;
4856 tstate->c_traceobj = NULL;
4857 /* Must make sure that profiling is not ignored if 'traceobj' is freed */
4858 tstate->use_tracing = (tstate->c_profilefunc != NULL);
4859 Py_XDECREF(traceobj);
4860
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004861 Py_XINCREF(arg);
Victor Stinner309d7cc2020-03-13 16:39:12 +01004862 tstate->c_traceobj = arg;
4863 tstate->c_tracefunc = func;
4864
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004865 /* Flag that tracing or profiling is turned on */
Victor Stinner309d7cc2020-03-13 16:39:12 +01004866 tstate->use_tracing = ((func != NULL)
4867 || (tstate->c_profilefunc != NULL));
4868
4869 return 0;
Fred Drake5755ce62001-06-27 19:19:46 +00004870}
4871
4872void
4873PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
4874{
Victor Stinner309d7cc2020-03-13 16:39:12 +01004875 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerf6a58502020-03-16 17:41:44 +01004876 if (_PyEval_SetTrace(tstate, func, arg) < 0) {
Victor Stinner1c1e68c2020-03-27 15:11:45 +01004877 /* Log _PySys_Audit() error */
Victor Stinnerf6a58502020-03-16 17:41:44 +01004878 _PyErr_WriteUnraisableMsg("in PyEval_SetTrace", NULL);
4879 }
Fred Draked0838392001-06-16 21:02:31 +00004880}
4881
Victor Stinner309d7cc2020-03-13 16:39:12 +01004882
Yury Selivanov75445082015-05-11 22:57:16 -04004883void
Victor Stinner838f2642019-06-13 22:41:23 +02004884_PyEval_SetCoroutineOriginTrackingDepth(PyThreadState *tstate, int new_depth)
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08004885{
4886 assert(new_depth >= 0);
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08004887 tstate->coroutine_origin_tracking_depth = new_depth;
4888}
4889
4890int
4891_PyEval_GetCoroutineOriginTrackingDepth(void)
4892{
Victor Stinner50b48572018-11-01 01:51:40 +01004893 PyThreadState *tstate = _PyThreadState_GET();
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08004894 return tstate->coroutine_origin_tracking_depth;
4895}
4896
Zackery Spytz79ceccd2020-03-26 06:11:13 -06004897int
Yury Selivanoveb636452016-09-08 22:01:51 -07004898_PyEval_SetAsyncGenFirstiter(PyObject *firstiter)
4899{
Victor Stinner50b48572018-11-01 01:51:40 +01004900 PyThreadState *tstate = _PyThreadState_GET();
Steve Dowerb82e17e2019-05-23 08:45:22 -07004901
Victor Stinner1c1e68c2020-03-27 15:11:45 +01004902 if (_PySys_Audit(tstate, "sys.set_asyncgen_hook_firstiter", NULL) < 0) {
Zackery Spytz79ceccd2020-03-26 06:11:13 -06004903 return -1;
Steve Dowerb82e17e2019-05-23 08:45:22 -07004904 }
4905
Yury Selivanoveb636452016-09-08 22:01:51 -07004906 Py_XINCREF(firstiter);
4907 Py_XSETREF(tstate->async_gen_firstiter, firstiter);
Zackery Spytz79ceccd2020-03-26 06:11:13 -06004908 return 0;
Yury Selivanoveb636452016-09-08 22:01:51 -07004909}
4910
4911PyObject *
4912_PyEval_GetAsyncGenFirstiter(void)
4913{
Victor Stinner50b48572018-11-01 01:51:40 +01004914 PyThreadState *tstate = _PyThreadState_GET();
Yury Selivanoveb636452016-09-08 22:01:51 -07004915 return tstate->async_gen_firstiter;
4916}
4917
Zackery Spytz79ceccd2020-03-26 06:11:13 -06004918int
Yury Selivanoveb636452016-09-08 22:01:51 -07004919_PyEval_SetAsyncGenFinalizer(PyObject *finalizer)
4920{
Victor Stinner50b48572018-11-01 01:51:40 +01004921 PyThreadState *tstate = _PyThreadState_GET();
Steve Dowerb82e17e2019-05-23 08:45:22 -07004922
Victor Stinner1c1e68c2020-03-27 15:11:45 +01004923 if (_PySys_Audit(tstate, "sys.set_asyncgen_hook_finalizer", NULL) < 0) {
Zackery Spytz79ceccd2020-03-26 06:11:13 -06004924 return -1;
Steve Dowerb82e17e2019-05-23 08:45:22 -07004925 }
4926
Yury Selivanoveb636452016-09-08 22:01:51 -07004927 Py_XINCREF(finalizer);
4928 Py_XSETREF(tstate->async_gen_finalizer, finalizer);
Zackery Spytz79ceccd2020-03-26 06:11:13 -06004929 return 0;
Yury Selivanoveb636452016-09-08 22:01:51 -07004930}
4931
4932PyObject *
4933_PyEval_GetAsyncGenFinalizer(void)
4934{
Victor Stinner50b48572018-11-01 01:51:40 +01004935 PyThreadState *tstate = _PyThreadState_GET();
Yury Selivanoveb636452016-09-08 22:01:51 -07004936 return tstate->async_gen_finalizer;
4937}
4938
Victor Stinner438a12d2019-05-24 17:01:38 +02004939PyFrameObject *
4940PyEval_GetFrame(void)
4941{
4942 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner6723e932020-03-20 17:46:56 +01004943 return tstate->frame;
Victor Stinner438a12d2019-05-24 17:01:38 +02004944}
4945
Guido van Rossumb209a111997-04-29 18:18:01 +00004946PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004947PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00004948{
Victor Stinner438a12d2019-05-24 17:01:38 +02004949 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner6723e932020-03-20 17:46:56 +01004950 PyFrameObject *current_frame = tstate->frame;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004951 if (current_frame == NULL)
Victor Stinner438a12d2019-05-24 17:01:38 +02004952 return tstate->interp->builtins;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004953 else
4954 return current_frame->f_builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00004955}
4956
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02004957/* Convenience function to get a builtin from its name */
4958PyObject *
4959_PyEval_GetBuiltinId(_Py_Identifier *name)
4960{
Victor Stinner438a12d2019-05-24 17:01:38 +02004961 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02004962 PyObject *attr = _PyDict_GetItemIdWithError(PyEval_GetBuiltins(), name);
4963 if (attr) {
4964 Py_INCREF(attr);
4965 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004966 else if (!_PyErr_Occurred(tstate)) {
4967 _PyErr_SetObject(tstate, PyExc_AttributeError, _PyUnicode_FromId(name));
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02004968 }
4969 return attr;
4970}
4971
Guido van Rossumb209a111997-04-29 18:18:01 +00004972PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004973PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00004974{
Victor Stinner438a12d2019-05-24 17:01:38 +02004975 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner6723e932020-03-20 17:46:56 +01004976 PyFrameObject *current_frame = tstate->frame;
Victor Stinner41bb43a2013-10-29 01:19:37 +01004977 if (current_frame == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004978 _PyErr_SetString(tstate, PyExc_SystemError, "frame does not exist");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004979 return NULL;
Victor Stinner41bb43a2013-10-29 01:19:37 +01004980 }
4981
Victor Stinner438a12d2019-05-24 17:01:38 +02004982 if (PyFrame_FastToLocalsWithError(current_frame) < 0) {
Victor Stinner41bb43a2013-10-29 01:19:37 +01004983 return NULL;
Victor Stinner438a12d2019-05-24 17:01:38 +02004984 }
Victor Stinner41bb43a2013-10-29 01:19:37 +01004985
4986 assert(current_frame->f_locals != NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004987 return current_frame->f_locals;
Guido van Rossum5b722181993-03-30 17:46:03 +00004988}
4989
Guido van Rossumb209a111997-04-29 18:18:01 +00004990PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004991PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00004992{
Victor Stinner438a12d2019-05-24 17:01:38 +02004993 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner6723e932020-03-20 17:46:56 +01004994 PyFrameObject *current_frame = tstate->frame;
Victor Stinner438a12d2019-05-24 17:01:38 +02004995 if (current_frame == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004996 return NULL;
Victor Stinner438a12d2019-05-24 17:01:38 +02004997 }
Victor Stinner41bb43a2013-10-29 01:19:37 +01004998
4999 assert(current_frame->f_globals != NULL);
5000 return current_frame->f_globals;
Guido van Rossum3f5da241990-12-20 15:06:42 +00005001}
5002
Guido van Rossum6135a871995-01-09 17:53:26 +00005003int
Tim Peters5ba58662001-07-16 02:29:45 +00005004PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
Jeremy Hylton061d1062001-03-22 02:32:48 +00005005{
Victor Stinner438a12d2019-05-24 17:01:38 +02005006 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner6723e932020-03-20 17:46:56 +01005007 PyFrameObject *current_frame = tstate->frame;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005008 int result = cf->cf_flags != 0;
Tim Peters5ba58662001-07-16 02:29:45 +00005009
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005010 if (current_frame != NULL) {
5011 const int codeflags = current_frame->f_code->co_flags;
5012 const int compilerflags = codeflags & PyCF_MASK;
5013 if (compilerflags) {
5014 result = 1;
5015 cf->cf_flags |= compilerflags;
5016 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00005017#if 0 /* future keyword */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005018 if (codeflags & CO_GENERATOR_ALLOWED) {
5019 result = 1;
5020 cf->cf_flags |= CO_GENERATOR_ALLOWED;
5021 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00005022#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005023 }
5024 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00005025}
5026
Guido van Rossum3f5da241990-12-20 15:06:42 +00005027
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00005028const char *
Tim Peters6d6c1a32001-08-02 04:15:00 +00005029PyEval_GetFuncName(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00005030{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005031 if (PyMethod_Check(func))
5032 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
5033 else if (PyFunction_Check(func))
Serhiy Storchaka06515832016-11-20 09:13:07 +02005034 return PyUnicode_AsUTF8(((PyFunctionObject*)func)->func_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005035 else if (PyCFunction_Check(func))
5036 return ((PyCFunctionObject*)func)->m_ml->ml_name;
5037 else
Victor Stinnera102ed72020-02-07 02:24:48 +01005038 return Py_TYPE(func)->tp_name;
Jeremy Hylton512a2372001-04-11 13:52:29 +00005039}
5040
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00005041const char *
Tim Peters6d6c1a32001-08-02 04:15:00 +00005042PyEval_GetFuncDesc(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00005043{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005044 if (PyMethod_Check(func))
5045 return "()";
5046 else if (PyFunction_Check(func))
5047 return "()";
5048 else if (PyCFunction_Check(func))
5049 return "()";
5050 else
5051 return " object";
Jeremy Hylton512a2372001-04-11 13:52:29 +00005052}
5053
Armin Rigo1c2d7e52005-09-20 18:34:01 +00005054#define C_TRACE(x, call) \
Nicholas Bastind858a772004-06-25 23:31:06 +00005055if (tstate->use_tracing && tstate->c_profilefunc) { \
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005056 if (call_trace(tstate->c_profilefunc, tstate->c_profileobj, \
5057 tstate, tstate->frame, \
5058 PyTrace_C_CALL, func)) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005059 x = NULL; \
5060 } \
5061 else { \
5062 x = call; \
5063 if (tstate->c_profilefunc != NULL) { \
5064 if (x == NULL) { \
5065 call_trace_protected(tstate->c_profilefunc, \
5066 tstate->c_profileobj, \
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005067 tstate, tstate->frame, \
5068 PyTrace_C_EXCEPTION, func); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005069 /* XXX should pass (type, value, tb) */ \
5070 } else { \
5071 if (call_trace(tstate->c_profilefunc, \
5072 tstate->c_profileobj, \
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005073 tstate, tstate->frame, \
5074 PyTrace_C_RETURN, func)) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005075 Py_DECREF(x); \
5076 x = NULL; \
5077 } \
5078 } \
5079 } \
5080 } \
Nicholas Bastind858a772004-06-25 23:31:06 +00005081} else { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005082 x = call; \
5083 }
Nicholas Bastinc69ebe82004-03-24 21:57:10 +00005084
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005085
5086static PyObject *
5087trace_call_function(PyThreadState *tstate,
5088 PyObject *func,
5089 PyObject **args, Py_ssize_t nargs,
5090 PyObject *kwnames)
5091{
5092 PyObject *x;
scoder4c9ea092020-05-12 16:12:41 +02005093 if (PyCFunction_CheckExact(func) || PyCMethod_CheckExact(func)) {
Petr Viktorinffd97532020-02-11 17:46:57 +01005094 C_TRACE(x, PyObject_Vectorcall(func, args, nargs, kwnames));
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005095 return x;
5096 }
Andy Lesterdffe4c02020-03-04 07:15:20 -06005097 else if (Py_IS_TYPE(func, &PyMethodDescr_Type) && nargs > 0) {
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005098 /* We need to create a temporary bound method as argument
5099 for profiling.
5100
5101 If nargs == 0, then this cannot work because we have no
5102 "self". In any case, the call itself would raise
5103 TypeError (foo needs an argument), so we just skip
5104 profiling. */
5105 PyObject *self = args[0];
5106 func = Py_TYPE(func)->tp_descr_get(func, self, (PyObject*)Py_TYPE(self));
5107 if (func == NULL) {
5108 return NULL;
5109 }
Petr Viktorinffd97532020-02-11 17:46:57 +01005110 C_TRACE(x, PyObject_Vectorcall(func,
Jeroen Demeyer0d722f32019-07-05 14:48:24 +02005111 args+1, nargs-1,
5112 kwnames));
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005113 Py_DECREF(func);
5114 return x;
5115 }
Petr Viktorinffd97532020-02-11 17:46:57 +01005116 return PyObject_Vectorcall(func, args, nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames);
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005117}
5118
Victor Stinner415c5102017-01-11 00:54:57 +01005119/* Issue #29227: Inline call_function() into _PyEval_EvalFrameDefault()
5120 to reduce the stack consumption. */
5121Py_LOCAL_INLINE(PyObject *) _Py_HOT_FUNCTION
Victor Stinner09532fe2019-05-10 23:39:09 +02005122call_function(PyThreadState *tstate, PyObject ***pp_stack, Py_ssize_t oparg, PyObject *kwnames)
Jeremy Hyltone8c04322002-08-16 17:47:26 +00005123{
Victor Stinnerf9b760f2016-09-09 10:17:08 -07005124 PyObject **pfunc = (*pp_stack) - oparg - 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005125 PyObject *func = *pfunc;
5126 PyObject *x, *w;
Victor Stinnerd8735722016-09-09 12:36:44 -07005127 Py_ssize_t nkwargs = (kwnames == NULL) ? 0 : PyTuple_GET_SIZE(kwnames);
5128 Py_ssize_t nargs = oparg - nkwargs;
INADA Naoki5566bbb2017-02-03 07:43:03 +09005129 PyObject **stack = (*pp_stack) - nargs - nkwargs;
Jeremy Hyltone8c04322002-08-16 17:47:26 +00005130
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005131 if (tstate->use_tracing) {
5132 x = trace_call_function(tstate, func, stack, nargs, kwnames);
INADA Naoki5566bbb2017-02-03 07:43:03 +09005133 }
Victor Stinner4a7cc882015-03-06 23:35:27 +01005134 else {
Petr Viktorinffd97532020-02-11 17:46:57 +01005135 x = PyObject_Vectorcall(func, stack, nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005136 }
Tim Peters8a5c3c72004-04-05 19:36:21 +00005137
Victor Stinner438a12d2019-05-24 17:01:38 +02005138 assert((x != NULL) ^ (_PyErr_Occurred(tstate) != NULL));
Victor Stinnerf9b760f2016-09-09 10:17:08 -07005139
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01005140 /* Clear the stack of the function object. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005141 while ((*pp_stack) > pfunc) {
5142 w = EXT_POP(*pp_stack);
5143 Py_DECREF(w);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005144 }
Victor Stinnerace47d72013-07-18 01:41:08 +02005145
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005146 return x;
Jeremy Hyltone8c04322002-08-16 17:47:26 +00005147}
5148
Jeremy Hylton52820442001-01-03 23:52:36 +00005149static PyObject *
Victor Stinner09532fe2019-05-10 23:39:09 +02005150do_call_core(PyThreadState *tstate, PyObject *func, PyObject *callargs, PyObject *kwdict)
Jeremy Hylton52820442001-01-03 23:52:36 +00005151{
jdemeyere89de732018-09-19 12:06:20 +02005152 PyObject *result;
5153
scoder4c9ea092020-05-12 16:12:41 +02005154 if (PyCFunction_CheckExact(func) || PyCMethod_CheckExact(func)) {
Jeroen Demeyer7a6873c2019-09-11 13:01:01 +02005155 C_TRACE(result, PyObject_Call(func, callargs, kwdict));
Victor Stinnerf9b760f2016-09-09 10:17:08 -07005156 return result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005157 }
Andy Lesterdffe4c02020-03-04 07:15:20 -06005158 else if (Py_IS_TYPE(func, &PyMethodDescr_Type)) {
jdemeyere89de732018-09-19 12:06:20 +02005159 Py_ssize_t nargs = PyTuple_GET_SIZE(callargs);
5160 if (nargs > 0 && tstate->use_tracing) {
5161 /* We need to create a temporary bound method as argument
5162 for profiling.
5163
5164 If nargs == 0, then this cannot work because we have no
5165 "self". In any case, the call itself would raise
5166 TypeError (foo needs an argument), so we just skip
5167 profiling. */
5168 PyObject *self = PyTuple_GET_ITEM(callargs, 0);
5169 func = Py_TYPE(func)->tp_descr_get(func, self, (PyObject*)Py_TYPE(self));
5170 if (func == NULL) {
5171 return NULL;
5172 }
5173
Victor Stinner4d231bc2019-11-14 13:36:21 +01005174 C_TRACE(result, _PyObject_FastCallDictTstate(
5175 tstate, func,
5176 &_PyTuple_ITEMS(callargs)[1],
5177 nargs - 1,
5178 kwdict));
jdemeyere89de732018-09-19 12:06:20 +02005179 Py_DECREF(func);
5180 return result;
5181 }
Victor Stinner74319ae2016-08-25 00:04:09 +02005182 }
jdemeyere89de732018-09-19 12:06:20 +02005183 return PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00005184}
5185
Serhiy Storchaka483405b2015-02-17 10:14:30 +02005186/* Extract a slice index from a PyLong or an object with the
Guido van Rossum38fff8c2006-03-07 18:50:55 +00005187 nb_index slot defined, and store in *pi.
5188 Silently reduce values larger than PY_SSIZE_T_MAX to PY_SSIZE_T_MAX,
Xiang Zhang2ddf5a12017-05-10 18:19:41 +08005189 and silently boost values less than PY_SSIZE_T_MIN to PY_SSIZE_T_MIN.
Martin v. Löwisdde99d22006-02-17 15:57:41 +00005190 Return 0 on error, 1 on success.
Tim Peterscb479e72001-12-16 19:11:44 +00005191*/
Guido van Rossum20c6add2000-05-08 14:06:50 +00005192int
Martin v. Löwis18e16552006-02-15 17:27:45 +00005193_PyEval_SliceIndex(PyObject *v, Py_ssize_t *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005194{
Victor Stinner438a12d2019-05-24 17:01:38 +02005195 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005196 if (v != Py_None) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005197 Py_ssize_t x;
Victor Stinnera15e2602020-04-08 02:01:56 +02005198 if (_PyIndex_Check(v)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005199 x = PyNumber_AsSsize_t(v, NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02005200 if (x == -1 && _PyErr_Occurred(tstate))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005201 return 0;
5202 }
5203 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02005204 _PyErr_SetString(tstate, PyExc_TypeError,
5205 "slice indices must be integers or "
5206 "None or have an __index__ method");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005207 return 0;
5208 }
5209 *pi = x;
5210 }
5211 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005212}
5213
Serhiy Storchaka80ec8362017-03-19 19:37:40 +02005214int
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005215_PyEval_SliceIndexNotNone(PyObject *v, Py_ssize_t *pi)
Serhiy Storchaka80ec8362017-03-19 19:37:40 +02005216{
Victor Stinner438a12d2019-05-24 17:01:38 +02005217 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005218 Py_ssize_t x;
Victor Stinnera15e2602020-04-08 02:01:56 +02005219 if (_PyIndex_Check(v)) {
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005220 x = PyNumber_AsSsize_t(v, NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02005221 if (x == -1 && _PyErr_Occurred(tstate))
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005222 return 0;
5223 }
5224 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02005225 _PyErr_SetString(tstate, PyExc_TypeError,
5226 "slice indices must be integers or "
5227 "have an __index__ method");
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005228 return 0;
5229 }
5230 *pi = x;
5231 return 1;
Serhiy Storchaka80ec8362017-03-19 19:37:40 +02005232}
5233
Thomas Wouters52152252000-08-17 22:55:00 +00005234static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02005235import_name(PyThreadState *tstate, PyFrameObject *f,
5236 PyObject *name, PyObject *fromlist, PyObject *level)
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005237{
5238 _Py_IDENTIFIER(__import__);
Victor Stinnerdf142fd2016-08-20 00:44:42 +02005239 PyObject *import_func, *res;
5240 PyObject* stack[5];
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005241
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02005242 import_func = _PyDict_GetItemIdWithError(f->f_builtins, &PyId___import__);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005243 if (import_func == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005244 if (!_PyErr_Occurred(tstate)) {
5245 _PyErr_SetString(tstate, PyExc_ImportError, "__import__ not found");
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02005246 }
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005247 return NULL;
5248 }
5249
5250 /* Fast path for not overloaded __import__. */
Victor Stinner438a12d2019-05-24 17:01:38 +02005251 if (import_func == tstate->interp->import_func) {
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005252 int ilevel = _PyLong_AsInt(level);
Victor Stinner438a12d2019-05-24 17:01:38 +02005253 if (ilevel == -1 && _PyErr_Occurred(tstate)) {
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005254 return NULL;
5255 }
5256 res = PyImport_ImportModuleLevelObject(
5257 name,
5258 f->f_globals,
5259 f->f_locals == NULL ? Py_None : f->f_locals,
5260 fromlist,
5261 ilevel);
5262 return res;
5263 }
5264
5265 Py_INCREF(import_func);
Victor Stinnerdf142fd2016-08-20 00:44:42 +02005266
5267 stack[0] = name;
5268 stack[1] = f->f_globals;
5269 stack[2] = f->f_locals == NULL ? Py_None : f->f_locals;
5270 stack[3] = fromlist;
5271 stack[4] = level;
Victor Stinner559bb6a2016-08-22 22:48:54 +02005272 res = _PyObject_FastCall(import_func, stack, 5);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005273 Py_DECREF(import_func);
5274 return res;
5275}
5276
5277static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02005278import_from(PyThreadState *tstate, PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00005279{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005280 PyObject *x;
Xiang Zhang4830f582017-03-21 11:13:42 +08005281 PyObject *fullmodname, *pkgname, *pkgpath, *pkgname_or_unknown, *errmsg;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00005282
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005283 if (_PyObject_LookupAttr(v, name, &x) != 0) {
Antoine Pitrou0373a102014-10-13 20:19:45 +02005284 return x;
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005285 }
Antoine Pitrou0373a102014-10-13 20:19:45 +02005286 /* Issue #17636: in case this failed because of a circular relative
5287 import, try to fallback on reading the module directly from
5288 sys.modules. */
Antoine Pitrou0373a102014-10-13 20:19:45 +02005289 pkgname = _PyObject_GetAttrId(v, &PyId___name__);
Brett Cannon3008bc02015-08-11 18:01:31 -07005290 if (pkgname == NULL) {
5291 goto error;
5292 }
Oren Milman6db70332017-09-19 14:23:01 +03005293 if (!PyUnicode_Check(pkgname)) {
5294 Py_CLEAR(pkgname);
5295 goto error;
5296 }
Antoine Pitrou0373a102014-10-13 20:19:45 +02005297 fullmodname = PyUnicode_FromFormat("%U.%U", pkgname, name);
Brett Cannon3008bc02015-08-11 18:01:31 -07005298 if (fullmodname == NULL) {
Xiang Zhang4830f582017-03-21 11:13:42 +08005299 Py_DECREF(pkgname);
Antoine Pitrou0373a102014-10-13 20:19:45 +02005300 return NULL;
Brett Cannon3008bc02015-08-11 18:01:31 -07005301 }
Eric Snow3f9eee62017-09-15 16:35:20 -06005302 x = PyImport_GetModule(fullmodname);
Antoine Pitrou0373a102014-10-13 20:19:45 +02005303 Py_DECREF(fullmodname);
Victor Stinner438a12d2019-05-24 17:01:38 +02005304 if (x == NULL && !_PyErr_Occurred(tstate)) {
Brett Cannon3008bc02015-08-11 18:01:31 -07005305 goto error;
5306 }
Matthias Bussonnier1bc15642017-02-22 07:06:50 -08005307 Py_DECREF(pkgname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005308 return x;
Brett Cannon3008bc02015-08-11 18:01:31 -07005309 error:
Matthias Bussonnierbc4bed42017-02-14 16:05:25 -08005310 pkgpath = PyModule_GetFilenameObject(v);
Matthias Bussonnier1bc15642017-02-22 07:06:50 -08005311 if (pkgname == NULL) {
5312 pkgname_or_unknown = PyUnicode_FromString("<unknown module name>");
5313 if (pkgname_or_unknown == NULL) {
5314 Py_XDECREF(pkgpath);
5315 return NULL;
5316 }
5317 } else {
5318 pkgname_or_unknown = pkgname;
5319 }
Matthias Bussonnierbc4bed42017-02-14 16:05:25 -08005320
5321 if (pkgpath == NULL || !PyUnicode_Check(pkgpath)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005322 _PyErr_Clear(tstate);
Xiang Zhang4830f582017-03-21 11:13:42 +08005323 errmsg = PyUnicode_FromFormat(
5324 "cannot import name %R from %R (unknown location)",
5325 name, pkgname_or_unknown
5326 );
Stefan Krah027b09c2019-03-25 21:50:58 +01005327 /* NULL checks for errmsg and pkgname done by PyErr_SetImportError. */
Xiang Zhang4830f582017-03-21 11:13:42 +08005328 PyErr_SetImportError(errmsg, pkgname, NULL);
5329 }
5330 else {
Anthony Sottile65366bc2019-09-09 08:17:50 -07005331 _Py_IDENTIFIER(__spec__);
5332 PyObject *spec = _PyObject_GetAttrId(v, &PyId___spec__);
Anthony Sottile65366bc2019-09-09 08:17:50 -07005333 const char *fmt =
5334 _PyModuleSpec_IsInitializing(spec) ?
5335 "cannot import name %R from partially initialized module %R "
5336 "(most likely due to a circular import) (%S)" :
5337 "cannot import name %R from %R (%S)";
5338 Py_XDECREF(spec);
5339
5340 errmsg = PyUnicode_FromFormat(fmt, name, pkgname_or_unknown, pkgpath);
Stefan Krah027b09c2019-03-25 21:50:58 +01005341 /* NULL checks for errmsg and pkgname done by PyErr_SetImportError. */
Xiang Zhang4830f582017-03-21 11:13:42 +08005342 PyErr_SetImportError(errmsg, pkgname, pkgpath);
Matthias Bussonnierbc4bed42017-02-14 16:05:25 -08005343 }
5344
Xiang Zhang4830f582017-03-21 11:13:42 +08005345 Py_XDECREF(errmsg);
Matthias Bussonnier1bc15642017-02-22 07:06:50 -08005346 Py_XDECREF(pkgname_or_unknown);
5347 Py_XDECREF(pkgpath);
Brett Cannon3008bc02015-08-11 18:01:31 -07005348 return NULL;
Thomas Wouters52152252000-08-17 22:55:00 +00005349}
Guido van Rossumac7be682001-01-17 15:42:30 +00005350
Thomas Wouters52152252000-08-17 22:55:00 +00005351static int
Victor Stinner438a12d2019-05-24 17:01:38 +02005352import_all_from(PyThreadState *tstate, PyObject *locals, PyObject *v)
Thomas Wouters52152252000-08-17 22:55:00 +00005353{
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02005354 _Py_IDENTIFIER(__all__);
5355 _Py_IDENTIFIER(__dict__);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005356 PyObject *all, *dict, *name, *value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005357 int skip_leading_underscores = 0;
5358 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00005359
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005360 if (_PyObject_LookupAttrId(v, &PyId___all__, &all) < 0) {
5361 return -1; /* Unexpected error */
5362 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005363 if (all == NULL) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005364 if (_PyObject_LookupAttrId(v, &PyId___dict__, &dict) < 0) {
5365 return -1;
5366 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005367 if (dict == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005368 _PyErr_SetString(tstate, PyExc_ImportError,
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005369 "from-import-* object has no __dict__ and no __all__");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005370 return -1;
5371 }
5372 all = PyMapping_Keys(dict);
5373 Py_DECREF(dict);
5374 if (all == NULL)
5375 return -1;
5376 skip_leading_underscores = 1;
5377 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00005378
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005379 for (pos = 0, err = 0; ; pos++) {
5380 name = PySequence_GetItem(all, pos);
5381 if (name == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005382 if (!_PyErr_ExceptionMatches(tstate, PyExc_IndexError)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005383 err = -1;
Victor Stinner438a12d2019-05-24 17:01:38 +02005384 }
5385 else {
5386 _PyErr_Clear(tstate);
5387 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005388 break;
5389 }
Xiang Zhangd8b291a2018-03-24 18:39:36 +08005390 if (!PyUnicode_Check(name)) {
5391 PyObject *modname = _PyObject_GetAttrId(v, &PyId___name__);
5392 if (modname == NULL) {
5393 Py_DECREF(name);
5394 err = -1;
5395 break;
5396 }
5397 if (!PyUnicode_Check(modname)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005398 _PyErr_Format(tstate, PyExc_TypeError,
5399 "module __name__ must be a string, not %.100s",
5400 Py_TYPE(modname)->tp_name);
Xiang Zhangd8b291a2018-03-24 18:39:36 +08005401 }
5402 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02005403 _PyErr_Format(tstate, PyExc_TypeError,
5404 "%s in %U.%s must be str, not %.100s",
5405 skip_leading_underscores ? "Key" : "Item",
5406 modname,
5407 skip_leading_underscores ? "__dict__" : "__all__",
5408 Py_TYPE(name)->tp_name);
Xiang Zhangd8b291a2018-03-24 18:39:36 +08005409 }
5410 Py_DECREF(modname);
5411 Py_DECREF(name);
5412 err = -1;
5413 break;
5414 }
5415 if (skip_leading_underscores) {
Serhiy Storchakae3b2b4b2017-09-08 09:58:51 +03005416 if (PyUnicode_READY(name) == -1) {
5417 Py_DECREF(name);
5418 err = -1;
5419 break;
5420 }
5421 if (PyUnicode_READ_CHAR(name, 0) == '_') {
5422 Py_DECREF(name);
5423 continue;
5424 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005425 }
5426 value = PyObject_GetAttr(v, name);
5427 if (value == NULL)
5428 err = -1;
5429 else if (PyDict_CheckExact(locals))
5430 err = PyDict_SetItem(locals, name, value);
5431 else
5432 err = PyObject_SetItem(locals, name, value);
5433 Py_DECREF(name);
5434 Py_XDECREF(value);
5435 if (err != 0)
5436 break;
5437 }
5438 Py_DECREF(all);
5439 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00005440}
5441
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005442static int
Victor Stinner438a12d2019-05-24 17:01:38 +02005443check_args_iterable(PyThreadState *tstate, PyObject *func, PyObject *args)
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005444{
Victor Stinnera102ed72020-02-07 02:24:48 +01005445 if (Py_TYPE(args)->tp_iter == NULL && !PySequence_Check(args)) {
Jeroen Demeyerbf17d412019-11-05 16:48:04 +01005446 /* check_args_iterable() may be called with a live exception:
5447 * clear it to prevent calling _PyObject_FunctionStr() with an
5448 * exception set. */
Victor Stinner61f4db82020-01-28 03:37:45 +01005449 _PyErr_Clear(tstate);
Jeroen Demeyerbf17d412019-11-05 16:48:04 +01005450 PyObject *funcstr = _PyObject_FunctionStr(func);
5451 if (funcstr != NULL) {
5452 _PyErr_Format(tstate, PyExc_TypeError,
5453 "%U argument after * must be an iterable, not %.200s",
5454 funcstr, Py_TYPE(args)->tp_name);
5455 Py_DECREF(funcstr);
5456 }
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005457 return -1;
5458 }
5459 return 0;
5460}
5461
5462static void
Victor Stinner438a12d2019-05-24 17:01:38 +02005463format_kwargs_error(PyThreadState *tstate, PyObject *func, PyObject *kwargs)
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005464{
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005465 /* _PyDict_MergeEx raises attribute
5466 * error (percolated from an attempt
5467 * to get 'keys' attribute) instead of
5468 * a type error if its second argument
5469 * is not a mapping.
5470 */
Victor Stinner438a12d2019-05-24 17:01:38 +02005471 if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) {
Victor Stinner61f4db82020-01-28 03:37:45 +01005472 _PyErr_Clear(tstate);
Jeroen Demeyerbf17d412019-11-05 16:48:04 +01005473 PyObject *funcstr = _PyObject_FunctionStr(func);
5474 if (funcstr != NULL) {
5475 _PyErr_Format(
5476 tstate, PyExc_TypeError,
5477 "%U argument after ** must be a mapping, not %.200s",
5478 funcstr, Py_TYPE(kwargs)->tp_name);
5479 Py_DECREF(funcstr);
5480 }
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005481 }
Victor Stinner438a12d2019-05-24 17:01:38 +02005482 else if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005483 PyObject *exc, *val, *tb;
Victor Stinner438a12d2019-05-24 17:01:38 +02005484 _PyErr_Fetch(tstate, &exc, &val, &tb);
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005485 if (val && PyTuple_Check(val) && PyTuple_GET_SIZE(val) == 1) {
Victor Stinner61f4db82020-01-28 03:37:45 +01005486 _PyErr_Clear(tstate);
Jeroen Demeyerbf17d412019-11-05 16:48:04 +01005487 PyObject *funcstr = _PyObject_FunctionStr(func);
5488 if (funcstr != NULL) {
5489 PyObject *key = PyTuple_GET_ITEM(val, 0);
5490 _PyErr_Format(
5491 tstate, PyExc_TypeError,
5492 "%U got multiple values for keyword argument '%S'",
5493 funcstr, key);
5494 Py_DECREF(funcstr);
5495 }
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005496 Py_XDECREF(exc);
5497 Py_XDECREF(val);
5498 Py_XDECREF(tb);
5499 }
5500 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02005501 _PyErr_Restore(tstate, exc, val, tb);
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005502 }
5503 }
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005504}
5505
Guido van Rossumac7be682001-01-17 15:42:30 +00005506static void
Victor Stinner438a12d2019-05-24 17:01:38 +02005507format_exc_check_arg(PyThreadState *tstate, PyObject *exc,
5508 const char *format_str, PyObject *obj)
Paul Prescode68140d2000-08-30 20:25:01 +00005509{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005510 const char *obj_str;
Paul Prescode68140d2000-08-30 20:25:01 +00005511
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005512 if (!obj)
5513 return;
Paul Prescode68140d2000-08-30 20:25:01 +00005514
Serhiy Storchaka06515832016-11-20 09:13:07 +02005515 obj_str = PyUnicode_AsUTF8(obj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005516 if (!obj_str)
5517 return;
Paul Prescode68140d2000-08-30 20:25:01 +00005518
Victor Stinner438a12d2019-05-24 17:01:38 +02005519 _PyErr_Format(tstate, exc, format_str, obj_str);
Paul Prescode68140d2000-08-30 20:25:01 +00005520}
Guido van Rossum950361c1997-01-24 13:49:28 +00005521
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005522static void
Victor Stinner438a12d2019-05-24 17:01:38 +02005523format_exc_unbound(PyThreadState *tstate, PyCodeObject *co, int oparg)
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005524{
5525 PyObject *name;
5526 /* Don't stomp existing exception */
Victor Stinner438a12d2019-05-24 17:01:38 +02005527 if (_PyErr_Occurred(tstate))
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005528 return;
5529 if (oparg < PyTuple_GET_SIZE(co->co_cellvars)) {
5530 name = PyTuple_GET_ITEM(co->co_cellvars,
5531 oparg);
Victor Stinner438a12d2019-05-24 17:01:38 +02005532 format_exc_check_arg(tstate,
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005533 PyExc_UnboundLocalError,
5534 UNBOUNDLOCAL_ERROR_MSG,
5535 name);
5536 } else {
5537 name = PyTuple_GET_ITEM(co->co_freevars, oparg -
5538 PyTuple_GET_SIZE(co->co_cellvars));
Victor Stinner438a12d2019-05-24 17:01:38 +02005539 format_exc_check_arg(tstate, PyExc_NameError,
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005540 UNBOUNDFREE_ERROR_MSG, name);
5541 }
5542}
5543
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03005544static void
Mark Shannonfee55262019-11-21 09:11:43 +00005545format_awaitable_error(PyThreadState *tstate, PyTypeObject *type, int prevprevopcode, int prevopcode)
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03005546{
5547 if (type->tp_as_async == NULL || type->tp_as_async->am_await == NULL) {
5548 if (prevopcode == BEFORE_ASYNC_WITH) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005549 _PyErr_Format(tstate, PyExc_TypeError,
5550 "'async with' received an object from __aenter__ "
5551 "that does not implement __await__: %.100s",
5552 type->tp_name);
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03005553 }
Mark Shannonfee55262019-11-21 09:11:43 +00005554 else if (prevopcode == WITH_EXCEPT_START || (prevopcode == CALL_FUNCTION && prevprevopcode == DUP_TOP)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005555 _PyErr_Format(tstate, PyExc_TypeError,
5556 "'async with' received an object from __aexit__ "
5557 "that does not implement __await__: %.100s",
5558 type->tp_name);
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03005559 }
5560 }
5561}
5562
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005563static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02005564unicode_concatenate(PyThreadState *tstate, PyObject *v, PyObject *w,
Serhiy Storchakaab874002016-09-11 13:48:15 +03005565 PyFrameObject *f, const _Py_CODEUNIT *next_instr)
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005566{
5567 PyObject *res;
5568 if (Py_REFCNT(v) == 2) {
5569 /* In the common case, there are 2 references to the value
5570 * stored in 'variable' when the += is performed: one on the
5571 * value stack (in 'v') and one still stored in the
5572 * 'variable'. We try to delete the variable now to reduce
5573 * the refcnt to 1.
5574 */
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03005575 int opcode, oparg;
5576 NEXTOPARG();
5577 switch (opcode) {
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005578 case STORE_FAST:
5579 {
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005580 PyObject **fastlocals = f->f_localsplus;
5581 if (GETLOCAL(oparg) == v)
5582 SETLOCAL(oparg, NULL);
5583 break;
5584 }
5585 case STORE_DEREF:
5586 {
5587 PyObject **freevars = (f->f_localsplus +
5588 f->f_code->co_nlocals);
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03005589 PyObject *c = freevars[oparg];
Raymond Hettingerc32f9db2016-11-12 04:10:35 -05005590 if (PyCell_GET(c) == v) {
5591 PyCell_SET(c, NULL);
5592 Py_DECREF(v);
5593 }
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005594 break;
5595 }
5596 case STORE_NAME:
5597 {
5598 PyObject *names = f->f_code->co_names;
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03005599 PyObject *name = GETITEM(names, oparg);
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005600 PyObject *locals = f->f_locals;
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02005601 if (locals && PyDict_CheckExact(locals)) {
5602 PyObject *w = PyDict_GetItemWithError(locals, name);
5603 if ((w == v && PyDict_DelItem(locals, name) != 0) ||
Victor Stinner438a12d2019-05-24 17:01:38 +02005604 (w == NULL && _PyErr_Occurred(tstate)))
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02005605 {
5606 Py_DECREF(v);
5607 return NULL;
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005608 }
5609 }
5610 break;
5611 }
5612 }
5613 }
5614 res = v;
5615 PyUnicode_Append(&res, w);
5616 return res;
5617}
5618
Guido van Rossum950361c1997-01-24 13:49:28 +00005619#ifdef DYNAMIC_EXECUTION_PROFILE
5620
Skip Montanarof118cb12001-10-15 20:51:38 +00005621static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005622getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00005623{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005624 int i;
5625 PyObject *l = PyList_New(256);
5626 if (l == NULL) return NULL;
5627 for (i = 0; i < 256; i++) {
5628 PyObject *x = PyLong_FromLong(a[i]);
5629 if (x == NULL) {
5630 Py_DECREF(l);
5631 return NULL;
5632 }
Zackery Spytz99d56b52018-12-08 07:16:55 -07005633 PyList_SET_ITEM(l, i, x);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005634 }
5635 for (i = 0; i < 256; i++)
5636 a[i] = 0;
5637 return l;
Guido van Rossum950361c1997-01-24 13:49:28 +00005638}
5639
5640PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005641_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00005642{
5643#ifndef DXPAIRS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005644 return getarray(dxp);
Guido van Rossum950361c1997-01-24 13:49:28 +00005645#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005646 int i;
5647 PyObject *l = PyList_New(257);
5648 if (l == NULL) return NULL;
5649 for (i = 0; i < 257; i++) {
5650 PyObject *x = getarray(dxpairs[i]);
5651 if (x == NULL) {
5652 Py_DECREF(l);
5653 return NULL;
5654 }
Zackery Spytz99d56b52018-12-08 07:16:55 -07005655 PyList_SET_ITEM(l, i, x);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005656 }
5657 return l;
Guido van Rossum950361c1997-01-24 13:49:28 +00005658#endif
5659}
5660
5661#endif
Brett Cannon5c4de282016-09-07 11:16:41 -07005662
5663Py_ssize_t
5664_PyEval_RequestCodeExtraIndex(freefunc free)
5665{
Victor Stinner81a7be32020-04-14 15:14:01 +02005666 PyInterpreterState *interp = _PyInterpreterState_GET();
Brett Cannon5c4de282016-09-07 11:16:41 -07005667 Py_ssize_t new_index;
5668
Dino Viehlandf3cffd22017-06-21 14:44:36 -07005669 if (interp->co_extra_user_count == MAX_CO_EXTRA_USERS - 1) {
Brett Cannon5c4de282016-09-07 11:16:41 -07005670 return -1;
5671 }
Dino Viehlandf3cffd22017-06-21 14:44:36 -07005672 new_index = interp->co_extra_user_count++;
5673 interp->co_extra_freefuncs[new_index] = free;
Brett Cannon5c4de282016-09-07 11:16:41 -07005674 return new_index;
5675}
Łukasz Langaa785c872016-09-09 17:37:37 -07005676
5677static void
5678dtrace_function_entry(PyFrameObject *f)
5679{
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02005680 const char *filename;
5681 const char *funcname;
Łukasz Langaa785c872016-09-09 17:37:37 -07005682 int lineno;
5683
Victor Stinner6d86a232020-04-29 00:56:58 +02005684 PyCodeObject *code = f->f_code;
5685 filename = PyUnicode_AsUTF8(code->co_filename);
5686 funcname = PyUnicode_AsUTF8(code->co_name);
5687 lineno = PyCode_Addr2Line(code, f->f_lasti);
Łukasz Langaa785c872016-09-09 17:37:37 -07005688
Andy Lestere6be9b52020-02-11 20:28:35 -06005689 PyDTrace_FUNCTION_ENTRY(filename, funcname, lineno);
Łukasz Langaa785c872016-09-09 17:37:37 -07005690}
5691
5692static void
5693dtrace_function_return(PyFrameObject *f)
5694{
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02005695 const char *filename;
5696 const char *funcname;
Łukasz Langaa785c872016-09-09 17:37:37 -07005697 int lineno;
5698
Victor Stinner6d86a232020-04-29 00:56:58 +02005699 PyCodeObject *code = f->f_code;
5700 filename = PyUnicode_AsUTF8(code->co_filename);
5701 funcname = PyUnicode_AsUTF8(code->co_name);
5702 lineno = PyCode_Addr2Line(code, f->f_lasti);
Łukasz Langaa785c872016-09-09 17:37:37 -07005703
Andy Lestere6be9b52020-02-11 20:28:35 -06005704 PyDTrace_FUNCTION_RETURN(filename, funcname, lineno);
Łukasz Langaa785c872016-09-09 17:37:37 -07005705}
5706
5707/* DTrace equivalent of maybe_call_line_trace. */
5708static void
5709maybe_dtrace_line(PyFrameObject *frame,
5710 int *instr_lb, int *instr_ub, int *instr_prev)
5711{
5712 int line = frame->f_lineno;
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02005713 const char *co_filename, *co_name;
Łukasz Langaa785c872016-09-09 17:37:37 -07005714
5715 /* If the last instruction executed isn't in the current
5716 instruction window, reset the window.
5717 */
5718 if (frame->f_lasti < *instr_lb || frame->f_lasti >= *instr_ub) {
5719 PyAddrPair bounds;
5720 line = _PyCode_CheckLineNumber(frame->f_code, frame->f_lasti,
5721 &bounds);
5722 *instr_lb = bounds.ap_lower;
5723 *instr_ub = bounds.ap_upper;
5724 }
5725 /* If the last instruction falls at the start of a line or if
5726 it represents a jump backwards, update the frame's line
5727 number and call the trace function. */
5728 if (frame->f_lasti == *instr_lb || frame->f_lasti < *instr_prev) {
5729 frame->f_lineno = line;
5730 co_filename = PyUnicode_AsUTF8(frame->f_code->co_filename);
5731 if (!co_filename)
5732 co_filename = "?";
5733 co_name = PyUnicode_AsUTF8(frame->f_code->co_name);
5734 if (!co_name)
5735 co_name = "?";
Andy Lestere6be9b52020-02-11 20:28:35 -06005736 PyDTrace_LINE(co_filename, co_name, line);
Łukasz Langaa785c872016-09-09 17:37:37 -07005737 }
5738 *instr_prev = frame->f_lasti;
5739}
Victor Stinnerf4b1e3d2019-11-04 19:48:34 +01005740
5741
5742/* Implement Py_EnterRecursiveCall() and Py_LeaveRecursiveCall() as functions
5743 for the limited API. */
5744
5745#undef Py_EnterRecursiveCall
5746
5747int Py_EnterRecursiveCall(const char *where)
5748{
Victor Stinnerbe434dc2019-11-05 00:51:22 +01005749 return _Py_EnterRecursiveCall_inline(where);
Victor Stinnerf4b1e3d2019-11-04 19:48:34 +01005750}
5751
5752#undef Py_LeaveRecursiveCall
5753
5754void Py_LeaveRecursiveCall(void)
5755{
Victor Stinnerbe434dc2019-11-05 00:51:22 +01005756 _Py_LeaveRecursiveCall_inline();
Victor Stinnerf4b1e3d2019-11-04 19:48:34 +01005757}