blob: fafbf7524bb843bcaee77f09f43de83233c3b268 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum3f5da241990-12-20 15:06:42 +00002/* Execute compiled code */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003
Guido van Rossum681d79a1995-07-18 14:51:37 +00004/* XXX TO DO:
Guido van Rossum681d79a1995-07-18 14:51:37 +00005 XXX speed up searching for keywords by using a dictionary
Guido van Rossum681d79a1995-07-18 14:51:37 +00006 XXX document it!
7 */
8
Thomas Wouters477c8d52006-05-27 19:21:47 +00009/* enable more aggressive intra-module optimizations, where available */
10#define PY_LOCAL_AGGRESSIVE
11
Guido van Rossumb209a111997-04-29 18:18:01 +000012#include "Python.h"
Victor Stinnere560f902020-04-14 18:30:41 +020013#include "pycore_abstract.h" // _PyIndex_Check()
Victor Stinner384621c2020-06-22 17:27:35 +020014#include "pycore_call.h" // _PyObject_FastCallDictTstate()
15#include "pycore_ceval.h" // _PyEval_SignalAsyncExc()
16#include "pycore_code.h" // _PyCode_InitOpcache()
17#include "pycore_initconfig.h" // _PyStatus_OK()
18#include "pycore_object.h" // _PyObject_GC_TRACK()
19#include "pycore_pyerrors.h" // _PyErr_Fetch()
20#include "pycore_pylifecycle.h" // _PyErr_Print()
Victor Stinnere560f902020-04-14 18:30:41 +020021#include "pycore_pymem.h" // _PyMem_IsPtrFreed()
22#include "pycore_pystate.h" // _PyInterpreterState_GET()
Victor Stinner384621c2020-06-22 17:27:35 +020023#include "pycore_sysmodule.h" // _PySys_Audit()
24#include "pycore_tuple.h" // _PyTuple_ITEMS()
Guido van Rossum10dc2e81990-11-18 17:27:39 +000025
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000026#include "code.h"
Benjamin Peterson025e9eb2015-05-05 20:16:41 -040027#include "dictobject.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000028#include "frameobject.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000029#include "opcode.h"
Łukasz Langaa785c872016-09-09 17:37:37 -070030#include "pydtrace.h"
Benjamin Peterson025e9eb2015-05-05 20:16:41 -040031#include "setobject.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000032
Guido van Rossumc6004111993-11-05 10:22:19 +000033#include <ctype.h>
34
Guido van Rossum408027e1996-12-30 16:17:54 +000035#ifdef Py_DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000036/* For debugging the interpreter: */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000037#define LLTRACE 1 /* Low-level trace feature */
38#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000039#endif
40
Victor Stinner5c75f372019-04-17 23:02:26 +020041#if !defined(Py_BUILD_CORE)
42# error "ceval.c must be build with Py_BUILD_CORE define for best performance"
43#endif
44
Hai Shi46874c22020-01-30 17:20:25 -060045_Py_IDENTIFIER(__name__);
Guido van Rossum5b722181993-03-30 17:46:03 +000046
Guido van Rossum374a9221991-04-04 10:40:29 +000047/* Forward declarations */
Victor Stinner09532fe2019-05-10 23:39:09 +020048Py_LOCAL_INLINE(PyObject *) call_function(
49 PyThreadState *tstate, PyObject ***pp_stack,
50 Py_ssize_t oparg, PyObject *kwnames);
51static PyObject * do_call_core(
52 PyThreadState *tstate, PyObject *func,
53 PyObject *callargs, PyObject *kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +000054
Guido van Rossum0a066c01992-03-27 17:29:15 +000055#ifdef LLTRACE
Guido van Rossumc2e20742006-02-27 22:32:47 +000056static int lltrace;
Victor Stinner438a12d2019-05-24 17:01:38 +020057static int prtrace(PyThreadState *, PyObject *, const char *);
Guido van Rossum0a066c01992-03-27 17:29:15 +000058#endif
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +010059static int call_trace(Py_tracefunc, PyObject *,
60 PyThreadState *, PyFrameObject *,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000061 int, PyObject *);
Amaury Forgeot d'Arcf05149a2007-11-13 01:05:30 +000062static int call_trace_protected(Py_tracefunc, PyObject *,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +010063 PyThreadState *, PyFrameObject *,
64 int, PyObject *);
65static void call_exc_trace(Py_tracefunc, PyObject *,
66 PyThreadState *, PyFrameObject *);
Tim Peters8a5c3c72004-04-05 19:36:21 +000067static int maybe_call_line_trace(Py_tracefunc, PyObject *,
Eric Snow2ebc5ce2017-09-07 23:51:28 -060068 PyThreadState *, PyFrameObject *,
69 int *, int *, int *);
Łukasz Langaa785c872016-09-09 17:37:37 -070070static void maybe_dtrace_line(PyFrameObject *, int *, int *, int *);
71static void dtrace_function_entry(PyFrameObject *);
72static void dtrace_function_return(PyFrameObject *);
Michael W. Hudsondd32a912002-08-15 14:59:02 +000073
Victor Stinner438a12d2019-05-24 17:01:38 +020074static PyObject * import_name(PyThreadState *, PyFrameObject *,
75 PyObject *, PyObject *, PyObject *);
76static PyObject * import_from(PyThreadState *, PyObject *, PyObject *);
77static int import_all_from(PyThreadState *, PyObject *, PyObject *);
78static void format_exc_check_arg(PyThreadState *, PyObject *, const char *, PyObject *);
79static void format_exc_unbound(PyThreadState *tstate, PyCodeObject *co, int oparg);
80static PyObject * unicode_concatenate(PyThreadState *, PyObject *, PyObject *,
Serhiy Storchakaab874002016-09-11 13:48:15 +030081 PyFrameObject *, const _Py_CODEUNIT *);
Victor Stinner438a12d2019-05-24 17:01:38 +020082static PyObject * special_lookup(PyThreadState *, PyObject *, _Py_Identifier *);
83static int check_args_iterable(PyThreadState *, PyObject *func, PyObject *vararg);
84static void format_kwargs_error(PyThreadState *, PyObject *func, PyObject *kwargs);
Mark Shannonfee55262019-11-21 09:11:43 +000085static void format_awaitable_error(PyThreadState *, PyTypeObject *, int, int);
Guido van Rossum374a9221991-04-04 10:40:29 +000086
Paul Prescode68140d2000-08-30 20:25:01 +000087#define NAME_ERROR_MSG \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000088 "name '%.200s' is not defined"
Paul Prescode68140d2000-08-30 20:25:01 +000089#define UNBOUNDLOCAL_ERROR_MSG \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000090 "local variable '%.200s' referenced before assignment"
Jeremy Hyltonc76770c2001-04-13 16:51:46 +000091#define UNBOUNDFREE_ERROR_MSG \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000092 "free variable '%.200s' referenced before assignment" \
93 " in enclosing scope"
Guido van Rossum374a9221991-04-04 10:40:29 +000094
Guido van Rossum950361c1997-01-24 13:49:28 +000095/* Dynamic execution profile */
96#ifdef DYNAMIC_EXECUTION_PROFILE
97#ifdef DXPAIRS
98static long dxpairs[257][256];
99#define dxp dxpairs[256]
100#else
101static long dxp[256];
102#endif
103#endif
104
Inada Naoki91234a12019-06-03 21:30:58 +0900105/* per opcode cache */
Inada Naokieddef862019-06-04 07:38:10 +0900106#ifdef Py_DEBUG
107// --with-pydebug is used to find memory leak. opcache makes it harder.
108// So we disable opcache when Py_DEBUG is defined.
109// See bpo-37146
110#define OPCACHE_MIN_RUNS 0 /* disable opcache */
111#else
Inada Naoki91234a12019-06-03 21:30:58 +0900112#define OPCACHE_MIN_RUNS 1024 /* create opcache when code executed this time */
Inada Naokieddef862019-06-04 07:38:10 +0900113#endif
Pablo Galindo109826c2020-10-20 06:22:44 +0100114#define OPCODE_CACHE_MAX_TRIES 20
Inada Naoki91234a12019-06-03 21:30:58 +0900115#define OPCACHE_STATS 0 /* Enable stats */
116
117#if OPCACHE_STATS
118static size_t opcache_code_objects = 0;
119static size_t opcache_code_objects_extra_mem = 0;
120
121static size_t opcache_global_opts = 0;
122static size_t opcache_global_hits = 0;
123static size_t opcache_global_misses = 0;
Pablo Galindo109826c2020-10-20 06:22:44 +0100124
125static size_t opcache_attr_opts = 0;
126static size_t opcache_attr_hits = 0;
127static size_t opcache_attr_misses = 0;
128static size_t opcache_attr_deopts = 0;
129static size_t opcache_attr_total = 0;
Inada Naoki91234a12019-06-03 21:30:58 +0900130#endif
131
Victor Stinner5a3a71d2020-03-19 17:40:12 +0100132
Victor Stinnerda2914d2020-03-20 09:29:08 +0100133#ifndef NDEBUG
134/* Ensure that tstate is valid: sanity check for PyEval_AcquireThread() and
135 PyEval_RestoreThread(). Detect if tstate memory was freed. It can happen
136 when a thread continues to run after Python finalization, especially
137 daemon threads. */
138static int
139is_tstate_valid(PyThreadState *tstate)
140{
141 assert(!_PyMem_IsPtrFreed(tstate));
142 assert(!_PyMem_IsPtrFreed(tstate->interp));
143 return 1;
144}
145#endif
146
147
Jeffrey Yasskin39370832010-05-03 19:29:34 +0000148/* This can set eval_breaker to 0 even though gil_drop_request became
149 1. We believe this is all right because the eval loop will release
150 the GIL eventually anyway. */
Victor Stinnerda2914d2020-03-20 09:29:08 +0100151static inline void
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200152COMPUTE_EVAL_BREAKER(PyInterpreterState *interp,
Victor Stinner299b8c62020-05-05 17:40:18 +0200153 struct _ceval_runtime_state *ceval,
154 struct _ceval_state *ceval2)
Victor Stinnerda2914d2020-03-20 09:29:08 +0100155{
Victor Stinner299b8c62020-05-05 17:40:18 +0200156 _Py_atomic_store_relaxed(&ceval2->eval_breaker,
157 _Py_atomic_load_relaxed(&ceval2->gil_drop_request)
Victor Stinner0b1e3302020-05-05 16:14:31 +0200158 | (_Py_atomic_load_relaxed(&ceval->signals_pending)
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200159 && _Py_ThreadCanHandleSignals(interp))
Victor Stinner299b8c62020-05-05 17:40:18 +0200160 | (_Py_atomic_load_relaxed(&ceval2->pending.calls_to_do)
Victor Stinnerd8316882020-03-20 14:50:35 +0100161 && _Py_ThreadCanHandlePendingCalls())
Victor Stinner299b8c62020-05-05 17:40:18 +0200162 | ceval2->pending.async_exc);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100163}
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000164
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000165
Victor Stinnerda2914d2020-03-20 09:29:08 +0100166static inline void
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200167SET_GIL_DROP_REQUEST(PyInterpreterState *interp)
Victor Stinnerda2914d2020-03-20 09:29:08 +0100168{
Victor Stinner299b8c62020-05-05 17:40:18 +0200169 struct _ceval_state *ceval2 = &interp->ceval;
170 _Py_atomic_store_relaxed(&ceval2->gil_drop_request, 1);
171 _Py_atomic_store_relaxed(&ceval2->eval_breaker, 1);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100172}
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000173
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000174
Victor Stinnerda2914d2020-03-20 09:29:08 +0100175static inline void
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200176RESET_GIL_DROP_REQUEST(PyInterpreterState *interp)
Victor Stinnerda2914d2020-03-20 09:29:08 +0100177{
Victor Stinner299b8c62020-05-05 17:40:18 +0200178 struct _ceval_runtime_state *ceval = &interp->runtime->ceval;
179 struct _ceval_state *ceval2 = &interp->ceval;
180 _Py_atomic_store_relaxed(&ceval2->gil_drop_request, 0);
181 COMPUTE_EVAL_BREAKER(interp, ceval, ceval2);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100182}
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000183
Eric Snowfdf282d2019-01-11 14:26:55 -0700184
Victor Stinnerda2914d2020-03-20 09:29:08 +0100185static inline void
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200186SIGNAL_PENDING_CALLS(PyInterpreterState *interp)
Victor Stinnerda2914d2020-03-20 09:29:08 +0100187{
Victor Stinner299b8c62020-05-05 17:40:18 +0200188 struct _ceval_runtime_state *ceval = &interp->runtime->ceval;
189 struct _ceval_state *ceval2 = &interp->ceval;
190 _Py_atomic_store_relaxed(&ceval2->pending.calls_to_do, 1);
191 COMPUTE_EVAL_BREAKER(interp, ceval, ceval2);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100192}
Eric Snowfdf282d2019-01-11 14:26:55 -0700193
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000194
Victor Stinnerda2914d2020-03-20 09:29:08 +0100195static inline void
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200196UNSIGNAL_PENDING_CALLS(PyInterpreterState *interp)
Victor Stinnerda2914d2020-03-20 09:29:08 +0100197{
Victor Stinner299b8c62020-05-05 17:40:18 +0200198 struct _ceval_runtime_state *ceval = &interp->runtime->ceval;
199 struct _ceval_state *ceval2 = &interp->ceval;
200 _Py_atomic_store_relaxed(&ceval2->pending.calls_to_do, 0);
201 COMPUTE_EVAL_BREAKER(interp, ceval, ceval2);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100202}
203
204
205static inline void
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200206SIGNAL_PENDING_SIGNALS(PyInterpreterState *interp)
Victor Stinnerda2914d2020-03-20 09:29:08 +0100207{
Victor Stinner299b8c62020-05-05 17:40:18 +0200208 struct _ceval_runtime_state *ceval = &interp->runtime->ceval;
209 struct _ceval_state *ceval2 = &interp->ceval;
Victor Stinner0b1e3302020-05-05 16:14:31 +0200210 _Py_atomic_store_relaxed(&ceval->signals_pending, 1);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100211 /* eval_breaker is not set to 1 if thread_can_handle_signals() is false */
Victor Stinner299b8c62020-05-05 17:40:18 +0200212 COMPUTE_EVAL_BREAKER(interp, ceval, ceval2);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100213}
214
215
216static inline void
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200217UNSIGNAL_PENDING_SIGNALS(PyInterpreterState *interp)
Victor Stinnerda2914d2020-03-20 09:29:08 +0100218{
Victor Stinner299b8c62020-05-05 17:40:18 +0200219 struct _ceval_runtime_state *ceval = &interp->runtime->ceval;
220 struct _ceval_state *ceval2 = &interp->ceval;
Victor Stinner0b1e3302020-05-05 16:14:31 +0200221 _Py_atomic_store_relaxed(&ceval->signals_pending, 0);
Victor Stinner299b8c62020-05-05 17:40:18 +0200222 COMPUTE_EVAL_BREAKER(interp, ceval, ceval2);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100223}
224
225
226static inline void
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200227SIGNAL_ASYNC_EXC(PyInterpreterState *interp)
Victor Stinnerda2914d2020-03-20 09:29:08 +0100228{
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200229 struct _ceval_state *ceval2 = &interp->ceval;
Victor Stinnerda2914d2020-03-20 09:29:08 +0100230 ceval2->pending.async_exc = 1;
231 _Py_atomic_store_relaxed(&ceval2->eval_breaker, 1);
232}
233
234
235static inline void
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200236UNSIGNAL_ASYNC_EXC(PyInterpreterState *interp)
Victor Stinnerda2914d2020-03-20 09:29:08 +0100237{
Victor Stinner299b8c62020-05-05 17:40:18 +0200238 struct _ceval_runtime_state *ceval = &interp->runtime->ceval;
239 struct _ceval_state *ceval2 = &interp->ceval;
240 ceval2->pending.async_exc = 0;
241 COMPUTE_EVAL_BREAKER(interp, ceval, ceval2);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100242}
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000243
244
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000245#ifdef HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000246#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +0000247#endif
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000248#include "ceval_gil.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000249
Victor Stinner3026cad2020-06-01 16:02:40 +0200250void _Py_NO_RETURN
251_Py_FatalError_TstateNULL(const char *func)
Victor Stinnereb4e2ae2020-03-08 11:57:45 +0100252{
Victor Stinner3026cad2020-06-01 16:02:40 +0200253 _Py_FatalErrorFunc(func,
254 "the function must be called with the GIL held, "
255 "but the GIL is released "
256 "(the current Python thread state is NULL)");
Victor Stinnereb4e2ae2020-03-08 11:57:45 +0100257}
258
Victor Stinner7be4e352020-05-05 20:27:47 +0200259#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
260int
261_PyEval_ThreadsInitialized(PyInterpreterState *interp)
262{
263 return gil_created(&interp->ceval.gil);
264}
265
266int
267PyEval_ThreadsInitialized(void)
268{
269 // Fatal error if there is no current interpreter
270 PyInterpreterState *interp = PyInterpreterState_Get();
271 return _PyEval_ThreadsInitialized(interp);
272}
273#else
Tim Peters7f468f22004-10-11 02:40:51 +0000274int
Victor Stinner175a7042020-03-10 00:37:48 +0100275_PyEval_ThreadsInitialized(_PyRuntimeState *runtime)
276{
277 return gil_created(&runtime->ceval.gil);
278}
279
280int
Tim Peters7f468f22004-10-11 02:40:51 +0000281PyEval_ThreadsInitialized(void)
282{
Victor Stinner01b1cc12019-11-20 02:27:56 +0100283 _PyRuntimeState *runtime = &_PyRuntime;
Victor Stinner175a7042020-03-10 00:37:48 +0100284 return _PyEval_ThreadsInitialized(runtime);
Tim Peters7f468f22004-10-11 02:40:51 +0000285}
Victor Stinner7be4e352020-05-05 20:27:47 +0200286#endif
Tim Peters7f468f22004-10-11 02:40:51 +0000287
Victor Stinner111e4ee2020-03-09 21:24:14 +0100288PyStatus
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200289_PyEval_InitGIL(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000290{
Victor Stinner7be4e352020-05-05 20:27:47 +0200291#ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200292 if (!_Py_IsMainInterpreter(tstate)) {
293 /* Currently, the GIL is shared by all interpreters,
294 and only the main interpreter is responsible to create
295 and destroy it. */
296 return _PyStatus_OK();
Victor Stinner111e4ee2020-03-09 21:24:14 +0100297 }
Victor Stinner7be4e352020-05-05 20:27:47 +0200298#endif
Victor Stinner111e4ee2020-03-09 21:24:14 +0100299
Victor Stinner7be4e352020-05-05 20:27:47 +0200300#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
301 struct _gil_runtime_state *gil = &tstate->interp->ceval.gil;
302#else
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200303 struct _gil_runtime_state *gil = &tstate->interp->runtime->ceval.gil;
Victor Stinner7be4e352020-05-05 20:27:47 +0200304#endif
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200305 assert(!gil_created(gil));
Victor Stinner85f5a692020-03-09 22:12:04 +0100306
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200307 PyThread_init_thread();
308 create_gil(gil);
309
310 take_gil(tstate);
311
312 assert(gil_created(gil));
Victor Stinner111e4ee2020-03-09 21:24:14 +0100313 return _PyStatus_OK();
314}
315
316void
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200317_PyEval_FiniGIL(PyThreadState *tstate)
318{
Victor Stinner7be4e352020-05-05 20:27:47 +0200319#ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200320 if (!_Py_IsMainInterpreter(tstate)) {
321 /* Currently, the GIL is shared by all interpreters,
322 and only the main interpreter is responsible to create
323 and destroy it. */
324 return;
325 }
Victor Stinner7be4e352020-05-05 20:27:47 +0200326#endif
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200327
Victor Stinner7be4e352020-05-05 20:27:47 +0200328#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
329 struct _gil_runtime_state *gil = &tstate->interp->ceval.gil;
330#else
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200331 struct _gil_runtime_state *gil = &tstate->interp->runtime->ceval.gil;
Victor Stinner7be4e352020-05-05 20:27:47 +0200332#endif
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200333 if (!gil_created(gil)) {
334 /* First Py_InitializeFromConfig() call: the GIL doesn't exist
335 yet: do nothing. */
336 return;
337 }
338
339 destroy_gil(gil);
340 assert(!gil_created(gil));
341}
342
343void
Victor Stinner111e4ee2020-03-09 21:24:14 +0100344PyEval_InitThreads(void)
345{
Victor Stinnerb4698ec2020-03-10 01:28:54 +0100346 /* Do nothing: kept for backward compatibility */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000347}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000348
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000349void
Inada Naoki91234a12019-06-03 21:30:58 +0900350_PyEval_Fini(void)
351{
352#if OPCACHE_STATS
353 fprintf(stderr, "-- Opcode cache number of objects = %zd\n",
354 opcache_code_objects);
355
356 fprintf(stderr, "-- Opcode cache total extra mem = %zd\n",
357 opcache_code_objects_extra_mem);
358
359 fprintf(stderr, "\n");
360
361 fprintf(stderr, "-- Opcode cache LOAD_GLOBAL hits = %zd (%d%%)\n",
362 opcache_global_hits,
363 (int) (100.0 * opcache_global_hits /
364 (opcache_global_hits + opcache_global_misses)));
365
366 fprintf(stderr, "-- Opcode cache LOAD_GLOBAL misses = %zd (%d%%)\n",
367 opcache_global_misses,
368 (int) (100.0 * opcache_global_misses /
369 (opcache_global_hits + opcache_global_misses)));
370
371 fprintf(stderr, "-- Opcode cache LOAD_GLOBAL opts = %zd\n",
372 opcache_global_opts);
373
374 fprintf(stderr, "\n");
Pablo Galindo109826c2020-10-20 06:22:44 +0100375
376 fprintf(stderr, "-- Opcode cache LOAD_ATTR hits = %zd (%d%%)\n",
377 opcache_attr_hits,
378 (int) (100.0 * opcache_attr_hits /
379 opcache_attr_total));
380
381 fprintf(stderr, "-- Opcode cache LOAD_ATTR misses = %zd (%d%%)\n",
382 opcache_attr_misses,
383 (int) (100.0 * opcache_attr_misses /
384 opcache_attr_total));
385
386 fprintf(stderr, "-- Opcode cache LOAD_ATTR opts = %zd\n",
387 opcache_attr_opts);
388
389 fprintf(stderr, "-- Opcode cache LOAD_ATTR deopts = %zd\n",
390 opcache_attr_deopts);
391
392 fprintf(stderr, "-- Opcode cache LOAD_ATTR total = %zd\n",
393 opcache_attr_total);
Inada Naoki91234a12019-06-03 21:30:58 +0900394#endif
395}
396
397void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000398PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000399{
Victor Stinner09532fe2019-05-10 23:39:09 +0200400 _PyRuntimeState *runtime = &_PyRuntime;
Victor Stinner09532fe2019-05-10 23:39:09 +0200401 PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime);
Victor Stinner3026cad2020-06-01 16:02:40 +0200402 _Py_EnsureTstateNotNULL(tstate);
Victor Stinnereb4e2ae2020-03-08 11:57:45 +0100403
Victor Stinner85f5a692020-03-09 22:12:04 +0100404 take_gil(tstate);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000405}
406
407void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000408PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000409{
Victor Stinner09532fe2019-05-10 23:39:09 +0200410 _PyRuntimeState *runtime = &_PyRuntime;
Victor Stinnere225beb2019-06-03 18:14:24 +0200411 PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000412 /* This function must succeed when the current thread state is NULL.
Victor Stinner50b48572018-11-01 01:51:40 +0100413 We therefore avoid PyThreadState_Get() which dumps a fatal error
Victor Stinnerda2914d2020-03-20 09:29:08 +0100414 in debug mode. */
Victor Stinner299b8c62020-05-05 17:40:18 +0200415 struct _ceval_runtime_state *ceval = &runtime->ceval;
416 struct _ceval_state *ceval2 = &tstate->interp->ceval;
417 drop_gil(ceval, ceval2, tstate);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000418}
419
420void
Victor Stinner23ef89d2020-03-18 02:26:04 +0100421_PyEval_ReleaseLock(PyThreadState *tstate)
422{
423 struct _ceval_runtime_state *ceval = &tstate->interp->runtime->ceval;
Victor Stinner0b1e3302020-05-05 16:14:31 +0200424 struct _ceval_state *ceval2 = &tstate->interp->ceval;
425 drop_gil(ceval, ceval2, tstate);
Victor Stinner23ef89d2020-03-18 02:26:04 +0100426}
427
428void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000429PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000430{
Victor Stinner3026cad2020-06-01 16:02:40 +0200431 _Py_EnsureTstateNotNULL(tstate);
Victor Stinnereb4e2ae2020-03-08 11:57:45 +0100432
Victor Stinner85f5a692020-03-09 22:12:04 +0100433 take_gil(tstate);
Victor Stinnere225beb2019-06-03 18:14:24 +0200434
Victor Stinner85f5a692020-03-09 22:12:04 +0100435 struct _gilstate_runtime_state *gilstate = &tstate->interp->runtime->gilstate;
Victor Stinnere838a932020-05-05 19:56:48 +0200436#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
437 (void)_PyThreadState_Swap(gilstate, tstate);
438#else
Victor Stinner85f5a692020-03-09 22:12:04 +0100439 if (_PyThreadState_Swap(gilstate, tstate) != NULL) {
Victor Stinner9e5d30c2020-03-07 00:54:20 +0100440 Py_FatalError("non-NULL old thread state");
Victor Stinner09532fe2019-05-10 23:39:09 +0200441 }
Victor Stinnere838a932020-05-05 19:56:48 +0200442#endif
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000443}
444
445void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000446PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000447{
Victor Stinnerda2914d2020-03-20 09:29:08 +0100448 assert(is_tstate_valid(tstate));
Victor Stinner09532fe2019-05-10 23:39:09 +0200449
Victor Stinner01b1cc12019-11-20 02:27:56 +0100450 _PyRuntimeState *runtime = tstate->interp->runtime;
Victor Stinner09532fe2019-05-10 23:39:09 +0200451 PyThreadState *new_tstate = _PyThreadState_Swap(&runtime->gilstate, NULL);
452 if (new_tstate != tstate) {
Victor Stinner9e5d30c2020-03-07 00:54:20 +0100453 Py_FatalError("wrong thread state");
Victor Stinner09532fe2019-05-10 23:39:09 +0200454 }
Victor Stinner0b1e3302020-05-05 16:14:31 +0200455 struct _ceval_runtime_state *ceval = &runtime->ceval;
456 struct _ceval_state *ceval2 = &tstate->interp->ceval;
457 drop_gil(ceval, ceval2, tstate);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000458}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000459
Dong-hee Na62f75fe2020-04-15 01:16:24 +0900460#ifdef HAVE_FORK
Antoine Pitrouf7ecfac2017-05-28 11:35:14 +0200461/* This function is called from PyOS_AfterFork_Child to destroy all threads
Victor Stinner26881c82020-06-02 15:51:37 +0200462 which are not running in the child process, and clear internal locks
463 which might be held by those threads. */
464PyStatus
Victor Stinner317bab02020-06-02 18:44:54 +0200465_PyEval_ReInitThreads(PyThreadState *tstate)
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000466{
Victor Stinner317bab02020-06-02 18:44:54 +0200467 _PyRuntimeState *runtime = tstate->interp->runtime;
Victor Stinner7be4e352020-05-05 20:27:47 +0200468
469#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
470 struct _gil_runtime_state *gil = &tstate->interp->ceval.gil;
471#else
Victor Stinner56bfdeb2020-03-18 09:26:25 +0100472 struct _gil_runtime_state *gil = &runtime->ceval.gil;
Victor Stinner7be4e352020-05-05 20:27:47 +0200473#endif
Victor Stinner56bfdeb2020-03-18 09:26:25 +0100474 if (!gil_created(gil)) {
Victor Stinner26881c82020-06-02 15:51:37 +0200475 return _PyStatus_OK();
Victor Stinner09532fe2019-05-10 23:39:09 +0200476 }
Victor Stinner56bfdeb2020-03-18 09:26:25 +0100477 recreate_gil(gil);
Victor Stinner85f5a692020-03-09 22:12:04 +0100478
479 take_gil(tstate);
Eric Snow8479a342019-03-08 23:44:33 -0700480
Victor Stinner50e6e992020-03-19 02:41:21 +0100481 struct _pending_calls *pending = &tstate->interp->ceval.pending;
Dong-hee Na62f75fe2020-04-15 01:16:24 +0900482 if (_PyThread_at_fork_reinit(&pending->lock) < 0) {
Victor Stinner26881c82020-06-02 15:51:37 +0200483 return _PyStatus_ERR("Can't reinitialize pending calls lock");
Eric Snow8479a342019-03-08 23:44:33 -0700484 }
Jesse Nollera8513972008-07-17 16:49:17 +0000485
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200486 /* Destroy all threads except the current one */
Victor Stinnereb4e2ae2020-03-08 11:57:45 +0100487 _PyThreadState_DeleteExcept(runtime, tstate);
Victor Stinner26881c82020-06-02 15:51:37 +0200488 return _PyStatus_OK();
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000489}
Dong-hee Na62f75fe2020-04-15 01:16:24 +0900490#endif
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000491
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000492/* This function is used to signal that async exceptions are waiting to be
Zackery Spytzeef05962018-09-29 10:07:11 -0600493 raised. */
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000494
495void
Victor Stinner56bfdeb2020-03-18 09:26:25 +0100496_PyEval_SignalAsyncExc(PyThreadState *tstate)
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000497{
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200498 assert(is_tstate_valid(tstate));
499 SIGNAL_ASYNC_EXC(tstate->interp);
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000500}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000501
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000502PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000503PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000504{
Victor Stinner09532fe2019-05-10 23:39:09 +0200505 _PyRuntimeState *runtime = &_PyRuntime;
Victor Stinnere838a932020-05-05 19:56:48 +0200506#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
507 PyThreadState *old_tstate = _PyThreadState_GET();
508 PyThreadState *tstate = _PyThreadState_Swap(&runtime->gilstate, old_tstate);
509#else
Victor Stinner09532fe2019-05-10 23:39:09 +0200510 PyThreadState *tstate = _PyThreadState_Swap(&runtime->gilstate, NULL);
Victor Stinnere838a932020-05-05 19:56:48 +0200511#endif
Victor Stinner3026cad2020-06-01 16:02:40 +0200512 _Py_EnsureTstateNotNULL(tstate);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100513
Victor Stinner0b1e3302020-05-05 16:14:31 +0200514 struct _ceval_runtime_state *ceval = &runtime->ceval;
515 struct _ceval_state *ceval2 = &tstate->interp->ceval;
Victor Stinner7be4e352020-05-05 20:27:47 +0200516#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
517 assert(gil_created(&ceval2->gil));
518#else
Victor Stinnere225beb2019-06-03 18:14:24 +0200519 assert(gil_created(&ceval->gil));
Victor Stinner7be4e352020-05-05 20:27:47 +0200520#endif
Victor Stinner0b1e3302020-05-05 16:14:31 +0200521 drop_gil(ceval, ceval2, tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000522 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000523}
524
525void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000526PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000527{
Victor Stinner3026cad2020-06-01 16:02:40 +0200528 _Py_EnsureTstateNotNULL(tstate);
Victor Stinnereb4e2ae2020-03-08 11:57:45 +0100529
Victor Stinner85f5a692020-03-09 22:12:04 +0100530 take_gil(tstate);
Victor Stinner17c68b82020-01-30 12:20:48 +0100531
Victor Stinner85f5a692020-03-09 22:12:04 +0100532 struct _gilstate_runtime_state *gilstate = &tstate->interp->runtime->gilstate;
533 _PyThreadState_Swap(gilstate, tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000534}
535
536
Guido van Rossuma9672091994-09-14 13:31:22 +0000537/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
538 signal handlers or Mac I/O completion routines) can schedule calls
539 to a function to be called synchronously.
540 The synchronous function is called with one void* argument.
541 It should return 0 for success or -1 for failure -- failure should
542 be accompanied by an exception.
543
544 If registry succeeds, the registry function returns 0; if it fails
545 (e.g. due to too many pending calls) it returns -1 (without setting
546 an exception condition).
547
548 Note that because registry may occur from within signal handlers,
549 or other asynchronous events, calling malloc() is unsafe!
550
Guido van Rossuma9672091994-09-14 13:31:22 +0000551 Any thread can schedule pending calls, but only the main thread
552 will execute them.
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000553 There is no facility to schedule calls to a particular thread, but
554 that should be easy to change, should that ever be required. In
555 that case, the static variables here should go into the python
556 threadstate.
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000557*/
Guido van Rossuma9672091994-09-14 13:31:22 +0000558
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200559void
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200560_PyEval_SignalReceived(PyInterpreterState *interp)
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200561{
562 /* bpo-30703: Function called when the C signal handler of Python gets a
Victor Stinner50e6e992020-03-19 02:41:21 +0100563 signal. We cannot queue a callback using _PyEval_AddPendingCall() since
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200564 that function is not async-signal-safe. */
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200565 SIGNAL_PENDING_SIGNALS(interp);
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200566}
567
Eric Snow5be45a62019-03-08 22:47:07 -0700568/* Push one item onto the queue while holding the lock. */
569static int
Victor Stinnere225beb2019-06-03 18:14:24 +0200570_push_pending_call(struct _pending_calls *pending,
Eric Snow842a2f02019-03-15 15:47:51 -0600571 int (*func)(void *), void *arg)
Eric Snow5be45a62019-03-08 22:47:07 -0700572{
Eric Snow842a2f02019-03-15 15:47:51 -0600573 int i = pending->last;
Eric Snow5be45a62019-03-08 22:47:07 -0700574 int j = (i + 1) % NPENDINGCALLS;
Eric Snow842a2f02019-03-15 15:47:51 -0600575 if (j == pending->first) {
Eric Snow5be45a62019-03-08 22:47:07 -0700576 return -1; /* Queue full */
577 }
Eric Snow842a2f02019-03-15 15:47:51 -0600578 pending->calls[i].func = func;
579 pending->calls[i].arg = arg;
580 pending->last = j;
Eric Snow5be45a62019-03-08 22:47:07 -0700581 return 0;
582}
583
584/* Pop one item off the queue while holding the lock. */
585static void
Victor Stinnere225beb2019-06-03 18:14:24 +0200586_pop_pending_call(struct _pending_calls *pending,
Eric Snow842a2f02019-03-15 15:47:51 -0600587 int (**func)(void *), void **arg)
Eric Snow5be45a62019-03-08 22:47:07 -0700588{
Eric Snow842a2f02019-03-15 15:47:51 -0600589 int i = pending->first;
590 if (i == pending->last) {
Eric Snow5be45a62019-03-08 22:47:07 -0700591 return; /* Queue empty */
592 }
593
Eric Snow842a2f02019-03-15 15:47:51 -0600594 *func = pending->calls[i].func;
595 *arg = pending->calls[i].arg;
596 pending->first = (i + 1) % NPENDINGCALLS;
Eric Snow5be45a62019-03-08 22:47:07 -0700597}
598
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200599/* This implementation is thread-safe. It allows
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000600 scheduling to be made from any thread, and even from an executing
601 callback.
602 */
603
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000604int
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200605_PyEval_AddPendingCall(PyInterpreterState *interp,
Victor Stinner09532fe2019-05-10 23:39:09 +0200606 int (*func)(void *), void *arg)
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000607{
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200608 struct _pending_calls *pending = &interp->ceval.pending;
Eric Snow842a2f02019-03-15 15:47:51 -0600609
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200610 /* Ensure that _PyEval_InitPendingCalls() was called
611 and that _PyEval_FiniPendingCalls() is not called yet. */
612 assert(pending->lock != NULL);
613
Eric Snow842a2f02019-03-15 15:47:51 -0600614 PyThread_acquire_lock(pending->lock, WAIT_LOCK);
Victor Stinnere225beb2019-06-03 18:14:24 +0200615 int result = _push_pending_call(pending, func, arg);
Eric Snow842a2f02019-03-15 15:47:51 -0600616 PyThread_release_lock(pending->lock);
Eric Snow5be45a62019-03-08 22:47:07 -0700617
Victor Stinnere225beb2019-06-03 18:14:24 +0200618 /* signal main loop */
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200619 SIGNAL_PENDING_CALLS(interp);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000620 return result;
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000621}
622
Victor Stinner09532fe2019-05-10 23:39:09 +0200623int
624Py_AddPendingCall(int (*func)(void *), void *arg)
625{
Victor Stinner50e6e992020-03-19 02:41:21 +0100626 /* Best-effort to support subinterpreters and calls with the GIL released.
627
628 First attempt _PyThreadState_GET() since it supports subinterpreters.
629
630 If the GIL is released, _PyThreadState_GET() returns NULL . In this
631 case, use PyGILState_GetThisThreadState() which works even if the GIL
632 is released.
633
634 Sadly, PyGILState_GetThisThreadState() doesn't support subinterpreters:
635 see bpo-10915 and bpo-15751.
636
Victor Stinner8849e592020-03-18 19:28:53 +0100637 Py_AddPendingCall() doesn't require the caller to hold the GIL. */
Victor Stinner50e6e992020-03-19 02:41:21 +0100638 PyThreadState *tstate = _PyThreadState_GET();
639 if (tstate == NULL) {
640 tstate = PyGILState_GetThisThreadState();
641 }
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200642
643 PyInterpreterState *interp;
644 if (tstate != NULL) {
645 interp = tstate->interp;
646 }
647 else {
648 /* Last resort: use the main interpreter */
649 interp = _PyRuntime.interpreters.main;
650 }
651 return _PyEval_AddPendingCall(interp, func, arg);
Victor Stinner09532fe2019-05-10 23:39:09 +0200652}
653
Eric Snowfdf282d2019-01-11 14:26:55 -0700654static int
Victor Stinnerd7fabc12020-03-18 01:56:21 +0100655handle_signals(PyThreadState *tstate)
Eric Snowfdf282d2019-01-11 14:26:55 -0700656{
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200657 assert(is_tstate_valid(tstate));
658 if (!_Py_ThreadCanHandleSignals(tstate->interp)) {
Eric Snow64d6cc82019-02-23 15:40:43 -0700659 return 0;
660 }
Eric Snowfdf282d2019-01-11 14:26:55 -0700661
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200662 UNSIGNAL_PENDING_SIGNALS(tstate->interp);
Victor Stinner72818982020-03-26 22:28:11 +0100663 if (_PyErr_CheckSignalsTstate(tstate) < 0) {
664 /* On failure, re-schedule a call to handle_signals(). */
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200665 SIGNAL_PENDING_SIGNALS(tstate->interp);
Eric Snowfdf282d2019-01-11 14:26:55 -0700666 return -1;
667 }
668 return 0;
669}
670
671static int
Victor Stinnerd7fabc12020-03-18 01:56:21 +0100672make_pending_calls(PyThreadState *tstate)
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000673{
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200674 assert(is_tstate_valid(tstate));
675
Victor Stinnerd8316882020-03-20 14:50:35 +0100676 /* only execute pending calls on main thread */
677 if (!_Py_ThreadCanHandlePendingCalls()) {
Victor Stinnere225beb2019-06-03 18:14:24 +0200678 return 0;
679 }
680
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000681 /* don't perform recursive pending calls */
Victor Stinnerda2914d2020-03-20 09:29:08 +0100682 static int busy = 0;
Eric Snowfdf282d2019-01-11 14:26:55 -0700683 if (busy) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000684 return 0;
Eric Snowfdf282d2019-01-11 14:26:55 -0700685 }
Charles-François Natalif23339a2011-07-23 18:15:43 +0200686 busy = 1;
Victor Stinnerda2914d2020-03-20 09:29:08 +0100687
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200688 /* unsignal before starting to call callbacks, so that any callback
689 added in-between re-signals */
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200690 UNSIGNAL_PENDING_CALLS(tstate->interp);
Eric Snowfdf282d2019-01-11 14:26:55 -0700691 int res = 0;
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200692
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000693 /* perform a bounded number of calls, in case of recursion */
Victor Stinnerda2914d2020-03-20 09:29:08 +0100694 struct _pending_calls *pending = &tstate->interp->ceval.pending;
Eric Snowfdf282d2019-01-11 14:26:55 -0700695 for (int i=0; i<NPENDINGCALLS; i++) {
Eric Snow5be45a62019-03-08 22:47:07 -0700696 int (*func)(void *) = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000697 void *arg = NULL;
698
699 /* pop one item off the queue while holding the lock */
Eric Snow842a2f02019-03-15 15:47:51 -0600700 PyThread_acquire_lock(pending->lock, WAIT_LOCK);
Victor Stinnere225beb2019-06-03 18:14:24 +0200701 _pop_pending_call(pending, &func, &arg);
Eric Snow842a2f02019-03-15 15:47:51 -0600702 PyThread_release_lock(pending->lock);
Eric Snow5be45a62019-03-08 22:47:07 -0700703
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100704 /* having released the lock, perform the callback */
Eric Snow5be45a62019-03-08 22:47:07 -0700705 if (func == NULL) {
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100706 break;
Eric Snow5be45a62019-03-08 22:47:07 -0700707 }
Eric Snowfdf282d2019-01-11 14:26:55 -0700708 res = func(arg);
709 if (res) {
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200710 goto error;
711 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000712 }
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200713
Charles-François Natalif23339a2011-07-23 18:15:43 +0200714 busy = 0;
Eric Snowfdf282d2019-01-11 14:26:55 -0700715 return res;
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200716
717error:
718 busy = 0;
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200719 SIGNAL_PENDING_CALLS(tstate->interp);
Eric Snowfdf282d2019-01-11 14:26:55 -0700720 return res;
721}
722
Eric Snow842a2f02019-03-15 15:47:51 -0600723void
Victor Stinner2b1df452020-01-13 18:46:59 +0100724_Py_FinishPendingCalls(PyThreadState *tstate)
Eric Snow842a2f02019-03-15 15:47:51 -0600725{
Eric Snow842a2f02019-03-15 15:47:51 -0600726 assert(PyGILState_Check());
727
Victor Stinner50e6e992020-03-19 02:41:21 +0100728 struct _pending_calls *pending = &tstate->interp->ceval.pending;
Victor Stinner09532fe2019-05-10 23:39:09 +0200729
Eric Snow842a2f02019-03-15 15:47:51 -0600730 if (!_Py_atomic_load_relaxed(&(pending->calls_to_do))) {
731 return;
732 }
733
Victor Stinnerd7fabc12020-03-18 01:56:21 +0100734 if (make_pending_calls(tstate) < 0) {
Victor Stinnere225beb2019-06-03 18:14:24 +0200735 PyObject *exc, *val, *tb;
736 _PyErr_Fetch(tstate, &exc, &val, &tb);
737 PyErr_BadInternalCall();
738 _PyErr_ChainExceptions(exc, val, tb);
739 _PyErr_Print(tstate);
Eric Snow842a2f02019-03-15 15:47:51 -0600740 }
741}
742
Eric Snowfdf282d2019-01-11 14:26:55 -0700743/* Py_MakePendingCalls() is a simple wrapper for the sake
744 of backward-compatibility. */
745int
746Py_MakePendingCalls(void)
747{
748 assert(PyGILState_Check());
749
Victor Stinnerd7fabc12020-03-18 01:56:21 +0100750 PyThreadState *tstate = _PyThreadState_GET();
751
Eric Snowfdf282d2019-01-11 14:26:55 -0700752 /* Python signal handler doesn't really queue a callback: it only signals
753 that a signal was received, see _PyEval_SignalReceived(). */
Victor Stinnerd7fabc12020-03-18 01:56:21 +0100754 int res = handle_signals(tstate);
Eric Snowfdf282d2019-01-11 14:26:55 -0700755 if (res != 0) {
756 return res;
757 }
758
Victor Stinnerd7fabc12020-03-18 01:56:21 +0100759 res = make_pending_calls(tstate);
Eric Snowb75b1a352019-04-12 10:20:10 -0600760 if (res != 0) {
761 return res;
762 }
763
764 return 0;
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000765}
766
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000767/* The interpreter's recursion limit */
768
Hye-Shik Changb6fa2812005-04-04 15:49:02 +0000769#ifndef Py_DEFAULT_RECURSION_LIMIT
Victor Stinner19c3ac92020-09-23 14:04:57 +0200770# define Py_DEFAULT_RECURSION_LIMIT 1000
Hye-Shik Changb6fa2812005-04-04 15:49:02 +0000771#endif
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600772
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600773void
Victor Stinnerdab84232020-03-17 18:56:44 +0100774_PyEval_InitRuntimeState(struct _ceval_runtime_state *ceval)
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600775{
Victor Stinner7be4e352020-05-05 20:27:47 +0200776#ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
Victor Stinnerdab84232020-03-17 18:56:44 +0100777 _gil_initialize(&ceval->gil);
Victor Stinner7be4e352020-05-05 20:27:47 +0200778#endif
Victor Stinnerdab84232020-03-17 18:56:44 +0100779}
780
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200781int
Victor Stinnerdab84232020-03-17 18:56:44 +0100782_PyEval_InitState(struct _ceval_state *ceval)
783{
Victor Stinner4e30ed32020-05-05 16:52:52 +0200784 ceval->recursion_limit = Py_DEFAULT_RECURSION_LIMIT;
785
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200786 struct _pending_calls *pending = &ceval->pending;
787 assert(pending->lock == NULL);
788
789 pending->lock = PyThread_allocate_lock();
790 if (pending->lock == NULL) {
791 return -1;
792 }
Victor Stinner7be4e352020-05-05 20:27:47 +0200793
794#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
795 _gil_initialize(&ceval->gil);
796#endif
797
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200798 return 0;
799}
800
801void
802_PyEval_FiniState(struct _ceval_state *ceval)
803{
804 struct _pending_calls *pending = &ceval->pending;
805 if (pending->lock != NULL) {
806 PyThread_free_lock(pending->lock);
807 pending->lock = NULL;
808 }
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600809}
810
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000811int
812Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000813{
Victor Stinner1bcc32f2020-06-10 20:08:26 +0200814 PyInterpreterState *interp = _PyInterpreterState_GET();
815 return interp->ceval.recursion_limit;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000816}
817
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000818void
819Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000820{
Victor Stinner4e30ed32020-05-05 16:52:52 +0200821 PyThreadState *tstate = _PyThreadState_GET();
822 tstate->interp->ceval.recursion_limit = new_limit;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000823}
824
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100825/* The function _Py_EnterRecursiveCall() only calls _Py_CheckRecursiveCall()
Victor Stinner19c3ac92020-09-23 14:04:57 +0200826 if the recursion_depth reaches recursion_limit.
827 If USE_STACKCHECK, the macro decrements recursion_limit
Armin Rigo2b3eb402003-10-28 12:05:48 +0000828 to guarantee that _Py_CheckRecursiveCall() is regularly called.
829 Without USE_STACKCHECK, there is no need for this. */
830int
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100831_Py_CheckRecursiveCall(PyThreadState *tstate, const char *where)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000832{
Victor Stinner4e30ed32020-05-05 16:52:52 +0200833 int recursion_limit = tstate->interp->ceval.recursion_limit;
Armin Rigo2b3eb402003-10-28 12:05:48 +0000834
835#ifdef USE_STACKCHECK
pdox18967932017-10-25 23:03:01 -0700836 tstate->stackcheck_counter = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000837 if (PyOS_CheckStack()) {
838 --tstate->recursion_depth;
Victor Stinner438a12d2019-05-24 17:01:38 +0200839 _PyErr_SetString(tstate, PyExc_MemoryError, "Stack overflow");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000840 return -1;
841 }
pdox18967932017-10-25 23:03:01 -0700842#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000843 if (tstate->overflowed) {
844 if (tstate->recursion_depth > recursion_limit + 50) {
845 /* Overflowing while handling an overflow. Give up. */
846 Py_FatalError("Cannot recover from stack overflow.");
847 }
848 return 0;
849 }
850 if (tstate->recursion_depth > recursion_limit) {
851 --tstate->recursion_depth;
852 tstate->overflowed = 1;
Victor Stinner438a12d2019-05-24 17:01:38 +0200853 _PyErr_Format(tstate, PyExc_RecursionError,
854 "maximum recursion depth exceeded%s",
855 where);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000856 return -1;
857 }
858 return 0;
Armin Rigo2b3eb402003-10-28 12:05:48 +0000859}
860
Victor Stinner09532fe2019-05-10 23:39:09 +0200861static int do_raise(PyThreadState *tstate, PyObject *exc, PyObject *cause);
Victor Stinner438a12d2019-05-24 17:01:38 +0200862static int unpack_iterable(PyThreadState *, PyObject *, int, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000863
Victor Stinnere225beb2019-06-03 18:14:24 +0200864#define _Py_TracingPossible(ceval) ((ceval)->tracing_possible)
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000865
Guido van Rossum374a9221991-04-04 10:40:29 +0000866
Guido van Rossumb209a111997-04-29 18:18:01 +0000867PyObject *
Martin v. Löwis4d0d4712010-12-03 20:14:31 +0000868PyEval_EvalCode(PyObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000869{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000870 return PyEval_EvalCodeEx(co,
871 globals, locals,
872 (PyObject **)NULL, 0,
873 (PyObject **)NULL, 0,
874 (PyObject **)NULL, 0,
875 NULL, NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000876}
877
878
879/* Interpreter main loop */
880
Martin v. Löwis8d97e332004-06-27 15:43:12 +0000881PyObject *
Victor Stinnerb9e68122019-11-14 12:20:46 +0100882PyEval_EvalFrame(PyFrameObject *f)
883{
Victor Stinner0b72b232020-03-12 23:18:39 +0100884 /* Function kept for backward compatibility */
Victor Stinnerb9e68122019-11-14 12:20:46 +0100885 PyThreadState *tstate = _PyThreadState_GET();
886 return _PyEval_EvalFrame(tstate, f, 0);
Phillip J. Eby0d6615f2005-08-02 00:46:46 +0000887}
888
889PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000890PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
Guido van Rossum374a9221991-04-04 10:40:29 +0000891{
Victor Stinnerb9e68122019-11-14 12:20:46 +0100892 PyThreadState *tstate = _PyThreadState_GET();
893 return _PyEval_EvalFrame(tstate, f, throwflag);
Brett Cannon3cebf932016-09-05 15:33:46 -0700894}
895
Victor Stinnerda2914d2020-03-20 09:29:08 +0100896
897/* Handle signals, pending calls, GIL drop request
898 and asynchronous exception */
899static int
900eval_frame_handle_pending(PyThreadState *tstate)
901{
Victor Stinnerda2914d2020-03-20 09:29:08 +0100902 _PyRuntimeState * const runtime = &_PyRuntime;
903 struct _ceval_runtime_state *ceval = &runtime->ceval;
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200904
905 /* Pending signals */
Victor Stinner299b8c62020-05-05 17:40:18 +0200906 if (_Py_atomic_load_relaxed(&ceval->signals_pending)) {
Victor Stinnerda2914d2020-03-20 09:29:08 +0100907 if (handle_signals(tstate) != 0) {
908 return -1;
909 }
910 }
911
912 /* Pending calls */
Victor Stinner299b8c62020-05-05 17:40:18 +0200913 struct _ceval_state *ceval2 = &tstate->interp->ceval;
Victor Stinnerda2914d2020-03-20 09:29:08 +0100914 if (_Py_atomic_load_relaxed(&ceval2->pending.calls_to_do)) {
915 if (make_pending_calls(tstate) != 0) {
916 return -1;
917 }
918 }
919
920 /* GIL drop request */
Victor Stinner0b1e3302020-05-05 16:14:31 +0200921 if (_Py_atomic_load_relaxed(&ceval2->gil_drop_request)) {
Victor Stinnerda2914d2020-03-20 09:29:08 +0100922 /* Give another thread a chance */
923 if (_PyThreadState_Swap(&runtime->gilstate, NULL) != tstate) {
924 Py_FatalError("tstate mix-up");
925 }
Victor Stinner0b1e3302020-05-05 16:14:31 +0200926 drop_gil(ceval, ceval2, tstate);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100927
928 /* Other threads may run now */
929
930 take_gil(tstate);
931
Victor Stinnere838a932020-05-05 19:56:48 +0200932#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
933 (void)_PyThreadState_Swap(&runtime->gilstate, tstate);
934#else
Victor Stinnerda2914d2020-03-20 09:29:08 +0100935 if (_PyThreadState_Swap(&runtime->gilstate, tstate) != NULL) {
936 Py_FatalError("orphan tstate");
937 }
Victor Stinnere838a932020-05-05 19:56:48 +0200938#endif
Victor Stinnerda2914d2020-03-20 09:29:08 +0100939 }
940
941 /* Check for asynchronous exception. */
942 if (tstate->async_exc != NULL) {
943 PyObject *exc = tstate->async_exc;
944 tstate->async_exc = NULL;
Victor Stinnerb54a99d2020-04-08 23:35:05 +0200945 UNSIGNAL_ASYNC_EXC(tstate->interp);
Victor Stinnerda2914d2020-03-20 09:29:08 +0100946 _PyErr_SetNone(tstate, exc);
947 Py_DECREF(exc);
948 return -1;
949 }
950
951 return 0;
952}
953
Victor Stinnerc6944e72016-11-11 02:13:35 +0100954PyObject* _Py_HOT_FUNCTION
Victor Stinner0b72b232020-03-12 23:18:39 +0100955_PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag)
Brett Cannon3cebf932016-09-05 15:33:46 -0700956{
Victor Stinner3026cad2020-06-01 16:02:40 +0200957 _Py_EnsureTstateNotNULL(tstate);
Victor Stinner0b72b232020-03-12 23:18:39 +0100958
Guido van Rossum950361c1997-01-24 13:49:28 +0000959#ifdef DXPAIRS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000960 int lastopcode = 0;
Guido van Rossum950361c1997-01-24 13:49:28 +0000961#endif
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200962 PyObject **stack_pointer; /* Next free slot in value stack */
Serhiy Storchakaab874002016-09-11 13:48:15 +0300963 const _Py_CODEUNIT *next_instr;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200964 int opcode; /* Current opcode */
965 int oparg; /* Current opcode argument, if any */
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200966 PyObject **fastlocals, **freevars;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000967 PyObject *retval = NULL; /* Return value */
Victor Stinnerdab84232020-03-17 18:56:44 +0100968 struct _ceval_state * const ceval2 = &tstate->interp->ceval;
Victor Stinner50e6e992020-03-19 02:41:21 +0100969 _Py_atomic_int * const eval_breaker = &ceval2->eval_breaker;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000970 PyCodeObject *co;
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000971
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000972 /* when tracing we set things up so that
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000973
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000974 not (instr_lb <= current_bytecode_offset < instr_ub)
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000975
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000976 is true when the line being executed has changed. The
977 initial values are such as to make this false the first
978 time it is tested. */
979 int instr_ub = -1, instr_lb = 0, instr_prev = -1;
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000980
Serhiy Storchakaab874002016-09-11 13:48:15 +0300981 const _Py_CODEUNIT *first_instr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000982 PyObject *names;
983 PyObject *consts;
Inada Naoki91234a12019-06-03 21:30:58 +0900984 _PyOpcache *co_opcache;
Guido van Rossum374a9221991-04-04 10:40:29 +0000985
Brett Cannon368b4b72012-04-02 12:17:59 -0400986#ifdef LLTRACE
Victor Stinner3c1e4812012-03-26 22:10:51 +0200987 _Py_IDENTIFIER(__ltrace__);
Brett Cannon368b4b72012-04-02 12:17:59 -0400988#endif
Victor Stinner3c1e4812012-03-26 22:10:51 +0200989
Antoine Pitroub52ec782009-01-25 16:34:23 +0000990/* Computed GOTOs, or
991 the-optimization-commonly-but-improperly-known-as-"threaded code"
992 using gcc's labels-as-values extension
993 (http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html).
994
995 The traditional bytecode evaluation loop uses a "switch" statement, which
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000996 decent compilers will optimize as a single indirect branch instruction
Antoine Pitroub52ec782009-01-25 16:34:23 +0000997 combined with a lookup table of jump addresses. However, since the
998 indirect jump instruction is shared by all opcodes, the CPU will have a
999 hard time making the right prediction for where to jump next (actually,
1000 it will be always wrong except in the uncommon case of a sequence of
1001 several identical opcodes).
1002
1003 "Threaded code" in contrast, uses an explicit jump table and an explicit
1004 indirect jump instruction at the end of each opcode. Since the jump
1005 instruction is at a different address for each opcode, the CPU will make a
1006 separate prediction for each of these instructions, which is equivalent to
1007 predicting the second opcode of each opcode pair. These predictions have
1008 a much better chance to turn out valid, especially in small bytecode loops.
1009
1010 A mispredicted branch on a modern CPU flushes the whole pipeline and
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001011 can cost several CPU cycles (depending on the pipeline depth),
Antoine Pitroub52ec782009-01-25 16:34:23 +00001012 and potentially many more instructions (depending on the pipeline width).
1013 A correctly predicted branch, however, is nearly free.
1014
1015 At the time of this writing, the "threaded code" version is up to 15-20%
1016 faster than the normal "switch" version, depending on the compiler and the
1017 CPU architecture.
1018
1019 We disable the optimization if DYNAMIC_EXECUTION_PROFILE is defined,
1020 because it would render the measurements invalid.
1021
1022
1023 NOTE: care must be taken that the compiler doesn't try to "optimize" the
1024 indirect jumps by sharing them between all opcodes. Such optimizations
1025 can be disabled on gcc by using the -fno-gcse flag (or possibly
1026 -fno-crossjumping).
1027*/
1028
Antoine Pitrou042b1282010-08-13 21:15:58 +00001029#ifdef DYNAMIC_EXECUTION_PROFILE
Antoine Pitroub52ec782009-01-25 16:34:23 +00001030#undef USE_COMPUTED_GOTOS
Antoine Pitrou042b1282010-08-13 21:15:58 +00001031#define USE_COMPUTED_GOTOS 0
Antoine Pitroub52ec782009-01-25 16:34:23 +00001032#endif
1033
Antoine Pitrou042b1282010-08-13 21:15:58 +00001034#ifdef HAVE_COMPUTED_GOTOS
1035 #ifndef USE_COMPUTED_GOTOS
1036 #define USE_COMPUTED_GOTOS 1
1037 #endif
1038#else
1039 #if defined(USE_COMPUTED_GOTOS) && USE_COMPUTED_GOTOS
1040 #error "Computed gotos are not supported on this compiler."
1041 #endif
1042 #undef USE_COMPUTED_GOTOS
1043 #define USE_COMPUTED_GOTOS 0
1044#endif
1045
1046#if USE_COMPUTED_GOTOS
Antoine Pitroub52ec782009-01-25 16:34:23 +00001047/* Import the static jump table */
1048#include "opcode_targets.h"
1049
Antoine Pitroub52ec782009-01-25 16:34:23 +00001050#define TARGET(op) \
Benjamin Petersonddd19492018-09-16 22:38:02 -07001051 op: \
1052 TARGET_##op
Antoine Pitroub52ec782009-01-25 16:34:23 +00001053
Antoine Pitroub52ec782009-01-25 16:34:23 +00001054#ifdef LLTRACE
1055#define FAST_DISPATCH() \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001056 { \
Victor Stinnerdab84232020-03-17 18:56:44 +01001057 if (!lltrace && !_Py_TracingPossible(ceval2) && !PyDTrace_LINE_ENABLED()) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001058 f->f_lasti = INSTR_OFFSET(); \
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001059 NEXTOPARG(); \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001060 goto *opcode_targets[opcode]; \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001061 } \
1062 goto fast_next_opcode; \
1063 }
Antoine Pitroub52ec782009-01-25 16:34:23 +00001064#else
1065#define FAST_DISPATCH() \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001066 { \
Victor Stinnerdab84232020-03-17 18:56:44 +01001067 if (!_Py_TracingPossible(ceval2) && !PyDTrace_LINE_ENABLED()) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001068 f->f_lasti = INSTR_OFFSET(); \
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001069 NEXTOPARG(); \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001070 goto *opcode_targets[opcode]; \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001071 } \
1072 goto fast_next_opcode; \
1073 }
Antoine Pitroub52ec782009-01-25 16:34:23 +00001074#endif
1075
Victor Stinner09532fe2019-05-10 23:39:09 +02001076#define DISPATCH() \
1077 { \
1078 if (!_Py_atomic_load_relaxed(eval_breaker)) { \
1079 FAST_DISPATCH(); \
1080 } \
1081 continue; \
1082 }
1083
Antoine Pitroub52ec782009-01-25 16:34:23 +00001084#else
Benjamin Petersonddd19492018-09-16 22:38:02 -07001085#define TARGET(op) op
Antoine Pitroub52ec782009-01-25 16:34:23 +00001086#define FAST_DISPATCH() goto fast_next_opcode
Victor Stinner09532fe2019-05-10 23:39:09 +02001087#define DISPATCH() continue
Antoine Pitroub52ec782009-01-25 16:34:23 +00001088#endif
1089
1090
Neal Norwitza81d2202002-07-14 00:27:26 +00001091/* Tuple access macros */
1092
1093#ifndef Py_DEBUG
1094#define GETITEM(v, i) PyTuple_GET_ITEM((PyTupleObject *)(v), (i))
1095#else
1096#define GETITEM(v, i) PyTuple_GetItem((v), (i))
1097#endif
1098
Guido van Rossum374a9221991-04-04 10:40:29 +00001099/* Code access macros */
1100
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001101/* The integer overflow is checked by an assertion below. */
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001102#define INSTR_OFFSET() \
1103 (sizeof(_Py_CODEUNIT) * (int)(next_instr - first_instr))
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001104#define NEXTOPARG() do { \
Serhiy Storchakaab874002016-09-11 13:48:15 +03001105 _Py_CODEUNIT word = *next_instr; \
1106 opcode = _Py_OPCODE(word); \
1107 oparg = _Py_OPARG(word); \
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001108 next_instr++; \
1109 } while (0)
Serhiy Storchakaab874002016-09-11 13:48:15 +03001110#define JUMPTO(x) (next_instr = first_instr + (x) / sizeof(_Py_CODEUNIT))
1111#define JUMPBY(x) (next_instr += (x) / sizeof(_Py_CODEUNIT))
Guido van Rossum374a9221991-04-04 10:40:29 +00001112
Raymond Hettingerf606f872003-03-16 03:11:04 +00001113/* OpCode prediction macros
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001114 Some opcodes tend to come in pairs thus making it possible to
1115 predict the second code when the first is run. For example,
Serhiy Storchakada9c5132016-06-27 18:58:57 +03001116 COMPARE_OP is often followed by POP_JUMP_IF_FALSE or POP_JUMP_IF_TRUE.
Raymond Hettingerf606f872003-03-16 03:11:04 +00001117
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001118 Verifying the prediction costs a single high-speed test of a register
1119 variable against a constant. If the pairing was good, then the
1120 processor's own internal branch predication has a high likelihood of
1121 success, resulting in a nearly zero-overhead transition to the
1122 next opcode. A successful prediction saves a trip through the eval-loop
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001123 including its unpredictable switch-case branch. Combined with the
1124 processor's internal branch prediction, a successful PREDICT has the
1125 effect of making the two opcodes run as if they were a single new opcode
1126 with the bodies combined.
Raymond Hettingerf606f872003-03-16 03:11:04 +00001127
Georg Brandl86b2fb92008-07-16 03:43:04 +00001128 If collecting opcode statistics, your choices are to either keep the
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001129 predictions turned-on and interpret the results as if some opcodes
1130 had been combined or turn-off predictions so that the opcode frequency
1131 counter updates for both opcodes.
Antoine Pitroub52ec782009-01-25 16:34:23 +00001132
1133 Opcode prediction is disabled with threaded code, since the latter allows
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001134 the CPU to record separate branch prediction information for each
1135 opcode.
Antoine Pitroub52ec782009-01-25 16:34:23 +00001136
Raymond Hettingerf606f872003-03-16 03:11:04 +00001137*/
1138
Denis Chernikovbaf29b22020-02-21 12:17:50 +03001139#define PREDICT_ID(op) PRED_##op
1140
Antoine Pitrou042b1282010-08-13 21:15:58 +00001141#if defined(DYNAMIC_EXECUTION_PROFILE) || USE_COMPUTED_GOTOS
Denis Chernikovbaf29b22020-02-21 12:17:50 +03001142#define PREDICT(op) if (0) goto PREDICT_ID(op)
Raymond Hettingera7216982004-02-08 19:59:27 +00001143#else
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001144#define PREDICT(op) \
Denis Chernikovbaf29b22020-02-21 12:17:50 +03001145 do { \
Serhiy Storchakaab874002016-09-11 13:48:15 +03001146 _Py_CODEUNIT word = *next_instr; \
1147 opcode = _Py_OPCODE(word); \
Denis Chernikovbaf29b22020-02-21 12:17:50 +03001148 if (opcode == op) { \
Serhiy Storchakaab874002016-09-11 13:48:15 +03001149 oparg = _Py_OPARG(word); \
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001150 next_instr++; \
Denis Chernikovbaf29b22020-02-21 12:17:50 +03001151 goto PREDICT_ID(op); \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001152 } \
1153 } while(0)
Antoine Pitroub52ec782009-01-25 16:34:23 +00001154#endif
Denis Chernikovbaf29b22020-02-21 12:17:50 +03001155#define PREDICTED(op) PREDICT_ID(op):
Antoine Pitroub52ec782009-01-25 16:34:23 +00001156
Raymond Hettingerf606f872003-03-16 03:11:04 +00001157
Guido van Rossum374a9221991-04-04 10:40:29 +00001158/* Stack manipulation macros */
1159
Martin v. Löwis18e16552006-02-15 17:27:45 +00001160/* The stack can grow at most MAXINT deep, as co_nlocals and
1161 co_stacksize are ints. */
Stefan Krahb7e10102010-06-23 18:42:39 +00001162#define STACK_LEVEL() ((int)(stack_pointer - f->f_valuestack))
1163#define EMPTY() (STACK_LEVEL() == 0)
1164#define TOP() (stack_pointer[-1])
1165#define SECOND() (stack_pointer[-2])
1166#define THIRD() (stack_pointer[-3])
1167#define FOURTH() (stack_pointer[-4])
1168#define PEEK(n) (stack_pointer[-(n)])
1169#define SET_TOP(v) (stack_pointer[-1] = (v))
1170#define SET_SECOND(v) (stack_pointer[-2] = (v))
1171#define SET_THIRD(v) (stack_pointer[-3] = (v))
1172#define SET_FOURTH(v) (stack_pointer[-4] = (v))
Stefan Krahb7e10102010-06-23 18:42:39 +00001173#define BASIC_STACKADJ(n) (stack_pointer += n)
1174#define BASIC_PUSH(v) (*stack_pointer++ = (v))
1175#define BASIC_POP() (*--stack_pointer)
Guido van Rossum374a9221991-04-04 10:40:29 +00001176
Guido van Rossum96a42c81992-01-12 02:29:51 +00001177#ifdef LLTRACE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001178#define PUSH(v) { (void)(BASIC_PUSH(v), \
Victor Stinner438a12d2019-05-24 17:01:38 +02001179 lltrace && prtrace(tstate, TOP(), "push")); \
Stefan Krahb7e10102010-06-23 18:42:39 +00001180 assert(STACK_LEVEL() <= co->co_stacksize); }
Victor Stinner438a12d2019-05-24 17:01:38 +02001181#define POP() ((void)(lltrace && prtrace(tstate, TOP(), "pop")), \
Stefan Krahb7e10102010-06-23 18:42:39 +00001182 BASIC_POP())
costypetrisor8ed317f2018-07-31 20:55:14 +00001183#define STACK_GROW(n) do { \
1184 assert(n >= 0); \
1185 (void)(BASIC_STACKADJ(n), \
Victor Stinner438a12d2019-05-24 17:01:38 +02001186 lltrace && prtrace(tstate, TOP(), "stackadj")); \
costypetrisor8ed317f2018-07-31 20:55:14 +00001187 assert(STACK_LEVEL() <= co->co_stacksize); \
1188 } while (0)
1189#define STACK_SHRINK(n) do { \
1190 assert(n >= 0); \
Victor Stinner438a12d2019-05-24 17:01:38 +02001191 (void)(lltrace && prtrace(tstate, TOP(), "stackadj")); \
costypetrisor8ed317f2018-07-31 20:55:14 +00001192 (void)(BASIC_STACKADJ(-n)); \
1193 assert(STACK_LEVEL() <= co->co_stacksize); \
1194 } while (0)
Christian Heimes0449f632007-12-15 01:27:15 +00001195#define EXT_POP(STACK_POINTER) ((void)(lltrace && \
Victor Stinner438a12d2019-05-24 17:01:38 +02001196 prtrace(tstate, (STACK_POINTER)[-1], "ext_pop")), \
Stefan Krahb7e10102010-06-23 18:42:39 +00001197 *--(STACK_POINTER))
Guido van Rossum374a9221991-04-04 10:40:29 +00001198#else
Stefan Krahb7e10102010-06-23 18:42:39 +00001199#define PUSH(v) BASIC_PUSH(v)
1200#define POP() BASIC_POP()
costypetrisor8ed317f2018-07-31 20:55:14 +00001201#define STACK_GROW(n) BASIC_STACKADJ(n)
1202#define STACK_SHRINK(n) BASIC_STACKADJ(-n)
Guido van Rossumc2e20742006-02-27 22:32:47 +00001203#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
Guido van Rossum374a9221991-04-04 10:40:29 +00001204#endif
1205
Guido van Rossum681d79a1995-07-18 14:51:37 +00001206/* Local variable macros */
1207
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001208#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumcfbf1a32002-03-28 20:17:52 +00001209
1210/* The SETLOCAL() macro must not DECREF the local variable in-place and
1211 then store the new value; it must copy the old value to a temporary
1212 value, then store the new value, and then DECREF the temporary value.
1213 This is because it is possible that during the DECREF the frame is
1214 accessed by other code (e.g. a __del__ method or gc.collect()) and the
1215 variable would be pointing to already-freed memory. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001216#define SETLOCAL(i, value) do { PyObject *tmp = GETLOCAL(i); \
Stefan Krahb7e10102010-06-23 18:42:39 +00001217 GETLOCAL(i) = value; \
1218 Py_XDECREF(tmp); } while (0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00001219
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001220
1221#define UNWIND_BLOCK(b) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001222 while (STACK_LEVEL() > (b)->b_level) { \
1223 PyObject *v = POP(); \
1224 Py_XDECREF(v); \
1225 }
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001226
1227#define UNWIND_EXCEPT_HANDLER(b) \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001228 do { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001229 PyObject *type, *value, *traceback; \
Mark Shannonae3087c2017-10-22 22:41:51 +01001230 _PyErr_StackItem *exc_info; \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001231 assert(STACK_LEVEL() >= (b)->b_level + 3); \
1232 while (STACK_LEVEL() > (b)->b_level + 3) { \
1233 value = POP(); \
1234 Py_XDECREF(value); \
1235 } \
Mark Shannonae3087c2017-10-22 22:41:51 +01001236 exc_info = tstate->exc_info; \
1237 type = exc_info->exc_type; \
1238 value = exc_info->exc_value; \
1239 traceback = exc_info->exc_traceback; \
1240 exc_info->exc_type = POP(); \
1241 exc_info->exc_value = POP(); \
1242 exc_info->exc_traceback = POP(); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001243 Py_XDECREF(type); \
1244 Py_XDECREF(value); \
1245 Py_XDECREF(traceback); \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001246 } while(0)
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001247
Inada Naoki91234a12019-06-03 21:30:58 +09001248 /* macros for opcode cache */
1249#define OPCACHE_CHECK() \
1250 do { \
1251 co_opcache = NULL; \
1252 if (co->co_opcache != NULL) { \
Pablo Galindo109826c2020-10-20 06:22:44 +01001253 unsigned char co_opcache_offset = \
Inada Naoki91234a12019-06-03 21:30:58 +09001254 co->co_opcache_map[next_instr - first_instr]; \
Pablo Galindo109826c2020-10-20 06:22:44 +01001255 if (co_opcache_offset > 0) { \
1256 assert(co_opcache_offset <= co->co_opcache_size); \
1257 co_opcache = &co->co_opcache[co_opcache_offset - 1]; \
Inada Naoki91234a12019-06-03 21:30:58 +09001258 assert(co_opcache != NULL); \
Inada Naoki91234a12019-06-03 21:30:58 +09001259 } \
1260 } \
1261 } while (0)
1262
Pablo Galindo109826c2020-10-20 06:22:44 +01001263#define OPCACHE_DEOPT() \
1264 do { \
1265 if (co_opcache != NULL) { \
1266 co_opcache->optimized = -1; \
1267 unsigned char co_opcache_offset = \
1268 co->co_opcache_map[next_instr - first_instr]; \
1269 assert(co_opcache_offset <= co->co_opcache_size); \
1270 co->co_opcache_map[co_opcache_offset] = 0; \
1271 co_opcache = NULL; \
1272 } \
1273 } while (0)
1274
1275#define OPCACHE_DEOPT_LOAD_ATTR() \
1276 do { \
1277 if (co_opcache != NULL) { \
1278 OPCACHE_STAT_ATTR_DEOPT(); \
1279 OPCACHE_DEOPT(); \
1280 } \
1281 } while (0)
1282
1283#define OPCACHE_MAYBE_DEOPT_LOAD_ATTR() \
1284 do { \
1285 if (co_opcache != NULL && --co_opcache->optimized <= 0) { \
1286 OPCACHE_DEOPT_LOAD_ATTR(); \
1287 } \
1288 } while (0)
1289
Inada Naoki91234a12019-06-03 21:30:58 +09001290#if OPCACHE_STATS
1291
1292#define OPCACHE_STAT_GLOBAL_HIT() \
1293 do { \
1294 if (co->co_opcache != NULL) opcache_global_hits++; \
1295 } while (0)
1296
1297#define OPCACHE_STAT_GLOBAL_MISS() \
1298 do { \
1299 if (co->co_opcache != NULL) opcache_global_misses++; \
1300 } while (0)
1301
1302#define OPCACHE_STAT_GLOBAL_OPT() \
1303 do { \
1304 if (co->co_opcache != NULL) opcache_global_opts++; \
1305 } while (0)
1306
Pablo Galindo109826c2020-10-20 06:22:44 +01001307#define OPCACHE_STAT_ATTR_HIT() \
1308 do { \
1309 if (co->co_opcache != NULL) opcache_attr_hits++; \
1310 } while (0)
1311
1312#define OPCACHE_STAT_ATTR_MISS() \
1313 do { \
1314 if (co->co_opcache != NULL) opcache_attr_misses++; \
1315 } while (0)
1316
1317#define OPCACHE_STAT_ATTR_OPT() \
1318 do { \
1319 if (co->co_opcache!= NULL) opcache_attr_opts++; \
1320 } while (0)
1321
1322#define OPCACHE_STAT_ATTR_DEOPT() \
1323 do { \
1324 if (co->co_opcache != NULL) opcache_attr_deopts++; \
1325 } while (0)
1326
1327#define OPCACHE_STAT_ATTR_TOTAL() \
1328 do { \
1329 if (co->co_opcache != NULL) opcache_attr_total++; \
1330 } while (0)
1331
Inada Naoki91234a12019-06-03 21:30:58 +09001332#else /* OPCACHE_STATS */
1333
1334#define OPCACHE_STAT_GLOBAL_HIT()
1335#define OPCACHE_STAT_GLOBAL_MISS()
1336#define OPCACHE_STAT_GLOBAL_OPT()
1337
Pablo Galindo109826c2020-10-20 06:22:44 +01001338#define OPCACHE_STAT_ATTR_HIT()
1339#define OPCACHE_STAT_ATTR_MISS()
1340#define OPCACHE_STAT_ATTR_OPT()
1341#define OPCACHE_STAT_ATTR_DEOPT()
1342#define OPCACHE_STAT_ATTR_TOTAL()
1343
Inada Naoki91234a12019-06-03 21:30:58 +09001344#endif
1345
Guido van Rossuma027efa1997-05-05 20:56:21 +00001346/* Start of code */
1347
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001348 /* push frame */
Victor Stinnerbe434dc2019-11-05 00:51:22 +01001349 if (_Py_EnterRecursiveCall(tstate, "")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001350 return NULL;
Victor Stinnerbe434dc2019-11-05 00:51:22 +01001351 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001352
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001353 tstate->frame = f;
Tim Peters5ca576e2001-06-18 22:08:13 +00001354
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001355 if (tstate->use_tracing) {
1356 if (tstate->c_tracefunc != NULL) {
1357 /* tstate->c_tracefunc, if defined, is a
1358 function that will be called on *every* entry
1359 to a code block. Its return value, if not
1360 None, is a function that will be called at
1361 the start of each executed line of code.
1362 (Actually, the function must return itself
1363 in order to continue tracing.) The trace
1364 functions are called with three arguments:
1365 a pointer to the current frame, a string
1366 indicating why the function is called, and
1367 an argument which depends on the situation.
1368 The global trace function is also called
1369 whenever an exception is detected. */
1370 if (call_trace_protected(tstate->c_tracefunc,
1371 tstate->c_traceobj,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01001372 tstate, f, PyTrace_CALL, Py_None)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001373 /* Trace function raised an error */
1374 goto exit_eval_frame;
1375 }
1376 }
1377 if (tstate->c_profilefunc != NULL) {
1378 /* Similar for c_profilefunc, except it needn't
1379 return itself and isn't called for "line" events */
1380 if (call_trace_protected(tstate->c_profilefunc,
1381 tstate->c_profileobj,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01001382 tstate, f, PyTrace_CALL, Py_None)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001383 /* Profile function raised an error */
1384 goto exit_eval_frame;
1385 }
1386 }
1387 }
Neil Schemenauer6c0f2002001-09-04 19:03:35 +00001388
Łukasz Langaa785c872016-09-09 17:37:37 -07001389 if (PyDTrace_FUNCTION_ENTRY_ENABLED())
1390 dtrace_function_entry(f);
1391
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001392 co = f->f_code;
1393 names = co->co_names;
1394 consts = co->co_consts;
1395 fastlocals = f->f_localsplus;
1396 freevars = f->f_localsplus + co->co_nlocals;
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001397 assert(PyBytes_Check(co->co_code));
1398 assert(PyBytes_GET_SIZE(co->co_code) <= INT_MAX);
Serhiy Storchakaab874002016-09-11 13:48:15 +03001399 assert(PyBytes_GET_SIZE(co->co_code) % sizeof(_Py_CODEUNIT) == 0);
1400 assert(_Py_IS_ALIGNED(PyBytes_AS_STRING(co->co_code), sizeof(_Py_CODEUNIT)));
1401 first_instr = (_Py_CODEUNIT *) PyBytes_AS_STRING(co->co_code);
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001402 /*
1403 f->f_lasti refers to the index of the last instruction,
1404 unless it's -1 in which case next_instr should be first_instr.
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001405
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001406 YIELD_FROM sets f_lasti to itself, in order to repeatedly yield
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05001407 multiple values.
Thomas Wouters902d6eb2007-01-09 23:18:33 +00001408
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001409 When the PREDICT() macros are enabled, some opcode pairs follow in
1410 direct succession without updating f->f_lasti. A successful
1411 prediction effectively links the two codes together as if they
1412 were a single new opcode; accordingly,f->f_lasti will point to
1413 the first code in the pair (for instance, GET_ITER followed by
1414 FOR_ITER is effectively a single opcode and f->f_lasti will point
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001415 to the beginning of the combined pair.)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001416 */
Serhiy Storchakaab874002016-09-11 13:48:15 +03001417 assert(f->f_lasti >= -1);
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001418 next_instr = first_instr;
1419 if (f->f_lasti >= 0) {
Serhiy Storchakaab874002016-09-11 13:48:15 +03001420 assert(f->f_lasti % sizeof(_Py_CODEUNIT) == 0);
1421 next_instr += f->f_lasti / sizeof(_Py_CODEUNIT) + 1;
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001422 }
Mark Shannoncb9879b2020-07-17 11:44:23 +01001423 stack_pointer = f->f_valuestack + f->f_stackdepth;
1424 /* Set f->f_stackdepth to -1.
1425 * Update when returning or calling trace function.
1426 Having f_stackdepth <= 0 ensures that invalid
1427 values are not visible to the cycle GC.
1428 We choose -1 rather than 0 to assist debugging.
1429 */
1430 f->f_stackdepth = -1;
1431 f->f_state = FRAME_EXECUTING;
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001432
Inada Naoki91234a12019-06-03 21:30:58 +09001433 if (co->co_opcache_flag < OPCACHE_MIN_RUNS) {
1434 co->co_opcache_flag++;
1435 if (co->co_opcache_flag == OPCACHE_MIN_RUNS) {
1436 if (_PyCode_InitOpcache(co) < 0) {
Victor Stinner25104942020-04-24 02:43:18 +02001437 goto exit_eval_frame;
Inada Naoki91234a12019-06-03 21:30:58 +09001438 }
1439#if OPCACHE_STATS
1440 opcache_code_objects_extra_mem +=
1441 PyBytes_Size(co->co_code) / sizeof(_Py_CODEUNIT) +
1442 sizeof(_PyOpcache) * co->co_opcache_size;
1443 opcache_code_objects++;
1444#endif
1445 }
1446 }
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001447
Tim Peters5ca576e2001-06-18 22:08:13 +00001448#ifdef LLTRACE
Victor Stinner3c1e4812012-03-26 22:10:51 +02001449 lltrace = _PyDict_GetItemId(f->f_globals, &PyId___ltrace__) != NULL;
Tim Peters5ca576e2001-06-18 22:08:13 +00001450#endif
Guido van Rossumac7be682001-01-17 15:42:30 +00001451
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001452 if (throwflag) /* support for generator.throw() */
1453 goto error;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001454
Victor Stinnerace47d72013-07-18 01:41:08 +02001455#ifdef Py_DEBUG
Victor Stinner0b72b232020-03-12 23:18:39 +01001456 /* _PyEval_EvalFrameDefault() must not be called with an exception set,
Victor Stinnera8cb5152017-01-18 14:12:51 +01001457 because it can clear it (directly or indirectly) and so the
Martin Panter9955a372015-10-07 10:26:23 +00001458 caller loses its exception */
Victor Stinner438a12d2019-05-24 17:01:38 +02001459 assert(!_PyErr_Occurred(tstate));
Victor Stinnerace47d72013-07-18 01:41:08 +02001460#endif
1461
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001462main_loop:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001463 for (;;) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001464 assert(stack_pointer >= f->f_valuestack); /* else underflow */
1465 assert(STACK_LEVEL() <= co->co_stacksize); /* else overflow */
Victor Stinner438a12d2019-05-24 17:01:38 +02001466 assert(!_PyErr_Occurred(tstate));
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001467
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001468 /* Do periodic things. Doing this every time through
1469 the loop would add too much overhead, so we do it
1470 only every Nth instruction. We also do it if
Chris Jerdonek4a12d122020-05-14 19:25:45 -07001471 ``pending.calls_to_do'' is set, i.e. when an asynchronous
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001472 event needs attention (e.g. a signal handler or
1473 async I/O handler); see Py_AddPendingCall() and
1474 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +00001475
Eric Snow7bda9de2019-03-08 17:25:54 -07001476 if (_Py_atomic_load_relaxed(eval_breaker)) {
Serhiy Storchaka3f4d90d2018-07-09 15:40:14 +03001477 opcode = _Py_OPCODE(*next_instr);
1478 if (opcode == SETUP_FINALLY ||
1479 opcode == SETUP_WITH ||
1480 opcode == BEFORE_ASYNC_WITH ||
1481 opcode == YIELD_FROM) {
1482 /* Few cases where we skip running signal handlers and other
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07001483 pending calls:
Serhiy Storchaka3f4d90d2018-07-09 15:40:14 +03001484 - If we're about to enter the 'with:'. It will prevent
1485 emitting a resource warning in the common idiom
1486 'with open(path) as file:'.
1487 - If we're about to enter the 'async with:'.
1488 - If we're about to enter the 'try:' of a try/finally (not
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07001489 *very* useful, but might help in some cases and it's
1490 traditional)
1491 - If we're resuming a chain of nested 'yield from' or
1492 'await' calls, then each frame is parked with YIELD_FROM
1493 as its next opcode. If the user hit control-C we want to
1494 wait until we've reached the innermost frame before
1495 running the signal handler and raising KeyboardInterrupt
1496 (see bpo-30039).
1497 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001498 goto fast_next_opcode;
1499 }
Eric Snowfdf282d2019-01-11 14:26:55 -07001500
Victor Stinnerda2914d2020-03-20 09:29:08 +01001501 if (eval_frame_handle_pending(tstate) != 0) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001502 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001503 }
1504 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001505
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001506 fast_next_opcode:
1507 f->f_lasti = INSTR_OFFSET();
Guido van Rossumac7be682001-01-17 15:42:30 +00001508
Łukasz Langaa785c872016-09-09 17:37:37 -07001509 if (PyDTrace_LINE_ENABLED())
1510 maybe_dtrace_line(f, &instr_lb, &instr_ub, &instr_prev);
1511
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001512 /* line-by-line tracing support */
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001513
Victor Stinnerdab84232020-03-17 18:56:44 +01001514 if (_Py_TracingPossible(ceval2) &&
Benjamin Peterson51f46162013-01-23 08:38:47 -05001515 tstate->c_tracefunc != NULL && !tstate->tracing) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001516 int err;
Victor Stinnerb7d8d8d2020-09-23 14:07:16 +02001517 /* see maybe_call_line_trace()
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001518 for expository comments */
Victor Stinnerb7d8d8d2020-09-23 14:07:16 +02001519 f->f_stackdepth = (int)(stack_pointer - f->f_valuestack);
Tim Peters8a5c3c72004-04-05 19:36:21 +00001520
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001521 err = maybe_call_line_trace(tstate->c_tracefunc,
1522 tstate->c_traceobj,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01001523 tstate, f,
1524 &instr_lb, &instr_ub, &instr_prev);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001525 /* Reload possibly changed frame fields */
1526 JUMPTO(f->f_lasti);
Mark Shannoncb9879b2020-07-17 11:44:23 +01001527 stack_pointer = f->f_valuestack+f->f_stackdepth;
1528 f->f_stackdepth = -1;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001529 if (err)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001530 /* trace function raised an exception */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001531 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001532 }
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001533
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001534 /* Extract opcode and argument */
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001535
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001536 NEXTOPARG();
Stefan Krahb7e10102010-06-23 18:42:39 +00001537 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +00001538#ifdef DYNAMIC_EXECUTION_PROFILE
1539#ifdef DXPAIRS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001540 dxpairs[lastopcode][opcode]++;
1541 lastopcode = opcode;
Guido van Rossum950361c1997-01-24 13:49:28 +00001542#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001543 dxp[opcode]++;
Guido van Rossum950361c1997-01-24 13:49:28 +00001544#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001545
Guido van Rossum96a42c81992-01-12 02:29:51 +00001546#ifdef LLTRACE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001547 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +00001548
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001549 if (lltrace) {
1550 if (HAS_ARG(opcode)) {
1551 printf("%d: %d, %d\n",
1552 f->f_lasti, opcode, oparg);
1553 }
1554 else {
1555 printf("%d: %d\n",
1556 f->f_lasti, opcode);
1557 }
1558 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001559#endif
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001560
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001561 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +00001562
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001563 /* BEWARE!
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001564 It is essential that any operation that fails must goto error
1565 and that all operation that succeed call [FAST_]DISPATCH() ! */
Guido van Rossumac7be682001-01-17 15:42:30 +00001566
Benjamin Petersonddd19492018-09-16 22:38:02 -07001567 case TARGET(NOP): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001568 FAST_DISPATCH();
Benjamin Petersonddd19492018-09-16 22:38:02 -07001569 }
Raymond Hettinger9c18e812004-06-21 16:31:15 +00001570
Benjamin Petersonddd19492018-09-16 22:38:02 -07001571 case TARGET(LOAD_FAST): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001572 PyObject *value = GETLOCAL(oparg);
1573 if (value == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02001574 format_exc_check_arg(tstate, PyExc_UnboundLocalError,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001575 UNBOUNDLOCAL_ERROR_MSG,
1576 PyTuple_GetItem(co->co_varnames, oparg));
1577 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001578 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001579 Py_INCREF(value);
1580 PUSH(value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001581 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001582 }
1583
Benjamin Petersonddd19492018-09-16 22:38:02 -07001584 case TARGET(LOAD_CONST): {
1585 PREDICTED(LOAD_CONST);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001586 PyObject *value = GETITEM(consts, oparg);
1587 Py_INCREF(value);
1588 PUSH(value);
1589 FAST_DISPATCH();
1590 }
Neil Schemenauer63543862002-02-17 19:10:14 +00001591
Benjamin Petersonddd19492018-09-16 22:38:02 -07001592 case TARGET(STORE_FAST): {
1593 PREDICTED(STORE_FAST);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001594 PyObject *value = POP();
1595 SETLOCAL(oparg, value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001596 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001597 }
Neil Schemenauer63543862002-02-17 19:10:14 +00001598
Benjamin Petersonddd19492018-09-16 22:38:02 -07001599 case TARGET(POP_TOP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001600 PyObject *value = POP();
1601 Py_DECREF(value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001602 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001603 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001604
Benjamin Petersonddd19492018-09-16 22:38:02 -07001605 case TARGET(ROT_TWO): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001606 PyObject *top = TOP();
1607 PyObject *second = SECOND();
1608 SET_TOP(second);
1609 SET_SECOND(top);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001610 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001611 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001612
Benjamin Petersonddd19492018-09-16 22:38:02 -07001613 case TARGET(ROT_THREE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001614 PyObject *top = TOP();
1615 PyObject *second = SECOND();
1616 PyObject *third = THIRD();
1617 SET_TOP(second);
1618 SET_SECOND(third);
1619 SET_THIRD(top);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001620 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001621 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001622
Benjamin Petersonddd19492018-09-16 22:38:02 -07001623 case TARGET(ROT_FOUR): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001624 PyObject *top = TOP();
1625 PyObject *second = SECOND();
1626 PyObject *third = THIRD();
1627 PyObject *fourth = FOURTH();
1628 SET_TOP(second);
1629 SET_SECOND(third);
1630 SET_THIRD(fourth);
1631 SET_FOURTH(top);
1632 FAST_DISPATCH();
1633 }
1634
Benjamin Petersonddd19492018-09-16 22:38:02 -07001635 case TARGET(DUP_TOP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001636 PyObject *top = TOP();
1637 Py_INCREF(top);
1638 PUSH(top);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001639 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001640 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001641
Benjamin Petersonddd19492018-09-16 22:38:02 -07001642 case TARGET(DUP_TOP_TWO): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001643 PyObject *top = TOP();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001644 PyObject *second = SECOND();
Benjamin Petersonf208df32012-10-12 11:37:56 -04001645 Py_INCREF(top);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001646 Py_INCREF(second);
costypetrisor8ed317f2018-07-31 20:55:14 +00001647 STACK_GROW(2);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001648 SET_TOP(top);
1649 SET_SECOND(second);
Antoine Pitrou74a69fa2010-09-04 18:43:52 +00001650 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001651 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001652
Benjamin Petersonddd19492018-09-16 22:38:02 -07001653 case TARGET(UNARY_POSITIVE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001654 PyObject *value = TOP();
1655 PyObject *res = PyNumber_Positive(value);
1656 Py_DECREF(value);
1657 SET_TOP(res);
1658 if (res == NULL)
1659 goto error;
1660 DISPATCH();
1661 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001662
Benjamin Petersonddd19492018-09-16 22:38:02 -07001663 case TARGET(UNARY_NEGATIVE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001664 PyObject *value = TOP();
1665 PyObject *res = PyNumber_Negative(value);
1666 Py_DECREF(value);
1667 SET_TOP(res);
1668 if (res == NULL)
1669 goto error;
1670 DISPATCH();
1671 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001672
Benjamin Petersonddd19492018-09-16 22:38:02 -07001673 case TARGET(UNARY_NOT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001674 PyObject *value = TOP();
1675 int err = PyObject_IsTrue(value);
1676 Py_DECREF(value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001677 if (err == 0) {
1678 Py_INCREF(Py_True);
1679 SET_TOP(Py_True);
1680 DISPATCH();
1681 }
1682 else if (err > 0) {
1683 Py_INCREF(Py_False);
1684 SET_TOP(Py_False);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001685 DISPATCH();
1686 }
costypetrisor8ed317f2018-07-31 20:55:14 +00001687 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001688 goto error;
1689 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001690
Benjamin Petersonddd19492018-09-16 22:38:02 -07001691 case TARGET(UNARY_INVERT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001692 PyObject *value = TOP();
1693 PyObject *res = PyNumber_Invert(value);
1694 Py_DECREF(value);
1695 SET_TOP(res);
1696 if (res == NULL)
1697 goto error;
1698 DISPATCH();
1699 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001700
Benjamin Petersonddd19492018-09-16 22:38:02 -07001701 case TARGET(BINARY_POWER): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001702 PyObject *exp = POP();
1703 PyObject *base = TOP();
1704 PyObject *res = PyNumber_Power(base, exp, Py_None);
1705 Py_DECREF(base);
1706 Py_DECREF(exp);
1707 SET_TOP(res);
1708 if (res == NULL)
1709 goto error;
1710 DISPATCH();
1711 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001712
Benjamin Petersonddd19492018-09-16 22:38:02 -07001713 case TARGET(BINARY_MULTIPLY): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001714 PyObject *right = POP();
1715 PyObject *left = TOP();
1716 PyObject *res = PyNumber_Multiply(left, right);
1717 Py_DECREF(left);
1718 Py_DECREF(right);
1719 SET_TOP(res);
1720 if (res == NULL)
1721 goto error;
1722 DISPATCH();
1723 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001724
Benjamin Petersonddd19492018-09-16 22:38:02 -07001725 case TARGET(BINARY_MATRIX_MULTIPLY): {
Benjamin Petersond51374e2014-04-09 23:55:56 -04001726 PyObject *right = POP();
1727 PyObject *left = TOP();
1728 PyObject *res = PyNumber_MatrixMultiply(left, right);
1729 Py_DECREF(left);
1730 Py_DECREF(right);
1731 SET_TOP(res);
1732 if (res == NULL)
1733 goto error;
1734 DISPATCH();
1735 }
1736
Benjamin Petersonddd19492018-09-16 22:38:02 -07001737 case TARGET(BINARY_TRUE_DIVIDE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001738 PyObject *divisor = POP();
1739 PyObject *dividend = TOP();
1740 PyObject *quotient = PyNumber_TrueDivide(dividend, divisor);
1741 Py_DECREF(dividend);
1742 Py_DECREF(divisor);
1743 SET_TOP(quotient);
1744 if (quotient == NULL)
1745 goto error;
1746 DISPATCH();
1747 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001748
Benjamin Petersonddd19492018-09-16 22:38:02 -07001749 case TARGET(BINARY_FLOOR_DIVIDE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001750 PyObject *divisor = POP();
1751 PyObject *dividend = TOP();
1752 PyObject *quotient = PyNumber_FloorDivide(dividend, divisor);
1753 Py_DECREF(dividend);
1754 Py_DECREF(divisor);
1755 SET_TOP(quotient);
1756 if (quotient == NULL)
1757 goto error;
1758 DISPATCH();
1759 }
Guido van Rossum4668b002001-08-08 05:00:18 +00001760
Benjamin Petersonddd19492018-09-16 22:38:02 -07001761 case TARGET(BINARY_MODULO): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001762 PyObject *divisor = POP();
1763 PyObject *dividend = TOP();
Martijn Pietersd7e64332017-02-23 13:38:04 +00001764 PyObject *res;
1765 if (PyUnicode_CheckExact(dividend) && (
1766 !PyUnicode_Check(divisor) || PyUnicode_CheckExact(divisor))) {
1767 // fast path; string formatting, but not if the RHS is a str subclass
1768 // (see issue28598)
1769 res = PyUnicode_Format(dividend, divisor);
1770 } else {
1771 res = PyNumber_Remainder(dividend, divisor);
1772 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001773 Py_DECREF(divisor);
1774 Py_DECREF(dividend);
1775 SET_TOP(res);
1776 if (res == NULL)
1777 goto error;
1778 DISPATCH();
1779 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001780
Benjamin Petersonddd19492018-09-16 22:38:02 -07001781 case TARGET(BINARY_ADD): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001782 PyObject *right = POP();
1783 PyObject *left = TOP();
1784 PyObject *sum;
Victor Stinnerbd0a08e2020-10-01 18:57:37 +02001785 /* NOTE(vstinner): Please don't try to micro-optimize int+int on
Victor Stinnerd65f42a2016-10-20 12:18:10 +02001786 CPython using bytecode, it is simply worthless.
1787 See http://bugs.python.org/issue21955 and
1788 http://bugs.python.org/issue10044 for the discussion. In short,
1789 no patch shown any impact on a realistic benchmark, only a minor
1790 speedup on microbenchmarks. */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001791 if (PyUnicode_CheckExact(left) &&
1792 PyUnicode_CheckExact(right)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02001793 sum = unicode_concatenate(tstate, left, right, f, next_instr);
Martin Panter95f53c12016-07-18 08:23:26 +00001794 /* unicode_concatenate consumed the ref to left */
Victor Stinnerd2a915d2011-10-02 20:34:20 +02001795 }
1796 else {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001797 sum = PyNumber_Add(left, right);
1798 Py_DECREF(left);
Victor Stinnerd2a915d2011-10-02 20:34:20 +02001799 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001800 Py_DECREF(right);
1801 SET_TOP(sum);
1802 if (sum == NULL)
1803 goto error;
1804 DISPATCH();
1805 }
1806
Benjamin Petersonddd19492018-09-16 22:38:02 -07001807 case TARGET(BINARY_SUBTRACT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001808 PyObject *right = POP();
1809 PyObject *left = TOP();
1810 PyObject *diff = PyNumber_Subtract(left, right);
1811 Py_DECREF(right);
1812 Py_DECREF(left);
1813 SET_TOP(diff);
1814 if (diff == NULL)
1815 goto error;
1816 DISPATCH();
1817 }
1818
Benjamin Petersonddd19492018-09-16 22:38:02 -07001819 case TARGET(BINARY_SUBSCR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001820 PyObject *sub = POP();
1821 PyObject *container = TOP();
1822 PyObject *res = PyObject_GetItem(container, sub);
1823 Py_DECREF(container);
1824 Py_DECREF(sub);
1825 SET_TOP(res);
1826 if (res == NULL)
1827 goto error;
1828 DISPATCH();
1829 }
1830
Benjamin Petersonddd19492018-09-16 22:38:02 -07001831 case TARGET(BINARY_LSHIFT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001832 PyObject *right = POP();
1833 PyObject *left = TOP();
1834 PyObject *res = PyNumber_Lshift(left, right);
1835 Py_DECREF(left);
1836 Py_DECREF(right);
1837 SET_TOP(res);
1838 if (res == NULL)
1839 goto error;
1840 DISPATCH();
1841 }
1842
Benjamin Petersonddd19492018-09-16 22:38:02 -07001843 case TARGET(BINARY_RSHIFT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001844 PyObject *right = POP();
1845 PyObject *left = TOP();
1846 PyObject *res = PyNumber_Rshift(left, right);
1847 Py_DECREF(left);
1848 Py_DECREF(right);
1849 SET_TOP(res);
1850 if (res == NULL)
1851 goto error;
1852 DISPATCH();
1853 }
1854
Benjamin Petersonddd19492018-09-16 22:38:02 -07001855 case TARGET(BINARY_AND): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001856 PyObject *right = POP();
1857 PyObject *left = TOP();
1858 PyObject *res = PyNumber_And(left, right);
1859 Py_DECREF(left);
1860 Py_DECREF(right);
1861 SET_TOP(res);
1862 if (res == NULL)
1863 goto error;
1864 DISPATCH();
1865 }
1866
Benjamin Petersonddd19492018-09-16 22:38:02 -07001867 case TARGET(BINARY_XOR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001868 PyObject *right = POP();
1869 PyObject *left = TOP();
1870 PyObject *res = PyNumber_Xor(left, right);
1871 Py_DECREF(left);
1872 Py_DECREF(right);
1873 SET_TOP(res);
1874 if (res == NULL)
1875 goto error;
1876 DISPATCH();
1877 }
1878
Benjamin Petersonddd19492018-09-16 22:38:02 -07001879 case TARGET(BINARY_OR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001880 PyObject *right = POP();
1881 PyObject *left = TOP();
1882 PyObject *res = PyNumber_Or(left, right);
1883 Py_DECREF(left);
1884 Py_DECREF(right);
1885 SET_TOP(res);
1886 if (res == NULL)
1887 goto error;
1888 DISPATCH();
1889 }
1890
Benjamin Petersonddd19492018-09-16 22:38:02 -07001891 case TARGET(LIST_APPEND): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001892 PyObject *v = POP();
1893 PyObject *list = PEEK(oparg);
1894 int err;
1895 err = PyList_Append(list, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001896 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001897 if (err != 0)
1898 goto error;
1899 PREDICT(JUMP_ABSOLUTE);
1900 DISPATCH();
1901 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001902
Benjamin Petersonddd19492018-09-16 22:38:02 -07001903 case TARGET(SET_ADD): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001904 PyObject *v = POP();
Raymond Hettinger41862222016-10-15 19:03:06 -07001905 PyObject *set = PEEK(oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001906 int err;
1907 err = PySet_Add(set, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001908 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001909 if (err != 0)
1910 goto error;
1911 PREDICT(JUMP_ABSOLUTE);
1912 DISPATCH();
1913 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001914
Benjamin Petersonddd19492018-09-16 22:38:02 -07001915 case TARGET(INPLACE_POWER): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001916 PyObject *exp = POP();
1917 PyObject *base = TOP();
1918 PyObject *res = PyNumber_InPlacePower(base, exp, Py_None);
1919 Py_DECREF(base);
1920 Py_DECREF(exp);
1921 SET_TOP(res);
1922 if (res == NULL)
1923 goto error;
1924 DISPATCH();
1925 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001926
Benjamin Petersonddd19492018-09-16 22:38:02 -07001927 case TARGET(INPLACE_MULTIPLY): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001928 PyObject *right = POP();
1929 PyObject *left = TOP();
1930 PyObject *res = PyNumber_InPlaceMultiply(left, right);
1931 Py_DECREF(left);
1932 Py_DECREF(right);
1933 SET_TOP(res);
1934 if (res == NULL)
1935 goto error;
1936 DISPATCH();
1937 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001938
Benjamin Petersonddd19492018-09-16 22:38:02 -07001939 case TARGET(INPLACE_MATRIX_MULTIPLY): {
Benjamin Petersond51374e2014-04-09 23:55:56 -04001940 PyObject *right = POP();
1941 PyObject *left = TOP();
1942 PyObject *res = PyNumber_InPlaceMatrixMultiply(left, right);
1943 Py_DECREF(left);
1944 Py_DECREF(right);
1945 SET_TOP(res);
1946 if (res == NULL)
1947 goto error;
1948 DISPATCH();
1949 }
1950
Benjamin Petersonddd19492018-09-16 22:38:02 -07001951 case TARGET(INPLACE_TRUE_DIVIDE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001952 PyObject *divisor = POP();
1953 PyObject *dividend = TOP();
1954 PyObject *quotient = PyNumber_InPlaceTrueDivide(dividend, divisor);
1955 Py_DECREF(dividend);
1956 Py_DECREF(divisor);
1957 SET_TOP(quotient);
1958 if (quotient == NULL)
1959 goto error;
1960 DISPATCH();
1961 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001962
Benjamin Petersonddd19492018-09-16 22:38:02 -07001963 case TARGET(INPLACE_FLOOR_DIVIDE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001964 PyObject *divisor = POP();
1965 PyObject *dividend = TOP();
1966 PyObject *quotient = PyNumber_InPlaceFloorDivide(dividend, divisor);
1967 Py_DECREF(dividend);
1968 Py_DECREF(divisor);
1969 SET_TOP(quotient);
1970 if (quotient == NULL)
1971 goto error;
1972 DISPATCH();
1973 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001974
Benjamin Petersonddd19492018-09-16 22:38:02 -07001975 case TARGET(INPLACE_MODULO): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001976 PyObject *right = POP();
1977 PyObject *left = TOP();
1978 PyObject *mod = PyNumber_InPlaceRemainder(left, right);
1979 Py_DECREF(left);
1980 Py_DECREF(right);
1981 SET_TOP(mod);
1982 if (mod == NULL)
1983 goto error;
1984 DISPATCH();
1985 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001986
Benjamin Petersonddd19492018-09-16 22:38:02 -07001987 case TARGET(INPLACE_ADD): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001988 PyObject *right = POP();
1989 PyObject *left = TOP();
1990 PyObject *sum;
1991 if (PyUnicode_CheckExact(left) && PyUnicode_CheckExact(right)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02001992 sum = unicode_concatenate(tstate, left, right, f, next_instr);
Martin Panter95f53c12016-07-18 08:23:26 +00001993 /* unicode_concatenate consumed the ref to left */
Victor Stinnerd2a915d2011-10-02 20:34:20 +02001994 }
1995 else {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001996 sum = PyNumber_InPlaceAdd(left, right);
1997 Py_DECREF(left);
Victor Stinnerd2a915d2011-10-02 20:34:20 +02001998 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001999 Py_DECREF(right);
2000 SET_TOP(sum);
2001 if (sum == NULL)
2002 goto error;
2003 DISPATCH();
2004 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002005
Benjamin Petersonddd19492018-09-16 22:38:02 -07002006 case TARGET(INPLACE_SUBTRACT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002007 PyObject *right = POP();
2008 PyObject *left = TOP();
2009 PyObject *diff = PyNumber_InPlaceSubtract(left, right);
2010 Py_DECREF(left);
2011 Py_DECREF(right);
2012 SET_TOP(diff);
2013 if (diff == NULL)
2014 goto error;
2015 DISPATCH();
2016 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002017
Benjamin Petersonddd19492018-09-16 22:38:02 -07002018 case TARGET(INPLACE_LSHIFT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002019 PyObject *right = POP();
2020 PyObject *left = TOP();
2021 PyObject *res = PyNumber_InPlaceLshift(left, right);
2022 Py_DECREF(left);
2023 Py_DECREF(right);
2024 SET_TOP(res);
2025 if (res == NULL)
2026 goto error;
2027 DISPATCH();
2028 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002029
Benjamin Petersonddd19492018-09-16 22:38:02 -07002030 case TARGET(INPLACE_RSHIFT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002031 PyObject *right = POP();
2032 PyObject *left = TOP();
2033 PyObject *res = PyNumber_InPlaceRshift(left, right);
2034 Py_DECREF(left);
2035 Py_DECREF(right);
2036 SET_TOP(res);
2037 if (res == NULL)
2038 goto error;
2039 DISPATCH();
2040 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002041
Benjamin Petersonddd19492018-09-16 22:38:02 -07002042 case TARGET(INPLACE_AND): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002043 PyObject *right = POP();
2044 PyObject *left = TOP();
2045 PyObject *res = PyNumber_InPlaceAnd(left, right);
2046 Py_DECREF(left);
2047 Py_DECREF(right);
2048 SET_TOP(res);
2049 if (res == NULL)
2050 goto error;
2051 DISPATCH();
2052 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002053
Benjamin Petersonddd19492018-09-16 22:38:02 -07002054 case TARGET(INPLACE_XOR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002055 PyObject *right = POP();
2056 PyObject *left = TOP();
2057 PyObject *res = PyNumber_InPlaceXor(left, right);
2058 Py_DECREF(left);
2059 Py_DECREF(right);
2060 SET_TOP(res);
2061 if (res == NULL)
2062 goto error;
2063 DISPATCH();
2064 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002065
Benjamin Petersonddd19492018-09-16 22:38:02 -07002066 case TARGET(INPLACE_OR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002067 PyObject *right = POP();
2068 PyObject *left = TOP();
2069 PyObject *res = PyNumber_InPlaceOr(left, right);
2070 Py_DECREF(left);
2071 Py_DECREF(right);
2072 SET_TOP(res);
2073 if (res == NULL)
2074 goto error;
2075 DISPATCH();
2076 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002077
Benjamin Petersonddd19492018-09-16 22:38:02 -07002078 case TARGET(STORE_SUBSCR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002079 PyObject *sub = TOP();
2080 PyObject *container = SECOND();
2081 PyObject *v = THIRD();
2082 int err;
costypetrisor8ed317f2018-07-31 20:55:14 +00002083 STACK_SHRINK(3);
Martin Panter95f53c12016-07-18 08:23:26 +00002084 /* container[sub] = v */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002085 err = PyObject_SetItem(container, sub, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002086 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002087 Py_DECREF(container);
2088 Py_DECREF(sub);
2089 if (err != 0)
2090 goto error;
2091 DISPATCH();
2092 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002093
Benjamin Petersonddd19492018-09-16 22:38:02 -07002094 case TARGET(DELETE_SUBSCR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002095 PyObject *sub = TOP();
2096 PyObject *container = SECOND();
2097 int err;
costypetrisor8ed317f2018-07-31 20:55:14 +00002098 STACK_SHRINK(2);
Martin Panter95f53c12016-07-18 08:23:26 +00002099 /* del container[sub] */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002100 err = PyObject_DelItem(container, sub);
2101 Py_DECREF(container);
2102 Py_DECREF(sub);
2103 if (err != 0)
2104 goto error;
2105 DISPATCH();
2106 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00002107
Benjamin Petersonddd19492018-09-16 22:38:02 -07002108 case TARGET(PRINT_EXPR): {
Victor Stinnercab75e32013-11-06 22:38:37 +01002109 _Py_IDENTIFIER(displayhook);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002110 PyObject *value = POP();
Victor Stinnercab75e32013-11-06 22:38:37 +01002111 PyObject *hook = _PySys_GetObjectId(&PyId_displayhook);
Benjamin Petersonfe1bcb62012-10-12 11:40:01 -04002112 PyObject *res;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002113 if (hook == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002114 _PyErr_SetString(tstate, PyExc_RuntimeError,
2115 "lost sys.displayhook");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002116 Py_DECREF(value);
2117 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002118 }
Petr Viktorinffd97532020-02-11 17:46:57 +01002119 res = PyObject_CallOneArg(hook, value);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002120 Py_DECREF(value);
2121 if (res == NULL)
2122 goto error;
2123 Py_DECREF(res);
2124 DISPATCH();
2125 }
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00002126
Benjamin Petersonddd19492018-09-16 22:38:02 -07002127 case TARGET(RAISE_VARARGS): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002128 PyObject *cause = NULL, *exc = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002129 switch (oparg) {
2130 case 2:
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002131 cause = POP(); /* cause */
Stefan Krahf432a322017-08-21 13:09:59 +02002132 /* fall through */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002133 case 1:
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002134 exc = POP(); /* exc */
Stefan Krahf432a322017-08-21 13:09:59 +02002135 /* fall through */
2136 case 0:
Victor Stinner09532fe2019-05-10 23:39:09 +02002137 if (do_raise(tstate, exc, cause)) {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002138 goto exception_unwind;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002139 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002140 break;
2141 default:
Victor Stinner438a12d2019-05-24 17:01:38 +02002142 _PyErr_SetString(tstate, PyExc_SystemError,
2143 "bad RAISE_VARARGS oparg");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002144 break;
2145 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002146 goto error;
2147 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002148
Benjamin Petersonddd19492018-09-16 22:38:02 -07002149 case TARGET(RETURN_VALUE): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002150 retval = POP();
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002151 assert(f->f_iblock == 0);
Mark Shannone7c9f4a2020-01-13 12:51:26 +00002152 assert(EMPTY());
Mark Shannoncb9879b2020-07-17 11:44:23 +01002153 f->f_state = FRAME_RETURNED;
2154 f->f_stackdepth = 0;
Mark Shannone7c9f4a2020-01-13 12:51:26 +00002155 goto exiting;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002156 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002157
Benjamin Petersonddd19492018-09-16 22:38:02 -07002158 case TARGET(GET_AITER): {
Yury Selivanov6ef05902015-05-28 11:21:31 -04002159 unaryfunc getter = NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04002160 PyObject *iter = NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04002161 PyObject *obj = TOP();
2162 PyTypeObject *type = Py_TYPE(obj);
2163
Yury Selivanova6f6edb2016-06-09 15:08:31 -04002164 if (type->tp_as_async != NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04002165 getter = type->tp_as_async->am_aiter;
Yury Selivanova6f6edb2016-06-09 15:08:31 -04002166 }
Yury Selivanov75445082015-05-11 22:57:16 -04002167
2168 if (getter != NULL) {
2169 iter = (*getter)(obj);
2170 Py_DECREF(obj);
2171 if (iter == NULL) {
2172 SET_TOP(NULL);
2173 goto error;
2174 }
2175 }
2176 else {
2177 SET_TOP(NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02002178 _PyErr_Format(tstate, PyExc_TypeError,
2179 "'async for' requires an object with "
2180 "__aiter__ method, got %.100s",
2181 type->tp_name);
Yury Selivanov75445082015-05-11 22:57:16 -04002182 Py_DECREF(obj);
2183 goto error;
2184 }
2185
Yury Selivanovfaa135a2017-10-06 02:08:57 -04002186 if (Py_TYPE(iter)->tp_as_async == NULL ||
2187 Py_TYPE(iter)->tp_as_async->am_anext == NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04002188
Yury Selivanov398ff912017-03-02 22:20:00 -05002189 SET_TOP(NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02002190 _PyErr_Format(tstate, PyExc_TypeError,
2191 "'async for' received an object from __aiter__ "
2192 "that does not implement __anext__: %.100s",
2193 Py_TYPE(iter)->tp_name);
Yury Selivanov75445082015-05-11 22:57:16 -04002194 Py_DECREF(iter);
2195 goto error;
Yury Selivanova6f6edb2016-06-09 15:08:31 -04002196 }
2197
Yury Selivanovfaa135a2017-10-06 02:08:57 -04002198 SET_TOP(iter);
Yury Selivanov75445082015-05-11 22:57:16 -04002199 DISPATCH();
2200 }
2201
Benjamin Petersonddd19492018-09-16 22:38:02 -07002202 case TARGET(GET_ANEXT): {
Yury Selivanov6ef05902015-05-28 11:21:31 -04002203 unaryfunc getter = NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04002204 PyObject *next_iter = NULL;
2205 PyObject *awaitable = NULL;
2206 PyObject *aiter = TOP();
2207 PyTypeObject *type = Py_TYPE(aiter);
2208
Yury Selivanoveb636452016-09-08 22:01:51 -07002209 if (PyAsyncGen_CheckExact(aiter)) {
2210 awaitable = type->tp_as_async->am_anext(aiter);
2211 if (awaitable == NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04002212 goto error;
2213 }
Yury Selivanoveb636452016-09-08 22:01:51 -07002214 } else {
2215 if (type->tp_as_async != NULL){
2216 getter = type->tp_as_async->am_anext;
2217 }
Yury Selivanov75445082015-05-11 22:57:16 -04002218
Yury Selivanoveb636452016-09-08 22:01:51 -07002219 if (getter != NULL) {
2220 next_iter = (*getter)(aiter);
2221 if (next_iter == NULL) {
2222 goto error;
2223 }
2224 }
2225 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02002226 _PyErr_Format(tstate, PyExc_TypeError,
2227 "'async for' requires an iterator with "
2228 "__anext__ method, got %.100s",
2229 type->tp_name);
Yury Selivanoveb636452016-09-08 22:01:51 -07002230 goto error;
2231 }
Yury Selivanov75445082015-05-11 22:57:16 -04002232
Yury Selivanoveb636452016-09-08 22:01:51 -07002233 awaitable = _PyCoro_GetAwaitableIter(next_iter);
2234 if (awaitable == NULL) {
Yury Selivanov398ff912017-03-02 22:20:00 -05002235 _PyErr_FormatFromCause(
Yury Selivanoveb636452016-09-08 22:01:51 -07002236 PyExc_TypeError,
2237 "'async for' received an invalid object "
2238 "from __anext__: %.100s",
2239 Py_TYPE(next_iter)->tp_name);
2240
2241 Py_DECREF(next_iter);
2242 goto error;
2243 } else {
2244 Py_DECREF(next_iter);
2245 }
2246 }
Yury Selivanov75445082015-05-11 22:57:16 -04002247
2248 PUSH(awaitable);
Serhiy Storchakada9c5132016-06-27 18:58:57 +03002249 PREDICT(LOAD_CONST);
Yury Selivanov75445082015-05-11 22:57:16 -04002250 DISPATCH();
2251 }
2252
Benjamin Petersonddd19492018-09-16 22:38:02 -07002253 case TARGET(GET_AWAITABLE): {
2254 PREDICTED(GET_AWAITABLE);
Yury Selivanov75445082015-05-11 22:57:16 -04002255 PyObject *iterable = TOP();
Yury Selivanov5376ba92015-06-22 12:19:30 -04002256 PyObject *iter = _PyCoro_GetAwaitableIter(iterable);
Yury Selivanov75445082015-05-11 22:57:16 -04002257
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03002258 if (iter == NULL) {
Mark Shannonfee55262019-11-21 09:11:43 +00002259 int opcode_at_minus_3 = 0;
2260 if ((next_instr - first_instr) > 2) {
2261 opcode_at_minus_3 = _Py_OPCODE(next_instr[-3]);
2262 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002263 format_awaitable_error(tstate, Py_TYPE(iterable),
Mark Shannonfee55262019-11-21 09:11:43 +00002264 opcode_at_minus_3,
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03002265 _Py_OPCODE(next_instr[-2]));
2266 }
2267
Yury Selivanov75445082015-05-11 22:57:16 -04002268 Py_DECREF(iterable);
2269
Yury Selivanovc724bae2016-03-02 11:30:46 -05002270 if (iter != NULL && PyCoro_CheckExact(iter)) {
2271 PyObject *yf = _PyGen_yf((PyGenObject*)iter);
2272 if (yf != NULL) {
2273 /* `iter` is a coroutine object that is being
2274 awaited, `yf` is a pointer to the current awaitable
2275 being awaited on. */
2276 Py_DECREF(yf);
2277 Py_CLEAR(iter);
Victor Stinner438a12d2019-05-24 17:01:38 +02002278 _PyErr_SetString(tstate, PyExc_RuntimeError,
2279 "coroutine is being awaited already");
Yury Selivanovc724bae2016-03-02 11:30:46 -05002280 /* The code below jumps to `error` if `iter` is NULL. */
2281 }
2282 }
2283
Yury Selivanov75445082015-05-11 22:57:16 -04002284 SET_TOP(iter); /* Even if it's NULL */
2285
2286 if (iter == NULL) {
2287 goto error;
2288 }
2289
Serhiy Storchakada9c5132016-06-27 18:58:57 +03002290 PREDICT(LOAD_CONST);
Yury Selivanov75445082015-05-11 22:57:16 -04002291 DISPATCH();
2292 }
2293
Benjamin Petersonddd19492018-09-16 22:38:02 -07002294 case TARGET(YIELD_FROM): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002295 PyObject *v = POP();
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07002296 PyObject *receiver = TOP();
Vladimir Matveev037245c2020-10-09 17:15:15 -07002297 PySendResult gen_status;
2298 if (tstate->c_tracefunc == NULL) {
2299 gen_status = PyIter_Send(receiver, v, &retval);
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05002300 } else {
Vladimir Matveev037245c2020-10-09 17:15:15 -07002301 _Py_IDENTIFIER(send);
2302 if (v == Py_None && PyIter_Check(receiver)) {
2303 retval = Py_TYPE(receiver)->tp_iternext(receiver);
Vladimir Matveev2b053612020-09-18 18:38:38 -07002304 }
2305 else {
Vladimir Matveev037245c2020-10-09 17:15:15 -07002306 retval = _PyObject_CallMethodIdOneArg(receiver, &PyId_send, v);
Vladimir Matveev2b053612020-09-18 18:38:38 -07002307 }
Vladimir Matveev2b053612020-09-18 18:38:38 -07002308 if (retval == NULL) {
2309 if (tstate->c_tracefunc != NULL
2310 && _PyErr_ExceptionMatches(tstate, PyExc_StopIteration))
2311 call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj, tstate, f);
2312 if (_PyGen_FetchStopIterationValue(&retval) == 0) {
2313 gen_status = PYGEN_RETURN;
2314 }
2315 else {
2316 gen_status = PYGEN_ERROR;
2317 }
2318 }
2319 else {
2320 gen_status = PYGEN_NEXT;
2321 }
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05002322 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002323 Py_DECREF(v);
Vladimir Matveev2b053612020-09-18 18:38:38 -07002324 if (gen_status == PYGEN_ERROR) {
2325 assert (retval == NULL);
2326 goto error;
2327 }
2328 if (gen_status == PYGEN_RETURN) {
2329 assert (retval != NULL);
2330
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07002331 Py_DECREF(receiver);
Vladimir Matveev2b053612020-09-18 18:38:38 -07002332 SET_TOP(retval);
2333 retval = NULL;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002334 DISPATCH();
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002335 }
Vladimir Matveev2b053612020-09-18 18:38:38 -07002336 assert (gen_status == PYGEN_NEXT);
Martin Panter95f53c12016-07-18 08:23:26 +00002337 /* receiver remains on stack, retval is value to be yielded */
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05002338 /* and repeat... */
Victor Stinnerf7d199f2016-11-24 22:33:01 +01002339 assert(f->f_lasti >= (int)sizeof(_Py_CODEUNIT));
Serhiy Storchakaab874002016-09-11 13:48:15 +03002340 f->f_lasti -= sizeof(_Py_CODEUNIT);
Mark Shannoncb9879b2020-07-17 11:44:23 +01002341 f->f_state = FRAME_SUSPENDED;
Victor Stinnerb7d8d8d2020-09-23 14:07:16 +02002342 f->f_stackdepth = (int)(stack_pointer - f->f_valuestack);
Mark Shannone7c9f4a2020-01-13 12:51:26 +00002343 goto exiting;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002344 }
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002345
Benjamin Petersonddd19492018-09-16 22:38:02 -07002346 case TARGET(YIELD_VALUE): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002347 retval = POP();
Yury Selivanoveb636452016-09-08 22:01:51 -07002348
2349 if (co->co_flags & CO_ASYNC_GENERATOR) {
2350 PyObject *w = _PyAsyncGenValueWrapperNew(retval);
2351 Py_DECREF(retval);
2352 if (w == NULL) {
2353 retval = NULL;
2354 goto error;
2355 }
2356 retval = w;
2357 }
Mark Shannoncb9879b2020-07-17 11:44:23 +01002358 f->f_state = FRAME_SUSPENDED;
Victor Stinnerb7d8d8d2020-09-23 14:07:16 +02002359 f->f_stackdepth = (int)(stack_pointer - f->f_valuestack);
Mark Shannone7c9f4a2020-01-13 12:51:26 +00002360 goto exiting;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002361 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002362
Benjamin Petersonddd19492018-09-16 22:38:02 -07002363 case TARGET(POP_EXCEPT): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002364 PyObject *type, *value, *traceback;
2365 _PyErr_StackItem *exc_info;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002366 PyTryBlock *b = PyFrame_BlockPop(f);
2367 if (b->b_type != EXCEPT_HANDLER) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002368 _PyErr_SetString(tstate, PyExc_SystemError,
2369 "popped block is not an except handler");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002370 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002371 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002372 assert(STACK_LEVEL() >= (b)->b_level + 3 &&
2373 STACK_LEVEL() <= (b)->b_level + 4);
2374 exc_info = tstate->exc_info;
2375 type = exc_info->exc_type;
2376 value = exc_info->exc_value;
2377 traceback = exc_info->exc_traceback;
2378 exc_info->exc_type = POP();
2379 exc_info->exc_value = POP();
2380 exc_info->exc_traceback = POP();
2381 Py_XDECREF(type);
2382 Py_XDECREF(value);
2383 Py_XDECREF(traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002384 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002385 }
Benjamin Petersoneec3d712008-06-11 15:59:43 +00002386
Benjamin Petersonddd19492018-09-16 22:38:02 -07002387 case TARGET(POP_BLOCK): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002388 PyFrame_BlockPop(f);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002389 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002390 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002391
Mark Shannonfee55262019-11-21 09:11:43 +00002392 case TARGET(RERAISE): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002393 PyObject *exc = POP();
Mark Shannonfee55262019-11-21 09:11:43 +00002394 PyObject *val = POP();
2395 PyObject *tb = POP();
2396 assert(PyExceptionClass_Check(exc));
Victor Stinner61f4db82020-01-28 03:37:45 +01002397 _PyErr_Restore(tstate, exc, val, tb);
Mark Shannonfee55262019-11-21 09:11:43 +00002398 goto exception_unwind;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002399 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002400
Benjamin Petersonddd19492018-09-16 22:38:02 -07002401 case TARGET(END_ASYNC_FOR): {
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002402 PyObject *exc = POP();
2403 assert(PyExceptionClass_Check(exc));
2404 if (PyErr_GivenExceptionMatches(exc, PyExc_StopAsyncIteration)) {
2405 PyTryBlock *b = PyFrame_BlockPop(f);
2406 assert(b->b_type == EXCEPT_HANDLER);
2407 Py_DECREF(exc);
2408 UNWIND_EXCEPT_HANDLER(b);
2409 Py_DECREF(POP());
2410 JUMPBY(oparg);
2411 FAST_DISPATCH();
2412 }
2413 else {
2414 PyObject *val = POP();
2415 PyObject *tb = POP();
Victor Stinner438a12d2019-05-24 17:01:38 +02002416 _PyErr_Restore(tstate, exc, val, tb);
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002417 goto exception_unwind;
2418 }
2419 }
2420
Zackery Spytzce6a0702019-08-25 03:44:09 -06002421 case TARGET(LOAD_ASSERTION_ERROR): {
2422 PyObject *value = PyExc_AssertionError;
2423 Py_INCREF(value);
2424 PUSH(value);
2425 FAST_DISPATCH();
2426 }
2427
Benjamin Petersonddd19492018-09-16 22:38:02 -07002428 case TARGET(LOAD_BUILD_CLASS): {
Victor Stinner3c1e4812012-03-26 22:10:51 +02002429 _Py_IDENTIFIER(__build_class__);
Victor Stinnerb0b22422012-04-19 00:57:45 +02002430
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002431 PyObject *bc;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002432 if (PyDict_CheckExact(f->f_builtins)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002433 bc = _PyDict_GetItemIdWithError(f->f_builtins, &PyId___build_class__);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002434 if (bc == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002435 if (!_PyErr_Occurred(tstate)) {
2436 _PyErr_SetString(tstate, PyExc_NameError,
2437 "__build_class__ not found");
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002438 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002439 goto error;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002440 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002441 Py_INCREF(bc);
Victor Stinnerb0b22422012-04-19 00:57:45 +02002442 }
2443 else {
2444 PyObject *build_class_str = _PyUnicode_FromId(&PyId___build_class__);
2445 if (build_class_str == NULL)
Serhiy Storchaka70b72f02016-11-08 23:12:46 +02002446 goto error;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002447 bc = PyObject_GetItem(f->f_builtins, build_class_str);
2448 if (bc == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002449 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError))
2450 _PyErr_SetString(tstate, PyExc_NameError,
2451 "__build_class__ not found");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002452 goto error;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002453 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002454 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002455 PUSH(bc);
Benjamin Peterson00f86f22012-10-10 14:10:33 -04002456 DISPATCH();
Victor Stinner3c1e4812012-03-26 22:10:51 +02002457 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002458
Benjamin Petersonddd19492018-09-16 22:38:02 -07002459 case TARGET(STORE_NAME): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002460 PyObject *name = GETITEM(names, oparg);
2461 PyObject *v = POP();
2462 PyObject *ns = f->f_locals;
2463 int err;
2464 if (ns == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002465 _PyErr_Format(tstate, PyExc_SystemError,
2466 "no locals found when storing %R", name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002467 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002468 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002469 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002470 if (PyDict_CheckExact(ns))
2471 err = PyDict_SetItem(ns, name, v);
2472 else
2473 err = PyObject_SetItem(ns, name, v);
2474 Py_DECREF(v);
2475 if (err != 0)
2476 goto error;
2477 DISPATCH();
2478 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002479
Benjamin Petersonddd19492018-09-16 22:38:02 -07002480 case TARGET(DELETE_NAME): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002481 PyObject *name = GETITEM(names, oparg);
2482 PyObject *ns = f->f_locals;
2483 int err;
2484 if (ns == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002485 _PyErr_Format(tstate, PyExc_SystemError,
2486 "no locals when deleting %R", name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002487 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002488 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002489 err = PyObject_DelItem(ns, name);
2490 if (err != 0) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002491 format_exc_check_arg(tstate, PyExc_NameError,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002492 NAME_ERROR_MSG,
2493 name);
2494 goto error;
2495 }
2496 DISPATCH();
2497 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00002498
Benjamin Petersonddd19492018-09-16 22:38:02 -07002499 case TARGET(UNPACK_SEQUENCE): {
2500 PREDICTED(UNPACK_SEQUENCE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002501 PyObject *seq = POP(), *item, **items;
2502 if (PyTuple_CheckExact(seq) &&
2503 PyTuple_GET_SIZE(seq) == oparg) {
2504 items = ((PyTupleObject *)seq)->ob_item;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002505 while (oparg--) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002506 item = items[oparg];
2507 Py_INCREF(item);
2508 PUSH(item);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002509 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002510 } else if (PyList_CheckExact(seq) &&
2511 PyList_GET_SIZE(seq) == oparg) {
2512 items = ((PyListObject *)seq)->ob_item;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002513 while (oparg--) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002514 item = items[oparg];
2515 Py_INCREF(item);
2516 PUSH(item);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002517 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002518 } else if (unpack_iterable(tstate, seq, oparg, -1,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002519 stack_pointer + oparg)) {
costypetrisor8ed317f2018-07-31 20:55:14 +00002520 STACK_GROW(oparg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002521 } else {
2522 /* unpack_iterable() raised an exception */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002523 Py_DECREF(seq);
2524 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002525 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002526 Py_DECREF(seq);
Benjamin Peterson00f86f22012-10-10 14:10:33 -04002527 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002528 }
Guido van Rossum0368b722007-05-11 16:50:42 +00002529
Benjamin Petersonddd19492018-09-16 22:38:02 -07002530 case TARGET(UNPACK_EX): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002531 int totalargs = 1 + (oparg & 0xFF) + (oparg >> 8);
2532 PyObject *seq = POP();
2533
Victor Stinner438a12d2019-05-24 17:01:38 +02002534 if (unpack_iterable(tstate, seq, oparg & 0xFF, oparg >> 8,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002535 stack_pointer + totalargs)) {
2536 stack_pointer += totalargs;
2537 } else {
2538 Py_DECREF(seq);
2539 goto error;
2540 }
2541 Py_DECREF(seq);
2542 DISPATCH();
2543 }
2544
Benjamin Petersonddd19492018-09-16 22:38:02 -07002545 case TARGET(STORE_ATTR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002546 PyObject *name = GETITEM(names, oparg);
2547 PyObject *owner = TOP();
2548 PyObject *v = SECOND();
2549 int err;
costypetrisor8ed317f2018-07-31 20:55:14 +00002550 STACK_SHRINK(2);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002551 err = PyObject_SetAttr(owner, name, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002552 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002553 Py_DECREF(owner);
2554 if (err != 0)
2555 goto error;
2556 DISPATCH();
2557 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002558
Benjamin Petersonddd19492018-09-16 22:38:02 -07002559 case TARGET(DELETE_ATTR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002560 PyObject *name = GETITEM(names, oparg);
2561 PyObject *owner = POP();
2562 int err;
2563 err = PyObject_SetAttr(owner, name, (PyObject *)NULL);
2564 Py_DECREF(owner);
2565 if (err != 0)
2566 goto error;
2567 DISPATCH();
2568 }
2569
Benjamin Petersonddd19492018-09-16 22:38:02 -07002570 case TARGET(STORE_GLOBAL): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002571 PyObject *name = GETITEM(names, oparg);
2572 PyObject *v = POP();
2573 int err;
2574 err = PyDict_SetItem(f->f_globals, name, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002575 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002576 if (err != 0)
2577 goto error;
2578 DISPATCH();
2579 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002580
Benjamin Petersonddd19492018-09-16 22:38:02 -07002581 case TARGET(DELETE_GLOBAL): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002582 PyObject *name = GETITEM(names, oparg);
2583 int err;
2584 err = PyDict_DelItem(f->f_globals, name);
2585 if (err != 0) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002586 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
2587 format_exc_check_arg(tstate, PyExc_NameError,
2588 NAME_ERROR_MSG, name);
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002589 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002590 goto error;
Benjamin Peterson00f86f22012-10-10 14:10:33 -04002591 }
2592 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002593 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002594
Benjamin Petersonddd19492018-09-16 22:38:02 -07002595 case TARGET(LOAD_NAME): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002596 PyObject *name = GETITEM(names, oparg);
2597 PyObject *locals = f->f_locals;
2598 PyObject *v;
2599 if (locals == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002600 _PyErr_Format(tstate, PyExc_SystemError,
2601 "no locals when loading %R", name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002602 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002603 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002604 if (PyDict_CheckExact(locals)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002605 v = PyDict_GetItemWithError(locals, name);
2606 if (v != NULL) {
2607 Py_INCREF(v);
2608 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002609 else if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002610 goto error;
2611 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002612 }
2613 else {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002614 v = PyObject_GetItem(locals, name);
Victor Stinnere20310f2015-11-05 13:56:58 +01002615 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002616 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError))
Benjamin Peterson92722792012-12-15 12:51:05 -05002617 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02002618 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002619 }
2620 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002621 if (v == NULL) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002622 v = PyDict_GetItemWithError(f->f_globals, name);
2623 if (v != NULL) {
2624 Py_INCREF(v);
2625 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002626 else if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002627 goto error;
2628 }
2629 else {
Victor Stinnerb0b22422012-04-19 00:57:45 +02002630 if (PyDict_CheckExact(f->f_builtins)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002631 v = PyDict_GetItemWithError(f->f_builtins, name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002632 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002633 if (!_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002634 format_exc_check_arg(
Victor Stinner438a12d2019-05-24 17:01:38 +02002635 tstate, PyExc_NameError,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002636 NAME_ERROR_MSG, name);
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002637 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002638 goto error;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002639 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002640 Py_INCREF(v);
Victor Stinnerb0b22422012-04-19 00:57:45 +02002641 }
2642 else {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002643 v = PyObject_GetItem(f->f_builtins, name);
2644 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002645 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Victor Stinnerb0b22422012-04-19 00:57:45 +02002646 format_exc_check_arg(
Victor Stinner438a12d2019-05-24 17:01:38 +02002647 tstate, PyExc_NameError,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002648 NAME_ERROR_MSG, name);
Victor Stinner438a12d2019-05-24 17:01:38 +02002649 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002650 goto error;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002651 }
Benjamin Peterson20f9c3c2010-07-20 22:39:34 +00002652 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002653 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002654 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002655 PUSH(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002656 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002657 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002658
Benjamin Petersonddd19492018-09-16 22:38:02 -07002659 case TARGET(LOAD_GLOBAL): {
Inada Naoki91234a12019-06-03 21:30:58 +09002660 PyObject *name;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002661 PyObject *v;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002662 if (PyDict_CheckExact(f->f_globals)
Victor Stinnerb4efc962015-11-20 09:24:02 +01002663 && PyDict_CheckExact(f->f_builtins))
2664 {
Inada Naoki91234a12019-06-03 21:30:58 +09002665 OPCACHE_CHECK();
2666 if (co_opcache != NULL && co_opcache->optimized > 0) {
2667 _PyOpcache_LoadGlobal *lg = &co_opcache->u.lg;
2668
2669 if (lg->globals_ver ==
2670 ((PyDictObject *)f->f_globals)->ma_version_tag
2671 && lg->builtins_ver ==
2672 ((PyDictObject *)f->f_builtins)->ma_version_tag)
2673 {
2674 PyObject *ptr = lg->ptr;
2675 OPCACHE_STAT_GLOBAL_HIT();
2676 assert(ptr != NULL);
2677 Py_INCREF(ptr);
2678 PUSH(ptr);
2679 DISPATCH();
2680 }
2681 }
2682
2683 name = GETITEM(names, oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002684 v = _PyDict_LoadGlobal((PyDictObject *)f->f_globals,
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002685 (PyDictObject *)f->f_builtins,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002686 name);
2687 if (v == NULL) {
Victor Stinnerb4efc962015-11-20 09:24:02 +01002688 if (!_PyErr_OCCURRED()) {
2689 /* _PyDict_LoadGlobal() returns NULL without raising
2690 * an exception if the key doesn't exist */
Victor Stinner438a12d2019-05-24 17:01:38 +02002691 format_exc_check_arg(tstate, PyExc_NameError,
Ezio Melotti04a29552013-03-03 15:12:44 +02002692 NAME_ERROR_MSG, name);
Victor Stinnerb4efc962015-11-20 09:24:02 +01002693 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002694 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002695 }
Inada Naoki91234a12019-06-03 21:30:58 +09002696
2697 if (co_opcache != NULL) {
2698 _PyOpcache_LoadGlobal *lg = &co_opcache->u.lg;
2699
2700 if (co_opcache->optimized == 0) {
2701 /* Wasn't optimized before. */
2702 OPCACHE_STAT_GLOBAL_OPT();
2703 } else {
2704 OPCACHE_STAT_GLOBAL_MISS();
2705 }
2706
2707 co_opcache->optimized = 1;
2708 lg->globals_ver =
2709 ((PyDictObject *)f->f_globals)->ma_version_tag;
2710 lg->builtins_ver =
2711 ((PyDictObject *)f->f_builtins)->ma_version_tag;
2712 lg->ptr = v; /* borrowed */
2713 }
2714
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002715 Py_INCREF(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002716 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002717 else {
2718 /* Slow-path if globals or builtins is not a dict */
Victor Stinnerb4efc962015-11-20 09:24:02 +01002719
2720 /* namespace 1: globals */
Inada Naoki91234a12019-06-03 21:30:58 +09002721 name = GETITEM(names, oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002722 v = PyObject_GetItem(f->f_globals, name);
2723 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002724 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Victor Stinner60a1d3c2015-11-05 13:55:20 +01002725 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02002726 }
2727 _PyErr_Clear(tstate);
Victor Stinner60a1d3c2015-11-05 13:55:20 +01002728
Victor Stinnerb4efc962015-11-20 09:24:02 +01002729 /* namespace 2: builtins */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002730 v = PyObject_GetItem(f->f_builtins, name);
2731 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002732 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002733 format_exc_check_arg(
Victor Stinner438a12d2019-05-24 17:01:38 +02002734 tstate, PyExc_NameError,
Ezio Melotti04a29552013-03-03 15:12:44 +02002735 NAME_ERROR_MSG, name);
Victor Stinner438a12d2019-05-24 17:01:38 +02002736 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002737 goto error;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002738 }
2739 }
2740 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002741 PUSH(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002742 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002743 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002744
Benjamin Petersonddd19492018-09-16 22:38:02 -07002745 case TARGET(DELETE_FAST): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002746 PyObject *v = GETLOCAL(oparg);
2747 if (v != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002748 SETLOCAL(oparg, NULL);
2749 DISPATCH();
2750 }
2751 format_exc_check_arg(
Victor Stinner438a12d2019-05-24 17:01:38 +02002752 tstate, PyExc_UnboundLocalError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002753 UNBOUNDLOCAL_ERROR_MSG,
2754 PyTuple_GetItem(co->co_varnames, oparg)
2755 );
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002756 goto error;
2757 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002758
Benjamin Petersonddd19492018-09-16 22:38:02 -07002759 case TARGET(DELETE_DEREF): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002760 PyObject *cell = freevars[oparg];
Raymond Hettingerc32f9db2016-11-12 04:10:35 -05002761 PyObject *oldobj = PyCell_GET(cell);
2762 if (oldobj != NULL) {
2763 PyCell_SET(cell, NULL);
2764 Py_DECREF(oldobj);
Benjamin Peterson00ebe2c2010-09-10 22:02:31 +00002765 DISPATCH();
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00002766 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002767 format_exc_unbound(tstate, co, oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002768 goto error;
2769 }
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00002770
Benjamin Petersonddd19492018-09-16 22:38:02 -07002771 case TARGET(LOAD_CLOSURE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002772 PyObject *cell = freevars[oparg];
2773 Py_INCREF(cell);
2774 PUSH(cell);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002775 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002776 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002777
Benjamin Petersonddd19492018-09-16 22:38:02 -07002778 case TARGET(LOAD_CLASSDEREF): {
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002779 PyObject *name, *value, *locals = f->f_locals;
Victor Stinnerd3dfd0e2013-05-16 23:48:01 +02002780 Py_ssize_t idx;
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002781 assert(locals);
2782 assert(oparg >= PyTuple_GET_SIZE(co->co_cellvars));
2783 idx = oparg - PyTuple_GET_SIZE(co->co_cellvars);
2784 assert(idx >= 0 && idx < PyTuple_GET_SIZE(co->co_freevars));
2785 name = PyTuple_GET_ITEM(co->co_freevars, idx);
2786 if (PyDict_CheckExact(locals)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002787 value = PyDict_GetItemWithError(locals, name);
2788 if (value != NULL) {
2789 Py_INCREF(value);
2790 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002791 else if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002792 goto error;
2793 }
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002794 }
2795 else {
2796 value = PyObject_GetItem(locals, name);
Victor Stinnere20310f2015-11-05 13:56:58 +01002797 if (value == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002798 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002799 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02002800 }
2801 _PyErr_Clear(tstate);
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002802 }
2803 }
2804 if (!value) {
2805 PyObject *cell = freevars[oparg];
2806 value = PyCell_GET(cell);
2807 if (value == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002808 format_exc_unbound(tstate, co, oparg);
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002809 goto error;
2810 }
2811 Py_INCREF(value);
2812 }
2813 PUSH(value);
2814 DISPATCH();
2815 }
2816
Benjamin Petersonddd19492018-09-16 22:38:02 -07002817 case TARGET(LOAD_DEREF): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002818 PyObject *cell = freevars[oparg];
2819 PyObject *value = PyCell_GET(cell);
2820 if (value == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002821 format_exc_unbound(tstate, co, oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002822 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002823 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002824 Py_INCREF(value);
2825 PUSH(value);
2826 DISPATCH();
2827 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002828
Benjamin Petersonddd19492018-09-16 22:38:02 -07002829 case TARGET(STORE_DEREF): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002830 PyObject *v = POP();
2831 PyObject *cell = freevars[oparg];
Raymond Hettingerb2b15432016-11-11 04:32:11 -08002832 PyObject *oldobj = PyCell_GET(cell);
2833 PyCell_SET(cell, v);
2834 Py_XDECREF(oldobj);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002835 DISPATCH();
2836 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002837
Benjamin Petersonddd19492018-09-16 22:38:02 -07002838 case TARGET(BUILD_STRING): {
Serhiy Storchakaea525a22016-09-06 22:07:53 +03002839 PyObject *str;
2840 PyObject *empty = PyUnicode_New(0, 0);
2841 if (empty == NULL) {
2842 goto error;
2843 }
2844 str = _PyUnicode_JoinArray(empty, stack_pointer - oparg, oparg);
2845 Py_DECREF(empty);
2846 if (str == NULL)
2847 goto error;
2848 while (--oparg >= 0) {
2849 PyObject *item = POP();
2850 Py_DECREF(item);
2851 }
2852 PUSH(str);
2853 DISPATCH();
2854 }
2855
Benjamin Petersonddd19492018-09-16 22:38:02 -07002856 case TARGET(BUILD_TUPLE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002857 PyObject *tup = PyTuple_New(oparg);
2858 if (tup == NULL)
2859 goto error;
2860 while (--oparg >= 0) {
2861 PyObject *item = POP();
2862 PyTuple_SET_ITEM(tup, oparg, item);
2863 }
2864 PUSH(tup);
2865 DISPATCH();
2866 }
2867
Benjamin Petersonddd19492018-09-16 22:38:02 -07002868 case TARGET(BUILD_LIST): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002869 PyObject *list = PyList_New(oparg);
2870 if (list == NULL)
2871 goto error;
2872 while (--oparg >= 0) {
2873 PyObject *item = POP();
2874 PyList_SET_ITEM(list, oparg, item);
2875 }
2876 PUSH(list);
2877 DISPATCH();
2878 }
2879
Mark Shannon13bc1392020-01-23 09:25:17 +00002880 case TARGET(LIST_TO_TUPLE): {
2881 PyObject *list = POP();
2882 PyObject *tuple = PyList_AsTuple(list);
2883 Py_DECREF(list);
2884 if (tuple == NULL) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002885 goto error;
Mark Shannon13bc1392020-01-23 09:25:17 +00002886 }
2887 PUSH(tuple);
2888 DISPATCH();
2889 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002890
Mark Shannon13bc1392020-01-23 09:25:17 +00002891 case TARGET(LIST_EXTEND): {
2892 PyObject *iterable = POP();
2893 PyObject *list = PEEK(oparg);
2894 PyObject *none_val = _PyList_Extend((PyListObject *)list, iterable);
2895 if (none_val == NULL) {
2896 if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError) &&
Victor Stinnera102ed72020-02-07 02:24:48 +01002897 (Py_TYPE(iterable)->tp_iter == NULL && !PySequence_Check(iterable)))
Mark Shannon13bc1392020-01-23 09:25:17 +00002898 {
Victor Stinner61f4db82020-01-28 03:37:45 +01002899 _PyErr_Clear(tstate);
Mark Shannon13bc1392020-01-23 09:25:17 +00002900 _PyErr_Format(tstate, PyExc_TypeError,
2901 "Value after * must be an iterable, not %.200s",
2902 Py_TYPE(iterable)->tp_name);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002903 }
Mark Shannon13bc1392020-01-23 09:25:17 +00002904 Py_DECREF(iterable);
2905 goto error;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002906 }
Mark Shannon13bc1392020-01-23 09:25:17 +00002907 Py_DECREF(none_val);
2908 Py_DECREF(iterable);
2909 DISPATCH();
2910 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002911
Mark Shannon13bc1392020-01-23 09:25:17 +00002912 case TARGET(SET_UPDATE): {
2913 PyObject *iterable = POP();
2914 PyObject *set = PEEK(oparg);
2915 int err = _PySet_Update(set, iterable);
2916 Py_DECREF(iterable);
2917 if (err < 0) {
2918 goto error;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002919 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002920 DISPATCH();
2921 }
2922
Benjamin Petersonddd19492018-09-16 22:38:02 -07002923 case TARGET(BUILD_SET): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002924 PyObject *set = PySet_New(NULL);
2925 int err = 0;
Raymond Hettinger4c483ad2016-09-08 14:45:40 -07002926 int i;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002927 if (set == NULL)
2928 goto error;
Raymond Hettinger4c483ad2016-09-08 14:45:40 -07002929 for (i = oparg; i > 0; i--) {
2930 PyObject *item = PEEK(i);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002931 if (err == 0)
2932 err = PySet_Add(set, item);
2933 Py_DECREF(item);
2934 }
costypetrisor8ed317f2018-07-31 20:55:14 +00002935 STACK_SHRINK(oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002936 if (err != 0) {
2937 Py_DECREF(set);
2938 goto error;
2939 }
2940 PUSH(set);
2941 DISPATCH();
2942 }
2943
Benjamin Petersonddd19492018-09-16 22:38:02 -07002944 case TARGET(BUILD_MAP): {
Victor Stinner74319ae2016-08-25 00:04:09 +02002945 Py_ssize_t i;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002946 PyObject *map = _PyDict_NewPresized((Py_ssize_t)oparg);
2947 if (map == NULL)
2948 goto error;
Benjamin Petersond5d77aa2015-07-05 10:37:25 -05002949 for (i = oparg; i > 0; i--) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002950 int err;
Benjamin Petersond5d77aa2015-07-05 10:37:25 -05002951 PyObject *key = PEEK(2*i);
2952 PyObject *value = PEEK(2*i - 1);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002953 err = PyDict_SetItem(map, key, value);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002954 if (err != 0) {
2955 Py_DECREF(map);
2956 goto error;
2957 }
2958 }
Benjamin Petersond5d77aa2015-07-05 10:37:25 -05002959
2960 while (oparg--) {
2961 Py_DECREF(POP());
2962 Py_DECREF(POP());
2963 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002964 PUSH(map);
2965 DISPATCH();
2966 }
2967
Benjamin Petersonddd19492018-09-16 22:38:02 -07002968 case TARGET(SETUP_ANNOTATIONS): {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002969 _Py_IDENTIFIER(__annotations__);
2970 int err;
2971 PyObject *ann_dict;
2972 if (f->f_locals == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002973 _PyErr_Format(tstate, PyExc_SystemError,
2974 "no locals found when setting up annotations");
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002975 goto error;
2976 }
2977 /* check if __annotations__ in locals()... */
2978 if (PyDict_CheckExact(f->f_locals)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002979 ann_dict = _PyDict_GetItemIdWithError(f->f_locals,
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002980 &PyId___annotations__);
2981 if (ann_dict == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002982 if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002983 goto error;
2984 }
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002985 /* ...if not, create a new one */
2986 ann_dict = PyDict_New();
2987 if (ann_dict == NULL) {
2988 goto error;
2989 }
2990 err = _PyDict_SetItemId(f->f_locals,
2991 &PyId___annotations__, ann_dict);
2992 Py_DECREF(ann_dict);
2993 if (err != 0) {
2994 goto error;
2995 }
2996 }
2997 }
2998 else {
2999 /* do the same if locals() is not a dict */
3000 PyObject *ann_str = _PyUnicode_FromId(&PyId___annotations__);
3001 if (ann_str == NULL) {
Serhiy Storchaka4678b2f2016-11-08 23:13:36 +02003002 goto error;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003003 }
3004 ann_dict = PyObject_GetItem(f->f_locals, ann_str);
3005 if (ann_dict == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003006 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003007 goto error;
3008 }
Victor Stinner438a12d2019-05-24 17:01:38 +02003009 _PyErr_Clear(tstate);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003010 ann_dict = PyDict_New();
3011 if (ann_dict == NULL) {
3012 goto error;
3013 }
3014 err = PyObject_SetItem(f->f_locals, ann_str, ann_dict);
3015 Py_DECREF(ann_dict);
3016 if (err != 0) {
3017 goto error;
3018 }
3019 }
3020 else {
3021 Py_DECREF(ann_dict);
3022 }
3023 }
3024 DISPATCH();
3025 }
3026
Benjamin Petersonddd19492018-09-16 22:38:02 -07003027 case TARGET(BUILD_CONST_KEY_MAP): {
Victor Stinner74319ae2016-08-25 00:04:09 +02003028 Py_ssize_t i;
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003029 PyObject *map;
3030 PyObject *keys = TOP();
3031 if (!PyTuple_CheckExact(keys) ||
3032 PyTuple_GET_SIZE(keys) != (Py_ssize_t)oparg) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003033 _PyErr_SetString(tstate, PyExc_SystemError,
3034 "bad BUILD_CONST_KEY_MAP keys argument");
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003035 goto error;
3036 }
3037 map = _PyDict_NewPresized((Py_ssize_t)oparg);
3038 if (map == NULL) {
3039 goto error;
3040 }
3041 for (i = oparg; i > 0; i--) {
3042 int err;
3043 PyObject *key = PyTuple_GET_ITEM(keys, oparg - i);
3044 PyObject *value = PEEK(i + 1);
3045 err = PyDict_SetItem(map, key, value);
3046 if (err != 0) {
3047 Py_DECREF(map);
3048 goto error;
3049 }
3050 }
3051
3052 Py_DECREF(POP());
3053 while (oparg--) {
3054 Py_DECREF(POP());
3055 }
3056 PUSH(map);
3057 DISPATCH();
3058 }
3059
Mark Shannon8a4cd702020-01-27 09:57:45 +00003060 case TARGET(DICT_UPDATE): {
3061 PyObject *update = POP();
3062 PyObject *dict = PEEK(oparg);
3063 if (PyDict_Update(dict, update) < 0) {
3064 if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) {
3065 _PyErr_Format(tstate, PyExc_TypeError,
3066 "'%.200s' object is not a mapping",
Victor Stinnera102ed72020-02-07 02:24:48 +01003067 Py_TYPE(update)->tp_name);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003068 }
Mark Shannon8a4cd702020-01-27 09:57:45 +00003069 Py_DECREF(update);
3070 goto error;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003071 }
Mark Shannon8a4cd702020-01-27 09:57:45 +00003072 Py_DECREF(update);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003073 DISPATCH();
3074 }
3075
Mark Shannon8a4cd702020-01-27 09:57:45 +00003076 case TARGET(DICT_MERGE): {
3077 PyObject *update = POP();
3078 PyObject *dict = PEEK(oparg);
3079
3080 if (_PyDict_MergeEx(dict, update, 2) < 0) {
3081 format_kwargs_error(tstate, PEEK(2 + oparg), update);
3082 Py_DECREF(update);
Serhiy Storchakae036ef82016-10-02 11:06:43 +03003083 goto error;
Serhiy Storchakae036ef82016-10-02 11:06:43 +03003084 }
Mark Shannon8a4cd702020-01-27 09:57:45 +00003085 Py_DECREF(update);
Brandt Bucherf185a732019-09-28 17:12:49 -07003086 PREDICT(CALL_FUNCTION_EX);
Serhiy Storchakae036ef82016-10-02 11:06:43 +03003087 DISPATCH();
3088 }
3089
Benjamin Petersonddd19492018-09-16 22:38:02 -07003090 case TARGET(MAP_ADD): {
Jörn Heisslerc8a35412019-06-22 16:40:55 +02003091 PyObject *value = TOP();
3092 PyObject *key = SECOND();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003093 PyObject *map;
3094 int err;
costypetrisor8ed317f2018-07-31 20:55:14 +00003095 STACK_SHRINK(2);
Raymond Hettinger41862222016-10-15 19:03:06 -07003096 map = PEEK(oparg); /* dict */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003097 assert(PyDict_CheckExact(map));
Martin Panter95f53c12016-07-18 08:23:26 +00003098 err = PyDict_SetItem(map, key, value); /* map[key] = value */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003099 Py_DECREF(value);
3100 Py_DECREF(key);
3101 if (err != 0)
3102 goto error;
3103 PREDICT(JUMP_ABSOLUTE);
3104 DISPATCH();
3105 }
3106
Benjamin Petersonddd19492018-09-16 22:38:02 -07003107 case TARGET(LOAD_ATTR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003108 PyObject *name = GETITEM(names, oparg);
3109 PyObject *owner = TOP();
Pablo Galindo109826c2020-10-20 06:22:44 +01003110
3111 PyTypeObject *type = Py_TYPE(owner);
3112 PyObject *res;
3113 PyObject **dictptr;
3114 PyObject *dict;
3115 _PyOpCodeOpt_LoadAttr *la;
3116
3117 OPCACHE_STAT_ATTR_TOTAL();
3118
3119 OPCACHE_CHECK();
3120 if (co_opcache != NULL && PyType_HasFeature(type, Py_TPFLAGS_VALID_VERSION_TAG))
3121 {
3122 if (co_opcache->optimized > 0) {
3123 /* Fast path -- cache hit makes LOAD_ATTR ~30% faster */
3124 la = &co_opcache->u.la;
3125 if (la->type == type && la->tp_version_tag == type->tp_version_tag)
3126 {
3127 assert(type->tp_dict != NULL);
3128 assert(type->tp_dictoffset > 0);
3129
3130 dictptr = (PyObject **) ((char *)owner + type->tp_dictoffset);
3131 dict = *dictptr;
3132 if (dict != NULL && PyDict_CheckExact(dict)) {
3133 Py_ssize_t hint = la->hint;
3134 Py_INCREF(dict);
3135 res = NULL;
3136 la->hint = _PyDict_GetItemHint((PyDictObject*)dict, name, hint, &res);
3137
3138 if (res != NULL) {
3139 if (la->hint == hint && hint >= 0) {
3140 /* Our hint has helped -- cache hit. */
3141 OPCACHE_STAT_ATTR_HIT();
3142 } else {
3143 /* The hint we provided didn't work.
3144 Maybe next time? */
3145 OPCACHE_MAYBE_DEOPT_LOAD_ATTR();
3146 }
3147
3148 Py_INCREF(res);
3149 SET_TOP(res);
3150 Py_DECREF(owner);
3151 Py_DECREF(dict);
3152 DISPATCH();
3153 } else {
3154 // This attribute can be missing sometimes -- we
3155 // don't want to optimize this lookup.
3156 OPCACHE_DEOPT_LOAD_ATTR();
3157 Py_DECREF(dict);
3158 }
3159 } else {
3160 // There is no dict, or __dict__ doesn't satisfy PyDict_CheckExact
3161 OPCACHE_DEOPT_LOAD_ATTR();
3162 }
3163 } else {
3164 // The type of the object has either been updated,
3165 // or is different. Maybe it will stabilize?
3166 OPCACHE_MAYBE_DEOPT_LOAD_ATTR();
3167 }
3168
3169 OPCACHE_STAT_ATTR_MISS();
3170 }
3171
3172 if (co_opcache != NULL && /* co_opcache can be NULL after a DEOPT() call. */
3173 type->tp_getattro == PyObject_GenericGetAttr)
3174 {
3175 PyObject *descr;
3176 Py_ssize_t ret;
3177
3178 if (type->tp_dictoffset > 0) {
3179 if (type->tp_dict == NULL) {
3180 if (PyType_Ready(type) < 0) {
3181 Py_DECREF(owner);
3182 SET_TOP(NULL);
3183 goto error;
3184 }
3185 }
3186
3187 descr = _PyType_Lookup(type, name);
3188 if (descr == NULL ||
3189 descr->ob_type->tp_descr_get == NULL ||
3190 !PyDescr_IsData(descr))
3191 {
3192 dictptr = (PyObject **) ((char *)owner + type->tp_dictoffset);
3193 dict = *dictptr;
3194
3195 if (dict != NULL && PyDict_CheckExact(dict)) {
3196 Py_INCREF(dict);
3197 res = NULL;
3198 ret = _PyDict_GetItemHint((PyDictObject*)dict, name, -1, &res);
3199 if (res != NULL) {
3200 Py_INCREF(res);
3201 Py_DECREF(dict);
3202 Py_DECREF(owner);
3203 SET_TOP(res);
3204
3205 if (co_opcache->optimized == 0) {
3206 // First time we optimize this opcode. */
3207 OPCACHE_STAT_ATTR_OPT();
3208 co_opcache->optimized = OPCODE_CACHE_MAX_TRIES;
3209 }
3210
3211 la = &co_opcache->u.la;
3212 la->type = type;
3213 la->tp_version_tag = type->tp_version_tag;
3214 la->hint = ret;
3215
3216 DISPATCH();
3217 }
3218 Py_DECREF(dict);
3219 } else {
3220 // There is no dict, or __dict__ doesn't satisfy PyDict_CheckExact
3221 OPCACHE_DEOPT_LOAD_ATTR();
3222 }
3223 } else {
3224 // We failed to find an attribute without a data-like descriptor
3225 OPCACHE_DEOPT_LOAD_ATTR();
3226 }
3227 } else {
3228 // The object's class does not have a tp_dictoffset we can use
3229 OPCACHE_DEOPT_LOAD_ATTR();
3230 }
3231 } else if (type->tp_getattro != PyObject_GenericGetAttr) {
3232 OPCACHE_DEOPT_LOAD_ATTR();
3233 }
3234 }
3235
3236 /* slow path */
3237 res = PyObject_GetAttr(owner, name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003238 Py_DECREF(owner);
3239 SET_TOP(res);
3240 if (res == NULL)
3241 goto error;
3242 DISPATCH();
3243 }
3244
Benjamin Petersonddd19492018-09-16 22:38:02 -07003245 case TARGET(COMPARE_OP): {
Mark Shannon9af0e472020-01-14 10:12:45 +00003246 assert(oparg <= Py_GE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003247 PyObject *right = POP();
3248 PyObject *left = TOP();
Mark Shannon9af0e472020-01-14 10:12:45 +00003249 PyObject *res = PyObject_RichCompare(left, right, oparg);
3250 SET_TOP(res);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003251 Py_DECREF(left);
3252 Py_DECREF(right);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003253 if (res == NULL)
3254 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003255 PREDICT(POP_JUMP_IF_FALSE);
3256 PREDICT(POP_JUMP_IF_TRUE);
3257 DISPATCH();
Victor Stinner3c1e4812012-03-26 22:10:51 +02003258 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003259
Mark Shannon9af0e472020-01-14 10:12:45 +00003260 case TARGET(IS_OP): {
3261 PyObject *right = POP();
3262 PyObject *left = TOP();
3263 int res = (left == right)^oparg;
3264 PyObject *b = res ? Py_True : Py_False;
3265 Py_INCREF(b);
3266 SET_TOP(b);
3267 Py_DECREF(left);
3268 Py_DECREF(right);
3269 PREDICT(POP_JUMP_IF_FALSE);
3270 PREDICT(POP_JUMP_IF_TRUE);
3271 FAST_DISPATCH();
3272 }
3273
3274 case TARGET(CONTAINS_OP): {
3275 PyObject *right = POP();
3276 PyObject *left = POP();
3277 int res = PySequence_Contains(right, left);
3278 Py_DECREF(left);
3279 Py_DECREF(right);
3280 if (res < 0) {
3281 goto error;
3282 }
3283 PyObject *b = (res^oparg) ? Py_True : Py_False;
3284 Py_INCREF(b);
3285 PUSH(b);
3286 PREDICT(POP_JUMP_IF_FALSE);
3287 PREDICT(POP_JUMP_IF_TRUE);
3288 FAST_DISPATCH();
3289 }
3290
3291#define CANNOT_CATCH_MSG "catching classes that do not inherit from "\
3292 "BaseException is not allowed"
3293
3294 case TARGET(JUMP_IF_NOT_EXC_MATCH): {
3295 PyObject *right = POP();
3296 PyObject *left = POP();
3297 if (PyTuple_Check(right)) {
3298 Py_ssize_t i, length;
3299 length = PyTuple_GET_SIZE(right);
3300 for (i = 0; i < length; i++) {
3301 PyObject *exc = PyTuple_GET_ITEM(right, i);
3302 if (!PyExceptionClass_Check(exc)) {
3303 _PyErr_SetString(tstate, PyExc_TypeError,
3304 CANNOT_CATCH_MSG);
3305 Py_DECREF(left);
3306 Py_DECREF(right);
3307 goto error;
3308 }
3309 }
3310 }
3311 else {
3312 if (!PyExceptionClass_Check(right)) {
3313 _PyErr_SetString(tstate, PyExc_TypeError,
3314 CANNOT_CATCH_MSG);
3315 Py_DECREF(left);
3316 Py_DECREF(right);
3317 goto error;
3318 }
3319 }
3320 int res = PyErr_GivenExceptionMatches(left, right);
3321 Py_DECREF(left);
3322 Py_DECREF(right);
3323 if (res > 0) {
3324 /* Exception matches -- Do nothing */;
3325 }
3326 else if (res == 0) {
3327 JUMPTO(oparg);
3328 }
3329 else {
3330 goto error;
3331 }
3332 DISPATCH();
3333 }
3334
Benjamin Petersonddd19492018-09-16 22:38:02 -07003335 case TARGET(IMPORT_NAME): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003336 PyObject *name = GETITEM(names, oparg);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03003337 PyObject *fromlist = POP();
3338 PyObject *level = TOP();
3339 PyObject *res;
Victor Stinner438a12d2019-05-24 17:01:38 +02003340 res = import_name(tstate, f, name, fromlist, level);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03003341 Py_DECREF(level);
3342 Py_DECREF(fromlist);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003343 SET_TOP(res);
3344 if (res == NULL)
3345 goto error;
3346 DISPATCH();
3347 }
3348
Benjamin Petersonddd19492018-09-16 22:38:02 -07003349 case TARGET(IMPORT_STAR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003350 PyObject *from = POP(), *locals;
3351 int err;
Matthias Bussonnier160edb42017-02-25 21:58:05 -08003352 if (PyFrame_FastToLocalsWithError(f) < 0) {
3353 Py_DECREF(from);
Victor Stinner41bb43a2013-10-29 01:19:37 +01003354 goto error;
Matthias Bussonnier160edb42017-02-25 21:58:05 -08003355 }
Victor Stinner41bb43a2013-10-29 01:19:37 +01003356
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003357 locals = f->f_locals;
3358 if (locals == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003359 _PyErr_SetString(tstate, PyExc_SystemError,
3360 "no locals found during 'import *'");
Matthias Bussonnier160edb42017-02-25 21:58:05 -08003361 Py_DECREF(from);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003362 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003363 }
Victor Stinner438a12d2019-05-24 17:01:38 +02003364 err = import_all_from(tstate, locals, from);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003365 PyFrame_LocalsToFast(f, 0);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003366 Py_DECREF(from);
3367 if (err != 0)
3368 goto error;
3369 DISPATCH();
3370 }
Guido van Rossum25831651993-05-19 14:50:45 +00003371
Benjamin Petersonddd19492018-09-16 22:38:02 -07003372 case TARGET(IMPORT_FROM): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003373 PyObject *name = GETITEM(names, oparg);
3374 PyObject *from = TOP();
3375 PyObject *res;
Victor Stinner438a12d2019-05-24 17:01:38 +02003376 res = import_from(tstate, from, name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003377 PUSH(res);
3378 if (res == NULL)
3379 goto error;
3380 DISPATCH();
3381 }
Thomas Wouters52152252000-08-17 22:55:00 +00003382
Benjamin Petersonddd19492018-09-16 22:38:02 -07003383 case TARGET(JUMP_FORWARD): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003384 JUMPBY(oparg);
3385 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003386 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003387
Benjamin Petersonddd19492018-09-16 22:38:02 -07003388 case TARGET(POP_JUMP_IF_FALSE): {
3389 PREDICTED(POP_JUMP_IF_FALSE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003390 PyObject *cond = POP();
3391 int err;
3392 if (cond == Py_True) {
3393 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003394 FAST_DISPATCH();
3395 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003396 if (cond == Py_False) {
3397 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003398 JUMPTO(oparg);
3399 FAST_DISPATCH();
3400 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003401 err = PyObject_IsTrue(cond);
3402 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003403 if (err > 0)
Adrian Wielgosik50c28502017-06-23 13:35:41 -07003404 ;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003405 else if (err == 0)
3406 JUMPTO(oparg);
3407 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003408 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003409 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003410 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003411
Benjamin Petersonddd19492018-09-16 22:38:02 -07003412 case TARGET(POP_JUMP_IF_TRUE): {
3413 PREDICTED(POP_JUMP_IF_TRUE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003414 PyObject *cond = POP();
3415 int err;
3416 if (cond == Py_False) {
3417 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003418 FAST_DISPATCH();
3419 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003420 if (cond == Py_True) {
3421 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003422 JUMPTO(oparg);
3423 FAST_DISPATCH();
3424 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003425 err = PyObject_IsTrue(cond);
3426 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003427 if (err > 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003428 JUMPTO(oparg);
3429 }
3430 else if (err == 0)
3431 ;
3432 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003433 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003434 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003435 }
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00003436
Benjamin Petersonddd19492018-09-16 22:38:02 -07003437 case TARGET(JUMP_IF_FALSE_OR_POP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003438 PyObject *cond = TOP();
3439 int err;
3440 if (cond == Py_True) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003441 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003442 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003443 FAST_DISPATCH();
3444 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003445 if (cond == Py_False) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003446 JUMPTO(oparg);
3447 FAST_DISPATCH();
3448 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003449 err = PyObject_IsTrue(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003450 if (err > 0) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003451 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003452 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003453 }
3454 else if (err == 0)
3455 JUMPTO(oparg);
3456 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003457 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003458 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003459 }
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00003460
Benjamin Petersonddd19492018-09-16 22:38:02 -07003461 case TARGET(JUMP_IF_TRUE_OR_POP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003462 PyObject *cond = TOP();
3463 int err;
3464 if (cond == Py_False) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003465 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003466 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003467 FAST_DISPATCH();
3468 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003469 if (cond == Py_True) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003470 JUMPTO(oparg);
3471 FAST_DISPATCH();
3472 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003473 err = PyObject_IsTrue(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003474 if (err > 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003475 JUMPTO(oparg);
3476 }
3477 else if (err == 0) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003478 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003479 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003480 }
3481 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003482 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003483 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003484 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003485
Benjamin Petersonddd19492018-09-16 22:38:02 -07003486 case TARGET(JUMP_ABSOLUTE): {
3487 PREDICTED(JUMP_ABSOLUTE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003488 JUMPTO(oparg);
Guido van Rossum58da9312007-11-10 23:39:45 +00003489#if FAST_LOOPS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003490 /* Enabling this path speeds-up all while and for-loops by bypassing
3491 the per-loop checks for signals. By default, this should be turned-off
3492 because it prevents detection of a control-break in tight loops like
3493 "while 1: pass". Compile with this option turned-on when you need
3494 the speed-up and do not need break checking inside tight loops (ones
3495 that contain only instructions ending with FAST_DISPATCH).
3496 */
3497 FAST_DISPATCH();
Guido van Rossum58da9312007-11-10 23:39:45 +00003498#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003499 DISPATCH();
Guido van Rossum58da9312007-11-10 23:39:45 +00003500#endif
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003501 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003502
Benjamin Petersonddd19492018-09-16 22:38:02 -07003503 case TARGET(GET_ITER): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003504 /* before: [obj]; after [getiter(obj)] */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003505 PyObject *iterable = TOP();
Yury Selivanov5376ba92015-06-22 12:19:30 -04003506 PyObject *iter = PyObject_GetIter(iterable);
3507 Py_DECREF(iterable);
3508 SET_TOP(iter);
3509 if (iter == NULL)
3510 goto error;
3511 PREDICT(FOR_ITER);
Serhiy Storchakada9c5132016-06-27 18:58:57 +03003512 PREDICT(CALL_FUNCTION);
Yury Selivanov5376ba92015-06-22 12:19:30 -04003513 DISPATCH();
3514 }
3515
Benjamin Petersonddd19492018-09-16 22:38:02 -07003516 case TARGET(GET_YIELD_FROM_ITER): {
Yury Selivanov5376ba92015-06-22 12:19:30 -04003517 /* before: [obj]; after [getiter(obj)] */
3518 PyObject *iterable = TOP();
Yury Selivanov75445082015-05-11 22:57:16 -04003519 PyObject *iter;
Yury Selivanov5376ba92015-06-22 12:19:30 -04003520 if (PyCoro_CheckExact(iterable)) {
3521 /* `iterable` is a coroutine */
3522 if (!(co->co_flags & (CO_COROUTINE | CO_ITERABLE_COROUTINE))) {
3523 /* and it is used in a 'yield from' expression of a
3524 regular generator. */
3525 Py_DECREF(iterable);
3526 SET_TOP(NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02003527 _PyErr_SetString(tstate, PyExc_TypeError,
3528 "cannot 'yield from' a coroutine object "
3529 "in a non-coroutine generator");
Yury Selivanov5376ba92015-06-22 12:19:30 -04003530 goto error;
3531 }
3532 }
3533 else if (!PyGen_CheckExact(iterable)) {
Yury Selivanov75445082015-05-11 22:57:16 -04003534 /* `iterable` is not a generator. */
3535 iter = PyObject_GetIter(iterable);
3536 Py_DECREF(iterable);
3537 SET_TOP(iter);
3538 if (iter == NULL)
3539 goto error;
3540 }
Serhiy Storchakada9c5132016-06-27 18:58:57 +03003541 PREDICT(LOAD_CONST);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003542 DISPATCH();
3543 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003544
Benjamin Petersonddd19492018-09-16 22:38:02 -07003545 case TARGET(FOR_ITER): {
3546 PREDICTED(FOR_ITER);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003547 /* before: [iter]; after: [iter, iter()] *or* [] */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003548 PyObject *iter = TOP();
Victor Stinnera102ed72020-02-07 02:24:48 +01003549 PyObject *next = (*Py_TYPE(iter)->tp_iternext)(iter);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003550 if (next != NULL) {
3551 PUSH(next);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003552 PREDICT(STORE_FAST);
3553 PREDICT(UNPACK_SEQUENCE);
3554 DISPATCH();
3555 }
Victor Stinner438a12d2019-05-24 17:01:38 +02003556 if (_PyErr_Occurred(tstate)) {
3557 if (!_PyErr_ExceptionMatches(tstate, PyExc_StopIteration)) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003558 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02003559 }
3560 else if (tstate->c_tracefunc != NULL) {
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003561 call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj, tstate, f);
Victor Stinner438a12d2019-05-24 17:01:38 +02003562 }
3563 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003564 }
3565 /* iterator ended normally */
costypetrisor8ed317f2018-07-31 20:55:14 +00003566 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003567 Py_DECREF(iter);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003568 JUMPBY(oparg);
3569 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003570 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003571
Benjamin Petersonddd19492018-09-16 22:38:02 -07003572 case TARGET(SETUP_FINALLY): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003573 PyFrame_BlockSetup(f, SETUP_FINALLY, INSTR_OFFSET() + oparg,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003574 STACK_LEVEL());
3575 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003576 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003577
Benjamin Petersonddd19492018-09-16 22:38:02 -07003578 case TARGET(BEFORE_ASYNC_WITH): {
Yury Selivanov75445082015-05-11 22:57:16 -04003579 _Py_IDENTIFIER(__aenter__);
Géry Ogam1d1b97a2020-01-14 12:58:29 +01003580 _Py_IDENTIFIER(__aexit__);
Yury Selivanov75445082015-05-11 22:57:16 -04003581 PyObject *mgr = TOP();
Géry Ogam1d1b97a2020-01-14 12:58:29 +01003582 PyObject *enter = special_lookup(tstate, mgr, &PyId___aenter__);
Yury Selivanov75445082015-05-11 22:57:16 -04003583 PyObject *res;
Géry Ogam1d1b97a2020-01-14 12:58:29 +01003584 if (enter == NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04003585 goto error;
Géry Ogam1d1b97a2020-01-14 12:58:29 +01003586 }
3587 PyObject *exit = special_lookup(tstate, mgr, &PyId___aexit__);
3588 if (exit == NULL) {
3589 Py_DECREF(enter);
3590 goto error;
3591 }
Yury Selivanov75445082015-05-11 22:57:16 -04003592 SET_TOP(exit);
Yury Selivanov75445082015-05-11 22:57:16 -04003593 Py_DECREF(mgr);
Victor Stinnerf17c3de2016-12-06 18:46:19 +01003594 res = _PyObject_CallNoArg(enter);
Yury Selivanov75445082015-05-11 22:57:16 -04003595 Py_DECREF(enter);
3596 if (res == NULL)
3597 goto error;
3598 PUSH(res);
Serhiy Storchakada9c5132016-06-27 18:58:57 +03003599 PREDICT(GET_AWAITABLE);
Yury Selivanov75445082015-05-11 22:57:16 -04003600 DISPATCH();
3601 }
3602
Benjamin Petersonddd19492018-09-16 22:38:02 -07003603 case TARGET(SETUP_ASYNC_WITH): {
Yury Selivanov75445082015-05-11 22:57:16 -04003604 PyObject *res = POP();
3605 /* Setup the finally block before pushing the result
3606 of __aenter__ on the stack. */
3607 PyFrame_BlockSetup(f, SETUP_FINALLY, INSTR_OFFSET() + oparg,
3608 STACK_LEVEL());
3609 PUSH(res);
3610 DISPATCH();
3611 }
3612
Benjamin Petersonddd19492018-09-16 22:38:02 -07003613 case TARGET(SETUP_WITH): {
Benjamin Petersonce798522012-01-22 11:24:29 -05003614 _Py_IDENTIFIER(__enter__);
Géry Ogam1d1b97a2020-01-14 12:58:29 +01003615 _Py_IDENTIFIER(__exit__);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003616 PyObject *mgr = TOP();
Victor Stinner438a12d2019-05-24 17:01:38 +02003617 PyObject *enter = special_lookup(tstate, mgr, &PyId___enter__);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003618 PyObject *res;
Victor Stinner438a12d2019-05-24 17:01:38 +02003619 if (enter == NULL) {
Raymond Hettingera3fec152016-11-21 17:24:23 -08003620 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02003621 }
3622 PyObject *exit = special_lookup(tstate, mgr, &PyId___exit__);
Raymond Hettinger64e2f9a2016-11-22 11:50:40 -08003623 if (exit == NULL) {
3624 Py_DECREF(enter);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003625 goto error;
Raymond Hettinger64e2f9a2016-11-22 11:50:40 -08003626 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003627 SET_TOP(exit);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003628 Py_DECREF(mgr);
Victor Stinnerf17c3de2016-12-06 18:46:19 +01003629 res = _PyObject_CallNoArg(enter);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003630 Py_DECREF(enter);
3631 if (res == NULL)
3632 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003633 /* Setup the finally block before pushing the result
3634 of __enter__ on the stack. */
3635 PyFrame_BlockSetup(f, SETUP_FINALLY, INSTR_OFFSET() + oparg,
3636 STACK_LEVEL());
Benjamin Peterson876b2f22009-06-28 03:18:59 +00003637
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003638 PUSH(res);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003639 DISPATCH();
3640 }
Benjamin Peterson876b2f22009-06-28 03:18:59 +00003641
Mark Shannonfee55262019-11-21 09:11:43 +00003642 case TARGET(WITH_EXCEPT_START): {
3643 /* At the top of the stack are 7 values:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003644 - (TOP, SECOND, THIRD) = exc_info()
Mark Shannonfee55262019-11-21 09:11:43 +00003645 - (FOURTH, FIFTH, SIXTH) = previous exception for EXCEPT_HANDLER
3646 - SEVENTH: the context.__exit__ bound method
3647 We call SEVENTH(TOP, SECOND, THIRD).
3648 Then we push again the TOP exception and the __exit__
3649 return value.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003650 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003651 PyObject *exit_func;
Victor Stinner842cfff2016-12-01 14:45:31 +01003652 PyObject *exc, *val, *tb, *res;
3653
Victor Stinner842cfff2016-12-01 14:45:31 +01003654 exc = TOP();
Mark Shannonfee55262019-11-21 09:11:43 +00003655 val = SECOND();
3656 tb = THIRD();
3657 assert(exc != Py_None);
3658 assert(!PyLong_Check(exc));
3659 exit_func = PEEK(7);
Jeroen Demeyer469d1a72019-07-03 12:52:21 +02003660 PyObject *stack[4] = {NULL, exc, val, tb};
Petr Viktorinffd97532020-02-11 17:46:57 +01003661 res = PyObject_Vectorcall(exit_func, stack + 1,
Jeroen Demeyer469d1a72019-07-03 12:52:21 +02003662 3 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003663 if (res == NULL)
3664 goto error;
Amaury Forgeot d'Arc10b24e82008-12-10 23:49:33 +00003665
Yury Selivanov75445082015-05-11 22:57:16 -04003666 PUSH(res);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003667 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003668 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00003669
Benjamin Petersonddd19492018-09-16 22:38:02 -07003670 case TARGET(LOAD_METHOD): {
Andreyb021ba52019-04-29 14:33:26 +10003671 /* Designed to work in tandem with CALL_METHOD. */
Yury Selivanovf2392132016-12-13 19:03:51 -05003672 PyObject *name = GETITEM(names, oparg);
3673 PyObject *obj = TOP();
3674 PyObject *meth = NULL;
3675
3676 int meth_found = _PyObject_GetMethod(obj, name, &meth);
3677
Yury Selivanovf2392132016-12-13 19:03:51 -05003678 if (meth == NULL) {
3679 /* Most likely attribute wasn't found. */
Yury Selivanovf2392132016-12-13 19:03:51 -05003680 goto error;
3681 }
3682
3683 if (meth_found) {
INADA Naoki015bce62017-01-16 17:23:30 +09003684 /* We can bypass temporary bound method object.
3685 meth is unbound method and obj is self.
Victor Stinnera8cb5152017-01-18 14:12:51 +01003686
INADA Naoki015bce62017-01-16 17:23:30 +09003687 meth | self | arg1 | ... | argN
3688 */
3689 SET_TOP(meth);
3690 PUSH(obj); // self
Yury Selivanovf2392132016-12-13 19:03:51 -05003691 }
3692 else {
INADA Naoki015bce62017-01-16 17:23:30 +09003693 /* meth is not an unbound method (but a regular attr, or
3694 something was returned by a descriptor protocol). Set
3695 the second element of the stack to NULL, to signal
Yury Selivanovf2392132016-12-13 19:03:51 -05003696 CALL_METHOD that it's not a method call.
INADA Naoki015bce62017-01-16 17:23:30 +09003697
3698 NULL | meth | arg1 | ... | argN
Yury Selivanovf2392132016-12-13 19:03:51 -05003699 */
INADA Naoki015bce62017-01-16 17:23:30 +09003700 SET_TOP(NULL);
Yury Selivanovf2392132016-12-13 19:03:51 -05003701 Py_DECREF(obj);
INADA Naoki015bce62017-01-16 17:23:30 +09003702 PUSH(meth);
Yury Selivanovf2392132016-12-13 19:03:51 -05003703 }
3704 DISPATCH();
3705 }
3706
Benjamin Petersonddd19492018-09-16 22:38:02 -07003707 case TARGET(CALL_METHOD): {
Yury Selivanovf2392132016-12-13 19:03:51 -05003708 /* Designed to work in tamdem with LOAD_METHOD. */
INADA Naoki015bce62017-01-16 17:23:30 +09003709 PyObject **sp, *res, *meth;
Yury Selivanovf2392132016-12-13 19:03:51 -05003710
3711 sp = stack_pointer;
3712
INADA Naoki015bce62017-01-16 17:23:30 +09003713 meth = PEEK(oparg + 2);
3714 if (meth == NULL) {
3715 /* `meth` is NULL when LOAD_METHOD thinks that it's not
3716 a method call.
Yury Selivanovf2392132016-12-13 19:03:51 -05003717
3718 Stack layout:
3719
INADA Naoki015bce62017-01-16 17:23:30 +09003720 ... | NULL | callable | arg1 | ... | argN
3721 ^- TOP()
3722 ^- (-oparg)
3723 ^- (-oparg-1)
3724 ^- (-oparg-2)
Yury Selivanovf2392132016-12-13 19:03:51 -05003725
Ville Skyttä49b27342017-08-03 09:00:59 +03003726 `callable` will be POPed by call_function.
INADA Naoki015bce62017-01-16 17:23:30 +09003727 NULL will will be POPed manually later.
Yury Selivanovf2392132016-12-13 19:03:51 -05003728 */
Victor Stinner09532fe2019-05-10 23:39:09 +02003729 res = call_function(tstate, &sp, oparg, NULL);
Yury Selivanovf2392132016-12-13 19:03:51 -05003730 stack_pointer = sp;
INADA Naoki015bce62017-01-16 17:23:30 +09003731 (void)POP(); /* POP the NULL. */
Yury Selivanovf2392132016-12-13 19:03:51 -05003732 }
3733 else {
3734 /* This is a method call. Stack layout:
3735
INADA Naoki015bce62017-01-16 17:23:30 +09003736 ... | method | self | arg1 | ... | argN
Yury Selivanovf2392132016-12-13 19:03:51 -05003737 ^- TOP()
3738 ^- (-oparg)
INADA Naoki015bce62017-01-16 17:23:30 +09003739 ^- (-oparg-1)
3740 ^- (-oparg-2)
Yury Selivanovf2392132016-12-13 19:03:51 -05003741
INADA Naoki015bce62017-01-16 17:23:30 +09003742 `self` and `method` will be POPed by call_function.
Yury Selivanovf2392132016-12-13 19:03:51 -05003743 We'll be passing `oparg + 1` to call_function, to
INADA Naoki015bce62017-01-16 17:23:30 +09003744 make it accept the `self` as a first argument.
Yury Selivanovf2392132016-12-13 19:03:51 -05003745 */
Victor Stinner09532fe2019-05-10 23:39:09 +02003746 res = call_function(tstate, &sp, oparg + 1, NULL);
Yury Selivanovf2392132016-12-13 19:03:51 -05003747 stack_pointer = sp;
3748 }
3749
3750 PUSH(res);
3751 if (res == NULL)
3752 goto error;
3753 DISPATCH();
3754 }
3755
Benjamin Petersonddd19492018-09-16 22:38:02 -07003756 case TARGET(CALL_FUNCTION): {
3757 PREDICTED(CALL_FUNCTION);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003758 PyObject **sp, *res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003759 sp = stack_pointer;
Victor Stinner09532fe2019-05-10 23:39:09 +02003760 res = call_function(tstate, &sp, oparg, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003761 stack_pointer = sp;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003762 PUSH(res);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003763 if (res == NULL) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003764 goto error;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003765 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003766 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003767 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003768
Benjamin Petersonddd19492018-09-16 22:38:02 -07003769 case TARGET(CALL_FUNCTION_KW): {
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003770 PyObject **sp, *res, *names;
3771
3772 names = POP();
Jeroen Demeyer05677862019-08-16 12:41:27 +02003773 assert(PyTuple_Check(names));
3774 assert(PyTuple_GET_SIZE(names) <= oparg);
3775 /* We assume without checking that names contains only strings */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003776 sp = stack_pointer;
Victor Stinner09532fe2019-05-10 23:39:09 +02003777 res = call_function(tstate, &sp, oparg, names);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003778 stack_pointer = sp;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003779 PUSH(res);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003780 Py_DECREF(names);
3781
3782 if (res == NULL) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003783 goto error;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003784 }
3785 DISPATCH();
3786 }
3787
Benjamin Petersonddd19492018-09-16 22:38:02 -07003788 case TARGET(CALL_FUNCTION_EX): {
Brandt Bucherf185a732019-09-28 17:12:49 -07003789 PREDICTED(CALL_FUNCTION_EX);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003790 PyObject *func, *callargs, *kwargs = NULL, *result;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003791 if (oparg & 0x01) {
3792 kwargs = POP();
Serhiy Storchakab7281052016-09-12 00:52:40 +03003793 if (!PyDict_CheckExact(kwargs)) {
3794 PyObject *d = PyDict_New();
3795 if (d == NULL)
3796 goto error;
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02003797 if (_PyDict_MergeEx(d, kwargs, 2) < 0) {
Serhiy Storchakab7281052016-09-12 00:52:40 +03003798 Py_DECREF(d);
Victor Stinner438a12d2019-05-24 17:01:38 +02003799 format_kwargs_error(tstate, SECOND(), kwargs);
Victor Stinnereece2222016-09-12 11:16:37 +02003800 Py_DECREF(kwargs);
Serhiy Storchakab7281052016-09-12 00:52:40 +03003801 goto error;
3802 }
3803 Py_DECREF(kwargs);
3804 kwargs = d;
3805 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003806 assert(PyDict_CheckExact(kwargs));
3807 }
3808 callargs = POP();
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003809 func = TOP();
Serhiy Storchaka63dc5482016-09-22 19:41:20 +03003810 if (!PyTuple_CheckExact(callargs)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003811 if (check_args_iterable(tstate, func, callargs) < 0) {
Victor Stinnereece2222016-09-12 11:16:37 +02003812 Py_DECREF(callargs);
Serhiy Storchakab7281052016-09-12 00:52:40 +03003813 goto error;
3814 }
3815 Py_SETREF(callargs, PySequence_Tuple(callargs));
3816 if (callargs == NULL) {
3817 goto error;
3818 }
3819 }
Serhiy Storchaka63dc5482016-09-22 19:41:20 +03003820 assert(PyTuple_CheckExact(callargs));
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003821
Victor Stinner09532fe2019-05-10 23:39:09 +02003822 result = do_call_core(tstate, func, callargs, kwargs);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003823 Py_DECREF(func);
3824 Py_DECREF(callargs);
3825 Py_XDECREF(kwargs);
3826
3827 SET_TOP(result);
3828 if (result == NULL) {
3829 goto error;
3830 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003831 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003832 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003833
Benjamin Petersonddd19492018-09-16 22:38:02 -07003834 case TARGET(MAKE_FUNCTION): {
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003835 PyObject *qualname = POP();
3836 PyObject *codeobj = POP();
3837 PyFunctionObject *func = (PyFunctionObject *)
3838 PyFunction_NewWithQualName(codeobj, f->f_globals, qualname);
Guido van Rossum4f72a782006-10-27 23:31:49 +00003839
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003840 Py_DECREF(codeobj);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003841 Py_DECREF(qualname);
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003842 if (func == NULL) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003843 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003844 }
Neal Norwitzc1505362006-12-28 06:47:50 +00003845
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003846 if (oparg & 0x08) {
3847 assert(PyTuple_CheckExact(TOP()));
3848 func ->func_closure = POP();
3849 }
3850 if (oparg & 0x04) {
3851 assert(PyDict_CheckExact(TOP()));
3852 func->func_annotations = POP();
3853 }
3854 if (oparg & 0x02) {
3855 assert(PyDict_CheckExact(TOP()));
3856 func->func_kwdefaults = POP();
3857 }
3858 if (oparg & 0x01) {
3859 assert(PyTuple_CheckExact(TOP()));
3860 func->func_defaults = POP();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003861 }
Neal Norwitzc1505362006-12-28 06:47:50 +00003862
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003863 PUSH((PyObject *)func);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003864 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003865 }
Guido van Rossum8861b741996-07-30 16:49:37 +00003866
Benjamin Petersonddd19492018-09-16 22:38:02 -07003867 case TARGET(BUILD_SLICE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003868 PyObject *start, *stop, *step, *slice;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003869 if (oparg == 3)
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003870 step = POP();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003871 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003872 step = NULL;
3873 stop = POP();
3874 start = TOP();
3875 slice = PySlice_New(start, stop, step);
3876 Py_DECREF(start);
3877 Py_DECREF(stop);
3878 Py_XDECREF(step);
3879 SET_TOP(slice);
3880 if (slice == NULL)
3881 goto error;
3882 DISPATCH();
3883 }
Guido van Rossum8861b741996-07-30 16:49:37 +00003884
Benjamin Petersonddd19492018-09-16 22:38:02 -07003885 case TARGET(FORMAT_VALUE): {
Eric V. Smitha78c7952015-11-03 12:45:05 -05003886 /* Handles f-string value formatting. */
3887 PyObject *result;
3888 PyObject *fmt_spec;
3889 PyObject *value;
3890 PyObject *(*conv_fn)(PyObject *);
3891 int which_conversion = oparg & FVC_MASK;
3892 int have_fmt_spec = (oparg & FVS_MASK) == FVS_HAVE_SPEC;
3893
3894 fmt_spec = have_fmt_spec ? POP() : NULL;
Eric V. Smith135d5f42016-02-05 18:23:08 -05003895 value = POP();
Eric V. Smitha78c7952015-11-03 12:45:05 -05003896
3897 /* See if any conversion is specified. */
3898 switch (which_conversion) {
Eric V. Smith9a4135e2019-05-08 16:28:48 -04003899 case FVC_NONE: conv_fn = NULL; break;
Eric V. Smitha78c7952015-11-03 12:45:05 -05003900 case FVC_STR: conv_fn = PyObject_Str; break;
3901 case FVC_REPR: conv_fn = PyObject_Repr; break;
3902 case FVC_ASCII: conv_fn = PyObject_ASCII; break;
Eric V. Smith9a4135e2019-05-08 16:28:48 -04003903 default:
Victor Stinner438a12d2019-05-24 17:01:38 +02003904 _PyErr_Format(tstate, PyExc_SystemError,
3905 "unexpected conversion flag %d",
3906 which_conversion);
Eric V. Smith9a4135e2019-05-08 16:28:48 -04003907 goto error;
Eric V. Smitha78c7952015-11-03 12:45:05 -05003908 }
3909
3910 /* If there's a conversion function, call it and replace
3911 value with that result. Otherwise, just use value,
3912 without conversion. */
Eric V. Smitheb588a12016-02-05 18:26:20 -05003913 if (conv_fn != NULL) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05003914 result = conv_fn(value);
3915 Py_DECREF(value);
Eric V. Smitheb588a12016-02-05 18:26:20 -05003916 if (result == NULL) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05003917 Py_XDECREF(fmt_spec);
3918 goto error;
3919 }
3920 value = result;
3921 }
3922
3923 /* If value is a unicode object, and there's no fmt_spec,
3924 then we know the result of format(value) is value
3925 itself. In that case, skip calling format(). I plan to
3926 move this optimization in to PyObject_Format()
3927 itself. */
3928 if (PyUnicode_CheckExact(value) && fmt_spec == NULL) {
3929 /* Do nothing, just transfer ownership to result. */
3930 result = value;
3931 } else {
3932 /* Actually call format(). */
3933 result = PyObject_Format(value, fmt_spec);
3934 Py_DECREF(value);
3935 Py_XDECREF(fmt_spec);
Eric V. Smitheb588a12016-02-05 18:26:20 -05003936 if (result == NULL) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05003937 goto error;
Eric V. Smitheb588a12016-02-05 18:26:20 -05003938 }
Eric V. Smitha78c7952015-11-03 12:45:05 -05003939 }
3940
Eric V. Smith135d5f42016-02-05 18:23:08 -05003941 PUSH(result);
Eric V. Smitha78c7952015-11-03 12:45:05 -05003942 DISPATCH();
3943 }
3944
Benjamin Petersonddd19492018-09-16 22:38:02 -07003945 case TARGET(EXTENDED_ARG): {
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03003946 int oldoparg = oparg;
3947 NEXTOPARG();
3948 oparg |= oldoparg << 8;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003949 goto dispatch_opcode;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003950 }
Guido van Rossum8861b741996-07-30 16:49:37 +00003951
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003952
Antoine Pitrou042b1282010-08-13 21:15:58 +00003953#if USE_COMPUTED_GOTOS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003954 _unknown_opcode:
Antoine Pitroub52ec782009-01-25 16:34:23 +00003955#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003956 default:
3957 fprintf(stderr,
3958 "XXX lineno: %d, opcode: %d\n",
3959 PyFrame_GetLineNumber(f),
3960 opcode);
Victor Stinner438a12d2019-05-24 17:01:38 +02003961 _PyErr_SetString(tstate, PyExc_SystemError, "unknown opcode");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003962 goto error;
Guido van Rossum04691fc1992-08-12 15:35:34 +00003963
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003964 } /* switch */
Guido van Rossum374a9221991-04-04 10:40:29 +00003965
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003966 /* This should never be reached. Every opcode should end with DISPATCH()
3967 or goto error. */
Barry Warsawb2e57942017-09-14 18:13:16 -07003968 Py_UNREACHABLE();
Guido van Rossumac7be682001-01-17 15:42:30 +00003969
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003970error:
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003971 /* Double-check exception status. */
Victor Stinner365b6932013-07-12 00:11:58 +02003972#ifdef NDEBUG
Victor Stinner438a12d2019-05-24 17:01:38 +02003973 if (!_PyErr_Occurred(tstate)) {
3974 _PyErr_SetString(tstate, PyExc_SystemError,
3975 "error return without exception set");
3976 }
Victor Stinner365b6932013-07-12 00:11:58 +02003977#else
Victor Stinner438a12d2019-05-24 17:01:38 +02003978 assert(_PyErr_Occurred(tstate));
Victor Stinner365b6932013-07-12 00:11:58 +02003979#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00003980
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003981 /* Log traceback info. */
3982 PyTraceBack_Here(f);
Guido van Rossumac7be682001-01-17 15:42:30 +00003983
Mark Shannoncb9879b2020-07-17 11:44:23 +01003984 if (tstate->c_tracefunc != NULL) {
3985 /* Make sure state is set to FRAME_EXECUTING for tracing */
3986 assert(f->f_state == FRAME_EXECUTING);
3987 f->f_state = FRAME_UNWINDING;
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003988 call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj,
3989 tstate, f);
Mark Shannoncb9879b2020-07-17 11:44:23 +01003990 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003991exception_unwind:
Mark Shannoncb9879b2020-07-17 11:44:23 +01003992 f->f_state = FRAME_UNWINDING;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003993 /* Unwind stacks if an exception occurred */
3994 while (f->f_iblock > 0) {
3995 /* Pop the current block. */
3996 PyTryBlock *b = &f->f_blockstack[--f->f_iblock];
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003997
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003998 if (b->b_type == EXCEPT_HANDLER) {
3999 UNWIND_EXCEPT_HANDLER(b);
4000 continue;
4001 }
4002 UNWIND_BLOCK(b);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004003 if (b->b_type == SETUP_FINALLY) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004004 PyObject *exc, *val, *tb;
4005 int handler = b->b_handler;
Mark Shannonae3087c2017-10-22 22:41:51 +01004006 _PyErr_StackItem *exc_info = tstate->exc_info;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004007 /* Beware, this invalidates all b->b_* fields */
4008 PyFrame_BlockSetup(f, EXCEPT_HANDLER, -1, STACK_LEVEL());
Mark Shannonae3087c2017-10-22 22:41:51 +01004009 PUSH(exc_info->exc_traceback);
4010 PUSH(exc_info->exc_value);
4011 if (exc_info->exc_type != NULL) {
4012 PUSH(exc_info->exc_type);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004013 }
4014 else {
4015 Py_INCREF(Py_None);
4016 PUSH(Py_None);
4017 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004018 _PyErr_Fetch(tstate, &exc, &val, &tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004019 /* Make the raw exception data
4020 available to the handler,
4021 so a program can emulate the
4022 Python main loop. */
Victor Stinner438a12d2019-05-24 17:01:38 +02004023 _PyErr_NormalizeException(tstate, &exc, &val, &tb);
Victor Stinner7eab0d02013-07-15 21:16:27 +02004024 if (tb != NULL)
4025 PyException_SetTraceback(val, tb);
4026 else
4027 PyException_SetTraceback(val, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004028 Py_INCREF(exc);
Mark Shannonae3087c2017-10-22 22:41:51 +01004029 exc_info->exc_type = exc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004030 Py_INCREF(val);
Mark Shannonae3087c2017-10-22 22:41:51 +01004031 exc_info->exc_value = val;
4032 exc_info->exc_traceback = tb;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004033 if (tb == NULL)
4034 tb = Py_None;
4035 Py_INCREF(tb);
4036 PUSH(tb);
4037 PUSH(val);
4038 PUSH(exc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004039 JUMPTO(handler);
Victor Stinnerdab84232020-03-17 18:56:44 +01004040 if (_Py_TracingPossible(ceval2)) {
Pablo Galindo4c53e632020-01-10 09:24:22 +00004041 int needs_new_execution_window = (f->f_lasti < instr_lb || f->f_lasti >= instr_ub);
4042 int needs_line_update = (f->f_lasti == instr_lb || f->f_lasti < instr_prev);
4043 /* Make sure that we trace line after exception if we are in a new execution
4044 * window or we don't need a line update and we are not in the first instruction
4045 * of the line. */
4046 if (needs_new_execution_window || (!needs_line_update && instr_lb > 0)) {
4047 instr_prev = INT_MAX;
4048 }
Mark Shannonfee55262019-11-21 09:11:43 +00004049 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004050 /* Resume normal execution */
Mark Shannoncb9879b2020-07-17 11:44:23 +01004051 f->f_state = FRAME_EXECUTING;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004052 goto main_loop;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004053 }
4054 } /* unwind stack */
Guido van Rossum374a9221991-04-04 10:40:29 +00004055
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004056 /* End the loop as we still have an error */
4057 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004058 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00004059
Pablo Galindof00828a2019-05-09 16:52:02 +01004060 assert(retval == NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02004061 assert(_PyErr_Occurred(tstate));
Pablo Galindof00828a2019-05-09 16:52:02 +01004062
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004063 /* Pop remaining stack entries. */
4064 while (!EMPTY()) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004065 PyObject *o = POP();
4066 Py_XDECREF(o);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004067 }
Mark Shannoncb9879b2020-07-17 11:44:23 +01004068 f->f_stackdepth = 0;
4069 f->f_state = FRAME_RAISED;
Mark Shannone7c9f4a2020-01-13 12:51:26 +00004070exiting:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004071 if (tstate->use_tracing) {
Benjamin Peterson51f46162013-01-23 08:38:47 -05004072 if (tstate->c_tracefunc) {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004073 if (call_trace_protected(tstate->c_tracefunc, tstate->c_traceobj,
4074 tstate, f, PyTrace_RETURN, retval)) {
4075 Py_CLEAR(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004076 }
4077 }
4078 if (tstate->c_profilefunc) {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004079 if (call_trace_protected(tstate->c_profilefunc, tstate->c_profileobj,
4080 tstate, f, PyTrace_RETURN, retval)) {
Serhiy Storchaka505ff752014-02-09 13:33:53 +02004081 Py_CLEAR(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004082 }
4083 }
4084 }
Guido van Rossuma4240131997-01-21 21:18:36 +00004085
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004086 /* pop frame */
Thomas Woutersce272b62007-09-19 21:19:28 +00004087exit_eval_frame:
Łukasz Langaa785c872016-09-09 17:37:37 -07004088 if (PyDTrace_FUNCTION_RETURN_ENABLED())
4089 dtrace_function_return(f);
Victor Stinnerbe434dc2019-11-05 00:51:22 +01004090 _Py_LeaveRecursiveCall(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004091 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00004092
Victor Stinner0b72b232020-03-12 23:18:39 +01004093 return _Py_CheckFunctionResult(tstate, NULL, retval, __func__);
Guido van Rossum374a9221991-04-04 10:40:29 +00004094}
4095
Benjamin Petersonb204a422011-06-05 22:04:07 -05004096static void
Victor Stinner438a12d2019-05-24 17:01:38 +02004097format_missing(PyThreadState *tstate, const char *kind,
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004098 PyCodeObject *co, PyObject *names, PyObject *qualname)
Benjamin Petersone109c702011-06-24 09:37:26 -05004099{
4100 int err;
4101 Py_ssize_t len = PyList_GET_SIZE(names);
4102 PyObject *name_str, *comma, *tail, *tmp;
4103
4104 assert(PyList_CheckExact(names));
4105 assert(len >= 1);
4106 /* Deal with the joys of natural language. */
4107 switch (len) {
4108 case 1:
4109 name_str = PyList_GET_ITEM(names, 0);
4110 Py_INCREF(name_str);
4111 break;
4112 case 2:
4113 name_str = PyUnicode_FromFormat("%U and %U",
4114 PyList_GET_ITEM(names, len - 2),
4115 PyList_GET_ITEM(names, len - 1));
4116 break;
4117 default:
4118 tail = PyUnicode_FromFormat(", %U, and %U",
4119 PyList_GET_ITEM(names, len - 2),
4120 PyList_GET_ITEM(names, len - 1));
Benjamin Petersond1ab6082012-06-01 11:18:22 -07004121 if (tail == NULL)
4122 return;
Benjamin Petersone109c702011-06-24 09:37:26 -05004123 /* Chop off the last two objects in the list. This shouldn't actually
4124 fail, but we can't be too careful. */
4125 err = PyList_SetSlice(names, len - 2, len, NULL);
4126 if (err == -1) {
4127 Py_DECREF(tail);
4128 return;
4129 }
4130 /* Stitch everything up into a nice comma-separated list. */
4131 comma = PyUnicode_FromString(", ");
4132 if (comma == NULL) {
4133 Py_DECREF(tail);
4134 return;
4135 }
4136 tmp = PyUnicode_Join(comma, names);
4137 Py_DECREF(comma);
4138 if (tmp == NULL) {
4139 Py_DECREF(tail);
4140 return;
4141 }
4142 name_str = PyUnicode_Concat(tmp, tail);
4143 Py_DECREF(tmp);
4144 Py_DECREF(tail);
4145 break;
4146 }
4147 if (name_str == NULL)
4148 return;
Victor Stinner438a12d2019-05-24 17:01:38 +02004149 _PyErr_Format(tstate, PyExc_TypeError,
4150 "%U() missing %i required %s argument%s: %U",
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004151 qualname,
Victor Stinner438a12d2019-05-24 17:01:38 +02004152 len,
4153 kind,
4154 len == 1 ? "" : "s",
4155 name_str);
Benjamin Petersone109c702011-06-24 09:37:26 -05004156 Py_DECREF(name_str);
4157}
4158
4159static void
Victor Stinner438a12d2019-05-24 17:01:38 +02004160missing_arguments(PyThreadState *tstate, PyCodeObject *co,
4161 Py_ssize_t missing, Py_ssize_t defcount,
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004162 PyObject **fastlocals, PyObject *qualname)
Benjamin Petersone109c702011-06-24 09:37:26 -05004163{
Victor Stinner74319ae2016-08-25 00:04:09 +02004164 Py_ssize_t i, j = 0;
4165 Py_ssize_t start, end;
4166 int positional = (defcount != -1);
Benjamin Petersone109c702011-06-24 09:37:26 -05004167 const char *kind = positional ? "positional" : "keyword-only";
4168 PyObject *missing_names;
4169
4170 /* Compute the names of the arguments that are missing. */
4171 missing_names = PyList_New(missing);
4172 if (missing_names == NULL)
4173 return;
4174 if (positional) {
4175 start = 0;
Pablo Galindocd74e662019-06-01 18:08:04 +01004176 end = co->co_argcount - defcount;
Benjamin Petersone109c702011-06-24 09:37:26 -05004177 }
4178 else {
Pablo Galindocd74e662019-06-01 18:08:04 +01004179 start = co->co_argcount;
Benjamin Petersone109c702011-06-24 09:37:26 -05004180 end = start + co->co_kwonlyargcount;
4181 }
4182 for (i = start; i < end; i++) {
4183 if (GETLOCAL(i) == NULL) {
4184 PyObject *raw = PyTuple_GET_ITEM(co->co_varnames, i);
4185 PyObject *name = PyObject_Repr(raw);
4186 if (name == NULL) {
4187 Py_DECREF(missing_names);
4188 return;
4189 }
4190 PyList_SET_ITEM(missing_names, j++, name);
4191 }
4192 }
4193 assert(j == missing);
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004194 format_missing(tstate, kind, co, missing_names, qualname);
Benjamin Petersone109c702011-06-24 09:37:26 -05004195 Py_DECREF(missing_names);
4196}
4197
4198static void
Victor Stinner438a12d2019-05-24 17:01:38 +02004199too_many_positional(PyThreadState *tstate, PyCodeObject *co,
4200 Py_ssize_t given, Py_ssize_t defcount,
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004201 PyObject **fastlocals, PyObject *qualname)
Benjamin Petersonb204a422011-06-05 22:04:07 -05004202{
4203 int plural;
Victor Stinner74319ae2016-08-25 00:04:09 +02004204 Py_ssize_t kwonly_given = 0;
4205 Py_ssize_t i;
Benjamin Petersonb204a422011-06-05 22:04:07 -05004206 PyObject *sig, *kwonly_sig;
Victor Stinner74319ae2016-08-25 00:04:09 +02004207 Py_ssize_t co_argcount = co->co_argcount;
Benjamin Petersonb204a422011-06-05 22:04:07 -05004208
Benjamin Petersone109c702011-06-24 09:37:26 -05004209 assert((co->co_flags & CO_VARARGS) == 0);
4210 /* Count missing keyword-only args. */
Pablo Galindocd74e662019-06-01 18:08:04 +01004211 for (i = co_argcount; i < co_argcount + co->co_kwonlyargcount; i++) {
Victor Stinner74319ae2016-08-25 00:04:09 +02004212 if (GETLOCAL(i) != NULL) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004213 kwonly_given++;
Victor Stinner74319ae2016-08-25 00:04:09 +02004214 }
4215 }
Benjamin Petersone109c702011-06-24 09:37:26 -05004216 if (defcount) {
Pablo Galindocd74e662019-06-01 18:08:04 +01004217 Py_ssize_t atleast = co_argcount - defcount;
Benjamin Petersonb204a422011-06-05 22:04:07 -05004218 plural = 1;
Pablo Galindocd74e662019-06-01 18:08:04 +01004219 sig = PyUnicode_FromFormat("from %zd to %zd", atleast, co_argcount);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004220 }
4221 else {
Pablo Galindocd74e662019-06-01 18:08:04 +01004222 plural = (co_argcount != 1);
4223 sig = PyUnicode_FromFormat("%zd", co_argcount);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004224 }
4225 if (sig == NULL)
4226 return;
4227 if (kwonly_given) {
Victor Stinner74319ae2016-08-25 00:04:09 +02004228 const char *format = " positional argument%s (and %zd keyword-only argument%s)";
4229 kwonly_sig = PyUnicode_FromFormat(format,
4230 given != 1 ? "s" : "",
4231 kwonly_given,
4232 kwonly_given != 1 ? "s" : "");
Benjamin Petersonb204a422011-06-05 22:04:07 -05004233 if (kwonly_sig == NULL) {
4234 Py_DECREF(sig);
4235 return;
4236 }
4237 }
4238 else {
4239 /* This will not fail. */
4240 kwonly_sig = PyUnicode_FromString("");
Benjamin Petersone109c702011-06-24 09:37:26 -05004241 assert(kwonly_sig != NULL);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004242 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004243 _PyErr_Format(tstate, PyExc_TypeError,
4244 "%U() takes %U positional argument%s but %zd%U %s given",
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004245 qualname,
Victor Stinner438a12d2019-05-24 17:01:38 +02004246 sig,
4247 plural ? "s" : "",
4248 given,
4249 kwonly_sig,
4250 given == 1 && !kwonly_given ? "was" : "were");
Benjamin Petersonb204a422011-06-05 22:04:07 -05004251 Py_DECREF(sig);
4252 Py_DECREF(kwonly_sig);
4253}
4254
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004255static int
Victor Stinner438a12d2019-05-24 17:01:38 +02004256positional_only_passed_as_keyword(PyThreadState *tstate, PyCodeObject *co,
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004257 Py_ssize_t kwcount, PyObject* const* kwnames,
4258 PyObject *qualname)
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004259{
4260 int posonly_conflicts = 0;
4261 PyObject* posonly_names = PyList_New(0);
4262
4263 for(int k=0; k < co->co_posonlyargcount; k++){
4264 PyObject* posonly_name = PyTuple_GET_ITEM(co->co_varnames, k);
4265
4266 for (int k2=0; k2<kwcount; k2++){
4267 /* Compare the pointers first and fallback to PyObject_RichCompareBool*/
4268 PyObject* kwname = kwnames[k2];
4269 if (kwname == posonly_name){
4270 if(PyList_Append(posonly_names, kwname) != 0) {
4271 goto fail;
4272 }
4273 posonly_conflicts++;
4274 continue;
4275 }
4276
4277 int cmp = PyObject_RichCompareBool(posonly_name, kwname, Py_EQ);
4278
4279 if ( cmp > 0) {
4280 if(PyList_Append(posonly_names, kwname) != 0) {
4281 goto fail;
4282 }
4283 posonly_conflicts++;
4284 } else if (cmp < 0) {
4285 goto fail;
4286 }
4287
4288 }
4289 }
4290 if (posonly_conflicts) {
4291 PyObject* comma = PyUnicode_FromString(", ");
4292 if (comma == NULL) {
4293 goto fail;
4294 }
4295 PyObject* error_names = PyUnicode_Join(comma, posonly_names);
4296 Py_DECREF(comma);
4297 if (error_names == NULL) {
4298 goto fail;
4299 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004300 _PyErr_Format(tstate, PyExc_TypeError,
4301 "%U() got some positional-only arguments passed"
4302 " as keyword arguments: '%U'",
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004303 qualname, error_names);
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004304 Py_DECREF(error_names);
4305 goto fail;
4306 }
4307
4308 Py_DECREF(posonly_names);
4309 return 0;
4310
4311fail:
4312 Py_XDECREF(posonly_names);
4313 return 1;
4314
4315}
4316
Guido van Rossumc2e20742006-02-27 22:32:47 +00004317/* This is gonna seem *real weird*, but if you put some other code between
Marcel Plch3a9ccee2018-04-06 23:22:04 +02004318 PyEval_EvalFrame() and _PyEval_EvalFrameDefault() you will need to adjust
Guido van Rossumc2e20742006-02-27 22:32:47 +00004319 the test in the if statements in Misc/gdbinit (pystack and pystackv). */
Skip Montanaro786ea6b2004-03-01 15:44:05 +00004320
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01004321PyObject *
Victor Stinnerb5e170f2019-11-16 01:03:22 +01004322_PyEval_EvalCode(PyThreadState *tstate,
4323 PyObject *_co, PyObject *globals, PyObject *locals,
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02004324 PyObject *const *args, Py_ssize_t argcount,
4325 PyObject *const *kwnames, PyObject *const *kwargs,
Serhiy Storchakab7281052016-09-12 00:52:40 +03004326 Py_ssize_t kwcount, int kwstep,
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02004327 PyObject *const *defs, Py_ssize_t defcount,
Victor Stinner74319ae2016-08-25 00:04:09 +02004328 PyObject *kwdefs, PyObject *closure,
Victor Stinner40ee3012014-06-16 15:59:28 +02004329 PyObject *name, PyObject *qualname)
Tim Peters5ca576e2001-06-18 22:08:13 +00004330{
Victor Stinnerda2914d2020-03-20 09:29:08 +01004331 assert(is_tstate_valid(tstate));
Victor Stinnerb5e170f2019-11-16 01:03:22 +01004332
Victor Stinner232dda62020-06-04 15:19:02 +02004333 PyCodeObject *co = (PyCodeObject*)_co;
4334
4335 if (!name) {
4336 name = co->co_name;
4337 }
4338 assert(name != NULL);
4339 assert(PyUnicode_Check(name));
4340
4341 if (!qualname) {
4342 qualname = name;
4343 }
4344 assert(qualname != NULL);
4345 assert(PyUnicode_Check(qualname));
4346
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02004347 PyObject *retval = NULL;
Pablo Galindocd74e662019-06-01 18:08:04 +01004348 const Py_ssize_t total_args = co->co_argcount + co->co_kwonlyargcount;
Tim Peters5ca576e2001-06-18 22:08:13 +00004349
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004350 if (globals == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004351 _PyErr_SetString(tstate, PyExc_SystemError,
4352 "PyEval_EvalCodeEx: NULL globals");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004353 return NULL;
4354 }
Tim Peters5ca576e2001-06-18 22:08:13 +00004355
Victor Stinnerc7020012016-08-16 23:40:29 +02004356 /* Create the frame */
Victor Stinner232dda62020-06-04 15:19:02 +02004357 PyFrameObject *f = _PyFrame_New_NoTrack(tstate, co, globals, locals);
Victor Stinnerc7020012016-08-16 23:40:29 +02004358 if (f == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004359 return NULL;
Victor Stinnerc7020012016-08-16 23:40:29 +02004360 }
Victor Stinner232dda62020-06-04 15:19:02 +02004361 PyObject **fastlocals = f->f_localsplus;
4362 PyObject **freevars = f->f_localsplus + co->co_nlocals;
Tim Peters5ca576e2001-06-18 22:08:13 +00004363
Victor Stinnerc7020012016-08-16 23:40:29 +02004364 /* Create a dictionary for keyword parameters (**kwags) */
Victor Stinner232dda62020-06-04 15:19:02 +02004365 PyObject *kwdict;
4366 Py_ssize_t i;
Benjamin Petersonb204a422011-06-05 22:04:07 -05004367 if (co->co_flags & CO_VARKEYWORDS) {
4368 kwdict = PyDict_New();
4369 if (kwdict == NULL)
4370 goto fail;
4371 i = total_args;
Victor Stinnerc7020012016-08-16 23:40:29 +02004372 if (co->co_flags & CO_VARARGS) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004373 i++;
Victor Stinnerc7020012016-08-16 23:40:29 +02004374 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004375 SETLOCAL(i, kwdict);
4376 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004377 else {
4378 kwdict = NULL;
4379 }
4380
Pablo Galindocd74e662019-06-01 18:08:04 +01004381 /* Copy all positional arguments into local variables */
Victor Stinner232dda62020-06-04 15:19:02 +02004382 Py_ssize_t j, n;
Pablo Galindocd74e662019-06-01 18:08:04 +01004383 if (argcount > co->co_argcount) {
4384 n = co->co_argcount;
Victor Stinnerc7020012016-08-16 23:40:29 +02004385 }
4386 else {
4387 n = argcount;
4388 }
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004389 for (j = 0; j < n; j++) {
Victor Stinner232dda62020-06-04 15:19:02 +02004390 PyObject *x = args[j];
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004391 Py_INCREF(x);
4392 SETLOCAL(j, x);
4393 }
4394
Victor Stinnerc7020012016-08-16 23:40:29 +02004395 /* Pack other positional arguments into the *args argument */
Benjamin Petersonb204a422011-06-05 22:04:07 -05004396 if (co->co_flags & CO_VARARGS) {
Victor Stinner232dda62020-06-04 15:19:02 +02004397 PyObject *u = _PyTuple_FromArray(args + n, argcount - n);
Victor Stinnerc7020012016-08-16 23:40:29 +02004398 if (u == NULL) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004399 goto fail;
Victor Stinnerc7020012016-08-16 23:40:29 +02004400 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004401 SETLOCAL(total_args, u);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004402 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004403
Serhiy Storchakab7281052016-09-12 00:52:40 +03004404 /* Handle keyword arguments passed as two strided arrays */
4405 kwcount *= kwstep;
4406 for (i = 0; i < kwcount; i += kwstep) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004407 PyObject **co_varnames;
Serhiy Storchakab7281052016-09-12 00:52:40 +03004408 PyObject *keyword = kwnames[i];
4409 PyObject *value = kwargs[i];
Victor Stinner17061a92016-08-16 23:39:42 +02004410 Py_ssize_t j;
Victor Stinnerc7020012016-08-16 23:40:29 +02004411
Benjamin Petersonb204a422011-06-05 22:04:07 -05004412 if (keyword == NULL || !PyUnicode_Check(keyword)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004413 _PyErr_Format(tstate, PyExc_TypeError,
4414 "%U() keywords must be strings",
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004415 qualname);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004416 goto fail;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004417 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004418
Benjamin Petersonb204a422011-06-05 22:04:07 -05004419 /* Speed hack: do raw pointer compares. As names are
4420 normally interned this should almost always hit. */
4421 co_varnames = ((PyTupleObject *)(co->co_varnames))->ob_item;
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004422 for (j = co->co_posonlyargcount; j < total_args; j++) {
Victor Stinner232dda62020-06-04 15:19:02 +02004423 PyObject *varname = co_varnames[j];
4424 if (varname == keyword) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004425 goto kw_found;
Victor Stinner6fea7f72016-08-22 23:17:30 +02004426 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004427 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004428
Benjamin Petersonb204a422011-06-05 22:04:07 -05004429 /* Slow fallback, just in case */
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004430 for (j = co->co_posonlyargcount; j < total_args; j++) {
Victor Stinner232dda62020-06-04 15:19:02 +02004431 PyObject *varname = co_varnames[j];
4432 int cmp = PyObject_RichCompareBool( keyword, varname, Py_EQ);
Victor Stinner6fea7f72016-08-22 23:17:30 +02004433 if (cmp > 0) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004434 goto kw_found;
Victor Stinner6fea7f72016-08-22 23:17:30 +02004435 }
4436 else if (cmp < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004437 goto fail;
Victor Stinner6fea7f72016-08-22 23:17:30 +02004438 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004439 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004440
Victor Stinner231d1f32017-01-11 02:12:06 +01004441 assert(j >= total_args);
4442 if (kwdict == NULL) {
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004443
Victor Stinner438a12d2019-05-24 17:01:38 +02004444 if (co->co_posonlyargcount
4445 && positional_only_passed_as_keyword(tstate, co,
Victor Stinner232dda62020-06-04 15:19:02 +02004446 kwcount, kwnames,
4447 qualname))
Victor Stinner438a12d2019-05-24 17:01:38 +02004448 {
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004449 goto fail;
4450 }
4451
Victor Stinner438a12d2019-05-24 17:01:38 +02004452 _PyErr_Format(tstate, PyExc_TypeError,
4453 "%U() got an unexpected keyword argument '%S'",
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004454 qualname, keyword);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004455 goto fail;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004456 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004457
Christian Heimes0bd447f2013-07-20 14:48:10 +02004458 if (PyDict_SetItem(kwdict, keyword, value) == -1) {
4459 goto fail;
4460 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004461 continue;
Victor Stinnerc7020012016-08-16 23:40:29 +02004462
Benjamin Petersonb204a422011-06-05 22:04:07 -05004463 kw_found:
4464 if (GETLOCAL(j) != NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004465 _PyErr_Format(tstate, PyExc_TypeError,
4466 "%U() got multiple values for argument '%S'",
Dennis Sweeneyb5cc2082020-05-22 16:40:17 -04004467 qualname, keyword);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004468 goto fail;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004469 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004470 Py_INCREF(value);
4471 SETLOCAL(j, value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004472 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004473
4474 /* Check the number of positional arguments */
Pablo Galindocd74e662019-06-01 18:08:04 +01004475 if ((argcount > co->co_argcount) && !(co->co_flags & CO_VARARGS)) {
Victor Stinner232dda62020-06-04 15:19:02 +02004476 too_many_positional(tstate, co, argcount, defcount, fastlocals,
4477 qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004478 goto fail;
4479 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004480
4481 /* Add missing positional arguments (copy default values from defs) */
Pablo Galindocd74e662019-06-01 18:08:04 +01004482 if (argcount < co->co_argcount) {
4483 Py_ssize_t m = co->co_argcount - defcount;
Victor Stinner17061a92016-08-16 23:39:42 +02004484 Py_ssize_t missing = 0;
4485 for (i = argcount; i < m; i++) {
4486 if (GETLOCAL(i) == NULL) {
Benjamin Petersone109c702011-06-24 09:37:26 -05004487 missing++;
Victor Stinner17061a92016-08-16 23:39:42 +02004488 }
4489 }
Benjamin Petersone109c702011-06-24 09:37:26 -05004490 if (missing) {
Victor Stinner232dda62020-06-04 15:19:02 +02004491 missing_arguments(tstate, co, missing, defcount, fastlocals,
4492 qualname);
Benjamin Petersone109c702011-06-24 09:37:26 -05004493 goto fail;
Benjamin Petersonb204a422011-06-05 22:04:07 -05004494 }
4495 if (n > m)
4496 i = n - m;
4497 else
4498 i = 0;
4499 for (; i < defcount; i++) {
4500 if (GETLOCAL(m+i) == NULL) {
4501 PyObject *def = defs[i];
4502 Py_INCREF(def);
4503 SETLOCAL(m+i, def);
4504 }
4505 }
4506 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004507
4508 /* Add missing keyword arguments (copy default values from kwdefs) */
Benjamin Petersonb204a422011-06-05 22:04:07 -05004509 if (co->co_kwonlyargcount > 0) {
Victor Stinner17061a92016-08-16 23:39:42 +02004510 Py_ssize_t missing = 0;
Pablo Galindocd74e662019-06-01 18:08:04 +01004511 for (i = co->co_argcount; i < total_args; i++) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004512 if (GETLOCAL(i) != NULL)
4513 continue;
Victor Stinner232dda62020-06-04 15:19:02 +02004514 PyObject *varname = PyTuple_GET_ITEM(co->co_varnames, i);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004515 if (kwdefs != NULL) {
Victor Stinner232dda62020-06-04 15:19:02 +02004516 PyObject *def = PyDict_GetItemWithError(kwdefs, varname);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004517 if (def) {
4518 Py_INCREF(def);
4519 SETLOCAL(i, def);
4520 continue;
4521 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004522 else if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02004523 goto fail;
4524 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004525 }
Benjamin Petersone109c702011-06-24 09:37:26 -05004526 missing++;
4527 }
4528 if (missing) {
Victor Stinner232dda62020-06-04 15:19:02 +02004529 missing_arguments(tstate, co, missing, -1, fastlocals,
4530 qualname);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004531 goto fail;
4532 }
4533 }
4534
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004535 /* Allocate and initialize storage for cell vars, and copy free
Benjamin Peterson90037602011-06-25 22:54:45 -05004536 vars into frame. */
4537 for (i = 0; i < PyTuple_GET_SIZE(co->co_cellvars); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004538 PyObject *c;
Serhiy Storchaka5bb8b912016-12-16 19:19:02 +02004539 Py_ssize_t arg;
Benjamin Peterson90037602011-06-25 22:54:45 -05004540 /* Possibly account for the cell variable being an argument. */
4541 if (co->co_cell2arg != NULL &&
Guido van Rossum6832c812013-05-10 08:47:42 -07004542 (arg = co->co_cell2arg[i]) != CO_CELL_NOT_AN_ARG) {
Benjamin Peterson90037602011-06-25 22:54:45 -05004543 c = PyCell_New(GETLOCAL(arg));
Benjamin Peterson159ae412013-05-12 18:16:06 -05004544 /* Clear the local copy. */
4545 SETLOCAL(arg, NULL);
Guido van Rossum6832c812013-05-10 08:47:42 -07004546 }
4547 else {
Benjamin Peterson90037602011-06-25 22:54:45 -05004548 c = PyCell_New(NULL);
Guido van Rossum6832c812013-05-10 08:47:42 -07004549 }
Benjamin Peterson159ae412013-05-12 18:16:06 -05004550 if (c == NULL)
4551 goto fail;
Benjamin Peterson90037602011-06-25 22:54:45 -05004552 SETLOCAL(co->co_nlocals + i, c);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004553 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004554
4555 /* Copy closure variables to free variables */
Benjamin Peterson90037602011-06-25 22:54:45 -05004556 for (i = 0; i < PyTuple_GET_SIZE(co->co_freevars); ++i) {
4557 PyObject *o = PyTuple_GET_ITEM(closure, i);
4558 Py_INCREF(o);
4559 freevars[PyTuple_GET_SIZE(co->co_cellvars) + i] = o;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004560 }
Tim Peters5ca576e2001-06-18 22:08:13 +00004561
Yury Selivanoveb636452016-09-08 22:01:51 -07004562 /* Handle generator/coroutine/asynchronous generator */
4563 if (co->co_flags & (CO_GENERATOR | CO_COROUTINE | CO_ASYNC_GENERATOR)) {
Yury Selivanov75445082015-05-11 22:57:16 -04004564 PyObject *gen;
Yury Selivanov5376ba92015-06-22 12:19:30 -04004565 int is_coro = co->co_flags & CO_COROUTINE;
Yury Selivanov94c22632015-06-04 10:16:51 -04004566
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004567 /* Don't need to keep the reference to f_back, it will be set
4568 * when the generator is resumed. */
Serhiy Storchaka505ff752014-02-09 13:33:53 +02004569 Py_CLEAR(f->f_back);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00004570
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004571 /* Create a new generator that owns the ready to run frame
4572 * and return that as the value. */
Yury Selivanov5376ba92015-06-22 12:19:30 -04004573 if (is_coro) {
4574 gen = PyCoro_New(f, name, qualname);
Yury Selivanoveb636452016-09-08 22:01:51 -07004575 } else if (co->co_flags & CO_ASYNC_GENERATOR) {
4576 gen = PyAsyncGen_New(f, name, qualname);
Yury Selivanov5376ba92015-06-22 12:19:30 -04004577 } else {
4578 gen = PyGen_NewWithQualName(f, name, qualname);
4579 }
INADA Naoki6a3cedf2016-12-26 18:01:46 +09004580 if (gen == NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04004581 return NULL;
INADA Naoki6a3cedf2016-12-26 18:01:46 +09004582 }
INADA Naoki9c157762016-12-26 18:52:46 +09004583
INADA Naoki6a3cedf2016-12-26 18:01:46 +09004584 _PyObject_GC_TRACK(f);
Yury Selivanov75445082015-05-11 22:57:16 -04004585
Yury Selivanov75445082015-05-11 22:57:16 -04004586 return gen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004587 }
Tim Peters5ca576e2001-06-18 22:08:13 +00004588
Victor Stinnerb9e68122019-11-14 12:20:46 +01004589 retval = _PyEval_EvalFrame(tstate, f, 0);
Tim Peters5ca576e2001-06-18 22:08:13 +00004590
Thomas Woutersce272b62007-09-19 21:19:28 +00004591fail: /* Jump here from prelude on failure */
Tim Peters5ca576e2001-06-18 22:08:13 +00004592
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004593 /* decref'ing the frame can cause __del__ methods to get invoked,
4594 which can call back into Python. While we're done with the
4595 current Python frame (f), the associated C stack is still in use,
4596 so recursion_depth must be boosted for the duration.
4597 */
INADA Naoki5a625d02016-12-24 20:19:08 +09004598 if (Py_REFCNT(f) > 1) {
4599 Py_DECREF(f);
4600 _PyObject_GC_TRACK(f);
4601 }
4602 else {
4603 ++tstate->recursion_depth;
4604 Py_DECREF(f);
4605 --tstate->recursion_depth;
4606 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004607 return retval;
Tim Peters5ca576e2001-06-18 22:08:13 +00004608}
4609
Victor Stinnerb5e170f2019-11-16 01:03:22 +01004610
4611PyObject *
4612_PyEval_EvalCodeWithName(PyObject *_co, PyObject *globals, PyObject *locals,
4613 PyObject *const *args, Py_ssize_t argcount,
4614 PyObject *const *kwnames, PyObject *const *kwargs,
4615 Py_ssize_t kwcount, int kwstep,
4616 PyObject *const *defs, Py_ssize_t defcount,
4617 PyObject *kwdefs, PyObject *closure,
4618 PyObject *name, PyObject *qualname)
4619{
4620 PyThreadState *tstate = _PyThreadState_GET();
4621 return _PyEval_EvalCode(tstate, _co, globals, locals,
4622 args, argcount,
4623 kwnames, kwargs,
4624 kwcount, kwstep,
4625 defs, defcount,
4626 kwdefs, closure,
4627 name, qualname);
4628}
4629
Victor Stinner40ee3012014-06-16 15:59:28 +02004630PyObject *
4631PyEval_EvalCodeEx(PyObject *_co, PyObject *globals, PyObject *locals,
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02004632 PyObject *const *args, int argcount,
4633 PyObject *const *kws, int kwcount,
4634 PyObject *const *defs, int defcount,
4635 PyObject *kwdefs, PyObject *closure)
Victor Stinner40ee3012014-06-16 15:59:28 +02004636{
4637 return _PyEval_EvalCodeWithName(_co, globals, locals,
Victor Stinner9be7e7b2016-08-19 16:11:43 +02004638 args, argcount,
Zackery Spytzc6ea8972017-07-31 08:24:37 -06004639 kws, kws != NULL ? kws + 1 : NULL,
4640 kwcount, 2,
Victor Stinner9be7e7b2016-08-19 16:11:43 +02004641 defs, defcount,
4642 kwdefs, closure,
Victor Stinner40ee3012014-06-16 15:59:28 +02004643 NULL, NULL);
4644}
Tim Peters5ca576e2001-06-18 22:08:13 +00004645
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004646static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02004647special_lookup(PyThreadState *tstate, PyObject *o, _Py_Identifier *id)
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004648{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004649 PyObject *res;
Benjamin Petersonce798522012-01-22 11:24:29 -05004650 res = _PyObject_LookupSpecial(o, id);
Victor Stinner438a12d2019-05-24 17:01:38 +02004651 if (res == NULL && !_PyErr_Occurred(tstate)) {
Victor Stinner4804b5b2020-05-12 01:43:38 +02004652 _PyErr_SetObject(tstate, PyExc_AttributeError, _PyUnicode_FromId(id));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004653 return NULL;
4654 }
4655 return res;
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004656}
4657
4658
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00004659/* Logic for the raise statement (too complicated for inlining).
4660 This *consumes* a reference count to each of its arguments. */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004661static int
Victor Stinner09532fe2019-05-10 23:39:09 +02004662do_raise(PyThreadState *tstate, PyObject *exc, PyObject *cause)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00004663{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004664 PyObject *type = NULL, *value = NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00004665
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004666 if (exc == NULL) {
4667 /* Reraise */
Mark Shannonae3087c2017-10-22 22:41:51 +01004668 _PyErr_StackItem *exc_info = _PyErr_GetTopmostException(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004669 PyObject *tb;
Mark Shannonae3087c2017-10-22 22:41:51 +01004670 type = exc_info->exc_type;
4671 value = exc_info->exc_value;
4672 tb = exc_info->exc_traceback;
Victor Stinnereec93312016-08-18 18:13:10 +02004673 if (type == Py_None || type == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004674 _PyErr_SetString(tstate, PyExc_RuntimeError,
4675 "No active exception to reraise");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004676 return 0;
4677 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004678 Py_XINCREF(type);
4679 Py_XINCREF(value);
4680 Py_XINCREF(tb);
Victor Stinner438a12d2019-05-24 17:01:38 +02004681 _PyErr_Restore(tstate, type, value, tb);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004682 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004683 }
Guido van Rossumac7be682001-01-17 15:42:30 +00004684
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004685 /* We support the following forms of raise:
4686 raise
Collin Winter828f04a2007-08-31 00:04:24 +00004687 raise <instance>
4688 raise <type> */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00004689
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004690 if (PyExceptionClass_Check(exc)) {
4691 type = exc;
Victor Stinnera5ed5f02016-12-06 18:45:50 +01004692 value = _PyObject_CallNoArg(exc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004693 if (value == NULL)
4694 goto raise_error;
Benjamin Peterson5afa03a2011-07-15 14:09:26 -05004695 if (!PyExceptionInstance_Check(value)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004696 _PyErr_Format(tstate, PyExc_TypeError,
4697 "calling %R should have returned an instance of "
4698 "BaseException, not %R",
4699 type, Py_TYPE(value));
4700 goto raise_error;
Benjamin Peterson5afa03a2011-07-15 14:09:26 -05004701 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004702 }
4703 else if (PyExceptionInstance_Check(exc)) {
4704 value = exc;
4705 type = PyExceptionInstance_Class(exc);
4706 Py_INCREF(type);
4707 }
4708 else {
4709 /* Not something you can raise. You get an exception
4710 anyway, just not what you specified :-) */
4711 Py_DECREF(exc);
Victor Stinner438a12d2019-05-24 17:01:38 +02004712 _PyErr_SetString(tstate, PyExc_TypeError,
4713 "exceptions must derive from BaseException");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004714 goto raise_error;
4715 }
Collin Winter828f04a2007-08-31 00:04:24 +00004716
Serhiy Storchakac0191582016-09-27 11:37:10 +03004717 assert(type != NULL);
4718 assert(value != NULL);
4719
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004720 if (cause) {
4721 PyObject *fixed_cause;
4722 if (PyExceptionClass_Check(cause)) {
Victor Stinnera5ed5f02016-12-06 18:45:50 +01004723 fixed_cause = _PyObject_CallNoArg(cause);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004724 if (fixed_cause == NULL)
4725 goto raise_error;
Benjamin Petersond5a1c442012-05-14 22:09:31 -07004726 Py_DECREF(cause);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004727 }
Benjamin Petersond5a1c442012-05-14 22:09:31 -07004728 else if (PyExceptionInstance_Check(cause)) {
4729 fixed_cause = cause;
4730 }
4731 else if (cause == Py_None) {
4732 Py_DECREF(cause);
4733 fixed_cause = NULL;
4734 }
4735 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02004736 _PyErr_SetString(tstate, PyExc_TypeError,
4737 "exception causes must derive from "
4738 "BaseException");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004739 goto raise_error;
4740 }
Benjamin Petersond5a1c442012-05-14 22:09:31 -07004741 PyException_SetCause(value, fixed_cause);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004742 }
Collin Winter828f04a2007-08-31 00:04:24 +00004743
Victor Stinner438a12d2019-05-24 17:01:38 +02004744 _PyErr_SetObject(tstate, type, value);
Victor Stinner61f4db82020-01-28 03:37:45 +01004745 /* _PyErr_SetObject incref's its arguments */
Serhiy Storchakac0191582016-09-27 11:37:10 +03004746 Py_DECREF(value);
4747 Py_DECREF(type);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004748 return 0;
Collin Winter828f04a2007-08-31 00:04:24 +00004749
4750raise_error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004751 Py_XDECREF(value);
4752 Py_XDECREF(type);
4753 Py_XDECREF(cause);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004754 return 0;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00004755}
4756
Tim Petersd6d010b2001-06-21 02:49:55 +00004757/* Iterate v argcnt times and store the results on the stack (via decreasing
Guido van Rossum0368b722007-05-11 16:50:42 +00004758 sp). Return 1 for success, 0 if error.
Antoine Pitrou9a2310d2008-07-25 22:39:39 +00004759
Guido van Rossum0368b722007-05-11 16:50:42 +00004760 If argcntafter == -1, do a simple unpack. If it is >= 0, do an unpack
4761 with a variable target.
4762*/
Tim Petersd6d010b2001-06-21 02:49:55 +00004763
Barry Warsawe42b18f1997-08-25 22:13:04 +00004764static int
Victor Stinner438a12d2019-05-24 17:01:38 +02004765unpack_iterable(PyThreadState *tstate, PyObject *v,
4766 int argcnt, int argcntafter, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00004767{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004768 int i = 0, j = 0;
4769 Py_ssize_t ll = 0;
4770 PyObject *it; /* iter(v) */
4771 PyObject *w;
4772 PyObject *l = NULL; /* variable list */
Guido van Rossumac7be682001-01-17 15:42:30 +00004773
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004774 assert(v != NULL);
Tim Petersd6d010b2001-06-21 02:49:55 +00004775
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004776 it = PyObject_GetIter(v);
Serhiy Storchaka13a6c092017-12-26 12:30:41 +02004777 if (it == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004778 if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError) &&
Victor Stinnera102ed72020-02-07 02:24:48 +01004779 Py_TYPE(v)->tp_iter == NULL && !PySequence_Check(v))
Serhiy Storchaka13a6c092017-12-26 12:30:41 +02004780 {
Victor Stinner438a12d2019-05-24 17:01:38 +02004781 _PyErr_Format(tstate, PyExc_TypeError,
4782 "cannot unpack non-iterable %.200s object",
Victor Stinnera102ed72020-02-07 02:24:48 +01004783 Py_TYPE(v)->tp_name);
Serhiy Storchaka13a6c092017-12-26 12:30:41 +02004784 }
4785 return 0;
4786 }
Tim Petersd6d010b2001-06-21 02:49:55 +00004787
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004788 for (; i < argcnt; i++) {
4789 w = PyIter_Next(it);
4790 if (w == NULL) {
4791 /* Iterator done, via error or exhaustion. */
Victor Stinner438a12d2019-05-24 17:01:38 +02004792 if (!_PyErr_Occurred(tstate)) {
R David Murray4171bbe2015-04-15 17:08:45 -04004793 if (argcntafter == -1) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004794 _PyErr_Format(tstate, PyExc_ValueError,
4795 "not enough values to unpack "
4796 "(expected %d, got %d)",
4797 argcnt, i);
R David Murray4171bbe2015-04-15 17:08:45 -04004798 }
4799 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02004800 _PyErr_Format(tstate, PyExc_ValueError,
4801 "not enough values to unpack "
4802 "(expected at least %d, got %d)",
4803 argcnt + argcntafter, i);
R David Murray4171bbe2015-04-15 17:08:45 -04004804 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004805 }
4806 goto Error;
4807 }
4808 *--sp = w;
4809 }
Tim Petersd6d010b2001-06-21 02:49:55 +00004810
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004811 if (argcntafter == -1) {
4812 /* We better have exhausted the iterator now. */
4813 w = PyIter_Next(it);
4814 if (w == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004815 if (_PyErr_Occurred(tstate))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004816 goto Error;
4817 Py_DECREF(it);
4818 return 1;
4819 }
4820 Py_DECREF(w);
Victor Stinner438a12d2019-05-24 17:01:38 +02004821 _PyErr_Format(tstate, PyExc_ValueError,
4822 "too many values to unpack (expected %d)",
4823 argcnt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004824 goto Error;
4825 }
Guido van Rossum0368b722007-05-11 16:50:42 +00004826
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004827 l = PySequence_List(it);
4828 if (l == NULL)
4829 goto Error;
4830 *--sp = l;
4831 i++;
Guido van Rossum0368b722007-05-11 16:50:42 +00004832
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004833 ll = PyList_GET_SIZE(l);
4834 if (ll < argcntafter) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004835 _PyErr_Format(tstate, PyExc_ValueError,
R David Murray4171bbe2015-04-15 17:08:45 -04004836 "not enough values to unpack (expected at least %d, got %zd)",
4837 argcnt + argcntafter, argcnt + ll);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004838 goto Error;
4839 }
Guido van Rossum0368b722007-05-11 16:50:42 +00004840
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004841 /* Pop the "after-variable" args off the list. */
4842 for (j = argcntafter; j > 0; j--, i++) {
4843 *--sp = PyList_GET_ITEM(l, ll - j);
4844 }
4845 /* Resize the list. */
Victor Stinner60ac6ed2020-02-07 23:18:08 +01004846 Py_SET_SIZE(l, ll - argcntafter);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004847 Py_DECREF(it);
4848 return 1;
Guido van Rossum0368b722007-05-11 16:50:42 +00004849
Tim Petersd6d010b2001-06-21 02:49:55 +00004850Error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004851 for (; i > 0; i--, sp++)
4852 Py_DECREF(*sp);
4853 Py_XDECREF(it);
4854 return 0;
Barry Warsawe42b18f1997-08-25 22:13:04 +00004855}
4856
4857
Guido van Rossum96a42c81992-01-12 02:29:51 +00004858#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00004859static int
Victor Stinner438a12d2019-05-24 17:01:38 +02004860prtrace(PyThreadState *tstate, PyObject *v, const char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004861{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004862 printf("%s ", str);
Victor Stinner438a12d2019-05-24 17:01:38 +02004863 if (PyObject_Print(v, stdout, 0) != 0) {
4864 /* Don't know what else to do */
4865 _PyErr_Clear(tstate);
4866 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004867 printf("\n");
4868 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004869}
Guido van Rossum3f5da241990-12-20 15:06:42 +00004870#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004871
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00004872static void
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004873call_exc_trace(Py_tracefunc func, PyObject *self,
4874 PyThreadState *tstate, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00004875{
Victor Stinneraaa8ed82013-07-10 13:57:55 +02004876 PyObject *type, *value, *traceback, *orig_traceback, *arg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004877 int err;
Victor Stinner438a12d2019-05-24 17:01:38 +02004878 _PyErr_Fetch(tstate, &type, &value, &orig_traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004879 if (value == NULL) {
4880 value = Py_None;
4881 Py_INCREF(value);
4882 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004883 _PyErr_NormalizeException(tstate, &type, &value, &orig_traceback);
Antoine Pitrou89335212013-11-23 14:05:23 +01004884 traceback = (orig_traceback != NULL) ? orig_traceback : Py_None;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004885 arg = PyTuple_Pack(3, type, value, traceback);
4886 if (arg == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004887 _PyErr_Restore(tstate, type, value, orig_traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004888 return;
4889 }
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004890 err = call_trace(func, self, tstate, f, PyTrace_EXCEPTION, arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004891 Py_DECREF(arg);
Victor Stinner438a12d2019-05-24 17:01:38 +02004892 if (err == 0) {
4893 _PyErr_Restore(tstate, type, value, orig_traceback);
4894 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004895 else {
4896 Py_XDECREF(type);
4897 Py_XDECREF(value);
Victor Stinneraaa8ed82013-07-10 13:57:55 +02004898 Py_XDECREF(orig_traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004899 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00004900}
4901
Amaury Forgeot d'Arcf05149a2007-11-13 01:05:30 +00004902static int
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004903call_trace_protected(Py_tracefunc func, PyObject *obj,
4904 PyThreadState *tstate, PyFrameObject *frame,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004905 int what, PyObject *arg)
Fred Drake4ec5d562001-10-04 19:26:43 +00004906{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004907 PyObject *type, *value, *traceback;
4908 int err;
Victor Stinner438a12d2019-05-24 17:01:38 +02004909 _PyErr_Fetch(tstate, &type, &value, &traceback);
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004910 err = call_trace(func, obj, tstate, frame, what, arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004911 if (err == 0)
4912 {
Victor Stinner438a12d2019-05-24 17:01:38 +02004913 _PyErr_Restore(tstate, type, value, traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004914 return 0;
4915 }
4916 else {
4917 Py_XDECREF(type);
4918 Py_XDECREF(value);
4919 Py_XDECREF(traceback);
4920 return -1;
4921 }
Fred Drake4ec5d562001-10-04 19:26:43 +00004922}
4923
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00004924static int
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004925call_trace(Py_tracefunc func, PyObject *obj,
4926 PyThreadState *tstate, PyFrameObject *frame,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004927 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00004928{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004929 int result;
4930 if (tstate->tracing)
4931 return 0;
4932 tstate->tracing++;
4933 tstate->use_tracing = 0;
4934 result = func(obj, frame, what, arg);
4935 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
4936 || (tstate->c_profilefunc != NULL));
4937 tstate->tracing--;
4938 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00004939}
4940
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00004941PyObject *
4942_PyEval_CallTracing(PyObject *func, PyObject *args)
4943{
Victor Stinner50b48572018-11-01 01:51:40 +01004944 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004945 int save_tracing = tstate->tracing;
4946 int save_use_tracing = tstate->use_tracing;
4947 PyObject *result;
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00004948
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004949 tstate->tracing = 0;
4950 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
4951 || (tstate->c_profilefunc != NULL));
4952 result = PyObject_Call(func, args, NULL);
4953 tstate->tracing = save_tracing;
4954 tstate->use_tracing = save_use_tracing;
4955 return result;
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00004956}
4957
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00004958/* See Objects/lnotab_notes.txt for a description of how tracing works. */
Michael W. Hudson006c7522002-11-08 13:08:46 +00004959static int
Tim Peters8a5c3c72004-04-05 19:36:21 +00004960maybe_call_line_trace(Py_tracefunc func, PyObject *obj,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004961 PyThreadState *tstate, PyFrameObject *frame,
4962 int *instr_lb, int *instr_ub, int *instr_prev)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004963{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004964 int result = 0;
4965 int line = frame->f_lineno;
Michael W. Hudson006c7522002-11-08 13:08:46 +00004966
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004967 /* If the last instruction executed isn't in the current
4968 instruction window, reset the window.
4969 */
4970 if (frame->f_lasti < *instr_lb || frame->f_lasti >= *instr_ub) {
4971 PyAddrPair bounds;
4972 line = _PyCode_CheckLineNumber(frame->f_code, frame->f_lasti,
4973 &bounds);
4974 *instr_lb = bounds.ap_lower;
4975 *instr_ub = bounds.ap_upper;
4976 }
Nick Coghlan5a851672017-09-08 10:14:16 +10004977 /* If the last instruction falls at the start of a line or if it
4978 represents a jump backwards, update the frame's line number and
4979 then call the trace function if we're tracing source lines.
4980 */
4981 if ((frame->f_lasti == *instr_lb || frame->f_lasti < *instr_prev)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004982 frame->f_lineno = line;
Nick Coghlan5a851672017-09-08 10:14:16 +10004983 if (frame->f_trace_lines) {
4984 result = call_trace(func, obj, tstate, frame, PyTrace_LINE, Py_None);
4985 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004986 }
George King20faa682017-10-18 17:44:22 -07004987 /* Always emit an opcode event if we're tracing all opcodes. */
4988 if (frame->f_trace_opcodes) {
4989 result = call_trace(func, obj, tstate, frame, PyTrace_OPCODE, Py_None);
4990 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004991 *instr_prev = frame->f_lasti;
4992 return result;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004993}
4994
Victor Stinner309d7cc2020-03-13 16:39:12 +01004995int
4996_PyEval_SetProfile(PyThreadState *tstate, Py_tracefunc func, PyObject *arg)
4997{
Victor Stinnerda2914d2020-03-20 09:29:08 +01004998 assert(is_tstate_valid(tstate));
Victor Stinner309d7cc2020-03-13 16:39:12 +01004999 /* The caller must hold the GIL */
5000 assert(PyGILState_Check());
5001
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005002 /* Call _PySys_Audit() in the context of the current thread state,
Victor Stinner309d7cc2020-03-13 16:39:12 +01005003 even if tstate is not the current thread state. */
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005004 PyThreadState *current_tstate = _PyThreadState_GET();
5005 if (_PySys_Audit(current_tstate, "sys.setprofile", NULL) < 0) {
Victor Stinner309d7cc2020-03-13 16:39:12 +01005006 return -1;
5007 }
5008
5009 PyObject *profileobj = tstate->c_profileobj;
5010
5011 tstate->c_profilefunc = NULL;
5012 tstate->c_profileobj = NULL;
5013 /* Must make sure that tracing is not ignored if 'profileobj' is freed */
5014 tstate->use_tracing = tstate->c_tracefunc != NULL;
5015 Py_XDECREF(profileobj);
5016
5017 Py_XINCREF(arg);
5018 tstate->c_profileobj = arg;
5019 tstate->c_profilefunc = func;
5020
5021 /* Flag that tracing or profiling is turned on */
5022 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
5023 return 0;
5024}
5025
Fred Drake5755ce62001-06-27 19:19:46 +00005026void
5027PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00005028{
Victor Stinner309d7cc2020-03-13 16:39:12 +01005029 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerf6a58502020-03-16 17:41:44 +01005030 if (_PyEval_SetProfile(tstate, func, arg) < 0) {
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005031 /* Log _PySys_Audit() error */
Victor Stinnerf6a58502020-03-16 17:41:44 +01005032 _PyErr_WriteUnraisableMsg("in PyEval_SetProfile", NULL);
5033 }
Victor Stinner309d7cc2020-03-13 16:39:12 +01005034}
5035
5036int
5037_PyEval_SetTrace(PyThreadState *tstate, Py_tracefunc func, PyObject *arg)
5038{
Victor Stinnerda2914d2020-03-20 09:29:08 +01005039 assert(is_tstate_valid(tstate));
Victor Stinner309d7cc2020-03-13 16:39:12 +01005040 /* The caller must hold the GIL */
5041 assert(PyGILState_Check());
5042
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005043 /* Call _PySys_Audit() in the context of the current thread state,
Victor Stinner309d7cc2020-03-13 16:39:12 +01005044 even if tstate is not the current thread state. */
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005045 PyThreadState *current_tstate = _PyThreadState_GET();
5046 if (_PySys_Audit(current_tstate, "sys.settrace", NULL) < 0) {
Victor Stinner309d7cc2020-03-13 16:39:12 +01005047 return -1;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005048 }
5049
Victor Stinnerda2914d2020-03-20 09:29:08 +01005050 struct _ceval_state *ceval2 = &tstate->interp->ceval;
Victor Stinner309d7cc2020-03-13 16:39:12 +01005051 PyObject *traceobj = tstate->c_traceobj;
Victor Stinnerda2914d2020-03-20 09:29:08 +01005052 ceval2->tracing_possible += (func != NULL) - (tstate->c_tracefunc != NULL);
Victor Stinner309d7cc2020-03-13 16:39:12 +01005053
5054 tstate->c_tracefunc = NULL;
5055 tstate->c_traceobj = NULL;
5056 /* Must make sure that profiling is not ignored if 'traceobj' is freed */
5057 tstate->use_tracing = (tstate->c_profilefunc != NULL);
5058 Py_XDECREF(traceobj);
5059
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005060 Py_XINCREF(arg);
Victor Stinner309d7cc2020-03-13 16:39:12 +01005061 tstate->c_traceobj = arg;
5062 tstate->c_tracefunc = func;
5063
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005064 /* Flag that tracing or profiling is turned on */
Victor Stinner309d7cc2020-03-13 16:39:12 +01005065 tstate->use_tracing = ((func != NULL)
5066 || (tstate->c_profilefunc != NULL));
5067
5068 return 0;
Fred Drake5755ce62001-06-27 19:19:46 +00005069}
5070
5071void
5072PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
5073{
Victor Stinner309d7cc2020-03-13 16:39:12 +01005074 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerf6a58502020-03-16 17:41:44 +01005075 if (_PyEval_SetTrace(tstate, func, arg) < 0) {
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005076 /* Log _PySys_Audit() error */
Victor Stinnerf6a58502020-03-16 17:41:44 +01005077 _PyErr_WriteUnraisableMsg("in PyEval_SetTrace", NULL);
5078 }
Fred Draked0838392001-06-16 21:02:31 +00005079}
5080
Victor Stinner309d7cc2020-03-13 16:39:12 +01005081
Yury Selivanov75445082015-05-11 22:57:16 -04005082void
Victor Stinner838f2642019-06-13 22:41:23 +02005083_PyEval_SetCoroutineOriginTrackingDepth(PyThreadState *tstate, int new_depth)
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08005084{
5085 assert(new_depth >= 0);
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08005086 tstate->coroutine_origin_tracking_depth = new_depth;
5087}
5088
5089int
5090_PyEval_GetCoroutineOriginTrackingDepth(void)
5091{
Victor Stinner50b48572018-11-01 01:51:40 +01005092 PyThreadState *tstate = _PyThreadState_GET();
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08005093 return tstate->coroutine_origin_tracking_depth;
5094}
5095
Zackery Spytz79ceccd2020-03-26 06:11:13 -06005096int
Yury Selivanoveb636452016-09-08 22:01:51 -07005097_PyEval_SetAsyncGenFirstiter(PyObject *firstiter)
5098{
Victor Stinner50b48572018-11-01 01:51:40 +01005099 PyThreadState *tstate = _PyThreadState_GET();
Steve Dowerb82e17e2019-05-23 08:45:22 -07005100
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005101 if (_PySys_Audit(tstate, "sys.set_asyncgen_hook_firstiter", NULL) < 0) {
Zackery Spytz79ceccd2020-03-26 06:11:13 -06005102 return -1;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005103 }
5104
Yury Selivanoveb636452016-09-08 22:01:51 -07005105 Py_XINCREF(firstiter);
5106 Py_XSETREF(tstate->async_gen_firstiter, firstiter);
Zackery Spytz79ceccd2020-03-26 06:11:13 -06005107 return 0;
Yury Selivanoveb636452016-09-08 22:01:51 -07005108}
5109
5110PyObject *
5111_PyEval_GetAsyncGenFirstiter(void)
5112{
Victor Stinner50b48572018-11-01 01:51:40 +01005113 PyThreadState *tstate = _PyThreadState_GET();
Yury Selivanoveb636452016-09-08 22:01:51 -07005114 return tstate->async_gen_firstiter;
5115}
5116
Zackery Spytz79ceccd2020-03-26 06:11:13 -06005117int
Yury Selivanoveb636452016-09-08 22:01:51 -07005118_PyEval_SetAsyncGenFinalizer(PyObject *finalizer)
5119{
Victor Stinner50b48572018-11-01 01:51:40 +01005120 PyThreadState *tstate = _PyThreadState_GET();
Steve Dowerb82e17e2019-05-23 08:45:22 -07005121
Victor Stinner1c1e68c2020-03-27 15:11:45 +01005122 if (_PySys_Audit(tstate, "sys.set_asyncgen_hook_finalizer", NULL) < 0) {
Zackery Spytz79ceccd2020-03-26 06:11:13 -06005123 return -1;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005124 }
5125
Yury Selivanoveb636452016-09-08 22:01:51 -07005126 Py_XINCREF(finalizer);
5127 Py_XSETREF(tstate->async_gen_finalizer, finalizer);
Zackery Spytz79ceccd2020-03-26 06:11:13 -06005128 return 0;
Yury Selivanoveb636452016-09-08 22:01:51 -07005129}
5130
5131PyObject *
5132_PyEval_GetAsyncGenFinalizer(void)
5133{
Victor Stinner50b48572018-11-01 01:51:40 +01005134 PyThreadState *tstate = _PyThreadState_GET();
Yury Selivanoveb636452016-09-08 22:01:51 -07005135 return tstate->async_gen_finalizer;
5136}
5137
Victor Stinner438a12d2019-05-24 17:01:38 +02005138PyFrameObject *
5139PyEval_GetFrame(void)
5140{
5141 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner6723e932020-03-20 17:46:56 +01005142 return tstate->frame;
Victor Stinner438a12d2019-05-24 17:01:38 +02005143}
5144
Guido van Rossumb209a111997-04-29 18:18:01 +00005145PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005146PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00005147{
Victor Stinner438a12d2019-05-24 17:01:38 +02005148 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner6723e932020-03-20 17:46:56 +01005149 PyFrameObject *current_frame = tstate->frame;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005150 if (current_frame == NULL)
Victor Stinner438a12d2019-05-24 17:01:38 +02005151 return tstate->interp->builtins;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005152 else
5153 return current_frame->f_builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00005154}
5155
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02005156/* Convenience function to get a builtin from its name */
5157PyObject *
5158_PyEval_GetBuiltinId(_Py_Identifier *name)
5159{
Victor Stinner438a12d2019-05-24 17:01:38 +02005160 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02005161 PyObject *attr = _PyDict_GetItemIdWithError(PyEval_GetBuiltins(), name);
5162 if (attr) {
5163 Py_INCREF(attr);
5164 }
Victor Stinner438a12d2019-05-24 17:01:38 +02005165 else if (!_PyErr_Occurred(tstate)) {
5166 _PyErr_SetObject(tstate, PyExc_AttributeError, _PyUnicode_FromId(name));
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02005167 }
5168 return attr;
5169}
5170
Guido van Rossumb209a111997-04-29 18:18:01 +00005171PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005172PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00005173{
Victor Stinner438a12d2019-05-24 17:01:38 +02005174 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner6723e932020-03-20 17:46:56 +01005175 PyFrameObject *current_frame = tstate->frame;
Victor Stinner41bb43a2013-10-29 01:19:37 +01005176 if (current_frame == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005177 _PyErr_SetString(tstate, PyExc_SystemError, "frame does not exist");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005178 return NULL;
Victor Stinner41bb43a2013-10-29 01:19:37 +01005179 }
5180
Victor Stinner438a12d2019-05-24 17:01:38 +02005181 if (PyFrame_FastToLocalsWithError(current_frame) < 0) {
Victor Stinner41bb43a2013-10-29 01:19:37 +01005182 return NULL;
Victor Stinner438a12d2019-05-24 17:01:38 +02005183 }
Victor Stinner41bb43a2013-10-29 01:19:37 +01005184
5185 assert(current_frame->f_locals != NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005186 return current_frame->f_locals;
Guido van Rossum5b722181993-03-30 17:46:03 +00005187}
5188
Guido van Rossumb209a111997-04-29 18:18:01 +00005189PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005190PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00005191{
Victor Stinner438a12d2019-05-24 17:01:38 +02005192 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner6723e932020-03-20 17:46:56 +01005193 PyFrameObject *current_frame = tstate->frame;
Victor Stinner438a12d2019-05-24 17:01:38 +02005194 if (current_frame == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005195 return NULL;
Victor Stinner438a12d2019-05-24 17:01:38 +02005196 }
Victor Stinner41bb43a2013-10-29 01:19:37 +01005197
5198 assert(current_frame->f_globals != NULL);
5199 return current_frame->f_globals;
Guido van Rossum3f5da241990-12-20 15:06:42 +00005200}
5201
Guido van Rossum6135a871995-01-09 17:53:26 +00005202int
Tim Peters5ba58662001-07-16 02:29:45 +00005203PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
Jeremy Hylton061d1062001-03-22 02:32:48 +00005204{
Victor Stinner438a12d2019-05-24 17:01:38 +02005205 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner6723e932020-03-20 17:46:56 +01005206 PyFrameObject *current_frame = tstate->frame;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005207 int result = cf->cf_flags != 0;
Tim Peters5ba58662001-07-16 02:29:45 +00005208
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005209 if (current_frame != NULL) {
5210 const int codeflags = current_frame->f_code->co_flags;
5211 const int compilerflags = codeflags & PyCF_MASK;
5212 if (compilerflags) {
5213 result = 1;
5214 cf->cf_flags |= compilerflags;
5215 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00005216#if 0 /* future keyword */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005217 if (codeflags & CO_GENERATOR_ALLOWED) {
5218 result = 1;
5219 cf->cf_flags |= CO_GENERATOR_ALLOWED;
5220 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00005221#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005222 }
5223 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00005224}
5225
Guido van Rossum3f5da241990-12-20 15:06:42 +00005226
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00005227const char *
Tim Peters6d6c1a32001-08-02 04:15:00 +00005228PyEval_GetFuncName(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00005229{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005230 if (PyMethod_Check(func))
5231 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
5232 else if (PyFunction_Check(func))
Serhiy Storchaka06515832016-11-20 09:13:07 +02005233 return PyUnicode_AsUTF8(((PyFunctionObject*)func)->func_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005234 else if (PyCFunction_Check(func))
5235 return ((PyCFunctionObject*)func)->m_ml->ml_name;
5236 else
Victor Stinnera102ed72020-02-07 02:24:48 +01005237 return Py_TYPE(func)->tp_name;
Jeremy Hylton512a2372001-04-11 13:52:29 +00005238}
5239
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00005240const char *
Tim Peters6d6c1a32001-08-02 04:15:00 +00005241PyEval_GetFuncDesc(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00005242{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005243 if (PyMethod_Check(func))
5244 return "()";
5245 else if (PyFunction_Check(func))
5246 return "()";
5247 else if (PyCFunction_Check(func))
5248 return "()";
5249 else
5250 return " object";
Jeremy Hylton512a2372001-04-11 13:52:29 +00005251}
5252
Armin Rigo1c2d7e52005-09-20 18:34:01 +00005253#define C_TRACE(x, call) \
Nicholas Bastind858a772004-06-25 23:31:06 +00005254if (tstate->use_tracing && tstate->c_profilefunc) { \
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005255 if (call_trace(tstate->c_profilefunc, tstate->c_profileobj, \
5256 tstate, tstate->frame, \
5257 PyTrace_C_CALL, func)) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005258 x = NULL; \
5259 } \
5260 else { \
5261 x = call; \
5262 if (tstate->c_profilefunc != NULL) { \
5263 if (x == NULL) { \
5264 call_trace_protected(tstate->c_profilefunc, \
5265 tstate->c_profileobj, \
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005266 tstate, tstate->frame, \
5267 PyTrace_C_EXCEPTION, func); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005268 /* XXX should pass (type, value, tb) */ \
5269 } else { \
5270 if (call_trace(tstate->c_profilefunc, \
5271 tstate->c_profileobj, \
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005272 tstate, tstate->frame, \
5273 PyTrace_C_RETURN, func)) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005274 Py_DECREF(x); \
5275 x = NULL; \
5276 } \
5277 } \
5278 } \
5279 } \
Nicholas Bastind858a772004-06-25 23:31:06 +00005280} else { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005281 x = call; \
5282 }
Nicholas Bastinc69ebe82004-03-24 21:57:10 +00005283
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005284
5285static PyObject *
5286trace_call_function(PyThreadState *tstate,
5287 PyObject *func,
5288 PyObject **args, Py_ssize_t nargs,
5289 PyObject *kwnames)
5290{
5291 PyObject *x;
scoder4c9ea092020-05-12 16:12:41 +02005292 if (PyCFunction_CheckExact(func) || PyCMethod_CheckExact(func)) {
Petr Viktorinffd97532020-02-11 17:46:57 +01005293 C_TRACE(x, PyObject_Vectorcall(func, args, nargs, kwnames));
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005294 return x;
5295 }
Andy Lesterdffe4c02020-03-04 07:15:20 -06005296 else if (Py_IS_TYPE(func, &PyMethodDescr_Type) && nargs > 0) {
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005297 /* We need to create a temporary bound method as argument
5298 for profiling.
5299
5300 If nargs == 0, then this cannot work because we have no
5301 "self". In any case, the call itself would raise
5302 TypeError (foo needs an argument), so we just skip
5303 profiling. */
5304 PyObject *self = args[0];
5305 func = Py_TYPE(func)->tp_descr_get(func, self, (PyObject*)Py_TYPE(self));
5306 if (func == NULL) {
5307 return NULL;
5308 }
Petr Viktorinffd97532020-02-11 17:46:57 +01005309 C_TRACE(x, PyObject_Vectorcall(func,
Jeroen Demeyer0d722f32019-07-05 14:48:24 +02005310 args+1, nargs-1,
5311 kwnames));
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005312 Py_DECREF(func);
5313 return x;
5314 }
Petr Viktorinffd97532020-02-11 17:46:57 +01005315 return PyObject_Vectorcall(func, args, nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames);
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005316}
5317
Victor Stinner415c5102017-01-11 00:54:57 +01005318/* Issue #29227: Inline call_function() into _PyEval_EvalFrameDefault()
5319 to reduce the stack consumption. */
5320Py_LOCAL_INLINE(PyObject *) _Py_HOT_FUNCTION
Victor Stinner09532fe2019-05-10 23:39:09 +02005321call_function(PyThreadState *tstate, PyObject ***pp_stack, Py_ssize_t oparg, PyObject *kwnames)
Jeremy Hyltone8c04322002-08-16 17:47:26 +00005322{
Victor Stinnerf9b760f2016-09-09 10:17:08 -07005323 PyObject **pfunc = (*pp_stack) - oparg - 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005324 PyObject *func = *pfunc;
5325 PyObject *x, *w;
Victor Stinnerd8735722016-09-09 12:36:44 -07005326 Py_ssize_t nkwargs = (kwnames == NULL) ? 0 : PyTuple_GET_SIZE(kwnames);
5327 Py_ssize_t nargs = oparg - nkwargs;
INADA Naoki5566bbb2017-02-03 07:43:03 +09005328 PyObject **stack = (*pp_stack) - nargs - nkwargs;
Jeremy Hyltone8c04322002-08-16 17:47:26 +00005329
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005330 if (tstate->use_tracing) {
5331 x = trace_call_function(tstate, func, stack, nargs, kwnames);
INADA Naoki5566bbb2017-02-03 07:43:03 +09005332 }
Victor Stinner4a7cc882015-03-06 23:35:27 +01005333 else {
Petr Viktorinffd97532020-02-11 17:46:57 +01005334 x = PyObject_Vectorcall(func, stack, nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005335 }
Tim Peters8a5c3c72004-04-05 19:36:21 +00005336
Victor Stinner438a12d2019-05-24 17:01:38 +02005337 assert((x != NULL) ^ (_PyErr_Occurred(tstate) != NULL));
Victor Stinnerf9b760f2016-09-09 10:17:08 -07005338
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01005339 /* Clear the stack of the function object. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005340 while ((*pp_stack) > pfunc) {
5341 w = EXT_POP(*pp_stack);
5342 Py_DECREF(w);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005343 }
Victor Stinnerace47d72013-07-18 01:41:08 +02005344
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005345 return x;
Jeremy Hyltone8c04322002-08-16 17:47:26 +00005346}
5347
Jeremy Hylton52820442001-01-03 23:52:36 +00005348static PyObject *
Victor Stinner09532fe2019-05-10 23:39:09 +02005349do_call_core(PyThreadState *tstate, PyObject *func, PyObject *callargs, PyObject *kwdict)
Jeremy Hylton52820442001-01-03 23:52:36 +00005350{
jdemeyere89de732018-09-19 12:06:20 +02005351 PyObject *result;
5352
scoder4c9ea092020-05-12 16:12:41 +02005353 if (PyCFunction_CheckExact(func) || PyCMethod_CheckExact(func)) {
Jeroen Demeyer7a6873c2019-09-11 13:01:01 +02005354 C_TRACE(result, PyObject_Call(func, callargs, kwdict));
Victor Stinnerf9b760f2016-09-09 10:17:08 -07005355 return result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005356 }
Andy Lesterdffe4c02020-03-04 07:15:20 -06005357 else if (Py_IS_TYPE(func, &PyMethodDescr_Type)) {
jdemeyere89de732018-09-19 12:06:20 +02005358 Py_ssize_t nargs = PyTuple_GET_SIZE(callargs);
5359 if (nargs > 0 && tstate->use_tracing) {
5360 /* We need to create a temporary bound method as argument
5361 for profiling.
5362
5363 If nargs == 0, then this cannot work because we have no
5364 "self". In any case, the call itself would raise
5365 TypeError (foo needs an argument), so we just skip
5366 profiling. */
5367 PyObject *self = PyTuple_GET_ITEM(callargs, 0);
5368 func = Py_TYPE(func)->tp_descr_get(func, self, (PyObject*)Py_TYPE(self));
5369 if (func == NULL) {
5370 return NULL;
5371 }
5372
Victor Stinner4d231bc2019-11-14 13:36:21 +01005373 C_TRACE(result, _PyObject_FastCallDictTstate(
5374 tstate, func,
5375 &_PyTuple_ITEMS(callargs)[1],
5376 nargs - 1,
5377 kwdict));
jdemeyere89de732018-09-19 12:06:20 +02005378 Py_DECREF(func);
5379 return result;
5380 }
Victor Stinner74319ae2016-08-25 00:04:09 +02005381 }
jdemeyere89de732018-09-19 12:06:20 +02005382 return PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00005383}
5384
Serhiy Storchaka483405b2015-02-17 10:14:30 +02005385/* Extract a slice index from a PyLong or an object with the
Guido van Rossum38fff8c2006-03-07 18:50:55 +00005386 nb_index slot defined, and store in *pi.
5387 Silently reduce values larger than PY_SSIZE_T_MAX to PY_SSIZE_T_MAX,
Xiang Zhang2ddf5a12017-05-10 18:19:41 +08005388 and silently boost values less than PY_SSIZE_T_MIN to PY_SSIZE_T_MIN.
Martin v. Löwisdde99d22006-02-17 15:57:41 +00005389 Return 0 on error, 1 on success.
Tim Peterscb479e72001-12-16 19:11:44 +00005390*/
Guido van Rossum20c6add2000-05-08 14:06:50 +00005391int
Martin v. Löwis18e16552006-02-15 17:27:45 +00005392_PyEval_SliceIndex(PyObject *v, Py_ssize_t *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005393{
Victor Stinner438a12d2019-05-24 17:01:38 +02005394 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005395 if (v != Py_None) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005396 Py_ssize_t x;
Victor Stinnera15e2602020-04-08 02:01:56 +02005397 if (_PyIndex_Check(v)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005398 x = PyNumber_AsSsize_t(v, NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02005399 if (x == -1 && _PyErr_Occurred(tstate))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005400 return 0;
5401 }
5402 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02005403 _PyErr_SetString(tstate, PyExc_TypeError,
5404 "slice indices must be integers or "
5405 "None or have an __index__ method");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005406 return 0;
5407 }
5408 *pi = x;
5409 }
5410 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005411}
5412
Serhiy Storchaka80ec8362017-03-19 19:37:40 +02005413int
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005414_PyEval_SliceIndexNotNone(PyObject *v, Py_ssize_t *pi)
Serhiy Storchaka80ec8362017-03-19 19:37:40 +02005415{
Victor Stinner438a12d2019-05-24 17:01:38 +02005416 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005417 Py_ssize_t x;
Victor Stinnera15e2602020-04-08 02:01:56 +02005418 if (_PyIndex_Check(v)) {
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005419 x = PyNumber_AsSsize_t(v, NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02005420 if (x == -1 && _PyErr_Occurred(tstate))
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005421 return 0;
5422 }
5423 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02005424 _PyErr_SetString(tstate, PyExc_TypeError,
5425 "slice indices must be integers or "
5426 "have an __index__ method");
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005427 return 0;
5428 }
5429 *pi = x;
5430 return 1;
Serhiy Storchaka80ec8362017-03-19 19:37:40 +02005431}
5432
Thomas Wouters52152252000-08-17 22:55:00 +00005433static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02005434import_name(PyThreadState *tstate, PyFrameObject *f,
5435 PyObject *name, PyObject *fromlist, PyObject *level)
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005436{
5437 _Py_IDENTIFIER(__import__);
Victor Stinnerdf142fd2016-08-20 00:44:42 +02005438 PyObject *import_func, *res;
5439 PyObject* stack[5];
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005440
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02005441 import_func = _PyDict_GetItemIdWithError(f->f_builtins, &PyId___import__);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005442 if (import_func == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005443 if (!_PyErr_Occurred(tstate)) {
5444 _PyErr_SetString(tstate, PyExc_ImportError, "__import__ not found");
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02005445 }
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005446 return NULL;
5447 }
5448
5449 /* Fast path for not overloaded __import__. */
Victor Stinner438a12d2019-05-24 17:01:38 +02005450 if (import_func == tstate->interp->import_func) {
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005451 int ilevel = _PyLong_AsInt(level);
Victor Stinner438a12d2019-05-24 17:01:38 +02005452 if (ilevel == -1 && _PyErr_Occurred(tstate)) {
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005453 return NULL;
5454 }
5455 res = PyImport_ImportModuleLevelObject(
5456 name,
5457 f->f_globals,
5458 f->f_locals == NULL ? Py_None : f->f_locals,
5459 fromlist,
5460 ilevel);
5461 return res;
5462 }
5463
5464 Py_INCREF(import_func);
Victor Stinnerdf142fd2016-08-20 00:44:42 +02005465
5466 stack[0] = name;
5467 stack[1] = f->f_globals;
5468 stack[2] = f->f_locals == NULL ? Py_None : f->f_locals;
5469 stack[3] = fromlist;
5470 stack[4] = level;
Victor Stinner559bb6a2016-08-22 22:48:54 +02005471 res = _PyObject_FastCall(import_func, stack, 5);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005472 Py_DECREF(import_func);
5473 return res;
5474}
5475
5476static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02005477import_from(PyThreadState *tstate, PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00005478{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005479 PyObject *x;
Xiang Zhang4830f582017-03-21 11:13:42 +08005480 PyObject *fullmodname, *pkgname, *pkgpath, *pkgname_or_unknown, *errmsg;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00005481
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005482 if (_PyObject_LookupAttr(v, name, &x) != 0) {
Antoine Pitrou0373a102014-10-13 20:19:45 +02005483 return x;
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005484 }
Antoine Pitrou0373a102014-10-13 20:19:45 +02005485 /* Issue #17636: in case this failed because of a circular relative
5486 import, try to fallback on reading the module directly from
5487 sys.modules. */
Antoine Pitrou0373a102014-10-13 20:19:45 +02005488 pkgname = _PyObject_GetAttrId(v, &PyId___name__);
Brett Cannon3008bc02015-08-11 18:01:31 -07005489 if (pkgname == NULL) {
5490 goto error;
5491 }
Oren Milman6db70332017-09-19 14:23:01 +03005492 if (!PyUnicode_Check(pkgname)) {
5493 Py_CLEAR(pkgname);
5494 goto error;
5495 }
Antoine Pitrou0373a102014-10-13 20:19:45 +02005496 fullmodname = PyUnicode_FromFormat("%U.%U", pkgname, name);
Brett Cannon3008bc02015-08-11 18:01:31 -07005497 if (fullmodname == NULL) {
Xiang Zhang4830f582017-03-21 11:13:42 +08005498 Py_DECREF(pkgname);
Antoine Pitrou0373a102014-10-13 20:19:45 +02005499 return NULL;
Brett Cannon3008bc02015-08-11 18:01:31 -07005500 }
Eric Snow3f9eee62017-09-15 16:35:20 -06005501 x = PyImport_GetModule(fullmodname);
Antoine Pitrou0373a102014-10-13 20:19:45 +02005502 Py_DECREF(fullmodname);
Victor Stinner438a12d2019-05-24 17:01:38 +02005503 if (x == NULL && !_PyErr_Occurred(tstate)) {
Brett Cannon3008bc02015-08-11 18:01:31 -07005504 goto error;
5505 }
Matthias Bussonnier1bc15642017-02-22 07:06:50 -08005506 Py_DECREF(pkgname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005507 return x;
Brett Cannon3008bc02015-08-11 18:01:31 -07005508 error:
Matthias Bussonnierbc4bed42017-02-14 16:05:25 -08005509 pkgpath = PyModule_GetFilenameObject(v);
Matthias Bussonnier1bc15642017-02-22 07:06:50 -08005510 if (pkgname == NULL) {
5511 pkgname_or_unknown = PyUnicode_FromString("<unknown module name>");
5512 if (pkgname_or_unknown == NULL) {
5513 Py_XDECREF(pkgpath);
5514 return NULL;
5515 }
5516 } else {
5517 pkgname_or_unknown = pkgname;
5518 }
Matthias Bussonnierbc4bed42017-02-14 16:05:25 -08005519
5520 if (pkgpath == NULL || !PyUnicode_Check(pkgpath)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005521 _PyErr_Clear(tstate);
Xiang Zhang4830f582017-03-21 11:13:42 +08005522 errmsg = PyUnicode_FromFormat(
5523 "cannot import name %R from %R (unknown location)",
5524 name, pkgname_or_unknown
5525 );
Stefan Krah027b09c2019-03-25 21:50:58 +01005526 /* NULL checks for errmsg and pkgname done by PyErr_SetImportError. */
Xiang Zhang4830f582017-03-21 11:13:42 +08005527 PyErr_SetImportError(errmsg, pkgname, NULL);
5528 }
5529 else {
Anthony Sottile65366bc2019-09-09 08:17:50 -07005530 _Py_IDENTIFIER(__spec__);
5531 PyObject *spec = _PyObject_GetAttrId(v, &PyId___spec__);
Anthony Sottile65366bc2019-09-09 08:17:50 -07005532 const char *fmt =
5533 _PyModuleSpec_IsInitializing(spec) ?
5534 "cannot import name %R from partially initialized module %R "
5535 "(most likely due to a circular import) (%S)" :
5536 "cannot import name %R from %R (%S)";
5537 Py_XDECREF(spec);
5538
5539 errmsg = PyUnicode_FromFormat(fmt, name, pkgname_or_unknown, pkgpath);
Stefan Krah027b09c2019-03-25 21:50:58 +01005540 /* NULL checks for errmsg and pkgname done by PyErr_SetImportError. */
Xiang Zhang4830f582017-03-21 11:13:42 +08005541 PyErr_SetImportError(errmsg, pkgname, pkgpath);
Matthias Bussonnierbc4bed42017-02-14 16:05:25 -08005542 }
5543
Xiang Zhang4830f582017-03-21 11:13:42 +08005544 Py_XDECREF(errmsg);
Matthias Bussonnier1bc15642017-02-22 07:06:50 -08005545 Py_XDECREF(pkgname_or_unknown);
5546 Py_XDECREF(pkgpath);
Brett Cannon3008bc02015-08-11 18:01:31 -07005547 return NULL;
Thomas Wouters52152252000-08-17 22:55:00 +00005548}
Guido van Rossumac7be682001-01-17 15:42:30 +00005549
Thomas Wouters52152252000-08-17 22:55:00 +00005550static int
Victor Stinner438a12d2019-05-24 17:01:38 +02005551import_all_from(PyThreadState *tstate, PyObject *locals, PyObject *v)
Thomas Wouters52152252000-08-17 22:55:00 +00005552{
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02005553 _Py_IDENTIFIER(__all__);
5554 _Py_IDENTIFIER(__dict__);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005555 PyObject *all, *dict, *name, *value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005556 int skip_leading_underscores = 0;
5557 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00005558
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005559 if (_PyObject_LookupAttrId(v, &PyId___all__, &all) < 0) {
5560 return -1; /* Unexpected error */
5561 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005562 if (all == NULL) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005563 if (_PyObject_LookupAttrId(v, &PyId___dict__, &dict) < 0) {
5564 return -1;
5565 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005566 if (dict == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005567 _PyErr_SetString(tstate, PyExc_ImportError,
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005568 "from-import-* object has no __dict__ and no __all__");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005569 return -1;
5570 }
5571 all = PyMapping_Keys(dict);
5572 Py_DECREF(dict);
5573 if (all == NULL)
5574 return -1;
5575 skip_leading_underscores = 1;
5576 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00005577
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005578 for (pos = 0, err = 0; ; pos++) {
5579 name = PySequence_GetItem(all, pos);
5580 if (name == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005581 if (!_PyErr_ExceptionMatches(tstate, PyExc_IndexError)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005582 err = -1;
Victor Stinner438a12d2019-05-24 17:01:38 +02005583 }
5584 else {
5585 _PyErr_Clear(tstate);
5586 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005587 break;
5588 }
Xiang Zhangd8b291a2018-03-24 18:39:36 +08005589 if (!PyUnicode_Check(name)) {
5590 PyObject *modname = _PyObject_GetAttrId(v, &PyId___name__);
5591 if (modname == NULL) {
5592 Py_DECREF(name);
5593 err = -1;
5594 break;
5595 }
5596 if (!PyUnicode_Check(modname)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005597 _PyErr_Format(tstate, PyExc_TypeError,
5598 "module __name__ must be a string, not %.100s",
5599 Py_TYPE(modname)->tp_name);
Xiang Zhangd8b291a2018-03-24 18:39:36 +08005600 }
5601 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02005602 _PyErr_Format(tstate, PyExc_TypeError,
5603 "%s in %U.%s must be str, not %.100s",
5604 skip_leading_underscores ? "Key" : "Item",
5605 modname,
5606 skip_leading_underscores ? "__dict__" : "__all__",
5607 Py_TYPE(name)->tp_name);
Xiang Zhangd8b291a2018-03-24 18:39:36 +08005608 }
5609 Py_DECREF(modname);
5610 Py_DECREF(name);
5611 err = -1;
5612 break;
5613 }
5614 if (skip_leading_underscores) {
Serhiy Storchakae3b2b4b2017-09-08 09:58:51 +03005615 if (PyUnicode_READY(name) == -1) {
5616 Py_DECREF(name);
5617 err = -1;
5618 break;
5619 }
5620 if (PyUnicode_READ_CHAR(name, 0) == '_') {
5621 Py_DECREF(name);
5622 continue;
5623 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005624 }
5625 value = PyObject_GetAttr(v, name);
5626 if (value == NULL)
5627 err = -1;
5628 else if (PyDict_CheckExact(locals))
5629 err = PyDict_SetItem(locals, name, value);
5630 else
5631 err = PyObject_SetItem(locals, name, value);
5632 Py_DECREF(name);
5633 Py_XDECREF(value);
5634 if (err != 0)
5635 break;
5636 }
5637 Py_DECREF(all);
5638 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00005639}
5640
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005641static int
Victor Stinner438a12d2019-05-24 17:01:38 +02005642check_args_iterable(PyThreadState *tstate, PyObject *func, PyObject *args)
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005643{
Victor Stinnera102ed72020-02-07 02:24:48 +01005644 if (Py_TYPE(args)->tp_iter == NULL && !PySequence_Check(args)) {
Jeroen Demeyerbf17d412019-11-05 16:48:04 +01005645 /* check_args_iterable() may be called with a live exception:
5646 * clear it to prevent calling _PyObject_FunctionStr() with an
5647 * exception set. */
Victor Stinner61f4db82020-01-28 03:37:45 +01005648 _PyErr_Clear(tstate);
Jeroen Demeyerbf17d412019-11-05 16:48:04 +01005649 PyObject *funcstr = _PyObject_FunctionStr(func);
5650 if (funcstr != NULL) {
5651 _PyErr_Format(tstate, PyExc_TypeError,
5652 "%U argument after * must be an iterable, not %.200s",
5653 funcstr, Py_TYPE(args)->tp_name);
5654 Py_DECREF(funcstr);
5655 }
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005656 return -1;
5657 }
5658 return 0;
5659}
5660
5661static void
Victor Stinner438a12d2019-05-24 17:01:38 +02005662format_kwargs_error(PyThreadState *tstate, PyObject *func, PyObject *kwargs)
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005663{
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005664 /* _PyDict_MergeEx raises attribute
5665 * error (percolated from an attempt
5666 * to get 'keys' attribute) instead of
5667 * a type error if its second argument
5668 * is not a mapping.
5669 */
Victor Stinner438a12d2019-05-24 17:01:38 +02005670 if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) {
Victor Stinner61f4db82020-01-28 03:37:45 +01005671 _PyErr_Clear(tstate);
Jeroen Demeyerbf17d412019-11-05 16:48:04 +01005672 PyObject *funcstr = _PyObject_FunctionStr(func);
5673 if (funcstr != NULL) {
5674 _PyErr_Format(
5675 tstate, PyExc_TypeError,
5676 "%U argument after ** must be a mapping, not %.200s",
5677 funcstr, Py_TYPE(kwargs)->tp_name);
5678 Py_DECREF(funcstr);
5679 }
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005680 }
Victor Stinner438a12d2019-05-24 17:01:38 +02005681 else if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005682 PyObject *exc, *val, *tb;
Victor Stinner438a12d2019-05-24 17:01:38 +02005683 _PyErr_Fetch(tstate, &exc, &val, &tb);
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005684 if (val && PyTuple_Check(val) && PyTuple_GET_SIZE(val) == 1) {
Victor Stinner61f4db82020-01-28 03:37:45 +01005685 _PyErr_Clear(tstate);
Jeroen Demeyerbf17d412019-11-05 16:48:04 +01005686 PyObject *funcstr = _PyObject_FunctionStr(func);
5687 if (funcstr != NULL) {
5688 PyObject *key = PyTuple_GET_ITEM(val, 0);
5689 _PyErr_Format(
5690 tstate, PyExc_TypeError,
5691 "%U got multiple values for keyword argument '%S'",
5692 funcstr, key);
5693 Py_DECREF(funcstr);
5694 }
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005695 Py_XDECREF(exc);
5696 Py_XDECREF(val);
5697 Py_XDECREF(tb);
5698 }
5699 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02005700 _PyErr_Restore(tstate, exc, val, tb);
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005701 }
5702 }
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005703}
5704
Guido van Rossumac7be682001-01-17 15:42:30 +00005705static void
Victor Stinner438a12d2019-05-24 17:01:38 +02005706format_exc_check_arg(PyThreadState *tstate, PyObject *exc,
5707 const char *format_str, PyObject *obj)
Paul Prescode68140d2000-08-30 20:25:01 +00005708{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005709 const char *obj_str;
Paul Prescode68140d2000-08-30 20:25:01 +00005710
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005711 if (!obj)
5712 return;
Paul Prescode68140d2000-08-30 20:25:01 +00005713
Serhiy Storchaka06515832016-11-20 09:13:07 +02005714 obj_str = PyUnicode_AsUTF8(obj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005715 if (!obj_str)
5716 return;
Paul Prescode68140d2000-08-30 20:25:01 +00005717
Victor Stinner438a12d2019-05-24 17:01:38 +02005718 _PyErr_Format(tstate, exc, format_str, obj_str);
Paul Prescode68140d2000-08-30 20:25:01 +00005719}
Guido van Rossum950361c1997-01-24 13:49:28 +00005720
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005721static void
Victor Stinner438a12d2019-05-24 17:01:38 +02005722format_exc_unbound(PyThreadState *tstate, PyCodeObject *co, int oparg)
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005723{
5724 PyObject *name;
5725 /* Don't stomp existing exception */
Victor Stinner438a12d2019-05-24 17:01:38 +02005726 if (_PyErr_Occurred(tstate))
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005727 return;
5728 if (oparg < PyTuple_GET_SIZE(co->co_cellvars)) {
5729 name = PyTuple_GET_ITEM(co->co_cellvars,
5730 oparg);
Victor Stinner438a12d2019-05-24 17:01:38 +02005731 format_exc_check_arg(tstate,
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005732 PyExc_UnboundLocalError,
5733 UNBOUNDLOCAL_ERROR_MSG,
5734 name);
5735 } else {
5736 name = PyTuple_GET_ITEM(co->co_freevars, oparg -
5737 PyTuple_GET_SIZE(co->co_cellvars));
Victor Stinner438a12d2019-05-24 17:01:38 +02005738 format_exc_check_arg(tstate, PyExc_NameError,
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005739 UNBOUNDFREE_ERROR_MSG, name);
5740 }
5741}
5742
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03005743static void
Mark Shannonfee55262019-11-21 09:11:43 +00005744format_awaitable_error(PyThreadState *tstate, PyTypeObject *type, int prevprevopcode, int prevopcode)
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03005745{
5746 if (type->tp_as_async == NULL || type->tp_as_async->am_await == NULL) {
5747 if (prevopcode == BEFORE_ASYNC_WITH) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005748 _PyErr_Format(tstate, PyExc_TypeError,
5749 "'async with' received an object from __aenter__ "
5750 "that does not implement __await__: %.100s",
5751 type->tp_name);
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03005752 }
Mark Shannonfee55262019-11-21 09:11:43 +00005753 else if (prevopcode == WITH_EXCEPT_START || (prevopcode == CALL_FUNCTION && prevprevopcode == DUP_TOP)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005754 _PyErr_Format(tstate, PyExc_TypeError,
5755 "'async with' received an object from __aexit__ "
5756 "that does not implement __await__: %.100s",
5757 type->tp_name);
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03005758 }
5759 }
5760}
5761
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005762static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02005763unicode_concatenate(PyThreadState *tstate, PyObject *v, PyObject *w,
Serhiy Storchakaab874002016-09-11 13:48:15 +03005764 PyFrameObject *f, const _Py_CODEUNIT *next_instr)
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005765{
5766 PyObject *res;
5767 if (Py_REFCNT(v) == 2) {
5768 /* In the common case, there are 2 references to the value
5769 * stored in 'variable' when the += is performed: one on the
5770 * value stack (in 'v') and one still stored in the
5771 * 'variable'. We try to delete the variable now to reduce
5772 * the refcnt to 1.
5773 */
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03005774 int opcode, oparg;
5775 NEXTOPARG();
5776 switch (opcode) {
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005777 case STORE_FAST:
5778 {
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005779 PyObject **fastlocals = f->f_localsplus;
5780 if (GETLOCAL(oparg) == v)
5781 SETLOCAL(oparg, NULL);
5782 break;
5783 }
5784 case STORE_DEREF:
5785 {
5786 PyObject **freevars = (f->f_localsplus +
5787 f->f_code->co_nlocals);
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03005788 PyObject *c = freevars[oparg];
Raymond Hettingerc32f9db2016-11-12 04:10:35 -05005789 if (PyCell_GET(c) == v) {
5790 PyCell_SET(c, NULL);
5791 Py_DECREF(v);
5792 }
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005793 break;
5794 }
5795 case STORE_NAME:
5796 {
5797 PyObject *names = f->f_code->co_names;
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03005798 PyObject *name = GETITEM(names, oparg);
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005799 PyObject *locals = f->f_locals;
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02005800 if (locals && PyDict_CheckExact(locals)) {
5801 PyObject *w = PyDict_GetItemWithError(locals, name);
5802 if ((w == v && PyDict_DelItem(locals, name) != 0) ||
Victor Stinner438a12d2019-05-24 17:01:38 +02005803 (w == NULL && _PyErr_Occurred(tstate)))
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02005804 {
5805 Py_DECREF(v);
5806 return NULL;
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005807 }
5808 }
5809 break;
5810 }
5811 }
5812 }
5813 res = v;
5814 PyUnicode_Append(&res, w);
5815 return res;
5816}
5817
Guido van Rossum950361c1997-01-24 13:49:28 +00005818#ifdef DYNAMIC_EXECUTION_PROFILE
5819
Skip Montanarof118cb12001-10-15 20:51:38 +00005820static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005821getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00005822{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005823 int i;
5824 PyObject *l = PyList_New(256);
5825 if (l == NULL) return NULL;
5826 for (i = 0; i < 256; i++) {
5827 PyObject *x = PyLong_FromLong(a[i]);
5828 if (x == NULL) {
5829 Py_DECREF(l);
5830 return NULL;
5831 }
Zackery Spytz99d56b52018-12-08 07:16:55 -07005832 PyList_SET_ITEM(l, i, x);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005833 }
5834 for (i = 0; i < 256; i++)
5835 a[i] = 0;
5836 return l;
Guido van Rossum950361c1997-01-24 13:49:28 +00005837}
5838
5839PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005840_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00005841{
5842#ifndef DXPAIRS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005843 return getarray(dxp);
Guido van Rossum950361c1997-01-24 13:49:28 +00005844#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005845 int i;
5846 PyObject *l = PyList_New(257);
5847 if (l == NULL) return NULL;
5848 for (i = 0; i < 257; i++) {
5849 PyObject *x = getarray(dxpairs[i]);
5850 if (x == NULL) {
5851 Py_DECREF(l);
5852 return NULL;
5853 }
Zackery Spytz99d56b52018-12-08 07:16:55 -07005854 PyList_SET_ITEM(l, i, x);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005855 }
5856 return l;
Guido van Rossum950361c1997-01-24 13:49:28 +00005857#endif
5858}
5859
5860#endif
Brett Cannon5c4de282016-09-07 11:16:41 -07005861
5862Py_ssize_t
5863_PyEval_RequestCodeExtraIndex(freefunc free)
5864{
Victor Stinner81a7be32020-04-14 15:14:01 +02005865 PyInterpreterState *interp = _PyInterpreterState_GET();
Brett Cannon5c4de282016-09-07 11:16:41 -07005866 Py_ssize_t new_index;
5867
Dino Viehlandf3cffd22017-06-21 14:44:36 -07005868 if (interp->co_extra_user_count == MAX_CO_EXTRA_USERS - 1) {
Brett Cannon5c4de282016-09-07 11:16:41 -07005869 return -1;
5870 }
Dino Viehlandf3cffd22017-06-21 14:44:36 -07005871 new_index = interp->co_extra_user_count++;
5872 interp->co_extra_freefuncs[new_index] = free;
Brett Cannon5c4de282016-09-07 11:16:41 -07005873 return new_index;
5874}
Łukasz Langaa785c872016-09-09 17:37:37 -07005875
5876static void
5877dtrace_function_entry(PyFrameObject *f)
5878{
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02005879 const char *filename;
5880 const char *funcname;
Łukasz Langaa785c872016-09-09 17:37:37 -07005881 int lineno;
5882
Victor Stinner6d86a232020-04-29 00:56:58 +02005883 PyCodeObject *code = f->f_code;
5884 filename = PyUnicode_AsUTF8(code->co_filename);
5885 funcname = PyUnicode_AsUTF8(code->co_name);
5886 lineno = PyCode_Addr2Line(code, f->f_lasti);
Łukasz Langaa785c872016-09-09 17:37:37 -07005887
Andy Lestere6be9b52020-02-11 20:28:35 -06005888 PyDTrace_FUNCTION_ENTRY(filename, funcname, lineno);
Łukasz Langaa785c872016-09-09 17:37:37 -07005889}
5890
5891static void
5892dtrace_function_return(PyFrameObject *f)
5893{
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02005894 const char *filename;
5895 const char *funcname;
Łukasz Langaa785c872016-09-09 17:37:37 -07005896 int lineno;
5897
Victor Stinner6d86a232020-04-29 00:56:58 +02005898 PyCodeObject *code = f->f_code;
5899 filename = PyUnicode_AsUTF8(code->co_filename);
5900 funcname = PyUnicode_AsUTF8(code->co_name);
5901 lineno = PyCode_Addr2Line(code, f->f_lasti);
Łukasz Langaa785c872016-09-09 17:37:37 -07005902
Andy Lestere6be9b52020-02-11 20:28:35 -06005903 PyDTrace_FUNCTION_RETURN(filename, funcname, lineno);
Łukasz Langaa785c872016-09-09 17:37:37 -07005904}
5905
5906/* DTrace equivalent of maybe_call_line_trace. */
5907static void
5908maybe_dtrace_line(PyFrameObject *frame,
5909 int *instr_lb, int *instr_ub, int *instr_prev)
5910{
5911 int line = frame->f_lineno;
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02005912 const char *co_filename, *co_name;
Łukasz Langaa785c872016-09-09 17:37:37 -07005913
5914 /* If the last instruction executed isn't in the current
5915 instruction window, reset the window.
5916 */
5917 if (frame->f_lasti < *instr_lb || frame->f_lasti >= *instr_ub) {
5918 PyAddrPair bounds;
5919 line = _PyCode_CheckLineNumber(frame->f_code, frame->f_lasti,
5920 &bounds);
5921 *instr_lb = bounds.ap_lower;
5922 *instr_ub = bounds.ap_upper;
5923 }
5924 /* If the last instruction falls at the start of a line or if
5925 it represents a jump backwards, update the frame's line
5926 number and call the trace function. */
5927 if (frame->f_lasti == *instr_lb || frame->f_lasti < *instr_prev) {
5928 frame->f_lineno = line;
5929 co_filename = PyUnicode_AsUTF8(frame->f_code->co_filename);
5930 if (!co_filename)
5931 co_filename = "?";
5932 co_name = PyUnicode_AsUTF8(frame->f_code->co_name);
5933 if (!co_name)
5934 co_name = "?";
Andy Lestere6be9b52020-02-11 20:28:35 -06005935 PyDTrace_LINE(co_filename, co_name, line);
Łukasz Langaa785c872016-09-09 17:37:37 -07005936 }
5937 *instr_prev = frame->f_lasti;
5938}
Victor Stinnerf4b1e3d2019-11-04 19:48:34 +01005939
5940
5941/* Implement Py_EnterRecursiveCall() and Py_LeaveRecursiveCall() as functions
5942 for the limited API. */
5943
5944#undef Py_EnterRecursiveCall
5945
5946int Py_EnterRecursiveCall(const char *where)
5947{
Victor Stinnerbe434dc2019-11-05 00:51:22 +01005948 return _Py_EnterRecursiveCall_inline(where);
Victor Stinnerf4b1e3d2019-11-04 19:48:34 +01005949}
5950
5951#undef Py_LeaveRecursiveCall
5952
5953void Py_LeaveRecursiveCall(void)
5954{
Victor Stinnerbe434dc2019-11-05 00:51:22 +01005955 _Py_LeaveRecursiveCall_inline();
Victor Stinnerf4b1e3d2019-11-04 19:48:34 +01005956}