blob: d1d0779318571fc6d265afd44c6390d7cdec5314 [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 Stinner4d231bc2019-11-14 13:36:21 +010014#include "pycore_call.h"
Victor Stinner09532fe2019-05-10 23:39:09 +020015#include "pycore_ceval.h"
Inada Naoki91234a12019-06-03 21:30:58 +090016#include "pycore_code.h"
Victor Stinner111e4ee2020-03-09 21:24:14 +010017#include "pycore_initconfig.h"
Victor Stinnerbcda8f12018-11-21 22:27:47 +010018#include "pycore_object.h"
Victor Stinner438a12d2019-05-24 17:01:38 +020019#include "pycore_pyerrors.h"
20#include "pycore_pylifecycle.h"
Victor Stinnere560f902020-04-14 18:30:41 +020021#include "pycore_pymem.h" // _PyMem_IsPtrFreed()
22#include "pycore_pystate.h" // _PyInterpreterState_GET()
Victor Stinner1c1e68c2020-03-27 15:11:45 +010023#include "pycore_sysmodule.h"
Victor Stinnerec13b932018-11-25 23:56:17 +010024#include "pycore_tupleobject.h"
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
744#define Py_DEFAULT_RECURSION_LIMIT 1000
745#endif
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600746
Eric Snow05351c12017-09-05 21:43:08 -0700747int _Py_CheckRecursionLimit = Py_DEFAULT_RECURSION_LIMIT;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000748
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600749void
Victor Stinnerdab84232020-03-17 18:56:44 +0100750_PyEval_InitRuntimeState(struct _ceval_runtime_state *ceval)
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600751{
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600752 _Py_CheckRecursionLimit = Py_DEFAULT_RECURSION_LIMIT;
Victor Stinner7be4e352020-05-05 20:27:47 +0200753#ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
Victor Stinnerdab84232020-03-17 18:56:44 +0100754 _gil_initialize(&ceval->gil);
Victor Stinner7be4e352020-05-05 20:27:47 +0200755#endif
Victor Stinnerdab84232020-03-17 18:56:44 +0100756}
757
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200758int
Victor Stinnerdab84232020-03-17 18:56:44 +0100759_PyEval_InitState(struct _ceval_state *ceval)
760{
Victor Stinner4e30ed32020-05-05 16:52:52 +0200761 ceval->recursion_limit = Py_DEFAULT_RECURSION_LIMIT;
762
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200763 struct _pending_calls *pending = &ceval->pending;
764 assert(pending->lock == NULL);
765
766 pending->lock = PyThread_allocate_lock();
767 if (pending->lock == NULL) {
768 return -1;
769 }
Victor Stinner7be4e352020-05-05 20:27:47 +0200770
771#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
772 _gil_initialize(&ceval->gil);
773#endif
774
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200775 return 0;
776}
777
778void
779_PyEval_FiniState(struct _ceval_state *ceval)
780{
781 struct _pending_calls *pending = &ceval->pending;
782 if (pending->lock != NULL) {
783 PyThread_free_lock(pending->lock);
784 pending->lock = NULL;
785 }
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600786}
787
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000788int
789Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000790{
Victor Stinner4e30ed32020-05-05 16:52:52 +0200791 PyThreadState *tstate = _PyThreadState_GET();
792 return tstate->interp->ceval.recursion_limit;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000793}
794
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000795void
796Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000797{
Victor Stinner4e30ed32020-05-05 16:52:52 +0200798 PyThreadState *tstate = _PyThreadState_GET();
799 tstate->interp->ceval.recursion_limit = new_limit;
800 if (_Py_IsMainInterpreter(tstate)) {
801 _Py_CheckRecursionLimit = new_limit;
802 }
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000803}
804
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100805/* The function _Py_EnterRecursiveCall() only calls _Py_CheckRecursiveCall()
Armin Rigo2b3eb402003-10-28 12:05:48 +0000806 if the recursion_depth reaches _Py_CheckRecursionLimit.
807 If USE_STACKCHECK, the macro decrements _Py_CheckRecursionLimit
808 to guarantee that _Py_CheckRecursiveCall() is regularly called.
809 Without USE_STACKCHECK, there is no need for this. */
810int
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100811_Py_CheckRecursiveCall(PyThreadState *tstate, const char *where)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000812{
Victor Stinner4e30ed32020-05-05 16:52:52 +0200813 int recursion_limit = tstate->interp->ceval.recursion_limit;
Armin Rigo2b3eb402003-10-28 12:05:48 +0000814
815#ifdef USE_STACKCHECK
pdox18967932017-10-25 23:03:01 -0700816 tstate->stackcheck_counter = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000817 if (PyOS_CheckStack()) {
818 --tstate->recursion_depth;
Victor Stinner438a12d2019-05-24 17:01:38 +0200819 _PyErr_SetString(tstate, PyExc_MemoryError, "Stack overflow");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000820 return -1;
821 }
Victor Stinner4e30ed32020-05-05 16:52:52 +0200822 if (_Py_IsMainInterpreter(tstate)) {
823 /* Needed for ABI backwards-compatibility (see bpo-31857) */
824 _Py_CheckRecursionLimit = recursion_limit;
825 }
pdox18967932017-10-25 23:03:01 -0700826#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000827 if (tstate->recursion_critical)
828 /* Somebody asked that we don't check for recursion. */
829 return 0;
830 if (tstate->overflowed) {
831 if (tstate->recursion_depth > recursion_limit + 50) {
832 /* Overflowing while handling an overflow. Give up. */
833 Py_FatalError("Cannot recover from stack overflow.");
834 }
835 return 0;
836 }
837 if (tstate->recursion_depth > recursion_limit) {
838 --tstate->recursion_depth;
839 tstate->overflowed = 1;
Victor Stinner438a12d2019-05-24 17:01:38 +0200840 _PyErr_Format(tstate, PyExc_RecursionError,
841 "maximum recursion depth exceeded%s",
842 where);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000843 return -1;
844 }
845 return 0;
Armin Rigo2b3eb402003-10-28 12:05:48 +0000846}
847
Victor Stinner09532fe2019-05-10 23:39:09 +0200848static int do_raise(PyThreadState *tstate, PyObject *exc, PyObject *cause);
Victor Stinner438a12d2019-05-24 17:01:38 +0200849static int unpack_iterable(PyThreadState *, PyObject *, int, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000850
Victor Stinnere225beb2019-06-03 18:14:24 +0200851#define _Py_TracingPossible(ceval) ((ceval)->tracing_possible)
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000852
Guido van Rossum374a9221991-04-04 10:40:29 +0000853
Guido van Rossumb209a111997-04-29 18:18:01 +0000854PyObject *
Martin v. Löwis4d0d4712010-12-03 20:14:31 +0000855PyEval_EvalCode(PyObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000856{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000857 return PyEval_EvalCodeEx(co,
858 globals, locals,
859 (PyObject **)NULL, 0,
860 (PyObject **)NULL, 0,
861 (PyObject **)NULL, 0,
862 NULL, NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000863}
864
865
866/* Interpreter main loop */
867
Martin v. Löwis8d97e332004-06-27 15:43:12 +0000868PyObject *
Victor Stinnerb9e68122019-11-14 12:20:46 +0100869PyEval_EvalFrame(PyFrameObject *f)
870{
Victor Stinner0b72b232020-03-12 23:18:39 +0100871 /* Function kept for backward compatibility */
Victor Stinnerb9e68122019-11-14 12:20:46 +0100872 PyThreadState *tstate = _PyThreadState_GET();
873 return _PyEval_EvalFrame(tstate, f, 0);
Phillip J. Eby0d6615f2005-08-02 00:46:46 +0000874}
875
876PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000877PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
Guido van Rossum374a9221991-04-04 10:40:29 +0000878{
Victor Stinnerb9e68122019-11-14 12:20:46 +0100879 PyThreadState *tstate = _PyThreadState_GET();
880 return _PyEval_EvalFrame(tstate, f, throwflag);
Brett Cannon3cebf932016-09-05 15:33:46 -0700881}
882
Victor Stinnerda2914d2020-03-20 09:29:08 +0100883
884/* Handle signals, pending calls, GIL drop request
885 and asynchronous exception */
886static int
887eval_frame_handle_pending(PyThreadState *tstate)
888{
Victor Stinnerda2914d2020-03-20 09:29:08 +0100889 _PyRuntimeState * const runtime = &_PyRuntime;
890 struct _ceval_runtime_state *ceval = &runtime->ceval;
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200891
892 /* Pending signals */
Victor Stinner299b8c62020-05-05 17:40:18 +0200893 if (_Py_atomic_load_relaxed(&ceval->signals_pending)) {
Victor Stinnerda2914d2020-03-20 09:29:08 +0100894 if (handle_signals(tstate) != 0) {
895 return -1;
896 }
897 }
898
899 /* Pending calls */
Victor Stinner299b8c62020-05-05 17:40:18 +0200900 struct _ceval_state *ceval2 = &tstate->interp->ceval;
Victor Stinnerda2914d2020-03-20 09:29:08 +0100901 if (_Py_atomic_load_relaxed(&ceval2->pending.calls_to_do)) {
902 if (make_pending_calls(tstate) != 0) {
903 return -1;
904 }
905 }
906
907 /* GIL drop request */
Victor Stinner0b1e3302020-05-05 16:14:31 +0200908 if (_Py_atomic_load_relaxed(&ceval2->gil_drop_request)) {
Victor Stinnerda2914d2020-03-20 09:29:08 +0100909 /* Give another thread a chance */
910 if (_PyThreadState_Swap(&runtime->gilstate, NULL) != tstate) {
911 Py_FatalError("tstate mix-up");
912 }
Victor Stinner0b1e3302020-05-05 16:14:31 +0200913 drop_gil(ceval, ceval2, tstate);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100914
915 /* Other threads may run now */
916
917 take_gil(tstate);
918
Victor Stinnere838a932020-05-05 19:56:48 +0200919#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
920 (void)_PyThreadState_Swap(&runtime->gilstate, tstate);
921#else
Victor Stinnerda2914d2020-03-20 09:29:08 +0100922 if (_PyThreadState_Swap(&runtime->gilstate, tstate) != NULL) {
923 Py_FatalError("orphan tstate");
924 }
Victor Stinnere838a932020-05-05 19:56:48 +0200925#endif
Victor Stinnerda2914d2020-03-20 09:29:08 +0100926 }
927
928 /* Check for asynchronous exception. */
929 if (tstate->async_exc != NULL) {
930 PyObject *exc = tstate->async_exc;
931 tstate->async_exc = NULL;
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200932 UNSIGNAL_ASYNC_EXC(tstate->interp);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100933 _PyErr_SetNone(tstate, exc);
934 Py_DECREF(exc);
935 return -1;
936 }
937
938 return 0;
939}
940
Victor Stinnerc6944e72016-11-11 02:13:35 +0100941PyObject* _Py_HOT_FUNCTION
Victor Stinner0b72b232020-03-12 23:18:39 +0100942_PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag)
Brett Cannon3cebf932016-09-05 15:33:46 -0700943{
Victor Stinner3026cad2020-06-01 16:02:40 +0200944 _Py_EnsureTstateNotNULL(tstate);
Victor Stinner0b72b232020-03-12 23:18:39 +0100945
Guido van Rossum950361c1997-01-24 13:49:28 +0000946#ifdef DXPAIRS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000947 int lastopcode = 0;
Guido van Rossum950361c1997-01-24 13:49:28 +0000948#endif
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200949 PyObject **stack_pointer; /* Next free slot in value stack */
Serhiy Storchakaab874002016-09-11 13:48:15 +0300950 const _Py_CODEUNIT *next_instr;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200951 int opcode; /* Current opcode */
952 int oparg; /* Current opcode argument, if any */
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200953 PyObject **fastlocals, **freevars;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000954 PyObject *retval = NULL; /* Return value */
Victor Stinnerdab84232020-03-17 18:56:44 +0100955 struct _ceval_state * const ceval2 = &tstate->interp->ceval;
Victor Stinner50e6e992020-03-19 02:41:21 +0100956 _Py_atomic_int * const eval_breaker = &ceval2->eval_breaker;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000957 PyCodeObject *co;
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000958
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000959 /* when tracing we set things up so that
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000960
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000961 not (instr_lb <= current_bytecode_offset < instr_ub)
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000962
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000963 is true when the line being executed has changed. The
964 initial values are such as to make this false the first
965 time it is tested. */
966 int instr_ub = -1, instr_lb = 0, instr_prev = -1;
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000967
Serhiy Storchakaab874002016-09-11 13:48:15 +0300968 const _Py_CODEUNIT *first_instr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000969 PyObject *names;
970 PyObject *consts;
Inada Naoki91234a12019-06-03 21:30:58 +0900971 _PyOpcache *co_opcache;
Guido van Rossum374a9221991-04-04 10:40:29 +0000972
Brett Cannon368b4b72012-04-02 12:17:59 -0400973#ifdef LLTRACE
Victor Stinner3c1e4812012-03-26 22:10:51 +0200974 _Py_IDENTIFIER(__ltrace__);
Brett Cannon368b4b72012-04-02 12:17:59 -0400975#endif
Victor Stinner3c1e4812012-03-26 22:10:51 +0200976
Antoine Pitroub52ec782009-01-25 16:34:23 +0000977/* Computed GOTOs, or
978 the-optimization-commonly-but-improperly-known-as-"threaded code"
979 using gcc's labels-as-values extension
980 (http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html).
981
982 The traditional bytecode evaluation loop uses a "switch" statement, which
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000983 decent compilers will optimize as a single indirect branch instruction
Antoine Pitroub52ec782009-01-25 16:34:23 +0000984 combined with a lookup table of jump addresses. However, since the
985 indirect jump instruction is shared by all opcodes, the CPU will have a
986 hard time making the right prediction for where to jump next (actually,
987 it will be always wrong except in the uncommon case of a sequence of
988 several identical opcodes).
989
990 "Threaded code" in contrast, uses an explicit jump table and an explicit
991 indirect jump instruction at the end of each opcode. Since the jump
992 instruction is at a different address for each opcode, the CPU will make a
993 separate prediction for each of these instructions, which is equivalent to
994 predicting the second opcode of each opcode pair. These predictions have
995 a much better chance to turn out valid, especially in small bytecode loops.
996
997 A mispredicted branch on a modern CPU flushes the whole pipeline and
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000998 can cost several CPU cycles (depending on the pipeline depth),
Antoine Pitroub52ec782009-01-25 16:34:23 +0000999 and potentially many more instructions (depending on the pipeline width).
1000 A correctly predicted branch, however, is nearly free.
1001
1002 At the time of this writing, the "threaded code" version is up to 15-20%
1003 faster than the normal "switch" version, depending on the compiler and the
1004 CPU architecture.
1005
1006 We disable the optimization if DYNAMIC_EXECUTION_PROFILE is defined,
1007 because it would render the measurements invalid.
1008
1009
1010 NOTE: care must be taken that the compiler doesn't try to "optimize" the
1011 indirect jumps by sharing them between all opcodes. Such optimizations
1012 can be disabled on gcc by using the -fno-gcse flag (or possibly
1013 -fno-crossjumping).
1014*/
1015
Antoine Pitrou042b1282010-08-13 21:15:58 +00001016#ifdef DYNAMIC_EXECUTION_PROFILE
Antoine Pitroub52ec782009-01-25 16:34:23 +00001017#undef USE_COMPUTED_GOTOS
Antoine Pitrou042b1282010-08-13 21:15:58 +00001018#define USE_COMPUTED_GOTOS 0
Antoine Pitroub52ec782009-01-25 16:34:23 +00001019#endif
1020
Antoine Pitrou042b1282010-08-13 21:15:58 +00001021#ifdef HAVE_COMPUTED_GOTOS
1022 #ifndef USE_COMPUTED_GOTOS
1023 #define USE_COMPUTED_GOTOS 1
1024 #endif
1025#else
1026 #if defined(USE_COMPUTED_GOTOS) && USE_COMPUTED_GOTOS
1027 #error "Computed gotos are not supported on this compiler."
1028 #endif
1029 #undef USE_COMPUTED_GOTOS
1030 #define USE_COMPUTED_GOTOS 0
1031#endif
1032
1033#if USE_COMPUTED_GOTOS
Antoine Pitroub52ec782009-01-25 16:34:23 +00001034/* Import the static jump table */
1035#include "opcode_targets.h"
1036
Antoine Pitroub52ec782009-01-25 16:34:23 +00001037#define TARGET(op) \
Benjamin Petersonddd19492018-09-16 22:38:02 -07001038 op: \
1039 TARGET_##op
Antoine Pitroub52ec782009-01-25 16:34:23 +00001040
Antoine Pitroub52ec782009-01-25 16:34:23 +00001041#ifdef LLTRACE
1042#define FAST_DISPATCH() \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001043 { \
Victor Stinnerdab84232020-03-17 18:56:44 +01001044 if (!lltrace && !_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#else
1052#define FAST_DISPATCH() \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001053 { \
Victor Stinnerdab84232020-03-17 18:56:44 +01001054 if (!_Py_TracingPossible(ceval2) && !PyDTrace_LINE_ENABLED()) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001055 f->f_lasti = INSTR_OFFSET(); \
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001056 NEXTOPARG(); \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001057 goto *opcode_targets[opcode]; \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001058 } \
1059 goto fast_next_opcode; \
1060 }
Antoine Pitroub52ec782009-01-25 16:34:23 +00001061#endif
1062
Victor Stinner09532fe2019-05-10 23:39:09 +02001063#define DISPATCH() \
1064 { \
1065 if (!_Py_atomic_load_relaxed(eval_breaker)) { \
1066 FAST_DISPATCH(); \
1067 } \
1068 continue; \
1069 }
1070
Antoine Pitroub52ec782009-01-25 16:34:23 +00001071#else
Benjamin Petersonddd19492018-09-16 22:38:02 -07001072#define TARGET(op) op
Antoine Pitroub52ec782009-01-25 16:34:23 +00001073#define FAST_DISPATCH() goto fast_next_opcode
Victor Stinner09532fe2019-05-10 23:39:09 +02001074#define DISPATCH() continue
Antoine Pitroub52ec782009-01-25 16:34:23 +00001075#endif
1076
1077
Neal Norwitza81d2202002-07-14 00:27:26 +00001078/* Tuple access macros */
1079
1080#ifndef Py_DEBUG
1081#define GETITEM(v, i) PyTuple_GET_ITEM((PyTupleObject *)(v), (i))
1082#else
1083#define GETITEM(v, i) PyTuple_GetItem((v), (i))
1084#endif
1085
Guido van Rossum374a9221991-04-04 10:40:29 +00001086/* Code access macros */
1087
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001088/* The integer overflow is checked by an assertion below. */
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001089#define INSTR_OFFSET() \
1090 (sizeof(_Py_CODEUNIT) * (int)(next_instr - first_instr))
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001091#define NEXTOPARG() do { \
Serhiy Storchakaab874002016-09-11 13:48:15 +03001092 _Py_CODEUNIT word = *next_instr; \
1093 opcode = _Py_OPCODE(word); \
1094 oparg = _Py_OPARG(word); \
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001095 next_instr++; \
1096 } while (0)
Serhiy Storchakaab874002016-09-11 13:48:15 +03001097#define JUMPTO(x) (next_instr = first_instr + (x) / sizeof(_Py_CODEUNIT))
1098#define JUMPBY(x) (next_instr += (x) / sizeof(_Py_CODEUNIT))
Guido van Rossum374a9221991-04-04 10:40:29 +00001099
Raymond Hettingerf606f872003-03-16 03:11:04 +00001100/* OpCode prediction macros
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001101 Some opcodes tend to come in pairs thus making it possible to
1102 predict the second code when the first is run. For example,
Serhiy Storchakada9c5132016-06-27 18:58:57 +03001103 COMPARE_OP is often followed by POP_JUMP_IF_FALSE or POP_JUMP_IF_TRUE.
Raymond Hettingerf606f872003-03-16 03:11:04 +00001104
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001105 Verifying the prediction costs a single high-speed test of a register
1106 variable against a constant. If the pairing was good, then the
1107 processor's own internal branch predication has a high likelihood of
1108 success, resulting in a nearly zero-overhead transition to the
1109 next opcode. A successful prediction saves a trip through the eval-loop
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001110 including its unpredictable switch-case branch. Combined with the
1111 processor's internal branch prediction, a successful PREDICT has the
1112 effect of making the two opcodes run as if they were a single new opcode
1113 with the bodies combined.
Raymond Hettingerf606f872003-03-16 03:11:04 +00001114
Georg Brandl86b2fb92008-07-16 03:43:04 +00001115 If collecting opcode statistics, your choices are to either keep the
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001116 predictions turned-on and interpret the results as if some opcodes
1117 had been combined or turn-off predictions so that the opcode frequency
1118 counter updates for both opcodes.
Antoine Pitroub52ec782009-01-25 16:34:23 +00001119
1120 Opcode prediction is disabled with threaded code, since the latter allows
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001121 the CPU to record separate branch prediction information for each
1122 opcode.
Antoine Pitroub52ec782009-01-25 16:34:23 +00001123
Raymond Hettingerf606f872003-03-16 03:11:04 +00001124*/
1125
Denis Chernikovbaf29b22020-02-21 12:17:50 +03001126#define PREDICT_ID(op) PRED_##op
1127
Antoine Pitrou042b1282010-08-13 21:15:58 +00001128#if defined(DYNAMIC_EXECUTION_PROFILE) || USE_COMPUTED_GOTOS
Denis Chernikovbaf29b22020-02-21 12:17:50 +03001129#define PREDICT(op) if (0) goto PREDICT_ID(op)
Raymond Hettingera7216982004-02-08 19:59:27 +00001130#else
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001131#define PREDICT(op) \
Denis Chernikovbaf29b22020-02-21 12:17:50 +03001132 do { \
Serhiy Storchakaab874002016-09-11 13:48:15 +03001133 _Py_CODEUNIT word = *next_instr; \
1134 opcode = _Py_OPCODE(word); \
Denis Chernikovbaf29b22020-02-21 12:17:50 +03001135 if (opcode == op) { \
Serhiy Storchakaab874002016-09-11 13:48:15 +03001136 oparg = _Py_OPARG(word); \
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001137 next_instr++; \
Denis Chernikovbaf29b22020-02-21 12:17:50 +03001138 goto PREDICT_ID(op); \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001139 } \
1140 } while(0)
Antoine Pitroub52ec782009-01-25 16:34:23 +00001141#endif
Denis Chernikovbaf29b22020-02-21 12:17:50 +03001142#define PREDICTED(op) PREDICT_ID(op):
Antoine Pitroub52ec782009-01-25 16:34:23 +00001143
Raymond Hettingerf606f872003-03-16 03:11:04 +00001144
Guido van Rossum374a9221991-04-04 10:40:29 +00001145/* Stack manipulation macros */
1146
Martin v. Löwis18e16552006-02-15 17:27:45 +00001147/* The stack can grow at most MAXINT deep, as co_nlocals and
1148 co_stacksize are ints. */
Stefan Krahb7e10102010-06-23 18:42:39 +00001149#define STACK_LEVEL() ((int)(stack_pointer - f->f_valuestack))
1150#define EMPTY() (STACK_LEVEL() == 0)
1151#define TOP() (stack_pointer[-1])
1152#define SECOND() (stack_pointer[-2])
1153#define THIRD() (stack_pointer[-3])
1154#define FOURTH() (stack_pointer[-4])
1155#define PEEK(n) (stack_pointer[-(n)])
1156#define SET_TOP(v) (stack_pointer[-1] = (v))
1157#define SET_SECOND(v) (stack_pointer[-2] = (v))
1158#define SET_THIRD(v) (stack_pointer[-3] = (v))
1159#define SET_FOURTH(v) (stack_pointer[-4] = (v))
1160#define SET_VALUE(n, v) (stack_pointer[-(n)] = (v))
1161#define BASIC_STACKADJ(n) (stack_pointer += n)
1162#define BASIC_PUSH(v) (*stack_pointer++ = (v))
1163#define BASIC_POP() (*--stack_pointer)
Guido van Rossum374a9221991-04-04 10:40:29 +00001164
Guido van Rossum96a42c81992-01-12 02:29:51 +00001165#ifdef LLTRACE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001166#define PUSH(v) { (void)(BASIC_PUSH(v), \
Victor Stinner438a12d2019-05-24 17:01:38 +02001167 lltrace && prtrace(tstate, TOP(), "push")); \
Stefan Krahb7e10102010-06-23 18:42:39 +00001168 assert(STACK_LEVEL() <= co->co_stacksize); }
Victor Stinner438a12d2019-05-24 17:01:38 +02001169#define POP() ((void)(lltrace && prtrace(tstate, TOP(), "pop")), \
Stefan Krahb7e10102010-06-23 18:42:39 +00001170 BASIC_POP())
costypetrisor8ed317f2018-07-31 20:55:14 +00001171#define STACK_GROW(n) do { \
1172 assert(n >= 0); \
1173 (void)(BASIC_STACKADJ(n), \
Victor Stinner438a12d2019-05-24 17:01:38 +02001174 lltrace && prtrace(tstate, TOP(), "stackadj")); \
costypetrisor8ed317f2018-07-31 20:55:14 +00001175 assert(STACK_LEVEL() <= co->co_stacksize); \
1176 } while (0)
1177#define STACK_SHRINK(n) do { \
1178 assert(n >= 0); \
Victor Stinner438a12d2019-05-24 17:01:38 +02001179 (void)(lltrace && prtrace(tstate, TOP(), "stackadj")); \
costypetrisor8ed317f2018-07-31 20:55:14 +00001180 (void)(BASIC_STACKADJ(-n)); \
1181 assert(STACK_LEVEL() <= co->co_stacksize); \
1182 } while (0)
Christian Heimes0449f632007-12-15 01:27:15 +00001183#define EXT_POP(STACK_POINTER) ((void)(lltrace && \
Victor Stinner438a12d2019-05-24 17:01:38 +02001184 prtrace(tstate, (STACK_POINTER)[-1], "ext_pop")), \
Stefan Krahb7e10102010-06-23 18:42:39 +00001185 *--(STACK_POINTER))
Guido van Rossum374a9221991-04-04 10:40:29 +00001186#else
Stefan Krahb7e10102010-06-23 18:42:39 +00001187#define PUSH(v) BASIC_PUSH(v)
1188#define POP() BASIC_POP()
costypetrisor8ed317f2018-07-31 20:55:14 +00001189#define STACK_GROW(n) BASIC_STACKADJ(n)
1190#define STACK_SHRINK(n) BASIC_STACKADJ(-n)
Guido van Rossumc2e20742006-02-27 22:32:47 +00001191#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
Guido van Rossum374a9221991-04-04 10:40:29 +00001192#endif
1193
Guido van Rossum681d79a1995-07-18 14:51:37 +00001194/* Local variable macros */
1195
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001196#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumcfbf1a32002-03-28 20:17:52 +00001197
1198/* The SETLOCAL() macro must not DECREF the local variable in-place and
1199 then store the new value; it must copy the old value to a temporary
1200 value, then store the new value, and then DECREF the temporary value.
1201 This is because it is possible that during the DECREF the frame is
1202 accessed by other code (e.g. a __del__ method or gc.collect()) and the
1203 variable would be pointing to already-freed memory. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001204#define SETLOCAL(i, value) do { PyObject *tmp = GETLOCAL(i); \
Stefan Krahb7e10102010-06-23 18:42:39 +00001205 GETLOCAL(i) = value; \
1206 Py_XDECREF(tmp); } while (0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00001207
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001208
1209#define UNWIND_BLOCK(b) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001210 while (STACK_LEVEL() > (b)->b_level) { \
1211 PyObject *v = POP(); \
1212 Py_XDECREF(v); \
1213 }
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001214
1215#define UNWIND_EXCEPT_HANDLER(b) \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001216 do { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001217 PyObject *type, *value, *traceback; \
Mark Shannonae3087c2017-10-22 22:41:51 +01001218 _PyErr_StackItem *exc_info; \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001219 assert(STACK_LEVEL() >= (b)->b_level + 3); \
1220 while (STACK_LEVEL() > (b)->b_level + 3) { \
1221 value = POP(); \
1222 Py_XDECREF(value); \
1223 } \
Mark Shannonae3087c2017-10-22 22:41:51 +01001224 exc_info = tstate->exc_info; \
1225 type = exc_info->exc_type; \
1226 value = exc_info->exc_value; \
1227 traceback = exc_info->exc_traceback; \
1228 exc_info->exc_type = POP(); \
1229 exc_info->exc_value = POP(); \
1230 exc_info->exc_traceback = POP(); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001231 Py_XDECREF(type); \
1232 Py_XDECREF(value); \
1233 Py_XDECREF(traceback); \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001234 } while(0)
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001235
Inada Naoki91234a12019-06-03 21:30:58 +09001236 /* macros for opcode cache */
1237#define OPCACHE_CHECK() \
1238 do { \
1239 co_opcache = NULL; \
1240 if (co->co_opcache != NULL) { \
1241 unsigned char co_opt_offset = \
1242 co->co_opcache_map[next_instr - first_instr]; \
1243 if (co_opt_offset > 0) { \
1244 assert(co_opt_offset <= co->co_opcache_size); \
1245 co_opcache = &co->co_opcache[co_opt_offset - 1]; \
1246 assert(co_opcache != NULL); \
Inada Naoki91234a12019-06-03 21:30:58 +09001247 } \
1248 } \
1249 } while (0)
1250
1251#if OPCACHE_STATS
1252
1253#define OPCACHE_STAT_GLOBAL_HIT() \
1254 do { \
1255 if (co->co_opcache != NULL) opcache_global_hits++; \
1256 } while (0)
1257
1258#define OPCACHE_STAT_GLOBAL_MISS() \
1259 do { \
1260 if (co->co_opcache != NULL) opcache_global_misses++; \
1261 } while (0)
1262
1263#define OPCACHE_STAT_GLOBAL_OPT() \
1264 do { \
1265 if (co->co_opcache != NULL) opcache_global_opts++; \
1266 } while (0)
1267
1268#else /* OPCACHE_STATS */
1269
1270#define OPCACHE_STAT_GLOBAL_HIT()
1271#define OPCACHE_STAT_GLOBAL_MISS()
1272#define OPCACHE_STAT_GLOBAL_OPT()
1273
1274#endif
1275
Guido van Rossuma027efa1997-05-05 20:56:21 +00001276/* Start of code */
1277
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001278 /* push frame */
Victor Stinnerbe434dc2019-11-05 00:51:22 +01001279 if (_Py_EnterRecursiveCall(tstate, "")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001280 return NULL;
Victor Stinnerbe434dc2019-11-05 00:51:22 +01001281 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001282
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001283 tstate->frame = f;
Tim Peters5ca576e2001-06-18 22:08:13 +00001284
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001285 if (tstate->use_tracing) {
1286 if (tstate->c_tracefunc != NULL) {
1287 /* tstate->c_tracefunc, if defined, is a
1288 function that will be called on *every* entry
1289 to a code block. Its return value, if not
1290 None, is a function that will be called at
1291 the start of each executed line of code.
1292 (Actually, the function must return itself
1293 in order to continue tracing.) The trace
1294 functions are called with three arguments:
1295 a pointer to the current frame, a string
1296 indicating why the function is called, and
1297 an argument which depends on the situation.
1298 The global trace function is also called
1299 whenever an exception is detected. */
1300 if (call_trace_protected(tstate->c_tracefunc,
1301 tstate->c_traceobj,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01001302 tstate, f, PyTrace_CALL, Py_None)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001303 /* Trace function raised an error */
1304 goto exit_eval_frame;
1305 }
1306 }
1307 if (tstate->c_profilefunc != NULL) {
1308 /* Similar for c_profilefunc, except it needn't
1309 return itself and isn't called for "line" events */
1310 if (call_trace_protected(tstate->c_profilefunc,
1311 tstate->c_profileobj,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01001312 tstate, f, PyTrace_CALL, Py_None)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001313 /* Profile function raised an error */
1314 goto exit_eval_frame;
1315 }
1316 }
1317 }
Neil Schemenauer6c0f2002001-09-04 19:03:35 +00001318
Łukasz Langaa785c872016-09-09 17:37:37 -07001319 if (PyDTrace_FUNCTION_ENTRY_ENABLED())
1320 dtrace_function_entry(f);
1321
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001322 co = f->f_code;
1323 names = co->co_names;
1324 consts = co->co_consts;
1325 fastlocals = f->f_localsplus;
1326 freevars = f->f_localsplus + co->co_nlocals;
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001327 assert(PyBytes_Check(co->co_code));
1328 assert(PyBytes_GET_SIZE(co->co_code) <= INT_MAX);
Serhiy Storchakaab874002016-09-11 13:48:15 +03001329 assert(PyBytes_GET_SIZE(co->co_code) % sizeof(_Py_CODEUNIT) == 0);
1330 assert(_Py_IS_ALIGNED(PyBytes_AS_STRING(co->co_code), sizeof(_Py_CODEUNIT)));
1331 first_instr = (_Py_CODEUNIT *) PyBytes_AS_STRING(co->co_code);
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001332 /*
1333 f->f_lasti refers to the index of the last instruction,
1334 unless it's -1 in which case next_instr should be first_instr.
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001335
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001336 YIELD_FROM sets f_lasti to itself, in order to repeatedly yield
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05001337 multiple values.
Thomas Wouters902d6eb2007-01-09 23:18:33 +00001338
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001339 When the PREDICT() macros are enabled, some opcode pairs follow in
1340 direct succession without updating f->f_lasti. A successful
1341 prediction effectively links the two codes together as if they
1342 were a single new opcode; accordingly,f->f_lasti will point to
1343 the first code in the pair (for instance, GET_ITER followed by
1344 FOR_ITER is effectively a single opcode and f->f_lasti will point
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001345 to the beginning of the combined pair.)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001346 */
Serhiy Storchakaab874002016-09-11 13:48:15 +03001347 assert(f->f_lasti >= -1);
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001348 next_instr = first_instr;
1349 if (f->f_lasti >= 0) {
Serhiy Storchakaab874002016-09-11 13:48:15 +03001350 assert(f->f_lasti % sizeof(_Py_CODEUNIT) == 0);
1351 next_instr += f->f_lasti / sizeof(_Py_CODEUNIT) + 1;
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001352 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001353 stack_pointer = f->f_stacktop;
1354 assert(stack_pointer != NULL);
1355 f->f_stacktop = NULL; /* remains NULL unless yield suspends frame */
Antoine Pitrou58720d62013-08-05 23:26:40 +02001356 f->f_executing = 1;
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001357
Inada Naoki91234a12019-06-03 21:30:58 +09001358 if (co->co_opcache_flag < OPCACHE_MIN_RUNS) {
1359 co->co_opcache_flag++;
1360 if (co->co_opcache_flag == OPCACHE_MIN_RUNS) {
1361 if (_PyCode_InitOpcache(co) < 0) {
Victor Stinner25104942020-04-24 02:43:18 +02001362 goto exit_eval_frame;
Inada Naoki91234a12019-06-03 21:30:58 +09001363 }
1364#if OPCACHE_STATS
1365 opcache_code_objects_extra_mem +=
1366 PyBytes_Size(co->co_code) / sizeof(_Py_CODEUNIT) +
1367 sizeof(_PyOpcache) * co->co_opcache_size;
1368 opcache_code_objects++;
1369#endif
1370 }
1371 }
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001372
Tim Peters5ca576e2001-06-18 22:08:13 +00001373#ifdef LLTRACE
Victor Stinner3c1e4812012-03-26 22:10:51 +02001374 lltrace = _PyDict_GetItemId(f->f_globals, &PyId___ltrace__) != NULL;
Tim Peters5ca576e2001-06-18 22:08:13 +00001375#endif
Guido van Rossumac7be682001-01-17 15:42:30 +00001376
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001377 if (throwflag) /* support for generator.throw() */
1378 goto error;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001379
Victor Stinnerace47d72013-07-18 01:41:08 +02001380#ifdef Py_DEBUG
Victor Stinner0b72b232020-03-12 23:18:39 +01001381 /* _PyEval_EvalFrameDefault() must not be called with an exception set,
Victor Stinnera8cb5152017-01-18 14:12:51 +01001382 because it can clear it (directly or indirectly) and so the
Martin Panter9955a372015-10-07 10:26:23 +00001383 caller loses its exception */
Victor Stinner438a12d2019-05-24 17:01:38 +02001384 assert(!_PyErr_Occurred(tstate));
Victor Stinnerace47d72013-07-18 01:41:08 +02001385#endif
1386
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001387main_loop:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001388 for (;;) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001389 assert(stack_pointer >= f->f_valuestack); /* else underflow */
1390 assert(STACK_LEVEL() <= co->co_stacksize); /* else overflow */
Victor Stinner438a12d2019-05-24 17:01:38 +02001391 assert(!_PyErr_Occurred(tstate));
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001392
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001393 /* Do periodic things. Doing this every time through
1394 the loop would add too much overhead, so we do it
1395 only every Nth instruction. We also do it if
Chris Jerdonek4a12d122020-05-14 19:25:45 -07001396 ``pending.calls_to_do'' is set, i.e. when an asynchronous
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001397 event needs attention (e.g. a signal handler or
1398 async I/O handler); see Py_AddPendingCall() and
1399 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +00001400
Eric Snow7bda9de2019-03-08 17:25:54 -07001401 if (_Py_atomic_load_relaxed(eval_breaker)) {
Serhiy Storchaka3f4d90d2018-07-09 15:40:14 +03001402 opcode = _Py_OPCODE(*next_instr);
1403 if (opcode == SETUP_FINALLY ||
1404 opcode == SETUP_WITH ||
1405 opcode == BEFORE_ASYNC_WITH ||
1406 opcode == YIELD_FROM) {
1407 /* Few cases where we skip running signal handlers and other
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07001408 pending calls:
Serhiy Storchaka3f4d90d2018-07-09 15:40:14 +03001409 - If we're about to enter the 'with:'. It will prevent
1410 emitting a resource warning in the common idiom
1411 'with open(path) as file:'.
1412 - If we're about to enter the 'async with:'.
1413 - If we're about to enter the 'try:' of a try/finally (not
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07001414 *very* useful, but might help in some cases and it's
1415 traditional)
1416 - If we're resuming a chain of nested 'yield from' or
1417 'await' calls, then each frame is parked with YIELD_FROM
1418 as its next opcode. If the user hit control-C we want to
1419 wait until we've reached the innermost frame before
1420 running the signal handler and raising KeyboardInterrupt
1421 (see bpo-30039).
1422 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001423 goto fast_next_opcode;
1424 }
Eric Snowfdf282d2019-01-11 14:26:55 -07001425
Victor Stinnerda2914d2020-03-20 09:29:08 +01001426 if (eval_frame_handle_pending(tstate) != 0) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001427 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001428 }
1429 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001430
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001431 fast_next_opcode:
1432 f->f_lasti = INSTR_OFFSET();
Guido van Rossumac7be682001-01-17 15:42:30 +00001433
Łukasz Langaa785c872016-09-09 17:37:37 -07001434 if (PyDTrace_LINE_ENABLED())
1435 maybe_dtrace_line(f, &instr_lb, &instr_ub, &instr_prev);
1436
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001437 /* line-by-line tracing support */
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001438
Victor Stinnerdab84232020-03-17 18:56:44 +01001439 if (_Py_TracingPossible(ceval2) &&
Benjamin Peterson51f46162013-01-23 08:38:47 -05001440 tstate->c_tracefunc != NULL && !tstate->tracing) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001441 int err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001442 /* see maybe_call_line_trace
1443 for expository comments */
1444 f->f_stacktop = stack_pointer;
Tim Peters8a5c3c72004-04-05 19:36:21 +00001445
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001446 err = maybe_call_line_trace(tstate->c_tracefunc,
1447 tstate->c_traceobj,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01001448 tstate, f,
1449 &instr_lb, &instr_ub, &instr_prev);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001450 /* Reload possibly changed frame fields */
1451 JUMPTO(f->f_lasti);
1452 if (f->f_stacktop != NULL) {
1453 stack_pointer = f->f_stacktop;
1454 f->f_stacktop = NULL;
1455 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001456 if (err)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001457 /* trace function raised an exception */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001458 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001459 }
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001460
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001461 /* Extract opcode and argument */
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001462
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001463 NEXTOPARG();
Stefan Krahb7e10102010-06-23 18:42:39 +00001464 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +00001465#ifdef DYNAMIC_EXECUTION_PROFILE
1466#ifdef DXPAIRS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001467 dxpairs[lastopcode][opcode]++;
1468 lastopcode = opcode;
Guido van Rossum950361c1997-01-24 13:49:28 +00001469#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001470 dxp[opcode]++;
Guido van Rossum950361c1997-01-24 13:49:28 +00001471#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001472
Guido van Rossum96a42c81992-01-12 02:29:51 +00001473#ifdef LLTRACE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001474 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +00001475
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001476 if (lltrace) {
1477 if (HAS_ARG(opcode)) {
1478 printf("%d: %d, %d\n",
1479 f->f_lasti, opcode, oparg);
1480 }
1481 else {
1482 printf("%d: %d\n",
1483 f->f_lasti, opcode);
1484 }
1485 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001486#endif
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001487
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001488 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +00001489
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001490 /* BEWARE!
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001491 It is essential that any operation that fails must goto error
1492 and that all operation that succeed call [FAST_]DISPATCH() ! */
Guido van Rossumac7be682001-01-17 15:42:30 +00001493
Benjamin Petersonddd19492018-09-16 22:38:02 -07001494 case TARGET(NOP): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001495 FAST_DISPATCH();
Benjamin Petersonddd19492018-09-16 22:38:02 -07001496 }
Raymond Hettinger9c18e812004-06-21 16:31:15 +00001497
Benjamin Petersonddd19492018-09-16 22:38:02 -07001498 case TARGET(LOAD_FAST): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001499 PyObject *value = GETLOCAL(oparg);
1500 if (value == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02001501 format_exc_check_arg(tstate, PyExc_UnboundLocalError,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001502 UNBOUNDLOCAL_ERROR_MSG,
1503 PyTuple_GetItem(co->co_varnames, oparg));
1504 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001505 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001506 Py_INCREF(value);
1507 PUSH(value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001508 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001509 }
1510
Benjamin Petersonddd19492018-09-16 22:38:02 -07001511 case TARGET(LOAD_CONST): {
1512 PREDICTED(LOAD_CONST);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001513 PyObject *value = GETITEM(consts, oparg);
1514 Py_INCREF(value);
1515 PUSH(value);
1516 FAST_DISPATCH();
1517 }
Neil Schemenauer63543862002-02-17 19:10:14 +00001518
Benjamin Petersonddd19492018-09-16 22:38:02 -07001519 case TARGET(STORE_FAST): {
1520 PREDICTED(STORE_FAST);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001521 PyObject *value = POP();
1522 SETLOCAL(oparg, value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001523 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001524 }
Neil Schemenauer63543862002-02-17 19:10:14 +00001525
Benjamin Petersonddd19492018-09-16 22:38:02 -07001526 case TARGET(POP_TOP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001527 PyObject *value = POP();
1528 Py_DECREF(value);
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_TWO): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001533 PyObject *top = TOP();
1534 PyObject *second = SECOND();
1535 SET_TOP(second);
1536 SET_SECOND(top);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001537 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001538 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001539
Benjamin Petersonddd19492018-09-16 22:38:02 -07001540 case TARGET(ROT_THREE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001541 PyObject *top = TOP();
1542 PyObject *second = SECOND();
1543 PyObject *third = THIRD();
1544 SET_TOP(second);
1545 SET_SECOND(third);
1546 SET_THIRD(top);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001547 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001548 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001549
Benjamin Petersonddd19492018-09-16 22:38:02 -07001550 case TARGET(ROT_FOUR): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001551 PyObject *top = TOP();
1552 PyObject *second = SECOND();
1553 PyObject *third = THIRD();
1554 PyObject *fourth = FOURTH();
1555 SET_TOP(second);
1556 SET_SECOND(third);
1557 SET_THIRD(fourth);
1558 SET_FOURTH(top);
1559 FAST_DISPATCH();
1560 }
1561
Benjamin Petersonddd19492018-09-16 22:38:02 -07001562 case TARGET(DUP_TOP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001563 PyObject *top = TOP();
1564 Py_INCREF(top);
1565 PUSH(top);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001566 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001567 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001568
Benjamin Petersonddd19492018-09-16 22:38:02 -07001569 case TARGET(DUP_TOP_TWO): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001570 PyObject *top = TOP();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001571 PyObject *second = SECOND();
Benjamin Petersonf208df32012-10-12 11:37:56 -04001572 Py_INCREF(top);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001573 Py_INCREF(second);
costypetrisor8ed317f2018-07-31 20:55:14 +00001574 STACK_GROW(2);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001575 SET_TOP(top);
1576 SET_SECOND(second);
Antoine Pitrou74a69fa2010-09-04 18:43:52 +00001577 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001578 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001579
Benjamin Petersonddd19492018-09-16 22:38:02 -07001580 case TARGET(UNARY_POSITIVE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001581 PyObject *value = TOP();
1582 PyObject *res = PyNumber_Positive(value);
1583 Py_DECREF(value);
1584 SET_TOP(res);
1585 if (res == NULL)
1586 goto error;
1587 DISPATCH();
1588 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001589
Benjamin Petersonddd19492018-09-16 22:38:02 -07001590 case TARGET(UNARY_NEGATIVE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001591 PyObject *value = TOP();
1592 PyObject *res = PyNumber_Negative(value);
1593 Py_DECREF(value);
1594 SET_TOP(res);
1595 if (res == NULL)
1596 goto error;
1597 DISPATCH();
1598 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001599
Benjamin Petersonddd19492018-09-16 22:38:02 -07001600 case TARGET(UNARY_NOT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001601 PyObject *value = TOP();
1602 int err = PyObject_IsTrue(value);
1603 Py_DECREF(value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001604 if (err == 0) {
1605 Py_INCREF(Py_True);
1606 SET_TOP(Py_True);
1607 DISPATCH();
1608 }
1609 else if (err > 0) {
1610 Py_INCREF(Py_False);
1611 SET_TOP(Py_False);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001612 DISPATCH();
1613 }
costypetrisor8ed317f2018-07-31 20:55:14 +00001614 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001615 goto error;
1616 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001617
Benjamin Petersonddd19492018-09-16 22:38:02 -07001618 case TARGET(UNARY_INVERT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001619 PyObject *value = TOP();
1620 PyObject *res = PyNumber_Invert(value);
1621 Py_DECREF(value);
1622 SET_TOP(res);
1623 if (res == NULL)
1624 goto error;
1625 DISPATCH();
1626 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001627
Benjamin Petersonddd19492018-09-16 22:38:02 -07001628 case TARGET(BINARY_POWER): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001629 PyObject *exp = POP();
1630 PyObject *base = TOP();
1631 PyObject *res = PyNumber_Power(base, exp, Py_None);
1632 Py_DECREF(base);
1633 Py_DECREF(exp);
1634 SET_TOP(res);
1635 if (res == NULL)
1636 goto error;
1637 DISPATCH();
1638 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001639
Benjamin Petersonddd19492018-09-16 22:38:02 -07001640 case TARGET(BINARY_MULTIPLY): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001641 PyObject *right = POP();
1642 PyObject *left = TOP();
1643 PyObject *res = PyNumber_Multiply(left, right);
1644 Py_DECREF(left);
1645 Py_DECREF(right);
1646 SET_TOP(res);
1647 if (res == NULL)
1648 goto error;
1649 DISPATCH();
1650 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001651
Benjamin Petersonddd19492018-09-16 22:38:02 -07001652 case TARGET(BINARY_MATRIX_MULTIPLY): {
Benjamin Petersond51374e2014-04-09 23:55:56 -04001653 PyObject *right = POP();
1654 PyObject *left = TOP();
1655 PyObject *res = PyNumber_MatrixMultiply(left, right);
1656 Py_DECREF(left);
1657 Py_DECREF(right);
1658 SET_TOP(res);
1659 if (res == NULL)
1660 goto error;
1661 DISPATCH();
1662 }
1663
Benjamin Petersonddd19492018-09-16 22:38:02 -07001664 case TARGET(BINARY_TRUE_DIVIDE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001665 PyObject *divisor = POP();
1666 PyObject *dividend = TOP();
1667 PyObject *quotient = PyNumber_TrueDivide(dividend, divisor);
1668 Py_DECREF(dividend);
1669 Py_DECREF(divisor);
1670 SET_TOP(quotient);
1671 if (quotient == NULL)
1672 goto error;
1673 DISPATCH();
1674 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001675
Benjamin Petersonddd19492018-09-16 22:38:02 -07001676 case TARGET(BINARY_FLOOR_DIVIDE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001677 PyObject *divisor = POP();
1678 PyObject *dividend = TOP();
1679 PyObject *quotient = PyNumber_FloorDivide(dividend, divisor);
1680 Py_DECREF(dividend);
1681 Py_DECREF(divisor);
1682 SET_TOP(quotient);
1683 if (quotient == NULL)
1684 goto error;
1685 DISPATCH();
1686 }
Guido van Rossum4668b002001-08-08 05:00:18 +00001687
Benjamin Petersonddd19492018-09-16 22:38:02 -07001688 case TARGET(BINARY_MODULO): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001689 PyObject *divisor = POP();
1690 PyObject *dividend = TOP();
Martijn Pietersd7e64332017-02-23 13:38:04 +00001691 PyObject *res;
1692 if (PyUnicode_CheckExact(dividend) && (
1693 !PyUnicode_Check(divisor) || PyUnicode_CheckExact(divisor))) {
1694 // fast path; string formatting, but not if the RHS is a str subclass
1695 // (see issue28598)
1696 res = PyUnicode_Format(dividend, divisor);
1697 } else {
1698 res = PyNumber_Remainder(dividend, divisor);
1699 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001700 Py_DECREF(divisor);
1701 Py_DECREF(dividend);
1702 SET_TOP(res);
1703 if (res == NULL)
1704 goto error;
1705 DISPATCH();
1706 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001707
Benjamin Petersonddd19492018-09-16 22:38:02 -07001708 case TARGET(BINARY_ADD): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001709 PyObject *right = POP();
1710 PyObject *left = TOP();
1711 PyObject *sum;
Victor Stinnerd65f42a2016-10-20 12:18:10 +02001712 /* NOTE(haypo): Please don't try to micro-optimize int+int on
1713 CPython using bytecode, it is simply worthless.
1714 See http://bugs.python.org/issue21955 and
1715 http://bugs.python.org/issue10044 for the discussion. In short,
1716 no patch shown any impact on a realistic benchmark, only a minor
1717 speedup on microbenchmarks. */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001718 if (PyUnicode_CheckExact(left) &&
1719 PyUnicode_CheckExact(right)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02001720 sum = unicode_concatenate(tstate, left, right, f, next_instr);
Martin Panter95f53c12016-07-18 08:23:26 +00001721 /* unicode_concatenate consumed the ref to left */
Victor Stinnerd2a915d2011-10-02 20:34:20 +02001722 }
1723 else {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001724 sum = PyNumber_Add(left, right);
1725 Py_DECREF(left);
Victor Stinnerd2a915d2011-10-02 20:34:20 +02001726 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001727 Py_DECREF(right);
1728 SET_TOP(sum);
1729 if (sum == NULL)
1730 goto error;
1731 DISPATCH();
1732 }
1733
Benjamin Petersonddd19492018-09-16 22:38:02 -07001734 case TARGET(BINARY_SUBTRACT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001735 PyObject *right = POP();
1736 PyObject *left = TOP();
1737 PyObject *diff = PyNumber_Subtract(left, right);
1738 Py_DECREF(right);
1739 Py_DECREF(left);
1740 SET_TOP(diff);
1741 if (diff == NULL)
1742 goto error;
1743 DISPATCH();
1744 }
1745
Benjamin Petersonddd19492018-09-16 22:38:02 -07001746 case TARGET(BINARY_SUBSCR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001747 PyObject *sub = POP();
1748 PyObject *container = TOP();
1749 PyObject *res = PyObject_GetItem(container, sub);
1750 Py_DECREF(container);
1751 Py_DECREF(sub);
1752 SET_TOP(res);
1753 if (res == NULL)
1754 goto error;
1755 DISPATCH();
1756 }
1757
Benjamin Petersonddd19492018-09-16 22:38:02 -07001758 case TARGET(BINARY_LSHIFT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001759 PyObject *right = POP();
1760 PyObject *left = TOP();
1761 PyObject *res = PyNumber_Lshift(left, right);
1762 Py_DECREF(left);
1763 Py_DECREF(right);
1764 SET_TOP(res);
1765 if (res == NULL)
1766 goto error;
1767 DISPATCH();
1768 }
1769
Benjamin Petersonddd19492018-09-16 22:38:02 -07001770 case TARGET(BINARY_RSHIFT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001771 PyObject *right = POP();
1772 PyObject *left = TOP();
1773 PyObject *res = PyNumber_Rshift(left, right);
1774 Py_DECREF(left);
1775 Py_DECREF(right);
1776 SET_TOP(res);
1777 if (res == NULL)
1778 goto error;
1779 DISPATCH();
1780 }
1781
Benjamin Petersonddd19492018-09-16 22:38:02 -07001782 case TARGET(BINARY_AND): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001783 PyObject *right = POP();
1784 PyObject *left = TOP();
1785 PyObject *res = PyNumber_And(left, right);
1786 Py_DECREF(left);
1787 Py_DECREF(right);
1788 SET_TOP(res);
1789 if (res == NULL)
1790 goto error;
1791 DISPATCH();
1792 }
1793
Benjamin Petersonddd19492018-09-16 22:38:02 -07001794 case TARGET(BINARY_XOR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001795 PyObject *right = POP();
1796 PyObject *left = TOP();
1797 PyObject *res = PyNumber_Xor(left, right);
1798 Py_DECREF(left);
1799 Py_DECREF(right);
1800 SET_TOP(res);
1801 if (res == NULL)
1802 goto error;
1803 DISPATCH();
1804 }
1805
Benjamin Petersonddd19492018-09-16 22:38:02 -07001806 case TARGET(BINARY_OR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001807 PyObject *right = POP();
1808 PyObject *left = TOP();
1809 PyObject *res = PyNumber_Or(left, right);
1810 Py_DECREF(left);
1811 Py_DECREF(right);
1812 SET_TOP(res);
1813 if (res == NULL)
1814 goto error;
1815 DISPATCH();
1816 }
1817
Benjamin Petersonddd19492018-09-16 22:38:02 -07001818 case TARGET(LIST_APPEND): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001819 PyObject *v = POP();
1820 PyObject *list = PEEK(oparg);
1821 int err;
1822 err = PyList_Append(list, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001823 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001824 if (err != 0)
1825 goto error;
1826 PREDICT(JUMP_ABSOLUTE);
1827 DISPATCH();
1828 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001829
Benjamin Petersonddd19492018-09-16 22:38:02 -07001830 case TARGET(SET_ADD): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001831 PyObject *v = POP();
Raymond Hettinger41862222016-10-15 19:03:06 -07001832 PyObject *set = PEEK(oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001833 int err;
1834 err = PySet_Add(set, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001835 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001836 if (err != 0)
1837 goto error;
1838 PREDICT(JUMP_ABSOLUTE);
1839 DISPATCH();
1840 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001841
Benjamin Petersonddd19492018-09-16 22:38:02 -07001842 case TARGET(INPLACE_POWER): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001843 PyObject *exp = POP();
1844 PyObject *base = TOP();
1845 PyObject *res = PyNumber_InPlacePower(base, exp, Py_None);
1846 Py_DECREF(base);
1847 Py_DECREF(exp);
1848 SET_TOP(res);
1849 if (res == NULL)
1850 goto error;
1851 DISPATCH();
1852 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001853
Benjamin Petersonddd19492018-09-16 22:38:02 -07001854 case TARGET(INPLACE_MULTIPLY): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001855 PyObject *right = POP();
1856 PyObject *left = TOP();
1857 PyObject *res = PyNumber_InPlaceMultiply(left, right);
1858 Py_DECREF(left);
1859 Py_DECREF(right);
1860 SET_TOP(res);
1861 if (res == NULL)
1862 goto error;
1863 DISPATCH();
1864 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001865
Benjamin Petersonddd19492018-09-16 22:38:02 -07001866 case TARGET(INPLACE_MATRIX_MULTIPLY): {
Benjamin Petersond51374e2014-04-09 23:55:56 -04001867 PyObject *right = POP();
1868 PyObject *left = TOP();
1869 PyObject *res = PyNumber_InPlaceMatrixMultiply(left, right);
1870 Py_DECREF(left);
1871 Py_DECREF(right);
1872 SET_TOP(res);
1873 if (res == NULL)
1874 goto error;
1875 DISPATCH();
1876 }
1877
Benjamin Petersonddd19492018-09-16 22:38:02 -07001878 case TARGET(INPLACE_TRUE_DIVIDE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001879 PyObject *divisor = POP();
1880 PyObject *dividend = TOP();
1881 PyObject *quotient = PyNumber_InPlaceTrueDivide(dividend, divisor);
1882 Py_DECREF(dividend);
1883 Py_DECREF(divisor);
1884 SET_TOP(quotient);
1885 if (quotient == NULL)
1886 goto error;
1887 DISPATCH();
1888 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001889
Benjamin Petersonddd19492018-09-16 22:38:02 -07001890 case TARGET(INPLACE_FLOOR_DIVIDE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001891 PyObject *divisor = POP();
1892 PyObject *dividend = TOP();
1893 PyObject *quotient = PyNumber_InPlaceFloorDivide(dividend, divisor);
1894 Py_DECREF(dividend);
1895 Py_DECREF(divisor);
1896 SET_TOP(quotient);
1897 if (quotient == NULL)
1898 goto error;
1899 DISPATCH();
1900 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001901
Benjamin Petersonddd19492018-09-16 22:38:02 -07001902 case TARGET(INPLACE_MODULO): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001903 PyObject *right = POP();
1904 PyObject *left = TOP();
1905 PyObject *mod = PyNumber_InPlaceRemainder(left, right);
1906 Py_DECREF(left);
1907 Py_DECREF(right);
1908 SET_TOP(mod);
1909 if (mod == NULL)
1910 goto error;
1911 DISPATCH();
1912 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001913
Benjamin Petersonddd19492018-09-16 22:38:02 -07001914 case TARGET(INPLACE_ADD): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001915 PyObject *right = POP();
1916 PyObject *left = TOP();
1917 PyObject *sum;
1918 if (PyUnicode_CheckExact(left) && PyUnicode_CheckExact(right)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02001919 sum = unicode_concatenate(tstate, left, right, f, next_instr);
Martin Panter95f53c12016-07-18 08:23:26 +00001920 /* unicode_concatenate consumed the ref to left */
Victor Stinnerd2a915d2011-10-02 20:34:20 +02001921 }
1922 else {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001923 sum = PyNumber_InPlaceAdd(left, right);
1924 Py_DECREF(left);
Victor Stinnerd2a915d2011-10-02 20:34:20 +02001925 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001926 Py_DECREF(right);
1927 SET_TOP(sum);
1928 if (sum == NULL)
1929 goto error;
1930 DISPATCH();
1931 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001932
Benjamin Petersonddd19492018-09-16 22:38:02 -07001933 case TARGET(INPLACE_SUBTRACT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001934 PyObject *right = POP();
1935 PyObject *left = TOP();
1936 PyObject *diff = PyNumber_InPlaceSubtract(left, right);
1937 Py_DECREF(left);
1938 Py_DECREF(right);
1939 SET_TOP(diff);
1940 if (diff == NULL)
1941 goto error;
1942 DISPATCH();
1943 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001944
Benjamin Petersonddd19492018-09-16 22:38:02 -07001945 case TARGET(INPLACE_LSHIFT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001946 PyObject *right = POP();
1947 PyObject *left = TOP();
1948 PyObject *res = PyNumber_InPlaceLshift(left, right);
1949 Py_DECREF(left);
1950 Py_DECREF(right);
1951 SET_TOP(res);
1952 if (res == NULL)
1953 goto error;
1954 DISPATCH();
1955 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001956
Benjamin Petersonddd19492018-09-16 22:38:02 -07001957 case TARGET(INPLACE_RSHIFT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001958 PyObject *right = POP();
1959 PyObject *left = TOP();
1960 PyObject *res = PyNumber_InPlaceRshift(left, right);
1961 Py_DECREF(left);
1962 Py_DECREF(right);
1963 SET_TOP(res);
1964 if (res == NULL)
1965 goto error;
1966 DISPATCH();
1967 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001968
Benjamin Petersonddd19492018-09-16 22:38:02 -07001969 case TARGET(INPLACE_AND): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001970 PyObject *right = POP();
1971 PyObject *left = TOP();
1972 PyObject *res = PyNumber_InPlaceAnd(left, right);
1973 Py_DECREF(left);
1974 Py_DECREF(right);
1975 SET_TOP(res);
1976 if (res == NULL)
1977 goto error;
1978 DISPATCH();
1979 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001980
Benjamin Petersonddd19492018-09-16 22:38:02 -07001981 case TARGET(INPLACE_XOR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001982 PyObject *right = POP();
1983 PyObject *left = TOP();
1984 PyObject *res = PyNumber_InPlaceXor(left, right);
1985 Py_DECREF(left);
1986 Py_DECREF(right);
1987 SET_TOP(res);
1988 if (res == NULL)
1989 goto error;
1990 DISPATCH();
1991 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001992
Benjamin Petersonddd19492018-09-16 22:38:02 -07001993 case TARGET(INPLACE_OR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001994 PyObject *right = POP();
1995 PyObject *left = TOP();
1996 PyObject *res = PyNumber_InPlaceOr(left, right);
1997 Py_DECREF(left);
1998 Py_DECREF(right);
1999 SET_TOP(res);
2000 if (res == NULL)
2001 goto error;
2002 DISPATCH();
2003 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002004
Benjamin Petersonddd19492018-09-16 22:38:02 -07002005 case TARGET(STORE_SUBSCR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002006 PyObject *sub = TOP();
2007 PyObject *container = SECOND();
2008 PyObject *v = THIRD();
2009 int err;
costypetrisor8ed317f2018-07-31 20:55:14 +00002010 STACK_SHRINK(3);
Martin Panter95f53c12016-07-18 08:23:26 +00002011 /* container[sub] = v */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002012 err = PyObject_SetItem(container, sub, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002013 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002014 Py_DECREF(container);
2015 Py_DECREF(sub);
2016 if (err != 0)
2017 goto error;
2018 DISPATCH();
2019 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002020
Benjamin Petersonddd19492018-09-16 22:38:02 -07002021 case TARGET(DELETE_SUBSCR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002022 PyObject *sub = TOP();
2023 PyObject *container = SECOND();
2024 int err;
costypetrisor8ed317f2018-07-31 20:55:14 +00002025 STACK_SHRINK(2);
Martin Panter95f53c12016-07-18 08:23:26 +00002026 /* del container[sub] */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002027 err = PyObject_DelItem(container, sub);
2028 Py_DECREF(container);
2029 Py_DECREF(sub);
2030 if (err != 0)
2031 goto error;
2032 DISPATCH();
2033 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00002034
Benjamin Petersonddd19492018-09-16 22:38:02 -07002035 case TARGET(PRINT_EXPR): {
Victor Stinnercab75e32013-11-06 22:38:37 +01002036 _Py_IDENTIFIER(displayhook);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002037 PyObject *value = POP();
Victor Stinnercab75e32013-11-06 22:38:37 +01002038 PyObject *hook = _PySys_GetObjectId(&PyId_displayhook);
Benjamin Petersonfe1bcb62012-10-12 11:40:01 -04002039 PyObject *res;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002040 if (hook == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002041 _PyErr_SetString(tstate, PyExc_RuntimeError,
2042 "lost sys.displayhook");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002043 Py_DECREF(value);
2044 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002045 }
Petr Viktorinffd97532020-02-11 17:46:57 +01002046 res = PyObject_CallOneArg(hook, value);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002047 Py_DECREF(value);
2048 if (res == NULL)
2049 goto error;
2050 Py_DECREF(res);
2051 DISPATCH();
2052 }
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00002053
Benjamin Petersonddd19492018-09-16 22:38:02 -07002054 case TARGET(RAISE_VARARGS): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002055 PyObject *cause = NULL, *exc = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002056 switch (oparg) {
2057 case 2:
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002058 cause = POP(); /* cause */
Stefan Krahf432a322017-08-21 13:09:59 +02002059 /* fall through */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002060 case 1:
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002061 exc = POP(); /* exc */
Stefan Krahf432a322017-08-21 13:09:59 +02002062 /* fall through */
2063 case 0:
Victor Stinner09532fe2019-05-10 23:39:09 +02002064 if (do_raise(tstate, exc, cause)) {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002065 goto exception_unwind;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002066 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002067 break;
2068 default:
Victor Stinner438a12d2019-05-24 17:01:38 +02002069 _PyErr_SetString(tstate, PyExc_SystemError,
2070 "bad RAISE_VARARGS oparg");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002071 break;
2072 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002073 goto error;
2074 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002075
Benjamin Petersonddd19492018-09-16 22:38:02 -07002076 case TARGET(RETURN_VALUE): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002077 retval = POP();
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002078 assert(f->f_iblock == 0);
Mark Shannone7c9f4a2020-01-13 12:51:26 +00002079 assert(EMPTY());
2080 goto exiting;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002081 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002082
Benjamin Petersonddd19492018-09-16 22:38:02 -07002083 case TARGET(GET_AITER): {
Yury Selivanov6ef05902015-05-28 11:21:31 -04002084 unaryfunc getter = NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04002085 PyObject *iter = NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04002086 PyObject *obj = TOP();
2087 PyTypeObject *type = Py_TYPE(obj);
2088
Yury Selivanova6f6edb2016-06-09 15:08:31 -04002089 if (type->tp_as_async != NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04002090 getter = type->tp_as_async->am_aiter;
Yury Selivanova6f6edb2016-06-09 15:08:31 -04002091 }
Yury Selivanov75445082015-05-11 22:57:16 -04002092
2093 if (getter != NULL) {
2094 iter = (*getter)(obj);
2095 Py_DECREF(obj);
2096 if (iter == NULL) {
2097 SET_TOP(NULL);
2098 goto error;
2099 }
2100 }
2101 else {
2102 SET_TOP(NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02002103 _PyErr_Format(tstate, PyExc_TypeError,
2104 "'async for' requires an object with "
2105 "__aiter__ method, got %.100s",
2106 type->tp_name);
Yury Selivanov75445082015-05-11 22:57:16 -04002107 Py_DECREF(obj);
2108 goto error;
2109 }
2110
Yury Selivanovfaa135a2017-10-06 02:08:57 -04002111 if (Py_TYPE(iter)->tp_as_async == NULL ||
2112 Py_TYPE(iter)->tp_as_async->am_anext == NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04002113
Yury Selivanov398ff912017-03-02 22:20:00 -05002114 SET_TOP(NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02002115 _PyErr_Format(tstate, PyExc_TypeError,
2116 "'async for' received an object from __aiter__ "
2117 "that does not implement __anext__: %.100s",
2118 Py_TYPE(iter)->tp_name);
Yury Selivanov75445082015-05-11 22:57:16 -04002119 Py_DECREF(iter);
2120 goto error;
Yury Selivanova6f6edb2016-06-09 15:08:31 -04002121 }
2122
Yury Selivanovfaa135a2017-10-06 02:08:57 -04002123 SET_TOP(iter);
Yury Selivanov75445082015-05-11 22:57:16 -04002124 DISPATCH();
2125 }
2126
Benjamin Petersonddd19492018-09-16 22:38:02 -07002127 case TARGET(GET_ANEXT): {
Yury Selivanov6ef05902015-05-28 11:21:31 -04002128 unaryfunc getter = NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04002129 PyObject *next_iter = NULL;
2130 PyObject *awaitable = NULL;
2131 PyObject *aiter = TOP();
2132 PyTypeObject *type = Py_TYPE(aiter);
2133
Yury Selivanoveb636452016-09-08 22:01:51 -07002134 if (PyAsyncGen_CheckExact(aiter)) {
2135 awaitable = type->tp_as_async->am_anext(aiter);
2136 if (awaitable == NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04002137 goto error;
2138 }
Yury Selivanoveb636452016-09-08 22:01:51 -07002139 } else {
2140 if (type->tp_as_async != NULL){
2141 getter = type->tp_as_async->am_anext;
2142 }
Yury Selivanov75445082015-05-11 22:57:16 -04002143
Yury Selivanoveb636452016-09-08 22:01:51 -07002144 if (getter != NULL) {
2145 next_iter = (*getter)(aiter);
2146 if (next_iter == NULL) {
2147 goto error;
2148 }
2149 }
2150 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02002151 _PyErr_Format(tstate, PyExc_TypeError,
2152 "'async for' requires an iterator with "
2153 "__anext__ method, got %.100s",
2154 type->tp_name);
Yury Selivanoveb636452016-09-08 22:01:51 -07002155 goto error;
2156 }
Yury Selivanov75445082015-05-11 22:57:16 -04002157
Yury Selivanoveb636452016-09-08 22:01:51 -07002158 awaitable = _PyCoro_GetAwaitableIter(next_iter);
2159 if (awaitable == NULL) {
Yury Selivanov398ff912017-03-02 22:20:00 -05002160 _PyErr_FormatFromCause(
Yury Selivanoveb636452016-09-08 22:01:51 -07002161 PyExc_TypeError,
2162 "'async for' received an invalid object "
2163 "from __anext__: %.100s",
2164 Py_TYPE(next_iter)->tp_name);
2165
2166 Py_DECREF(next_iter);
2167 goto error;
2168 } else {
2169 Py_DECREF(next_iter);
2170 }
2171 }
Yury Selivanov75445082015-05-11 22:57:16 -04002172
2173 PUSH(awaitable);
Serhiy Storchakada9c5132016-06-27 18:58:57 +03002174 PREDICT(LOAD_CONST);
Yury Selivanov75445082015-05-11 22:57:16 -04002175 DISPATCH();
2176 }
2177
Benjamin Petersonddd19492018-09-16 22:38:02 -07002178 case TARGET(GET_AWAITABLE): {
2179 PREDICTED(GET_AWAITABLE);
Yury Selivanov75445082015-05-11 22:57:16 -04002180 PyObject *iterable = TOP();
Yury Selivanov5376ba92015-06-22 12:19:30 -04002181 PyObject *iter = _PyCoro_GetAwaitableIter(iterable);
Yury Selivanov75445082015-05-11 22:57:16 -04002182
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03002183 if (iter == NULL) {
Mark Shannonfee55262019-11-21 09:11:43 +00002184 int opcode_at_minus_3 = 0;
2185 if ((next_instr - first_instr) > 2) {
2186 opcode_at_minus_3 = _Py_OPCODE(next_instr[-3]);
2187 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002188 format_awaitable_error(tstate, Py_TYPE(iterable),
Mark Shannonfee55262019-11-21 09:11:43 +00002189 opcode_at_minus_3,
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03002190 _Py_OPCODE(next_instr[-2]));
2191 }
2192
Yury Selivanov75445082015-05-11 22:57:16 -04002193 Py_DECREF(iterable);
2194
Yury Selivanovc724bae2016-03-02 11:30:46 -05002195 if (iter != NULL && PyCoro_CheckExact(iter)) {
2196 PyObject *yf = _PyGen_yf((PyGenObject*)iter);
2197 if (yf != NULL) {
2198 /* `iter` is a coroutine object that is being
2199 awaited, `yf` is a pointer to the current awaitable
2200 being awaited on. */
2201 Py_DECREF(yf);
2202 Py_CLEAR(iter);
Victor Stinner438a12d2019-05-24 17:01:38 +02002203 _PyErr_SetString(tstate, PyExc_RuntimeError,
2204 "coroutine is being awaited already");
Yury Selivanovc724bae2016-03-02 11:30:46 -05002205 /* The code below jumps to `error` if `iter` is NULL. */
2206 }
2207 }
2208
Yury Selivanov75445082015-05-11 22:57:16 -04002209 SET_TOP(iter); /* Even if it's NULL */
2210
2211 if (iter == NULL) {
2212 goto error;
2213 }
2214
Serhiy Storchakada9c5132016-06-27 18:58:57 +03002215 PREDICT(LOAD_CONST);
Yury Selivanov75445082015-05-11 22:57:16 -04002216 DISPATCH();
2217 }
2218
Benjamin Petersonddd19492018-09-16 22:38:02 -07002219 case TARGET(YIELD_FROM): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002220 PyObject *v = POP();
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07002221 PyObject *receiver = TOP();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002222 int err;
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07002223 if (PyGen_CheckExact(receiver) || PyCoro_CheckExact(receiver)) {
2224 retval = _PyGen_Send((PyGenObject *)receiver, v);
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05002225 } else {
Benjamin Peterson302e7902012-03-20 23:17:04 -04002226 _Py_IDENTIFIER(send);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002227 if (v == Py_None)
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07002228 retval = Py_TYPE(receiver)->tp_iternext(receiver);
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05002229 else
Jeroen Demeyer59ad1102019-07-11 10:59:05 +02002230 retval = _PyObject_CallMethodIdOneArg(receiver, &PyId_send, v);
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05002231 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002232 Py_DECREF(v);
2233 if (retval == NULL) {
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05002234 PyObject *val;
Guido van Rossum8820c232013-11-21 11:30:06 -08002235 if (tstate->c_tracefunc != NULL
Victor Stinner438a12d2019-05-24 17:01:38 +02002236 && _PyErr_ExceptionMatches(tstate, PyExc_StopIteration))
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01002237 call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj, tstate, f);
Nick Coghlanc40bc092012-06-17 15:15:49 +10002238 err = _PyGen_FetchStopIterationValue(&val);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002239 if (err < 0)
2240 goto error;
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07002241 Py_DECREF(receiver);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002242 SET_TOP(val);
2243 DISPATCH();
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002244 }
Martin Panter95f53c12016-07-18 08:23:26 +00002245 /* receiver remains on stack, retval is value to be yielded */
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002246 f->f_stacktop = stack_pointer;
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05002247 /* and repeat... */
Victor Stinnerf7d199f2016-11-24 22:33:01 +01002248 assert(f->f_lasti >= (int)sizeof(_Py_CODEUNIT));
Serhiy Storchakaab874002016-09-11 13:48:15 +03002249 f->f_lasti -= sizeof(_Py_CODEUNIT);
Mark Shannone7c9f4a2020-01-13 12:51:26 +00002250 goto exiting;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002251 }
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002252
Benjamin Petersonddd19492018-09-16 22:38:02 -07002253 case TARGET(YIELD_VALUE): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002254 retval = POP();
Yury Selivanoveb636452016-09-08 22:01:51 -07002255
2256 if (co->co_flags & CO_ASYNC_GENERATOR) {
2257 PyObject *w = _PyAsyncGenValueWrapperNew(retval);
2258 Py_DECREF(retval);
2259 if (w == NULL) {
2260 retval = NULL;
2261 goto error;
2262 }
2263 retval = w;
2264 }
2265
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002266 f->f_stacktop = stack_pointer;
Mark Shannone7c9f4a2020-01-13 12:51:26 +00002267 goto exiting;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002268 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002269
Benjamin Petersonddd19492018-09-16 22:38:02 -07002270 case TARGET(POP_EXCEPT): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002271 PyObject *type, *value, *traceback;
2272 _PyErr_StackItem *exc_info;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002273 PyTryBlock *b = PyFrame_BlockPop(f);
2274 if (b->b_type != EXCEPT_HANDLER) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002275 _PyErr_SetString(tstate, PyExc_SystemError,
2276 "popped block is not an except handler");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002277 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002278 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002279 assert(STACK_LEVEL() >= (b)->b_level + 3 &&
2280 STACK_LEVEL() <= (b)->b_level + 4);
2281 exc_info = tstate->exc_info;
2282 type = exc_info->exc_type;
2283 value = exc_info->exc_value;
2284 traceback = exc_info->exc_traceback;
2285 exc_info->exc_type = POP();
2286 exc_info->exc_value = POP();
2287 exc_info->exc_traceback = POP();
2288 Py_XDECREF(type);
2289 Py_XDECREF(value);
2290 Py_XDECREF(traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002291 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002292 }
Benjamin Petersoneec3d712008-06-11 15:59:43 +00002293
Benjamin Petersonddd19492018-09-16 22:38:02 -07002294 case TARGET(POP_BLOCK): {
2295 PREDICTED(POP_BLOCK);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002296 PyFrame_BlockPop(f);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002297 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002298 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002299
Mark Shannonfee55262019-11-21 09:11:43 +00002300 case TARGET(RERAISE): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002301 PyObject *exc = POP();
Mark Shannonfee55262019-11-21 09:11:43 +00002302 PyObject *val = POP();
2303 PyObject *tb = POP();
2304 assert(PyExceptionClass_Check(exc));
Victor Stinner61f4db82020-01-28 03:37:45 +01002305 _PyErr_Restore(tstate, exc, val, tb);
Mark Shannonfee55262019-11-21 09:11:43 +00002306 goto exception_unwind;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002307 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002308
Benjamin Petersonddd19492018-09-16 22:38:02 -07002309 case TARGET(END_ASYNC_FOR): {
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002310 PyObject *exc = POP();
2311 assert(PyExceptionClass_Check(exc));
2312 if (PyErr_GivenExceptionMatches(exc, PyExc_StopAsyncIteration)) {
2313 PyTryBlock *b = PyFrame_BlockPop(f);
2314 assert(b->b_type == EXCEPT_HANDLER);
2315 Py_DECREF(exc);
2316 UNWIND_EXCEPT_HANDLER(b);
2317 Py_DECREF(POP());
2318 JUMPBY(oparg);
2319 FAST_DISPATCH();
2320 }
2321 else {
2322 PyObject *val = POP();
2323 PyObject *tb = POP();
Victor Stinner438a12d2019-05-24 17:01:38 +02002324 _PyErr_Restore(tstate, exc, val, tb);
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002325 goto exception_unwind;
2326 }
2327 }
2328
Zackery Spytzce6a0702019-08-25 03:44:09 -06002329 case TARGET(LOAD_ASSERTION_ERROR): {
2330 PyObject *value = PyExc_AssertionError;
2331 Py_INCREF(value);
2332 PUSH(value);
2333 FAST_DISPATCH();
2334 }
2335
Benjamin Petersonddd19492018-09-16 22:38:02 -07002336 case TARGET(LOAD_BUILD_CLASS): {
Victor Stinner3c1e4812012-03-26 22:10:51 +02002337 _Py_IDENTIFIER(__build_class__);
Victor Stinnerb0b22422012-04-19 00:57:45 +02002338
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002339 PyObject *bc;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002340 if (PyDict_CheckExact(f->f_builtins)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002341 bc = _PyDict_GetItemIdWithError(f->f_builtins, &PyId___build_class__);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002342 if (bc == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002343 if (!_PyErr_Occurred(tstate)) {
2344 _PyErr_SetString(tstate, PyExc_NameError,
2345 "__build_class__ not found");
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002346 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002347 goto error;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002348 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002349 Py_INCREF(bc);
Victor Stinnerb0b22422012-04-19 00:57:45 +02002350 }
2351 else {
2352 PyObject *build_class_str = _PyUnicode_FromId(&PyId___build_class__);
2353 if (build_class_str == NULL)
Serhiy Storchaka70b72f02016-11-08 23:12:46 +02002354 goto error;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002355 bc = PyObject_GetItem(f->f_builtins, build_class_str);
2356 if (bc == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002357 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError))
2358 _PyErr_SetString(tstate, PyExc_NameError,
2359 "__build_class__ not found");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002360 goto error;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002361 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002362 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002363 PUSH(bc);
Benjamin Peterson00f86f22012-10-10 14:10:33 -04002364 DISPATCH();
Victor Stinner3c1e4812012-03-26 22:10:51 +02002365 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002366
Benjamin Petersonddd19492018-09-16 22:38:02 -07002367 case TARGET(STORE_NAME): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002368 PyObject *name = GETITEM(names, oparg);
2369 PyObject *v = POP();
2370 PyObject *ns = f->f_locals;
2371 int err;
2372 if (ns == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002373 _PyErr_Format(tstate, PyExc_SystemError,
2374 "no locals found when storing %R", name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002375 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002376 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002377 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002378 if (PyDict_CheckExact(ns))
2379 err = PyDict_SetItem(ns, name, v);
2380 else
2381 err = PyObject_SetItem(ns, name, v);
2382 Py_DECREF(v);
2383 if (err != 0)
2384 goto error;
2385 DISPATCH();
2386 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002387
Benjamin Petersonddd19492018-09-16 22:38:02 -07002388 case TARGET(DELETE_NAME): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002389 PyObject *name = GETITEM(names, oparg);
2390 PyObject *ns = f->f_locals;
2391 int err;
2392 if (ns == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002393 _PyErr_Format(tstate, PyExc_SystemError,
2394 "no locals when deleting %R", name);
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 err = PyObject_DelItem(ns, name);
2398 if (err != 0) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002399 format_exc_check_arg(tstate, PyExc_NameError,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002400 NAME_ERROR_MSG,
2401 name);
2402 goto error;
2403 }
2404 DISPATCH();
2405 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00002406
Benjamin Petersonddd19492018-09-16 22:38:02 -07002407 case TARGET(UNPACK_SEQUENCE): {
2408 PREDICTED(UNPACK_SEQUENCE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002409 PyObject *seq = POP(), *item, **items;
2410 if (PyTuple_CheckExact(seq) &&
2411 PyTuple_GET_SIZE(seq) == oparg) {
2412 items = ((PyTupleObject *)seq)->ob_item;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002413 while (oparg--) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002414 item = items[oparg];
2415 Py_INCREF(item);
2416 PUSH(item);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002417 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002418 } else if (PyList_CheckExact(seq) &&
2419 PyList_GET_SIZE(seq) == oparg) {
2420 items = ((PyListObject *)seq)->ob_item;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002421 while (oparg--) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002422 item = items[oparg];
2423 Py_INCREF(item);
2424 PUSH(item);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002425 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002426 } else if (unpack_iterable(tstate, seq, oparg, -1,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002427 stack_pointer + oparg)) {
costypetrisor8ed317f2018-07-31 20:55:14 +00002428 STACK_GROW(oparg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002429 } else {
2430 /* unpack_iterable() raised an exception */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002431 Py_DECREF(seq);
2432 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002433 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002434 Py_DECREF(seq);
Benjamin Peterson00f86f22012-10-10 14:10:33 -04002435 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002436 }
Guido van Rossum0368b722007-05-11 16:50:42 +00002437
Benjamin Petersonddd19492018-09-16 22:38:02 -07002438 case TARGET(UNPACK_EX): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002439 int totalargs = 1 + (oparg & 0xFF) + (oparg >> 8);
2440 PyObject *seq = POP();
2441
Victor Stinner438a12d2019-05-24 17:01:38 +02002442 if (unpack_iterable(tstate, seq, oparg & 0xFF, oparg >> 8,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002443 stack_pointer + totalargs)) {
2444 stack_pointer += totalargs;
2445 } else {
2446 Py_DECREF(seq);
2447 goto error;
2448 }
2449 Py_DECREF(seq);
2450 DISPATCH();
2451 }
2452
Benjamin Petersonddd19492018-09-16 22:38:02 -07002453 case TARGET(STORE_ATTR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002454 PyObject *name = GETITEM(names, oparg);
2455 PyObject *owner = TOP();
2456 PyObject *v = SECOND();
2457 int err;
costypetrisor8ed317f2018-07-31 20:55:14 +00002458 STACK_SHRINK(2);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002459 err = PyObject_SetAttr(owner, name, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002460 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002461 Py_DECREF(owner);
2462 if (err != 0)
2463 goto error;
2464 DISPATCH();
2465 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002466
Benjamin Petersonddd19492018-09-16 22:38:02 -07002467 case TARGET(DELETE_ATTR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002468 PyObject *name = GETITEM(names, oparg);
2469 PyObject *owner = POP();
2470 int err;
2471 err = PyObject_SetAttr(owner, name, (PyObject *)NULL);
2472 Py_DECREF(owner);
2473 if (err != 0)
2474 goto error;
2475 DISPATCH();
2476 }
2477
Benjamin Petersonddd19492018-09-16 22:38:02 -07002478 case TARGET(STORE_GLOBAL): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002479 PyObject *name = GETITEM(names, oparg);
2480 PyObject *v = POP();
2481 int err;
2482 err = PyDict_SetItem(f->f_globals, name, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002483 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002484 if (err != 0)
2485 goto error;
2486 DISPATCH();
2487 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002488
Benjamin Petersonddd19492018-09-16 22:38:02 -07002489 case TARGET(DELETE_GLOBAL): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002490 PyObject *name = GETITEM(names, oparg);
2491 int err;
2492 err = PyDict_DelItem(f->f_globals, name);
2493 if (err != 0) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002494 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
2495 format_exc_check_arg(tstate, PyExc_NameError,
2496 NAME_ERROR_MSG, name);
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002497 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002498 goto error;
Benjamin Peterson00f86f22012-10-10 14:10:33 -04002499 }
2500 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002501 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002502
Benjamin Petersonddd19492018-09-16 22:38:02 -07002503 case TARGET(LOAD_NAME): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002504 PyObject *name = GETITEM(names, oparg);
2505 PyObject *locals = f->f_locals;
2506 PyObject *v;
2507 if (locals == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002508 _PyErr_Format(tstate, PyExc_SystemError,
2509 "no locals when loading %R", name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002510 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002511 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002512 if (PyDict_CheckExact(locals)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002513 v = PyDict_GetItemWithError(locals, name);
2514 if (v != NULL) {
2515 Py_INCREF(v);
2516 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002517 else if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002518 goto error;
2519 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002520 }
2521 else {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002522 v = PyObject_GetItem(locals, name);
Victor Stinnere20310f2015-11-05 13:56:58 +01002523 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002524 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError))
Benjamin Peterson92722792012-12-15 12:51:05 -05002525 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02002526 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002527 }
2528 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002529 if (v == NULL) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002530 v = PyDict_GetItemWithError(f->f_globals, name);
2531 if (v != NULL) {
2532 Py_INCREF(v);
2533 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002534 else if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002535 goto error;
2536 }
2537 else {
Victor Stinnerb0b22422012-04-19 00:57:45 +02002538 if (PyDict_CheckExact(f->f_builtins)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002539 v = PyDict_GetItemWithError(f->f_builtins, name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002540 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002541 if (!_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002542 format_exc_check_arg(
Victor Stinner438a12d2019-05-24 17:01:38 +02002543 tstate, PyExc_NameError,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002544 NAME_ERROR_MSG, name);
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002545 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002546 goto error;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002547 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002548 Py_INCREF(v);
Victor Stinnerb0b22422012-04-19 00:57:45 +02002549 }
2550 else {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002551 v = PyObject_GetItem(f->f_builtins, name);
2552 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002553 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Victor Stinnerb0b22422012-04-19 00:57:45 +02002554 format_exc_check_arg(
Victor Stinner438a12d2019-05-24 17:01:38 +02002555 tstate, PyExc_NameError,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002556 NAME_ERROR_MSG, name);
Victor Stinner438a12d2019-05-24 17:01:38 +02002557 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002558 goto error;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002559 }
Benjamin Peterson20f9c3c2010-07-20 22:39:34 +00002560 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002561 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002562 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002563 PUSH(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002564 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002565 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002566
Benjamin Petersonddd19492018-09-16 22:38:02 -07002567 case TARGET(LOAD_GLOBAL): {
Inada Naoki91234a12019-06-03 21:30:58 +09002568 PyObject *name;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002569 PyObject *v;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002570 if (PyDict_CheckExact(f->f_globals)
Victor Stinnerb4efc962015-11-20 09:24:02 +01002571 && PyDict_CheckExact(f->f_builtins))
2572 {
Inada Naoki91234a12019-06-03 21:30:58 +09002573 OPCACHE_CHECK();
2574 if (co_opcache != NULL && co_opcache->optimized > 0) {
2575 _PyOpcache_LoadGlobal *lg = &co_opcache->u.lg;
2576
2577 if (lg->globals_ver ==
2578 ((PyDictObject *)f->f_globals)->ma_version_tag
2579 && lg->builtins_ver ==
2580 ((PyDictObject *)f->f_builtins)->ma_version_tag)
2581 {
2582 PyObject *ptr = lg->ptr;
2583 OPCACHE_STAT_GLOBAL_HIT();
2584 assert(ptr != NULL);
2585 Py_INCREF(ptr);
2586 PUSH(ptr);
2587 DISPATCH();
2588 }
2589 }
2590
2591 name = GETITEM(names, oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002592 v = _PyDict_LoadGlobal((PyDictObject *)f->f_globals,
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002593 (PyDictObject *)f->f_builtins,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002594 name);
2595 if (v == NULL) {
Victor Stinnerb4efc962015-11-20 09:24:02 +01002596 if (!_PyErr_OCCURRED()) {
2597 /* _PyDict_LoadGlobal() returns NULL without raising
2598 * an exception if the key doesn't exist */
Victor Stinner438a12d2019-05-24 17:01:38 +02002599 format_exc_check_arg(tstate, PyExc_NameError,
Ezio Melotti04a29552013-03-03 15:12:44 +02002600 NAME_ERROR_MSG, name);
Victor Stinnerb4efc962015-11-20 09:24:02 +01002601 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002602 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002603 }
Inada Naoki91234a12019-06-03 21:30:58 +09002604
2605 if (co_opcache != NULL) {
2606 _PyOpcache_LoadGlobal *lg = &co_opcache->u.lg;
2607
2608 if (co_opcache->optimized == 0) {
2609 /* Wasn't optimized before. */
2610 OPCACHE_STAT_GLOBAL_OPT();
2611 } else {
2612 OPCACHE_STAT_GLOBAL_MISS();
2613 }
2614
2615 co_opcache->optimized = 1;
2616 lg->globals_ver =
2617 ((PyDictObject *)f->f_globals)->ma_version_tag;
2618 lg->builtins_ver =
2619 ((PyDictObject *)f->f_builtins)->ma_version_tag;
2620 lg->ptr = v; /* borrowed */
2621 }
2622
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002623 Py_INCREF(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002624 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002625 else {
2626 /* Slow-path if globals or builtins is not a dict */
Victor Stinnerb4efc962015-11-20 09:24:02 +01002627
2628 /* namespace 1: globals */
Inada Naoki91234a12019-06-03 21:30:58 +09002629 name = GETITEM(names, oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002630 v = PyObject_GetItem(f->f_globals, name);
2631 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002632 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Victor Stinner60a1d3c2015-11-05 13:55:20 +01002633 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02002634 }
2635 _PyErr_Clear(tstate);
Victor Stinner60a1d3c2015-11-05 13:55:20 +01002636
Victor Stinnerb4efc962015-11-20 09:24:02 +01002637 /* namespace 2: builtins */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002638 v = PyObject_GetItem(f->f_builtins, name);
2639 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002640 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002641 format_exc_check_arg(
Victor Stinner438a12d2019-05-24 17:01:38 +02002642 tstate, PyExc_NameError,
Ezio Melotti04a29552013-03-03 15:12:44 +02002643 NAME_ERROR_MSG, name);
Victor Stinner438a12d2019-05-24 17:01:38 +02002644 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002645 goto error;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002646 }
2647 }
2648 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002649 PUSH(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002650 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002651 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002652
Benjamin Petersonddd19492018-09-16 22:38:02 -07002653 case TARGET(DELETE_FAST): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002654 PyObject *v = GETLOCAL(oparg);
2655 if (v != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002656 SETLOCAL(oparg, NULL);
2657 DISPATCH();
2658 }
2659 format_exc_check_arg(
Victor Stinner438a12d2019-05-24 17:01:38 +02002660 tstate, PyExc_UnboundLocalError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002661 UNBOUNDLOCAL_ERROR_MSG,
2662 PyTuple_GetItem(co->co_varnames, oparg)
2663 );
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002664 goto error;
2665 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002666
Benjamin Petersonddd19492018-09-16 22:38:02 -07002667 case TARGET(DELETE_DEREF): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002668 PyObject *cell = freevars[oparg];
Raymond Hettingerc32f9db2016-11-12 04:10:35 -05002669 PyObject *oldobj = PyCell_GET(cell);
2670 if (oldobj != NULL) {
2671 PyCell_SET(cell, NULL);
2672 Py_DECREF(oldobj);
Benjamin Peterson00ebe2c2010-09-10 22:02:31 +00002673 DISPATCH();
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00002674 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002675 format_exc_unbound(tstate, co, oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002676 goto error;
2677 }
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00002678
Benjamin Petersonddd19492018-09-16 22:38:02 -07002679 case TARGET(LOAD_CLOSURE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002680 PyObject *cell = freevars[oparg];
2681 Py_INCREF(cell);
2682 PUSH(cell);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002683 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002684 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002685
Benjamin Petersonddd19492018-09-16 22:38:02 -07002686 case TARGET(LOAD_CLASSDEREF): {
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002687 PyObject *name, *value, *locals = f->f_locals;
Victor Stinnerd3dfd0e2013-05-16 23:48:01 +02002688 Py_ssize_t idx;
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002689 assert(locals);
2690 assert(oparg >= PyTuple_GET_SIZE(co->co_cellvars));
2691 idx = oparg - PyTuple_GET_SIZE(co->co_cellvars);
2692 assert(idx >= 0 && idx < PyTuple_GET_SIZE(co->co_freevars));
2693 name = PyTuple_GET_ITEM(co->co_freevars, idx);
2694 if (PyDict_CheckExact(locals)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002695 value = PyDict_GetItemWithError(locals, name);
2696 if (value != NULL) {
2697 Py_INCREF(value);
2698 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002699 else if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002700 goto error;
2701 }
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002702 }
2703 else {
2704 value = PyObject_GetItem(locals, name);
Victor Stinnere20310f2015-11-05 13:56:58 +01002705 if (value == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002706 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002707 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02002708 }
2709 _PyErr_Clear(tstate);
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002710 }
2711 }
2712 if (!value) {
2713 PyObject *cell = freevars[oparg];
2714 value = PyCell_GET(cell);
2715 if (value == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002716 format_exc_unbound(tstate, co, oparg);
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002717 goto error;
2718 }
2719 Py_INCREF(value);
2720 }
2721 PUSH(value);
2722 DISPATCH();
2723 }
2724
Benjamin Petersonddd19492018-09-16 22:38:02 -07002725 case TARGET(LOAD_DEREF): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002726 PyObject *cell = freevars[oparg];
2727 PyObject *value = PyCell_GET(cell);
2728 if (value == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002729 format_exc_unbound(tstate, co, oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002730 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002731 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002732 Py_INCREF(value);
2733 PUSH(value);
2734 DISPATCH();
2735 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002736
Benjamin Petersonddd19492018-09-16 22:38:02 -07002737 case TARGET(STORE_DEREF): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002738 PyObject *v = POP();
2739 PyObject *cell = freevars[oparg];
Raymond Hettingerb2b15432016-11-11 04:32:11 -08002740 PyObject *oldobj = PyCell_GET(cell);
2741 PyCell_SET(cell, v);
2742 Py_XDECREF(oldobj);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002743 DISPATCH();
2744 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002745
Benjamin Petersonddd19492018-09-16 22:38:02 -07002746 case TARGET(BUILD_STRING): {
Serhiy Storchakaea525a22016-09-06 22:07:53 +03002747 PyObject *str;
2748 PyObject *empty = PyUnicode_New(0, 0);
2749 if (empty == NULL) {
2750 goto error;
2751 }
2752 str = _PyUnicode_JoinArray(empty, stack_pointer - oparg, oparg);
2753 Py_DECREF(empty);
2754 if (str == NULL)
2755 goto error;
2756 while (--oparg >= 0) {
2757 PyObject *item = POP();
2758 Py_DECREF(item);
2759 }
2760 PUSH(str);
2761 DISPATCH();
2762 }
2763
Benjamin Petersonddd19492018-09-16 22:38:02 -07002764 case TARGET(BUILD_TUPLE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002765 PyObject *tup = PyTuple_New(oparg);
2766 if (tup == NULL)
2767 goto error;
2768 while (--oparg >= 0) {
2769 PyObject *item = POP();
2770 PyTuple_SET_ITEM(tup, oparg, item);
2771 }
2772 PUSH(tup);
2773 DISPATCH();
2774 }
2775
Benjamin Petersonddd19492018-09-16 22:38:02 -07002776 case TARGET(BUILD_LIST): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002777 PyObject *list = PyList_New(oparg);
2778 if (list == NULL)
2779 goto error;
2780 while (--oparg >= 0) {
2781 PyObject *item = POP();
2782 PyList_SET_ITEM(list, oparg, item);
2783 }
2784 PUSH(list);
2785 DISPATCH();
2786 }
2787
Mark Shannon13bc1392020-01-23 09:25:17 +00002788 case TARGET(LIST_TO_TUPLE): {
2789 PyObject *list = POP();
2790 PyObject *tuple = PyList_AsTuple(list);
2791 Py_DECREF(list);
2792 if (tuple == NULL) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002793 goto error;
Mark Shannon13bc1392020-01-23 09:25:17 +00002794 }
2795 PUSH(tuple);
2796 DISPATCH();
2797 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002798
Mark Shannon13bc1392020-01-23 09:25:17 +00002799 case TARGET(LIST_EXTEND): {
2800 PyObject *iterable = POP();
2801 PyObject *list = PEEK(oparg);
2802 PyObject *none_val = _PyList_Extend((PyListObject *)list, iterable);
2803 if (none_val == NULL) {
2804 if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError) &&
Victor Stinnera102ed72020-02-07 02:24:48 +01002805 (Py_TYPE(iterable)->tp_iter == NULL && !PySequence_Check(iterable)))
Mark Shannon13bc1392020-01-23 09:25:17 +00002806 {
Victor Stinner61f4db82020-01-28 03:37:45 +01002807 _PyErr_Clear(tstate);
Mark Shannon13bc1392020-01-23 09:25:17 +00002808 _PyErr_Format(tstate, PyExc_TypeError,
2809 "Value after * must be an iterable, not %.200s",
2810 Py_TYPE(iterable)->tp_name);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002811 }
Mark Shannon13bc1392020-01-23 09:25:17 +00002812 Py_DECREF(iterable);
2813 goto error;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002814 }
Mark Shannon13bc1392020-01-23 09:25:17 +00002815 Py_DECREF(none_val);
2816 Py_DECREF(iterable);
2817 DISPATCH();
2818 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002819
Mark Shannon13bc1392020-01-23 09:25:17 +00002820 case TARGET(SET_UPDATE): {
2821 PyObject *iterable = POP();
2822 PyObject *set = PEEK(oparg);
2823 int err = _PySet_Update(set, iterable);
2824 Py_DECREF(iterable);
2825 if (err < 0) {
2826 goto error;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002827 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002828 DISPATCH();
2829 }
2830
Benjamin Petersonddd19492018-09-16 22:38:02 -07002831 case TARGET(BUILD_SET): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002832 PyObject *set = PySet_New(NULL);
2833 int err = 0;
Raymond Hettinger4c483ad2016-09-08 14:45:40 -07002834 int i;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002835 if (set == NULL)
2836 goto error;
Raymond Hettinger4c483ad2016-09-08 14:45:40 -07002837 for (i = oparg; i > 0; i--) {
2838 PyObject *item = PEEK(i);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002839 if (err == 0)
2840 err = PySet_Add(set, item);
2841 Py_DECREF(item);
2842 }
costypetrisor8ed317f2018-07-31 20:55:14 +00002843 STACK_SHRINK(oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002844 if (err != 0) {
2845 Py_DECREF(set);
2846 goto error;
2847 }
2848 PUSH(set);
2849 DISPATCH();
2850 }
2851
Benjamin Petersonddd19492018-09-16 22:38:02 -07002852 case TARGET(BUILD_MAP): {
Victor Stinner74319ae2016-08-25 00:04:09 +02002853 Py_ssize_t i;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002854 PyObject *map = _PyDict_NewPresized((Py_ssize_t)oparg);
2855 if (map == NULL)
2856 goto error;
Benjamin Petersond5d77aa2015-07-05 10:37:25 -05002857 for (i = oparg; i > 0; i--) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002858 int err;
Benjamin Petersond5d77aa2015-07-05 10:37:25 -05002859 PyObject *key = PEEK(2*i);
2860 PyObject *value = PEEK(2*i - 1);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002861 err = PyDict_SetItem(map, key, value);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002862 if (err != 0) {
2863 Py_DECREF(map);
2864 goto error;
2865 }
2866 }
Benjamin Petersond5d77aa2015-07-05 10:37:25 -05002867
2868 while (oparg--) {
2869 Py_DECREF(POP());
2870 Py_DECREF(POP());
2871 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002872 PUSH(map);
2873 DISPATCH();
2874 }
2875
Benjamin Petersonddd19492018-09-16 22:38:02 -07002876 case TARGET(SETUP_ANNOTATIONS): {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002877 _Py_IDENTIFIER(__annotations__);
2878 int err;
2879 PyObject *ann_dict;
2880 if (f->f_locals == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002881 _PyErr_Format(tstate, PyExc_SystemError,
2882 "no locals found when setting up annotations");
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002883 goto error;
2884 }
2885 /* check if __annotations__ in locals()... */
2886 if (PyDict_CheckExact(f->f_locals)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002887 ann_dict = _PyDict_GetItemIdWithError(f->f_locals,
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002888 &PyId___annotations__);
2889 if (ann_dict == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002890 if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002891 goto error;
2892 }
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002893 /* ...if not, create a new one */
2894 ann_dict = PyDict_New();
2895 if (ann_dict == NULL) {
2896 goto error;
2897 }
2898 err = _PyDict_SetItemId(f->f_locals,
2899 &PyId___annotations__, ann_dict);
2900 Py_DECREF(ann_dict);
2901 if (err != 0) {
2902 goto error;
2903 }
2904 }
2905 }
2906 else {
2907 /* do the same if locals() is not a dict */
2908 PyObject *ann_str = _PyUnicode_FromId(&PyId___annotations__);
2909 if (ann_str == NULL) {
Serhiy Storchaka4678b2f2016-11-08 23:13:36 +02002910 goto error;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002911 }
2912 ann_dict = PyObject_GetItem(f->f_locals, ann_str);
2913 if (ann_dict == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002914 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002915 goto error;
2916 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002917 _PyErr_Clear(tstate);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002918 ann_dict = PyDict_New();
2919 if (ann_dict == NULL) {
2920 goto error;
2921 }
2922 err = PyObject_SetItem(f->f_locals, ann_str, ann_dict);
2923 Py_DECREF(ann_dict);
2924 if (err != 0) {
2925 goto error;
2926 }
2927 }
2928 else {
2929 Py_DECREF(ann_dict);
2930 }
2931 }
2932 DISPATCH();
2933 }
2934
Benjamin Petersonddd19492018-09-16 22:38:02 -07002935 case TARGET(BUILD_CONST_KEY_MAP): {
Victor Stinner74319ae2016-08-25 00:04:09 +02002936 Py_ssize_t i;
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03002937 PyObject *map;
2938 PyObject *keys = TOP();
2939 if (!PyTuple_CheckExact(keys) ||
2940 PyTuple_GET_SIZE(keys) != (Py_ssize_t)oparg) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002941 _PyErr_SetString(tstate, PyExc_SystemError,
2942 "bad BUILD_CONST_KEY_MAP keys argument");
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03002943 goto error;
2944 }
2945 map = _PyDict_NewPresized((Py_ssize_t)oparg);
2946 if (map == NULL) {
2947 goto error;
2948 }
2949 for (i = oparg; i > 0; i--) {
2950 int err;
2951 PyObject *key = PyTuple_GET_ITEM(keys, oparg - i);
2952 PyObject *value = PEEK(i + 1);
2953 err = PyDict_SetItem(map, key, value);
2954 if (err != 0) {
2955 Py_DECREF(map);
2956 goto error;
2957 }
2958 }
2959
2960 Py_DECREF(POP());
2961 while (oparg--) {
2962 Py_DECREF(POP());
2963 }
2964 PUSH(map);
2965 DISPATCH();
2966 }
2967
Mark Shannon8a4cd702020-01-27 09:57:45 +00002968 case TARGET(DICT_UPDATE): {
2969 PyObject *update = POP();
2970 PyObject *dict = PEEK(oparg);
2971 if (PyDict_Update(dict, update) < 0) {
2972 if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) {
2973 _PyErr_Format(tstate, PyExc_TypeError,
2974 "'%.200s' object is not a mapping",
Victor Stinnera102ed72020-02-07 02:24:48 +01002975 Py_TYPE(update)->tp_name);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002976 }
Mark Shannon8a4cd702020-01-27 09:57:45 +00002977 Py_DECREF(update);
2978 goto error;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002979 }
Mark Shannon8a4cd702020-01-27 09:57:45 +00002980 Py_DECREF(update);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002981 DISPATCH();
2982 }
2983
Mark Shannon8a4cd702020-01-27 09:57:45 +00002984 case TARGET(DICT_MERGE): {
2985 PyObject *update = POP();
2986 PyObject *dict = PEEK(oparg);
2987
2988 if (_PyDict_MergeEx(dict, update, 2) < 0) {
2989 format_kwargs_error(tstate, PEEK(2 + oparg), update);
2990 Py_DECREF(update);
Serhiy Storchakae036ef82016-10-02 11:06:43 +03002991 goto error;
Serhiy Storchakae036ef82016-10-02 11:06:43 +03002992 }
Mark Shannon8a4cd702020-01-27 09:57:45 +00002993 Py_DECREF(update);
Brandt Bucherf185a732019-09-28 17:12:49 -07002994 PREDICT(CALL_FUNCTION_EX);
Serhiy Storchakae036ef82016-10-02 11:06:43 +03002995 DISPATCH();
2996 }
2997
Benjamin Petersonddd19492018-09-16 22:38:02 -07002998 case TARGET(MAP_ADD): {
Jörn Heisslerc8a35412019-06-22 16:40:55 +02002999 PyObject *value = TOP();
3000 PyObject *key = SECOND();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003001 PyObject *map;
3002 int err;
costypetrisor8ed317f2018-07-31 20:55:14 +00003003 STACK_SHRINK(2);
Raymond Hettinger41862222016-10-15 19:03:06 -07003004 map = PEEK(oparg); /* dict */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003005 assert(PyDict_CheckExact(map));
Martin Panter95f53c12016-07-18 08:23:26 +00003006 err = PyDict_SetItem(map, key, value); /* map[key] = value */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003007 Py_DECREF(value);
3008 Py_DECREF(key);
3009 if (err != 0)
3010 goto error;
3011 PREDICT(JUMP_ABSOLUTE);
3012 DISPATCH();
3013 }
3014
Benjamin Petersonddd19492018-09-16 22:38:02 -07003015 case TARGET(LOAD_ATTR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003016 PyObject *name = GETITEM(names, oparg);
3017 PyObject *owner = TOP();
3018 PyObject *res = PyObject_GetAttr(owner, name);
3019 Py_DECREF(owner);
3020 SET_TOP(res);
3021 if (res == NULL)
3022 goto error;
3023 DISPATCH();
3024 }
3025
Benjamin Petersonddd19492018-09-16 22:38:02 -07003026 case TARGET(COMPARE_OP): {
Mark Shannon9af0e472020-01-14 10:12:45 +00003027 assert(oparg <= Py_GE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003028 PyObject *right = POP();
3029 PyObject *left = TOP();
Mark Shannon9af0e472020-01-14 10:12:45 +00003030 PyObject *res = PyObject_RichCompare(left, right, oparg);
3031 SET_TOP(res);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003032 Py_DECREF(left);
3033 Py_DECREF(right);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003034 if (res == NULL)
3035 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003036 PREDICT(POP_JUMP_IF_FALSE);
3037 PREDICT(POP_JUMP_IF_TRUE);
3038 DISPATCH();
Victor Stinner3c1e4812012-03-26 22:10:51 +02003039 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003040
Mark Shannon9af0e472020-01-14 10:12:45 +00003041 case TARGET(IS_OP): {
3042 PyObject *right = POP();
3043 PyObject *left = TOP();
3044 int res = (left == right)^oparg;
3045 PyObject *b = res ? Py_True : Py_False;
3046 Py_INCREF(b);
3047 SET_TOP(b);
3048 Py_DECREF(left);
3049 Py_DECREF(right);
3050 PREDICT(POP_JUMP_IF_FALSE);
3051 PREDICT(POP_JUMP_IF_TRUE);
3052 FAST_DISPATCH();
3053 }
3054
3055 case TARGET(CONTAINS_OP): {
3056 PyObject *right = POP();
3057 PyObject *left = POP();
3058 int res = PySequence_Contains(right, left);
3059 Py_DECREF(left);
3060 Py_DECREF(right);
3061 if (res < 0) {
3062 goto error;
3063 }
3064 PyObject *b = (res^oparg) ? Py_True : Py_False;
3065 Py_INCREF(b);
3066 PUSH(b);
3067 PREDICT(POP_JUMP_IF_FALSE);
3068 PREDICT(POP_JUMP_IF_TRUE);
3069 FAST_DISPATCH();
3070 }
3071
3072#define CANNOT_CATCH_MSG "catching classes that do not inherit from "\
3073 "BaseException is not allowed"
3074
3075 case TARGET(JUMP_IF_NOT_EXC_MATCH): {
3076 PyObject *right = POP();
3077 PyObject *left = POP();
3078 if (PyTuple_Check(right)) {
3079 Py_ssize_t i, length;
3080 length = PyTuple_GET_SIZE(right);
3081 for (i = 0; i < length; i++) {
3082 PyObject *exc = PyTuple_GET_ITEM(right, i);
3083 if (!PyExceptionClass_Check(exc)) {
3084 _PyErr_SetString(tstate, PyExc_TypeError,
3085 CANNOT_CATCH_MSG);
3086 Py_DECREF(left);
3087 Py_DECREF(right);
3088 goto error;
3089 }
3090 }
3091 }
3092 else {
3093 if (!PyExceptionClass_Check(right)) {
3094 _PyErr_SetString(tstate, PyExc_TypeError,
3095 CANNOT_CATCH_MSG);
3096 Py_DECREF(left);
3097 Py_DECREF(right);
3098 goto error;
3099 }
3100 }
3101 int res = PyErr_GivenExceptionMatches(left, right);
3102 Py_DECREF(left);
3103 Py_DECREF(right);
3104 if (res > 0) {
3105 /* Exception matches -- Do nothing */;
3106 }
3107 else if (res == 0) {
3108 JUMPTO(oparg);
3109 }
3110 else {
3111 goto error;
3112 }
3113 DISPATCH();
3114 }
3115
Benjamin Petersonddd19492018-09-16 22:38:02 -07003116 case TARGET(IMPORT_NAME): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003117 PyObject *name = GETITEM(names, oparg);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03003118 PyObject *fromlist = POP();
3119 PyObject *level = TOP();
3120 PyObject *res;
Victor Stinner438a12d2019-05-24 17:01:38 +02003121 res = import_name(tstate, f, name, fromlist, level);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03003122 Py_DECREF(level);
3123 Py_DECREF(fromlist);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003124 SET_TOP(res);
3125 if (res == NULL)
3126 goto error;
3127 DISPATCH();
3128 }
3129
Benjamin Petersonddd19492018-09-16 22:38:02 -07003130 case TARGET(IMPORT_STAR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003131 PyObject *from = POP(), *locals;
3132 int err;
Matthias Bussonnier160edb42017-02-25 21:58:05 -08003133 if (PyFrame_FastToLocalsWithError(f) < 0) {
3134 Py_DECREF(from);
Victor Stinner41bb43a2013-10-29 01:19:37 +01003135 goto error;
Matthias Bussonnier160edb42017-02-25 21:58:05 -08003136 }
Victor Stinner41bb43a2013-10-29 01:19:37 +01003137
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003138 locals = f->f_locals;
3139 if (locals == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003140 _PyErr_SetString(tstate, PyExc_SystemError,
3141 "no locals found during 'import *'");
Matthias Bussonnier160edb42017-02-25 21:58:05 -08003142 Py_DECREF(from);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003143 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003144 }
Victor Stinner438a12d2019-05-24 17:01:38 +02003145 err = import_all_from(tstate, locals, from);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003146 PyFrame_LocalsToFast(f, 0);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003147 Py_DECREF(from);
3148 if (err != 0)
3149 goto error;
3150 DISPATCH();
3151 }
Guido van Rossum25831651993-05-19 14:50:45 +00003152
Benjamin Petersonddd19492018-09-16 22:38:02 -07003153 case TARGET(IMPORT_FROM): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003154 PyObject *name = GETITEM(names, oparg);
3155 PyObject *from = TOP();
3156 PyObject *res;
Victor Stinner438a12d2019-05-24 17:01:38 +02003157 res = import_from(tstate, from, name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003158 PUSH(res);
3159 if (res == NULL)
3160 goto error;
3161 DISPATCH();
3162 }
Thomas Wouters52152252000-08-17 22:55:00 +00003163
Benjamin Petersonddd19492018-09-16 22:38:02 -07003164 case TARGET(JUMP_FORWARD): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003165 JUMPBY(oparg);
3166 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003167 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003168
Benjamin Petersonddd19492018-09-16 22:38:02 -07003169 case TARGET(POP_JUMP_IF_FALSE): {
3170 PREDICTED(POP_JUMP_IF_FALSE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003171 PyObject *cond = POP();
3172 int err;
3173 if (cond == Py_True) {
3174 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003175 FAST_DISPATCH();
3176 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003177 if (cond == Py_False) {
3178 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003179 JUMPTO(oparg);
3180 FAST_DISPATCH();
3181 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003182 err = PyObject_IsTrue(cond);
3183 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003184 if (err > 0)
Adrian Wielgosik50c28502017-06-23 13:35:41 -07003185 ;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003186 else if (err == 0)
3187 JUMPTO(oparg);
3188 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003189 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003190 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003191 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003192
Benjamin Petersonddd19492018-09-16 22:38:02 -07003193 case TARGET(POP_JUMP_IF_TRUE): {
3194 PREDICTED(POP_JUMP_IF_TRUE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003195 PyObject *cond = POP();
3196 int err;
3197 if (cond == Py_False) {
3198 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003199 FAST_DISPATCH();
3200 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003201 if (cond == Py_True) {
3202 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003203 JUMPTO(oparg);
3204 FAST_DISPATCH();
3205 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003206 err = PyObject_IsTrue(cond);
3207 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003208 if (err > 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003209 JUMPTO(oparg);
3210 }
3211 else if (err == 0)
3212 ;
3213 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003214 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003215 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003216 }
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00003217
Benjamin Petersonddd19492018-09-16 22:38:02 -07003218 case TARGET(JUMP_IF_FALSE_OR_POP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003219 PyObject *cond = TOP();
3220 int err;
3221 if (cond == Py_True) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003222 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003223 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003224 FAST_DISPATCH();
3225 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003226 if (cond == Py_False) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003227 JUMPTO(oparg);
3228 FAST_DISPATCH();
3229 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003230 err = PyObject_IsTrue(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003231 if (err > 0) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003232 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003233 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003234 }
3235 else if (err == 0)
3236 JUMPTO(oparg);
3237 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003238 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003239 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003240 }
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00003241
Benjamin Petersonddd19492018-09-16 22:38:02 -07003242 case TARGET(JUMP_IF_TRUE_OR_POP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003243 PyObject *cond = TOP();
3244 int err;
3245 if (cond == Py_False) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003246 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003247 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003248 FAST_DISPATCH();
3249 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003250 if (cond == Py_True) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003251 JUMPTO(oparg);
3252 FAST_DISPATCH();
3253 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003254 err = PyObject_IsTrue(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003255 if (err > 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003256 JUMPTO(oparg);
3257 }
3258 else if (err == 0) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003259 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003260 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003261 }
3262 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003263 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003264 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003265 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003266
Benjamin Petersonddd19492018-09-16 22:38:02 -07003267 case TARGET(JUMP_ABSOLUTE): {
3268 PREDICTED(JUMP_ABSOLUTE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003269 JUMPTO(oparg);
Guido van Rossum58da9312007-11-10 23:39:45 +00003270#if FAST_LOOPS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003271 /* Enabling this path speeds-up all while and for-loops by bypassing
3272 the per-loop checks for signals. By default, this should be turned-off
3273 because it prevents detection of a control-break in tight loops like
3274 "while 1: pass". Compile with this option turned-on when you need
3275 the speed-up and do not need break checking inside tight loops (ones
3276 that contain only instructions ending with FAST_DISPATCH).
3277 */
3278 FAST_DISPATCH();
Guido van Rossum58da9312007-11-10 23:39:45 +00003279#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003280 DISPATCH();
Guido van Rossum58da9312007-11-10 23:39:45 +00003281#endif
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003282 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003283
Benjamin Petersonddd19492018-09-16 22:38:02 -07003284 case TARGET(GET_ITER): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003285 /* before: [obj]; after [getiter(obj)] */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003286 PyObject *iterable = TOP();
Yury Selivanov5376ba92015-06-22 12:19:30 -04003287 PyObject *iter = PyObject_GetIter(iterable);
3288 Py_DECREF(iterable);
3289 SET_TOP(iter);
3290 if (iter == NULL)
3291 goto error;
3292 PREDICT(FOR_ITER);
Serhiy Storchakada9c5132016-06-27 18:58:57 +03003293 PREDICT(CALL_FUNCTION);
Yury Selivanov5376ba92015-06-22 12:19:30 -04003294 DISPATCH();
3295 }
3296
Benjamin Petersonddd19492018-09-16 22:38:02 -07003297 case TARGET(GET_YIELD_FROM_ITER): {
Yury Selivanov5376ba92015-06-22 12:19:30 -04003298 /* before: [obj]; after [getiter(obj)] */
3299 PyObject *iterable = TOP();
Yury Selivanov75445082015-05-11 22:57:16 -04003300 PyObject *iter;
Yury Selivanov5376ba92015-06-22 12:19:30 -04003301 if (PyCoro_CheckExact(iterable)) {
3302 /* `iterable` is a coroutine */
3303 if (!(co->co_flags & (CO_COROUTINE | CO_ITERABLE_COROUTINE))) {
3304 /* and it is used in a 'yield from' expression of a
3305 regular generator. */
3306 Py_DECREF(iterable);
3307 SET_TOP(NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02003308 _PyErr_SetString(tstate, PyExc_TypeError,
3309 "cannot 'yield from' a coroutine object "
3310 "in a non-coroutine generator");
Yury Selivanov5376ba92015-06-22 12:19:30 -04003311 goto error;
3312 }
3313 }
3314 else if (!PyGen_CheckExact(iterable)) {
Yury Selivanov75445082015-05-11 22:57:16 -04003315 /* `iterable` is not a generator. */
3316 iter = PyObject_GetIter(iterable);
3317 Py_DECREF(iterable);
3318 SET_TOP(iter);
3319 if (iter == NULL)
3320 goto error;
3321 }
Serhiy Storchakada9c5132016-06-27 18:58:57 +03003322 PREDICT(LOAD_CONST);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003323 DISPATCH();
3324 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003325
Benjamin Petersonddd19492018-09-16 22:38:02 -07003326 case TARGET(FOR_ITER): {
3327 PREDICTED(FOR_ITER);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003328 /* before: [iter]; after: [iter, iter()] *or* [] */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003329 PyObject *iter = TOP();
Victor Stinnera102ed72020-02-07 02:24:48 +01003330 PyObject *next = (*Py_TYPE(iter)->tp_iternext)(iter);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003331 if (next != NULL) {
3332 PUSH(next);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003333 PREDICT(STORE_FAST);
3334 PREDICT(UNPACK_SEQUENCE);
3335 DISPATCH();
3336 }
Victor Stinner438a12d2019-05-24 17:01:38 +02003337 if (_PyErr_Occurred(tstate)) {
3338 if (!_PyErr_ExceptionMatches(tstate, PyExc_StopIteration)) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003339 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02003340 }
3341 else if (tstate->c_tracefunc != NULL) {
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003342 call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj, tstate, f);
Victor Stinner438a12d2019-05-24 17:01:38 +02003343 }
3344 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003345 }
3346 /* iterator ended normally */
costypetrisor8ed317f2018-07-31 20:55:14 +00003347 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003348 Py_DECREF(iter);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003349 JUMPBY(oparg);
Serhiy Storchakada9c5132016-06-27 18:58:57 +03003350 PREDICT(POP_BLOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003351 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003352 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003353
Benjamin Petersonddd19492018-09-16 22:38:02 -07003354 case TARGET(SETUP_FINALLY): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003355 PyFrame_BlockSetup(f, SETUP_FINALLY, INSTR_OFFSET() + oparg,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003356 STACK_LEVEL());
3357 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003358 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003359
Benjamin Petersonddd19492018-09-16 22:38:02 -07003360 case TARGET(BEFORE_ASYNC_WITH): {
Yury Selivanov75445082015-05-11 22:57:16 -04003361 _Py_IDENTIFIER(__aenter__);
Géry Ogam1d1b97a2020-01-14 12:58:29 +01003362 _Py_IDENTIFIER(__aexit__);
Yury Selivanov75445082015-05-11 22:57:16 -04003363 PyObject *mgr = TOP();
Géry Ogam1d1b97a2020-01-14 12:58:29 +01003364 PyObject *enter = special_lookup(tstate, mgr, &PyId___aenter__);
Yury Selivanov75445082015-05-11 22:57:16 -04003365 PyObject *res;
Géry Ogam1d1b97a2020-01-14 12:58:29 +01003366 if (enter == NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04003367 goto error;
Géry Ogam1d1b97a2020-01-14 12:58:29 +01003368 }
3369 PyObject *exit = special_lookup(tstate, mgr, &PyId___aexit__);
3370 if (exit == NULL) {
3371 Py_DECREF(enter);
3372 goto error;
3373 }
Yury Selivanov75445082015-05-11 22:57:16 -04003374 SET_TOP(exit);
Yury Selivanov75445082015-05-11 22:57:16 -04003375 Py_DECREF(mgr);
Victor Stinnerf17c3de2016-12-06 18:46:19 +01003376 res = _PyObject_CallNoArg(enter);
Yury Selivanov75445082015-05-11 22:57:16 -04003377 Py_DECREF(enter);
3378 if (res == NULL)
3379 goto error;
3380 PUSH(res);
Serhiy Storchakada9c5132016-06-27 18:58:57 +03003381 PREDICT(GET_AWAITABLE);
Yury Selivanov75445082015-05-11 22:57:16 -04003382 DISPATCH();
3383 }
3384
Benjamin Petersonddd19492018-09-16 22:38:02 -07003385 case TARGET(SETUP_ASYNC_WITH): {
Yury Selivanov75445082015-05-11 22:57:16 -04003386 PyObject *res = POP();
3387 /* Setup the finally block before pushing the result
3388 of __aenter__ on the stack. */
3389 PyFrame_BlockSetup(f, SETUP_FINALLY, INSTR_OFFSET() + oparg,
3390 STACK_LEVEL());
3391 PUSH(res);
3392 DISPATCH();
3393 }
3394
Benjamin Petersonddd19492018-09-16 22:38:02 -07003395 case TARGET(SETUP_WITH): {
Benjamin Petersonce798522012-01-22 11:24:29 -05003396 _Py_IDENTIFIER(__enter__);
Géry Ogam1d1b97a2020-01-14 12:58:29 +01003397 _Py_IDENTIFIER(__exit__);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003398 PyObject *mgr = TOP();
Victor Stinner438a12d2019-05-24 17:01:38 +02003399 PyObject *enter = special_lookup(tstate, mgr, &PyId___enter__);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003400 PyObject *res;
Victor Stinner438a12d2019-05-24 17:01:38 +02003401 if (enter == NULL) {
Raymond Hettingera3fec152016-11-21 17:24:23 -08003402 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02003403 }
3404 PyObject *exit = special_lookup(tstate, mgr, &PyId___exit__);
Raymond Hettinger64e2f9a2016-11-22 11:50:40 -08003405 if (exit == NULL) {
3406 Py_DECREF(enter);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003407 goto error;
Raymond Hettinger64e2f9a2016-11-22 11:50:40 -08003408 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003409 SET_TOP(exit);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003410 Py_DECREF(mgr);
Victor Stinnerf17c3de2016-12-06 18:46:19 +01003411 res = _PyObject_CallNoArg(enter);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003412 Py_DECREF(enter);
3413 if (res == NULL)
3414 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003415 /* Setup the finally block before pushing the result
3416 of __enter__ on the stack. */
3417 PyFrame_BlockSetup(f, SETUP_FINALLY, INSTR_OFFSET() + oparg,
3418 STACK_LEVEL());
Benjamin Peterson876b2f22009-06-28 03:18:59 +00003419
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003420 PUSH(res);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003421 DISPATCH();
3422 }
Benjamin Peterson876b2f22009-06-28 03:18:59 +00003423
Mark Shannonfee55262019-11-21 09:11:43 +00003424 case TARGET(WITH_EXCEPT_START): {
3425 /* At the top of the stack are 7 values:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003426 - (TOP, SECOND, THIRD) = exc_info()
Mark Shannonfee55262019-11-21 09:11:43 +00003427 - (FOURTH, FIFTH, SIXTH) = previous exception for EXCEPT_HANDLER
3428 - SEVENTH: the context.__exit__ bound method
3429 We call SEVENTH(TOP, SECOND, THIRD).
3430 Then we push again the TOP exception and the __exit__
3431 return value.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003432 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003433 PyObject *exit_func;
Victor Stinner842cfff2016-12-01 14:45:31 +01003434 PyObject *exc, *val, *tb, *res;
3435
Victor Stinner842cfff2016-12-01 14:45:31 +01003436 exc = TOP();
Mark Shannonfee55262019-11-21 09:11:43 +00003437 val = SECOND();
3438 tb = THIRD();
3439 assert(exc != Py_None);
3440 assert(!PyLong_Check(exc));
3441 exit_func = PEEK(7);
Jeroen Demeyer469d1a72019-07-03 12:52:21 +02003442 PyObject *stack[4] = {NULL, exc, val, tb};
Petr Viktorinffd97532020-02-11 17:46:57 +01003443 res = PyObject_Vectorcall(exit_func, stack + 1,
Jeroen Demeyer469d1a72019-07-03 12:52:21 +02003444 3 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003445 if (res == NULL)
3446 goto error;
Amaury Forgeot d'Arc10b24e82008-12-10 23:49:33 +00003447
Yury Selivanov75445082015-05-11 22:57:16 -04003448 PUSH(res);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003449 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003450 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00003451
Benjamin Petersonddd19492018-09-16 22:38:02 -07003452 case TARGET(LOAD_METHOD): {
Andreyb021ba52019-04-29 14:33:26 +10003453 /* Designed to work in tandem with CALL_METHOD. */
Yury Selivanovf2392132016-12-13 19:03:51 -05003454 PyObject *name = GETITEM(names, oparg);
3455 PyObject *obj = TOP();
3456 PyObject *meth = NULL;
3457
3458 int meth_found = _PyObject_GetMethod(obj, name, &meth);
3459
Yury Selivanovf2392132016-12-13 19:03:51 -05003460 if (meth == NULL) {
3461 /* Most likely attribute wasn't found. */
Yury Selivanovf2392132016-12-13 19:03:51 -05003462 goto error;
3463 }
3464
3465 if (meth_found) {
INADA Naoki015bce62017-01-16 17:23:30 +09003466 /* We can bypass temporary bound method object.
3467 meth is unbound method and obj is self.
Victor Stinnera8cb5152017-01-18 14:12:51 +01003468
INADA Naoki015bce62017-01-16 17:23:30 +09003469 meth | self | arg1 | ... | argN
3470 */
3471 SET_TOP(meth);
3472 PUSH(obj); // self
Yury Selivanovf2392132016-12-13 19:03:51 -05003473 }
3474 else {
INADA Naoki015bce62017-01-16 17:23:30 +09003475 /* meth is not an unbound method (but a regular attr, or
3476 something was returned by a descriptor protocol). Set
3477 the second element of the stack to NULL, to signal
Yury Selivanovf2392132016-12-13 19:03:51 -05003478 CALL_METHOD that it's not a method call.
INADA Naoki015bce62017-01-16 17:23:30 +09003479
3480 NULL | meth | arg1 | ... | argN
Yury Selivanovf2392132016-12-13 19:03:51 -05003481 */
INADA Naoki015bce62017-01-16 17:23:30 +09003482 SET_TOP(NULL);
Yury Selivanovf2392132016-12-13 19:03:51 -05003483 Py_DECREF(obj);
INADA Naoki015bce62017-01-16 17:23:30 +09003484 PUSH(meth);
Yury Selivanovf2392132016-12-13 19:03:51 -05003485 }
3486 DISPATCH();
3487 }
3488
Benjamin Petersonddd19492018-09-16 22:38:02 -07003489 case TARGET(CALL_METHOD): {
Yury Selivanovf2392132016-12-13 19:03:51 -05003490 /* Designed to work in tamdem with LOAD_METHOD. */
INADA Naoki015bce62017-01-16 17:23:30 +09003491 PyObject **sp, *res, *meth;
Yury Selivanovf2392132016-12-13 19:03:51 -05003492
3493 sp = stack_pointer;
3494
INADA Naoki015bce62017-01-16 17:23:30 +09003495 meth = PEEK(oparg + 2);
3496 if (meth == NULL) {
3497 /* `meth` is NULL when LOAD_METHOD thinks that it's not
3498 a method call.
Yury Selivanovf2392132016-12-13 19:03:51 -05003499
3500 Stack layout:
3501
INADA Naoki015bce62017-01-16 17:23:30 +09003502 ... | NULL | callable | arg1 | ... | argN
3503 ^- TOP()
3504 ^- (-oparg)
3505 ^- (-oparg-1)
3506 ^- (-oparg-2)
Yury Selivanovf2392132016-12-13 19:03:51 -05003507
Ville Skyttä49b27342017-08-03 09:00:59 +03003508 `callable` will be POPed by call_function.
INADA Naoki015bce62017-01-16 17:23:30 +09003509 NULL will will be POPed manually later.
Yury Selivanovf2392132016-12-13 19:03:51 -05003510 */
Victor Stinner09532fe2019-05-10 23:39:09 +02003511 res = call_function(tstate, &sp, oparg, NULL);
Yury Selivanovf2392132016-12-13 19:03:51 -05003512 stack_pointer = sp;
INADA Naoki015bce62017-01-16 17:23:30 +09003513 (void)POP(); /* POP the NULL. */
Yury Selivanovf2392132016-12-13 19:03:51 -05003514 }
3515 else {
3516 /* This is a method call. Stack layout:
3517
INADA Naoki015bce62017-01-16 17:23:30 +09003518 ... | method | self | arg1 | ... | argN
Yury Selivanovf2392132016-12-13 19:03:51 -05003519 ^- TOP()
3520 ^- (-oparg)
INADA Naoki015bce62017-01-16 17:23:30 +09003521 ^- (-oparg-1)
3522 ^- (-oparg-2)
Yury Selivanovf2392132016-12-13 19:03:51 -05003523
INADA Naoki015bce62017-01-16 17:23:30 +09003524 `self` and `method` will be POPed by call_function.
Yury Selivanovf2392132016-12-13 19:03:51 -05003525 We'll be passing `oparg + 1` to call_function, to
INADA Naoki015bce62017-01-16 17:23:30 +09003526 make it accept the `self` as a first argument.
Yury Selivanovf2392132016-12-13 19:03:51 -05003527 */
Victor Stinner09532fe2019-05-10 23:39:09 +02003528 res = call_function(tstate, &sp, oparg + 1, NULL);
Yury Selivanovf2392132016-12-13 19:03:51 -05003529 stack_pointer = sp;
3530 }
3531
3532 PUSH(res);
3533 if (res == NULL)
3534 goto error;
3535 DISPATCH();
3536 }
3537
Benjamin Petersonddd19492018-09-16 22:38:02 -07003538 case TARGET(CALL_FUNCTION): {
3539 PREDICTED(CALL_FUNCTION);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003540 PyObject **sp, *res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003541 sp = stack_pointer;
Victor Stinner09532fe2019-05-10 23:39:09 +02003542 res = call_function(tstate, &sp, oparg, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003543 stack_pointer = sp;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003544 PUSH(res);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003545 if (res == NULL) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003546 goto error;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003547 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003548 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003549 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003550
Benjamin Petersonddd19492018-09-16 22:38:02 -07003551 case TARGET(CALL_FUNCTION_KW): {
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003552 PyObject **sp, *res, *names;
3553
3554 names = POP();
Jeroen Demeyer05677862019-08-16 12:41:27 +02003555 assert(PyTuple_Check(names));
3556 assert(PyTuple_GET_SIZE(names) <= oparg);
3557 /* We assume without checking that names contains only strings */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003558 sp = stack_pointer;
Victor Stinner09532fe2019-05-10 23:39:09 +02003559 res = call_function(tstate, &sp, oparg, names);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003560 stack_pointer = sp;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003561 PUSH(res);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003562 Py_DECREF(names);
3563
3564 if (res == NULL) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003565 goto error;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003566 }
3567 DISPATCH();
3568 }
3569
Benjamin Petersonddd19492018-09-16 22:38:02 -07003570 case TARGET(CALL_FUNCTION_EX): {
Brandt Bucherf185a732019-09-28 17:12:49 -07003571 PREDICTED(CALL_FUNCTION_EX);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003572 PyObject *func, *callargs, *kwargs = NULL, *result;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003573 if (oparg & 0x01) {
3574 kwargs = POP();
Serhiy Storchakab7281052016-09-12 00:52:40 +03003575 if (!PyDict_CheckExact(kwargs)) {
3576 PyObject *d = PyDict_New();
3577 if (d == NULL)
3578 goto error;
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02003579 if (_PyDict_MergeEx(d, kwargs, 2) < 0) {
Serhiy Storchakab7281052016-09-12 00:52:40 +03003580 Py_DECREF(d);
Victor Stinner438a12d2019-05-24 17:01:38 +02003581 format_kwargs_error(tstate, SECOND(), kwargs);
Victor Stinnereece2222016-09-12 11:16:37 +02003582 Py_DECREF(kwargs);
Serhiy Storchakab7281052016-09-12 00:52:40 +03003583 goto error;
3584 }
3585 Py_DECREF(kwargs);
3586 kwargs = d;
3587 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003588 assert(PyDict_CheckExact(kwargs));
3589 }
3590 callargs = POP();
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003591 func = TOP();
Serhiy Storchaka63dc5482016-09-22 19:41:20 +03003592 if (!PyTuple_CheckExact(callargs)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003593 if (check_args_iterable(tstate, func, callargs) < 0) {
Victor Stinnereece2222016-09-12 11:16:37 +02003594 Py_DECREF(callargs);
Serhiy Storchakab7281052016-09-12 00:52:40 +03003595 goto error;
3596 }
3597 Py_SETREF(callargs, PySequence_Tuple(callargs));
3598 if (callargs == NULL) {
3599 goto error;
3600 }
3601 }
Serhiy Storchaka63dc5482016-09-22 19:41:20 +03003602 assert(PyTuple_CheckExact(callargs));
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003603
Victor Stinner09532fe2019-05-10 23:39:09 +02003604 result = do_call_core(tstate, func, callargs, kwargs);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003605 Py_DECREF(func);
3606 Py_DECREF(callargs);
3607 Py_XDECREF(kwargs);
3608
3609 SET_TOP(result);
3610 if (result == NULL) {
3611 goto error;
3612 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003613 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003614 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003615
Benjamin Petersonddd19492018-09-16 22:38:02 -07003616 case TARGET(MAKE_FUNCTION): {
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003617 PyObject *qualname = POP();
3618 PyObject *codeobj = POP();
3619 PyFunctionObject *func = (PyFunctionObject *)
3620 PyFunction_NewWithQualName(codeobj, f->f_globals, qualname);
Guido van Rossum4f72a782006-10-27 23:31:49 +00003621
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003622 Py_DECREF(codeobj);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003623 Py_DECREF(qualname);
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003624 if (func == NULL) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003625 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003626 }
Neal Norwitzc1505362006-12-28 06:47:50 +00003627
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003628 if (oparg & 0x08) {
3629 assert(PyTuple_CheckExact(TOP()));
3630 func ->func_closure = POP();
3631 }
3632 if (oparg & 0x04) {
3633 assert(PyDict_CheckExact(TOP()));
3634 func->func_annotations = POP();
3635 }
3636 if (oparg & 0x02) {
3637 assert(PyDict_CheckExact(TOP()));
3638 func->func_kwdefaults = POP();
3639 }
3640 if (oparg & 0x01) {
3641 assert(PyTuple_CheckExact(TOP()));
3642 func->func_defaults = POP();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003643 }
Neal Norwitzc1505362006-12-28 06:47:50 +00003644
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003645 PUSH((PyObject *)func);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003646 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003647 }
Guido van Rossum8861b741996-07-30 16:49:37 +00003648
Benjamin Petersonddd19492018-09-16 22:38:02 -07003649 case TARGET(BUILD_SLICE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003650 PyObject *start, *stop, *step, *slice;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003651 if (oparg == 3)
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003652 step = POP();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003653 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003654 step = NULL;
3655 stop = POP();
3656 start = TOP();
3657 slice = PySlice_New(start, stop, step);
3658 Py_DECREF(start);
3659 Py_DECREF(stop);
3660 Py_XDECREF(step);
3661 SET_TOP(slice);
3662 if (slice == NULL)
3663 goto error;
3664 DISPATCH();
3665 }
Guido van Rossum8861b741996-07-30 16:49:37 +00003666
Benjamin Petersonddd19492018-09-16 22:38:02 -07003667 case TARGET(FORMAT_VALUE): {
Eric V. Smitha78c7952015-11-03 12:45:05 -05003668 /* Handles f-string value formatting. */
3669 PyObject *result;
3670 PyObject *fmt_spec;
3671 PyObject *value;
3672 PyObject *(*conv_fn)(PyObject *);
3673 int which_conversion = oparg & FVC_MASK;
3674 int have_fmt_spec = (oparg & FVS_MASK) == FVS_HAVE_SPEC;
3675
3676 fmt_spec = have_fmt_spec ? POP() : NULL;
Eric V. Smith135d5f42016-02-05 18:23:08 -05003677 value = POP();
Eric V. Smitha78c7952015-11-03 12:45:05 -05003678
3679 /* See if any conversion is specified. */
3680 switch (which_conversion) {
Eric V. Smith9a4135e2019-05-08 16:28:48 -04003681 case FVC_NONE: conv_fn = NULL; break;
Eric V. Smitha78c7952015-11-03 12:45:05 -05003682 case FVC_STR: conv_fn = PyObject_Str; break;
3683 case FVC_REPR: conv_fn = PyObject_Repr; break;
3684 case FVC_ASCII: conv_fn = PyObject_ASCII; break;
Eric V. Smith9a4135e2019-05-08 16:28:48 -04003685 default:
Victor Stinner438a12d2019-05-24 17:01:38 +02003686 _PyErr_Format(tstate, PyExc_SystemError,
3687 "unexpected conversion flag %d",
3688 which_conversion);
Eric V. Smith9a4135e2019-05-08 16:28:48 -04003689 goto error;
Eric V. Smitha78c7952015-11-03 12:45:05 -05003690 }
3691
3692 /* If there's a conversion function, call it and replace
3693 value with that result. Otherwise, just use value,
3694 without conversion. */
Eric V. Smitheb588a12016-02-05 18:26:20 -05003695 if (conv_fn != NULL) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05003696 result = conv_fn(value);
3697 Py_DECREF(value);
Eric V. Smitheb588a12016-02-05 18:26:20 -05003698 if (result == NULL) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05003699 Py_XDECREF(fmt_spec);
3700 goto error;
3701 }
3702 value = result;
3703 }
3704
3705 /* If value is a unicode object, and there's no fmt_spec,
3706 then we know the result of format(value) is value
3707 itself. In that case, skip calling format(). I plan to
3708 move this optimization in to PyObject_Format()
3709 itself. */
3710 if (PyUnicode_CheckExact(value) && fmt_spec == NULL) {
3711 /* Do nothing, just transfer ownership to result. */
3712 result = value;
3713 } else {
3714 /* Actually call format(). */
3715 result = PyObject_Format(value, fmt_spec);
3716 Py_DECREF(value);
3717 Py_XDECREF(fmt_spec);
Eric V. Smitheb588a12016-02-05 18:26:20 -05003718 if (result == NULL) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05003719 goto error;
Eric V. Smitheb588a12016-02-05 18:26:20 -05003720 }
Eric V. Smitha78c7952015-11-03 12:45:05 -05003721 }
3722
Eric V. Smith135d5f42016-02-05 18:23:08 -05003723 PUSH(result);
Eric V. Smitha78c7952015-11-03 12:45:05 -05003724 DISPATCH();
3725 }
3726
Benjamin Petersonddd19492018-09-16 22:38:02 -07003727 case TARGET(EXTENDED_ARG): {
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03003728 int oldoparg = oparg;
3729 NEXTOPARG();
3730 oparg |= oldoparg << 8;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003731 goto dispatch_opcode;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003732 }
Guido van Rossum8861b741996-07-30 16:49:37 +00003733
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003734
Antoine Pitrou042b1282010-08-13 21:15:58 +00003735#if USE_COMPUTED_GOTOS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003736 _unknown_opcode:
Antoine Pitroub52ec782009-01-25 16:34:23 +00003737#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003738 default:
3739 fprintf(stderr,
3740 "XXX lineno: %d, opcode: %d\n",
3741 PyFrame_GetLineNumber(f),
3742 opcode);
Victor Stinner438a12d2019-05-24 17:01:38 +02003743 _PyErr_SetString(tstate, PyExc_SystemError, "unknown opcode");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003744 goto error;
Guido van Rossum04691fc1992-08-12 15:35:34 +00003745
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003746 } /* switch */
Guido van Rossum374a9221991-04-04 10:40:29 +00003747
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003748 /* This should never be reached. Every opcode should end with DISPATCH()
3749 or goto error. */
Barry Warsawb2e57942017-09-14 18:13:16 -07003750 Py_UNREACHABLE();
Guido van Rossumac7be682001-01-17 15:42:30 +00003751
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003752error:
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003753 /* Double-check exception status. */
Victor Stinner365b6932013-07-12 00:11:58 +02003754#ifdef NDEBUG
Victor Stinner438a12d2019-05-24 17:01:38 +02003755 if (!_PyErr_Occurred(tstate)) {
3756 _PyErr_SetString(tstate, PyExc_SystemError,
3757 "error return without exception set");
3758 }
Victor Stinner365b6932013-07-12 00:11:58 +02003759#else
Victor Stinner438a12d2019-05-24 17:01:38 +02003760 assert(_PyErr_Occurred(tstate));
Victor Stinner365b6932013-07-12 00:11:58 +02003761#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00003762
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003763 /* Log traceback info. */
3764 PyTraceBack_Here(f);
Guido van Rossumac7be682001-01-17 15:42:30 +00003765
Benjamin Peterson51f46162013-01-23 08:38:47 -05003766 if (tstate->c_tracefunc != NULL)
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003767 call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj,
3768 tstate, f);
Guido van Rossumac7be682001-01-17 15:42:30 +00003769
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003770exception_unwind:
3771 /* Unwind stacks if an exception occurred */
3772 while (f->f_iblock > 0) {
3773 /* Pop the current block. */
3774 PyTryBlock *b = &f->f_blockstack[--f->f_iblock];
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003775
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003776 if (b->b_type == EXCEPT_HANDLER) {
3777 UNWIND_EXCEPT_HANDLER(b);
3778 continue;
3779 }
3780 UNWIND_BLOCK(b);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003781 if (b->b_type == SETUP_FINALLY) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003782 PyObject *exc, *val, *tb;
3783 int handler = b->b_handler;
Mark Shannonae3087c2017-10-22 22:41:51 +01003784 _PyErr_StackItem *exc_info = tstate->exc_info;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003785 /* Beware, this invalidates all b->b_* fields */
3786 PyFrame_BlockSetup(f, EXCEPT_HANDLER, -1, STACK_LEVEL());
Mark Shannonae3087c2017-10-22 22:41:51 +01003787 PUSH(exc_info->exc_traceback);
3788 PUSH(exc_info->exc_value);
3789 if (exc_info->exc_type != NULL) {
3790 PUSH(exc_info->exc_type);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003791 }
3792 else {
3793 Py_INCREF(Py_None);
3794 PUSH(Py_None);
3795 }
Victor Stinner438a12d2019-05-24 17:01:38 +02003796 _PyErr_Fetch(tstate, &exc, &val, &tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003797 /* Make the raw exception data
3798 available to the handler,
3799 so a program can emulate the
3800 Python main loop. */
Victor Stinner438a12d2019-05-24 17:01:38 +02003801 _PyErr_NormalizeException(tstate, &exc, &val, &tb);
Victor Stinner7eab0d02013-07-15 21:16:27 +02003802 if (tb != NULL)
3803 PyException_SetTraceback(val, tb);
3804 else
3805 PyException_SetTraceback(val, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003806 Py_INCREF(exc);
Mark Shannonae3087c2017-10-22 22:41:51 +01003807 exc_info->exc_type = exc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003808 Py_INCREF(val);
Mark Shannonae3087c2017-10-22 22:41:51 +01003809 exc_info->exc_value = val;
3810 exc_info->exc_traceback = tb;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003811 if (tb == NULL)
3812 tb = Py_None;
3813 Py_INCREF(tb);
3814 PUSH(tb);
3815 PUSH(val);
3816 PUSH(exc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003817 JUMPTO(handler);
Victor Stinnerdab84232020-03-17 18:56:44 +01003818 if (_Py_TracingPossible(ceval2)) {
Pablo Galindo4c53e632020-01-10 09:24:22 +00003819 int needs_new_execution_window = (f->f_lasti < instr_lb || f->f_lasti >= instr_ub);
3820 int needs_line_update = (f->f_lasti == instr_lb || f->f_lasti < instr_prev);
3821 /* Make sure that we trace line after exception if we are in a new execution
3822 * window or we don't need a line update and we are not in the first instruction
3823 * of the line. */
3824 if (needs_new_execution_window || (!needs_line_update && instr_lb > 0)) {
3825 instr_prev = INT_MAX;
3826 }
Mark Shannonfee55262019-11-21 09:11:43 +00003827 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003828 /* Resume normal execution */
3829 goto main_loop;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003830 }
3831 } /* unwind stack */
Guido van Rossum374a9221991-04-04 10:40:29 +00003832
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003833 /* End the loop as we still have an error */
3834 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003835 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00003836
Pablo Galindof00828a2019-05-09 16:52:02 +01003837 assert(retval == NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02003838 assert(_PyErr_Occurred(tstate));
Pablo Galindof00828a2019-05-09 16:52:02 +01003839
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003840 /* Pop remaining stack entries. */
3841 while (!EMPTY()) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003842 PyObject *o = POP();
3843 Py_XDECREF(o);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003844 }
Guido van Rossum35974fb2001-12-06 21:28:18 +00003845
Mark Shannone7c9f4a2020-01-13 12:51:26 +00003846exiting:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003847 if (tstate->use_tracing) {
Benjamin Peterson51f46162013-01-23 08:38:47 -05003848 if (tstate->c_tracefunc) {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003849 if (call_trace_protected(tstate->c_tracefunc, tstate->c_traceobj,
3850 tstate, f, PyTrace_RETURN, retval)) {
3851 Py_CLEAR(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003852 }
3853 }
3854 if (tstate->c_profilefunc) {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003855 if (call_trace_protected(tstate->c_profilefunc, tstate->c_profileobj,
3856 tstate, f, PyTrace_RETURN, retval)) {
Serhiy Storchaka505ff752014-02-09 13:33:53 +02003857 Py_CLEAR(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003858 }
3859 }
3860 }
Guido van Rossuma4240131997-01-21 21:18:36 +00003861
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003862 /* pop frame */
Thomas Woutersce272b62007-09-19 21:19:28 +00003863exit_eval_frame:
Łukasz Langaa785c872016-09-09 17:37:37 -07003864 if (PyDTrace_FUNCTION_RETURN_ENABLED())
3865 dtrace_function_return(f);
Victor Stinnerbe434dc2019-11-05 00:51:22 +01003866 _Py_LeaveRecursiveCall(tstate);
Antoine Pitrou58720d62013-08-05 23:26:40 +02003867 f->f_executing = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003868 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00003869
Victor Stinner0b72b232020-03-12 23:18:39 +01003870 return _Py_CheckFunctionResult(tstate, NULL, retval, __func__);
Guido van Rossum374a9221991-04-04 10:40:29 +00003871}
3872
Benjamin Petersonb204a422011-06-05 22:04:07 -05003873static void
Victor Stinner438a12d2019-05-24 17:01:38 +02003874format_missing(PyThreadState *tstate, const char *kind,
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04003875 PyCodeObject *co, PyObject *names, PyObject *qualname)
Benjamin Petersone109c702011-06-24 09:37:26 -05003876{
3877 int err;
3878 Py_ssize_t len = PyList_GET_SIZE(names);
3879 PyObject *name_str, *comma, *tail, *tmp;
3880
3881 assert(PyList_CheckExact(names));
3882 assert(len >= 1);
3883 /* Deal with the joys of natural language. */
3884 switch (len) {
3885 case 1:
3886 name_str = PyList_GET_ITEM(names, 0);
3887 Py_INCREF(name_str);
3888 break;
3889 case 2:
3890 name_str = PyUnicode_FromFormat("%U and %U",
3891 PyList_GET_ITEM(names, len - 2),
3892 PyList_GET_ITEM(names, len - 1));
3893 break;
3894 default:
3895 tail = PyUnicode_FromFormat(", %U, and %U",
3896 PyList_GET_ITEM(names, len - 2),
3897 PyList_GET_ITEM(names, len - 1));
Benjamin Petersond1ab6082012-06-01 11:18:22 -07003898 if (tail == NULL)
3899 return;
Benjamin Petersone109c702011-06-24 09:37:26 -05003900 /* Chop off the last two objects in the list. This shouldn't actually
3901 fail, but we can't be too careful. */
3902 err = PyList_SetSlice(names, len - 2, len, NULL);
3903 if (err == -1) {
3904 Py_DECREF(tail);
3905 return;
3906 }
3907 /* Stitch everything up into a nice comma-separated list. */
3908 comma = PyUnicode_FromString(", ");
3909 if (comma == NULL) {
3910 Py_DECREF(tail);
3911 return;
3912 }
3913 tmp = PyUnicode_Join(comma, names);
3914 Py_DECREF(comma);
3915 if (tmp == NULL) {
3916 Py_DECREF(tail);
3917 return;
3918 }
3919 name_str = PyUnicode_Concat(tmp, tail);
3920 Py_DECREF(tmp);
3921 Py_DECREF(tail);
3922 break;
3923 }
3924 if (name_str == NULL)
3925 return;
Victor Stinner438a12d2019-05-24 17:01:38 +02003926 _PyErr_Format(tstate, PyExc_TypeError,
3927 "%U() missing %i required %s argument%s: %U",
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04003928 qualname,
Victor Stinner438a12d2019-05-24 17:01:38 +02003929 len,
3930 kind,
3931 len == 1 ? "" : "s",
3932 name_str);
Benjamin Petersone109c702011-06-24 09:37:26 -05003933 Py_DECREF(name_str);
3934}
3935
3936static void
Victor Stinner438a12d2019-05-24 17:01:38 +02003937missing_arguments(PyThreadState *tstate, PyCodeObject *co,
3938 Py_ssize_t missing, Py_ssize_t defcount,
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04003939 PyObject **fastlocals, PyObject *qualname)
Benjamin Petersone109c702011-06-24 09:37:26 -05003940{
Victor Stinner74319ae2016-08-25 00:04:09 +02003941 Py_ssize_t i, j = 0;
3942 Py_ssize_t start, end;
3943 int positional = (defcount != -1);
Benjamin Petersone109c702011-06-24 09:37:26 -05003944 const char *kind = positional ? "positional" : "keyword-only";
3945 PyObject *missing_names;
3946
3947 /* Compute the names of the arguments that are missing. */
3948 missing_names = PyList_New(missing);
3949 if (missing_names == NULL)
3950 return;
3951 if (positional) {
3952 start = 0;
Pablo Galindocd74e662019-06-01 18:08:04 +01003953 end = co->co_argcount - defcount;
Benjamin Petersone109c702011-06-24 09:37:26 -05003954 }
3955 else {
Pablo Galindocd74e662019-06-01 18:08:04 +01003956 start = co->co_argcount;
Benjamin Petersone109c702011-06-24 09:37:26 -05003957 end = start + co->co_kwonlyargcount;
3958 }
3959 for (i = start; i < end; i++) {
3960 if (GETLOCAL(i) == NULL) {
3961 PyObject *raw = PyTuple_GET_ITEM(co->co_varnames, i);
3962 PyObject *name = PyObject_Repr(raw);
3963 if (name == NULL) {
3964 Py_DECREF(missing_names);
3965 return;
3966 }
3967 PyList_SET_ITEM(missing_names, j++, name);
3968 }
3969 }
3970 assert(j == missing);
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04003971 format_missing(tstate, kind, co, missing_names, qualname);
Benjamin Petersone109c702011-06-24 09:37:26 -05003972 Py_DECREF(missing_names);
3973}
3974
3975static void
Victor Stinner438a12d2019-05-24 17:01:38 +02003976too_many_positional(PyThreadState *tstate, PyCodeObject *co,
3977 Py_ssize_t given, Py_ssize_t defcount,
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04003978 PyObject **fastlocals, PyObject *qualname)
Benjamin Petersonb204a422011-06-05 22:04:07 -05003979{
3980 int plural;
Victor Stinner74319ae2016-08-25 00:04:09 +02003981 Py_ssize_t kwonly_given = 0;
3982 Py_ssize_t i;
Benjamin Petersonb204a422011-06-05 22:04:07 -05003983 PyObject *sig, *kwonly_sig;
Victor Stinner74319ae2016-08-25 00:04:09 +02003984 Py_ssize_t co_argcount = co->co_argcount;
Benjamin Petersonb204a422011-06-05 22:04:07 -05003985
Benjamin Petersone109c702011-06-24 09:37:26 -05003986 assert((co->co_flags & CO_VARARGS) == 0);
3987 /* Count missing keyword-only args. */
Pablo Galindocd74e662019-06-01 18:08:04 +01003988 for (i = co_argcount; i < co_argcount + co->co_kwonlyargcount; i++) {
Victor Stinner74319ae2016-08-25 00:04:09 +02003989 if (GETLOCAL(i) != NULL) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05003990 kwonly_given++;
Victor Stinner74319ae2016-08-25 00:04:09 +02003991 }
3992 }
Benjamin Petersone109c702011-06-24 09:37:26 -05003993 if (defcount) {
Pablo Galindocd74e662019-06-01 18:08:04 +01003994 Py_ssize_t atleast = co_argcount - defcount;
Benjamin Petersonb204a422011-06-05 22:04:07 -05003995 plural = 1;
Pablo Galindocd74e662019-06-01 18:08:04 +01003996 sig = PyUnicode_FromFormat("from %zd to %zd", atleast, co_argcount);
Benjamin Petersonb204a422011-06-05 22:04:07 -05003997 }
3998 else {
Pablo Galindocd74e662019-06-01 18:08:04 +01003999 plural = (co_argcount != 1);
4000 sig = PyUnicode_FromFormat("%zd", co_argcount);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004001 }
4002 if (sig == NULL)
4003 return;
4004 if (kwonly_given) {
Victor Stinner74319ae2016-08-25 00:04:09 +02004005 const char *format = " positional argument%s (and %zd keyword-only argument%s)";
4006 kwonly_sig = PyUnicode_FromFormat(format,
4007 given != 1 ? "s" : "",
4008 kwonly_given,
4009 kwonly_given != 1 ? "s" : "");
Benjamin Petersonb204a422011-06-05 22:04:07 -05004010 if (kwonly_sig == NULL) {
4011 Py_DECREF(sig);
4012 return;
4013 }
4014 }
4015 else {
4016 /* This will not fail. */
4017 kwonly_sig = PyUnicode_FromString("");
Benjamin Petersone109c702011-06-24 09:37:26 -05004018 assert(kwonly_sig != NULL);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004019 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004020 _PyErr_Format(tstate, PyExc_TypeError,
4021 "%U() takes %U positional argument%s but %zd%U %s given",
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004022 qualname,
Victor Stinner438a12d2019-05-24 17:01:38 +02004023 sig,
4024 plural ? "s" : "",
4025 given,
4026 kwonly_sig,
4027 given == 1 && !kwonly_given ? "was" : "were");
Benjamin Petersonb204a422011-06-05 22:04:07 -05004028 Py_DECREF(sig);
4029 Py_DECREF(kwonly_sig);
4030}
4031
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004032static int
Victor Stinner438a12d2019-05-24 17:01:38 +02004033positional_only_passed_as_keyword(PyThreadState *tstate, PyCodeObject *co,
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004034 Py_ssize_t kwcount, PyObject* const* kwnames,
4035 PyObject *qualname)
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004036{
4037 int posonly_conflicts = 0;
4038 PyObject* posonly_names = PyList_New(0);
4039
4040 for(int k=0; k < co->co_posonlyargcount; k++){
4041 PyObject* posonly_name = PyTuple_GET_ITEM(co->co_varnames, k);
4042
4043 for (int k2=0; k2<kwcount; k2++){
4044 /* Compare the pointers first and fallback to PyObject_RichCompareBool*/
4045 PyObject* kwname = kwnames[k2];
4046 if (kwname == posonly_name){
4047 if(PyList_Append(posonly_names, kwname) != 0) {
4048 goto fail;
4049 }
4050 posonly_conflicts++;
4051 continue;
4052 }
4053
4054 int cmp = PyObject_RichCompareBool(posonly_name, kwname, Py_EQ);
4055
4056 if ( cmp > 0) {
4057 if(PyList_Append(posonly_names, kwname) != 0) {
4058 goto fail;
4059 }
4060 posonly_conflicts++;
4061 } else if (cmp < 0) {
4062 goto fail;
4063 }
4064
4065 }
4066 }
4067 if (posonly_conflicts) {
4068 PyObject* comma = PyUnicode_FromString(", ");
4069 if (comma == NULL) {
4070 goto fail;
4071 }
4072 PyObject* error_names = PyUnicode_Join(comma, posonly_names);
4073 Py_DECREF(comma);
4074 if (error_names == NULL) {
4075 goto fail;
4076 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004077 _PyErr_Format(tstate, PyExc_TypeError,
4078 "%U() got some positional-only arguments passed"
4079 " as keyword arguments: '%U'",
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004080 qualname, error_names);
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004081 Py_DECREF(error_names);
4082 goto fail;
4083 }
4084
4085 Py_DECREF(posonly_names);
4086 return 0;
4087
4088fail:
4089 Py_XDECREF(posonly_names);
4090 return 1;
4091
4092}
4093
Guido van Rossumc2e20742006-02-27 22:32:47 +00004094/* This is gonna seem *real weird*, but if you put some other code between
Marcel Plch3a9ccee2018-04-06 23:22:04 +02004095 PyEval_EvalFrame() and _PyEval_EvalFrameDefault() you will need to adjust
Guido van Rossumc2e20742006-02-27 22:32:47 +00004096 the test in the if statements in Misc/gdbinit (pystack and pystackv). */
Skip Montanaro786ea6b2004-03-01 15:44:05 +00004097
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01004098PyObject *
Victor Stinnerb5e170f2019-11-16 01:03:22 +01004099_PyEval_EvalCode(PyThreadState *tstate,
4100 PyObject *_co, PyObject *globals, PyObject *locals,
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02004101 PyObject *const *args, Py_ssize_t argcount,
4102 PyObject *const *kwnames, PyObject *const *kwargs,
Serhiy Storchakab7281052016-09-12 00:52:40 +03004103 Py_ssize_t kwcount, int kwstep,
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02004104 PyObject *const *defs, Py_ssize_t defcount,
Victor Stinner74319ae2016-08-25 00:04:09 +02004105 PyObject *kwdefs, PyObject *closure,
Victor Stinner40ee3012014-06-16 15:59:28 +02004106 PyObject *name, PyObject *qualname)
Tim Peters5ca576e2001-06-18 22:08:13 +00004107{
Victor Stinnerda2914d2020-03-20 09:29:08 +01004108 assert(is_tstate_valid(tstate));
Victor Stinnerb5e170f2019-11-16 01:03:22 +01004109
Victor Stinner232dda62020-06-04 15:19:02 +02004110 PyCodeObject *co = (PyCodeObject*)_co;
4111
4112 if (!name) {
4113 name = co->co_name;
4114 }
4115 assert(name != NULL);
4116 assert(PyUnicode_Check(name));
4117
4118 if (!qualname) {
4119 qualname = name;
4120 }
4121 assert(qualname != NULL);
4122 assert(PyUnicode_Check(qualname));
4123
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02004124 PyObject *retval = NULL;
Pablo Galindocd74e662019-06-01 18:08:04 +01004125 const Py_ssize_t total_args = co->co_argcount + co->co_kwonlyargcount;
Tim Peters5ca576e2001-06-18 22:08:13 +00004126
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004127 if (globals == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004128 _PyErr_SetString(tstate, PyExc_SystemError,
4129 "PyEval_EvalCodeEx: NULL globals");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004130 return NULL;
4131 }
Tim Peters5ca576e2001-06-18 22:08:13 +00004132
Victor Stinnerc7020012016-08-16 23:40:29 +02004133 /* Create the frame */
Victor Stinner232dda62020-06-04 15:19:02 +02004134 PyFrameObject *f = _PyFrame_New_NoTrack(tstate, co, globals, locals);
Victor Stinnerc7020012016-08-16 23:40:29 +02004135 if (f == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004136 return NULL;
Victor Stinnerc7020012016-08-16 23:40:29 +02004137 }
Victor Stinner232dda62020-06-04 15:19:02 +02004138 PyObject **fastlocals = f->f_localsplus;
4139 PyObject **freevars = f->f_localsplus + co->co_nlocals;
Tim Peters5ca576e2001-06-18 22:08:13 +00004140
Victor Stinnerc7020012016-08-16 23:40:29 +02004141 /* Create a dictionary for keyword parameters (**kwags) */
Victor Stinner232dda62020-06-04 15:19:02 +02004142 PyObject *kwdict;
4143 Py_ssize_t i;
Benjamin Petersonb204a422011-06-05 22:04:07 -05004144 if (co->co_flags & CO_VARKEYWORDS) {
4145 kwdict = PyDict_New();
4146 if (kwdict == NULL)
4147 goto fail;
4148 i = total_args;
Victor Stinnerc7020012016-08-16 23:40:29 +02004149 if (co->co_flags & CO_VARARGS) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004150 i++;
Victor Stinnerc7020012016-08-16 23:40:29 +02004151 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004152 SETLOCAL(i, kwdict);
4153 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004154 else {
4155 kwdict = NULL;
4156 }
4157
Pablo Galindocd74e662019-06-01 18:08:04 +01004158 /* Copy all positional arguments into local variables */
Victor Stinner232dda62020-06-04 15:19:02 +02004159 Py_ssize_t j, n;
Pablo Galindocd74e662019-06-01 18:08:04 +01004160 if (argcount > co->co_argcount) {
4161 n = co->co_argcount;
Victor Stinnerc7020012016-08-16 23:40:29 +02004162 }
4163 else {
4164 n = argcount;
4165 }
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004166 for (j = 0; j < n; j++) {
Victor Stinner232dda62020-06-04 15:19:02 +02004167 PyObject *x = args[j];
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004168 Py_INCREF(x);
4169 SETLOCAL(j, x);
4170 }
4171
Victor Stinnerc7020012016-08-16 23:40:29 +02004172 /* Pack other positional arguments into the *args argument */
Benjamin Petersonb204a422011-06-05 22:04:07 -05004173 if (co->co_flags & CO_VARARGS) {
Victor Stinner232dda62020-06-04 15:19:02 +02004174 PyObject *u = _PyTuple_FromArray(args + n, argcount - n);
Victor Stinnerc7020012016-08-16 23:40:29 +02004175 if (u == NULL) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004176 goto fail;
Victor Stinnerc7020012016-08-16 23:40:29 +02004177 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004178 SETLOCAL(total_args, u);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004179 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004180
Serhiy Storchakab7281052016-09-12 00:52:40 +03004181 /* Handle keyword arguments passed as two strided arrays */
4182 kwcount *= kwstep;
4183 for (i = 0; i < kwcount; i += kwstep) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004184 PyObject **co_varnames;
Serhiy Storchakab7281052016-09-12 00:52:40 +03004185 PyObject *keyword = kwnames[i];
4186 PyObject *value = kwargs[i];
Victor Stinner17061a92016-08-16 23:39:42 +02004187 Py_ssize_t j;
Victor Stinnerc7020012016-08-16 23:40:29 +02004188
Benjamin Petersonb204a422011-06-05 22:04:07 -05004189 if (keyword == NULL || !PyUnicode_Check(keyword)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004190 _PyErr_Format(tstate, PyExc_TypeError,
4191 "%U() keywords must be strings",
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004192 qualname);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004193 goto fail;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004194 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004195
Benjamin Petersonb204a422011-06-05 22:04:07 -05004196 /* Speed hack: do raw pointer compares. As names are
4197 normally interned this should almost always hit. */
4198 co_varnames = ((PyTupleObject *)(co->co_varnames))->ob_item;
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004199 for (j = co->co_posonlyargcount; j < total_args; j++) {
Victor Stinner232dda62020-06-04 15:19:02 +02004200 PyObject *varname = co_varnames[j];
4201 if (varname == keyword) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004202 goto kw_found;
Victor Stinner6fea7f72016-08-22 23:17:30 +02004203 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004204 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004205
Benjamin Petersonb204a422011-06-05 22:04:07 -05004206 /* Slow fallback, just in case */
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004207 for (j = co->co_posonlyargcount; j < total_args; j++) {
Victor Stinner232dda62020-06-04 15:19:02 +02004208 PyObject *varname = co_varnames[j];
4209 int cmp = PyObject_RichCompareBool( keyword, varname, Py_EQ);
Victor Stinner6fea7f72016-08-22 23:17:30 +02004210 if (cmp > 0) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004211 goto kw_found;
Victor Stinner6fea7f72016-08-22 23:17:30 +02004212 }
4213 else if (cmp < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004214 goto fail;
Victor Stinner6fea7f72016-08-22 23:17:30 +02004215 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004216 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004217
Victor Stinner231d1f32017-01-11 02:12:06 +01004218 assert(j >= total_args);
4219 if (kwdict == NULL) {
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004220
Victor Stinner438a12d2019-05-24 17:01:38 +02004221 if (co->co_posonlyargcount
4222 && positional_only_passed_as_keyword(tstate, co,
Victor Stinner232dda62020-06-04 15:19:02 +02004223 kwcount, kwnames,
4224 qualname))
Victor Stinner438a12d2019-05-24 17:01:38 +02004225 {
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004226 goto fail;
4227 }
4228
Victor Stinner438a12d2019-05-24 17:01:38 +02004229 _PyErr_Format(tstate, PyExc_TypeError,
4230 "%U() got an unexpected keyword argument '%S'",
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004231 qualname, keyword);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004232 goto fail;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004233 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004234
Christian Heimes0bd447f2013-07-20 14:48:10 +02004235 if (PyDict_SetItem(kwdict, keyword, value) == -1) {
4236 goto fail;
4237 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004238 continue;
Victor Stinnerc7020012016-08-16 23:40:29 +02004239
Benjamin Petersonb204a422011-06-05 22:04:07 -05004240 kw_found:
4241 if (GETLOCAL(j) != NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004242 _PyErr_Format(tstate, PyExc_TypeError,
4243 "%U() got multiple values for argument '%S'",
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004244 qualname, keyword);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004245 goto fail;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004246 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004247 Py_INCREF(value);
4248 SETLOCAL(j, value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004249 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004250
4251 /* Check the number of positional arguments */
Pablo Galindocd74e662019-06-01 18:08:04 +01004252 if ((argcount > co->co_argcount) && !(co->co_flags & CO_VARARGS)) {
Victor Stinner232dda62020-06-04 15:19:02 +02004253 too_many_positional(tstate, co, argcount, defcount, fastlocals,
4254 qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004255 goto fail;
4256 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004257
4258 /* Add missing positional arguments (copy default values from defs) */
Pablo Galindocd74e662019-06-01 18:08:04 +01004259 if (argcount < co->co_argcount) {
4260 Py_ssize_t m = co->co_argcount - defcount;
Victor Stinner17061a92016-08-16 23:39:42 +02004261 Py_ssize_t missing = 0;
4262 for (i = argcount; i < m; i++) {
4263 if (GETLOCAL(i) == NULL) {
Benjamin Petersone109c702011-06-24 09:37:26 -05004264 missing++;
Victor Stinner17061a92016-08-16 23:39:42 +02004265 }
4266 }
Benjamin Petersone109c702011-06-24 09:37:26 -05004267 if (missing) {
Victor Stinner232dda62020-06-04 15:19:02 +02004268 missing_arguments(tstate, co, missing, defcount, fastlocals,
4269 qualname);
Benjamin Petersone109c702011-06-24 09:37:26 -05004270 goto fail;
Benjamin Petersonb204a422011-06-05 22:04:07 -05004271 }
4272 if (n > m)
4273 i = n - m;
4274 else
4275 i = 0;
4276 for (; i < defcount; i++) {
4277 if (GETLOCAL(m+i) == NULL) {
4278 PyObject *def = defs[i];
4279 Py_INCREF(def);
4280 SETLOCAL(m+i, def);
4281 }
4282 }
4283 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004284
4285 /* Add missing keyword arguments (copy default values from kwdefs) */
Benjamin Petersonb204a422011-06-05 22:04:07 -05004286 if (co->co_kwonlyargcount > 0) {
Victor Stinner17061a92016-08-16 23:39:42 +02004287 Py_ssize_t missing = 0;
Pablo Galindocd74e662019-06-01 18:08:04 +01004288 for (i = co->co_argcount; i < total_args; i++) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004289 if (GETLOCAL(i) != NULL)
4290 continue;
Victor Stinner232dda62020-06-04 15:19:02 +02004291 PyObject *varname = PyTuple_GET_ITEM(co->co_varnames, i);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004292 if (kwdefs != NULL) {
Victor Stinner232dda62020-06-04 15:19:02 +02004293 PyObject *def = PyDict_GetItemWithError(kwdefs, varname);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004294 if (def) {
4295 Py_INCREF(def);
4296 SETLOCAL(i, def);
4297 continue;
4298 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004299 else if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02004300 goto fail;
4301 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004302 }
Benjamin Petersone109c702011-06-24 09:37:26 -05004303 missing++;
4304 }
4305 if (missing) {
Victor Stinner232dda62020-06-04 15:19:02 +02004306 missing_arguments(tstate, co, missing, -1, fastlocals,
4307 qualname);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004308 goto fail;
4309 }
4310 }
4311
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004312 /* Allocate and initialize storage for cell vars, and copy free
Benjamin Peterson90037602011-06-25 22:54:45 -05004313 vars into frame. */
4314 for (i = 0; i < PyTuple_GET_SIZE(co->co_cellvars); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004315 PyObject *c;
Serhiy Storchaka5bb8b912016-12-16 19:19:02 +02004316 Py_ssize_t arg;
Benjamin Peterson90037602011-06-25 22:54:45 -05004317 /* Possibly account for the cell variable being an argument. */
4318 if (co->co_cell2arg != NULL &&
Guido van Rossum6832c812013-05-10 08:47:42 -07004319 (arg = co->co_cell2arg[i]) != CO_CELL_NOT_AN_ARG) {
Benjamin Peterson90037602011-06-25 22:54:45 -05004320 c = PyCell_New(GETLOCAL(arg));
Benjamin Peterson159ae412013-05-12 18:16:06 -05004321 /* Clear the local copy. */
4322 SETLOCAL(arg, NULL);
Guido van Rossum6832c812013-05-10 08:47:42 -07004323 }
4324 else {
Benjamin Peterson90037602011-06-25 22:54:45 -05004325 c = PyCell_New(NULL);
Guido van Rossum6832c812013-05-10 08:47:42 -07004326 }
Benjamin Peterson159ae412013-05-12 18:16:06 -05004327 if (c == NULL)
4328 goto fail;
Benjamin Peterson90037602011-06-25 22:54:45 -05004329 SETLOCAL(co->co_nlocals + i, c);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004330 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004331
4332 /* Copy closure variables to free variables */
Benjamin Peterson90037602011-06-25 22:54:45 -05004333 for (i = 0; i < PyTuple_GET_SIZE(co->co_freevars); ++i) {
4334 PyObject *o = PyTuple_GET_ITEM(closure, i);
4335 Py_INCREF(o);
4336 freevars[PyTuple_GET_SIZE(co->co_cellvars) + i] = o;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004337 }
Tim Peters5ca576e2001-06-18 22:08:13 +00004338
Yury Selivanoveb636452016-09-08 22:01:51 -07004339 /* Handle generator/coroutine/asynchronous generator */
4340 if (co->co_flags & (CO_GENERATOR | CO_COROUTINE | CO_ASYNC_GENERATOR)) {
Yury Selivanov75445082015-05-11 22:57:16 -04004341 PyObject *gen;
Yury Selivanov5376ba92015-06-22 12:19:30 -04004342 int is_coro = co->co_flags & CO_COROUTINE;
Yury Selivanov94c22632015-06-04 10:16:51 -04004343
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004344 /* Don't need to keep the reference to f_back, it will be set
4345 * when the generator is resumed. */
Serhiy Storchaka505ff752014-02-09 13:33:53 +02004346 Py_CLEAR(f->f_back);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00004347
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004348 /* Create a new generator that owns the ready to run frame
4349 * and return that as the value. */
Yury Selivanov5376ba92015-06-22 12:19:30 -04004350 if (is_coro) {
4351 gen = PyCoro_New(f, name, qualname);
Yury Selivanoveb636452016-09-08 22:01:51 -07004352 } else if (co->co_flags & CO_ASYNC_GENERATOR) {
4353 gen = PyAsyncGen_New(f, name, qualname);
Yury Selivanov5376ba92015-06-22 12:19:30 -04004354 } else {
4355 gen = PyGen_NewWithQualName(f, name, qualname);
4356 }
INADA Naoki6a3cedf2016-12-26 18:01:46 +09004357 if (gen == NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04004358 return NULL;
INADA Naoki6a3cedf2016-12-26 18:01:46 +09004359 }
INADA Naoki9c157762016-12-26 18:52:46 +09004360
INADA Naoki6a3cedf2016-12-26 18:01:46 +09004361 _PyObject_GC_TRACK(f);
Yury Selivanov75445082015-05-11 22:57:16 -04004362
Yury Selivanov75445082015-05-11 22:57:16 -04004363 return gen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004364 }
Tim Peters5ca576e2001-06-18 22:08:13 +00004365
Victor Stinnerb9e68122019-11-14 12:20:46 +01004366 retval = _PyEval_EvalFrame(tstate, f, 0);
Tim Peters5ca576e2001-06-18 22:08:13 +00004367
Thomas Woutersce272b62007-09-19 21:19:28 +00004368fail: /* Jump here from prelude on failure */
Tim Peters5ca576e2001-06-18 22:08:13 +00004369
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004370 /* decref'ing the frame can cause __del__ methods to get invoked,
4371 which can call back into Python. While we're done with the
4372 current Python frame (f), the associated C stack is still in use,
4373 so recursion_depth must be boosted for the duration.
4374 */
INADA Naoki5a625d02016-12-24 20:19:08 +09004375 if (Py_REFCNT(f) > 1) {
4376 Py_DECREF(f);
4377 _PyObject_GC_TRACK(f);
4378 }
4379 else {
4380 ++tstate->recursion_depth;
4381 Py_DECREF(f);
4382 --tstate->recursion_depth;
4383 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004384 return retval;
Tim Peters5ca576e2001-06-18 22:08:13 +00004385}
4386
Victor Stinnerb5e170f2019-11-16 01:03:22 +01004387
4388PyObject *
4389_PyEval_EvalCodeWithName(PyObject *_co, PyObject *globals, PyObject *locals,
4390 PyObject *const *args, Py_ssize_t argcount,
4391 PyObject *const *kwnames, PyObject *const *kwargs,
4392 Py_ssize_t kwcount, int kwstep,
4393 PyObject *const *defs, Py_ssize_t defcount,
4394 PyObject *kwdefs, PyObject *closure,
4395 PyObject *name, PyObject *qualname)
4396{
4397 PyThreadState *tstate = _PyThreadState_GET();
4398 return _PyEval_EvalCode(tstate, _co, globals, locals,
4399 args, argcount,
4400 kwnames, kwargs,
4401 kwcount, kwstep,
4402 defs, defcount,
4403 kwdefs, closure,
4404 name, qualname);
4405}
4406
Victor Stinner40ee3012014-06-16 15:59:28 +02004407PyObject *
4408PyEval_EvalCodeEx(PyObject *_co, PyObject *globals, PyObject *locals,
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02004409 PyObject *const *args, int argcount,
4410 PyObject *const *kws, int kwcount,
4411 PyObject *const *defs, int defcount,
4412 PyObject *kwdefs, PyObject *closure)
Victor Stinner40ee3012014-06-16 15:59:28 +02004413{
4414 return _PyEval_EvalCodeWithName(_co, globals, locals,
Victor Stinner9be7e7b2016-08-19 16:11:43 +02004415 args, argcount,
Zackery Spytzc6ea8972017-07-31 08:24:37 -06004416 kws, kws != NULL ? kws + 1 : NULL,
4417 kwcount, 2,
Victor Stinner9be7e7b2016-08-19 16:11:43 +02004418 defs, defcount,
4419 kwdefs, closure,
Victor Stinner40ee3012014-06-16 15:59:28 +02004420 NULL, NULL);
4421}
Tim Peters5ca576e2001-06-18 22:08:13 +00004422
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004423static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02004424special_lookup(PyThreadState *tstate, PyObject *o, _Py_Identifier *id)
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004425{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004426 PyObject *res;
Benjamin Petersonce798522012-01-22 11:24:29 -05004427 res = _PyObject_LookupSpecial(o, id);
Victor Stinner438a12d2019-05-24 17:01:38 +02004428 if (res == NULL && !_PyErr_Occurred(tstate)) {
Victor Stinner4804b5b2020-05-12 01:43:38 +02004429 _PyErr_SetObject(tstate, PyExc_AttributeError, _PyUnicode_FromId(id));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004430 return NULL;
4431 }
4432 return res;
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004433}
4434
4435
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00004436/* Logic for the raise statement (too complicated for inlining).
4437 This *consumes* a reference count to each of its arguments. */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004438static int
Victor Stinner09532fe2019-05-10 23:39:09 +02004439do_raise(PyThreadState *tstate, PyObject *exc, PyObject *cause)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00004440{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004441 PyObject *type = NULL, *value = NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00004442
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004443 if (exc == NULL) {
4444 /* Reraise */
Mark Shannonae3087c2017-10-22 22:41:51 +01004445 _PyErr_StackItem *exc_info = _PyErr_GetTopmostException(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004446 PyObject *tb;
Mark Shannonae3087c2017-10-22 22:41:51 +01004447 type = exc_info->exc_type;
4448 value = exc_info->exc_value;
4449 tb = exc_info->exc_traceback;
Victor Stinnereec93312016-08-18 18:13:10 +02004450 if (type == Py_None || type == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004451 _PyErr_SetString(tstate, PyExc_RuntimeError,
4452 "No active exception to reraise");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004453 return 0;
4454 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004455 Py_XINCREF(type);
4456 Py_XINCREF(value);
4457 Py_XINCREF(tb);
Victor Stinner438a12d2019-05-24 17:01:38 +02004458 _PyErr_Restore(tstate, type, value, tb);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004459 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004460 }
Guido van Rossumac7be682001-01-17 15:42:30 +00004461
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004462 /* We support the following forms of raise:
4463 raise
Collin Winter828f04a2007-08-31 00:04:24 +00004464 raise <instance>
4465 raise <type> */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00004466
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004467 if (PyExceptionClass_Check(exc)) {
4468 type = exc;
Victor Stinnera5ed5f02016-12-06 18:45:50 +01004469 value = _PyObject_CallNoArg(exc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004470 if (value == NULL)
4471 goto raise_error;
Benjamin Peterson5afa03a2011-07-15 14:09:26 -05004472 if (!PyExceptionInstance_Check(value)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004473 _PyErr_Format(tstate, PyExc_TypeError,
4474 "calling %R should have returned an instance of "
4475 "BaseException, not %R",
4476 type, Py_TYPE(value));
4477 goto raise_error;
Benjamin Peterson5afa03a2011-07-15 14:09:26 -05004478 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004479 }
4480 else if (PyExceptionInstance_Check(exc)) {
4481 value = exc;
4482 type = PyExceptionInstance_Class(exc);
4483 Py_INCREF(type);
4484 }
4485 else {
4486 /* Not something you can raise. You get an exception
4487 anyway, just not what you specified :-) */
4488 Py_DECREF(exc);
Victor Stinner438a12d2019-05-24 17:01:38 +02004489 _PyErr_SetString(tstate, PyExc_TypeError,
4490 "exceptions must derive from BaseException");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004491 goto raise_error;
4492 }
Collin Winter828f04a2007-08-31 00:04:24 +00004493
Serhiy Storchakac0191582016-09-27 11:37:10 +03004494 assert(type != NULL);
4495 assert(value != NULL);
4496
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004497 if (cause) {
4498 PyObject *fixed_cause;
4499 if (PyExceptionClass_Check(cause)) {
Victor Stinnera5ed5f02016-12-06 18:45:50 +01004500 fixed_cause = _PyObject_CallNoArg(cause);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004501 if (fixed_cause == NULL)
4502 goto raise_error;
Benjamin Petersond5a1c442012-05-14 22:09:31 -07004503 Py_DECREF(cause);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004504 }
Benjamin Petersond5a1c442012-05-14 22:09:31 -07004505 else if (PyExceptionInstance_Check(cause)) {
4506 fixed_cause = cause;
4507 }
4508 else if (cause == Py_None) {
4509 Py_DECREF(cause);
4510 fixed_cause = NULL;
4511 }
4512 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02004513 _PyErr_SetString(tstate, PyExc_TypeError,
4514 "exception causes must derive from "
4515 "BaseException");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004516 goto raise_error;
4517 }
Benjamin Petersond5a1c442012-05-14 22:09:31 -07004518 PyException_SetCause(value, fixed_cause);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004519 }
Collin Winter828f04a2007-08-31 00:04:24 +00004520
Victor Stinner438a12d2019-05-24 17:01:38 +02004521 _PyErr_SetObject(tstate, type, value);
Victor Stinner61f4db82020-01-28 03:37:45 +01004522 /* _PyErr_SetObject incref's its arguments */
Serhiy Storchakac0191582016-09-27 11:37:10 +03004523 Py_DECREF(value);
4524 Py_DECREF(type);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004525 return 0;
Collin Winter828f04a2007-08-31 00:04:24 +00004526
4527raise_error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004528 Py_XDECREF(value);
4529 Py_XDECREF(type);
4530 Py_XDECREF(cause);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004531 return 0;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00004532}
4533
Tim Petersd6d010b2001-06-21 02:49:55 +00004534/* Iterate v argcnt times and store the results on the stack (via decreasing
Guido van Rossum0368b722007-05-11 16:50:42 +00004535 sp). Return 1 for success, 0 if error.
Antoine Pitrou9a2310d2008-07-25 22:39:39 +00004536
Guido van Rossum0368b722007-05-11 16:50:42 +00004537 If argcntafter == -1, do a simple unpack. If it is >= 0, do an unpack
4538 with a variable target.
4539*/
Tim Petersd6d010b2001-06-21 02:49:55 +00004540
Barry Warsawe42b18f1997-08-25 22:13:04 +00004541static int
Victor Stinner438a12d2019-05-24 17:01:38 +02004542unpack_iterable(PyThreadState *tstate, PyObject *v,
4543 int argcnt, int argcntafter, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00004544{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004545 int i = 0, j = 0;
4546 Py_ssize_t ll = 0;
4547 PyObject *it; /* iter(v) */
4548 PyObject *w;
4549 PyObject *l = NULL; /* variable list */
Guido van Rossumac7be682001-01-17 15:42:30 +00004550
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004551 assert(v != NULL);
Tim Petersd6d010b2001-06-21 02:49:55 +00004552
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004553 it = PyObject_GetIter(v);
Serhiy Storchaka13a6c092017-12-26 12:30:41 +02004554 if (it == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004555 if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError) &&
Victor Stinnera102ed72020-02-07 02:24:48 +01004556 Py_TYPE(v)->tp_iter == NULL && !PySequence_Check(v))
Serhiy Storchaka13a6c092017-12-26 12:30:41 +02004557 {
Victor Stinner438a12d2019-05-24 17:01:38 +02004558 _PyErr_Format(tstate, PyExc_TypeError,
4559 "cannot unpack non-iterable %.200s object",
Victor Stinnera102ed72020-02-07 02:24:48 +01004560 Py_TYPE(v)->tp_name);
Serhiy Storchaka13a6c092017-12-26 12:30:41 +02004561 }
4562 return 0;
4563 }
Tim Petersd6d010b2001-06-21 02:49:55 +00004564
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004565 for (; i < argcnt; i++) {
4566 w = PyIter_Next(it);
4567 if (w == NULL) {
4568 /* Iterator done, via error or exhaustion. */
Victor Stinner438a12d2019-05-24 17:01:38 +02004569 if (!_PyErr_Occurred(tstate)) {
R David Murray4171bbe2015-04-15 17:08:45 -04004570 if (argcntafter == -1) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004571 _PyErr_Format(tstate, PyExc_ValueError,
4572 "not enough values to unpack "
4573 "(expected %d, got %d)",
4574 argcnt, i);
R David Murray4171bbe2015-04-15 17:08:45 -04004575 }
4576 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02004577 _PyErr_Format(tstate, PyExc_ValueError,
4578 "not enough values to unpack "
4579 "(expected at least %d, got %d)",
4580 argcnt + argcntafter, i);
R David Murray4171bbe2015-04-15 17:08:45 -04004581 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004582 }
4583 goto Error;
4584 }
4585 *--sp = w;
4586 }
Tim Petersd6d010b2001-06-21 02:49:55 +00004587
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004588 if (argcntafter == -1) {
4589 /* We better have exhausted the iterator now. */
4590 w = PyIter_Next(it);
4591 if (w == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004592 if (_PyErr_Occurred(tstate))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004593 goto Error;
4594 Py_DECREF(it);
4595 return 1;
4596 }
4597 Py_DECREF(w);
Victor Stinner438a12d2019-05-24 17:01:38 +02004598 _PyErr_Format(tstate, PyExc_ValueError,
4599 "too many values to unpack (expected %d)",
4600 argcnt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004601 goto Error;
4602 }
Guido van Rossum0368b722007-05-11 16:50:42 +00004603
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004604 l = PySequence_List(it);
4605 if (l == NULL)
4606 goto Error;
4607 *--sp = l;
4608 i++;
Guido van Rossum0368b722007-05-11 16:50:42 +00004609
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004610 ll = PyList_GET_SIZE(l);
4611 if (ll < argcntafter) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004612 _PyErr_Format(tstate, PyExc_ValueError,
R David Murray4171bbe2015-04-15 17:08:45 -04004613 "not enough values to unpack (expected at least %d, got %zd)",
4614 argcnt + argcntafter, argcnt + ll);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004615 goto Error;
4616 }
Guido van Rossum0368b722007-05-11 16:50:42 +00004617
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004618 /* Pop the "after-variable" args off the list. */
4619 for (j = argcntafter; j > 0; j--, i++) {
4620 *--sp = PyList_GET_ITEM(l, ll - j);
4621 }
4622 /* Resize the list. */
Victor Stinner60ac6ed2020-02-07 23:18:08 +01004623 Py_SET_SIZE(l, ll - argcntafter);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004624 Py_DECREF(it);
4625 return 1;
Guido van Rossum0368b722007-05-11 16:50:42 +00004626
Tim Petersd6d010b2001-06-21 02:49:55 +00004627Error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004628 for (; i > 0; i--, sp++)
4629 Py_DECREF(*sp);
4630 Py_XDECREF(it);
4631 return 0;
Barry Warsawe42b18f1997-08-25 22:13:04 +00004632}
4633
4634
Guido van Rossum96a42c81992-01-12 02:29:51 +00004635#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00004636static int
Victor Stinner438a12d2019-05-24 17:01:38 +02004637prtrace(PyThreadState *tstate, PyObject *v, const char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004638{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004639 printf("%s ", str);
Victor Stinner438a12d2019-05-24 17:01:38 +02004640 if (PyObject_Print(v, stdout, 0) != 0) {
4641 /* Don't know what else to do */
4642 _PyErr_Clear(tstate);
4643 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004644 printf("\n");
4645 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004646}
Guido van Rossum3f5da241990-12-20 15:06:42 +00004647#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004648
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00004649static void
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004650call_exc_trace(Py_tracefunc func, PyObject *self,
4651 PyThreadState *tstate, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00004652{
Victor Stinneraaa8ed82013-07-10 13:57:55 +02004653 PyObject *type, *value, *traceback, *orig_traceback, *arg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004654 int err;
Victor Stinner438a12d2019-05-24 17:01:38 +02004655 _PyErr_Fetch(tstate, &type, &value, &orig_traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004656 if (value == NULL) {
4657 value = Py_None;
4658 Py_INCREF(value);
4659 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004660 _PyErr_NormalizeException(tstate, &type, &value, &orig_traceback);
Antoine Pitrou89335212013-11-23 14:05:23 +01004661 traceback = (orig_traceback != NULL) ? orig_traceback : Py_None;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004662 arg = PyTuple_Pack(3, type, value, traceback);
4663 if (arg == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004664 _PyErr_Restore(tstate, type, value, orig_traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004665 return;
4666 }
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004667 err = call_trace(func, self, tstate, f, PyTrace_EXCEPTION, arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004668 Py_DECREF(arg);
Victor Stinner438a12d2019-05-24 17:01:38 +02004669 if (err == 0) {
4670 _PyErr_Restore(tstate, type, value, orig_traceback);
4671 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004672 else {
4673 Py_XDECREF(type);
4674 Py_XDECREF(value);
Victor Stinneraaa8ed82013-07-10 13:57:55 +02004675 Py_XDECREF(orig_traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004676 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00004677}
4678
Amaury Forgeot d'Arcf05149a2007-11-13 01:05:30 +00004679static int
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004680call_trace_protected(Py_tracefunc func, PyObject *obj,
4681 PyThreadState *tstate, PyFrameObject *frame,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004682 int what, PyObject *arg)
Fred Drake4ec5d562001-10-04 19:26:43 +00004683{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004684 PyObject *type, *value, *traceback;
4685 int err;
Victor Stinner438a12d2019-05-24 17:01:38 +02004686 _PyErr_Fetch(tstate, &type, &value, &traceback);
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004687 err = call_trace(func, obj, tstate, frame, what, arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004688 if (err == 0)
4689 {
Victor Stinner438a12d2019-05-24 17:01:38 +02004690 _PyErr_Restore(tstate, type, value, traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004691 return 0;
4692 }
4693 else {
4694 Py_XDECREF(type);
4695 Py_XDECREF(value);
4696 Py_XDECREF(traceback);
4697 return -1;
4698 }
Fred Drake4ec5d562001-10-04 19:26:43 +00004699}
4700
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00004701static int
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004702call_trace(Py_tracefunc func, PyObject *obj,
4703 PyThreadState *tstate, PyFrameObject *frame,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004704 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00004705{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004706 int result;
4707 if (tstate->tracing)
4708 return 0;
4709 tstate->tracing++;
4710 tstate->use_tracing = 0;
4711 result = func(obj, frame, what, arg);
4712 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
4713 || (tstate->c_profilefunc != NULL));
4714 tstate->tracing--;
4715 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00004716}
4717
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00004718PyObject *
4719_PyEval_CallTracing(PyObject *func, PyObject *args)
4720{
Victor Stinner50b48572018-11-01 01:51:40 +01004721 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004722 int save_tracing = tstate->tracing;
4723 int save_use_tracing = tstate->use_tracing;
4724 PyObject *result;
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00004725
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004726 tstate->tracing = 0;
4727 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
4728 || (tstate->c_profilefunc != NULL));
4729 result = PyObject_Call(func, args, NULL);
4730 tstate->tracing = save_tracing;
4731 tstate->use_tracing = save_use_tracing;
4732 return result;
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00004733}
4734
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00004735/* See Objects/lnotab_notes.txt for a description of how tracing works. */
Michael W. Hudson006c7522002-11-08 13:08:46 +00004736static int
Tim Peters8a5c3c72004-04-05 19:36:21 +00004737maybe_call_line_trace(Py_tracefunc func, PyObject *obj,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004738 PyThreadState *tstate, PyFrameObject *frame,
4739 int *instr_lb, int *instr_ub, int *instr_prev)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004740{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004741 int result = 0;
4742 int line = frame->f_lineno;
Michael W. Hudson006c7522002-11-08 13:08:46 +00004743
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004744 /* If the last instruction executed isn't in the current
4745 instruction window, reset the window.
4746 */
4747 if (frame->f_lasti < *instr_lb || frame->f_lasti >= *instr_ub) {
4748 PyAddrPair bounds;
4749 line = _PyCode_CheckLineNumber(frame->f_code, frame->f_lasti,
4750 &bounds);
4751 *instr_lb = bounds.ap_lower;
4752 *instr_ub = bounds.ap_upper;
4753 }
Nick Coghlan5a851672017-09-08 10:14:16 +10004754 /* If the last instruction falls at the start of a line or if it
4755 represents a jump backwards, update the frame's line number and
4756 then call the trace function if we're tracing source lines.
4757 */
4758 if ((frame->f_lasti == *instr_lb || frame->f_lasti < *instr_prev)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004759 frame->f_lineno = line;
Nick Coghlan5a851672017-09-08 10:14:16 +10004760 if (frame->f_trace_lines) {
4761 result = call_trace(func, obj, tstate, frame, PyTrace_LINE, Py_None);
4762 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004763 }
George King20faa682017-10-18 17:44:22 -07004764 /* Always emit an opcode event if we're tracing all opcodes. */
4765 if (frame->f_trace_opcodes) {
4766 result = call_trace(func, obj, tstate, frame, PyTrace_OPCODE, Py_None);
4767 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004768 *instr_prev = frame->f_lasti;
4769 return result;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004770}
4771
Victor Stinner309d7cc2020-03-13 16:39:12 +01004772int
4773_PyEval_SetProfile(PyThreadState *tstate, Py_tracefunc func, PyObject *arg)
4774{
Victor Stinnerda2914d2020-03-20 09:29:08 +01004775 assert(is_tstate_valid(tstate));
Victor Stinner309d7cc2020-03-13 16:39:12 +01004776 /* The caller must hold the GIL */
4777 assert(PyGILState_Check());
4778
Victor Stinner1c1e68c2020-03-27 15:11:45 +01004779 /* Call _PySys_Audit() in the context of the current thread state,
Victor Stinner309d7cc2020-03-13 16:39:12 +01004780 even if tstate is not the current thread state. */
Victor Stinner1c1e68c2020-03-27 15:11:45 +01004781 PyThreadState *current_tstate = _PyThreadState_GET();
4782 if (_PySys_Audit(current_tstate, "sys.setprofile", NULL) < 0) {
Victor Stinner309d7cc2020-03-13 16:39:12 +01004783 return -1;
4784 }
4785
4786 PyObject *profileobj = tstate->c_profileobj;
4787
4788 tstate->c_profilefunc = NULL;
4789 tstate->c_profileobj = NULL;
4790 /* Must make sure that tracing is not ignored if 'profileobj' is freed */
4791 tstate->use_tracing = tstate->c_tracefunc != NULL;
4792 Py_XDECREF(profileobj);
4793
4794 Py_XINCREF(arg);
4795 tstate->c_profileobj = arg;
4796 tstate->c_profilefunc = func;
4797
4798 /* Flag that tracing or profiling is turned on */
4799 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
4800 return 0;
4801}
4802
Fred Drake5755ce62001-06-27 19:19:46 +00004803void
4804PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00004805{
Victor Stinner309d7cc2020-03-13 16:39:12 +01004806 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerf6a58502020-03-16 17:41:44 +01004807 if (_PyEval_SetProfile(tstate, func, arg) < 0) {
Victor Stinner1c1e68c2020-03-27 15:11:45 +01004808 /* Log _PySys_Audit() error */
Victor Stinnerf6a58502020-03-16 17:41:44 +01004809 _PyErr_WriteUnraisableMsg("in PyEval_SetProfile", NULL);
4810 }
Victor Stinner309d7cc2020-03-13 16:39:12 +01004811}
4812
4813int
4814_PyEval_SetTrace(PyThreadState *tstate, Py_tracefunc func, PyObject *arg)
4815{
Victor Stinnerda2914d2020-03-20 09:29:08 +01004816 assert(is_tstate_valid(tstate));
Victor Stinner309d7cc2020-03-13 16:39:12 +01004817 /* The caller must hold the GIL */
4818 assert(PyGILState_Check());
4819
Victor Stinner1c1e68c2020-03-27 15:11:45 +01004820 /* Call _PySys_Audit() in the context of the current thread state,
Victor Stinner309d7cc2020-03-13 16:39:12 +01004821 even if tstate is not the current thread state. */
Victor Stinner1c1e68c2020-03-27 15:11:45 +01004822 PyThreadState *current_tstate = _PyThreadState_GET();
4823 if (_PySys_Audit(current_tstate, "sys.settrace", NULL) < 0) {
Victor Stinner309d7cc2020-03-13 16:39:12 +01004824 return -1;
Steve Dowerb82e17e2019-05-23 08:45:22 -07004825 }
4826
Victor Stinnerda2914d2020-03-20 09:29:08 +01004827 struct _ceval_state *ceval2 = &tstate->interp->ceval;
Victor Stinner309d7cc2020-03-13 16:39:12 +01004828 PyObject *traceobj = tstate->c_traceobj;
Victor Stinnerda2914d2020-03-20 09:29:08 +01004829 ceval2->tracing_possible += (func != NULL) - (tstate->c_tracefunc != NULL);
Victor Stinner309d7cc2020-03-13 16:39:12 +01004830
4831 tstate->c_tracefunc = NULL;
4832 tstate->c_traceobj = NULL;
4833 /* Must make sure that profiling is not ignored if 'traceobj' is freed */
4834 tstate->use_tracing = (tstate->c_profilefunc != NULL);
4835 Py_XDECREF(traceobj);
4836
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004837 Py_XINCREF(arg);
Victor Stinner309d7cc2020-03-13 16:39:12 +01004838 tstate->c_traceobj = arg;
4839 tstate->c_tracefunc = func;
4840
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004841 /* Flag that tracing or profiling is turned on */
Victor Stinner309d7cc2020-03-13 16:39:12 +01004842 tstate->use_tracing = ((func != NULL)
4843 || (tstate->c_profilefunc != NULL));
4844
4845 return 0;
Fred Drake5755ce62001-06-27 19:19:46 +00004846}
4847
4848void
4849PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
4850{
Victor Stinner309d7cc2020-03-13 16:39:12 +01004851 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerf6a58502020-03-16 17:41:44 +01004852 if (_PyEval_SetTrace(tstate, func, arg) < 0) {
Victor Stinner1c1e68c2020-03-27 15:11:45 +01004853 /* Log _PySys_Audit() error */
Victor Stinnerf6a58502020-03-16 17:41:44 +01004854 _PyErr_WriteUnraisableMsg("in PyEval_SetTrace", NULL);
4855 }
Fred Draked0838392001-06-16 21:02:31 +00004856}
4857
Victor Stinner309d7cc2020-03-13 16:39:12 +01004858
Yury Selivanov75445082015-05-11 22:57:16 -04004859void
Victor Stinner838f2642019-06-13 22:41:23 +02004860_PyEval_SetCoroutineOriginTrackingDepth(PyThreadState *tstate, int new_depth)
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08004861{
4862 assert(new_depth >= 0);
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08004863 tstate->coroutine_origin_tracking_depth = new_depth;
4864}
4865
4866int
4867_PyEval_GetCoroutineOriginTrackingDepth(void)
4868{
Victor Stinner50b48572018-11-01 01:51:40 +01004869 PyThreadState *tstate = _PyThreadState_GET();
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08004870 return tstate->coroutine_origin_tracking_depth;
4871}
4872
Zackery Spytz79ceccd2020-03-26 06:11:13 -06004873int
Yury Selivanoveb636452016-09-08 22:01:51 -07004874_PyEval_SetAsyncGenFirstiter(PyObject *firstiter)
4875{
Victor Stinner50b48572018-11-01 01:51:40 +01004876 PyThreadState *tstate = _PyThreadState_GET();
Steve Dowerb82e17e2019-05-23 08:45:22 -07004877
Victor Stinner1c1e68c2020-03-27 15:11:45 +01004878 if (_PySys_Audit(tstate, "sys.set_asyncgen_hook_firstiter", NULL) < 0) {
Zackery Spytz79ceccd2020-03-26 06:11:13 -06004879 return -1;
Steve Dowerb82e17e2019-05-23 08:45:22 -07004880 }
4881
Yury Selivanoveb636452016-09-08 22:01:51 -07004882 Py_XINCREF(firstiter);
4883 Py_XSETREF(tstate->async_gen_firstiter, firstiter);
Zackery Spytz79ceccd2020-03-26 06:11:13 -06004884 return 0;
Yury Selivanoveb636452016-09-08 22:01:51 -07004885}
4886
4887PyObject *
4888_PyEval_GetAsyncGenFirstiter(void)
4889{
Victor Stinner50b48572018-11-01 01:51:40 +01004890 PyThreadState *tstate = _PyThreadState_GET();
Yury Selivanoveb636452016-09-08 22:01:51 -07004891 return tstate->async_gen_firstiter;
4892}
4893
Zackery Spytz79ceccd2020-03-26 06:11:13 -06004894int
Yury Selivanoveb636452016-09-08 22:01:51 -07004895_PyEval_SetAsyncGenFinalizer(PyObject *finalizer)
4896{
Victor Stinner50b48572018-11-01 01:51:40 +01004897 PyThreadState *tstate = _PyThreadState_GET();
Steve Dowerb82e17e2019-05-23 08:45:22 -07004898
Victor Stinner1c1e68c2020-03-27 15:11:45 +01004899 if (_PySys_Audit(tstate, "sys.set_asyncgen_hook_finalizer", NULL) < 0) {
Zackery Spytz79ceccd2020-03-26 06:11:13 -06004900 return -1;
Steve Dowerb82e17e2019-05-23 08:45:22 -07004901 }
4902
Yury Selivanoveb636452016-09-08 22:01:51 -07004903 Py_XINCREF(finalizer);
4904 Py_XSETREF(tstate->async_gen_finalizer, finalizer);
Zackery Spytz79ceccd2020-03-26 06:11:13 -06004905 return 0;
Yury Selivanoveb636452016-09-08 22:01:51 -07004906}
4907
4908PyObject *
4909_PyEval_GetAsyncGenFinalizer(void)
4910{
Victor Stinner50b48572018-11-01 01:51:40 +01004911 PyThreadState *tstate = _PyThreadState_GET();
Yury Selivanoveb636452016-09-08 22:01:51 -07004912 return tstate->async_gen_finalizer;
4913}
4914
Victor Stinner438a12d2019-05-24 17:01:38 +02004915PyFrameObject *
4916PyEval_GetFrame(void)
4917{
4918 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner6723e932020-03-20 17:46:56 +01004919 return tstate->frame;
Victor Stinner438a12d2019-05-24 17:01:38 +02004920}
4921
Guido van Rossumb209a111997-04-29 18:18:01 +00004922PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004923PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00004924{
Victor Stinner438a12d2019-05-24 17:01:38 +02004925 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner6723e932020-03-20 17:46:56 +01004926 PyFrameObject *current_frame = tstate->frame;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004927 if (current_frame == NULL)
Victor Stinner438a12d2019-05-24 17:01:38 +02004928 return tstate->interp->builtins;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004929 else
4930 return current_frame->f_builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00004931}
4932
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02004933/* Convenience function to get a builtin from its name */
4934PyObject *
4935_PyEval_GetBuiltinId(_Py_Identifier *name)
4936{
Victor Stinner438a12d2019-05-24 17:01:38 +02004937 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02004938 PyObject *attr = _PyDict_GetItemIdWithError(PyEval_GetBuiltins(), name);
4939 if (attr) {
4940 Py_INCREF(attr);
4941 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004942 else if (!_PyErr_Occurred(tstate)) {
4943 _PyErr_SetObject(tstate, PyExc_AttributeError, _PyUnicode_FromId(name));
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02004944 }
4945 return attr;
4946}
4947
Guido van Rossumb209a111997-04-29 18:18:01 +00004948PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004949PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00004950{
Victor Stinner438a12d2019-05-24 17:01:38 +02004951 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner6723e932020-03-20 17:46:56 +01004952 PyFrameObject *current_frame = tstate->frame;
Victor Stinner41bb43a2013-10-29 01:19:37 +01004953 if (current_frame == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004954 _PyErr_SetString(tstate, PyExc_SystemError, "frame does not exist");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004955 return NULL;
Victor Stinner41bb43a2013-10-29 01:19:37 +01004956 }
4957
Victor Stinner438a12d2019-05-24 17:01:38 +02004958 if (PyFrame_FastToLocalsWithError(current_frame) < 0) {
Victor Stinner41bb43a2013-10-29 01:19:37 +01004959 return NULL;
Victor Stinner438a12d2019-05-24 17:01:38 +02004960 }
Victor Stinner41bb43a2013-10-29 01:19:37 +01004961
4962 assert(current_frame->f_locals != NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004963 return current_frame->f_locals;
Guido van Rossum5b722181993-03-30 17:46:03 +00004964}
4965
Guido van Rossumb209a111997-04-29 18:18:01 +00004966PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004967PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00004968{
Victor Stinner438a12d2019-05-24 17:01:38 +02004969 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner6723e932020-03-20 17:46:56 +01004970 PyFrameObject *current_frame = tstate->frame;
Victor Stinner438a12d2019-05-24 17:01:38 +02004971 if (current_frame == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004972 return NULL;
Victor Stinner438a12d2019-05-24 17:01:38 +02004973 }
Victor Stinner41bb43a2013-10-29 01:19:37 +01004974
4975 assert(current_frame->f_globals != NULL);
4976 return current_frame->f_globals;
Guido van Rossum3f5da241990-12-20 15:06:42 +00004977}
4978
Guido van Rossum6135a871995-01-09 17:53:26 +00004979int
Tim Peters5ba58662001-07-16 02:29:45 +00004980PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
Jeremy Hylton061d1062001-03-22 02:32:48 +00004981{
Victor Stinner438a12d2019-05-24 17:01:38 +02004982 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner6723e932020-03-20 17:46:56 +01004983 PyFrameObject *current_frame = tstate->frame;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004984 int result = cf->cf_flags != 0;
Tim Peters5ba58662001-07-16 02:29:45 +00004985
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004986 if (current_frame != NULL) {
4987 const int codeflags = current_frame->f_code->co_flags;
4988 const int compilerflags = codeflags & PyCF_MASK;
4989 if (compilerflags) {
4990 result = 1;
4991 cf->cf_flags |= compilerflags;
4992 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00004993#if 0 /* future keyword */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004994 if (codeflags & CO_GENERATOR_ALLOWED) {
4995 result = 1;
4996 cf->cf_flags |= CO_GENERATOR_ALLOWED;
4997 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00004998#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004999 }
5000 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00005001}
5002
Guido van Rossum3f5da241990-12-20 15:06:42 +00005003
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00005004const char *
Tim Peters6d6c1a32001-08-02 04:15:00 +00005005PyEval_GetFuncName(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00005006{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005007 if (PyMethod_Check(func))
5008 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
5009 else if (PyFunction_Check(func))
Serhiy Storchaka06515832016-11-20 09:13:07 +02005010 return PyUnicode_AsUTF8(((PyFunctionObject*)func)->func_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005011 else if (PyCFunction_Check(func))
5012 return ((PyCFunctionObject*)func)->m_ml->ml_name;
5013 else
Victor Stinnera102ed72020-02-07 02:24:48 +01005014 return Py_TYPE(func)->tp_name;
Jeremy Hylton512a2372001-04-11 13:52:29 +00005015}
5016
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00005017const char *
Tim Peters6d6c1a32001-08-02 04:15:00 +00005018PyEval_GetFuncDesc(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00005019{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005020 if (PyMethod_Check(func))
5021 return "()";
5022 else if (PyFunction_Check(func))
5023 return "()";
5024 else if (PyCFunction_Check(func))
5025 return "()";
5026 else
5027 return " object";
Jeremy Hylton512a2372001-04-11 13:52:29 +00005028}
5029
Armin Rigo1c2d7e52005-09-20 18:34:01 +00005030#define C_TRACE(x, call) \
Nicholas Bastind858a772004-06-25 23:31:06 +00005031if (tstate->use_tracing && tstate->c_profilefunc) { \
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005032 if (call_trace(tstate->c_profilefunc, tstate->c_profileobj, \
5033 tstate, tstate->frame, \
5034 PyTrace_C_CALL, func)) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005035 x = NULL; \
5036 } \
5037 else { \
5038 x = call; \
5039 if (tstate->c_profilefunc != NULL) { \
5040 if (x == NULL) { \
5041 call_trace_protected(tstate->c_profilefunc, \
5042 tstate->c_profileobj, \
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005043 tstate, tstate->frame, \
5044 PyTrace_C_EXCEPTION, func); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005045 /* XXX should pass (type, value, tb) */ \
5046 } else { \
5047 if (call_trace(tstate->c_profilefunc, \
5048 tstate->c_profileobj, \
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005049 tstate, tstate->frame, \
5050 PyTrace_C_RETURN, func)) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005051 Py_DECREF(x); \
5052 x = NULL; \
5053 } \
5054 } \
5055 } \
5056 } \
Nicholas Bastind858a772004-06-25 23:31:06 +00005057} else { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005058 x = call; \
5059 }
Nicholas Bastinc69ebe82004-03-24 21:57:10 +00005060
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005061
5062static PyObject *
5063trace_call_function(PyThreadState *tstate,
5064 PyObject *func,
5065 PyObject **args, Py_ssize_t nargs,
5066 PyObject *kwnames)
5067{
5068 PyObject *x;
scoder4c9ea092020-05-12 16:12:41 +02005069 if (PyCFunction_CheckExact(func) || PyCMethod_CheckExact(func)) {
Petr Viktorinffd97532020-02-11 17:46:57 +01005070 C_TRACE(x, PyObject_Vectorcall(func, args, nargs, kwnames));
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005071 return x;
5072 }
Andy Lesterdffe4c02020-03-04 07:15:20 -06005073 else if (Py_IS_TYPE(func, &PyMethodDescr_Type) && nargs > 0) {
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005074 /* We need to create a temporary bound method as argument
5075 for profiling.
5076
5077 If nargs == 0, then this cannot work because we have no
5078 "self". In any case, the call itself would raise
5079 TypeError (foo needs an argument), so we just skip
5080 profiling. */
5081 PyObject *self = args[0];
5082 func = Py_TYPE(func)->tp_descr_get(func, self, (PyObject*)Py_TYPE(self));
5083 if (func == NULL) {
5084 return NULL;
5085 }
Petr Viktorinffd97532020-02-11 17:46:57 +01005086 C_TRACE(x, PyObject_Vectorcall(func,
Jeroen Demeyer0d722f32019-07-05 14:48:24 +02005087 args+1, nargs-1,
5088 kwnames));
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005089 Py_DECREF(func);
5090 return x;
5091 }
Petr Viktorinffd97532020-02-11 17:46:57 +01005092 return PyObject_Vectorcall(func, args, nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames);
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005093}
5094
Victor Stinner415c5102017-01-11 00:54:57 +01005095/* Issue #29227: Inline call_function() into _PyEval_EvalFrameDefault()
5096 to reduce the stack consumption. */
5097Py_LOCAL_INLINE(PyObject *) _Py_HOT_FUNCTION
Victor Stinner09532fe2019-05-10 23:39:09 +02005098call_function(PyThreadState *tstate, PyObject ***pp_stack, Py_ssize_t oparg, PyObject *kwnames)
Jeremy Hyltone8c04322002-08-16 17:47:26 +00005099{
Victor Stinnerf9b760f2016-09-09 10:17:08 -07005100 PyObject **pfunc = (*pp_stack) - oparg - 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005101 PyObject *func = *pfunc;
5102 PyObject *x, *w;
Victor Stinnerd8735722016-09-09 12:36:44 -07005103 Py_ssize_t nkwargs = (kwnames == NULL) ? 0 : PyTuple_GET_SIZE(kwnames);
5104 Py_ssize_t nargs = oparg - nkwargs;
INADA Naoki5566bbb2017-02-03 07:43:03 +09005105 PyObject **stack = (*pp_stack) - nargs - nkwargs;
Jeremy Hyltone8c04322002-08-16 17:47:26 +00005106
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005107 if (tstate->use_tracing) {
5108 x = trace_call_function(tstate, func, stack, nargs, kwnames);
INADA Naoki5566bbb2017-02-03 07:43:03 +09005109 }
Victor Stinner4a7cc882015-03-06 23:35:27 +01005110 else {
Petr Viktorinffd97532020-02-11 17:46:57 +01005111 x = PyObject_Vectorcall(func, stack, nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005112 }
Tim Peters8a5c3c72004-04-05 19:36:21 +00005113
Victor Stinner438a12d2019-05-24 17:01:38 +02005114 assert((x != NULL) ^ (_PyErr_Occurred(tstate) != NULL));
Victor Stinnerf9b760f2016-09-09 10:17:08 -07005115
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01005116 /* Clear the stack of the function object. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005117 while ((*pp_stack) > pfunc) {
5118 w = EXT_POP(*pp_stack);
5119 Py_DECREF(w);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005120 }
Victor Stinnerace47d72013-07-18 01:41:08 +02005121
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005122 return x;
Jeremy Hyltone8c04322002-08-16 17:47:26 +00005123}
5124
Jeremy Hylton52820442001-01-03 23:52:36 +00005125static PyObject *
Victor Stinner09532fe2019-05-10 23:39:09 +02005126do_call_core(PyThreadState *tstate, PyObject *func, PyObject *callargs, PyObject *kwdict)
Jeremy Hylton52820442001-01-03 23:52:36 +00005127{
jdemeyere89de732018-09-19 12:06:20 +02005128 PyObject *result;
5129
scoder4c9ea092020-05-12 16:12:41 +02005130 if (PyCFunction_CheckExact(func) || PyCMethod_CheckExact(func)) {
Jeroen Demeyer7a6873c2019-09-11 13:01:01 +02005131 C_TRACE(result, PyObject_Call(func, callargs, kwdict));
Victor Stinnerf9b760f2016-09-09 10:17:08 -07005132 return result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005133 }
Andy Lesterdffe4c02020-03-04 07:15:20 -06005134 else if (Py_IS_TYPE(func, &PyMethodDescr_Type)) {
jdemeyere89de732018-09-19 12:06:20 +02005135 Py_ssize_t nargs = PyTuple_GET_SIZE(callargs);
5136 if (nargs > 0 && tstate->use_tracing) {
5137 /* We need to create a temporary bound method as argument
5138 for profiling.
5139
5140 If nargs == 0, then this cannot work because we have no
5141 "self". In any case, the call itself would raise
5142 TypeError (foo needs an argument), so we just skip
5143 profiling. */
5144 PyObject *self = PyTuple_GET_ITEM(callargs, 0);
5145 func = Py_TYPE(func)->tp_descr_get(func, self, (PyObject*)Py_TYPE(self));
5146 if (func == NULL) {
5147 return NULL;
5148 }
5149
Victor Stinner4d231bc2019-11-14 13:36:21 +01005150 C_TRACE(result, _PyObject_FastCallDictTstate(
5151 tstate, func,
5152 &_PyTuple_ITEMS(callargs)[1],
5153 nargs - 1,
5154 kwdict));
jdemeyere89de732018-09-19 12:06:20 +02005155 Py_DECREF(func);
5156 return result;
5157 }
Victor Stinner74319ae2016-08-25 00:04:09 +02005158 }
jdemeyere89de732018-09-19 12:06:20 +02005159 return PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00005160}
5161
Serhiy Storchaka483405b2015-02-17 10:14:30 +02005162/* Extract a slice index from a PyLong or an object with the
Guido van Rossum38fff8c2006-03-07 18:50:55 +00005163 nb_index slot defined, and store in *pi.
5164 Silently reduce values larger than PY_SSIZE_T_MAX to PY_SSIZE_T_MAX,
Xiang Zhang2ddf5a12017-05-10 18:19:41 +08005165 and silently boost values less than PY_SSIZE_T_MIN to PY_SSIZE_T_MIN.
Martin v. Löwisdde99d22006-02-17 15:57:41 +00005166 Return 0 on error, 1 on success.
Tim Peterscb479e72001-12-16 19:11:44 +00005167*/
Guido van Rossum20c6add2000-05-08 14:06:50 +00005168int
Martin v. Löwis18e16552006-02-15 17:27:45 +00005169_PyEval_SliceIndex(PyObject *v, Py_ssize_t *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005170{
Victor Stinner438a12d2019-05-24 17:01:38 +02005171 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005172 if (v != Py_None) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005173 Py_ssize_t x;
Victor Stinnera15e2602020-04-08 02:01:56 +02005174 if (_PyIndex_Check(v)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005175 x = PyNumber_AsSsize_t(v, NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02005176 if (x == -1 && _PyErr_Occurred(tstate))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005177 return 0;
5178 }
5179 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02005180 _PyErr_SetString(tstate, PyExc_TypeError,
5181 "slice indices must be integers or "
5182 "None or have an __index__ method");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005183 return 0;
5184 }
5185 *pi = x;
5186 }
5187 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005188}
5189
Serhiy Storchaka80ec8362017-03-19 19:37:40 +02005190int
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005191_PyEval_SliceIndexNotNone(PyObject *v, Py_ssize_t *pi)
Serhiy Storchaka80ec8362017-03-19 19:37:40 +02005192{
Victor Stinner438a12d2019-05-24 17:01:38 +02005193 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005194 Py_ssize_t x;
Victor Stinnera15e2602020-04-08 02:01:56 +02005195 if (_PyIndex_Check(v)) {
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005196 x = PyNumber_AsSsize_t(v, NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02005197 if (x == -1 && _PyErr_Occurred(tstate))
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005198 return 0;
5199 }
5200 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02005201 _PyErr_SetString(tstate, PyExc_TypeError,
5202 "slice indices must be integers or "
5203 "have an __index__ method");
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005204 return 0;
5205 }
5206 *pi = x;
5207 return 1;
Serhiy Storchaka80ec8362017-03-19 19:37:40 +02005208}
5209
Thomas Wouters52152252000-08-17 22:55:00 +00005210static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02005211import_name(PyThreadState *tstate, PyFrameObject *f,
5212 PyObject *name, PyObject *fromlist, PyObject *level)
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005213{
5214 _Py_IDENTIFIER(__import__);
Victor Stinnerdf142fd2016-08-20 00:44:42 +02005215 PyObject *import_func, *res;
5216 PyObject* stack[5];
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005217
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02005218 import_func = _PyDict_GetItemIdWithError(f->f_builtins, &PyId___import__);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005219 if (import_func == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005220 if (!_PyErr_Occurred(tstate)) {
5221 _PyErr_SetString(tstate, PyExc_ImportError, "__import__ not found");
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02005222 }
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005223 return NULL;
5224 }
5225
5226 /* Fast path for not overloaded __import__. */
Victor Stinner438a12d2019-05-24 17:01:38 +02005227 if (import_func == tstate->interp->import_func) {
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005228 int ilevel = _PyLong_AsInt(level);
Victor Stinner438a12d2019-05-24 17:01:38 +02005229 if (ilevel == -1 && _PyErr_Occurred(tstate)) {
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005230 return NULL;
5231 }
5232 res = PyImport_ImportModuleLevelObject(
5233 name,
5234 f->f_globals,
5235 f->f_locals == NULL ? Py_None : f->f_locals,
5236 fromlist,
5237 ilevel);
5238 return res;
5239 }
5240
5241 Py_INCREF(import_func);
Victor Stinnerdf142fd2016-08-20 00:44:42 +02005242
5243 stack[0] = name;
5244 stack[1] = f->f_globals;
5245 stack[2] = f->f_locals == NULL ? Py_None : f->f_locals;
5246 stack[3] = fromlist;
5247 stack[4] = level;
Victor Stinner559bb6a2016-08-22 22:48:54 +02005248 res = _PyObject_FastCall(import_func, stack, 5);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005249 Py_DECREF(import_func);
5250 return res;
5251}
5252
5253static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02005254import_from(PyThreadState *tstate, PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00005255{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005256 PyObject *x;
Xiang Zhang4830f582017-03-21 11:13:42 +08005257 PyObject *fullmodname, *pkgname, *pkgpath, *pkgname_or_unknown, *errmsg;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00005258
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005259 if (_PyObject_LookupAttr(v, name, &x) != 0) {
Antoine Pitrou0373a102014-10-13 20:19:45 +02005260 return x;
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005261 }
Antoine Pitrou0373a102014-10-13 20:19:45 +02005262 /* Issue #17636: in case this failed because of a circular relative
5263 import, try to fallback on reading the module directly from
5264 sys.modules. */
Antoine Pitrou0373a102014-10-13 20:19:45 +02005265 pkgname = _PyObject_GetAttrId(v, &PyId___name__);
Brett Cannon3008bc02015-08-11 18:01:31 -07005266 if (pkgname == NULL) {
5267 goto error;
5268 }
Oren Milman6db70332017-09-19 14:23:01 +03005269 if (!PyUnicode_Check(pkgname)) {
5270 Py_CLEAR(pkgname);
5271 goto error;
5272 }
Antoine Pitrou0373a102014-10-13 20:19:45 +02005273 fullmodname = PyUnicode_FromFormat("%U.%U", pkgname, name);
Brett Cannon3008bc02015-08-11 18:01:31 -07005274 if (fullmodname == NULL) {
Xiang Zhang4830f582017-03-21 11:13:42 +08005275 Py_DECREF(pkgname);
Antoine Pitrou0373a102014-10-13 20:19:45 +02005276 return NULL;
Brett Cannon3008bc02015-08-11 18:01:31 -07005277 }
Eric Snow3f9eee62017-09-15 16:35:20 -06005278 x = PyImport_GetModule(fullmodname);
Antoine Pitrou0373a102014-10-13 20:19:45 +02005279 Py_DECREF(fullmodname);
Victor Stinner438a12d2019-05-24 17:01:38 +02005280 if (x == NULL && !_PyErr_Occurred(tstate)) {
Brett Cannon3008bc02015-08-11 18:01:31 -07005281 goto error;
5282 }
Matthias Bussonnier1bc15642017-02-22 07:06:50 -08005283 Py_DECREF(pkgname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005284 return x;
Brett Cannon3008bc02015-08-11 18:01:31 -07005285 error:
Matthias Bussonnierbc4bed42017-02-14 16:05:25 -08005286 pkgpath = PyModule_GetFilenameObject(v);
Matthias Bussonnier1bc15642017-02-22 07:06:50 -08005287 if (pkgname == NULL) {
5288 pkgname_or_unknown = PyUnicode_FromString("<unknown module name>");
5289 if (pkgname_or_unknown == NULL) {
5290 Py_XDECREF(pkgpath);
5291 return NULL;
5292 }
5293 } else {
5294 pkgname_or_unknown = pkgname;
5295 }
Matthias Bussonnierbc4bed42017-02-14 16:05:25 -08005296
5297 if (pkgpath == NULL || !PyUnicode_Check(pkgpath)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005298 _PyErr_Clear(tstate);
Xiang Zhang4830f582017-03-21 11:13:42 +08005299 errmsg = PyUnicode_FromFormat(
5300 "cannot import name %R from %R (unknown location)",
5301 name, pkgname_or_unknown
5302 );
Stefan Krah027b09c2019-03-25 21:50:58 +01005303 /* NULL checks for errmsg and pkgname done by PyErr_SetImportError. */
Xiang Zhang4830f582017-03-21 11:13:42 +08005304 PyErr_SetImportError(errmsg, pkgname, NULL);
5305 }
5306 else {
Anthony Sottile65366bc2019-09-09 08:17:50 -07005307 _Py_IDENTIFIER(__spec__);
5308 PyObject *spec = _PyObject_GetAttrId(v, &PyId___spec__);
Anthony Sottile65366bc2019-09-09 08:17:50 -07005309 const char *fmt =
5310 _PyModuleSpec_IsInitializing(spec) ?
5311 "cannot import name %R from partially initialized module %R "
5312 "(most likely due to a circular import) (%S)" :
5313 "cannot import name %R from %R (%S)";
5314 Py_XDECREF(spec);
5315
5316 errmsg = PyUnicode_FromFormat(fmt, name, pkgname_or_unknown, pkgpath);
Stefan Krah027b09c2019-03-25 21:50:58 +01005317 /* NULL checks for errmsg and pkgname done by PyErr_SetImportError. */
Xiang Zhang4830f582017-03-21 11:13:42 +08005318 PyErr_SetImportError(errmsg, pkgname, pkgpath);
Matthias Bussonnierbc4bed42017-02-14 16:05:25 -08005319 }
5320
Xiang Zhang4830f582017-03-21 11:13:42 +08005321 Py_XDECREF(errmsg);
Matthias Bussonnier1bc15642017-02-22 07:06:50 -08005322 Py_XDECREF(pkgname_or_unknown);
5323 Py_XDECREF(pkgpath);
Brett Cannon3008bc02015-08-11 18:01:31 -07005324 return NULL;
Thomas Wouters52152252000-08-17 22:55:00 +00005325}
Guido van Rossumac7be682001-01-17 15:42:30 +00005326
Thomas Wouters52152252000-08-17 22:55:00 +00005327static int
Victor Stinner438a12d2019-05-24 17:01:38 +02005328import_all_from(PyThreadState *tstate, PyObject *locals, PyObject *v)
Thomas Wouters52152252000-08-17 22:55:00 +00005329{
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02005330 _Py_IDENTIFIER(__all__);
5331 _Py_IDENTIFIER(__dict__);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005332 PyObject *all, *dict, *name, *value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005333 int skip_leading_underscores = 0;
5334 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00005335
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005336 if (_PyObject_LookupAttrId(v, &PyId___all__, &all) < 0) {
5337 return -1; /* Unexpected error */
5338 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005339 if (all == NULL) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005340 if (_PyObject_LookupAttrId(v, &PyId___dict__, &dict) < 0) {
5341 return -1;
5342 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005343 if (dict == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005344 _PyErr_SetString(tstate, PyExc_ImportError,
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005345 "from-import-* object has no __dict__ and no __all__");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005346 return -1;
5347 }
5348 all = PyMapping_Keys(dict);
5349 Py_DECREF(dict);
5350 if (all == NULL)
5351 return -1;
5352 skip_leading_underscores = 1;
5353 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00005354
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005355 for (pos = 0, err = 0; ; pos++) {
5356 name = PySequence_GetItem(all, pos);
5357 if (name == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005358 if (!_PyErr_ExceptionMatches(tstate, PyExc_IndexError)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005359 err = -1;
Victor Stinner438a12d2019-05-24 17:01:38 +02005360 }
5361 else {
5362 _PyErr_Clear(tstate);
5363 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005364 break;
5365 }
Xiang Zhangd8b291a2018-03-24 18:39:36 +08005366 if (!PyUnicode_Check(name)) {
5367 PyObject *modname = _PyObject_GetAttrId(v, &PyId___name__);
5368 if (modname == NULL) {
5369 Py_DECREF(name);
5370 err = -1;
5371 break;
5372 }
5373 if (!PyUnicode_Check(modname)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005374 _PyErr_Format(tstate, PyExc_TypeError,
5375 "module __name__ must be a string, not %.100s",
5376 Py_TYPE(modname)->tp_name);
Xiang Zhangd8b291a2018-03-24 18:39:36 +08005377 }
5378 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02005379 _PyErr_Format(tstate, PyExc_TypeError,
5380 "%s in %U.%s must be str, not %.100s",
5381 skip_leading_underscores ? "Key" : "Item",
5382 modname,
5383 skip_leading_underscores ? "__dict__" : "__all__",
5384 Py_TYPE(name)->tp_name);
Xiang Zhangd8b291a2018-03-24 18:39:36 +08005385 }
5386 Py_DECREF(modname);
5387 Py_DECREF(name);
5388 err = -1;
5389 break;
5390 }
5391 if (skip_leading_underscores) {
Serhiy Storchakae3b2b4b2017-09-08 09:58:51 +03005392 if (PyUnicode_READY(name) == -1) {
5393 Py_DECREF(name);
5394 err = -1;
5395 break;
5396 }
5397 if (PyUnicode_READ_CHAR(name, 0) == '_') {
5398 Py_DECREF(name);
5399 continue;
5400 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005401 }
5402 value = PyObject_GetAttr(v, name);
5403 if (value == NULL)
5404 err = -1;
5405 else if (PyDict_CheckExact(locals))
5406 err = PyDict_SetItem(locals, name, value);
5407 else
5408 err = PyObject_SetItem(locals, name, value);
5409 Py_DECREF(name);
5410 Py_XDECREF(value);
5411 if (err != 0)
5412 break;
5413 }
5414 Py_DECREF(all);
5415 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00005416}
5417
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005418static int
Victor Stinner438a12d2019-05-24 17:01:38 +02005419check_args_iterable(PyThreadState *tstate, PyObject *func, PyObject *args)
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005420{
Victor Stinnera102ed72020-02-07 02:24:48 +01005421 if (Py_TYPE(args)->tp_iter == NULL && !PySequence_Check(args)) {
Jeroen Demeyerbf17d412019-11-05 16:48:04 +01005422 /* check_args_iterable() may be called with a live exception:
5423 * clear it to prevent calling _PyObject_FunctionStr() with an
5424 * exception set. */
Victor Stinner61f4db82020-01-28 03:37:45 +01005425 _PyErr_Clear(tstate);
Jeroen Demeyerbf17d412019-11-05 16:48:04 +01005426 PyObject *funcstr = _PyObject_FunctionStr(func);
5427 if (funcstr != NULL) {
5428 _PyErr_Format(tstate, PyExc_TypeError,
5429 "%U argument after * must be an iterable, not %.200s",
5430 funcstr, Py_TYPE(args)->tp_name);
5431 Py_DECREF(funcstr);
5432 }
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005433 return -1;
5434 }
5435 return 0;
5436}
5437
5438static void
Victor Stinner438a12d2019-05-24 17:01:38 +02005439format_kwargs_error(PyThreadState *tstate, PyObject *func, PyObject *kwargs)
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005440{
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005441 /* _PyDict_MergeEx raises attribute
5442 * error (percolated from an attempt
5443 * to get 'keys' attribute) instead of
5444 * a type error if its second argument
5445 * is not a mapping.
5446 */
Victor Stinner438a12d2019-05-24 17:01:38 +02005447 if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) {
Victor Stinner61f4db82020-01-28 03:37:45 +01005448 _PyErr_Clear(tstate);
Jeroen Demeyerbf17d412019-11-05 16:48:04 +01005449 PyObject *funcstr = _PyObject_FunctionStr(func);
5450 if (funcstr != NULL) {
5451 _PyErr_Format(
5452 tstate, PyExc_TypeError,
5453 "%U argument after ** must be a mapping, not %.200s",
5454 funcstr, Py_TYPE(kwargs)->tp_name);
5455 Py_DECREF(funcstr);
5456 }
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005457 }
Victor Stinner438a12d2019-05-24 17:01:38 +02005458 else if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005459 PyObject *exc, *val, *tb;
Victor Stinner438a12d2019-05-24 17:01:38 +02005460 _PyErr_Fetch(tstate, &exc, &val, &tb);
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005461 if (val && PyTuple_Check(val) && PyTuple_GET_SIZE(val) == 1) {
Victor Stinner61f4db82020-01-28 03:37:45 +01005462 _PyErr_Clear(tstate);
Jeroen Demeyerbf17d412019-11-05 16:48:04 +01005463 PyObject *funcstr = _PyObject_FunctionStr(func);
5464 if (funcstr != NULL) {
5465 PyObject *key = PyTuple_GET_ITEM(val, 0);
5466 _PyErr_Format(
5467 tstate, PyExc_TypeError,
5468 "%U got multiple values for keyword argument '%S'",
5469 funcstr, key);
5470 Py_DECREF(funcstr);
5471 }
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005472 Py_XDECREF(exc);
5473 Py_XDECREF(val);
5474 Py_XDECREF(tb);
5475 }
5476 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02005477 _PyErr_Restore(tstate, exc, val, tb);
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005478 }
5479 }
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005480}
5481
Guido van Rossumac7be682001-01-17 15:42:30 +00005482static void
Victor Stinner438a12d2019-05-24 17:01:38 +02005483format_exc_check_arg(PyThreadState *tstate, PyObject *exc,
5484 const char *format_str, PyObject *obj)
Paul Prescode68140d2000-08-30 20:25:01 +00005485{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005486 const char *obj_str;
Paul Prescode68140d2000-08-30 20:25:01 +00005487
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005488 if (!obj)
5489 return;
Paul Prescode68140d2000-08-30 20:25:01 +00005490
Serhiy Storchaka06515832016-11-20 09:13:07 +02005491 obj_str = PyUnicode_AsUTF8(obj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005492 if (!obj_str)
5493 return;
Paul Prescode68140d2000-08-30 20:25:01 +00005494
Victor Stinner438a12d2019-05-24 17:01:38 +02005495 _PyErr_Format(tstate, exc, format_str, obj_str);
Paul Prescode68140d2000-08-30 20:25:01 +00005496}
Guido van Rossum950361c1997-01-24 13:49:28 +00005497
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005498static void
Victor Stinner438a12d2019-05-24 17:01:38 +02005499format_exc_unbound(PyThreadState *tstate, PyCodeObject *co, int oparg)
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005500{
5501 PyObject *name;
5502 /* Don't stomp existing exception */
Victor Stinner438a12d2019-05-24 17:01:38 +02005503 if (_PyErr_Occurred(tstate))
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005504 return;
5505 if (oparg < PyTuple_GET_SIZE(co->co_cellvars)) {
5506 name = PyTuple_GET_ITEM(co->co_cellvars,
5507 oparg);
Victor Stinner438a12d2019-05-24 17:01:38 +02005508 format_exc_check_arg(tstate,
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005509 PyExc_UnboundLocalError,
5510 UNBOUNDLOCAL_ERROR_MSG,
5511 name);
5512 } else {
5513 name = PyTuple_GET_ITEM(co->co_freevars, oparg -
5514 PyTuple_GET_SIZE(co->co_cellvars));
Victor Stinner438a12d2019-05-24 17:01:38 +02005515 format_exc_check_arg(tstate, PyExc_NameError,
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005516 UNBOUNDFREE_ERROR_MSG, name);
5517 }
5518}
5519
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03005520static void
Mark Shannonfee55262019-11-21 09:11:43 +00005521format_awaitable_error(PyThreadState *tstate, PyTypeObject *type, int prevprevopcode, int prevopcode)
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03005522{
5523 if (type->tp_as_async == NULL || type->tp_as_async->am_await == NULL) {
5524 if (prevopcode == BEFORE_ASYNC_WITH) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005525 _PyErr_Format(tstate, PyExc_TypeError,
5526 "'async with' received an object from __aenter__ "
5527 "that does not implement __await__: %.100s",
5528 type->tp_name);
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03005529 }
Mark Shannonfee55262019-11-21 09:11:43 +00005530 else if (prevopcode == WITH_EXCEPT_START || (prevopcode == CALL_FUNCTION && prevprevopcode == DUP_TOP)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005531 _PyErr_Format(tstate, PyExc_TypeError,
5532 "'async with' received an object from __aexit__ "
5533 "that does not implement __await__: %.100s",
5534 type->tp_name);
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03005535 }
5536 }
5537}
5538
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005539static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02005540unicode_concatenate(PyThreadState *tstate, PyObject *v, PyObject *w,
Serhiy Storchakaab874002016-09-11 13:48:15 +03005541 PyFrameObject *f, const _Py_CODEUNIT *next_instr)
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005542{
5543 PyObject *res;
5544 if (Py_REFCNT(v) == 2) {
5545 /* In the common case, there are 2 references to the value
5546 * stored in 'variable' when the += is performed: one on the
5547 * value stack (in 'v') and one still stored in the
5548 * 'variable'. We try to delete the variable now to reduce
5549 * the refcnt to 1.
5550 */
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03005551 int opcode, oparg;
5552 NEXTOPARG();
5553 switch (opcode) {
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005554 case STORE_FAST:
5555 {
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005556 PyObject **fastlocals = f->f_localsplus;
5557 if (GETLOCAL(oparg) == v)
5558 SETLOCAL(oparg, NULL);
5559 break;
5560 }
5561 case STORE_DEREF:
5562 {
5563 PyObject **freevars = (f->f_localsplus +
5564 f->f_code->co_nlocals);
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03005565 PyObject *c = freevars[oparg];
Raymond Hettingerc32f9db2016-11-12 04:10:35 -05005566 if (PyCell_GET(c) == v) {
5567 PyCell_SET(c, NULL);
5568 Py_DECREF(v);
5569 }
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005570 break;
5571 }
5572 case STORE_NAME:
5573 {
5574 PyObject *names = f->f_code->co_names;
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03005575 PyObject *name = GETITEM(names, oparg);
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005576 PyObject *locals = f->f_locals;
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02005577 if (locals && PyDict_CheckExact(locals)) {
5578 PyObject *w = PyDict_GetItemWithError(locals, name);
5579 if ((w == v && PyDict_DelItem(locals, name) != 0) ||
Victor Stinner438a12d2019-05-24 17:01:38 +02005580 (w == NULL && _PyErr_Occurred(tstate)))
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02005581 {
5582 Py_DECREF(v);
5583 return NULL;
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005584 }
5585 }
5586 break;
5587 }
5588 }
5589 }
5590 res = v;
5591 PyUnicode_Append(&res, w);
5592 return res;
5593}
5594
Guido van Rossum950361c1997-01-24 13:49:28 +00005595#ifdef DYNAMIC_EXECUTION_PROFILE
5596
Skip Montanarof118cb12001-10-15 20:51:38 +00005597static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005598getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00005599{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005600 int i;
5601 PyObject *l = PyList_New(256);
5602 if (l == NULL) return NULL;
5603 for (i = 0; i < 256; i++) {
5604 PyObject *x = PyLong_FromLong(a[i]);
5605 if (x == NULL) {
5606 Py_DECREF(l);
5607 return NULL;
5608 }
Zackery Spytz99d56b52018-12-08 07:16:55 -07005609 PyList_SET_ITEM(l, i, x);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005610 }
5611 for (i = 0; i < 256; i++)
5612 a[i] = 0;
5613 return l;
Guido van Rossum950361c1997-01-24 13:49:28 +00005614}
5615
5616PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005617_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00005618{
5619#ifndef DXPAIRS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005620 return getarray(dxp);
Guido van Rossum950361c1997-01-24 13:49:28 +00005621#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005622 int i;
5623 PyObject *l = PyList_New(257);
5624 if (l == NULL) return NULL;
5625 for (i = 0; i < 257; i++) {
5626 PyObject *x = getarray(dxpairs[i]);
5627 if (x == NULL) {
5628 Py_DECREF(l);
5629 return NULL;
5630 }
Zackery Spytz99d56b52018-12-08 07:16:55 -07005631 PyList_SET_ITEM(l, i, x);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005632 }
5633 return l;
Guido van Rossum950361c1997-01-24 13:49:28 +00005634#endif
5635}
5636
5637#endif
Brett Cannon5c4de282016-09-07 11:16:41 -07005638
5639Py_ssize_t
5640_PyEval_RequestCodeExtraIndex(freefunc free)
5641{
Victor Stinner81a7be32020-04-14 15:14:01 +02005642 PyInterpreterState *interp = _PyInterpreterState_GET();
Brett Cannon5c4de282016-09-07 11:16:41 -07005643 Py_ssize_t new_index;
5644
Dino Viehlandf3cffd22017-06-21 14:44:36 -07005645 if (interp->co_extra_user_count == MAX_CO_EXTRA_USERS - 1) {
Brett Cannon5c4de282016-09-07 11:16:41 -07005646 return -1;
5647 }
Dino Viehlandf3cffd22017-06-21 14:44:36 -07005648 new_index = interp->co_extra_user_count++;
5649 interp->co_extra_freefuncs[new_index] = free;
Brett Cannon5c4de282016-09-07 11:16:41 -07005650 return new_index;
5651}
Łukasz Langaa785c872016-09-09 17:37:37 -07005652
5653static void
5654dtrace_function_entry(PyFrameObject *f)
5655{
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02005656 const char *filename;
5657 const char *funcname;
Łukasz Langaa785c872016-09-09 17:37:37 -07005658 int lineno;
5659
Victor Stinner6d86a232020-04-29 00:56:58 +02005660 PyCodeObject *code = f->f_code;
5661 filename = PyUnicode_AsUTF8(code->co_filename);
5662 funcname = PyUnicode_AsUTF8(code->co_name);
5663 lineno = PyCode_Addr2Line(code, f->f_lasti);
Łukasz Langaa785c872016-09-09 17:37:37 -07005664
Andy Lestere6be9b52020-02-11 20:28:35 -06005665 PyDTrace_FUNCTION_ENTRY(filename, funcname, lineno);
Łukasz Langaa785c872016-09-09 17:37:37 -07005666}
5667
5668static void
5669dtrace_function_return(PyFrameObject *f)
5670{
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02005671 const char *filename;
5672 const char *funcname;
Łukasz Langaa785c872016-09-09 17:37:37 -07005673 int lineno;
5674
Victor Stinner6d86a232020-04-29 00:56:58 +02005675 PyCodeObject *code = f->f_code;
5676 filename = PyUnicode_AsUTF8(code->co_filename);
5677 funcname = PyUnicode_AsUTF8(code->co_name);
5678 lineno = PyCode_Addr2Line(code, f->f_lasti);
Łukasz Langaa785c872016-09-09 17:37:37 -07005679
Andy Lestere6be9b52020-02-11 20:28:35 -06005680 PyDTrace_FUNCTION_RETURN(filename, funcname, lineno);
Łukasz Langaa785c872016-09-09 17:37:37 -07005681}
5682
5683/* DTrace equivalent of maybe_call_line_trace. */
5684static void
5685maybe_dtrace_line(PyFrameObject *frame,
5686 int *instr_lb, int *instr_ub, int *instr_prev)
5687{
5688 int line = frame->f_lineno;
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02005689 const char *co_filename, *co_name;
Łukasz Langaa785c872016-09-09 17:37:37 -07005690
5691 /* If the last instruction executed isn't in the current
5692 instruction window, reset the window.
5693 */
5694 if (frame->f_lasti < *instr_lb || frame->f_lasti >= *instr_ub) {
5695 PyAddrPair bounds;
5696 line = _PyCode_CheckLineNumber(frame->f_code, frame->f_lasti,
5697 &bounds);
5698 *instr_lb = bounds.ap_lower;
5699 *instr_ub = bounds.ap_upper;
5700 }
5701 /* If the last instruction falls at the start of a line or if
5702 it represents a jump backwards, update the frame's line
5703 number and call the trace function. */
5704 if (frame->f_lasti == *instr_lb || frame->f_lasti < *instr_prev) {
5705 frame->f_lineno = line;
5706 co_filename = PyUnicode_AsUTF8(frame->f_code->co_filename);
5707 if (!co_filename)
5708 co_filename = "?";
5709 co_name = PyUnicode_AsUTF8(frame->f_code->co_name);
5710 if (!co_name)
5711 co_name = "?";
Andy Lestere6be9b52020-02-11 20:28:35 -06005712 PyDTrace_LINE(co_filename, co_name, line);
Łukasz Langaa785c872016-09-09 17:37:37 -07005713 }
5714 *instr_prev = frame->f_lasti;
5715}
Victor Stinnerf4b1e3d2019-11-04 19:48:34 +01005716
5717
5718/* Implement Py_EnterRecursiveCall() and Py_LeaveRecursiveCall() as functions
5719 for the limited API. */
5720
5721#undef Py_EnterRecursiveCall
5722
5723int Py_EnterRecursiveCall(const char *where)
5724{
Victor Stinnerbe434dc2019-11-05 00:51:22 +01005725 return _Py_EnterRecursiveCall_inline(where);
Victor Stinnerf4b1e3d2019-11-04 19:48:34 +01005726}
5727
5728#undef Py_LeaveRecursiveCall
5729
5730void Py_LeaveRecursiveCall(void)
5731{
Victor Stinnerbe434dc2019-11-05 00:51:22 +01005732 _Py_LeaveRecursiveCall_inline();
Victor Stinnerf4b1e3d2019-11-04 19:48:34 +01005733}