blob: 528ad7fdd1e2005fb92156a63e0a035daca87d87 [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 Stinner4d231bc2019-11-14 13:36:21 +010013#include "pycore_call.h"
Victor Stinner09532fe2019-05-10 23:39:09 +020014#include "pycore_ceval.h"
Inada Naoki91234a12019-06-03 21:30:58 +090015#include "pycore_code.h"
Victor Stinnerbcda8f12018-11-21 22:27:47 +010016#include "pycore_object.h"
Victor Stinner438a12d2019-05-24 17:01:38 +020017#include "pycore_pyerrors.h"
18#include "pycore_pylifecycle.h"
Victor Stinner621cebe2018-11-12 16:53:38 +010019#include "pycore_pystate.h"
Victor Stinnerec13b932018-11-25 23:56:17 +010020#include "pycore_tupleobject.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000021
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000022#include "code.h"
Benjamin Peterson025e9eb2015-05-05 20:16:41 -040023#include "dictobject.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000024#include "frameobject.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000025#include "opcode.h"
Łukasz Langaa785c872016-09-09 17:37:37 -070026#include "pydtrace.h"
Benjamin Peterson025e9eb2015-05-05 20:16:41 -040027#include "setobject.h"
Tim Peters6d6c1a32001-08-02 04:15:00 +000028#include "structmember.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000029
Guido van Rossumc6004111993-11-05 10:22:19 +000030#include <ctype.h>
31
Guido van Rossum408027e1996-12-30 16:17:54 +000032#ifdef Py_DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000033/* For debugging the interpreter: */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000034#define LLTRACE 1 /* Low-level trace feature */
35#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000036#endif
37
Victor Stinner5c75f372019-04-17 23:02:26 +020038#if !defined(Py_BUILD_CORE)
39# error "ceval.c must be build with Py_BUILD_CORE define for best performance"
40#endif
41
Guido van Rossum5b722181993-03-30 17:46:03 +000042
Guido van Rossum374a9221991-04-04 10:40:29 +000043/* Forward declarations */
Victor Stinner09532fe2019-05-10 23:39:09 +020044Py_LOCAL_INLINE(PyObject *) call_function(
45 PyThreadState *tstate, PyObject ***pp_stack,
46 Py_ssize_t oparg, PyObject *kwnames);
47static PyObject * do_call_core(
48 PyThreadState *tstate, PyObject *func,
49 PyObject *callargs, PyObject *kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +000050
Guido van Rossum0a066c01992-03-27 17:29:15 +000051#ifdef LLTRACE
Guido van Rossumc2e20742006-02-27 22:32:47 +000052static int lltrace;
Victor Stinner438a12d2019-05-24 17:01:38 +020053static int prtrace(PyThreadState *, PyObject *, const char *);
Guido van Rossum0a066c01992-03-27 17:29:15 +000054#endif
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +010055static int call_trace(Py_tracefunc, PyObject *,
56 PyThreadState *, PyFrameObject *,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000057 int, PyObject *);
Amaury Forgeot d'Arcf05149a2007-11-13 01:05:30 +000058static int call_trace_protected(Py_tracefunc, PyObject *,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +010059 PyThreadState *, PyFrameObject *,
60 int, PyObject *);
61static void call_exc_trace(Py_tracefunc, PyObject *,
62 PyThreadState *, PyFrameObject *);
Tim Peters8a5c3c72004-04-05 19:36:21 +000063static int maybe_call_line_trace(Py_tracefunc, PyObject *,
Eric Snow2ebc5ce2017-09-07 23:51:28 -060064 PyThreadState *, PyFrameObject *,
65 int *, int *, int *);
Łukasz Langaa785c872016-09-09 17:37:37 -070066static void maybe_dtrace_line(PyFrameObject *, int *, int *, int *);
67static void dtrace_function_entry(PyFrameObject *);
68static void dtrace_function_return(PyFrameObject *);
Michael W. Hudsondd32a912002-08-15 14:59:02 +000069
Victor Stinner438a12d2019-05-24 17:01:38 +020070static PyObject * import_name(PyThreadState *, PyFrameObject *,
71 PyObject *, PyObject *, PyObject *);
72static PyObject * import_from(PyThreadState *, PyObject *, PyObject *);
73static int import_all_from(PyThreadState *, PyObject *, PyObject *);
74static void format_exc_check_arg(PyThreadState *, PyObject *, const char *, PyObject *);
75static void format_exc_unbound(PyThreadState *tstate, PyCodeObject *co, int oparg);
76static PyObject * unicode_concatenate(PyThreadState *, PyObject *, PyObject *,
Serhiy Storchakaab874002016-09-11 13:48:15 +030077 PyFrameObject *, const _Py_CODEUNIT *);
Victor Stinner438a12d2019-05-24 17:01:38 +020078static PyObject * special_lookup(PyThreadState *, PyObject *, _Py_Identifier *);
79static int check_args_iterable(PyThreadState *, PyObject *func, PyObject *vararg);
80static void format_kwargs_error(PyThreadState *, PyObject *func, PyObject *kwargs);
Mark Shannonfee55262019-11-21 09:11:43 +000081static void format_awaitable_error(PyThreadState *, PyTypeObject *, int, int);
Guido van Rossum374a9221991-04-04 10:40:29 +000082
Paul Prescode68140d2000-08-30 20:25:01 +000083#define NAME_ERROR_MSG \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000084 "name '%.200s' is not defined"
Paul Prescode68140d2000-08-30 20:25:01 +000085#define UNBOUNDLOCAL_ERROR_MSG \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000086 "local variable '%.200s' referenced before assignment"
Jeremy Hyltonc76770c2001-04-13 16:51:46 +000087#define UNBOUNDFREE_ERROR_MSG \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000088 "free variable '%.200s' referenced before assignment" \
89 " in enclosing scope"
Guido van Rossum374a9221991-04-04 10:40:29 +000090
Guido van Rossum950361c1997-01-24 13:49:28 +000091/* Dynamic execution profile */
92#ifdef DYNAMIC_EXECUTION_PROFILE
93#ifdef DXPAIRS
94static long dxpairs[257][256];
95#define dxp dxpairs[256]
96#else
97static long dxp[256];
98#endif
99#endif
100
Inada Naoki91234a12019-06-03 21:30:58 +0900101/* per opcode cache */
Inada Naokieddef862019-06-04 07:38:10 +0900102#ifdef Py_DEBUG
103// --with-pydebug is used to find memory leak. opcache makes it harder.
104// So we disable opcache when Py_DEBUG is defined.
105// See bpo-37146
106#define OPCACHE_MIN_RUNS 0 /* disable opcache */
107#else
Inada Naoki91234a12019-06-03 21:30:58 +0900108#define OPCACHE_MIN_RUNS 1024 /* create opcache when code executed this time */
Inada Naokieddef862019-06-04 07:38:10 +0900109#endif
Inada Naoki91234a12019-06-03 21:30:58 +0900110#define OPCACHE_STATS 0 /* Enable stats */
111
112#if OPCACHE_STATS
113static size_t opcache_code_objects = 0;
114static size_t opcache_code_objects_extra_mem = 0;
115
116static size_t opcache_global_opts = 0;
117static size_t opcache_global_hits = 0;
118static size_t opcache_global_misses = 0;
119#endif
120
Victor Stinnere225beb2019-06-03 18:14:24 +0200121#define GIL_REQUEST _Py_atomic_load_relaxed(&ceval->gil_drop_request)
Inada Naoki91234a12019-06-03 21:30:58 +0900122
Jeffrey Yasskin39370832010-05-03 19:29:34 +0000123/* This can set eval_breaker to 0 even though gil_drop_request became
124 1. We believe this is all right because the eval loop will release
125 the GIL eventually anyway. */
Victor Stinnere225beb2019-06-03 18:14:24 +0200126#define COMPUTE_EVAL_BREAKER(ceval) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000127 _Py_atomic_store_relaxed( \
Victor Stinnere225beb2019-06-03 18:14:24 +0200128 &(ceval)->eval_breaker, \
129 GIL_REQUEST | \
130 _Py_atomic_load_relaxed(&(ceval)->signals_pending) | \
131 _Py_atomic_load_relaxed(&(ceval)->pending.calls_to_do) | \
132 (ceval)->pending.async_exc)
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000133
Victor Stinnere225beb2019-06-03 18:14:24 +0200134#define SET_GIL_DROP_REQUEST(ceval) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000135 do { \
Victor Stinnere225beb2019-06-03 18:14:24 +0200136 _Py_atomic_store_relaxed(&(ceval)->gil_drop_request, 1); \
137 _Py_atomic_store_relaxed(&(ceval)->eval_breaker, 1); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000138 } while (0)
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000139
Victor Stinnere225beb2019-06-03 18:14:24 +0200140#define RESET_GIL_DROP_REQUEST(ceval) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000141 do { \
Victor Stinnere225beb2019-06-03 18:14:24 +0200142 _Py_atomic_store_relaxed(&(ceval)->gil_drop_request, 0); \
143 COMPUTE_EVAL_BREAKER(ceval); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000144 } while (0)
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000145
Jeffrey Yasskin39370832010-05-03 19:29:34 +0000146/* Pending calls are only modified under pending_lock */
Victor Stinnere225beb2019-06-03 18:14:24 +0200147#define SIGNAL_PENDING_CALLS(ceval) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000148 do { \
Victor Stinnere225beb2019-06-03 18:14:24 +0200149 _Py_atomic_store_relaxed(&(ceval)->pending.calls_to_do, 1); \
150 _Py_atomic_store_relaxed(&(ceval)->eval_breaker, 1); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000151 } while (0)
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000152
Victor Stinnere225beb2019-06-03 18:14:24 +0200153#define UNSIGNAL_PENDING_CALLS(ceval) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000154 do { \
Victor Stinnere225beb2019-06-03 18:14:24 +0200155 _Py_atomic_store_relaxed(&(ceval)->pending.calls_to_do, 0); \
156 COMPUTE_EVAL_BREAKER(ceval); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000157 } while (0)
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000158
Victor Stinnere225beb2019-06-03 18:14:24 +0200159#define SIGNAL_PENDING_SIGNALS(ceval) \
Eric Snowfdf282d2019-01-11 14:26:55 -0700160 do { \
Victor Stinnere225beb2019-06-03 18:14:24 +0200161 _Py_atomic_store_relaxed(&(ceval)->signals_pending, 1); \
162 _Py_atomic_store_relaxed(&(ceval)->eval_breaker, 1); \
Eric Snowfdf282d2019-01-11 14:26:55 -0700163 } while (0)
164
Victor Stinnere225beb2019-06-03 18:14:24 +0200165#define UNSIGNAL_PENDING_SIGNALS(ceval) \
Eric Snowfdf282d2019-01-11 14:26:55 -0700166 do { \
Victor Stinnere225beb2019-06-03 18:14:24 +0200167 _Py_atomic_store_relaxed(&(ceval)->signals_pending, 0); \
168 COMPUTE_EVAL_BREAKER(ceval); \
Eric Snowfdf282d2019-01-11 14:26:55 -0700169 } while (0)
170
Victor Stinnere225beb2019-06-03 18:14:24 +0200171#define SIGNAL_ASYNC_EXC(ceval) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000172 do { \
Victor Stinnere225beb2019-06-03 18:14:24 +0200173 (ceval)->pending.async_exc = 1; \
174 _Py_atomic_store_relaxed(&(ceval)->eval_breaker, 1); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000175 } while (0)
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000176
Victor Stinnere225beb2019-06-03 18:14:24 +0200177#define UNSIGNAL_ASYNC_EXC(ceval) \
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600178 do { \
Victor Stinnere225beb2019-06-03 18:14:24 +0200179 (ceval)->pending.async_exc = 0; \
180 COMPUTE_EVAL_BREAKER(ceval); \
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600181 } while (0)
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000182
183
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000184#ifdef HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000185#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +0000186#endif
Guido van Rossum49b56061998-10-01 20:42:43 +0000187#include "pythread.h"
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000188#include "ceval_gil.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000189
Tim Peters7f468f22004-10-11 02:40:51 +0000190int
191PyEval_ThreadsInitialized(void)
192{
Victor Stinner01b1cc12019-11-20 02:27:56 +0100193 _PyRuntimeState *runtime = &_PyRuntime;
194 return gil_created(&runtime->ceval.gil);
Tim Peters7f468f22004-10-11 02:40:51 +0000195}
196
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000197void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000198PyEval_InitThreads(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000199{
Victor Stinner09532fe2019-05-10 23:39:09 +0200200 _PyRuntimeState *runtime = &_PyRuntime;
Victor Stinnere225beb2019-06-03 18:14:24 +0200201 struct _ceval_runtime_state *ceval = &runtime->ceval;
202 struct _gil_runtime_state *gil = &ceval->gil;
Victor Stinner09532fe2019-05-10 23:39:09 +0200203 if (gil_created(gil)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000204 return;
Victor Stinnera7126792019-03-19 14:19:38 +0100205 }
206
Inada Naoki001fee12019-02-20 10:00:09 +0900207 PyThread_init_thread();
Victor Stinner09532fe2019-05-10 23:39:09 +0200208 create_gil(gil);
209 PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime);
Victor Stinnere225beb2019-06-03 18:14:24 +0200210 take_gil(ceval, tstate);
Eric Snow8479a342019-03-08 23:44:33 -0700211
Victor Stinnere225beb2019-06-03 18:14:24 +0200212 struct _pending_calls *pending = &ceval->pending;
213 pending->lock = PyThread_allocate_lock();
214 if (pending->lock == NULL) {
215 Py_FatalError("Can't initialize threads for pending calls");
216 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000217}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000218
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000219void
Victor Stinnere225beb2019-06-03 18:14:24 +0200220_PyEval_FiniThreads(struct _ceval_runtime_state *ceval)
Antoine Pitrou1df15362010-09-13 14:16:46 +0000221{
Victor Stinnere225beb2019-06-03 18:14:24 +0200222 struct _gil_runtime_state *gil = &ceval->gil;
Victor Stinner09532fe2019-05-10 23:39:09 +0200223 if (!gil_created(gil)) {
Antoine Pitrou1df15362010-09-13 14:16:46 +0000224 return;
Victor Stinnera7126792019-03-19 14:19:38 +0100225 }
226
Victor Stinner09532fe2019-05-10 23:39:09 +0200227 destroy_gil(gil);
228 assert(!gil_created(gil));
Victor Stinner99fcc612019-04-29 13:04:07 +0200229
Victor Stinnere225beb2019-06-03 18:14:24 +0200230 struct _pending_calls *pending = &ceval->pending;
231 if (pending->lock != NULL) {
232 PyThread_free_lock(pending->lock);
233 pending->lock = NULL;
234 }
Antoine Pitrou1df15362010-09-13 14:16:46 +0000235}
236
Joannah Nanjekyef781d202019-04-29 04:38:45 -0400237static inline void
Victor Stinner01b1cc12019-11-20 02:27:56 +0100238exit_thread_if_finalizing(PyThreadState *tstate)
Joannah Nanjekyef781d202019-04-29 04:38:45 -0400239{
Victor Stinner01b1cc12019-11-20 02:27:56 +0100240 _PyRuntimeState *runtime = tstate->interp->runtime;
Victor Stinnere225beb2019-06-03 18:14:24 +0200241 /* _Py_Finalizing is protected by the GIL */
Victor Stinner09532fe2019-05-10 23:39:09 +0200242 if (runtime->finalizing != NULL && !_Py_CURRENTLY_FINALIZING(runtime, tstate)) {
Victor Stinnere225beb2019-06-03 18:14:24 +0200243 drop_gil(&runtime->ceval, tstate);
Joannah Nanjekyef781d202019-04-29 04:38:45 -0400244 PyThread_exit_thread();
Joannah Nanjekyef781d202019-04-29 04:38:45 -0400245 }
246}
247
Antoine Pitrou1df15362010-09-13 14:16:46 +0000248void
Inada Naoki91234a12019-06-03 21:30:58 +0900249_PyEval_Fini(void)
250{
251#if OPCACHE_STATS
252 fprintf(stderr, "-- Opcode cache number of objects = %zd\n",
253 opcache_code_objects);
254
255 fprintf(stderr, "-- Opcode cache total extra mem = %zd\n",
256 opcache_code_objects_extra_mem);
257
258 fprintf(stderr, "\n");
259
260 fprintf(stderr, "-- Opcode cache LOAD_GLOBAL hits = %zd (%d%%)\n",
261 opcache_global_hits,
262 (int) (100.0 * opcache_global_hits /
263 (opcache_global_hits + opcache_global_misses)));
264
265 fprintf(stderr, "-- Opcode cache LOAD_GLOBAL misses = %zd (%d%%)\n",
266 opcache_global_misses,
267 (int) (100.0 * opcache_global_misses /
268 (opcache_global_hits + opcache_global_misses)));
269
270 fprintf(stderr, "-- Opcode cache LOAD_GLOBAL opts = %zd\n",
271 opcache_global_opts);
272
273 fprintf(stderr, "\n");
274#endif
275}
276
277void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000278PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000279{
Victor Stinner09532fe2019-05-10 23:39:09 +0200280 _PyRuntimeState *runtime = &_PyRuntime;
Victor Stinnere225beb2019-06-03 18:14:24 +0200281 struct _ceval_runtime_state *ceval = &runtime->ceval;
Victor Stinner09532fe2019-05-10 23:39:09 +0200282 PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime);
283 if (tstate == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000284 Py_FatalError("PyEval_AcquireLock: current thread state is NULL");
Victor Stinner09532fe2019-05-10 23:39:09 +0200285 }
Victor Stinnere225beb2019-06-03 18:14:24 +0200286 take_gil(ceval, tstate);
Victor Stinner01b1cc12019-11-20 02:27:56 +0100287 exit_thread_if_finalizing(tstate);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000288}
289
290void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000291PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000292{
Victor Stinner09532fe2019-05-10 23:39:09 +0200293 _PyRuntimeState *runtime = &_PyRuntime;
Victor Stinnere225beb2019-06-03 18:14:24 +0200294 PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000295 /* This function must succeed when the current thread state is NULL.
Victor Stinner50b48572018-11-01 01:51:40 +0100296 We therefore avoid PyThreadState_Get() which dumps a fatal error
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000297 in debug mode.
298 */
Victor Stinnere225beb2019-06-03 18:14:24 +0200299 drop_gil(&runtime->ceval, tstate);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000300}
301
302void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000303PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000304{
Victor Stinner09532fe2019-05-10 23:39:09 +0200305 if (tstate == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000306 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
Victor Stinner09532fe2019-05-10 23:39:09 +0200307 }
Victor Stinnere225beb2019-06-03 18:14:24 +0200308
Victor Stinner01b1cc12019-11-20 02:27:56 +0100309 _PyRuntimeState *runtime = tstate->interp->runtime;
Victor Stinnere225beb2019-06-03 18:14:24 +0200310 struct _ceval_runtime_state *ceval = &runtime->ceval;
Victor Stinner09532fe2019-05-10 23:39:09 +0200311
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000312 /* Check someone has called PyEval_InitThreads() to create the lock */
Victor Stinnere225beb2019-06-03 18:14:24 +0200313 assert(gil_created(&ceval->gil));
314 take_gil(ceval, tstate);
Victor Stinner01b1cc12019-11-20 02:27:56 +0100315 exit_thread_if_finalizing(tstate);
Victor Stinner09532fe2019-05-10 23:39:09 +0200316 if (_PyThreadState_Swap(&runtime->gilstate, tstate) != NULL) {
317 Py_FatalError("PyEval_AcquireThread: non-NULL old thread state");
318 }
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000319}
320
321void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000322PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000323{
Victor Stinner09532fe2019-05-10 23:39:09 +0200324 if (tstate == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000325 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
Victor Stinner09532fe2019-05-10 23:39:09 +0200326 }
327
Victor Stinner01b1cc12019-11-20 02:27:56 +0100328 _PyRuntimeState *runtime = tstate->interp->runtime;
Victor Stinner09532fe2019-05-10 23:39:09 +0200329 PyThreadState *new_tstate = _PyThreadState_Swap(&runtime->gilstate, NULL);
330 if (new_tstate != tstate) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000331 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
Victor Stinner09532fe2019-05-10 23:39:09 +0200332 }
Victor Stinnere225beb2019-06-03 18:14:24 +0200333 drop_gil(&runtime->ceval, tstate);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000334}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000335
Antoine Pitrouf7ecfac2017-05-28 11:35:14 +0200336/* This function is called from PyOS_AfterFork_Child to destroy all threads
337 * which are not running in the child process, and clear internal locks
338 * which might be held by those threads.
339 */
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000340
341void
Victor Stinnerd5d9e812019-05-13 12:35:37 +0200342_PyEval_ReInitThreads(_PyRuntimeState *runtime)
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000343{
Victor Stinnere225beb2019-06-03 18:14:24 +0200344 struct _ceval_runtime_state *ceval = &runtime->ceval;
345 if (!gil_created(&ceval->gil)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000346 return;
Victor Stinner09532fe2019-05-10 23:39:09 +0200347 }
Victor Stinnere225beb2019-06-03 18:14:24 +0200348 recreate_gil(&ceval->gil);
Victor Stinner09532fe2019-05-10 23:39:09 +0200349 PyThreadState *current_tstate = _PyRuntimeState_GetThreadState(runtime);
Victor Stinnere225beb2019-06-03 18:14:24 +0200350 take_gil(ceval, current_tstate);
Eric Snow8479a342019-03-08 23:44:33 -0700351
Victor Stinnere225beb2019-06-03 18:14:24 +0200352 struct _pending_calls *pending = &ceval->pending;
Victor Stinner09532fe2019-05-10 23:39:09 +0200353 pending->lock = PyThread_allocate_lock();
354 if (pending->lock == NULL) {
Eric Snow8479a342019-03-08 23:44:33 -0700355 Py_FatalError("Can't initialize threads for pending calls");
356 }
Jesse Nollera8513972008-07-17 16:49:17 +0000357
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200358 /* Destroy all threads except the current one */
Victor Stinner0fd2c302019-06-04 03:15:09 +0200359 _PyThreadState_DeleteExcept(runtime, current_tstate);
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000360}
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000361
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000362/* This function is used to signal that async exceptions are waiting to be
Zackery Spytzeef05962018-09-29 10:07:11 -0600363 raised. */
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000364
365void
Victor Stinnere225beb2019-06-03 18:14:24 +0200366_PyEval_SignalAsyncExc(struct _ceval_runtime_state *ceval)
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000367{
Victor Stinnere225beb2019-06-03 18:14:24 +0200368 SIGNAL_ASYNC_EXC(ceval);
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000369}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000370
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000371PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000372PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000373{
Victor Stinner09532fe2019-05-10 23:39:09 +0200374 _PyRuntimeState *runtime = &_PyRuntime;
Victor Stinnere225beb2019-06-03 18:14:24 +0200375 struct _ceval_runtime_state *ceval = &runtime->ceval;
Victor Stinner09532fe2019-05-10 23:39:09 +0200376 PyThreadState *tstate = _PyThreadState_Swap(&runtime->gilstate, NULL);
377 if (tstate == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000378 Py_FatalError("PyEval_SaveThread: NULL tstate");
Victor Stinner09532fe2019-05-10 23:39:09 +0200379 }
Victor Stinnere225beb2019-06-03 18:14:24 +0200380 assert(gil_created(&ceval->gil));
381 drop_gil(ceval, tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000382 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000383}
384
385void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000386PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000387{
Victor Stinner01b1cc12019-11-20 02:27:56 +0100388 _PyRuntimeState *runtime = tstate->interp->runtime;
Victor Stinner0fd2c302019-06-04 03:15:09 +0200389 struct _ceval_runtime_state *ceval = &runtime->ceval;
390
Victor Stinner09532fe2019-05-10 23:39:09 +0200391 if (tstate == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000392 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Victor Stinner09532fe2019-05-10 23:39:09 +0200393 }
Victor Stinnere225beb2019-06-03 18:14:24 +0200394 assert(gil_created(&ceval->gil));
Victor Stinner2914bb32018-01-29 11:57:45 +0100395
396 int err = errno;
Victor Stinnere225beb2019-06-03 18:14:24 +0200397 take_gil(ceval, tstate);
Victor Stinner01b1cc12019-11-20 02:27:56 +0100398 exit_thread_if_finalizing(tstate);
Victor Stinner2914bb32018-01-29 11:57:45 +0100399 errno = err;
400
Victor Stinner09532fe2019-05-10 23:39:09 +0200401 _PyThreadState_Swap(&runtime->gilstate, tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000402}
403
404
Guido van Rossuma9672091994-09-14 13:31:22 +0000405/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
406 signal handlers or Mac I/O completion routines) can schedule calls
407 to a function to be called synchronously.
408 The synchronous function is called with one void* argument.
409 It should return 0 for success or -1 for failure -- failure should
410 be accompanied by an exception.
411
412 If registry succeeds, the registry function returns 0; if it fails
413 (e.g. due to too many pending calls) it returns -1 (without setting
414 an exception condition).
415
416 Note that because registry may occur from within signal handlers,
417 or other asynchronous events, calling malloc() is unsafe!
418
Guido van Rossuma9672091994-09-14 13:31:22 +0000419 Any thread can schedule pending calls, but only the main thread
420 will execute them.
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000421 There is no facility to schedule calls to a particular thread, but
422 that should be easy to change, should that ever be required. In
423 that case, the static variables here should go into the python
424 threadstate.
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000425*/
Guido van Rossuma9672091994-09-14 13:31:22 +0000426
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200427void
Victor Stinnere225beb2019-06-03 18:14:24 +0200428_PyEval_SignalReceived(struct _ceval_runtime_state *ceval)
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200429{
430 /* bpo-30703: Function called when the C signal handler of Python gets a
431 signal. We cannot queue a callback using Py_AddPendingCall() since
432 that function is not async-signal-safe. */
Victor Stinnere225beb2019-06-03 18:14:24 +0200433 SIGNAL_PENDING_SIGNALS(ceval);
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200434}
435
Eric Snow5be45a62019-03-08 22:47:07 -0700436/* Push one item onto the queue while holding the lock. */
437static int
Victor Stinnere225beb2019-06-03 18:14:24 +0200438_push_pending_call(struct _pending_calls *pending,
Eric Snow842a2f02019-03-15 15:47:51 -0600439 int (*func)(void *), void *arg)
Eric Snow5be45a62019-03-08 22:47:07 -0700440{
Eric Snow842a2f02019-03-15 15:47:51 -0600441 int i = pending->last;
Eric Snow5be45a62019-03-08 22:47:07 -0700442 int j = (i + 1) % NPENDINGCALLS;
Eric Snow842a2f02019-03-15 15:47:51 -0600443 if (j == pending->first) {
Eric Snow5be45a62019-03-08 22:47:07 -0700444 return -1; /* Queue full */
445 }
Eric Snow842a2f02019-03-15 15:47:51 -0600446 pending->calls[i].func = func;
447 pending->calls[i].arg = arg;
448 pending->last = j;
Eric Snow5be45a62019-03-08 22:47:07 -0700449 return 0;
450}
451
452/* Pop one item off the queue while holding the lock. */
453static void
Victor Stinnere225beb2019-06-03 18:14:24 +0200454_pop_pending_call(struct _pending_calls *pending,
Eric Snow842a2f02019-03-15 15:47:51 -0600455 int (**func)(void *), void **arg)
Eric Snow5be45a62019-03-08 22:47:07 -0700456{
Eric Snow842a2f02019-03-15 15:47:51 -0600457 int i = pending->first;
458 if (i == pending->last) {
Eric Snow5be45a62019-03-08 22:47:07 -0700459 return; /* Queue empty */
460 }
461
Eric Snow842a2f02019-03-15 15:47:51 -0600462 *func = pending->calls[i].func;
463 *arg = pending->calls[i].arg;
464 pending->first = (i + 1) % NPENDINGCALLS;
Eric Snow5be45a62019-03-08 22:47:07 -0700465}
466
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200467/* This implementation is thread-safe. It allows
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000468 scheduling to be made from any thread, and even from an executing
469 callback.
470 */
471
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000472int
Victor Stinner438a12d2019-05-24 17:01:38 +0200473_PyEval_AddPendingCall(PyThreadState *tstate,
Victor Stinnere225beb2019-06-03 18:14:24 +0200474 struct _ceval_runtime_state *ceval,
Victor Stinner09532fe2019-05-10 23:39:09 +0200475 int (*func)(void *), void *arg)
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000476{
Victor Stinnere225beb2019-06-03 18:14:24 +0200477 struct _pending_calls *pending = &ceval->pending;
Eric Snow842a2f02019-03-15 15:47:51 -0600478
479 PyThread_acquire_lock(pending->lock, WAIT_LOCK);
480 if (pending->finishing) {
481 PyThread_release_lock(pending->lock);
482
483 PyObject *exc, *val, *tb;
Victor Stinner438a12d2019-05-24 17:01:38 +0200484 _PyErr_Fetch(tstate, &exc, &val, &tb);
485 _PyErr_SetString(tstate, PyExc_SystemError,
Eric Snow842a2f02019-03-15 15:47:51 -0600486 "Py_AddPendingCall: cannot add pending calls "
487 "(Python shutting down)");
Victor Stinner438a12d2019-05-24 17:01:38 +0200488 _PyErr_Print(tstate);
489 _PyErr_Restore(tstate, exc, val, tb);
Eric Snow842a2f02019-03-15 15:47:51 -0600490 return -1;
491 }
Victor Stinnere225beb2019-06-03 18:14:24 +0200492 int result = _push_pending_call(pending, func, arg);
Eric Snow842a2f02019-03-15 15:47:51 -0600493 PyThread_release_lock(pending->lock);
Eric Snow5be45a62019-03-08 22:47:07 -0700494
Victor Stinnere225beb2019-06-03 18:14:24 +0200495 /* signal main loop */
496 SIGNAL_PENDING_CALLS(ceval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000497 return result;
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000498}
499
Victor Stinner09532fe2019-05-10 23:39:09 +0200500int
501Py_AddPendingCall(int (*func)(void *), void *arg)
502{
Victor Stinner438a12d2019-05-24 17:01:38 +0200503 _PyRuntimeState *runtime = &_PyRuntime;
504 PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime);
Victor Stinnere225beb2019-06-03 18:14:24 +0200505 return _PyEval_AddPendingCall(tstate, &runtime->ceval, func, arg);
Victor Stinner09532fe2019-05-10 23:39:09 +0200506}
507
Eric Snowfdf282d2019-01-11 14:26:55 -0700508static int
Victor Stinner09532fe2019-05-10 23:39:09 +0200509handle_signals(_PyRuntimeState *runtime)
Eric Snowfdf282d2019-01-11 14:26:55 -0700510{
Eric Snow5be45a62019-03-08 22:47:07 -0700511 /* Only handle signals on main thread. PyEval_InitThreads must
512 * have been called already.
513 */
Victor Stinner09532fe2019-05-10 23:39:09 +0200514 if (PyThread_get_thread_ident() != runtime->main_thread) {
Eric Snowfdf282d2019-01-11 14:26:55 -0700515 return 0;
516 }
Eric Snow64d6cc82019-02-23 15:40:43 -0700517 /*
518 * Ensure that the thread isn't currently running some other
519 * interpreter.
520 */
Victor Stinner09532fe2019-05-10 23:39:09 +0200521 PyInterpreterState *interp = _PyRuntimeState_GetThreadState(runtime)->interp;
522 if (interp != runtime->interpreters.main) {
Eric Snow64d6cc82019-02-23 15:40:43 -0700523 return 0;
524 }
Eric Snowfdf282d2019-01-11 14:26:55 -0700525
Victor Stinnere225beb2019-06-03 18:14:24 +0200526 struct _ceval_runtime_state *ceval = &runtime->ceval;
527 UNSIGNAL_PENDING_SIGNALS(ceval);
Eric Snow64d6cc82019-02-23 15:40:43 -0700528 if (_PyErr_CheckSignals() < 0) {
Victor Stinnere225beb2019-06-03 18:14:24 +0200529 SIGNAL_PENDING_SIGNALS(ceval); /* We're not done yet */
Eric Snowfdf282d2019-01-11 14:26:55 -0700530 return -1;
531 }
532 return 0;
533}
534
535static int
Victor Stinnere225beb2019-06-03 18:14:24 +0200536make_pending_calls(_PyRuntimeState *runtime)
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000537{
Eric Snow6a150bc2019-06-01 15:39:46 -0600538 static int busy = 0;
Eric Snowb75b1a352019-04-12 10:20:10 -0600539
Victor Stinnere225beb2019-06-03 18:14:24 +0200540 /* only service pending calls on main thread */
541 if (PyThread_get_thread_ident() != runtime->main_thread) {
542 return 0;
543 }
544
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000545 /* don't perform recursive pending calls */
Eric Snowfdf282d2019-01-11 14:26:55 -0700546 if (busy) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000547 return 0;
Eric Snowfdf282d2019-01-11 14:26:55 -0700548 }
Charles-François Natalif23339a2011-07-23 18:15:43 +0200549 busy = 1;
Victor Stinnere225beb2019-06-03 18:14:24 +0200550 struct _ceval_runtime_state *ceval = &runtime->ceval;
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200551 /* unsignal before starting to call callbacks, so that any callback
552 added in-between re-signals */
Victor Stinnere225beb2019-06-03 18:14:24 +0200553 UNSIGNAL_PENDING_CALLS(ceval);
Eric Snowfdf282d2019-01-11 14:26:55 -0700554 int res = 0;
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200555
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000556 /* perform a bounded number of calls, in case of recursion */
Victor Stinnere225beb2019-06-03 18:14:24 +0200557 struct _pending_calls *pending = &ceval->pending;
Eric Snowfdf282d2019-01-11 14:26:55 -0700558 for (int i=0; i<NPENDINGCALLS; i++) {
Eric Snow5be45a62019-03-08 22:47:07 -0700559 int (*func)(void *) = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000560 void *arg = NULL;
561
562 /* pop one item off the queue while holding the lock */
Eric Snow842a2f02019-03-15 15:47:51 -0600563 PyThread_acquire_lock(pending->lock, WAIT_LOCK);
Victor Stinnere225beb2019-06-03 18:14:24 +0200564 _pop_pending_call(pending, &func, &arg);
Eric Snow842a2f02019-03-15 15:47:51 -0600565 PyThread_release_lock(pending->lock);
Eric Snow5be45a62019-03-08 22:47:07 -0700566
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100567 /* having released the lock, perform the callback */
Eric Snow5be45a62019-03-08 22:47:07 -0700568 if (func == NULL) {
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100569 break;
Eric Snow5be45a62019-03-08 22:47:07 -0700570 }
Eric Snowfdf282d2019-01-11 14:26:55 -0700571 res = func(arg);
572 if (res) {
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200573 goto error;
574 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000575 }
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200576
Charles-François Natalif23339a2011-07-23 18:15:43 +0200577 busy = 0;
Eric Snowfdf282d2019-01-11 14:26:55 -0700578 return res;
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200579
580error:
581 busy = 0;
Victor Stinnere225beb2019-06-03 18:14:24 +0200582 SIGNAL_PENDING_CALLS(ceval);
Eric Snowfdf282d2019-01-11 14:26:55 -0700583 return res;
584}
585
Eric Snow842a2f02019-03-15 15:47:51 -0600586void
Victor Stinner2b1df452020-01-13 18:46:59 +0100587_Py_FinishPendingCalls(PyThreadState *tstate)
Eric Snow842a2f02019-03-15 15:47:51 -0600588{
Eric Snow842a2f02019-03-15 15:47:51 -0600589 assert(PyGILState_Check());
590
Victor Stinner2b1df452020-01-13 18:46:59 +0100591 _PyRuntimeState *runtime = tstate->interp->runtime;
Victor Stinnere225beb2019-06-03 18:14:24 +0200592 struct _pending_calls *pending = &runtime->ceval.pending;
Victor Stinner09532fe2019-05-10 23:39:09 +0200593
Eric Snow842a2f02019-03-15 15:47:51 -0600594 PyThread_acquire_lock(pending->lock, WAIT_LOCK);
595 pending->finishing = 1;
596 PyThread_release_lock(pending->lock);
597
598 if (!_Py_atomic_load_relaxed(&(pending->calls_to_do))) {
599 return;
600 }
601
Victor Stinnere225beb2019-06-03 18:14:24 +0200602 if (make_pending_calls(runtime) < 0) {
603 PyObject *exc, *val, *tb;
604 _PyErr_Fetch(tstate, &exc, &val, &tb);
605 PyErr_BadInternalCall();
606 _PyErr_ChainExceptions(exc, val, tb);
607 _PyErr_Print(tstate);
Eric Snow842a2f02019-03-15 15:47:51 -0600608 }
609}
610
Eric Snowfdf282d2019-01-11 14:26:55 -0700611/* Py_MakePendingCalls() is a simple wrapper for the sake
612 of backward-compatibility. */
613int
614Py_MakePendingCalls(void)
615{
616 assert(PyGILState_Check());
617
618 /* Python signal handler doesn't really queue a callback: it only signals
619 that a signal was received, see _PyEval_SignalReceived(). */
Victor Stinner09532fe2019-05-10 23:39:09 +0200620 _PyRuntimeState *runtime = &_PyRuntime;
621 int res = handle_signals(runtime);
Eric Snowfdf282d2019-01-11 14:26:55 -0700622 if (res != 0) {
623 return res;
624 }
625
Victor Stinnere225beb2019-06-03 18:14:24 +0200626 res = make_pending_calls(runtime);
Eric Snowb75b1a352019-04-12 10:20:10 -0600627 if (res != 0) {
628 return res;
629 }
630
631 return 0;
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000632}
633
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000634/* The interpreter's recursion limit */
635
Hye-Shik Changb6fa2812005-04-04 15:49:02 +0000636#ifndef Py_DEFAULT_RECURSION_LIMIT
637#define Py_DEFAULT_RECURSION_LIMIT 1000
638#endif
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600639
Eric Snow05351c12017-09-05 21:43:08 -0700640int _Py_CheckRecursionLimit = Py_DEFAULT_RECURSION_LIMIT;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000641
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600642void
Victor Stinnere225beb2019-06-03 18:14:24 +0200643_PyEval_Initialize(struct _ceval_runtime_state *state)
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600644{
Victor Stinnere225beb2019-06-03 18:14:24 +0200645 state->recursion_limit = Py_DEFAULT_RECURSION_LIMIT;
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600646 _Py_CheckRecursionLimit = Py_DEFAULT_RECURSION_LIMIT;
Victor Stinnere225beb2019-06-03 18:14:24 +0200647 _gil_initialize(&state->gil);
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600648}
649
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000650int
651Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000652{
Victor Stinner01b1cc12019-11-20 02:27:56 +0100653 struct _ceval_runtime_state *ceval = &_PyRuntime.ceval;
654 return ceval->recursion_limit;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000655}
656
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000657void
658Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000659{
Victor Stinnere225beb2019-06-03 18:14:24 +0200660 struct _ceval_runtime_state *ceval = &_PyRuntime.ceval;
661 ceval->recursion_limit = new_limit;
662 _Py_CheckRecursionLimit = ceval->recursion_limit;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000663}
664
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100665/* The function _Py_EnterRecursiveCall() only calls _Py_CheckRecursiveCall()
Armin Rigo2b3eb402003-10-28 12:05:48 +0000666 if the recursion_depth reaches _Py_CheckRecursionLimit.
667 If USE_STACKCHECK, the macro decrements _Py_CheckRecursionLimit
668 to guarantee that _Py_CheckRecursiveCall() is regularly called.
669 Without USE_STACKCHECK, there is no need for this. */
670int
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100671_Py_CheckRecursiveCall(PyThreadState *tstate, const char *where)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000672{
Victor Stinner01b1cc12019-11-20 02:27:56 +0100673 _PyRuntimeState *runtime = tstate->interp->runtime;
Victor Stinner09532fe2019-05-10 23:39:09 +0200674 int recursion_limit = runtime->ceval.recursion_limit;
Armin Rigo2b3eb402003-10-28 12:05:48 +0000675
676#ifdef USE_STACKCHECK
pdox18967932017-10-25 23:03:01 -0700677 tstate->stackcheck_counter = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000678 if (PyOS_CheckStack()) {
679 --tstate->recursion_depth;
Victor Stinner438a12d2019-05-24 17:01:38 +0200680 _PyErr_SetString(tstate, PyExc_MemoryError, "Stack overflow");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000681 return -1;
682 }
pdox18967932017-10-25 23:03:01 -0700683 /* Needed for ABI backwards-compatibility (see bpo-31857) */
Eric Snow05351c12017-09-05 21:43:08 -0700684 _Py_CheckRecursionLimit = recursion_limit;
pdox18967932017-10-25 23:03:01 -0700685#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000686 if (tstate->recursion_critical)
687 /* Somebody asked that we don't check for recursion. */
688 return 0;
689 if (tstate->overflowed) {
690 if (tstate->recursion_depth > recursion_limit + 50) {
691 /* Overflowing while handling an overflow. Give up. */
692 Py_FatalError("Cannot recover from stack overflow.");
693 }
694 return 0;
695 }
696 if (tstate->recursion_depth > recursion_limit) {
697 --tstate->recursion_depth;
698 tstate->overflowed = 1;
Victor Stinner438a12d2019-05-24 17:01:38 +0200699 _PyErr_Format(tstate, PyExc_RecursionError,
700 "maximum recursion depth exceeded%s",
701 where);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000702 return -1;
703 }
704 return 0;
Armin Rigo2b3eb402003-10-28 12:05:48 +0000705}
706
Victor Stinner09532fe2019-05-10 23:39:09 +0200707static int do_raise(PyThreadState *tstate, PyObject *exc, PyObject *cause);
Victor Stinner438a12d2019-05-24 17:01:38 +0200708static int unpack_iterable(PyThreadState *, PyObject *, int, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000709
Victor Stinnere225beb2019-06-03 18:14:24 +0200710#define _Py_TracingPossible(ceval) ((ceval)->tracing_possible)
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000711
Guido van Rossum374a9221991-04-04 10:40:29 +0000712
Guido van Rossumb209a111997-04-29 18:18:01 +0000713PyObject *
Martin v. Löwis4d0d4712010-12-03 20:14:31 +0000714PyEval_EvalCode(PyObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000715{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000716 return PyEval_EvalCodeEx(co,
717 globals, locals,
718 (PyObject **)NULL, 0,
719 (PyObject **)NULL, 0,
720 (PyObject **)NULL, 0,
721 NULL, NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000722}
723
724
725/* Interpreter main loop */
726
Martin v. Löwis8d97e332004-06-27 15:43:12 +0000727PyObject *
Victor Stinnerb9e68122019-11-14 12:20:46 +0100728PyEval_EvalFrame(PyFrameObject *f)
729{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000730 /* This is for backward compatibility with extension modules that
731 used this API; core interpreter code should call
732 PyEval_EvalFrameEx() */
Victor Stinnerb9e68122019-11-14 12:20:46 +0100733 PyThreadState *tstate = _PyThreadState_GET();
734 return _PyEval_EvalFrame(tstate, f, 0);
Phillip J. Eby0d6615f2005-08-02 00:46:46 +0000735}
736
737PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000738PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
Guido van Rossum374a9221991-04-04 10:40:29 +0000739{
Victor Stinnerb9e68122019-11-14 12:20:46 +0100740 PyThreadState *tstate = _PyThreadState_GET();
741 return _PyEval_EvalFrame(tstate, f, throwflag);
Brett Cannon3cebf932016-09-05 15:33:46 -0700742}
743
Victor Stinnerc6944e72016-11-11 02:13:35 +0100744PyObject* _Py_HOT_FUNCTION
Brett Cannon3cebf932016-09-05 15:33:46 -0700745_PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag)
746{
Guido van Rossum950361c1997-01-24 13:49:28 +0000747#ifdef DXPAIRS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000748 int lastopcode = 0;
Guido van Rossum950361c1997-01-24 13:49:28 +0000749#endif
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200750 PyObject **stack_pointer; /* Next free slot in value stack */
Serhiy Storchakaab874002016-09-11 13:48:15 +0300751 const _Py_CODEUNIT *next_instr;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200752 int opcode; /* Current opcode */
753 int oparg; /* Current opcode argument, if any */
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200754 PyObject **fastlocals, **freevars;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000755 PyObject *retval = NULL; /* Return value */
Victor Stinner09532fe2019-05-10 23:39:09 +0200756 _PyRuntimeState * const runtime = &_PyRuntime;
757 PyThreadState * const tstate = _PyRuntimeState_GetThreadState(runtime);
Victor Stinnere225beb2019-06-03 18:14:24 +0200758 struct _ceval_runtime_state * const ceval = &runtime->ceval;
759 _Py_atomic_int * const eval_breaker = &ceval->eval_breaker;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000760 PyCodeObject *co;
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000761
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000762 /* when tracing we set things up so that
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000763
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000764 not (instr_lb <= current_bytecode_offset < instr_ub)
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000765
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000766 is true when the line being executed has changed. The
767 initial values are such as to make this false the first
768 time it is tested. */
769 int instr_ub = -1, instr_lb = 0, instr_prev = -1;
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000770
Serhiy Storchakaab874002016-09-11 13:48:15 +0300771 const _Py_CODEUNIT *first_instr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000772 PyObject *names;
773 PyObject *consts;
Inada Naoki91234a12019-06-03 21:30:58 +0900774 _PyOpcache *co_opcache;
Guido van Rossum374a9221991-04-04 10:40:29 +0000775
Brett Cannon368b4b72012-04-02 12:17:59 -0400776#ifdef LLTRACE
Victor Stinner3c1e4812012-03-26 22:10:51 +0200777 _Py_IDENTIFIER(__ltrace__);
Brett Cannon368b4b72012-04-02 12:17:59 -0400778#endif
Victor Stinner3c1e4812012-03-26 22:10:51 +0200779
Antoine Pitroub52ec782009-01-25 16:34:23 +0000780/* Computed GOTOs, or
781 the-optimization-commonly-but-improperly-known-as-"threaded code"
782 using gcc's labels-as-values extension
783 (http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html).
784
785 The traditional bytecode evaluation loop uses a "switch" statement, which
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000786 decent compilers will optimize as a single indirect branch instruction
Antoine Pitroub52ec782009-01-25 16:34:23 +0000787 combined with a lookup table of jump addresses. However, since the
788 indirect jump instruction is shared by all opcodes, the CPU will have a
789 hard time making the right prediction for where to jump next (actually,
790 it will be always wrong except in the uncommon case of a sequence of
791 several identical opcodes).
792
793 "Threaded code" in contrast, uses an explicit jump table and an explicit
794 indirect jump instruction at the end of each opcode. Since the jump
795 instruction is at a different address for each opcode, the CPU will make a
796 separate prediction for each of these instructions, which is equivalent to
797 predicting the second opcode of each opcode pair. These predictions have
798 a much better chance to turn out valid, especially in small bytecode loops.
799
800 A mispredicted branch on a modern CPU flushes the whole pipeline and
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000801 can cost several CPU cycles (depending on the pipeline depth),
Antoine Pitroub52ec782009-01-25 16:34:23 +0000802 and potentially many more instructions (depending on the pipeline width).
803 A correctly predicted branch, however, is nearly free.
804
805 At the time of this writing, the "threaded code" version is up to 15-20%
806 faster than the normal "switch" version, depending on the compiler and the
807 CPU architecture.
808
809 We disable the optimization if DYNAMIC_EXECUTION_PROFILE is defined,
810 because it would render the measurements invalid.
811
812
813 NOTE: care must be taken that the compiler doesn't try to "optimize" the
814 indirect jumps by sharing them between all opcodes. Such optimizations
815 can be disabled on gcc by using the -fno-gcse flag (or possibly
816 -fno-crossjumping).
817*/
818
Antoine Pitrou042b1282010-08-13 21:15:58 +0000819#ifdef DYNAMIC_EXECUTION_PROFILE
Antoine Pitroub52ec782009-01-25 16:34:23 +0000820#undef USE_COMPUTED_GOTOS
Antoine Pitrou042b1282010-08-13 21:15:58 +0000821#define USE_COMPUTED_GOTOS 0
Antoine Pitroub52ec782009-01-25 16:34:23 +0000822#endif
823
Antoine Pitrou042b1282010-08-13 21:15:58 +0000824#ifdef HAVE_COMPUTED_GOTOS
825 #ifndef USE_COMPUTED_GOTOS
826 #define USE_COMPUTED_GOTOS 1
827 #endif
828#else
829 #if defined(USE_COMPUTED_GOTOS) && USE_COMPUTED_GOTOS
830 #error "Computed gotos are not supported on this compiler."
831 #endif
832 #undef USE_COMPUTED_GOTOS
833 #define USE_COMPUTED_GOTOS 0
834#endif
835
836#if USE_COMPUTED_GOTOS
Antoine Pitroub52ec782009-01-25 16:34:23 +0000837/* Import the static jump table */
838#include "opcode_targets.h"
839
Antoine Pitroub52ec782009-01-25 16:34:23 +0000840#define TARGET(op) \
Benjamin Petersonddd19492018-09-16 22:38:02 -0700841 op: \
842 TARGET_##op
Antoine Pitroub52ec782009-01-25 16:34:23 +0000843
Antoine Pitroub52ec782009-01-25 16:34:23 +0000844#ifdef LLTRACE
845#define FAST_DISPATCH() \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000846 { \
Victor Stinnere225beb2019-06-03 18:14:24 +0200847 if (!lltrace && !_Py_TracingPossible(ceval) && !PyDTrace_LINE_ENABLED()) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000848 f->f_lasti = INSTR_OFFSET(); \
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +0300849 NEXTOPARG(); \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +0300850 goto *opcode_targets[opcode]; \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000851 } \
852 goto fast_next_opcode; \
853 }
Antoine Pitroub52ec782009-01-25 16:34:23 +0000854#else
855#define FAST_DISPATCH() \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000856 { \
Victor Stinnere225beb2019-06-03 18:14:24 +0200857 if (!_Py_TracingPossible(ceval) && !PyDTrace_LINE_ENABLED()) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000858 f->f_lasti = INSTR_OFFSET(); \
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +0300859 NEXTOPARG(); \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +0300860 goto *opcode_targets[opcode]; \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000861 } \
862 goto fast_next_opcode; \
863 }
Antoine Pitroub52ec782009-01-25 16:34:23 +0000864#endif
865
Victor Stinner09532fe2019-05-10 23:39:09 +0200866#define DISPATCH() \
867 { \
868 if (!_Py_atomic_load_relaxed(eval_breaker)) { \
869 FAST_DISPATCH(); \
870 } \
871 continue; \
872 }
873
Antoine Pitroub52ec782009-01-25 16:34:23 +0000874#else
Benjamin Petersonddd19492018-09-16 22:38:02 -0700875#define TARGET(op) op
Antoine Pitroub52ec782009-01-25 16:34:23 +0000876#define FAST_DISPATCH() goto fast_next_opcode
Victor Stinner09532fe2019-05-10 23:39:09 +0200877#define DISPATCH() continue
Antoine Pitroub52ec782009-01-25 16:34:23 +0000878#endif
879
880
Neal Norwitza81d2202002-07-14 00:27:26 +0000881/* Tuple access macros */
882
883#ifndef Py_DEBUG
884#define GETITEM(v, i) PyTuple_GET_ITEM((PyTupleObject *)(v), (i))
885#else
886#define GETITEM(v, i) PyTuple_GetItem((v), (i))
887#endif
888
Guido van Rossum374a9221991-04-04 10:40:29 +0000889/* Code access macros */
890
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +0300891/* The integer overflow is checked by an assertion below. */
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600892#define INSTR_OFFSET() \
893 (sizeof(_Py_CODEUNIT) * (int)(next_instr - first_instr))
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +0300894#define NEXTOPARG() do { \
Serhiy Storchakaab874002016-09-11 13:48:15 +0300895 _Py_CODEUNIT word = *next_instr; \
896 opcode = _Py_OPCODE(word); \
897 oparg = _Py_OPARG(word); \
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +0300898 next_instr++; \
899 } while (0)
Serhiy Storchakaab874002016-09-11 13:48:15 +0300900#define JUMPTO(x) (next_instr = first_instr + (x) / sizeof(_Py_CODEUNIT))
901#define JUMPBY(x) (next_instr += (x) / sizeof(_Py_CODEUNIT))
Guido van Rossum374a9221991-04-04 10:40:29 +0000902
Raymond Hettingerf606f872003-03-16 03:11:04 +0000903/* OpCode prediction macros
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000904 Some opcodes tend to come in pairs thus making it possible to
905 predict the second code when the first is run. For example,
Serhiy Storchakada9c5132016-06-27 18:58:57 +0300906 COMPARE_OP is often followed by POP_JUMP_IF_FALSE or POP_JUMP_IF_TRUE.
Raymond Hettingerf606f872003-03-16 03:11:04 +0000907
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000908 Verifying the prediction costs a single high-speed test of a register
909 variable against a constant. If the pairing was good, then the
910 processor's own internal branch predication has a high likelihood of
911 success, resulting in a nearly zero-overhead transition to the
912 next opcode. A successful prediction saves a trip through the eval-loop
Serhiy Storchakab0f80b02016-05-24 09:15:14 +0300913 including its unpredictable switch-case branch. Combined with the
914 processor's internal branch prediction, a successful PREDICT has the
915 effect of making the two opcodes run as if they were a single new opcode
916 with the bodies combined.
Raymond Hettingerf606f872003-03-16 03:11:04 +0000917
Georg Brandl86b2fb92008-07-16 03:43:04 +0000918 If collecting opcode statistics, your choices are to either keep the
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000919 predictions turned-on and interpret the results as if some opcodes
920 had been combined or turn-off predictions so that the opcode frequency
921 counter updates for both opcodes.
Antoine Pitroub52ec782009-01-25 16:34:23 +0000922
923 Opcode prediction is disabled with threaded code, since the latter allows
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000924 the CPU to record separate branch prediction information for each
925 opcode.
Antoine Pitroub52ec782009-01-25 16:34:23 +0000926
Raymond Hettingerf606f872003-03-16 03:11:04 +0000927*/
928
Antoine Pitrou042b1282010-08-13 21:15:58 +0000929#if defined(DYNAMIC_EXECUTION_PROFILE) || USE_COMPUTED_GOTOS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000930#define PREDICT(op) if (0) goto PRED_##op
Raymond Hettingera7216982004-02-08 19:59:27 +0000931#else
Serhiy Storchakab0f80b02016-05-24 09:15:14 +0300932#define PREDICT(op) \
933 do{ \
Serhiy Storchakaab874002016-09-11 13:48:15 +0300934 _Py_CODEUNIT word = *next_instr; \
935 opcode = _Py_OPCODE(word); \
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +0300936 if (opcode == op){ \
Serhiy Storchakaab874002016-09-11 13:48:15 +0300937 oparg = _Py_OPARG(word); \
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +0300938 next_instr++; \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +0300939 goto PRED_##op; \
940 } \
941 } while(0)
Antoine Pitroub52ec782009-01-25 16:34:23 +0000942#endif
Serhiy Storchakab0f80b02016-05-24 09:15:14 +0300943#define PREDICTED(op) PRED_##op:
Antoine Pitroub52ec782009-01-25 16:34:23 +0000944
Raymond Hettingerf606f872003-03-16 03:11:04 +0000945
Guido van Rossum374a9221991-04-04 10:40:29 +0000946/* Stack manipulation macros */
947
Martin v. Löwis18e16552006-02-15 17:27:45 +0000948/* The stack can grow at most MAXINT deep, as co_nlocals and
949 co_stacksize are ints. */
Stefan Krahb7e10102010-06-23 18:42:39 +0000950#define STACK_LEVEL() ((int)(stack_pointer - f->f_valuestack))
951#define EMPTY() (STACK_LEVEL() == 0)
952#define TOP() (stack_pointer[-1])
953#define SECOND() (stack_pointer[-2])
954#define THIRD() (stack_pointer[-3])
955#define FOURTH() (stack_pointer[-4])
956#define PEEK(n) (stack_pointer[-(n)])
957#define SET_TOP(v) (stack_pointer[-1] = (v))
958#define SET_SECOND(v) (stack_pointer[-2] = (v))
959#define SET_THIRD(v) (stack_pointer[-3] = (v))
960#define SET_FOURTH(v) (stack_pointer[-4] = (v))
961#define SET_VALUE(n, v) (stack_pointer[-(n)] = (v))
962#define BASIC_STACKADJ(n) (stack_pointer += n)
963#define BASIC_PUSH(v) (*stack_pointer++ = (v))
964#define BASIC_POP() (*--stack_pointer)
Guido van Rossum374a9221991-04-04 10:40:29 +0000965
Guido van Rossum96a42c81992-01-12 02:29:51 +0000966#ifdef LLTRACE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000967#define PUSH(v) { (void)(BASIC_PUSH(v), \
Victor Stinner438a12d2019-05-24 17:01:38 +0200968 lltrace && prtrace(tstate, TOP(), "push")); \
Stefan Krahb7e10102010-06-23 18:42:39 +0000969 assert(STACK_LEVEL() <= co->co_stacksize); }
Victor Stinner438a12d2019-05-24 17:01:38 +0200970#define POP() ((void)(lltrace && prtrace(tstate, TOP(), "pop")), \
Stefan Krahb7e10102010-06-23 18:42:39 +0000971 BASIC_POP())
costypetrisor8ed317f2018-07-31 20:55:14 +0000972#define STACK_GROW(n) do { \
973 assert(n >= 0); \
974 (void)(BASIC_STACKADJ(n), \
Victor Stinner438a12d2019-05-24 17:01:38 +0200975 lltrace && prtrace(tstate, TOP(), "stackadj")); \
costypetrisor8ed317f2018-07-31 20:55:14 +0000976 assert(STACK_LEVEL() <= co->co_stacksize); \
977 } while (0)
978#define STACK_SHRINK(n) do { \
979 assert(n >= 0); \
Victor Stinner438a12d2019-05-24 17:01:38 +0200980 (void)(lltrace && prtrace(tstate, TOP(), "stackadj")); \
costypetrisor8ed317f2018-07-31 20:55:14 +0000981 (void)(BASIC_STACKADJ(-n)); \
982 assert(STACK_LEVEL() <= co->co_stacksize); \
983 } while (0)
Christian Heimes0449f632007-12-15 01:27:15 +0000984#define EXT_POP(STACK_POINTER) ((void)(lltrace && \
Victor Stinner438a12d2019-05-24 17:01:38 +0200985 prtrace(tstate, (STACK_POINTER)[-1], "ext_pop")), \
Stefan Krahb7e10102010-06-23 18:42:39 +0000986 *--(STACK_POINTER))
Guido van Rossum374a9221991-04-04 10:40:29 +0000987#else
Stefan Krahb7e10102010-06-23 18:42:39 +0000988#define PUSH(v) BASIC_PUSH(v)
989#define POP() BASIC_POP()
costypetrisor8ed317f2018-07-31 20:55:14 +0000990#define STACK_GROW(n) BASIC_STACKADJ(n)
991#define STACK_SHRINK(n) BASIC_STACKADJ(-n)
Guido van Rossumc2e20742006-02-27 22:32:47 +0000992#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
Guido van Rossum374a9221991-04-04 10:40:29 +0000993#endif
994
Guido van Rossum681d79a1995-07-18 14:51:37 +0000995/* Local variable macros */
996
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000997#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumcfbf1a32002-03-28 20:17:52 +0000998
999/* The SETLOCAL() macro must not DECREF the local variable in-place and
1000 then store the new value; it must copy the old value to a temporary
1001 value, then store the new value, and then DECREF the temporary value.
1002 This is because it is possible that during the DECREF the frame is
1003 accessed by other code (e.g. a __del__ method or gc.collect()) and the
1004 variable would be pointing to already-freed memory. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001005#define SETLOCAL(i, value) do { PyObject *tmp = GETLOCAL(i); \
Stefan Krahb7e10102010-06-23 18:42:39 +00001006 GETLOCAL(i) = value; \
1007 Py_XDECREF(tmp); } while (0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00001008
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001009
1010#define UNWIND_BLOCK(b) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001011 while (STACK_LEVEL() > (b)->b_level) { \
1012 PyObject *v = POP(); \
1013 Py_XDECREF(v); \
1014 }
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001015
1016#define UNWIND_EXCEPT_HANDLER(b) \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001017 do { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001018 PyObject *type, *value, *traceback; \
Mark Shannonae3087c2017-10-22 22:41:51 +01001019 _PyErr_StackItem *exc_info; \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001020 assert(STACK_LEVEL() >= (b)->b_level + 3); \
1021 while (STACK_LEVEL() > (b)->b_level + 3) { \
1022 value = POP(); \
1023 Py_XDECREF(value); \
1024 } \
Mark Shannonae3087c2017-10-22 22:41:51 +01001025 exc_info = tstate->exc_info; \
1026 type = exc_info->exc_type; \
1027 value = exc_info->exc_value; \
1028 traceback = exc_info->exc_traceback; \
1029 exc_info->exc_type = POP(); \
1030 exc_info->exc_value = POP(); \
1031 exc_info->exc_traceback = POP(); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001032 Py_XDECREF(type); \
1033 Py_XDECREF(value); \
1034 Py_XDECREF(traceback); \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001035 } while(0)
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001036
Inada Naoki91234a12019-06-03 21:30:58 +09001037 /* macros for opcode cache */
1038#define OPCACHE_CHECK() \
1039 do { \
1040 co_opcache = NULL; \
1041 if (co->co_opcache != NULL) { \
1042 unsigned char co_opt_offset = \
1043 co->co_opcache_map[next_instr - first_instr]; \
1044 if (co_opt_offset > 0) { \
1045 assert(co_opt_offset <= co->co_opcache_size); \
1046 co_opcache = &co->co_opcache[co_opt_offset - 1]; \
1047 assert(co_opcache != NULL); \
Inada Naoki91234a12019-06-03 21:30:58 +09001048 } \
1049 } \
1050 } while (0)
1051
1052#if OPCACHE_STATS
1053
1054#define OPCACHE_STAT_GLOBAL_HIT() \
1055 do { \
1056 if (co->co_opcache != NULL) opcache_global_hits++; \
1057 } while (0)
1058
1059#define OPCACHE_STAT_GLOBAL_MISS() \
1060 do { \
1061 if (co->co_opcache != NULL) opcache_global_misses++; \
1062 } while (0)
1063
1064#define OPCACHE_STAT_GLOBAL_OPT() \
1065 do { \
1066 if (co->co_opcache != NULL) opcache_global_opts++; \
1067 } while (0)
1068
1069#else /* OPCACHE_STATS */
1070
1071#define OPCACHE_STAT_GLOBAL_HIT()
1072#define OPCACHE_STAT_GLOBAL_MISS()
1073#define OPCACHE_STAT_GLOBAL_OPT()
1074
1075#endif
1076
Guido van Rossuma027efa1997-05-05 20:56:21 +00001077/* Start of code */
1078
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001079 /* push frame */
Victor Stinnerbe434dc2019-11-05 00:51:22 +01001080 if (_Py_EnterRecursiveCall(tstate, "")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001081 return NULL;
Victor Stinnerbe434dc2019-11-05 00:51:22 +01001082 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001083
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001084 tstate->frame = f;
Tim Peters5ca576e2001-06-18 22:08:13 +00001085
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001086 if (tstate->use_tracing) {
1087 if (tstate->c_tracefunc != NULL) {
1088 /* tstate->c_tracefunc, if defined, is a
1089 function that will be called on *every* entry
1090 to a code block. Its return value, if not
1091 None, is a function that will be called at
1092 the start of each executed line of code.
1093 (Actually, the function must return itself
1094 in order to continue tracing.) The trace
1095 functions are called with three arguments:
1096 a pointer to the current frame, a string
1097 indicating why the function is called, and
1098 an argument which depends on the situation.
1099 The global trace function is also called
1100 whenever an exception is detected. */
1101 if (call_trace_protected(tstate->c_tracefunc,
1102 tstate->c_traceobj,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01001103 tstate, f, PyTrace_CALL, Py_None)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001104 /* Trace function raised an error */
1105 goto exit_eval_frame;
1106 }
1107 }
1108 if (tstate->c_profilefunc != NULL) {
1109 /* Similar for c_profilefunc, except it needn't
1110 return itself and isn't called for "line" events */
1111 if (call_trace_protected(tstate->c_profilefunc,
1112 tstate->c_profileobj,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01001113 tstate, f, PyTrace_CALL, Py_None)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001114 /* Profile function raised an error */
1115 goto exit_eval_frame;
1116 }
1117 }
1118 }
Neil Schemenauer6c0f2002001-09-04 19:03:35 +00001119
Łukasz Langaa785c872016-09-09 17:37:37 -07001120 if (PyDTrace_FUNCTION_ENTRY_ENABLED())
1121 dtrace_function_entry(f);
1122
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001123 co = f->f_code;
1124 names = co->co_names;
1125 consts = co->co_consts;
1126 fastlocals = f->f_localsplus;
1127 freevars = f->f_localsplus + co->co_nlocals;
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001128 assert(PyBytes_Check(co->co_code));
1129 assert(PyBytes_GET_SIZE(co->co_code) <= INT_MAX);
Serhiy Storchakaab874002016-09-11 13:48:15 +03001130 assert(PyBytes_GET_SIZE(co->co_code) % sizeof(_Py_CODEUNIT) == 0);
1131 assert(_Py_IS_ALIGNED(PyBytes_AS_STRING(co->co_code), sizeof(_Py_CODEUNIT)));
1132 first_instr = (_Py_CODEUNIT *) PyBytes_AS_STRING(co->co_code);
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001133 /*
1134 f->f_lasti refers to the index of the last instruction,
1135 unless it's -1 in which case next_instr should be first_instr.
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001136
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001137 YIELD_FROM sets f_lasti to itself, in order to repeatedly yield
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05001138 multiple values.
Thomas Wouters902d6eb2007-01-09 23:18:33 +00001139
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001140 When the PREDICT() macros are enabled, some opcode pairs follow in
1141 direct succession without updating f->f_lasti. A successful
1142 prediction effectively links the two codes together as if they
1143 were a single new opcode; accordingly,f->f_lasti will point to
1144 the first code in the pair (for instance, GET_ITER followed by
1145 FOR_ITER is effectively a single opcode and f->f_lasti will point
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001146 to the beginning of the combined pair.)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001147 */
Serhiy Storchakaab874002016-09-11 13:48:15 +03001148 assert(f->f_lasti >= -1);
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001149 next_instr = first_instr;
1150 if (f->f_lasti >= 0) {
Serhiy Storchakaab874002016-09-11 13:48:15 +03001151 assert(f->f_lasti % sizeof(_Py_CODEUNIT) == 0);
1152 next_instr += f->f_lasti / sizeof(_Py_CODEUNIT) + 1;
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001153 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001154 stack_pointer = f->f_stacktop;
1155 assert(stack_pointer != NULL);
1156 f->f_stacktop = NULL; /* remains NULL unless yield suspends frame */
Antoine Pitrou58720d62013-08-05 23:26:40 +02001157 f->f_executing = 1;
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001158
Inada Naoki91234a12019-06-03 21:30:58 +09001159 if (co->co_opcache_flag < OPCACHE_MIN_RUNS) {
1160 co->co_opcache_flag++;
1161 if (co->co_opcache_flag == OPCACHE_MIN_RUNS) {
1162 if (_PyCode_InitOpcache(co) < 0) {
1163 return NULL;
1164 }
1165#if OPCACHE_STATS
1166 opcache_code_objects_extra_mem +=
1167 PyBytes_Size(co->co_code) / sizeof(_Py_CODEUNIT) +
1168 sizeof(_PyOpcache) * co->co_opcache_size;
1169 opcache_code_objects++;
1170#endif
1171 }
1172 }
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001173
Tim Peters5ca576e2001-06-18 22:08:13 +00001174#ifdef LLTRACE
Victor Stinner3c1e4812012-03-26 22:10:51 +02001175 lltrace = _PyDict_GetItemId(f->f_globals, &PyId___ltrace__) != NULL;
Tim Peters5ca576e2001-06-18 22:08:13 +00001176#endif
Guido van Rossumac7be682001-01-17 15:42:30 +00001177
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001178 if (throwflag) /* support for generator.throw() */
1179 goto error;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001180
Victor Stinnerace47d72013-07-18 01:41:08 +02001181#ifdef Py_DEBUG
1182 /* PyEval_EvalFrameEx() must not be called with an exception set,
Victor Stinnera8cb5152017-01-18 14:12:51 +01001183 because it can clear it (directly or indirectly) and so the
Martin Panter9955a372015-10-07 10:26:23 +00001184 caller loses its exception */
Victor Stinner438a12d2019-05-24 17:01:38 +02001185 assert(!_PyErr_Occurred(tstate));
Victor Stinnerace47d72013-07-18 01:41:08 +02001186#endif
1187
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001188main_loop:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001189 for (;;) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001190 assert(stack_pointer >= f->f_valuestack); /* else underflow */
1191 assert(STACK_LEVEL() <= co->co_stacksize); /* else overflow */
Victor Stinner438a12d2019-05-24 17:01:38 +02001192 assert(!_PyErr_Occurred(tstate));
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001193
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001194 /* Do periodic things. Doing this every time through
1195 the loop would add too much overhead, so we do it
1196 only every Nth instruction. We also do it if
1197 ``pendingcalls_to_do'' is set, i.e. when an asynchronous
1198 event needs attention (e.g. a signal handler or
1199 async I/O handler); see Py_AddPendingCall() and
1200 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +00001201
Eric Snow7bda9de2019-03-08 17:25:54 -07001202 if (_Py_atomic_load_relaxed(eval_breaker)) {
Serhiy Storchaka3f4d90d2018-07-09 15:40:14 +03001203 opcode = _Py_OPCODE(*next_instr);
1204 if (opcode == SETUP_FINALLY ||
1205 opcode == SETUP_WITH ||
1206 opcode == BEFORE_ASYNC_WITH ||
1207 opcode == YIELD_FROM) {
1208 /* Few cases where we skip running signal handlers and other
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07001209 pending calls:
Serhiy Storchaka3f4d90d2018-07-09 15:40:14 +03001210 - If we're about to enter the 'with:'. It will prevent
1211 emitting a resource warning in the common idiom
1212 'with open(path) as file:'.
1213 - If we're about to enter the 'async with:'.
1214 - If we're about to enter the 'try:' of a try/finally (not
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07001215 *very* useful, but might help in some cases and it's
1216 traditional)
1217 - If we're resuming a chain of nested 'yield from' or
1218 'await' calls, then each frame is parked with YIELD_FROM
1219 as its next opcode. If the user hit control-C we want to
1220 wait until we've reached the innermost frame before
1221 running the signal handler and raising KeyboardInterrupt
1222 (see bpo-30039).
1223 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001224 goto fast_next_opcode;
1225 }
Eric Snowfdf282d2019-01-11 14:26:55 -07001226
Victor Stinnere225beb2019-06-03 18:14:24 +02001227 if (_Py_atomic_load_relaxed(&ceval->signals_pending)) {
Victor Stinner09532fe2019-05-10 23:39:09 +02001228 if (handle_signals(runtime) != 0) {
Eric Snowfdf282d2019-01-11 14:26:55 -07001229 goto error;
1230 }
1231 }
Victor Stinnere225beb2019-06-03 18:14:24 +02001232 if (_Py_atomic_load_relaxed(&ceval->pending.calls_to_do)) {
1233 if (make_pending_calls(runtime) != 0) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001234 goto error;
Eric Snowfdf282d2019-01-11 14:26:55 -07001235 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001236 }
Eric Snowfdf282d2019-01-11 14:26:55 -07001237
Victor Stinnere225beb2019-06-03 18:14:24 +02001238 if (_Py_atomic_load_relaxed(&ceval->gil_drop_request)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001239 /* Give another thread a chance */
Victor Stinner09532fe2019-05-10 23:39:09 +02001240 if (_PyThreadState_Swap(&runtime->gilstate, NULL) != tstate) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001241 Py_FatalError("ceval: tstate mix-up");
Victor Stinner09532fe2019-05-10 23:39:09 +02001242 }
Victor Stinnere225beb2019-06-03 18:14:24 +02001243 drop_gil(ceval, tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001244
1245 /* Other threads may run now */
1246
Victor Stinnere225beb2019-06-03 18:14:24 +02001247 take_gil(ceval, tstate);
Benjamin Peterson17548dd2014-06-16 22:59:07 -07001248
1249 /* Check if we should make a quick exit. */
Victor Stinner01b1cc12019-11-20 02:27:56 +01001250 exit_thread_if_finalizing(tstate);
Benjamin Peterson17548dd2014-06-16 22:59:07 -07001251
Victor Stinner09532fe2019-05-10 23:39:09 +02001252 if (_PyThreadState_Swap(&runtime->gilstate, tstate) != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001253 Py_FatalError("ceval: orphan tstate");
Victor Stinner09532fe2019-05-10 23:39:09 +02001254 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001255 }
1256 /* Check for asynchronous exceptions. */
1257 if (tstate->async_exc != NULL) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001258 PyObject *exc = tstate->async_exc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001259 tstate->async_exc = NULL;
Victor Stinnere225beb2019-06-03 18:14:24 +02001260 UNSIGNAL_ASYNC_EXC(ceval);
Victor Stinner438a12d2019-05-24 17:01:38 +02001261 _PyErr_SetNone(tstate, exc);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001262 Py_DECREF(exc);
1263 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001264 }
1265 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001266
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001267 fast_next_opcode:
1268 f->f_lasti = INSTR_OFFSET();
Guido van Rossumac7be682001-01-17 15:42:30 +00001269
Łukasz Langaa785c872016-09-09 17:37:37 -07001270 if (PyDTrace_LINE_ENABLED())
1271 maybe_dtrace_line(f, &instr_lb, &instr_ub, &instr_prev);
1272
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001273 /* line-by-line tracing support */
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001274
Victor Stinnere225beb2019-06-03 18:14:24 +02001275 if (_Py_TracingPossible(ceval) &&
Benjamin Peterson51f46162013-01-23 08:38:47 -05001276 tstate->c_tracefunc != NULL && !tstate->tracing) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001277 int err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001278 /* see maybe_call_line_trace
1279 for expository comments */
1280 f->f_stacktop = stack_pointer;
Tim Peters8a5c3c72004-04-05 19:36:21 +00001281
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001282 err = maybe_call_line_trace(tstate->c_tracefunc,
1283 tstate->c_traceobj,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01001284 tstate, f,
1285 &instr_lb, &instr_ub, &instr_prev);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001286 /* Reload possibly changed frame fields */
1287 JUMPTO(f->f_lasti);
1288 if (f->f_stacktop != NULL) {
1289 stack_pointer = f->f_stacktop;
1290 f->f_stacktop = NULL;
1291 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001292 if (err)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001293 /* trace function raised an exception */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001294 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001295 }
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001296
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001297 /* Extract opcode and argument */
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001298
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001299 NEXTOPARG();
Stefan Krahb7e10102010-06-23 18:42:39 +00001300 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +00001301#ifdef DYNAMIC_EXECUTION_PROFILE
1302#ifdef DXPAIRS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001303 dxpairs[lastopcode][opcode]++;
1304 lastopcode = opcode;
Guido van Rossum950361c1997-01-24 13:49:28 +00001305#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001306 dxp[opcode]++;
Guido van Rossum950361c1997-01-24 13:49:28 +00001307#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001308
Guido van Rossum96a42c81992-01-12 02:29:51 +00001309#ifdef LLTRACE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001310 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +00001311
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001312 if (lltrace) {
1313 if (HAS_ARG(opcode)) {
1314 printf("%d: %d, %d\n",
1315 f->f_lasti, opcode, oparg);
1316 }
1317 else {
1318 printf("%d: %d\n",
1319 f->f_lasti, opcode);
1320 }
1321 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001322#endif
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001323
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001324 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +00001325
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001326 /* BEWARE!
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001327 It is essential that any operation that fails must goto error
1328 and that all operation that succeed call [FAST_]DISPATCH() ! */
Guido van Rossumac7be682001-01-17 15:42:30 +00001329
Benjamin Petersonddd19492018-09-16 22:38:02 -07001330 case TARGET(NOP): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001331 FAST_DISPATCH();
Benjamin Petersonddd19492018-09-16 22:38:02 -07001332 }
Raymond Hettinger9c18e812004-06-21 16:31:15 +00001333
Benjamin Petersonddd19492018-09-16 22:38:02 -07001334 case TARGET(LOAD_FAST): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001335 PyObject *value = GETLOCAL(oparg);
1336 if (value == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02001337 format_exc_check_arg(tstate, PyExc_UnboundLocalError,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001338 UNBOUNDLOCAL_ERROR_MSG,
1339 PyTuple_GetItem(co->co_varnames, oparg));
1340 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001341 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001342 Py_INCREF(value);
1343 PUSH(value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001344 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001345 }
1346
Benjamin Petersonddd19492018-09-16 22:38:02 -07001347 case TARGET(LOAD_CONST): {
1348 PREDICTED(LOAD_CONST);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001349 PyObject *value = GETITEM(consts, oparg);
1350 Py_INCREF(value);
1351 PUSH(value);
1352 FAST_DISPATCH();
1353 }
Neil Schemenauer63543862002-02-17 19:10:14 +00001354
Benjamin Petersonddd19492018-09-16 22:38:02 -07001355 case TARGET(STORE_FAST): {
1356 PREDICTED(STORE_FAST);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001357 PyObject *value = POP();
1358 SETLOCAL(oparg, value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001359 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001360 }
Neil Schemenauer63543862002-02-17 19:10:14 +00001361
Benjamin Petersonddd19492018-09-16 22:38:02 -07001362 case TARGET(POP_TOP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001363 PyObject *value = POP();
1364 Py_DECREF(value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001365 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001366 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001367
Benjamin Petersonddd19492018-09-16 22:38:02 -07001368 case TARGET(ROT_TWO): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001369 PyObject *top = TOP();
1370 PyObject *second = SECOND();
1371 SET_TOP(second);
1372 SET_SECOND(top);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001373 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001374 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001375
Benjamin Petersonddd19492018-09-16 22:38:02 -07001376 case TARGET(ROT_THREE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001377 PyObject *top = TOP();
1378 PyObject *second = SECOND();
1379 PyObject *third = THIRD();
1380 SET_TOP(second);
1381 SET_SECOND(third);
1382 SET_THIRD(top);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001383 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001384 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001385
Benjamin Petersonddd19492018-09-16 22:38:02 -07001386 case TARGET(ROT_FOUR): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001387 PyObject *top = TOP();
1388 PyObject *second = SECOND();
1389 PyObject *third = THIRD();
1390 PyObject *fourth = FOURTH();
1391 SET_TOP(second);
1392 SET_SECOND(third);
1393 SET_THIRD(fourth);
1394 SET_FOURTH(top);
1395 FAST_DISPATCH();
1396 }
1397
Benjamin Petersonddd19492018-09-16 22:38:02 -07001398 case TARGET(DUP_TOP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001399 PyObject *top = TOP();
1400 Py_INCREF(top);
1401 PUSH(top);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001402 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001403 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001404
Benjamin Petersonddd19492018-09-16 22:38:02 -07001405 case TARGET(DUP_TOP_TWO): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001406 PyObject *top = TOP();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001407 PyObject *second = SECOND();
Benjamin Petersonf208df32012-10-12 11:37:56 -04001408 Py_INCREF(top);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001409 Py_INCREF(second);
costypetrisor8ed317f2018-07-31 20:55:14 +00001410 STACK_GROW(2);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001411 SET_TOP(top);
1412 SET_SECOND(second);
Antoine Pitrou74a69fa2010-09-04 18:43:52 +00001413 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001414 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001415
Benjamin Petersonddd19492018-09-16 22:38:02 -07001416 case TARGET(UNARY_POSITIVE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001417 PyObject *value = TOP();
1418 PyObject *res = PyNumber_Positive(value);
1419 Py_DECREF(value);
1420 SET_TOP(res);
1421 if (res == NULL)
1422 goto error;
1423 DISPATCH();
1424 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001425
Benjamin Petersonddd19492018-09-16 22:38:02 -07001426 case TARGET(UNARY_NEGATIVE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001427 PyObject *value = TOP();
1428 PyObject *res = PyNumber_Negative(value);
1429 Py_DECREF(value);
1430 SET_TOP(res);
1431 if (res == NULL)
1432 goto error;
1433 DISPATCH();
1434 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001435
Benjamin Petersonddd19492018-09-16 22:38:02 -07001436 case TARGET(UNARY_NOT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001437 PyObject *value = TOP();
1438 int err = PyObject_IsTrue(value);
1439 Py_DECREF(value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001440 if (err == 0) {
1441 Py_INCREF(Py_True);
1442 SET_TOP(Py_True);
1443 DISPATCH();
1444 }
1445 else if (err > 0) {
1446 Py_INCREF(Py_False);
1447 SET_TOP(Py_False);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001448 DISPATCH();
1449 }
costypetrisor8ed317f2018-07-31 20:55:14 +00001450 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001451 goto error;
1452 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001453
Benjamin Petersonddd19492018-09-16 22:38:02 -07001454 case TARGET(UNARY_INVERT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001455 PyObject *value = TOP();
1456 PyObject *res = PyNumber_Invert(value);
1457 Py_DECREF(value);
1458 SET_TOP(res);
1459 if (res == NULL)
1460 goto error;
1461 DISPATCH();
1462 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001463
Benjamin Petersonddd19492018-09-16 22:38:02 -07001464 case TARGET(BINARY_POWER): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001465 PyObject *exp = POP();
1466 PyObject *base = TOP();
1467 PyObject *res = PyNumber_Power(base, exp, Py_None);
1468 Py_DECREF(base);
1469 Py_DECREF(exp);
1470 SET_TOP(res);
1471 if (res == NULL)
1472 goto error;
1473 DISPATCH();
1474 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001475
Benjamin Petersonddd19492018-09-16 22:38:02 -07001476 case TARGET(BINARY_MULTIPLY): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001477 PyObject *right = POP();
1478 PyObject *left = TOP();
1479 PyObject *res = PyNumber_Multiply(left, right);
1480 Py_DECREF(left);
1481 Py_DECREF(right);
1482 SET_TOP(res);
1483 if (res == NULL)
1484 goto error;
1485 DISPATCH();
1486 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001487
Benjamin Petersonddd19492018-09-16 22:38:02 -07001488 case TARGET(BINARY_MATRIX_MULTIPLY): {
Benjamin Petersond51374e2014-04-09 23:55:56 -04001489 PyObject *right = POP();
1490 PyObject *left = TOP();
1491 PyObject *res = PyNumber_MatrixMultiply(left, right);
1492 Py_DECREF(left);
1493 Py_DECREF(right);
1494 SET_TOP(res);
1495 if (res == NULL)
1496 goto error;
1497 DISPATCH();
1498 }
1499
Benjamin Petersonddd19492018-09-16 22:38:02 -07001500 case TARGET(BINARY_TRUE_DIVIDE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001501 PyObject *divisor = POP();
1502 PyObject *dividend = TOP();
1503 PyObject *quotient = PyNumber_TrueDivide(dividend, divisor);
1504 Py_DECREF(dividend);
1505 Py_DECREF(divisor);
1506 SET_TOP(quotient);
1507 if (quotient == NULL)
1508 goto error;
1509 DISPATCH();
1510 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001511
Benjamin Petersonddd19492018-09-16 22:38:02 -07001512 case TARGET(BINARY_FLOOR_DIVIDE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001513 PyObject *divisor = POP();
1514 PyObject *dividend = TOP();
1515 PyObject *quotient = PyNumber_FloorDivide(dividend, divisor);
1516 Py_DECREF(dividend);
1517 Py_DECREF(divisor);
1518 SET_TOP(quotient);
1519 if (quotient == NULL)
1520 goto error;
1521 DISPATCH();
1522 }
Guido van Rossum4668b002001-08-08 05:00:18 +00001523
Benjamin Petersonddd19492018-09-16 22:38:02 -07001524 case TARGET(BINARY_MODULO): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001525 PyObject *divisor = POP();
1526 PyObject *dividend = TOP();
Martijn Pietersd7e64332017-02-23 13:38:04 +00001527 PyObject *res;
1528 if (PyUnicode_CheckExact(dividend) && (
1529 !PyUnicode_Check(divisor) || PyUnicode_CheckExact(divisor))) {
1530 // fast path; string formatting, but not if the RHS is a str subclass
1531 // (see issue28598)
1532 res = PyUnicode_Format(dividend, divisor);
1533 } else {
1534 res = PyNumber_Remainder(dividend, divisor);
1535 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001536 Py_DECREF(divisor);
1537 Py_DECREF(dividend);
1538 SET_TOP(res);
1539 if (res == NULL)
1540 goto error;
1541 DISPATCH();
1542 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001543
Benjamin Petersonddd19492018-09-16 22:38:02 -07001544 case TARGET(BINARY_ADD): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001545 PyObject *right = POP();
1546 PyObject *left = TOP();
1547 PyObject *sum;
Victor Stinnerd65f42a2016-10-20 12:18:10 +02001548 /* NOTE(haypo): Please don't try to micro-optimize int+int on
1549 CPython using bytecode, it is simply worthless.
1550 See http://bugs.python.org/issue21955 and
1551 http://bugs.python.org/issue10044 for the discussion. In short,
1552 no patch shown any impact on a realistic benchmark, only a minor
1553 speedup on microbenchmarks. */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001554 if (PyUnicode_CheckExact(left) &&
1555 PyUnicode_CheckExact(right)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02001556 sum = unicode_concatenate(tstate, left, right, f, next_instr);
Martin Panter95f53c12016-07-18 08:23:26 +00001557 /* unicode_concatenate consumed the ref to left */
Victor Stinnerd2a915d2011-10-02 20:34:20 +02001558 }
1559 else {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001560 sum = PyNumber_Add(left, right);
1561 Py_DECREF(left);
Victor Stinnerd2a915d2011-10-02 20:34:20 +02001562 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001563 Py_DECREF(right);
1564 SET_TOP(sum);
1565 if (sum == NULL)
1566 goto error;
1567 DISPATCH();
1568 }
1569
Benjamin Petersonddd19492018-09-16 22:38:02 -07001570 case TARGET(BINARY_SUBTRACT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001571 PyObject *right = POP();
1572 PyObject *left = TOP();
1573 PyObject *diff = PyNumber_Subtract(left, right);
1574 Py_DECREF(right);
1575 Py_DECREF(left);
1576 SET_TOP(diff);
1577 if (diff == NULL)
1578 goto error;
1579 DISPATCH();
1580 }
1581
Benjamin Petersonddd19492018-09-16 22:38:02 -07001582 case TARGET(BINARY_SUBSCR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001583 PyObject *sub = POP();
1584 PyObject *container = TOP();
1585 PyObject *res = PyObject_GetItem(container, sub);
1586 Py_DECREF(container);
1587 Py_DECREF(sub);
1588 SET_TOP(res);
1589 if (res == NULL)
1590 goto error;
1591 DISPATCH();
1592 }
1593
Benjamin Petersonddd19492018-09-16 22:38:02 -07001594 case TARGET(BINARY_LSHIFT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001595 PyObject *right = POP();
1596 PyObject *left = TOP();
1597 PyObject *res = PyNumber_Lshift(left, right);
1598 Py_DECREF(left);
1599 Py_DECREF(right);
1600 SET_TOP(res);
1601 if (res == NULL)
1602 goto error;
1603 DISPATCH();
1604 }
1605
Benjamin Petersonddd19492018-09-16 22:38:02 -07001606 case TARGET(BINARY_RSHIFT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001607 PyObject *right = POP();
1608 PyObject *left = TOP();
1609 PyObject *res = PyNumber_Rshift(left, right);
1610 Py_DECREF(left);
1611 Py_DECREF(right);
1612 SET_TOP(res);
1613 if (res == NULL)
1614 goto error;
1615 DISPATCH();
1616 }
1617
Benjamin Petersonddd19492018-09-16 22:38:02 -07001618 case TARGET(BINARY_AND): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001619 PyObject *right = POP();
1620 PyObject *left = TOP();
1621 PyObject *res = PyNumber_And(left, right);
1622 Py_DECREF(left);
1623 Py_DECREF(right);
1624 SET_TOP(res);
1625 if (res == NULL)
1626 goto error;
1627 DISPATCH();
1628 }
1629
Benjamin Petersonddd19492018-09-16 22:38:02 -07001630 case TARGET(BINARY_XOR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001631 PyObject *right = POP();
1632 PyObject *left = TOP();
1633 PyObject *res = PyNumber_Xor(left, right);
1634 Py_DECREF(left);
1635 Py_DECREF(right);
1636 SET_TOP(res);
1637 if (res == NULL)
1638 goto error;
1639 DISPATCH();
1640 }
1641
Benjamin Petersonddd19492018-09-16 22:38:02 -07001642 case TARGET(BINARY_OR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001643 PyObject *right = POP();
1644 PyObject *left = TOP();
1645 PyObject *res = PyNumber_Or(left, right);
1646 Py_DECREF(left);
1647 Py_DECREF(right);
1648 SET_TOP(res);
1649 if (res == NULL)
1650 goto error;
1651 DISPATCH();
1652 }
1653
Benjamin Petersonddd19492018-09-16 22:38:02 -07001654 case TARGET(LIST_APPEND): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001655 PyObject *v = POP();
1656 PyObject *list = PEEK(oparg);
1657 int err;
1658 err = PyList_Append(list, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001659 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001660 if (err != 0)
1661 goto error;
1662 PREDICT(JUMP_ABSOLUTE);
1663 DISPATCH();
1664 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001665
Benjamin Petersonddd19492018-09-16 22:38:02 -07001666 case TARGET(SET_ADD): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001667 PyObject *v = POP();
Raymond Hettinger41862222016-10-15 19:03:06 -07001668 PyObject *set = PEEK(oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001669 int err;
1670 err = PySet_Add(set, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001671 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001672 if (err != 0)
1673 goto error;
1674 PREDICT(JUMP_ABSOLUTE);
1675 DISPATCH();
1676 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001677
Benjamin Petersonddd19492018-09-16 22:38:02 -07001678 case TARGET(INPLACE_POWER): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001679 PyObject *exp = POP();
1680 PyObject *base = TOP();
1681 PyObject *res = PyNumber_InPlacePower(base, exp, Py_None);
1682 Py_DECREF(base);
1683 Py_DECREF(exp);
1684 SET_TOP(res);
1685 if (res == NULL)
1686 goto error;
1687 DISPATCH();
1688 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001689
Benjamin Petersonddd19492018-09-16 22:38:02 -07001690 case TARGET(INPLACE_MULTIPLY): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001691 PyObject *right = POP();
1692 PyObject *left = TOP();
1693 PyObject *res = PyNumber_InPlaceMultiply(left, right);
1694 Py_DECREF(left);
1695 Py_DECREF(right);
1696 SET_TOP(res);
1697 if (res == NULL)
1698 goto error;
1699 DISPATCH();
1700 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001701
Benjamin Petersonddd19492018-09-16 22:38:02 -07001702 case TARGET(INPLACE_MATRIX_MULTIPLY): {
Benjamin Petersond51374e2014-04-09 23:55:56 -04001703 PyObject *right = POP();
1704 PyObject *left = TOP();
1705 PyObject *res = PyNumber_InPlaceMatrixMultiply(left, right);
1706 Py_DECREF(left);
1707 Py_DECREF(right);
1708 SET_TOP(res);
1709 if (res == NULL)
1710 goto error;
1711 DISPATCH();
1712 }
1713
Benjamin Petersonddd19492018-09-16 22:38:02 -07001714 case TARGET(INPLACE_TRUE_DIVIDE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001715 PyObject *divisor = POP();
1716 PyObject *dividend = TOP();
1717 PyObject *quotient = PyNumber_InPlaceTrueDivide(dividend, divisor);
1718 Py_DECREF(dividend);
1719 Py_DECREF(divisor);
1720 SET_TOP(quotient);
1721 if (quotient == NULL)
1722 goto error;
1723 DISPATCH();
1724 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001725
Benjamin Petersonddd19492018-09-16 22:38:02 -07001726 case TARGET(INPLACE_FLOOR_DIVIDE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001727 PyObject *divisor = POP();
1728 PyObject *dividend = TOP();
1729 PyObject *quotient = PyNumber_InPlaceFloorDivide(dividend, divisor);
1730 Py_DECREF(dividend);
1731 Py_DECREF(divisor);
1732 SET_TOP(quotient);
1733 if (quotient == NULL)
1734 goto error;
1735 DISPATCH();
1736 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001737
Benjamin Petersonddd19492018-09-16 22:38:02 -07001738 case TARGET(INPLACE_MODULO): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001739 PyObject *right = POP();
1740 PyObject *left = TOP();
1741 PyObject *mod = PyNumber_InPlaceRemainder(left, right);
1742 Py_DECREF(left);
1743 Py_DECREF(right);
1744 SET_TOP(mod);
1745 if (mod == NULL)
1746 goto error;
1747 DISPATCH();
1748 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001749
Benjamin Petersonddd19492018-09-16 22:38:02 -07001750 case TARGET(INPLACE_ADD): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001751 PyObject *right = POP();
1752 PyObject *left = TOP();
1753 PyObject *sum;
1754 if (PyUnicode_CheckExact(left) && PyUnicode_CheckExact(right)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02001755 sum = unicode_concatenate(tstate, left, right, f, next_instr);
Martin Panter95f53c12016-07-18 08:23:26 +00001756 /* unicode_concatenate consumed the ref to left */
Victor Stinnerd2a915d2011-10-02 20:34:20 +02001757 }
1758 else {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001759 sum = PyNumber_InPlaceAdd(left, right);
1760 Py_DECREF(left);
Victor Stinnerd2a915d2011-10-02 20:34:20 +02001761 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001762 Py_DECREF(right);
1763 SET_TOP(sum);
1764 if (sum == NULL)
1765 goto error;
1766 DISPATCH();
1767 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001768
Benjamin Petersonddd19492018-09-16 22:38:02 -07001769 case TARGET(INPLACE_SUBTRACT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001770 PyObject *right = POP();
1771 PyObject *left = TOP();
1772 PyObject *diff = PyNumber_InPlaceSubtract(left, right);
1773 Py_DECREF(left);
1774 Py_DECREF(right);
1775 SET_TOP(diff);
1776 if (diff == 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(INPLACE_LSHIFT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001782 PyObject *right = POP();
1783 PyObject *left = TOP();
1784 PyObject *res = PyNumber_InPlaceLshift(left, right);
1785 Py_DECREF(left);
1786 Py_DECREF(right);
1787 SET_TOP(res);
1788 if (res == NULL)
1789 goto error;
1790 DISPATCH();
1791 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001792
Benjamin Petersonddd19492018-09-16 22:38:02 -07001793 case TARGET(INPLACE_RSHIFT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001794 PyObject *right = POP();
1795 PyObject *left = TOP();
1796 PyObject *res = PyNumber_InPlaceRshift(left, right);
1797 Py_DECREF(left);
1798 Py_DECREF(right);
1799 SET_TOP(res);
1800 if (res == NULL)
1801 goto error;
1802 DISPATCH();
1803 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001804
Benjamin Petersonddd19492018-09-16 22:38:02 -07001805 case TARGET(INPLACE_AND): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001806 PyObject *right = POP();
1807 PyObject *left = TOP();
1808 PyObject *res = PyNumber_InPlaceAnd(left, right);
1809 Py_DECREF(left);
1810 Py_DECREF(right);
1811 SET_TOP(res);
1812 if (res == NULL)
1813 goto error;
1814 DISPATCH();
1815 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001816
Benjamin Petersonddd19492018-09-16 22:38:02 -07001817 case TARGET(INPLACE_XOR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001818 PyObject *right = POP();
1819 PyObject *left = TOP();
1820 PyObject *res = PyNumber_InPlaceXor(left, right);
1821 Py_DECREF(left);
1822 Py_DECREF(right);
1823 SET_TOP(res);
1824 if (res == NULL)
1825 goto error;
1826 DISPATCH();
1827 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001828
Benjamin Petersonddd19492018-09-16 22:38:02 -07001829 case TARGET(INPLACE_OR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001830 PyObject *right = POP();
1831 PyObject *left = TOP();
1832 PyObject *res = PyNumber_InPlaceOr(left, right);
1833 Py_DECREF(left);
1834 Py_DECREF(right);
1835 SET_TOP(res);
1836 if (res == NULL)
1837 goto error;
1838 DISPATCH();
1839 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001840
Benjamin Petersonddd19492018-09-16 22:38:02 -07001841 case TARGET(STORE_SUBSCR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001842 PyObject *sub = TOP();
1843 PyObject *container = SECOND();
1844 PyObject *v = THIRD();
1845 int err;
costypetrisor8ed317f2018-07-31 20:55:14 +00001846 STACK_SHRINK(3);
Martin Panter95f53c12016-07-18 08:23:26 +00001847 /* container[sub] = v */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001848 err = PyObject_SetItem(container, sub, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001849 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001850 Py_DECREF(container);
1851 Py_DECREF(sub);
1852 if (err != 0)
1853 goto error;
1854 DISPATCH();
1855 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001856
Benjamin Petersonddd19492018-09-16 22:38:02 -07001857 case TARGET(DELETE_SUBSCR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001858 PyObject *sub = TOP();
1859 PyObject *container = SECOND();
1860 int err;
costypetrisor8ed317f2018-07-31 20:55:14 +00001861 STACK_SHRINK(2);
Martin Panter95f53c12016-07-18 08:23:26 +00001862 /* del container[sub] */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001863 err = PyObject_DelItem(container, sub);
1864 Py_DECREF(container);
1865 Py_DECREF(sub);
1866 if (err != 0)
1867 goto error;
1868 DISPATCH();
1869 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001870
Benjamin Petersonddd19492018-09-16 22:38:02 -07001871 case TARGET(PRINT_EXPR): {
Victor Stinnercab75e32013-11-06 22:38:37 +01001872 _Py_IDENTIFIER(displayhook);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001873 PyObject *value = POP();
Victor Stinnercab75e32013-11-06 22:38:37 +01001874 PyObject *hook = _PySys_GetObjectId(&PyId_displayhook);
Benjamin Petersonfe1bcb62012-10-12 11:40:01 -04001875 PyObject *res;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001876 if (hook == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02001877 _PyErr_SetString(tstate, PyExc_RuntimeError,
1878 "lost sys.displayhook");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001879 Py_DECREF(value);
1880 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001881 }
Jeroen Demeyer196a5302019-07-04 12:31:34 +02001882 res = _PyObject_CallOneArg(hook, value);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001883 Py_DECREF(value);
1884 if (res == NULL)
1885 goto error;
1886 Py_DECREF(res);
1887 DISPATCH();
1888 }
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001889
Benjamin Petersonddd19492018-09-16 22:38:02 -07001890 case TARGET(RAISE_VARARGS): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001891 PyObject *cause = NULL, *exc = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001892 switch (oparg) {
1893 case 2:
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001894 cause = POP(); /* cause */
Stefan Krahf432a322017-08-21 13:09:59 +02001895 /* fall through */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001896 case 1:
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001897 exc = POP(); /* exc */
Stefan Krahf432a322017-08-21 13:09:59 +02001898 /* fall through */
1899 case 0:
Victor Stinner09532fe2019-05-10 23:39:09 +02001900 if (do_raise(tstate, exc, cause)) {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001901 goto exception_unwind;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001902 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001903 break;
1904 default:
Victor Stinner438a12d2019-05-24 17:01:38 +02001905 _PyErr_SetString(tstate, PyExc_SystemError,
1906 "bad RAISE_VARARGS oparg");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001907 break;
1908 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001909 goto error;
1910 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001911
Benjamin Petersonddd19492018-09-16 22:38:02 -07001912 case TARGET(RETURN_VALUE): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001913 retval = POP();
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001914 assert(f->f_iblock == 0);
Mark Shannone7c9f4a2020-01-13 12:51:26 +00001915 assert(EMPTY());
1916 goto exiting;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001917 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001918
Benjamin Petersonddd19492018-09-16 22:38:02 -07001919 case TARGET(GET_AITER): {
Yury Selivanov6ef05902015-05-28 11:21:31 -04001920 unaryfunc getter = NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04001921 PyObject *iter = NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04001922 PyObject *obj = TOP();
1923 PyTypeObject *type = Py_TYPE(obj);
1924
Yury Selivanova6f6edb2016-06-09 15:08:31 -04001925 if (type->tp_as_async != NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04001926 getter = type->tp_as_async->am_aiter;
Yury Selivanova6f6edb2016-06-09 15:08:31 -04001927 }
Yury Selivanov75445082015-05-11 22:57:16 -04001928
1929 if (getter != NULL) {
1930 iter = (*getter)(obj);
1931 Py_DECREF(obj);
1932 if (iter == NULL) {
1933 SET_TOP(NULL);
1934 goto error;
1935 }
1936 }
1937 else {
1938 SET_TOP(NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02001939 _PyErr_Format(tstate, PyExc_TypeError,
1940 "'async for' requires an object with "
1941 "__aiter__ method, got %.100s",
1942 type->tp_name);
Yury Selivanov75445082015-05-11 22:57:16 -04001943 Py_DECREF(obj);
1944 goto error;
1945 }
1946
Yury Selivanovfaa135a2017-10-06 02:08:57 -04001947 if (Py_TYPE(iter)->tp_as_async == NULL ||
1948 Py_TYPE(iter)->tp_as_async->am_anext == NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04001949
Yury Selivanov398ff912017-03-02 22:20:00 -05001950 SET_TOP(NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02001951 _PyErr_Format(tstate, PyExc_TypeError,
1952 "'async for' received an object from __aiter__ "
1953 "that does not implement __anext__: %.100s",
1954 Py_TYPE(iter)->tp_name);
Yury Selivanov75445082015-05-11 22:57:16 -04001955 Py_DECREF(iter);
1956 goto error;
Yury Selivanova6f6edb2016-06-09 15:08:31 -04001957 }
1958
Yury Selivanovfaa135a2017-10-06 02:08:57 -04001959 SET_TOP(iter);
Yury Selivanov75445082015-05-11 22:57:16 -04001960 DISPATCH();
1961 }
1962
Benjamin Petersonddd19492018-09-16 22:38:02 -07001963 case TARGET(GET_ANEXT): {
Yury Selivanov6ef05902015-05-28 11:21:31 -04001964 unaryfunc getter = NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04001965 PyObject *next_iter = NULL;
1966 PyObject *awaitable = NULL;
1967 PyObject *aiter = TOP();
1968 PyTypeObject *type = Py_TYPE(aiter);
1969
Yury Selivanoveb636452016-09-08 22:01:51 -07001970 if (PyAsyncGen_CheckExact(aiter)) {
1971 awaitable = type->tp_as_async->am_anext(aiter);
1972 if (awaitable == NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04001973 goto error;
1974 }
Yury Selivanoveb636452016-09-08 22:01:51 -07001975 } else {
1976 if (type->tp_as_async != NULL){
1977 getter = type->tp_as_async->am_anext;
1978 }
Yury Selivanov75445082015-05-11 22:57:16 -04001979
Yury Selivanoveb636452016-09-08 22:01:51 -07001980 if (getter != NULL) {
1981 next_iter = (*getter)(aiter);
1982 if (next_iter == NULL) {
1983 goto error;
1984 }
1985 }
1986 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02001987 _PyErr_Format(tstate, PyExc_TypeError,
1988 "'async for' requires an iterator with "
1989 "__anext__ method, got %.100s",
1990 type->tp_name);
Yury Selivanoveb636452016-09-08 22:01:51 -07001991 goto error;
1992 }
Yury Selivanov75445082015-05-11 22:57:16 -04001993
Yury Selivanoveb636452016-09-08 22:01:51 -07001994 awaitable = _PyCoro_GetAwaitableIter(next_iter);
1995 if (awaitable == NULL) {
Yury Selivanov398ff912017-03-02 22:20:00 -05001996 _PyErr_FormatFromCause(
Yury Selivanoveb636452016-09-08 22:01:51 -07001997 PyExc_TypeError,
1998 "'async for' received an invalid object "
1999 "from __anext__: %.100s",
2000 Py_TYPE(next_iter)->tp_name);
2001
2002 Py_DECREF(next_iter);
2003 goto error;
2004 } else {
2005 Py_DECREF(next_iter);
2006 }
2007 }
Yury Selivanov75445082015-05-11 22:57:16 -04002008
2009 PUSH(awaitable);
Serhiy Storchakada9c5132016-06-27 18:58:57 +03002010 PREDICT(LOAD_CONST);
Yury Selivanov75445082015-05-11 22:57:16 -04002011 DISPATCH();
2012 }
2013
Benjamin Petersonddd19492018-09-16 22:38:02 -07002014 case TARGET(GET_AWAITABLE): {
2015 PREDICTED(GET_AWAITABLE);
Yury Selivanov75445082015-05-11 22:57:16 -04002016 PyObject *iterable = TOP();
Yury Selivanov5376ba92015-06-22 12:19:30 -04002017 PyObject *iter = _PyCoro_GetAwaitableIter(iterable);
Yury Selivanov75445082015-05-11 22:57:16 -04002018
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03002019 if (iter == NULL) {
Mark Shannonfee55262019-11-21 09:11:43 +00002020 int opcode_at_minus_3 = 0;
2021 if ((next_instr - first_instr) > 2) {
2022 opcode_at_minus_3 = _Py_OPCODE(next_instr[-3]);
2023 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002024 format_awaitable_error(tstate, Py_TYPE(iterable),
Mark Shannonfee55262019-11-21 09:11:43 +00002025 opcode_at_minus_3,
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03002026 _Py_OPCODE(next_instr[-2]));
2027 }
2028
Yury Selivanov75445082015-05-11 22:57:16 -04002029 Py_DECREF(iterable);
2030
Yury Selivanovc724bae2016-03-02 11:30:46 -05002031 if (iter != NULL && PyCoro_CheckExact(iter)) {
2032 PyObject *yf = _PyGen_yf((PyGenObject*)iter);
2033 if (yf != NULL) {
2034 /* `iter` is a coroutine object that is being
2035 awaited, `yf` is a pointer to the current awaitable
2036 being awaited on. */
2037 Py_DECREF(yf);
2038 Py_CLEAR(iter);
Victor Stinner438a12d2019-05-24 17:01:38 +02002039 _PyErr_SetString(tstate, PyExc_RuntimeError,
2040 "coroutine is being awaited already");
Yury Selivanovc724bae2016-03-02 11:30:46 -05002041 /* The code below jumps to `error` if `iter` is NULL. */
2042 }
2043 }
2044
Yury Selivanov75445082015-05-11 22:57:16 -04002045 SET_TOP(iter); /* Even if it's NULL */
2046
2047 if (iter == NULL) {
2048 goto error;
2049 }
2050
Serhiy Storchakada9c5132016-06-27 18:58:57 +03002051 PREDICT(LOAD_CONST);
Yury Selivanov75445082015-05-11 22:57:16 -04002052 DISPATCH();
2053 }
2054
Benjamin Petersonddd19492018-09-16 22:38:02 -07002055 case TARGET(YIELD_FROM): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002056 PyObject *v = POP();
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07002057 PyObject *receiver = TOP();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002058 int err;
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07002059 if (PyGen_CheckExact(receiver) || PyCoro_CheckExact(receiver)) {
2060 retval = _PyGen_Send((PyGenObject *)receiver, v);
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05002061 } else {
Benjamin Peterson302e7902012-03-20 23:17:04 -04002062 _Py_IDENTIFIER(send);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002063 if (v == Py_None)
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07002064 retval = Py_TYPE(receiver)->tp_iternext(receiver);
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05002065 else
Jeroen Demeyer59ad1102019-07-11 10:59:05 +02002066 retval = _PyObject_CallMethodIdOneArg(receiver, &PyId_send, v);
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05002067 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002068 Py_DECREF(v);
2069 if (retval == NULL) {
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05002070 PyObject *val;
Guido van Rossum8820c232013-11-21 11:30:06 -08002071 if (tstate->c_tracefunc != NULL
Victor Stinner438a12d2019-05-24 17:01:38 +02002072 && _PyErr_ExceptionMatches(tstate, PyExc_StopIteration))
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01002073 call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj, tstate, f);
Nick Coghlanc40bc092012-06-17 15:15:49 +10002074 err = _PyGen_FetchStopIterationValue(&val);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002075 if (err < 0)
2076 goto error;
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07002077 Py_DECREF(receiver);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002078 SET_TOP(val);
2079 DISPATCH();
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002080 }
Martin Panter95f53c12016-07-18 08:23:26 +00002081 /* receiver remains on stack, retval is value to be yielded */
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002082 f->f_stacktop = stack_pointer;
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05002083 /* and repeat... */
Victor Stinnerf7d199f2016-11-24 22:33:01 +01002084 assert(f->f_lasti >= (int)sizeof(_Py_CODEUNIT));
Serhiy Storchakaab874002016-09-11 13:48:15 +03002085 f->f_lasti -= sizeof(_Py_CODEUNIT);
Mark Shannone7c9f4a2020-01-13 12:51:26 +00002086 goto exiting;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002087 }
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002088
Benjamin Petersonddd19492018-09-16 22:38:02 -07002089 case TARGET(YIELD_VALUE): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002090 retval = POP();
Yury Selivanoveb636452016-09-08 22:01:51 -07002091
2092 if (co->co_flags & CO_ASYNC_GENERATOR) {
2093 PyObject *w = _PyAsyncGenValueWrapperNew(retval);
2094 Py_DECREF(retval);
2095 if (w == NULL) {
2096 retval = NULL;
2097 goto error;
2098 }
2099 retval = w;
2100 }
2101
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002102 f->f_stacktop = stack_pointer;
Mark Shannone7c9f4a2020-01-13 12:51:26 +00002103 goto exiting;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002104 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002105
Benjamin Petersonddd19492018-09-16 22:38:02 -07002106 case TARGET(POP_EXCEPT): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002107 PyObject *type, *value, *traceback;
2108 _PyErr_StackItem *exc_info;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002109 PyTryBlock *b = PyFrame_BlockPop(f);
2110 if (b->b_type != EXCEPT_HANDLER) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002111 _PyErr_SetString(tstate, PyExc_SystemError,
2112 "popped block is not an except handler");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002113 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002114 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002115 assert(STACK_LEVEL() >= (b)->b_level + 3 &&
2116 STACK_LEVEL() <= (b)->b_level + 4);
2117 exc_info = tstate->exc_info;
2118 type = exc_info->exc_type;
2119 value = exc_info->exc_value;
2120 traceback = exc_info->exc_traceback;
2121 exc_info->exc_type = POP();
2122 exc_info->exc_value = POP();
2123 exc_info->exc_traceback = POP();
2124 Py_XDECREF(type);
2125 Py_XDECREF(value);
2126 Py_XDECREF(traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002127 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002128 }
Benjamin Petersoneec3d712008-06-11 15:59:43 +00002129
Benjamin Petersonddd19492018-09-16 22:38:02 -07002130 case TARGET(POP_BLOCK): {
2131 PREDICTED(POP_BLOCK);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002132 PyFrame_BlockPop(f);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002133 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002134 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002135
Mark Shannonfee55262019-11-21 09:11:43 +00002136 case TARGET(RERAISE): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002137 PyObject *exc = POP();
Mark Shannonfee55262019-11-21 09:11:43 +00002138 PyObject *val = POP();
2139 PyObject *tb = POP();
2140 assert(PyExceptionClass_Check(exc));
2141 PyErr_Restore(exc, val, tb);
2142 goto exception_unwind;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002143 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002144
Benjamin Petersonddd19492018-09-16 22:38:02 -07002145 case TARGET(END_ASYNC_FOR): {
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002146 PyObject *exc = POP();
2147 assert(PyExceptionClass_Check(exc));
2148 if (PyErr_GivenExceptionMatches(exc, PyExc_StopAsyncIteration)) {
2149 PyTryBlock *b = PyFrame_BlockPop(f);
2150 assert(b->b_type == EXCEPT_HANDLER);
2151 Py_DECREF(exc);
2152 UNWIND_EXCEPT_HANDLER(b);
2153 Py_DECREF(POP());
2154 JUMPBY(oparg);
2155 FAST_DISPATCH();
2156 }
2157 else {
2158 PyObject *val = POP();
2159 PyObject *tb = POP();
Victor Stinner438a12d2019-05-24 17:01:38 +02002160 _PyErr_Restore(tstate, exc, val, tb);
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002161 goto exception_unwind;
2162 }
2163 }
2164
Zackery Spytzce6a0702019-08-25 03:44:09 -06002165 case TARGET(LOAD_ASSERTION_ERROR): {
2166 PyObject *value = PyExc_AssertionError;
2167 Py_INCREF(value);
2168 PUSH(value);
2169 FAST_DISPATCH();
2170 }
2171
Benjamin Petersonddd19492018-09-16 22:38:02 -07002172 case TARGET(LOAD_BUILD_CLASS): {
Victor Stinner3c1e4812012-03-26 22:10:51 +02002173 _Py_IDENTIFIER(__build_class__);
Victor Stinnerb0b22422012-04-19 00:57:45 +02002174
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002175 PyObject *bc;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002176 if (PyDict_CheckExact(f->f_builtins)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002177 bc = _PyDict_GetItemIdWithError(f->f_builtins, &PyId___build_class__);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002178 if (bc == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002179 if (!_PyErr_Occurred(tstate)) {
2180 _PyErr_SetString(tstate, PyExc_NameError,
2181 "__build_class__ not found");
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002182 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002183 goto error;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002184 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002185 Py_INCREF(bc);
Victor Stinnerb0b22422012-04-19 00:57:45 +02002186 }
2187 else {
2188 PyObject *build_class_str = _PyUnicode_FromId(&PyId___build_class__);
2189 if (build_class_str == NULL)
Serhiy Storchaka70b72f02016-11-08 23:12:46 +02002190 goto error;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002191 bc = PyObject_GetItem(f->f_builtins, build_class_str);
2192 if (bc == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002193 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError))
2194 _PyErr_SetString(tstate, PyExc_NameError,
2195 "__build_class__ not found");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002196 goto error;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002197 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002198 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002199 PUSH(bc);
Benjamin Peterson00f86f22012-10-10 14:10:33 -04002200 DISPATCH();
Victor Stinner3c1e4812012-03-26 22:10:51 +02002201 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002202
Benjamin Petersonddd19492018-09-16 22:38:02 -07002203 case TARGET(STORE_NAME): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002204 PyObject *name = GETITEM(names, oparg);
2205 PyObject *v = POP();
2206 PyObject *ns = f->f_locals;
2207 int err;
2208 if (ns == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002209 _PyErr_Format(tstate, PyExc_SystemError,
2210 "no locals found when storing %R", name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002211 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002212 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002213 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002214 if (PyDict_CheckExact(ns))
2215 err = PyDict_SetItem(ns, name, v);
2216 else
2217 err = PyObject_SetItem(ns, name, v);
2218 Py_DECREF(v);
2219 if (err != 0)
2220 goto error;
2221 DISPATCH();
2222 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002223
Benjamin Petersonddd19492018-09-16 22:38:02 -07002224 case TARGET(DELETE_NAME): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002225 PyObject *name = GETITEM(names, oparg);
2226 PyObject *ns = f->f_locals;
2227 int err;
2228 if (ns == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002229 _PyErr_Format(tstate, PyExc_SystemError,
2230 "no locals when deleting %R", name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002231 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002232 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002233 err = PyObject_DelItem(ns, name);
2234 if (err != 0) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002235 format_exc_check_arg(tstate, PyExc_NameError,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002236 NAME_ERROR_MSG,
2237 name);
2238 goto error;
2239 }
2240 DISPATCH();
2241 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00002242
Benjamin Petersonddd19492018-09-16 22:38:02 -07002243 case TARGET(UNPACK_SEQUENCE): {
2244 PREDICTED(UNPACK_SEQUENCE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002245 PyObject *seq = POP(), *item, **items;
2246 if (PyTuple_CheckExact(seq) &&
2247 PyTuple_GET_SIZE(seq) == oparg) {
2248 items = ((PyTupleObject *)seq)->ob_item;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002249 while (oparg--) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002250 item = items[oparg];
2251 Py_INCREF(item);
2252 PUSH(item);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002253 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002254 } else if (PyList_CheckExact(seq) &&
2255 PyList_GET_SIZE(seq) == oparg) {
2256 items = ((PyListObject *)seq)->ob_item;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002257 while (oparg--) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002258 item = items[oparg];
2259 Py_INCREF(item);
2260 PUSH(item);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002261 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002262 } else if (unpack_iterable(tstate, seq, oparg, -1,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002263 stack_pointer + oparg)) {
costypetrisor8ed317f2018-07-31 20:55:14 +00002264 STACK_GROW(oparg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002265 } else {
2266 /* unpack_iterable() raised an exception */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002267 Py_DECREF(seq);
2268 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002269 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002270 Py_DECREF(seq);
Benjamin Peterson00f86f22012-10-10 14:10:33 -04002271 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002272 }
Guido van Rossum0368b722007-05-11 16:50:42 +00002273
Benjamin Petersonddd19492018-09-16 22:38:02 -07002274 case TARGET(UNPACK_EX): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002275 int totalargs = 1 + (oparg & 0xFF) + (oparg >> 8);
2276 PyObject *seq = POP();
2277
Victor Stinner438a12d2019-05-24 17:01:38 +02002278 if (unpack_iterable(tstate, seq, oparg & 0xFF, oparg >> 8,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002279 stack_pointer + totalargs)) {
2280 stack_pointer += totalargs;
2281 } else {
2282 Py_DECREF(seq);
2283 goto error;
2284 }
2285 Py_DECREF(seq);
2286 DISPATCH();
2287 }
2288
Benjamin Petersonddd19492018-09-16 22:38:02 -07002289 case TARGET(STORE_ATTR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002290 PyObject *name = GETITEM(names, oparg);
2291 PyObject *owner = TOP();
2292 PyObject *v = SECOND();
2293 int err;
costypetrisor8ed317f2018-07-31 20:55:14 +00002294 STACK_SHRINK(2);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002295 err = PyObject_SetAttr(owner, name, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002296 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002297 Py_DECREF(owner);
2298 if (err != 0)
2299 goto error;
2300 DISPATCH();
2301 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002302
Benjamin Petersonddd19492018-09-16 22:38:02 -07002303 case TARGET(DELETE_ATTR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002304 PyObject *name = GETITEM(names, oparg);
2305 PyObject *owner = POP();
2306 int err;
2307 err = PyObject_SetAttr(owner, name, (PyObject *)NULL);
2308 Py_DECREF(owner);
2309 if (err != 0)
2310 goto error;
2311 DISPATCH();
2312 }
2313
Benjamin Petersonddd19492018-09-16 22:38:02 -07002314 case TARGET(STORE_GLOBAL): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002315 PyObject *name = GETITEM(names, oparg);
2316 PyObject *v = POP();
2317 int err;
2318 err = PyDict_SetItem(f->f_globals, name, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002319 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002320 if (err != 0)
2321 goto error;
2322 DISPATCH();
2323 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002324
Benjamin Petersonddd19492018-09-16 22:38:02 -07002325 case TARGET(DELETE_GLOBAL): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002326 PyObject *name = GETITEM(names, oparg);
2327 int err;
2328 err = PyDict_DelItem(f->f_globals, name);
2329 if (err != 0) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002330 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
2331 format_exc_check_arg(tstate, PyExc_NameError,
2332 NAME_ERROR_MSG, name);
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002333 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002334 goto error;
Benjamin Peterson00f86f22012-10-10 14:10:33 -04002335 }
2336 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002337 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002338
Benjamin Petersonddd19492018-09-16 22:38:02 -07002339 case TARGET(LOAD_NAME): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002340 PyObject *name = GETITEM(names, oparg);
2341 PyObject *locals = f->f_locals;
2342 PyObject *v;
2343 if (locals == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002344 _PyErr_Format(tstate, PyExc_SystemError,
2345 "no locals when loading %R", name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002346 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002347 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002348 if (PyDict_CheckExact(locals)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002349 v = PyDict_GetItemWithError(locals, name);
2350 if (v != NULL) {
2351 Py_INCREF(v);
2352 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002353 else if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002354 goto error;
2355 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002356 }
2357 else {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002358 v = PyObject_GetItem(locals, name);
Victor Stinnere20310f2015-11-05 13:56:58 +01002359 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002360 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError))
Benjamin Peterson92722792012-12-15 12:51:05 -05002361 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02002362 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002363 }
2364 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002365 if (v == NULL) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002366 v = PyDict_GetItemWithError(f->f_globals, name);
2367 if (v != NULL) {
2368 Py_INCREF(v);
2369 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002370 else if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002371 goto error;
2372 }
2373 else {
Victor Stinnerb0b22422012-04-19 00:57:45 +02002374 if (PyDict_CheckExact(f->f_builtins)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002375 v = PyDict_GetItemWithError(f->f_builtins, name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002376 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002377 if (!_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002378 format_exc_check_arg(
Victor Stinner438a12d2019-05-24 17:01:38 +02002379 tstate, PyExc_NameError,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002380 NAME_ERROR_MSG, name);
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002381 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002382 goto error;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002383 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002384 Py_INCREF(v);
Victor Stinnerb0b22422012-04-19 00:57:45 +02002385 }
2386 else {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002387 v = PyObject_GetItem(f->f_builtins, name);
2388 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002389 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Victor Stinnerb0b22422012-04-19 00:57:45 +02002390 format_exc_check_arg(
Victor Stinner438a12d2019-05-24 17:01:38 +02002391 tstate, PyExc_NameError,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002392 NAME_ERROR_MSG, name);
Victor Stinner438a12d2019-05-24 17:01:38 +02002393 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002394 goto error;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002395 }
Benjamin Peterson20f9c3c2010-07-20 22:39:34 +00002396 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002397 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002398 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002399 PUSH(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002400 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002401 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002402
Benjamin Petersonddd19492018-09-16 22:38:02 -07002403 case TARGET(LOAD_GLOBAL): {
Inada Naoki91234a12019-06-03 21:30:58 +09002404 PyObject *name;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002405 PyObject *v;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002406 if (PyDict_CheckExact(f->f_globals)
Victor Stinnerb4efc962015-11-20 09:24:02 +01002407 && PyDict_CheckExact(f->f_builtins))
2408 {
Inada Naoki91234a12019-06-03 21:30:58 +09002409 OPCACHE_CHECK();
2410 if (co_opcache != NULL && co_opcache->optimized > 0) {
2411 _PyOpcache_LoadGlobal *lg = &co_opcache->u.lg;
2412
2413 if (lg->globals_ver ==
2414 ((PyDictObject *)f->f_globals)->ma_version_tag
2415 && lg->builtins_ver ==
2416 ((PyDictObject *)f->f_builtins)->ma_version_tag)
2417 {
2418 PyObject *ptr = lg->ptr;
2419 OPCACHE_STAT_GLOBAL_HIT();
2420 assert(ptr != NULL);
2421 Py_INCREF(ptr);
2422 PUSH(ptr);
2423 DISPATCH();
2424 }
2425 }
2426
2427 name = GETITEM(names, oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002428 v = _PyDict_LoadGlobal((PyDictObject *)f->f_globals,
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002429 (PyDictObject *)f->f_builtins,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002430 name);
2431 if (v == NULL) {
Victor Stinnerb4efc962015-11-20 09:24:02 +01002432 if (!_PyErr_OCCURRED()) {
2433 /* _PyDict_LoadGlobal() returns NULL without raising
2434 * an exception if the key doesn't exist */
Victor Stinner438a12d2019-05-24 17:01:38 +02002435 format_exc_check_arg(tstate, PyExc_NameError,
Ezio Melotti04a29552013-03-03 15:12:44 +02002436 NAME_ERROR_MSG, name);
Victor Stinnerb4efc962015-11-20 09:24:02 +01002437 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002438 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002439 }
Inada Naoki91234a12019-06-03 21:30:58 +09002440
2441 if (co_opcache != NULL) {
2442 _PyOpcache_LoadGlobal *lg = &co_opcache->u.lg;
2443
2444 if (co_opcache->optimized == 0) {
2445 /* Wasn't optimized before. */
2446 OPCACHE_STAT_GLOBAL_OPT();
2447 } else {
2448 OPCACHE_STAT_GLOBAL_MISS();
2449 }
2450
2451 co_opcache->optimized = 1;
2452 lg->globals_ver =
2453 ((PyDictObject *)f->f_globals)->ma_version_tag;
2454 lg->builtins_ver =
2455 ((PyDictObject *)f->f_builtins)->ma_version_tag;
2456 lg->ptr = v; /* borrowed */
2457 }
2458
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002459 Py_INCREF(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002460 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002461 else {
2462 /* Slow-path if globals or builtins is not a dict */
Victor Stinnerb4efc962015-11-20 09:24:02 +01002463
2464 /* namespace 1: globals */
Inada Naoki91234a12019-06-03 21:30:58 +09002465 name = GETITEM(names, oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002466 v = PyObject_GetItem(f->f_globals, name);
2467 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002468 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Victor Stinner60a1d3c2015-11-05 13:55:20 +01002469 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02002470 }
2471 _PyErr_Clear(tstate);
Victor Stinner60a1d3c2015-11-05 13:55:20 +01002472
Victor Stinnerb4efc962015-11-20 09:24:02 +01002473 /* namespace 2: builtins */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002474 v = PyObject_GetItem(f->f_builtins, name);
2475 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002476 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002477 format_exc_check_arg(
Victor Stinner438a12d2019-05-24 17:01:38 +02002478 tstate, PyExc_NameError,
Ezio Melotti04a29552013-03-03 15:12:44 +02002479 NAME_ERROR_MSG, name);
Victor Stinner438a12d2019-05-24 17:01:38 +02002480 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002481 goto error;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002482 }
2483 }
2484 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002485 PUSH(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002486 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002487 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002488
Benjamin Petersonddd19492018-09-16 22:38:02 -07002489 case TARGET(DELETE_FAST): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002490 PyObject *v = GETLOCAL(oparg);
2491 if (v != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002492 SETLOCAL(oparg, NULL);
2493 DISPATCH();
2494 }
2495 format_exc_check_arg(
Victor Stinner438a12d2019-05-24 17:01:38 +02002496 tstate, PyExc_UnboundLocalError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002497 UNBOUNDLOCAL_ERROR_MSG,
2498 PyTuple_GetItem(co->co_varnames, oparg)
2499 );
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002500 goto error;
2501 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002502
Benjamin Petersonddd19492018-09-16 22:38:02 -07002503 case TARGET(DELETE_DEREF): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002504 PyObject *cell = freevars[oparg];
Raymond Hettingerc32f9db2016-11-12 04:10:35 -05002505 PyObject *oldobj = PyCell_GET(cell);
2506 if (oldobj != NULL) {
2507 PyCell_SET(cell, NULL);
2508 Py_DECREF(oldobj);
Benjamin Peterson00ebe2c2010-09-10 22:02:31 +00002509 DISPATCH();
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00002510 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002511 format_exc_unbound(tstate, co, oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002512 goto error;
2513 }
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00002514
Benjamin Petersonddd19492018-09-16 22:38:02 -07002515 case TARGET(LOAD_CLOSURE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002516 PyObject *cell = freevars[oparg];
2517 Py_INCREF(cell);
2518 PUSH(cell);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002519 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002520 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002521
Benjamin Petersonddd19492018-09-16 22:38:02 -07002522 case TARGET(LOAD_CLASSDEREF): {
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002523 PyObject *name, *value, *locals = f->f_locals;
Victor Stinnerd3dfd0e2013-05-16 23:48:01 +02002524 Py_ssize_t idx;
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002525 assert(locals);
2526 assert(oparg >= PyTuple_GET_SIZE(co->co_cellvars));
2527 idx = oparg - PyTuple_GET_SIZE(co->co_cellvars);
2528 assert(idx >= 0 && idx < PyTuple_GET_SIZE(co->co_freevars));
2529 name = PyTuple_GET_ITEM(co->co_freevars, idx);
2530 if (PyDict_CheckExact(locals)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002531 value = PyDict_GetItemWithError(locals, name);
2532 if (value != NULL) {
2533 Py_INCREF(value);
2534 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002535 else if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002536 goto error;
2537 }
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002538 }
2539 else {
2540 value = PyObject_GetItem(locals, name);
Victor Stinnere20310f2015-11-05 13:56:58 +01002541 if (value == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002542 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002543 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02002544 }
2545 _PyErr_Clear(tstate);
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002546 }
2547 }
2548 if (!value) {
2549 PyObject *cell = freevars[oparg];
2550 value = PyCell_GET(cell);
2551 if (value == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002552 format_exc_unbound(tstate, co, oparg);
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002553 goto error;
2554 }
2555 Py_INCREF(value);
2556 }
2557 PUSH(value);
2558 DISPATCH();
2559 }
2560
Benjamin Petersonddd19492018-09-16 22:38:02 -07002561 case TARGET(LOAD_DEREF): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002562 PyObject *cell = freevars[oparg];
2563 PyObject *value = PyCell_GET(cell);
2564 if (value == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002565 format_exc_unbound(tstate, co, oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002566 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002567 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002568 Py_INCREF(value);
2569 PUSH(value);
2570 DISPATCH();
2571 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002572
Benjamin Petersonddd19492018-09-16 22:38:02 -07002573 case TARGET(STORE_DEREF): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002574 PyObject *v = POP();
2575 PyObject *cell = freevars[oparg];
Raymond Hettingerb2b15432016-11-11 04:32:11 -08002576 PyObject *oldobj = PyCell_GET(cell);
2577 PyCell_SET(cell, v);
2578 Py_XDECREF(oldobj);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002579 DISPATCH();
2580 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002581
Benjamin Petersonddd19492018-09-16 22:38:02 -07002582 case TARGET(BUILD_STRING): {
Serhiy Storchakaea525a22016-09-06 22:07:53 +03002583 PyObject *str;
2584 PyObject *empty = PyUnicode_New(0, 0);
2585 if (empty == NULL) {
2586 goto error;
2587 }
2588 str = _PyUnicode_JoinArray(empty, stack_pointer - oparg, oparg);
2589 Py_DECREF(empty);
2590 if (str == NULL)
2591 goto error;
2592 while (--oparg >= 0) {
2593 PyObject *item = POP();
2594 Py_DECREF(item);
2595 }
2596 PUSH(str);
2597 DISPATCH();
2598 }
2599
Benjamin Petersonddd19492018-09-16 22:38:02 -07002600 case TARGET(BUILD_TUPLE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002601 PyObject *tup = PyTuple_New(oparg);
2602 if (tup == NULL)
2603 goto error;
2604 while (--oparg >= 0) {
2605 PyObject *item = POP();
2606 PyTuple_SET_ITEM(tup, oparg, item);
2607 }
2608 PUSH(tup);
2609 DISPATCH();
2610 }
2611
Benjamin Petersonddd19492018-09-16 22:38:02 -07002612 case TARGET(BUILD_LIST): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002613 PyObject *list = PyList_New(oparg);
2614 if (list == NULL)
2615 goto error;
2616 while (--oparg >= 0) {
2617 PyObject *item = POP();
2618 PyList_SET_ITEM(list, oparg, item);
2619 }
2620 PUSH(list);
2621 DISPATCH();
2622 }
2623
Mark Shannon13bc1392020-01-23 09:25:17 +00002624 case TARGET(LIST_TO_TUPLE): {
2625 PyObject *list = POP();
2626 PyObject *tuple = PyList_AsTuple(list);
2627 Py_DECREF(list);
2628 if (tuple == NULL) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002629 goto error;
Mark Shannon13bc1392020-01-23 09:25:17 +00002630 }
2631 PUSH(tuple);
2632 DISPATCH();
2633 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002634
Mark Shannon13bc1392020-01-23 09:25:17 +00002635 case TARGET(LIST_EXTEND): {
2636 PyObject *iterable = POP();
2637 PyObject *list = PEEK(oparg);
2638 PyObject *none_val = _PyList_Extend((PyListObject *)list, iterable);
2639 if (none_val == NULL) {
2640 if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError) &&
2641 (iterable->ob_type->tp_iter == NULL && !PySequence_Check(iterable)))
2642 {
2643 PyErr_Clear();
2644 _PyErr_Format(tstate, PyExc_TypeError,
2645 "Value after * must be an iterable, not %.200s",
2646 Py_TYPE(iterable)->tp_name);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002647 }
Mark Shannon13bc1392020-01-23 09:25:17 +00002648 Py_DECREF(iterable);
2649 goto error;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002650 }
Mark Shannon13bc1392020-01-23 09:25:17 +00002651 Py_DECREF(none_val);
2652 Py_DECREF(iterable);
2653 DISPATCH();
2654 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002655
Mark Shannon13bc1392020-01-23 09:25:17 +00002656 case TARGET(SET_UPDATE): {
2657 PyObject *iterable = POP();
2658 PyObject *set = PEEK(oparg);
2659 int err = _PySet_Update(set, iterable);
2660 Py_DECREF(iterable);
2661 if (err < 0) {
2662 goto error;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002663 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002664 DISPATCH();
2665 }
2666
Benjamin Petersonddd19492018-09-16 22:38:02 -07002667 case TARGET(BUILD_SET): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002668 PyObject *set = PySet_New(NULL);
2669 int err = 0;
Raymond Hettinger4c483ad2016-09-08 14:45:40 -07002670 int i;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002671 if (set == NULL)
2672 goto error;
Raymond Hettinger4c483ad2016-09-08 14:45:40 -07002673 for (i = oparg; i > 0; i--) {
2674 PyObject *item = PEEK(i);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002675 if (err == 0)
2676 err = PySet_Add(set, item);
2677 Py_DECREF(item);
2678 }
costypetrisor8ed317f2018-07-31 20:55:14 +00002679 STACK_SHRINK(oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002680 if (err != 0) {
2681 Py_DECREF(set);
2682 goto error;
2683 }
2684 PUSH(set);
2685 DISPATCH();
2686 }
2687
Benjamin Petersonddd19492018-09-16 22:38:02 -07002688 case TARGET(BUILD_MAP): {
Victor Stinner74319ae2016-08-25 00:04:09 +02002689 Py_ssize_t i;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002690 PyObject *map = _PyDict_NewPresized((Py_ssize_t)oparg);
2691 if (map == NULL)
2692 goto error;
Benjamin Petersond5d77aa2015-07-05 10:37:25 -05002693 for (i = oparg; i > 0; i--) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002694 int err;
Benjamin Petersond5d77aa2015-07-05 10:37:25 -05002695 PyObject *key = PEEK(2*i);
2696 PyObject *value = PEEK(2*i - 1);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002697 err = PyDict_SetItem(map, key, value);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002698 if (err != 0) {
2699 Py_DECREF(map);
2700 goto error;
2701 }
2702 }
Benjamin Petersond5d77aa2015-07-05 10:37:25 -05002703
2704 while (oparg--) {
2705 Py_DECREF(POP());
2706 Py_DECREF(POP());
2707 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002708 PUSH(map);
2709 DISPATCH();
2710 }
2711
Benjamin Petersonddd19492018-09-16 22:38:02 -07002712 case TARGET(SETUP_ANNOTATIONS): {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002713 _Py_IDENTIFIER(__annotations__);
2714 int err;
2715 PyObject *ann_dict;
2716 if (f->f_locals == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002717 _PyErr_Format(tstate, PyExc_SystemError,
2718 "no locals found when setting up annotations");
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002719 goto error;
2720 }
2721 /* check if __annotations__ in locals()... */
2722 if (PyDict_CheckExact(f->f_locals)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002723 ann_dict = _PyDict_GetItemIdWithError(f->f_locals,
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002724 &PyId___annotations__);
2725 if (ann_dict == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002726 if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002727 goto error;
2728 }
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002729 /* ...if not, create a new one */
2730 ann_dict = PyDict_New();
2731 if (ann_dict == NULL) {
2732 goto error;
2733 }
2734 err = _PyDict_SetItemId(f->f_locals,
2735 &PyId___annotations__, ann_dict);
2736 Py_DECREF(ann_dict);
2737 if (err != 0) {
2738 goto error;
2739 }
2740 }
2741 }
2742 else {
2743 /* do the same if locals() is not a dict */
2744 PyObject *ann_str = _PyUnicode_FromId(&PyId___annotations__);
2745 if (ann_str == NULL) {
Serhiy Storchaka4678b2f2016-11-08 23:13:36 +02002746 goto error;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002747 }
2748 ann_dict = PyObject_GetItem(f->f_locals, ann_str);
2749 if (ann_dict == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002750 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002751 goto error;
2752 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002753 _PyErr_Clear(tstate);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002754 ann_dict = PyDict_New();
2755 if (ann_dict == NULL) {
2756 goto error;
2757 }
2758 err = PyObject_SetItem(f->f_locals, ann_str, ann_dict);
2759 Py_DECREF(ann_dict);
2760 if (err != 0) {
2761 goto error;
2762 }
2763 }
2764 else {
2765 Py_DECREF(ann_dict);
2766 }
2767 }
2768 DISPATCH();
2769 }
2770
Benjamin Petersonddd19492018-09-16 22:38:02 -07002771 case TARGET(BUILD_CONST_KEY_MAP): {
Victor Stinner74319ae2016-08-25 00:04:09 +02002772 Py_ssize_t i;
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03002773 PyObject *map;
2774 PyObject *keys = TOP();
2775 if (!PyTuple_CheckExact(keys) ||
2776 PyTuple_GET_SIZE(keys) != (Py_ssize_t)oparg) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002777 _PyErr_SetString(tstate, PyExc_SystemError,
2778 "bad BUILD_CONST_KEY_MAP keys argument");
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03002779 goto error;
2780 }
2781 map = _PyDict_NewPresized((Py_ssize_t)oparg);
2782 if (map == NULL) {
2783 goto error;
2784 }
2785 for (i = oparg; i > 0; i--) {
2786 int err;
2787 PyObject *key = PyTuple_GET_ITEM(keys, oparg - i);
2788 PyObject *value = PEEK(i + 1);
2789 err = PyDict_SetItem(map, key, value);
2790 if (err != 0) {
2791 Py_DECREF(map);
2792 goto error;
2793 }
2794 }
2795
2796 Py_DECREF(POP());
2797 while (oparg--) {
2798 Py_DECREF(POP());
2799 }
2800 PUSH(map);
2801 DISPATCH();
2802 }
2803
Benjamin Petersonddd19492018-09-16 22:38:02 -07002804 case TARGET(BUILD_MAP_UNPACK): {
Victor Stinner74319ae2016-08-25 00:04:09 +02002805 Py_ssize_t i;
Serhiy Storchakab7281052016-09-12 00:52:40 +03002806 PyObject *sum = PyDict_New();
Victor Stinnerf9b760f2016-09-09 10:17:08 -07002807 if (sum == NULL)
2808 goto error;
2809
2810 for (i = oparg; i > 0; i--) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002811 PyObject *arg = PEEK(i);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002812 if (PyDict_Update(sum, arg) < 0) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002813 if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) {
2814 _PyErr_Format(tstate, PyExc_TypeError,
2815 "'%.200s' object is not a mapping",
2816 arg->ob_type->tp_name);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002817 }
2818 Py_DECREF(sum);
2819 goto error;
2820 }
2821 }
2822
Victor Stinnerf9b760f2016-09-09 10:17:08 -07002823 while (oparg--)
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002824 Py_DECREF(POP());
2825 PUSH(sum);
2826 DISPATCH();
2827 }
2828
Benjamin Petersonddd19492018-09-16 22:38:02 -07002829 case TARGET(BUILD_MAP_UNPACK_WITH_CALL): {
Serhiy Storchakae036ef82016-10-02 11:06:43 +03002830 Py_ssize_t i;
2831 PyObject *sum = PyDict_New();
2832 if (sum == NULL)
2833 goto error;
2834
2835 for (i = oparg; i > 0; i--) {
2836 PyObject *arg = PEEK(i);
2837 if (_PyDict_MergeEx(sum, arg, 2) < 0) {
Serhiy Storchakae036ef82016-10-02 11:06:43 +03002838 Py_DECREF(sum);
Victor Stinner438a12d2019-05-24 17:01:38 +02002839 format_kwargs_error(tstate, PEEK(2 + oparg), arg);
Serhiy Storchakae036ef82016-10-02 11:06:43 +03002840 goto error;
2841 }
2842 }
2843
2844 while (oparg--)
2845 Py_DECREF(POP());
2846 PUSH(sum);
Brandt Bucherf185a732019-09-28 17:12:49 -07002847 PREDICT(CALL_FUNCTION_EX);
Serhiy Storchakae036ef82016-10-02 11:06:43 +03002848 DISPATCH();
2849 }
2850
Benjamin Petersonddd19492018-09-16 22:38:02 -07002851 case TARGET(MAP_ADD): {
Jörn Heisslerc8a35412019-06-22 16:40:55 +02002852 PyObject *value = TOP();
2853 PyObject *key = SECOND();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002854 PyObject *map;
2855 int err;
costypetrisor8ed317f2018-07-31 20:55:14 +00002856 STACK_SHRINK(2);
Raymond Hettinger41862222016-10-15 19:03:06 -07002857 map = PEEK(oparg); /* dict */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002858 assert(PyDict_CheckExact(map));
Martin Panter95f53c12016-07-18 08:23:26 +00002859 err = PyDict_SetItem(map, key, value); /* map[key] = value */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002860 Py_DECREF(value);
2861 Py_DECREF(key);
2862 if (err != 0)
2863 goto error;
2864 PREDICT(JUMP_ABSOLUTE);
2865 DISPATCH();
2866 }
2867
Benjamin Petersonddd19492018-09-16 22:38:02 -07002868 case TARGET(LOAD_ATTR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002869 PyObject *name = GETITEM(names, oparg);
2870 PyObject *owner = TOP();
2871 PyObject *res = PyObject_GetAttr(owner, name);
2872 Py_DECREF(owner);
2873 SET_TOP(res);
2874 if (res == NULL)
2875 goto error;
2876 DISPATCH();
2877 }
2878
Benjamin Petersonddd19492018-09-16 22:38:02 -07002879 case TARGET(COMPARE_OP): {
Mark Shannon9af0e472020-01-14 10:12:45 +00002880 assert(oparg <= Py_GE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002881 PyObject *right = POP();
2882 PyObject *left = TOP();
Mark Shannon9af0e472020-01-14 10:12:45 +00002883 PyObject *res = PyObject_RichCompare(left, right, oparg);
2884 SET_TOP(res);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002885 Py_DECREF(left);
2886 Py_DECREF(right);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002887 if (res == NULL)
2888 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002889 PREDICT(POP_JUMP_IF_FALSE);
2890 PREDICT(POP_JUMP_IF_TRUE);
2891 DISPATCH();
Victor Stinner3c1e4812012-03-26 22:10:51 +02002892 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002893
Mark Shannon9af0e472020-01-14 10:12:45 +00002894 case TARGET(IS_OP): {
2895 PyObject *right = POP();
2896 PyObject *left = TOP();
2897 int res = (left == right)^oparg;
2898 PyObject *b = res ? Py_True : Py_False;
2899 Py_INCREF(b);
2900 SET_TOP(b);
2901 Py_DECREF(left);
2902 Py_DECREF(right);
2903 PREDICT(POP_JUMP_IF_FALSE);
2904 PREDICT(POP_JUMP_IF_TRUE);
2905 FAST_DISPATCH();
2906 }
2907
2908 case TARGET(CONTAINS_OP): {
2909 PyObject *right = POP();
2910 PyObject *left = POP();
2911 int res = PySequence_Contains(right, left);
2912 Py_DECREF(left);
2913 Py_DECREF(right);
2914 if (res < 0) {
2915 goto error;
2916 }
2917 PyObject *b = (res^oparg) ? Py_True : Py_False;
2918 Py_INCREF(b);
2919 PUSH(b);
2920 PREDICT(POP_JUMP_IF_FALSE);
2921 PREDICT(POP_JUMP_IF_TRUE);
2922 FAST_DISPATCH();
2923 }
2924
2925#define CANNOT_CATCH_MSG "catching classes that do not inherit from "\
2926 "BaseException is not allowed"
2927
2928 case TARGET(JUMP_IF_NOT_EXC_MATCH): {
2929 PyObject *right = POP();
2930 PyObject *left = POP();
2931 if (PyTuple_Check(right)) {
2932 Py_ssize_t i, length;
2933 length = PyTuple_GET_SIZE(right);
2934 for (i = 0; i < length; i++) {
2935 PyObject *exc = PyTuple_GET_ITEM(right, i);
2936 if (!PyExceptionClass_Check(exc)) {
2937 _PyErr_SetString(tstate, PyExc_TypeError,
2938 CANNOT_CATCH_MSG);
2939 Py_DECREF(left);
2940 Py_DECREF(right);
2941 goto error;
2942 }
2943 }
2944 }
2945 else {
2946 if (!PyExceptionClass_Check(right)) {
2947 _PyErr_SetString(tstate, PyExc_TypeError,
2948 CANNOT_CATCH_MSG);
2949 Py_DECREF(left);
2950 Py_DECREF(right);
2951 goto error;
2952 }
2953 }
2954 int res = PyErr_GivenExceptionMatches(left, right);
2955 Py_DECREF(left);
2956 Py_DECREF(right);
2957 if (res > 0) {
2958 /* Exception matches -- Do nothing */;
2959 }
2960 else if (res == 0) {
2961 JUMPTO(oparg);
2962 }
2963 else {
2964 goto error;
2965 }
2966 DISPATCH();
2967 }
2968
Benjamin Petersonddd19492018-09-16 22:38:02 -07002969 case TARGET(IMPORT_NAME): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002970 PyObject *name = GETITEM(names, oparg);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03002971 PyObject *fromlist = POP();
2972 PyObject *level = TOP();
2973 PyObject *res;
Victor Stinner438a12d2019-05-24 17:01:38 +02002974 res = import_name(tstate, f, name, fromlist, level);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03002975 Py_DECREF(level);
2976 Py_DECREF(fromlist);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002977 SET_TOP(res);
2978 if (res == NULL)
2979 goto error;
2980 DISPATCH();
2981 }
2982
Benjamin Petersonddd19492018-09-16 22:38:02 -07002983 case TARGET(IMPORT_STAR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002984 PyObject *from = POP(), *locals;
2985 int err;
Matthias Bussonnier160edb42017-02-25 21:58:05 -08002986 if (PyFrame_FastToLocalsWithError(f) < 0) {
2987 Py_DECREF(from);
Victor Stinner41bb43a2013-10-29 01:19:37 +01002988 goto error;
Matthias Bussonnier160edb42017-02-25 21:58:05 -08002989 }
Victor Stinner41bb43a2013-10-29 01:19:37 +01002990
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002991 locals = f->f_locals;
2992 if (locals == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002993 _PyErr_SetString(tstate, PyExc_SystemError,
2994 "no locals found during 'import *'");
Matthias Bussonnier160edb42017-02-25 21:58:05 -08002995 Py_DECREF(from);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002996 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002997 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002998 err = import_all_from(tstate, locals, from);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002999 PyFrame_LocalsToFast(f, 0);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003000 Py_DECREF(from);
3001 if (err != 0)
3002 goto error;
3003 DISPATCH();
3004 }
Guido van Rossum25831651993-05-19 14:50:45 +00003005
Benjamin Petersonddd19492018-09-16 22:38:02 -07003006 case TARGET(IMPORT_FROM): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003007 PyObject *name = GETITEM(names, oparg);
3008 PyObject *from = TOP();
3009 PyObject *res;
Victor Stinner438a12d2019-05-24 17:01:38 +02003010 res = import_from(tstate, from, name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003011 PUSH(res);
3012 if (res == NULL)
3013 goto error;
3014 DISPATCH();
3015 }
Thomas Wouters52152252000-08-17 22:55:00 +00003016
Benjamin Petersonddd19492018-09-16 22:38:02 -07003017 case TARGET(JUMP_FORWARD): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003018 JUMPBY(oparg);
3019 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003020 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003021
Benjamin Petersonddd19492018-09-16 22:38:02 -07003022 case TARGET(POP_JUMP_IF_FALSE): {
3023 PREDICTED(POP_JUMP_IF_FALSE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003024 PyObject *cond = POP();
3025 int err;
3026 if (cond == Py_True) {
3027 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003028 FAST_DISPATCH();
3029 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003030 if (cond == Py_False) {
3031 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003032 JUMPTO(oparg);
3033 FAST_DISPATCH();
3034 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003035 err = PyObject_IsTrue(cond);
3036 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003037 if (err > 0)
Adrian Wielgosik50c28502017-06-23 13:35:41 -07003038 ;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003039 else if (err == 0)
3040 JUMPTO(oparg);
3041 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003042 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003043 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003044 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003045
Benjamin Petersonddd19492018-09-16 22:38:02 -07003046 case TARGET(POP_JUMP_IF_TRUE): {
3047 PREDICTED(POP_JUMP_IF_TRUE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003048 PyObject *cond = POP();
3049 int err;
3050 if (cond == Py_False) {
3051 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003052 FAST_DISPATCH();
3053 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003054 if (cond == Py_True) {
3055 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003056 JUMPTO(oparg);
3057 FAST_DISPATCH();
3058 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003059 err = PyObject_IsTrue(cond);
3060 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003061 if (err > 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003062 JUMPTO(oparg);
3063 }
3064 else if (err == 0)
3065 ;
3066 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003067 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003068 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003069 }
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00003070
Benjamin Petersonddd19492018-09-16 22:38:02 -07003071 case TARGET(JUMP_IF_FALSE_OR_POP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003072 PyObject *cond = TOP();
3073 int err;
3074 if (cond == Py_True) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003075 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003076 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003077 FAST_DISPATCH();
3078 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003079 if (cond == Py_False) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003080 JUMPTO(oparg);
3081 FAST_DISPATCH();
3082 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003083 err = PyObject_IsTrue(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003084 if (err > 0) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003085 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003086 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003087 }
3088 else if (err == 0)
3089 JUMPTO(oparg);
3090 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003091 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003092 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003093 }
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00003094
Benjamin Petersonddd19492018-09-16 22:38:02 -07003095 case TARGET(JUMP_IF_TRUE_OR_POP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003096 PyObject *cond = TOP();
3097 int err;
3098 if (cond == Py_False) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003099 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003100 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003101 FAST_DISPATCH();
3102 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003103 if (cond == Py_True) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003104 JUMPTO(oparg);
3105 FAST_DISPATCH();
3106 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003107 err = PyObject_IsTrue(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003108 if (err > 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003109 JUMPTO(oparg);
3110 }
3111 else if (err == 0) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003112 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003113 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003114 }
3115 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003116 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003117 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003118 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003119
Benjamin Petersonddd19492018-09-16 22:38:02 -07003120 case TARGET(JUMP_ABSOLUTE): {
3121 PREDICTED(JUMP_ABSOLUTE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003122 JUMPTO(oparg);
Guido van Rossum58da9312007-11-10 23:39:45 +00003123#if FAST_LOOPS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003124 /* Enabling this path speeds-up all while and for-loops by bypassing
3125 the per-loop checks for signals. By default, this should be turned-off
3126 because it prevents detection of a control-break in tight loops like
3127 "while 1: pass". Compile with this option turned-on when you need
3128 the speed-up and do not need break checking inside tight loops (ones
3129 that contain only instructions ending with FAST_DISPATCH).
3130 */
3131 FAST_DISPATCH();
Guido van Rossum58da9312007-11-10 23:39:45 +00003132#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003133 DISPATCH();
Guido van Rossum58da9312007-11-10 23:39:45 +00003134#endif
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003135 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003136
Benjamin Petersonddd19492018-09-16 22:38:02 -07003137 case TARGET(GET_ITER): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003138 /* before: [obj]; after [getiter(obj)] */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003139 PyObject *iterable = TOP();
Yury Selivanov5376ba92015-06-22 12:19:30 -04003140 PyObject *iter = PyObject_GetIter(iterable);
3141 Py_DECREF(iterable);
3142 SET_TOP(iter);
3143 if (iter == NULL)
3144 goto error;
3145 PREDICT(FOR_ITER);
Serhiy Storchakada9c5132016-06-27 18:58:57 +03003146 PREDICT(CALL_FUNCTION);
Yury Selivanov5376ba92015-06-22 12:19:30 -04003147 DISPATCH();
3148 }
3149
Benjamin Petersonddd19492018-09-16 22:38:02 -07003150 case TARGET(GET_YIELD_FROM_ITER): {
Yury Selivanov5376ba92015-06-22 12:19:30 -04003151 /* before: [obj]; after [getiter(obj)] */
3152 PyObject *iterable = TOP();
Yury Selivanov75445082015-05-11 22:57:16 -04003153 PyObject *iter;
Yury Selivanov5376ba92015-06-22 12:19:30 -04003154 if (PyCoro_CheckExact(iterable)) {
3155 /* `iterable` is a coroutine */
3156 if (!(co->co_flags & (CO_COROUTINE | CO_ITERABLE_COROUTINE))) {
3157 /* and it is used in a 'yield from' expression of a
3158 regular generator. */
3159 Py_DECREF(iterable);
3160 SET_TOP(NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02003161 _PyErr_SetString(tstate, PyExc_TypeError,
3162 "cannot 'yield from' a coroutine object "
3163 "in a non-coroutine generator");
Yury Selivanov5376ba92015-06-22 12:19:30 -04003164 goto error;
3165 }
3166 }
3167 else if (!PyGen_CheckExact(iterable)) {
Yury Selivanov75445082015-05-11 22:57:16 -04003168 /* `iterable` is not a generator. */
3169 iter = PyObject_GetIter(iterable);
3170 Py_DECREF(iterable);
3171 SET_TOP(iter);
3172 if (iter == NULL)
3173 goto error;
3174 }
Serhiy Storchakada9c5132016-06-27 18:58:57 +03003175 PREDICT(LOAD_CONST);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003176 DISPATCH();
3177 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003178
Benjamin Petersonddd19492018-09-16 22:38:02 -07003179 case TARGET(FOR_ITER): {
3180 PREDICTED(FOR_ITER);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003181 /* before: [iter]; after: [iter, iter()] *or* [] */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003182 PyObject *iter = TOP();
3183 PyObject *next = (*iter->ob_type->tp_iternext)(iter);
3184 if (next != NULL) {
3185 PUSH(next);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003186 PREDICT(STORE_FAST);
3187 PREDICT(UNPACK_SEQUENCE);
3188 DISPATCH();
3189 }
Victor Stinner438a12d2019-05-24 17:01:38 +02003190 if (_PyErr_Occurred(tstate)) {
3191 if (!_PyErr_ExceptionMatches(tstate, PyExc_StopIteration)) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003192 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02003193 }
3194 else if (tstate->c_tracefunc != NULL) {
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003195 call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj, tstate, f);
Victor Stinner438a12d2019-05-24 17:01:38 +02003196 }
3197 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003198 }
3199 /* iterator ended normally */
costypetrisor8ed317f2018-07-31 20:55:14 +00003200 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003201 Py_DECREF(iter);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003202 JUMPBY(oparg);
Serhiy Storchakada9c5132016-06-27 18:58:57 +03003203 PREDICT(POP_BLOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003204 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003205 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003206
Benjamin Petersonddd19492018-09-16 22:38:02 -07003207 case TARGET(SETUP_FINALLY): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003208 PyFrame_BlockSetup(f, SETUP_FINALLY, INSTR_OFFSET() + oparg,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003209 STACK_LEVEL());
3210 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003211 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003212
Benjamin Petersonddd19492018-09-16 22:38:02 -07003213 case TARGET(BEFORE_ASYNC_WITH): {
Yury Selivanov75445082015-05-11 22:57:16 -04003214 _Py_IDENTIFIER(__aenter__);
Géry Ogam1d1b97a2020-01-14 12:58:29 +01003215 _Py_IDENTIFIER(__aexit__);
Yury Selivanov75445082015-05-11 22:57:16 -04003216 PyObject *mgr = TOP();
Géry Ogam1d1b97a2020-01-14 12:58:29 +01003217 PyObject *enter = special_lookup(tstate, mgr, &PyId___aenter__);
Yury Selivanov75445082015-05-11 22:57:16 -04003218 PyObject *res;
Géry Ogam1d1b97a2020-01-14 12:58:29 +01003219 if (enter == NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04003220 goto error;
Géry Ogam1d1b97a2020-01-14 12:58:29 +01003221 }
3222 PyObject *exit = special_lookup(tstate, mgr, &PyId___aexit__);
3223 if (exit == NULL) {
3224 Py_DECREF(enter);
3225 goto error;
3226 }
Yury Selivanov75445082015-05-11 22:57:16 -04003227 SET_TOP(exit);
Yury Selivanov75445082015-05-11 22:57:16 -04003228 Py_DECREF(mgr);
Victor Stinnerf17c3de2016-12-06 18:46:19 +01003229 res = _PyObject_CallNoArg(enter);
Yury Selivanov75445082015-05-11 22:57:16 -04003230 Py_DECREF(enter);
3231 if (res == NULL)
3232 goto error;
3233 PUSH(res);
Serhiy Storchakada9c5132016-06-27 18:58:57 +03003234 PREDICT(GET_AWAITABLE);
Yury Selivanov75445082015-05-11 22:57:16 -04003235 DISPATCH();
3236 }
3237
Benjamin Petersonddd19492018-09-16 22:38:02 -07003238 case TARGET(SETUP_ASYNC_WITH): {
Yury Selivanov75445082015-05-11 22:57:16 -04003239 PyObject *res = POP();
3240 /* Setup the finally block before pushing the result
3241 of __aenter__ on the stack. */
3242 PyFrame_BlockSetup(f, SETUP_FINALLY, INSTR_OFFSET() + oparg,
3243 STACK_LEVEL());
3244 PUSH(res);
3245 DISPATCH();
3246 }
3247
Benjamin Petersonddd19492018-09-16 22:38:02 -07003248 case TARGET(SETUP_WITH): {
Benjamin Petersonce798522012-01-22 11:24:29 -05003249 _Py_IDENTIFIER(__enter__);
Géry Ogam1d1b97a2020-01-14 12:58:29 +01003250 _Py_IDENTIFIER(__exit__);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003251 PyObject *mgr = TOP();
Victor Stinner438a12d2019-05-24 17:01:38 +02003252 PyObject *enter = special_lookup(tstate, mgr, &PyId___enter__);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003253 PyObject *res;
Victor Stinner438a12d2019-05-24 17:01:38 +02003254 if (enter == NULL) {
Raymond Hettingera3fec152016-11-21 17:24:23 -08003255 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02003256 }
3257 PyObject *exit = special_lookup(tstate, mgr, &PyId___exit__);
Raymond Hettinger64e2f9a2016-11-22 11:50:40 -08003258 if (exit == NULL) {
3259 Py_DECREF(enter);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003260 goto error;
Raymond Hettinger64e2f9a2016-11-22 11:50:40 -08003261 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003262 SET_TOP(exit);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003263 Py_DECREF(mgr);
Victor Stinnerf17c3de2016-12-06 18:46:19 +01003264 res = _PyObject_CallNoArg(enter);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003265 Py_DECREF(enter);
3266 if (res == NULL)
3267 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003268 /* Setup the finally block before pushing the result
3269 of __enter__ on the stack. */
3270 PyFrame_BlockSetup(f, SETUP_FINALLY, INSTR_OFFSET() + oparg,
3271 STACK_LEVEL());
Benjamin Peterson876b2f22009-06-28 03:18:59 +00003272
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003273 PUSH(res);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003274 DISPATCH();
3275 }
Benjamin Peterson876b2f22009-06-28 03:18:59 +00003276
Mark Shannonfee55262019-11-21 09:11:43 +00003277 case TARGET(WITH_EXCEPT_START): {
3278 /* At the top of the stack are 7 values:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003279 - (TOP, SECOND, THIRD) = exc_info()
Mark Shannonfee55262019-11-21 09:11:43 +00003280 - (FOURTH, FIFTH, SIXTH) = previous exception for EXCEPT_HANDLER
3281 - SEVENTH: the context.__exit__ bound method
3282 We call SEVENTH(TOP, SECOND, THIRD).
3283 Then we push again the TOP exception and the __exit__
3284 return value.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003285 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003286 PyObject *exit_func;
Victor Stinner842cfff2016-12-01 14:45:31 +01003287 PyObject *exc, *val, *tb, *res;
3288
Victor Stinner842cfff2016-12-01 14:45:31 +01003289 exc = TOP();
Mark Shannonfee55262019-11-21 09:11:43 +00003290 val = SECOND();
3291 tb = THIRD();
3292 assert(exc != Py_None);
3293 assert(!PyLong_Check(exc));
3294 exit_func = PEEK(7);
Jeroen Demeyer469d1a72019-07-03 12:52:21 +02003295 PyObject *stack[4] = {NULL, exc, val, tb};
3296 res = _PyObject_Vectorcall(exit_func, stack + 1,
3297 3 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003298 if (res == NULL)
3299 goto error;
Amaury Forgeot d'Arc10b24e82008-12-10 23:49:33 +00003300
Yury Selivanov75445082015-05-11 22:57:16 -04003301 PUSH(res);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003302 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003303 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00003304
Benjamin Petersonddd19492018-09-16 22:38:02 -07003305 case TARGET(LOAD_METHOD): {
Andreyb021ba52019-04-29 14:33:26 +10003306 /* Designed to work in tandem with CALL_METHOD. */
Yury Selivanovf2392132016-12-13 19:03:51 -05003307 PyObject *name = GETITEM(names, oparg);
3308 PyObject *obj = TOP();
3309 PyObject *meth = NULL;
3310
3311 int meth_found = _PyObject_GetMethod(obj, name, &meth);
3312
Yury Selivanovf2392132016-12-13 19:03:51 -05003313 if (meth == NULL) {
3314 /* Most likely attribute wasn't found. */
Yury Selivanovf2392132016-12-13 19:03:51 -05003315 goto error;
3316 }
3317
3318 if (meth_found) {
INADA Naoki015bce62017-01-16 17:23:30 +09003319 /* We can bypass temporary bound method object.
3320 meth is unbound method and obj is self.
Victor Stinnera8cb5152017-01-18 14:12:51 +01003321
INADA Naoki015bce62017-01-16 17:23:30 +09003322 meth | self | arg1 | ... | argN
3323 */
3324 SET_TOP(meth);
3325 PUSH(obj); // self
Yury Selivanovf2392132016-12-13 19:03:51 -05003326 }
3327 else {
INADA Naoki015bce62017-01-16 17:23:30 +09003328 /* meth is not an unbound method (but a regular attr, or
3329 something was returned by a descriptor protocol). Set
3330 the second element of the stack to NULL, to signal
Yury Selivanovf2392132016-12-13 19:03:51 -05003331 CALL_METHOD that it's not a method call.
INADA Naoki015bce62017-01-16 17:23:30 +09003332
3333 NULL | meth | arg1 | ... | argN
Yury Selivanovf2392132016-12-13 19:03:51 -05003334 */
INADA Naoki015bce62017-01-16 17:23:30 +09003335 SET_TOP(NULL);
Yury Selivanovf2392132016-12-13 19:03:51 -05003336 Py_DECREF(obj);
INADA Naoki015bce62017-01-16 17:23:30 +09003337 PUSH(meth);
Yury Selivanovf2392132016-12-13 19:03:51 -05003338 }
3339 DISPATCH();
3340 }
3341
Benjamin Petersonddd19492018-09-16 22:38:02 -07003342 case TARGET(CALL_METHOD): {
Yury Selivanovf2392132016-12-13 19:03:51 -05003343 /* Designed to work in tamdem with LOAD_METHOD. */
INADA Naoki015bce62017-01-16 17:23:30 +09003344 PyObject **sp, *res, *meth;
Yury Selivanovf2392132016-12-13 19:03:51 -05003345
3346 sp = stack_pointer;
3347
INADA Naoki015bce62017-01-16 17:23:30 +09003348 meth = PEEK(oparg + 2);
3349 if (meth == NULL) {
3350 /* `meth` is NULL when LOAD_METHOD thinks that it's not
3351 a method call.
Yury Selivanovf2392132016-12-13 19:03:51 -05003352
3353 Stack layout:
3354
INADA Naoki015bce62017-01-16 17:23:30 +09003355 ... | NULL | callable | arg1 | ... | argN
3356 ^- TOP()
3357 ^- (-oparg)
3358 ^- (-oparg-1)
3359 ^- (-oparg-2)
Yury Selivanovf2392132016-12-13 19:03:51 -05003360
Ville Skyttä49b27342017-08-03 09:00:59 +03003361 `callable` will be POPed by call_function.
INADA Naoki015bce62017-01-16 17:23:30 +09003362 NULL will will be POPed manually later.
Yury Selivanovf2392132016-12-13 19:03:51 -05003363 */
Victor Stinner09532fe2019-05-10 23:39:09 +02003364 res = call_function(tstate, &sp, oparg, NULL);
Yury Selivanovf2392132016-12-13 19:03:51 -05003365 stack_pointer = sp;
INADA Naoki015bce62017-01-16 17:23:30 +09003366 (void)POP(); /* POP the NULL. */
Yury Selivanovf2392132016-12-13 19:03:51 -05003367 }
3368 else {
3369 /* This is a method call. Stack layout:
3370
INADA Naoki015bce62017-01-16 17:23:30 +09003371 ... | method | self | arg1 | ... | argN
Yury Selivanovf2392132016-12-13 19:03:51 -05003372 ^- TOP()
3373 ^- (-oparg)
INADA Naoki015bce62017-01-16 17:23:30 +09003374 ^- (-oparg-1)
3375 ^- (-oparg-2)
Yury Selivanovf2392132016-12-13 19:03:51 -05003376
INADA Naoki015bce62017-01-16 17:23:30 +09003377 `self` and `method` will be POPed by call_function.
Yury Selivanovf2392132016-12-13 19:03:51 -05003378 We'll be passing `oparg + 1` to call_function, to
INADA Naoki015bce62017-01-16 17:23:30 +09003379 make it accept the `self` as a first argument.
Yury Selivanovf2392132016-12-13 19:03:51 -05003380 */
Victor Stinner09532fe2019-05-10 23:39:09 +02003381 res = call_function(tstate, &sp, oparg + 1, NULL);
Yury Selivanovf2392132016-12-13 19:03:51 -05003382 stack_pointer = sp;
3383 }
3384
3385 PUSH(res);
3386 if (res == NULL)
3387 goto error;
3388 DISPATCH();
3389 }
3390
Benjamin Petersonddd19492018-09-16 22:38:02 -07003391 case TARGET(CALL_FUNCTION): {
3392 PREDICTED(CALL_FUNCTION);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003393 PyObject **sp, *res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003394 sp = stack_pointer;
Victor Stinner09532fe2019-05-10 23:39:09 +02003395 res = call_function(tstate, &sp, oparg, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003396 stack_pointer = sp;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003397 PUSH(res);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003398 if (res == NULL) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003399 goto error;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003400 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003401 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003402 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003403
Benjamin Petersonddd19492018-09-16 22:38:02 -07003404 case TARGET(CALL_FUNCTION_KW): {
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003405 PyObject **sp, *res, *names;
3406
3407 names = POP();
Jeroen Demeyer05677862019-08-16 12:41:27 +02003408 assert(PyTuple_Check(names));
3409 assert(PyTuple_GET_SIZE(names) <= oparg);
3410 /* We assume without checking that names contains only strings */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003411 sp = stack_pointer;
Victor Stinner09532fe2019-05-10 23:39:09 +02003412 res = call_function(tstate, &sp, oparg, names);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003413 stack_pointer = sp;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003414 PUSH(res);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003415 Py_DECREF(names);
3416
3417 if (res == NULL) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003418 goto error;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003419 }
3420 DISPATCH();
3421 }
3422
Benjamin Petersonddd19492018-09-16 22:38:02 -07003423 case TARGET(CALL_FUNCTION_EX): {
Brandt Bucherf185a732019-09-28 17:12:49 -07003424 PREDICTED(CALL_FUNCTION_EX);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003425 PyObject *func, *callargs, *kwargs = NULL, *result;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003426 if (oparg & 0x01) {
3427 kwargs = POP();
Serhiy Storchakab7281052016-09-12 00:52:40 +03003428 if (!PyDict_CheckExact(kwargs)) {
3429 PyObject *d = PyDict_New();
3430 if (d == NULL)
3431 goto error;
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02003432 if (_PyDict_MergeEx(d, kwargs, 2) < 0) {
Serhiy Storchakab7281052016-09-12 00:52:40 +03003433 Py_DECREF(d);
Victor Stinner438a12d2019-05-24 17:01:38 +02003434 format_kwargs_error(tstate, SECOND(), kwargs);
Victor Stinnereece2222016-09-12 11:16:37 +02003435 Py_DECREF(kwargs);
Serhiy Storchakab7281052016-09-12 00:52:40 +03003436 goto error;
3437 }
3438 Py_DECREF(kwargs);
3439 kwargs = d;
3440 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003441 assert(PyDict_CheckExact(kwargs));
3442 }
3443 callargs = POP();
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003444 func = TOP();
Serhiy Storchaka63dc5482016-09-22 19:41:20 +03003445 if (!PyTuple_CheckExact(callargs)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003446 if (check_args_iterable(tstate, func, callargs) < 0) {
Victor Stinnereece2222016-09-12 11:16:37 +02003447 Py_DECREF(callargs);
Serhiy Storchakab7281052016-09-12 00:52:40 +03003448 goto error;
3449 }
3450 Py_SETREF(callargs, PySequence_Tuple(callargs));
3451 if (callargs == NULL) {
3452 goto error;
3453 }
3454 }
Serhiy Storchaka63dc5482016-09-22 19:41:20 +03003455 assert(PyTuple_CheckExact(callargs));
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003456
Victor Stinner09532fe2019-05-10 23:39:09 +02003457 result = do_call_core(tstate, func, callargs, kwargs);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003458 Py_DECREF(func);
3459 Py_DECREF(callargs);
3460 Py_XDECREF(kwargs);
3461
3462 SET_TOP(result);
3463 if (result == NULL) {
3464 goto error;
3465 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003466 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003467 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003468
Benjamin Petersonddd19492018-09-16 22:38:02 -07003469 case TARGET(MAKE_FUNCTION): {
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003470 PyObject *qualname = POP();
3471 PyObject *codeobj = POP();
3472 PyFunctionObject *func = (PyFunctionObject *)
3473 PyFunction_NewWithQualName(codeobj, f->f_globals, qualname);
Guido van Rossum4f72a782006-10-27 23:31:49 +00003474
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003475 Py_DECREF(codeobj);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003476 Py_DECREF(qualname);
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003477 if (func == NULL) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003478 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003479 }
Neal Norwitzc1505362006-12-28 06:47:50 +00003480
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003481 if (oparg & 0x08) {
3482 assert(PyTuple_CheckExact(TOP()));
3483 func ->func_closure = POP();
3484 }
3485 if (oparg & 0x04) {
3486 assert(PyDict_CheckExact(TOP()));
3487 func->func_annotations = POP();
3488 }
3489 if (oparg & 0x02) {
3490 assert(PyDict_CheckExact(TOP()));
3491 func->func_kwdefaults = POP();
3492 }
3493 if (oparg & 0x01) {
3494 assert(PyTuple_CheckExact(TOP()));
3495 func->func_defaults = POP();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003496 }
Neal Norwitzc1505362006-12-28 06:47:50 +00003497
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003498 PUSH((PyObject *)func);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003499 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003500 }
Guido van Rossum8861b741996-07-30 16:49:37 +00003501
Benjamin Petersonddd19492018-09-16 22:38:02 -07003502 case TARGET(BUILD_SLICE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003503 PyObject *start, *stop, *step, *slice;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003504 if (oparg == 3)
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003505 step = POP();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003506 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003507 step = NULL;
3508 stop = POP();
3509 start = TOP();
3510 slice = PySlice_New(start, stop, step);
3511 Py_DECREF(start);
3512 Py_DECREF(stop);
3513 Py_XDECREF(step);
3514 SET_TOP(slice);
3515 if (slice == NULL)
3516 goto error;
3517 DISPATCH();
3518 }
Guido van Rossum8861b741996-07-30 16:49:37 +00003519
Benjamin Petersonddd19492018-09-16 22:38:02 -07003520 case TARGET(FORMAT_VALUE): {
Eric V. Smitha78c7952015-11-03 12:45:05 -05003521 /* Handles f-string value formatting. */
3522 PyObject *result;
3523 PyObject *fmt_spec;
3524 PyObject *value;
3525 PyObject *(*conv_fn)(PyObject *);
3526 int which_conversion = oparg & FVC_MASK;
3527 int have_fmt_spec = (oparg & FVS_MASK) == FVS_HAVE_SPEC;
3528
3529 fmt_spec = have_fmt_spec ? POP() : NULL;
Eric V. Smith135d5f42016-02-05 18:23:08 -05003530 value = POP();
Eric V. Smitha78c7952015-11-03 12:45:05 -05003531
3532 /* See if any conversion is specified. */
3533 switch (which_conversion) {
Eric V. Smith9a4135e2019-05-08 16:28:48 -04003534 case FVC_NONE: conv_fn = NULL; break;
Eric V. Smitha78c7952015-11-03 12:45:05 -05003535 case FVC_STR: conv_fn = PyObject_Str; break;
3536 case FVC_REPR: conv_fn = PyObject_Repr; break;
3537 case FVC_ASCII: conv_fn = PyObject_ASCII; break;
Eric V. Smith9a4135e2019-05-08 16:28:48 -04003538 default:
Victor Stinner438a12d2019-05-24 17:01:38 +02003539 _PyErr_Format(tstate, PyExc_SystemError,
3540 "unexpected conversion flag %d",
3541 which_conversion);
Eric V. Smith9a4135e2019-05-08 16:28:48 -04003542 goto error;
Eric V. Smitha78c7952015-11-03 12:45:05 -05003543 }
3544
3545 /* If there's a conversion function, call it and replace
3546 value with that result. Otherwise, just use value,
3547 without conversion. */
Eric V. Smitheb588a12016-02-05 18:26:20 -05003548 if (conv_fn != NULL) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05003549 result = conv_fn(value);
3550 Py_DECREF(value);
Eric V. Smitheb588a12016-02-05 18:26:20 -05003551 if (result == NULL) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05003552 Py_XDECREF(fmt_spec);
3553 goto error;
3554 }
3555 value = result;
3556 }
3557
3558 /* If value is a unicode object, and there's no fmt_spec,
3559 then we know the result of format(value) is value
3560 itself. In that case, skip calling format(). I plan to
3561 move this optimization in to PyObject_Format()
3562 itself. */
3563 if (PyUnicode_CheckExact(value) && fmt_spec == NULL) {
3564 /* Do nothing, just transfer ownership to result. */
3565 result = value;
3566 } else {
3567 /* Actually call format(). */
3568 result = PyObject_Format(value, fmt_spec);
3569 Py_DECREF(value);
3570 Py_XDECREF(fmt_spec);
Eric V. Smitheb588a12016-02-05 18:26:20 -05003571 if (result == NULL) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05003572 goto error;
Eric V. Smitheb588a12016-02-05 18:26:20 -05003573 }
Eric V. Smitha78c7952015-11-03 12:45:05 -05003574 }
3575
Eric V. Smith135d5f42016-02-05 18:23:08 -05003576 PUSH(result);
Eric V. Smitha78c7952015-11-03 12:45:05 -05003577 DISPATCH();
3578 }
3579
Benjamin Petersonddd19492018-09-16 22:38:02 -07003580 case TARGET(EXTENDED_ARG): {
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03003581 int oldoparg = oparg;
3582 NEXTOPARG();
3583 oparg |= oldoparg << 8;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003584 goto dispatch_opcode;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003585 }
Guido van Rossum8861b741996-07-30 16:49:37 +00003586
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003587
Antoine Pitrou042b1282010-08-13 21:15:58 +00003588#if USE_COMPUTED_GOTOS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003589 _unknown_opcode:
Antoine Pitroub52ec782009-01-25 16:34:23 +00003590#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003591 default:
3592 fprintf(stderr,
3593 "XXX lineno: %d, opcode: %d\n",
3594 PyFrame_GetLineNumber(f),
3595 opcode);
Victor Stinner438a12d2019-05-24 17:01:38 +02003596 _PyErr_SetString(tstate, PyExc_SystemError, "unknown opcode");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003597 goto error;
Guido van Rossum04691fc1992-08-12 15:35:34 +00003598
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003599 } /* switch */
Guido van Rossum374a9221991-04-04 10:40:29 +00003600
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003601 /* This should never be reached. Every opcode should end with DISPATCH()
3602 or goto error. */
Barry Warsawb2e57942017-09-14 18:13:16 -07003603 Py_UNREACHABLE();
Guido van Rossumac7be682001-01-17 15:42:30 +00003604
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003605error:
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003606 /* Double-check exception status. */
Victor Stinner365b6932013-07-12 00:11:58 +02003607#ifdef NDEBUG
Victor Stinner438a12d2019-05-24 17:01:38 +02003608 if (!_PyErr_Occurred(tstate)) {
3609 _PyErr_SetString(tstate, PyExc_SystemError,
3610 "error return without exception set");
3611 }
Victor Stinner365b6932013-07-12 00:11:58 +02003612#else
Victor Stinner438a12d2019-05-24 17:01:38 +02003613 assert(_PyErr_Occurred(tstate));
Victor Stinner365b6932013-07-12 00:11:58 +02003614#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00003615
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003616 /* Log traceback info. */
3617 PyTraceBack_Here(f);
Guido van Rossumac7be682001-01-17 15:42:30 +00003618
Benjamin Peterson51f46162013-01-23 08:38:47 -05003619 if (tstate->c_tracefunc != NULL)
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003620 call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj,
3621 tstate, f);
Guido van Rossumac7be682001-01-17 15:42:30 +00003622
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003623exception_unwind:
3624 /* Unwind stacks if an exception occurred */
3625 while (f->f_iblock > 0) {
3626 /* Pop the current block. */
3627 PyTryBlock *b = &f->f_blockstack[--f->f_iblock];
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003628
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003629 if (b->b_type == EXCEPT_HANDLER) {
3630 UNWIND_EXCEPT_HANDLER(b);
3631 continue;
3632 }
3633 UNWIND_BLOCK(b);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003634 if (b->b_type == SETUP_FINALLY) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003635 PyObject *exc, *val, *tb;
3636 int handler = b->b_handler;
Mark Shannonae3087c2017-10-22 22:41:51 +01003637 _PyErr_StackItem *exc_info = tstate->exc_info;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003638 /* Beware, this invalidates all b->b_* fields */
3639 PyFrame_BlockSetup(f, EXCEPT_HANDLER, -1, STACK_LEVEL());
Mark Shannonae3087c2017-10-22 22:41:51 +01003640 PUSH(exc_info->exc_traceback);
3641 PUSH(exc_info->exc_value);
3642 if (exc_info->exc_type != NULL) {
3643 PUSH(exc_info->exc_type);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003644 }
3645 else {
3646 Py_INCREF(Py_None);
3647 PUSH(Py_None);
3648 }
Victor Stinner438a12d2019-05-24 17:01:38 +02003649 _PyErr_Fetch(tstate, &exc, &val, &tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003650 /* Make the raw exception data
3651 available to the handler,
3652 so a program can emulate the
3653 Python main loop. */
Victor Stinner438a12d2019-05-24 17:01:38 +02003654 _PyErr_NormalizeException(tstate, &exc, &val, &tb);
Victor Stinner7eab0d02013-07-15 21:16:27 +02003655 if (tb != NULL)
3656 PyException_SetTraceback(val, tb);
3657 else
3658 PyException_SetTraceback(val, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003659 Py_INCREF(exc);
Mark Shannonae3087c2017-10-22 22:41:51 +01003660 exc_info->exc_type = exc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003661 Py_INCREF(val);
Mark Shannonae3087c2017-10-22 22:41:51 +01003662 exc_info->exc_value = val;
3663 exc_info->exc_traceback = tb;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003664 if (tb == NULL)
3665 tb = Py_None;
3666 Py_INCREF(tb);
3667 PUSH(tb);
3668 PUSH(val);
3669 PUSH(exc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003670 JUMPTO(handler);
Pablo Galindo4c53e632020-01-10 09:24:22 +00003671 if (_Py_TracingPossible(ceval)) {
3672 int needs_new_execution_window = (f->f_lasti < instr_lb || f->f_lasti >= instr_ub);
3673 int needs_line_update = (f->f_lasti == instr_lb || f->f_lasti < instr_prev);
3674 /* Make sure that we trace line after exception if we are in a new execution
3675 * window or we don't need a line update and we are not in the first instruction
3676 * of the line. */
3677 if (needs_new_execution_window || (!needs_line_update && instr_lb > 0)) {
3678 instr_prev = INT_MAX;
3679 }
Mark Shannonfee55262019-11-21 09:11:43 +00003680 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003681 /* Resume normal execution */
3682 goto main_loop;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003683 }
3684 } /* unwind stack */
Guido van Rossum374a9221991-04-04 10:40:29 +00003685
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003686 /* End the loop as we still have an error */
3687 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003688 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00003689
Pablo Galindof00828a2019-05-09 16:52:02 +01003690 assert(retval == NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02003691 assert(_PyErr_Occurred(tstate));
Pablo Galindof00828a2019-05-09 16:52:02 +01003692
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003693 /* Pop remaining stack entries. */
3694 while (!EMPTY()) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003695 PyObject *o = POP();
3696 Py_XDECREF(o);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003697 }
Guido van Rossum35974fb2001-12-06 21:28:18 +00003698
Mark Shannone7c9f4a2020-01-13 12:51:26 +00003699exiting:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003700 if (tstate->use_tracing) {
Benjamin Peterson51f46162013-01-23 08:38:47 -05003701 if (tstate->c_tracefunc) {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003702 if (call_trace_protected(tstate->c_tracefunc, tstate->c_traceobj,
3703 tstate, f, PyTrace_RETURN, retval)) {
3704 Py_CLEAR(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003705 }
3706 }
3707 if (tstate->c_profilefunc) {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003708 if (call_trace_protected(tstate->c_profilefunc, tstate->c_profileobj,
3709 tstate, f, PyTrace_RETURN, retval)) {
Serhiy Storchaka505ff752014-02-09 13:33:53 +02003710 Py_CLEAR(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003711 }
3712 }
3713 }
Guido van Rossuma4240131997-01-21 21:18:36 +00003714
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003715 /* pop frame */
Thomas Woutersce272b62007-09-19 21:19:28 +00003716exit_eval_frame:
Łukasz Langaa785c872016-09-09 17:37:37 -07003717 if (PyDTrace_FUNCTION_RETURN_ENABLED())
3718 dtrace_function_return(f);
Victor Stinnerbe434dc2019-11-05 00:51:22 +01003719 _Py_LeaveRecursiveCall(tstate);
Antoine Pitrou58720d62013-08-05 23:26:40 +02003720 f->f_executing = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003721 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00003722
Victor Stinner17269092019-11-05 01:22:12 +01003723 return _Py_CheckFunctionResult(tstate, NULL, retval, "PyEval_EvalFrameEx");
Guido van Rossum374a9221991-04-04 10:40:29 +00003724}
3725
Benjamin Petersonb204a422011-06-05 22:04:07 -05003726static void
Victor Stinner438a12d2019-05-24 17:01:38 +02003727format_missing(PyThreadState *tstate, const char *kind,
3728 PyCodeObject *co, PyObject *names)
Benjamin Petersone109c702011-06-24 09:37:26 -05003729{
3730 int err;
3731 Py_ssize_t len = PyList_GET_SIZE(names);
3732 PyObject *name_str, *comma, *tail, *tmp;
3733
3734 assert(PyList_CheckExact(names));
3735 assert(len >= 1);
3736 /* Deal with the joys of natural language. */
3737 switch (len) {
3738 case 1:
3739 name_str = PyList_GET_ITEM(names, 0);
3740 Py_INCREF(name_str);
3741 break;
3742 case 2:
3743 name_str = PyUnicode_FromFormat("%U and %U",
3744 PyList_GET_ITEM(names, len - 2),
3745 PyList_GET_ITEM(names, len - 1));
3746 break;
3747 default:
3748 tail = PyUnicode_FromFormat(", %U, and %U",
3749 PyList_GET_ITEM(names, len - 2),
3750 PyList_GET_ITEM(names, len - 1));
Benjamin Petersond1ab6082012-06-01 11:18:22 -07003751 if (tail == NULL)
3752 return;
Benjamin Petersone109c702011-06-24 09:37:26 -05003753 /* Chop off the last two objects in the list. This shouldn't actually
3754 fail, but we can't be too careful. */
3755 err = PyList_SetSlice(names, len - 2, len, NULL);
3756 if (err == -1) {
3757 Py_DECREF(tail);
3758 return;
3759 }
3760 /* Stitch everything up into a nice comma-separated list. */
3761 comma = PyUnicode_FromString(", ");
3762 if (comma == NULL) {
3763 Py_DECREF(tail);
3764 return;
3765 }
3766 tmp = PyUnicode_Join(comma, names);
3767 Py_DECREF(comma);
3768 if (tmp == NULL) {
3769 Py_DECREF(tail);
3770 return;
3771 }
3772 name_str = PyUnicode_Concat(tmp, tail);
3773 Py_DECREF(tmp);
3774 Py_DECREF(tail);
3775 break;
3776 }
3777 if (name_str == NULL)
3778 return;
Victor Stinner438a12d2019-05-24 17:01:38 +02003779 _PyErr_Format(tstate, PyExc_TypeError,
3780 "%U() missing %i required %s argument%s: %U",
3781 co->co_name,
3782 len,
3783 kind,
3784 len == 1 ? "" : "s",
3785 name_str);
Benjamin Petersone109c702011-06-24 09:37:26 -05003786 Py_DECREF(name_str);
3787}
3788
3789static void
Victor Stinner438a12d2019-05-24 17:01:38 +02003790missing_arguments(PyThreadState *tstate, PyCodeObject *co,
3791 Py_ssize_t missing, Py_ssize_t defcount,
Benjamin Petersone109c702011-06-24 09:37:26 -05003792 PyObject **fastlocals)
3793{
Victor Stinner74319ae2016-08-25 00:04:09 +02003794 Py_ssize_t i, j = 0;
3795 Py_ssize_t start, end;
3796 int positional = (defcount != -1);
Benjamin Petersone109c702011-06-24 09:37:26 -05003797 const char *kind = positional ? "positional" : "keyword-only";
3798 PyObject *missing_names;
3799
3800 /* Compute the names of the arguments that are missing. */
3801 missing_names = PyList_New(missing);
3802 if (missing_names == NULL)
3803 return;
3804 if (positional) {
3805 start = 0;
Pablo Galindocd74e662019-06-01 18:08:04 +01003806 end = co->co_argcount - defcount;
Benjamin Petersone109c702011-06-24 09:37:26 -05003807 }
3808 else {
Pablo Galindocd74e662019-06-01 18:08:04 +01003809 start = co->co_argcount;
Benjamin Petersone109c702011-06-24 09:37:26 -05003810 end = start + co->co_kwonlyargcount;
3811 }
3812 for (i = start; i < end; i++) {
3813 if (GETLOCAL(i) == NULL) {
3814 PyObject *raw = PyTuple_GET_ITEM(co->co_varnames, i);
3815 PyObject *name = PyObject_Repr(raw);
3816 if (name == NULL) {
3817 Py_DECREF(missing_names);
3818 return;
3819 }
3820 PyList_SET_ITEM(missing_names, j++, name);
3821 }
3822 }
3823 assert(j == missing);
Victor Stinner438a12d2019-05-24 17:01:38 +02003824 format_missing(tstate, kind, co, missing_names);
Benjamin Petersone109c702011-06-24 09:37:26 -05003825 Py_DECREF(missing_names);
3826}
3827
3828static void
Victor Stinner438a12d2019-05-24 17:01:38 +02003829too_many_positional(PyThreadState *tstate, PyCodeObject *co,
3830 Py_ssize_t given, Py_ssize_t defcount,
Victor Stinner74319ae2016-08-25 00:04:09 +02003831 PyObject **fastlocals)
Benjamin Petersonb204a422011-06-05 22:04:07 -05003832{
3833 int plural;
Victor Stinner74319ae2016-08-25 00:04:09 +02003834 Py_ssize_t kwonly_given = 0;
3835 Py_ssize_t i;
Benjamin Petersonb204a422011-06-05 22:04:07 -05003836 PyObject *sig, *kwonly_sig;
Victor Stinner74319ae2016-08-25 00:04:09 +02003837 Py_ssize_t co_argcount = co->co_argcount;
Benjamin Petersonb204a422011-06-05 22:04:07 -05003838
Benjamin Petersone109c702011-06-24 09:37:26 -05003839 assert((co->co_flags & CO_VARARGS) == 0);
3840 /* Count missing keyword-only args. */
Pablo Galindocd74e662019-06-01 18:08:04 +01003841 for (i = co_argcount; i < co_argcount + co->co_kwonlyargcount; i++) {
Victor Stinner74319ae2016-08-25 00:04:09 +02003842 if (GETLOCAL(i) != NULL) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05003843 kwonly_given++;
Victor Stinner74319ae2016-08-25 00:04:09 +02003844 }
3845 }
Benjamin Petersone109c702011-06-24 09:37:26 -05003846 if (defcount) {
Pablo Galindocd74e662019-06-01 18:08:04 +01003847 Py_ssize_t atleast = co_argcount - defcount;
Benjamin Petersonb204a422011-06-05 22:04:07 -05003848 plural = 1;
Pablo Galindocd74e662019-06-01 18:08:04 +01003849 sig = PyUnicode_FromFormat("from %zd to %zd", atleast, co_argcount);
Benjamin Petersonb204a422011-06-05 22:04:07 -05003850 }
3851 else {
Pablo Galindocd74e662019-06-01 18:08:04 +01003852 plural = (co_argcount != 1);
3853 sig = PyUnicode_FromFormat("%zd", co_argcount);
Benjamin Petersonb204a422011-06-05 22:04:07 -05003854 }
3855 if (sig == NULL)
3856 return;
3857 if (kwonly_given) {
Victor Stinner74319ae2016-08-25 00:04:09 +02003858 const char *format = " positional argument%s (and %zd keyword-only argument%s)";
3859 kwonly_sig = PyUnicode_FromFormat(format,
3860 given != 1 ? "s" : "",
3861 kwonly_given,
3862 kwonly_given != 1 ? "s" : "");
Benjamin Petersonb204a422011-06-05 22:04:07 -05003863 if (kwonly_sig == NULL) {
3864 Py_DECREF(sig);
3865 return;
3866 }
3867 }
3868 else {
3869 /* This will not fail. */
3870 kwonly_sig = PyUnicode_FromString("");
Benjamin Petersone109c702011-06-24 09:37:26 -05003871 assert(kwonly_sig != NULL);
Benjamin Petersonb204a422011-06-05 22:04:07 -05003872 }
Victor Stinner438a12d2019-05-24 17:01:38 +02003873 _PyErr_Format(tstate, PyExc_TypeError,
3874 "%U() takes %U positional argument%s but %zd%U %s given",
3875 co->co_name,
3876 sig,
3877 plural ? "s" : "",
3878 given,
3879 kwonly_sig,
3880 given == 1 && !kwonly_given ? "was" : "were");
Benjamin Petersonb204a422011-06-05 22:04:07 -05003881 Py_DECREF(sig);
3882 Py_DECREF(kwonly_sig);
3883}
3884
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01003885static int
Victor Stinner438a12d2019-05-24 17:01:38 +02003886positional_only_passed_as_keyword(PyThreadState *tstate, PyCodeObject *co,
3887 Py_ssize_t kwcount, PyObject* const* kwnames)
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01003888{
3889 int posonly_conflicts = 0;
3890 PyObject* posonly_names = PyList_New(0);
3891
3892 for(int k=0; k < co->co_posonlyargcount; k++){
3893 PyObject* posonly_name = PyTuple_GET_ITEM(co->co_varnames, k);
3894
3895 for (int k2=0; k2<kwcount; k2++){
3896 /* Compare the pointers first and fallback to PyObject_RichCompareBool*/
3897 PyObject* kwname = kwnames[k2];
3898 if (kwname == posonly_name){
3899 if(PyList_Append(posonly_names, kwname) != 0) {
3900 goto fail;
3901 }
3902 posonly_conflicts++;
3903 continue;
3904 }
3905
3906 int cmp = PyObject_RichCompareBool(posonly_name, kwname, Py_EQ);
3907
3908 if ( cmp > 0) {
3909 if(PyList_Append(posonly_names, kwname) != 0) {
3910 goto fail;
3911 }
3912 posonly_conflicts++;
3913 } else if (cmp < 0) {
3914 goto fail;
3915 }
3916
3917 }
3918 }
3919 if (posonly_conflicts) {
3920 PyObject* comma = PyUnicode_FromString(", ");
3921 if (comma == NULL) {
3922 goto fail;
3923 }
3924 PyObject* error_names = PyUnicode_Join(comma, posonly_names);
3925 Py_DECREF(comma);
3926 if (error_names == NULL) {
3927 goto fail;
3928 }
Victor Stinner438a12d2019-05-24 17:01:38 +02003929 _PyErr_Format(tstate, PyExc_TypeError,
3930 "%U() got some positional-only arguments passed"
3931 " as keyword arguments: '%U'",
3932 co->co_name, error_names);
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01003933 Py_DECREF(error_names);
3934 goto fail;
3935 }
3936
3937 Py_DECREF(posonly_names);
3938 return 0;
3939
3940fail:
3941 Py_XDECREF(posonly_names);
3942 return 1;
3943
3944}
3945
Guido van Rossumc2e20742006-02-27 22:32:47 +00003946/* This is gonna seem *real weird*, but if you put some other code between
Marcel Plch3a9ccee2018-04-06 23:22:04 +02003947 PyEval_EvalFrame() and _PyEval_EvalFrameDefault() you will need to adjust
Guido van Rossumc2e20742006-02-27 22:32:47 +00003948 the test in the if statements in Misc/gdbinit (pystack and pystackv). */
Skip Montanaro786ea6b2004-03-01 15:44:05 +00003949
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01003950PyObject *
Victor Stinnerb5e170f2019-11-16 01:03:22 +01003951_PyEval_EvalCode(PyThreadState *tstate,
3952 PyObject *_co, PyObject *globals, PyObject *locals,
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02003953 PyObject *const *args, Py_ssize_t argcount,
3954 PyObject *const *kwnames, PyObject *const *kwargs,
Serhiy Storchakab7281052016-09-12 00:52:40 +03003955 Py_ssize_t kwcount, int kwstep,
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02003956 PyObject *const *defs, Py_ssize_t defcount,
Victor Stinner74319ae2016-08-25 00:04:09 +02003957 PyObject *kwdefs, PyObject *closure,
Victor Stinner40ee3012014-06-16 15:59:28 +02003958 PyObject *name, PyObject *qualname)
Tim Peters5ca576e2001-06-18 22:08:13 +00003959{
Victor Stinnerb5e170f2019-11-16 01:03:22 +01003960 assert(tstate != NULL);
3961
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00003962 PyCodeObject* co = (PyCodeObject*)_co;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02003963 PyFrameObject *f;
3964 PyObject *retval = NULL;
3965 PyObject **fastlocals, **freevars;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003966 PyObject *x, *u;
Pablo Galindocd74e662019-06-01 18:08:04 +01003967 const Py_ssize_t total_args = co->co_argcount + co->co_kwonlyargcount;
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01003968 Py_ssize_t i, j, n;
Victor Stinnerc7020012016-08-16 23:40:29 +02003969 PyObject *kwdict;
Tim Peters5ca576e2001-06-18 22:08:13 +00003970
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003971 if (globals == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003972 _PyErr_SetString(tstate, PyExc_SystemError,
3973 "PyEval_EvalCodeEx: NULL globals");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003974 return NULL;
3975 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003976
Victor Stinnerc7020012016-08-16 23:40:29 +02003977 /* Create the frame */
INADA Naoki5a625d02016-12-24 20:19:08 +09003978 f = _PyFrame_New_NoTrack(tstate, co, globals, locals);
Victor Stinnerc7020012016-08-16 23:40:29 +02003979 if (f == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003980 return NULL;
Victor Stinnerc7020012016-08-16 23:40:29 +02003981 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003982 fastlocals = f->f_localsplus;
3983 freevars = f->f_localsplus + co->co_nlocals;
Tim Peters5ca576e2001-06-18 22:08:13 +00003984
Victor Stinnerc7020012016-08-16 23:40:29 +02003985 /* Create a dictionary for keyword parameters (**kwags) */
Benjamin Petersonb204a422011-06-05 22:04:07 -05003986 if (co->co_flags & CO_VARKEYWORDS) {
3987 kwdict = PyDict_New();
3988 if (kwdict == NULL)
3989 goto fail;
3990 i = total_args;
Victor Stinnerc7020012016-08-16 23:40:29 +02003991 if (co->co_flags & CO_VARARGS) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05003992 i++;
Victor Stinnerc7020012016-08-16 23:40:29 +02003993 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05003994 SETLOCAL(i, kwdict);
3995 }
Victor Stinnerc7020012016-08-16 23:40:29 +02003996 else {
3997 kwdict = NULL;
3998 }
3999
Pablo Galindocd74e662019-06-01 18:08:04 +01004000 /* Copy all positional arguments into local variables */
4001 if (argcount > co->co_argcount) {
4002 n = co->co_argcount;
Victor Stinnerc7020012016-08-16 23:40:29 +02004003 }
4004 else {
4005 n = argcount;
4006 }
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004007 for (j = 0; j < n; j++) {
4008 x = args[j];
4009 Py_INCREF(x);
4010 SETLOCAL(j, x);
4011 }
4012
Victor Stinnerc7020012016-08-16 23:40:29 +02004013 /* Pack other positional arguments into the *args argument */
Benjamin Petersonb204a422011-06-05 22:04:07 -05004014 if (co->co_flags & CO_VARARGS) {
Sergey Fedoseev234531b2019-02-25 21:59:12 +05004015 u = _PyTuple_FromArray(args + n, argcount - n);
Victor Stinnerc7020012016-08-16 23:40:29 +02004016 if (u == NULL) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004017 goto fail;
Victor Stinnerc7020012016-08-16 23:40:29 +02004018 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004019 SETLOCAL(total_args, u);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004020 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004021
Serhiy Storchakab7281052016-09-12 00:52:40 +03004022 /* Handle keyword arguments passed as two strided arrays */
4023 kwcount *= kwstep;
4024 for (i = 0; i < kwcount; i += kwstep) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004025 PyObject **co_varnames;
Serhiy Storchakab7281052016-09-12 00:52:40 +03004026 PyObject *keyword = kwnames[i];
4027 PyObject *value = kwargs[i];
Victor Stinner17061a92016-08-16 23:39:42 +02004028 Py_ssize_t j;
Victor Stinnerc7020012016-08-16 23:40:29 +02004029
Benjamin Petersonb204a422011-06-05 22:04:07 -05004030 if (keyword == NULL || !PyUnicode_Check(keyword)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004031 _PyErr_Format(tstate, PyExc_TypeError,
4032 "%U() keywords must be strings",
4033 co->co_name);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004034 goto fail;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004035 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004036
Benjamin Petersonb204a422011-06-05 22:04:07 -05004037 /* Speed hack: do raw pointer compares. As names are
4038 normally interned this should almost always hit. */
4039 co_varnames = ((PyTupleObject *)(co->co_varnames))->ob_item;
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004040 for (j = co->co_posonlyargcount; j < total_args; j++) {
Victor Stinner6fea7f72016-08-22 23:17:30 +02004041 PyObject *name = co_varnames[j];
4042 if (name == keyword) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004043 goto kw_found;
Victor Stinner6fea7f72016-08-22 23:17:30 +02004044 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004045 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004046
Benjamin Petersonb204a422011-06-05 22:04:07 -05004047 /* Slow fallback, just in case */
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004048 for (j = co->co_posonlyargcount; j < total_args; j++) {
Victor Stinner6fea7f72016-08-22 23:17:30 +02004049 PyObject *name = co_varnames[j];
4050 int cmp = PyObject_RichCompareBool( keyword, name, Py_EQ);
4051 if (cmp > 0) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004052 goto kw_found;
Victor Stinner6fea7f72016-08-22 23:17:30 +02004053 }
4054 else if (cmp < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004055 goto fail;
Victor Stinner6fea7f72016-08-22 23:17:30 +02004056 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004057 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004058
Victor Stinner231d1f32017-01-11 02:12:06 +01004059 assert(j >= total_args);
4060 if (kwdict == NULL) {
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004061
Victor Stinner438a12d2019-05-24 17:01:38 +02004062 if (co->co_posonlyargcount
4063 && positional_only_passed_as_keyword(tstate, co,
4064 kwcount, kwnames))
4065 {
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004066 goto fail;
4067 }
4068
Victor Stinner438a12d2019-05-24 17:01:38 +02004069 _PyErr_Format(tstate, PyExc_TypeError,
4070 "%U() got an unexpected keyword argument '%S'",
4071 co->co_name, keyword);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004072 goto fail;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004073 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004074
Christian Heimes0bd447f2013-07-20 14:48:10 +02004075 if (PyDict_SetItem(kwdict, keyword, value) == -1) {
4076 goto fail;
4077 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004078 continue;
Victor Stinnerc7020012016-08-16 23:40:29 +02004079
Benjamin Petersonb204a422011-06-05 22:04:07 -05004080 kw_found:
4081 if (GETLOCAL(j) != NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004082 _PyErr_Format(tstate, PyExc_TypeError,
4083 "%U() got multiple values for argument '%S'",
4084 co->co_name, keyword);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004085 goto fail;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004086 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004087 Py_INCREF(value);
4088 SETLOCAL(j, value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004089 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004090
4091 /* Check the number of positional arguments */
Pablo Galindocd74e662019-06-01 18:08:04 +01004092 if ((argcount > co->co_argcount) && !(co->co_flags & CO_VARARGS)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004093 too_many_positional(tstate, co, argcount, defcount, fastlocals);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004094 goto fail;
4095 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004096
4097 /* Add missing positional arguments (copy default values from defs) */
Pablo Galindocd74e662019-06-01 18:08:04 +01004098 if (argcount < co->co_argcount) {
4099 Py_ssize_t m = co->co_argcount - defcount;
Victor Stinner17061a92016-08-16 23:39:42 +02004100 Py_ssize_t missing = 0;
4101 for (i = argcount; i < m; i++) {
4102 if (GETLOCAL(i) == NULL) {
Benjamin Petersone109c702011-06-24 09:37:26 -05004103 missing++;
Victor Stinner17061a92016-08-16 23:39:42 +02004104 }
4105 }
Benjamin Petersone109c702011-06-24 09:37:26 -05004106 if (missing) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004107 missing_arguments(tstate, co, missing, defcount, fastlocals);
Benjamin Petersone109c702011-06-24 09:37:26 -05004108 goto fail;
Benjamin Petersonb204a422011-06-05 22:04:07 -05004109 }
4110 if (n > m)
4111 i = n - m;
4112 else
4113 i = 0;
4114 for (; i < defcount; i++) {
4115 if (GETLOCAL(m+i) == NULL) {
4116 PyObject *def = defs[i];
4117 Py_INCREF(def);
4118 SETLOCAL(m+i, def);
4119 }
4120 }
4121 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004122
4123 /* Add missing keyword arguments (copy default values from kwdefs) */
Benjamin Petersonb204a422011-06-05 22:04:07 -05004124 if (co->co_kwonlyargcount > 0) {
Victor Stinner17061a92016-08-16 23:39:42 +02004125 Py_ssize_t missing = 0;
Pablo Galindocd74e662019-06-01 18:08:04 +01004126 for (i = co->co_argcount; i < total_args; i++) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004127 PyObject *name;
4128 if (GETLOCAL(i) != NULL)
4129 continue;
4130 name = PyTuple_GET_ITEM(co->co_varnames, i);
4131 if (kwdefs != NULL) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02004132 PyObject *def = PyDict_GetItemWithError(kwdefs, name);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004133 if (def) {
4134 Py_INCREF(def);
4135 SETLOCAL(i, def);
4136 continue;
4137 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004138 else if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02004139 goto fail;
4140 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004141 }
Benjamin Petersone109c702011-06-24 09:37:26 -05004142 missing++;
4143 }
4144 if (missing) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004145 missing_arguments(tstate, co, missing, -1, fastlocals);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004146 goto fail;
4147 }
4148 }
4149
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004150 /* Allocate and initialize storage for cell vars, and copy free
Benjamin Peterson90037602011-06-25 22:54:45 -05004151 vars into frame. */
4152 for (i = 0; i < PyTuple_GET_SIZE(co->co_cellvars); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004153 PyObject *c;
Serhiy Storchaka5bb8b912016-12-16 19:19:02 +02004154 Py_ssize_t arg;
Benjamin Peterson90037602011-06-25 22:54:45 -05004155 /* Possibly account for the cell variable being an argument. */
4156 if (co->co_cell2arg != NULL &&
Guido van Rossum6832c812013-05-10 08:47:42 -07004157 (arg = co->co_cell2arg[i]) != CO_CELL_NOT_AN_ARG) {
Benjamin Peterson90037602011-06-25 22:54:45 -05004158 c = PyCell_New(GETLOCAL(arg));
Benjamin Peterson159ae412013-05-12 18:16:06 -05004159 /* Clear the local copy. */
4160 SETLOCAL(arg, NULL);
Guido van Rossum6832c812013-05-10 08:47:42 -07004161 }
4162 else {
Benjamin Peterson90037602011-06-25 22:54:45 -05004163 c = PyCell_New(NULL);
Guido van Rossum6832c812013-05-10 08:47:42 -07004164 }
Benjamin Peterson159ae412013-05-12 18:16:06 -05004165 if (c == NULL)
4166 goto fail;
Benjamin Peterson90037602011-06-25 22:54:45 -05004167 SETLOCAL(co->co_nlocals + i, c);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004168 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004169
4170 /* Copy closure variables to free variables */
Benjamin Peterson90037602011-06-25 22:54:45 -05004171 for (i = 0; i < PyTuple_GET_SIZE(co->co_freevars); ++i) {
4172 PyObject *o = PyTuple_GET_ITEM(closure, i);
4173 Py_INCREF(o);
4174 freevars[PyTuple_GET_SIZE(co->co_cellvars) + i] = o;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004175 }
Tim Peters5ca576e2001-06-18 22:08:13 +00004176
Yury Selivanoveb636452016-09-08 22:01:51 -07004177 /* Handle generator/coroutine/asynchronous generator */
4178 if (co->co_flags & (CO_GENERATOR | CO_COROUTINE | CO_ASYNC_GENERATOR)) {
Yury Selivanov75445082015-05-11 22:57:16 -04004179 PyObject *gen;
Yury Selivanov5376ba92015-06-22 12:19:30 -04004180 int is_coro = co->co_flags & CO_COROUTINE;
Yury Selivanov94c22632015-06-04 10:16:51 -04004181
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004182 /* Don't need to keep the reference to f_back, it will be set
4183 * when the generator is resumed. */
Serhiy Storchaka505ff752014-02-09 13:33:53 +02004184 Py_CLEAR(f->f_back);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00004185
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004186 /* Create a new generator that owns the ready to run frame
4187 * and return that as the value. */
Yury Selivanov5376ba92015-06-22 12:19:30 -04004188 if (is_coro) {
4189 gen = PyCoro_New(f, name, qualname);
Yury Selivanoveb636452016-09-08 22:01:51 -07004190 } else if (co->co_flags & CO_ASYNC_GENERATOR) {
4191 gen = PyAsyncGen_New(f, name, qualname);
Yury Selivanov5376ba92015-06-22 12:19:30 -04004192 } else {
4193 gen = PyGen_NewWithQualName(f, name, qualname);
4194 }
INADA Naoki6a3cedf2016-12-26 18:01:46 +09004195 if (gen == NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04004196 return NULL;
INADA Naoki6a3cedf2016-12-26 18:01:46 +09004197 }
INADA Naoki9c157762016-12-26 18:52:46 +09004198
INADA Naoki6a3cedf2016-12-26 18:01:46 +09004199 _PyObject_GC_TRACK(f);
Yury Selivanov75445082015-05-11 22:57:16 -04004200
Yury Selivanov75445082015-05-11 22:57:16 -04004201 return gen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004202 }
Tim Peters5ca576e2001-06-18 22:08:13 +00004203
Victor Stinnerb9e68122019-11-14 12:20:46 +01004204 retval = _PyEval_EvalFrame(tstate, f, 0);
Tim Peters5ca576e2001-06-18 22:08:13 +00004205
Thomas Woutersce272b62007-09-19 21:19:28 +00004206fail: /* Jump here from prelude on failure */
Tim Peters5ca576e2001-06-18 22:08:13 +00004207
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004208 /* decref'ing the frame can cause __del__ methods to get invoked,
4209 which can call back into Python. While we're done with the
4210 current Python frame (f), the associated C stack is still in use,
4211 so recursion_depth must be boosted for the duration.
4212 */
INADA Naoki5a625d02016-12-24 20:19:08 +09004213 if (Py_REFCNT(f) > 1) {
4214 Py_DECREF(f);
4215 _PyObject_GC_TRACK(f);
4216 }
4217 else {
4218 ++tstate->recursion_depth;
4219 Py_DECREF(f);
4220 --tstate->recursion_depth;
4221 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004222 return retval;
Tim Peters5ca576e2001-06-18 22:08:13 +00004223}
4224
Victor Stinnerb5e170f2019-11-16 01:03:22 +01004225
4226PyObject *
4227_PyEval_EvalCodeWithName(PyObject *_co, PyObject *globals, PyObject *locals,
4228 PyObject *const *args, Py_ssize_t argcount,
4229 PyObject *const *kwnames, PyObject *const *kwargs,
4230 Py_ssize_t kwcount, int kwstep,
4231 PyObject *const *defs, Py_ssize_t defcount,
4232 PyObject *kwdefs, PyObject *closure,
4233 PyObject *name, PyObject *qualname)
4234{
4235 PyThreadState *tstate = _PyThreadState_GET();
4236 return _PyEval_EvalCode(tstate, _co, globals, locals,
4237 args, argcount,
4238 kwnames, kwargs,
4239 kwcount, kwstep,
4240 defs, defcount,
4241 kwdefs, closure,
4242 name, qualname);
4243}
4244
Victor Stinner40ee3012014-06-16 15:59:28 +02004245PyObject *
4246PyEval_EvalCodeEx(PyObject *_co, PyObject *globals, PyObject *locals,
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02004247 PyObject *const *args, int argcount,
4248 PyObject *const *kws, int kwcount,
4249 PyObject *const *defs, int defcount,
4250 PyObject *kwdefs, PyObject *closure)
Victor Stinner40ee3012014-06-16 15:59:28 +02004251{
4252 return _PyEval_EvalCodeWithName(_co, globals, locals,
Victor Stinner9be7e7b2016-08-19 16:11:43 +02004253 args, argcount,
Zackery Spytzc6ea8972017-07-31 08:24:37 -06004254 kws, kws != NULL ? kws + 1 : NULL,
4255 kwcount, 2,
Victor Stinner9be7e7b2016-08-19 16:11:43 +02004256 defs, defcount,
4257 kwdefs, closure,
Victor Stinner40ee3012014-06-16 15:59:28 +02004258 NULL, NULL);
4259}
Tim Peters5ca576e2001-06-18 22:08:13 +00004260
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004261static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02004262special_lookup(PyThreadState *tstate, PyObject *o, _Py_Identifier *id)
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004263{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004264 PyObject *res;
Benjamin Petersonce798522012-01-22 11:24:29 -05004265 res = _PyObject_LookupSpecial(o, id);
Victor Stinner438a12d2019-05-24 17:01:38 +02004266 if (res == NULL && !_PyErr_Occurred(tstate)) {
4267 _PyErr_SetObject(tstate, PyExc_AttributeError, id->object);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004268 return NULL;
4269 }
4270 return res;
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004271}
4272
4273
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00004274/* Logic for the raise statement (too complicated for inlining).
4275 This *consumes* a reference count to each of its arguments. */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004276static int
Victor Stinner09532fe2019-05-10 23:39:09 +02004277do_raise(PyThreadState *tstate, PyObject *exc, PyObject *cause)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00004278{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004279 PyObject *type = NULL, *value = NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00004280
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004281 if (exc == NULL) {
4282 /* Reraise */
Mark Shannonae3087c2017-10-22 22:41:51 +01004283 _PyErr_StackItem *exc_info = _PyErr_GetTopmostException(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004284 PyObject *tb;
Mark Shannonae3087c2017-10-22 22:41:51 +01004285 type = exc_info->exc_type;
4286 value = exc_info->exc_value;
4287 tb = exc_info->exc_traceback;
Victor Stinnereec93312016-08-18 18:13:10 +02004288 if (type == Py_None || type == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004289 _PyErr_SetString(tstate, PyExc_RuntimeError,
4290 "No active exception to reraise");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004291 return 0;
4292 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004293 Py_XINCREF(type);
4294 Py_XINCREF(value);
4295 Py_XINCREF(tb);
Victor Stinner438a12d2019-05-24 17:01:38 +02004296 _PyErr_Restore(tstate, type, value, tb);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004297 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004298 }
Guido van Rossumac7be682001-01-17 15:42:30 +00004299
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004300 /* We support the following forms of raise:
4301 raise
Collin Winter828f04a2007-08-31 00:04:24 +00004302 raise <instance>
4303 raise <type> */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00004304
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004305 if (PyExceptionClass_Check(exc)) {
4306 type = exc;
Victor Stinnera5ed5f02016-12-06 18:45:50 +01004307 value = _PyObject_CallNoArg(exc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004308 if (value == NULL)
4309 goto raise_error;
Benjamin Peterson5afa03a2011-07-15 14:09:26 -05004310 if (!PyExceptionInstance_Check(value)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004311 _PyErr_Format(tstate, PyExc_TypeError,
4312 "calling %R should have returned an instance of "
4313 "BaseException, not %R",
4314 type, Py_TYPE(value));
4315 goto raise_error;
Benjamin Peterson5afa03a2011-07-15 14:09:26 -05004316 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004317 }
4318 else if (PyExceptionInstance_Check(exc)) {
4319 value = exc;
4320 type = PyExceptionInstance_Class(exc);
4321 Py_INCREF(type);
4322 }
4323 else {
4324 /* Not something you can raise. You get an exception
4325 anyway, just not what you specified :-) */
4326 Py_DECREF(exc);
Victor Stinner438a12d2019-05-24 17:01:38 +02004327 _PyErr_SetString(tstate, PyExc_TypeError,
4328 "exceptions must derive from BaseException");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004329 goto raise_error;
4330 }
Collin Winter828f04a2007-08-31 00:04:24 +00004331
Serhiy Storchakac0191582016-09-27 11:37:10 +03004332 assert(type != NULL);
4333 assert(value != NULL);
4334
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004335 if (cause) {
4336 PyObject *fixed_cause;
4337 if (PyExceptionClass_Check(cause)) {
Victor Stinnera5ed5f02016-12-06 18:45:50 +01004338 fixed_cause = _PyObject_CallNoArg(cause);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004339 if (fixed_cause == NULL)
4340 goto raise_error;
Benjamin Petersond5a1c442012-05-14 22:09:31 -07004341 Py_DECREF(cause);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004342 }
Benjamin Petersond5a1c442012-05-14 22:09:31 -07004343 else if (PyExceptionInstance_Check(cause)) {
4344 fixed_cause = cause;
4345 }
4346 else if (cause == Py_None) {
4347 Py_DECREF(cause);
4348 fixed_cause = NULL;
4349 }
4350 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02004351 _PyErr_SetString(tstate, PyExc_TypeError,
4352 "exception causes must derive from "
4353 "BaseException");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004354 goto raise_error;
4355 }
Benjamin Petersond5a1c442012-05-14 22:09:31 -07004356 PyException_SetCause(value, fixed_cause);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004357 }
Collin Winter828f04a2007-08-31 00:04:24 +00004358
Victor Stinner438a12d2019-05-24 17:01:38 +02004359 _PyErr_SetObject(tstate, type, value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004360 /* PyErr_SetObject incref's its arguments */
Serhiy Storchakac0191582016-09-27 11:37:10 +03004361 Py_DECREF(value);
4362 Py_DECREF(type);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004363 return 0;
Collin Winter828f04a2007-08-31 00:04:24 +00004364
4365raise_error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004366 Py_XDECREF(value);
4367 Py_XDECREF(type);
4368 Py_XDECREF(cause);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004369 return 0;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00004370}
4371
Tim Petersd6d010b2001-06-21 02:49:55 +00004372/* Iterate v argcnt times and store the results on the stack (via decreasing
Guido van Rossum0368b722007-05-11 16:50:42 +00004373 sp). Return 1 for success, 0 if error.
Antoine Pitrou9a2310d2008-07-25 22:39:39 +00004374
Guido van Rossum0368b722007-05-11 16:50:42 +00004375 If argcntafter == -1, do a simple unpack. If it is >= 0, do an unpack
4376 with a variable target.
4377*/
Tim Petersd6d010b2001-06-21 02:49:55 +00004378
Barry Warsawe42b18f1997-08-25 22:13:04 +00004379static int
Victor Stinner438a12d2019-05-24 17:01:38 +02004380unpack_iterable(PyThreadState *tstate, PyObject *v,
4381 int argcnt, int argcntafter, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00004382{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004383 int i = 0, j = 0;
4384 Py_ssize_t ll = 0;
4385 PyObject *it; /* iter(v) */
4386 PyObject *w;
4387 PyObject *l = NULL; /* variable list */
Guido van Rossumac7be682001-01-17 15:42:30 +00004388
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004389 assert(v != NULL);
Tim Petersd6d010b2001-06-21 02:49:55 +00004390
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004391 it = PyObject_GetIter(v);
Serhiy Storchaka13a6c092017-12-26 12:30:41 +02004392 if (it == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004393 if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError) &&
Serhiy Storchaka13a6c092017-12-26 12:30:41 +02004394 v->ob_type->tp_iter == NULL && !PySequence_Check(v))
4395 {
Victor Stinner438a12d2019-05-24 17:01:38 +02004396 _PyErr_Format(tstate, PyExc_TypeError,
4397 "cannot unpack non-iterable %.200s object",
4398 v->ob_type->tp_name);
Serhiy Storchaka13a6c092017-12-26 12:30:41 +02004399 }
4400 return 0;
4401 }
Tim Petersd6d010b2001-06-21 02:49:55 +00004402
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004403 for (; i < argcnt; i++) {
4404 w = PyIter_Next(it);
4405 if (w == NULL) {
4406 /* Iterator done, via error or exhaustion. */
Victor Stinner438a12d2019-05-24 17:01:38 +02004407 if (!_PyErr_Occurred(tstate)) {
R David Murray4171bbe2015-04-15 17:08:45 -04004408 if (argcntafter == -1) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004409 _PyErr_Format(tstate, PyExc_ValueError,
4410 "not enough values to unpack "
4411 "(expected %d, got %d)",
4412 argcnt, i);
R David Murray4171bbe2015-04-15 17:08:45 -04004413 }
4414 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02004415 _PyErr_Format(tstate, PyExc_ValueError,
4416 "not enough values to unpack "
4417 "(expected at least %d, got %d)",
4418 argcnt + argcntafter, i);
R David Murray4171bbe2015-04-15 17:08:45 -04004419 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004420 }
4421 goto Error;
4422 }
4423 *--sp = w;
4424 }
Tim Petersd6d010b2001-06-21 02:49:55 +00004425
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004426 if (argcntafter == -1) {
4427 /* We better have exhausted the iterator now. */
4428 w = PyIter_Next(it);
4429 if (w == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004430 if (_PyErr_Occurred(tstate))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004431 goto Error;
4432 Py_DECREF(it);
4433 return 1;
4434 }
4435 Py_DECREF(w);
Victor Stinner438a12d2019-05-24 17:01:38 +02004436 _PyErr_Format(tstate, PyExc_ValueError,
4437 "too many values to unpack (expected %d)",
4438 argcnt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004439 goto Error;
4440 }
Guido van Rossum0368b722007-05-11 16:50:42 +00004441
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004442 l = PySequence_List(it);
4443 if (l == NULL)
4444 goto Error;
4445 *--sp = l;
4446 i++;
Guido van Rossum0368b722007-05-11 16:50:42 +00004447
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004448 ll = PyList_GET_SIZE(l);
4449 if (ll < argcntafter) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004450 _PyErr_Format(tstate, PyExc_ValueError,
R David Murray4171bbe2015-04-15 17:08:45 -04004451 "not enough values to unpack (expected at least %d, got %zd)",
4452 argcnt + argcntafter, argcnt + ll);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004453 goto Error;
4454 }
Guido van Rossum0368b722007-05-11 16:50:42 +00004455
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004456 /* Pop the "after-variable" args off the list. */
4457 for (j = argcntafter; j > 0; j--, i++) {
4458 *--sp = PyList_GET_ITEM(l, ll - j);
4459 }
4460 /* Resize the list. */
4461 Py_SIZE(l) = ll - argcntafter;
4462 Py_DECREF(it);
4463 return 1;
Guido van Rossum0368b722007-05-11 16:50:42 +00004464
Tim Petersd6d010b2001-06-21 02:49:55 +00004465Error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004466 for (; i > 0; i--, sp++)
4467 Py_DECREF(*sp);
4468 Py_XDECREF(it);
4469 return 0;
Barry Warsawe42b18f1997-08-25 22:13:04 +00004470}
4471
4472
Guido van Rossum96a42c81992-01-12 02:29:51 +00004473#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00004474static int
Victor Stinner438a12d2019-05-24 17:01:38 +02004475prtrace(PyThreadState *tstate, PyObject *v, const char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004476{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004477 printf("%s ", str);
Victor Stinner438a12d2019-05-24 17:01:38 +02004478 if (PyObject_Print(v, stdout, 0) != 0) {
4479 /* Don't know what else to do */
4480 _PyErr_Clear(tstate);
4481 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004482 printf("\n");
4483 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004484}
Guido van Rossum3f5da241990-12-20 15:06:42 +00004485#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004486
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00004487static void
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004488call_exc_trace(Py_tracefunc func, PyObject *self,
4489 PyThreadState *tstate, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00004490{
Victor Stinneraaa8ed82013-07-10 13:57:55 +02004491 PyObject *type, *value, *traceback, *orig_traceback, *arg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004492 int err;
Victor Stinner438a12d2019-05-24 17:01:38 +02004493 _PyErr_Fetch(tstate, &type, &value, &orig_traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004494 if (value == NULL) {
4495 value = Py_None;
4496 Py_INCREF(value);
4497 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004498 _PyErr_NormalizeException(tstate, &type, &value, &orig_traceback);
Antoine Pitrou89335212013-11-23 14:05:23 +01004499 traceback = (orig_traceback != NULL) ? orig_traceback : Py_None;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004500 arg = PyTuple_Pack(3, type, value, traceback);
4501 if (arg == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004502 _PyErr_Restore(tstate, type, value, orig_traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004503 return;
4504 }
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004505 err = call_trace(func, self, tstate, f, PyTrace_EXCEPTION, arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004506 Py_DECREF(arg);
Victor Stinner438a12d2019-05-24 17:01:38 +02004507 if (err == 0) {
4508 _PyErr_Restore(tstate, type, value, orig_traceback);
4509 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004510 else {
4511 Py_XDECREF(type);
4512 Py_XDECREF(value);
Victor Stinneraaa8ed82013-07-10 13:57:55 +02004513 Py_XDECREF(orig_traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004514 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00004515}
4516
Amaury Forgeot d'Arcf05149a2007-11-13 01:05:30 +00004517static int
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004518call_trace_protected(Py_tracefunc func, PyObject *obj,
4519 PyThreadState *tstate, PyFrameObject *frame,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004520 int what, PyObject *arg)
Fred Drake4ec5d562001-10-04 19:26:43 +00004521{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004522 PyObject *type, *value, *traceback;
4523 int err;
Victor Stinner438a12d2019-05-24 17:01:38 +02004524 _PyErr_Fetch(tstate, &type, &value, &traceback);
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004525 err = call_trace(func, obj, tstate, frame, what, arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004526 if (err == 0)
4527 {
Victor Stinner438a12d2019-05-24 17:01:38 +02004528 _PyErr_Restore(tstate, type, value, traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004529 return 0;
4530 }
4531 else {
4532 Py_XDECREF(type);
4533 Py_XDECREF(value);
4534 Py_XDECREF(traceback);
4535 return -1;
4536 }
Fred Drake4ec5d562001-10-04 19:26:43 +00004537}
4538
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00004539static int
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004540call_trace(Py_tracefunc func, PyObject *obj,
4541 PyThreadState *tstate, PyFrameObject *frame,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004542 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00004543{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004544 int result;
4545 if (tstate->tracing)
4546 return 0;
4547 tstate->tracing++;
4548 tstate->use_tracing = 0;
4549 result = func(obj, frame, what, arg);
4550 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
4551 || (tstate->c_profilefunc != NULL));
4552 tstate->tracing--;
4553 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00004554}
4555
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00004556PyObject *
4557_PyEval_CallTracing(PyObject *func, PyObject *args)
4558{
Victor Stinner50b48572018-11-01 01:51:40 +01004559 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004560 int save_tracing = tstate->tracing;
4561 int save_use_tracing = tstate->use_tracing;
4562 PyObject *result;
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00004563
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004564 tstate->tracing = 0;
4565 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
4566 || (tstate->c_profilefunc != NULL));
4567 result = PyObject_Call(func, args, NULL);
4568 tstate->tracing = save_tracing;
4569 tstate->use_tracing = save_use_tracing;
4570 return result;
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00004571}
4572
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00004573/* See Objects/lnotab_notes.txt for a description of how tracing works. */
Michael W. Hudson006c7522002-11-08 13:08:46 +00004574static int
Tim Peters8a5c3c72004-04-05 19:36:21 +00004575maybe_call_line_trace(Py_tracefunc func, PyObject *obj,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004576 PyThreadState *tstate, PyFrameObject *frame,
4577 int *instr_lb, int *instr_ub, int *instr_prev)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004578{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004579 int result = 0;
4580 int line = frame->f_lineno;
Michael W. Hudson006c7522002-11-08 13:08:46 +00004581
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004582 /* If the last instruction executed isn't in the current
4583 instruction window, reset the window.
4584 */
4585 if (frame->f_lasti < *instr_lb || frame->f_lasti >= *instr_ub) {
4586 PyAddrPair bounds;
4587 line = _PyCode_CheckLineNumber(frame->f_code, frame->f_lasti,
4588 &bounds);
4589 *instr_lb = bounds.ap_lower;
4590 *instr_ub = bounds.ap_upper;
4591 }
Nick Coghlan5a851672017-09-08 10:14:16 +10004592 /* If the last instruction falls at the start of a line or if it
4593 represents a jump backwards, update the frame's line number and
4594 then call the trace function if we're tracing source lines.
4595 */
4596 if ((frame->f_lasti == *instr_lb || frame->f_lasti < *instr_prev)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004597 frame->f_lineno = line;
Nick Coghlan5a851672017-09-08 10:14:16 +10004598 if (frame->f_trace_lines) {
4599 result = call_trace(func, obj, tstate, frame, PyTrace_LINE, Py_None);
4600 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004601 }
George King20faa682017-10-18 17:44:22 -07004602 /* Always emit an opcode event if we're tracing all opcodes. */
4603 if (frame->f_trace_opcodes) {
4604 result = call_trace(func, obj, tstate, frame, PyTrace_OPCODE, Py_None);
4605 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004606 *instr_prev = frame->f_lasti;
4607 return result;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004608}
4609
Fred Drake5755ce62001-06-27 19:19:46 +00004610void
4611PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00004612{
Steve Dowerb82e17e2019-05-23 08:45:22 -07004613 if (PySys_Audit("sys.setprofile", NULL) < 0) {
4614 return;
4615 }
4616
Victor Stinner50b48572018-11-01 01:51:40 +01004617 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004618 PyObject *temp = tstate->c_profileobj;
4619 Py_XINCREF(arg);
4620 tstate->c_profilefunc = NULL;
4621 tstate->c_profileobj = NULL;
4622 /* Must make sure that tracing is not ignored if 'temp' is freed */
4623 tstate->use_tracing = tstate->c_tracefunc != NULL;
4624 Py_XDECREF(temp);
4625 tstate->c_profilefunc = func;
4626 tstate->c_profileobj = arg;
4627 /* Flag that tracing or profiling is turned on */
4628 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
Fred Drake5755ce62001-06-27 19:19:46 +00004629}
4630
4631void
4632PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
4633{
Steve Dowerb82e17e2019-05-23 08:45:22 -07004634 if (PySys_Audit("sys.settrace", NULL) < 0) {
4635 return;
4636 }
4637
Victor Stinner09532fe2019-05-10 23:39:09 +02004638 _PyRuntimeState *runtime = &_PyRuntime;
4639 PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004640 PyObject *temp = tstate->c_traceobj;
Victor Stinner09532fe2019-05-10 23:39:09 +02004641 runtime->ceval.tracing_possible += (func != NULL) - (tstate->c_tracefunc != NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004642 Py_XINCREF(arg);
4643 tstate->c_tracefunc = NULL;
4644 tstate->c_traceobj = NULL;
4645 /* Must make sure that profiling is not ignored if 'temp' is freed */
4646 tstate->use_tracing = tstate->c_profilefunc != NULL;
4647 Py_XDECREF(temp);
4648 tstate->c_tracefunc = func;
4649 tstate->c_traceobj = arg;
4650 /* Flag that tracing or profiling is turned on */
4651 tstate->use_tracing = ((func != NULL)
4652 || (tstate->c_profilefunc != NULL));
Fred Draked0838392001-06-16 21:02:31 +00004653}
4654
Yury Selivanov75445082015-05-11 22:57:16 -04004655void
Victor Stinner838f2642019-06-13 22:41:23 +02004656_PyEval_SetCoroutineOriginTrackingDepth(PyThreadState *tstate, int new_depth)
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08004657{
4658 assert(new_depth >= 0);
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08004659 tstate->coroutine_origin_tracking_depth = new_depth;
4660}
4661
4662int
4663_PyEval_GetCoroutineOriginTrackingDepth(void)
4664{
Victor Stinner50b48572018-11-01 01:51:40 +01004665 PyThreadState *tstate = _PyThreadState_GET();
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08004666 return tstate->coroutine_origin_tracking_depth;
4667}
4668
4669void
Yury Selivanoveb636452016-09-08 22:01:51 -07004670_PyEval_SetAsyncGenFirstiter(PyObject *firstiter)
4671{
Victor Stinner50b48572018-11-01 01:51:40 +01004672 PyThreadState *tstate = _PyThreadState_GET();
Steve Dowerb82e17e2019-05-23 08:45:22 -07004673
4674 if (PySys_Audit("sys.set_asyncgen_hook_firstiter", NULL) < 0) {
4675 return;
4676 }
4677
Yury Selivanoveb636452016-09-08 22:01:51 -07004678 Py_XINCREF(firstiter);
4679 Py_XSETREF(tstate->async_gen_firstiter, firstiter);
4680}
4681
4682PyObject *
4683_PyEval_GetAsyncGenFirstiter(void)
4684{
Victor Stinner50b48572018-11-01 01:51:40 +01004685 PyThreadState *tstate = _PyThreadState_GET();
Yury Selivanoveb636452016-09-08 22:01:51 -07004686 return tstate->async_gen_firstiter;
4687}
4688
4689void
4690_PyEval_SetAsyncGenFinalizer(PyObject *finalizer)
4691{
Victor Stinner50b48572018-11-01 01:51:40 +01004692 PyThreadState *tstate = _PyThreadState_GET();
Steve Dowerb82e17e2019-05-23 08:45:22 -07004693
4694 if (PySys_Audit("sys.set_asyncgen_hook_finalizer", NULL) < 0) {
4695 return;
4696 }
4697
Yury Selivanoveb636452016-09-08 22:01:51 -07004698 Py_XINCREF(finalizer);
4699 Py_XSETREF(tstate->async_gen_finalizer, finalizer);
4700}
4701
4702PyObject *
4703_PyEval_GetAsyncGenFinalizer(void)
4704{
Victor Stinner50b48572018-11-01 01:51:40 +01004705 PyThreadState *tstate = _PyThreadState_GET();
Yury Selivanoveb636452016-09-08 22:01:51 -07004706 return tstate->async_gen_finalizer;
4707}
4708
Victor Stinner438a12d2019-05-24 17:01:38 +02004709static PyFrameObject *
4710_PyEval_GetFrame(PyThreadState *tstate)
4711{
Victor Stinner01b1cc12019-11-20 02:27:56 +01004712 _PyRuntimeState *runtime = tstate->interp->runtime;
4713 return runtime->gilstate.getframe(tstate);
Victor Stinner438a12d2019-05-24 17:01:38 +02004714}
4715
4716PyFrameObject *
4717PyEval_GetFrame(void)
4718{
4719 PyThreadState *tstate = _PyThreadState_GET();
4720 return _PyEval_GetFrame(tstate);
4721}
4722
Guido van Rossumb209a111997-04-29 18:18:01 +00004723PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004724PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00004725{
Victor Stinner438a12d2019-05-24 17:01:38 +02004726 PyThreadState *tstate = _PyThreadState_GET();
4727 PyFrameObject *current_frame = _PyEval_GetFrame(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004728 if (current_frame == NULL)
Victor Stinner438a12d2019-05-24 17:01:38 +02004729 return tstate->interp->builtins;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004730 else
4731 return current_frame->f_builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00004732}
4733
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02004734/* Convenience function to get a builtin from its name */
4735PyObject *
4736_PyEval_GetBuiltinId(_Py_Identifier *name)
4737{
Victor Stinner438a12d2019-05-24 17:01:38 +02004738 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02004739 PyObject *attr = _PyDict_GetItemIdWithError(PyEval_GetBuiltins(), name);
4740 if (attr) {
4741 Py_INCREF(attr);
4742 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004743 else if (!_PyErr_Occurred(tstate)) {
4744 _PyErr_SetObject(tstate, PyExc_AttributeError, _PyUnicode_FromId(name));
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02004745 }
4746 return attr;
4747}
4748
Guido van Rossumb209a111997-04-29 18:18:01 +00004749PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004750PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00004751{
Victor Stinner438a12d2019-05-24 17:01:38 +02004752 PyThreadState *tstate = _PyThreadState_GET();
4753 PyFrameObject *current_frame = _PyEval_GetFrame(tstate);
Victor Stinner41bb43a2013-10-29 01:19:37 +01004754 if (current_frame == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004755 _PyErr_SetString(tstate, PyExc_SystemError, "frame does not exist");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004756 return NULL;
Victor Stinner41bb43a2013-10-29 01:19:37 +01004757 }
4758
Victor Stinner438a12d2019-05-24 17:01:38 +02004759 if (PyFrame_FastToLocalsWithError(current_frame) < 0) {
Victor Stinner41bb43a2013-10-29 01:19:37 +01004760 return NULL;
Victor Stinner438a12d2019-05-24 17:01:38 +02004761 }
Victor Stinner41bb43a2013-10-29 01:19:37 +01004762
4763 assert(current_frame->f_locals != NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004764 return current_frame->f_locals;
Guido van Rossum5b722181993-03-30 17:46:03 +00004765}
4766
Guido van Rossumb209a111997-04-29 18:18:01 +00004767PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004768PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00004769{
Victor Stinner438a12d2019-05-24 17:01:38 +02004770 PyThreadState *tstate = _PyThreadState_GET();
4771 PyFrameObject *current_frame = _PyEval_GetFrame(tstate);
4772 if (current_frame == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004773 return NULL;
Victor Stinner438a12d2019-05-24 17:01:38 +02004774 }
Victor Stinner41bb43a2013-10-29 01:19:37 +01004775
4776 assert(current_frame->f_globals != NULL);
4777 return current_frame->f_globals;
Guido van Rossum3f5da241990-12-20 15:06:42 +00004778}
4779
Guido van Rossum6135a871995-01-09 17:53:26 +00004780int
Tim Peters5ba58662001-07-16 02:29:45 +00004781PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
Jeremy Hylton061d1062001-03-22 02:32:48 +00004782{
Victor Stinner438a12d2019-05-24 17:01:38 +02004783 PyThreadState *tstate = _PyThreadState_GET();
4784 PyFrameObject *current_frame = _PyEval_GetFrame(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004785 int result = cf->cf_flags != 0;
Tim Peters5ba58662001-07-16 02:29:45 +00004786
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004787 if (current_frame != NULL) {
4788 const int codeflags = current_frame->f_code->co_flags;
4789 const int compilerflags = codeflags & PyCF_MASK;
4790 if (compilerflags) {
4791 result = 1;
4792 cf->cf_flags |= compilerflags;
4793 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00004794#if 0 /* future keyword */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004795 if (codeflags & CO_GENERATOR_ALLOWED) {
4796 result = 1;
4797 cf->cf_flags |= CO_GENERATOR_ALLOWED;
4798 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00004799#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004800 }
4801 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00004802}
4803
Guido van Rossum3f5da241990-12-20 15:06:42 +00004804
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00004805const char *
Tim Peters6d6c1a32001-08-02 04:15:00 +00004806PyEval_GetFuncName(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00004807{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004808 if (PyMethod_Check(func))
4809 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
4810 else if (PyFunction_Check(func))
Serhiy Storchaka06515832016-11-20 09:13:07 +02004811 return PyUnicode_AsUTF8(((PyFunctionObject*)func)->func_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004812 else if (PyCFunction_Check(func))
4813 return ((PyCFunctionObject*)func)->m_ml->ml_name;
4814 else
4815 return func->ob_type->tp_name;
Jeremy Hylton512a2372001-04-11 13:52:29 +00004816}
4817
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00004818const char *
Tim Peters6d6c1a32001-08-02 04:15:00 +00004819PyEval_GetFuncDesc(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00004820{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004821 if (PyMethod_Check(func))
4822 return "()";
4823 else if (PyFunction_Check(func))
4824 return "()";
4825 else if (PyCFunction_Check(func))
4826 return "()";
4827 else
4828 return " object";
Jeremy Hylton512a2372001-04-11 13:52:29 +00004829}
4830
Armin Rigo1c2d7e52005-09-20 18:34:01 +00004831#define C_TRACE(x, call) \
Nicholas Bastind858a772004-06-25 23:31:06 +00004832if (tstate->use_tracing && tstate->c_profilefunc) { \
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004833 if (call_trace(tstate->c_profilefunc, tstate->c_profileobj, \
4834 tstate, tstate->frame, \
4835 PyTrace_C_CALL, func)) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004836 x = NULL; \
4837 } \
4838 else { \
4839 x = call; \
4840 if (tstate->c_profilefunc != NULL) { \
4841 if (x == NULL) { \
4842 call_trace_protected(tstate->c_profilefunc, \
4843 tstate->c_profileobj, \
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004844 tstate, tstate->frame, \
4845 PyTrace_C_EXCEPTION, func); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004846 /* XXX should pass (type, value, tb) */ \
4847 } else { \
4848 if (call_trace(tstate->c_profilefunc, \
4849 tstate->c_profileobj, \
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004850 tstate, tstate->frame, \
4851 PyTrace_C_RETURN, func)) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004852 Py_DECREF(x); \
4853 x = NULL; \
4854 } \
4855 } \
4856 } \
4857 } \
Nicholas Bastind858a772004-06-25 23:31:06 +00004858} else { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004859 x = call; \
4860 }
Nicholas Bastinc69ebe82004-03-24 21:57:10 +00004861
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02004862
4863static PyObject *
4864trace_call_function(PyThreadState *tstate,
4865 PyObject *func,
4866 PyObject **args, Py_ssize_t nargs,
4867 PyObject *kwnames)
4868{
4869 PyObject *x;
4870 if (PyCFunction_Check(func)) {
Jeroen Demeyer0d722f32019-07-05 14:48:24 +02004871 C_TRACE(x, _PyObject_Vectorcall(func, args, nargs, kwnames));
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02004872 return x;
4873 }
4874 else if (Py_TYPE(func) == &PyMethodDescr_Type && nargs > 0) {
4875 /* We need to create a temporary bound method as argument
4876 for profiling.
4877
4878 If nargs == 0, then this cannot work because we have no
4879 "self". In any case, the call itself would raise
4880 TypeError (foo needs an argument), so we just skip
4881 profiling. */
4882 PyObject *self = args[0];
4883 func = Py_TYPE(func)->tp_descr_get(func, self, (PyObject*)Py_TYPE(self));
4884 if (func == NULL) {
4885 return NULL;
4886 }
Jeroen Demeyer0d722f32019-07-05 14:48:24 +02004887 C_TRACE(x, _PyObject_Vectorcall(func,
4888 args+1, nargs-1,
4889 kwnames));
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02004890 Py_DECREF(func);
4891 return x;
4892 }
4893 return _PyObject_Vectorcall(func, args, nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames);
4894}
4895
Victor Stinner415c5102017-01-11 00:54:57 +01004896/* Issue #29227: Inline call_function() into _PyEval_EvalFrameDefault()
4897 to reduce the stack consumption. */
4898Py_LOCAL_INLINE(PyObject *) _Py_HOT_FUNCTION
Victor Stinner09532fe2019-05-10 23:39:09 +02004899call_function(PyThreadState *tstate, PyObject ***pp_stack, Py_ssize_t oparg, PyObject *kwnames)
Jeremy Hyltone8c04322002-08-16 17:47:26 +00004900{
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004901 PyObject **pfunc = (*pp_stack) - oparg - 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004902 PyObject *func = *pfunc;
4903 PyObject *x, *w;
Victor Stinnerd8735722016-09-09 12:36:44 -07004904 Py_ssize_t nkwargs = (kwnames == NULL) ? 0 : PyTuple_GET_SIZE(kwnames);
4905 Py_ssize_t nargs = oparg - nkwargs;
INADA Naoki5566bbb2017-02-03 07:43:03 +09004906 PyObject **stack = (*pp_stack) - nargs - nkwargs;
Jeremy Hyltone8c04322002-08-16 17:47:26 +00004907
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02004908 if (tstate->use_tracing) {
4909 x = trace_call_function(tstate, func, stack, nargs, kwnames);
INADA Naoki5566bbb2017-02-03 07:43:03 +09004910 }
Victor Stinner4a7cc882015-03-06 23:35:27 +01004911 else {
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02004912 x = _PyObject_Vectorcall(func, stack, nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004913 }
Tim Peters8a5c3c72004-04-05 19:36:21 +00004914
Victor Stinner438a12d2019-05-24 17:01:38 +02004915 assert((x != NULL) ^ (_PyErr_Occurred(tstate) != NULL));
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004916
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01004917 /* Clear the stack of the function object. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004918 while ((*pp_stack) > pfunc) {
4919 w = EXT_POP(*pp_stack);
4920 Py_DECREF(w);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004921 }
Victor Stinnerace47d72013-07-18 01:41:08 +02004922
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004923 return x;
Jeremy Hyltone8c04322002-08-16 17:47:26 +00004924}
4925
Jeremy Hylton52820442001-01-03 23:52:36 +00004926static PyObject *
Victor Stinner09532fe2019-05-10 23:39:09 +02004927do_call_core(PyThreadState *tstate, PyObject *func, PyObject *callargs, PyObject *kwdict)
Jeremy Hylton52820442001-01-03 23:52:36 +00004928{
jdemeyere89de732018-09-19 12:06:20 +02004929 PyObject *result;
4930
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004931 if (PyCFunction_Check(func)) {
Jeroen Demeyer7a6873c2019-09-11 13:01:01 +02004932 C_TRACE(result, PyObject_Call(func, callargs, kwdict));
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004933 return result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004934 }
jdemeyere89de732018-09-19 12:06:20 +02004935 else if (Py_TYPE(func) == &PyMethodDescr_Type) {
jdemeyere89de732018-09-19 12:06:20 +02004936 Py_ssize_t nargs = PyTuple_GET_SIZE(callargs);
4937 if (nargs > 0 && tstate->use_tracing) {
4938 /* We need to create a temporary bound method as argument
4939 for profiling.
4940
4941 If nargs == 0, then this cannot work because we have no
4942 "self". In any case, the call itself would raise
4943 TypeError (foo needs an argument), so we just skip
4944 profiling. */
4945 PyObject *self = PyTuple_GET_ITEM(callargs, 0);
4946 func = Py_TYPE(func)->tp_descr_get(func, self, (PyObject*)Py_TYPE(self));
4947 if (func == NULL) {
4948 return NULL;
4949 }
4950
Victor Stinner4d231bc2019-11-14 13:36:21 +01004951 C_TRACE(result, _PyObject_FastCallDictTstate(
4952 tstate, func,
4953 &_PyTuple_ITEMS(callargs)[1],
4954 nargs - 1,
4955 kwdict));
jdemeyere89de732018-09-19 12:06:20 +02004956 Py_DECREF(func);
4957 return result;
4958 }
Victor Stinner74319ae2016-08-25 00:04:09 +02004959 }
jdemeyere89de732018-09-19 12:06:20 +02004960 return PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00004961}
4962
Serhiy Storchaka483405b2015-02-17 10:14:30 +02004963/* Extract a slice index from a PyLong or an object with the
Guido van Rossum38fff8c2006-03-07 18:50:55 +00004964 nb_index slot defined, and store in *pi.
4965 Silently reduce values larger than PY_SSIZE_T_MAX to PY_SSIZE_T_MAX,
Xiang Zhang2ddf5a12017-05-10 18:19:41 +08004966 and silently boost values less than PY_SSIZE_T_MIN to PY_SSIZE_T_MIN.
Martin v. Löwisdde99d22006-02-17 15:57:41 +00004967 Return 0 on error, 1 on success.
Tim Peterscb479e72001-12-16 19:11:44 +00004968*/
Guido van Rossum20c6add2000-05-08 14:06:50 +00004969int
Martin v. Löwis18e16552006-02-15 17:27:45 +00004970_PyEval_SliceIndex(PyObject *v, Py_ssize_t *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004971{
Victor Stinner438a12d2019-05-24 17:01:38 +02004972 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03004973 if (v != Py_None) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004974 Py_ssize_t x;
4975 if (PyIndex_Check(v)) {
4976 x = PyNumber_AsSsize_t(v, NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02004977 if (x == -1 && _PyErr_Occurred(tstate))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004978 return 0;
4979 }
4980 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02004981 _PyErr_SetString(tstate, PyExc_TypeError,
4982 "slice indices must be integers or "
4983 "None or have an __index__ method");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004984 return 0;
4985 }
4986 *pi = x;
4987 }
4988 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004989}
4990
Serhiy Storchaka80ec8362017-03-19 19:37:40 +02004991int
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03004992_PyEval_SliceIndexNotNone(PyObject *v, Py_ssize_t *pi)
Serhiy Storchaka80ec8362017-03-19 19:37:40 +02004993{
Victor Stinner438a12d2019-05-24 17:01:38 +02004994 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03004995 Py_ssize_t x;
4996 if (PyIndex_Check(v)) {
4997 x = PyNumber_AsSsize_t(v, NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02004998 if (x == -1 && _PyErr_Occurred(tstate))
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03004999 return 0;
5000 }
5001 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02005002 _PyErr_SetString(tstate, PyExc_TypeError,
5003 "slice indices must be integers or "
5004 "have an __index__ method");
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005005 return 0;
5006 }
5007 *pi = x;
5008 return 1;
Serhiy Storchaka80ec8362017-03-19 19:37:40 +02005009}
5010
Thomas Wouters52152252000-08-17 22:55:00 +00005011static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02005012import_name(PyThreadState *tstate, PyFrameObject *f,
5013 PyObject *name, PyObject *fromlist, PyObject *level)
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005014{
5015 _Py_IDENTIFIER(__import__);
Victor Stinnerdf142fd2016-08-20 00:44:42 +02005016 PyObject *import_func, *res;
5017 PyObject* stack[5];
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005018
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02005019 import_func = _PyDict_GetItemIdWithError(f->f_builtins, &PyId___import__);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005020 if (import_func == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005021 if (!_PyErr_Occurred(tstate)) {
5022 _PyErr_SetString(tstate, PyExc_ImportError, "__import__ not found");
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02005023 }
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005024 return NULL;
5025 }
5026
5027 /* Fast path for not overloaded __import__. */
Victor Stinner438a12d2019-05-24 17:01:38 +02005028 if (import_func == tstate->interp->import_func) {
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005029 int ilevel = _PyLong_AsInt(level);
Victor Stinner438a12d2019-05-24 17:01:38 +02005030 if (ilevel == -1 && _PyErr_Occurred(tstate)) {
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005031 return NULL;
5032 }
5033 res = PyImport_ImportModuleLevelObject(
5034 name,
5035 f->f_globals,
5036 f->f_locals == NULL ? Py_None : f->f_locals,
5037 fromlist,
5038 ilevel);
5039 return res;
5040 }
5041
5042 Py_INCREF(import_func);
Victor Stinnerdf142fd2016-08-20 00:44:42 +02005043
5044 stack[0] = name;
5045 stack[1] = f->f_globals;
5046 stack[2] = f->f_locals == NULL ? Py_None : f->f_locals;
5047 stack[3] = fromlist;
5048 stack[4] = level;
Victor Stinner559bb6a2016-08-22 22:48:54 +02005049 res = _PyObject_FastCall(import_func, stack, 5);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005050 Py_DECREF(import_func);
5051 return res;
5052}
5053
5054static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02005055import_from(PyThreadState *tstate, PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00005056{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005057 PyObject *x;
Antoine Pitrou0373a102014-10-13 20:19:45 +02005058 _Py_IDENTIFIER(__name__);
Xiang Zhang4830f582017-03-21 11:13:42 +08005059 PyObject *fullmodname, *pkgname, *pkgpath, *pkgname_or_unknown, *errmsg;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00005060
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005061 if (_PyObject_LookupAttr(v, name, &x) != 0) {
Antoine Pitrou0373a102014-10-13 20:19:45 +02005062 return x;
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005063 }
Antoine Pitrou0373a102014-10-13 20:19:45 +02005064 /* Issue #17636: in case this failed because of a circular relative
5065 import, try to fallback on reading the module directly from
5066 sys.modules. */
Antoine Pitrou0373a102014-10-13 20:19:45 +02005067 pkgname = _PyObject_GetAttrId(v, &PyId___name__);
Brett Cannon3008bc02015-08-11 18:01:31 -07005068 if (pkgname == NULL) {
5069 goto error;
5070 }
Oren Milman6db70332017-09-19 14:23:01 +03005071 if (!PyUnicode_Check(pkgname)) {
5072 Py_CLEAR(pkgname);
5073 goto error;
5074 }
Antoine Pitrou0373a102014-10-13 20:19:45 +02005075 fullmodname = PyUnicode_FromFormat("%U.%U", pkgname, name);
Brett Cannon3008bc02015-08-11 18:01:31 -07005076 if (fullmodname == NULL) {
Xiang Zhang4830f582017-03-21 11:13:42 +08005077 Py_DECREF(pkgname);
Antoine Pitrou0373a102014-10-13 20:19:45 +02005078 return NULL;
Brett Cannon3008bc02015-08-11 18:01:31 -07005079 }
Eric Snow3f9eee62017-09-15 16:35:20 -06005080 x = PyImport_GetModule(fullmodname);
Antoine Pitrou0373a102014-10-13 20:19:45 +02005081 Py_DECREF(fullmodname);
Victor Stinner438a12d2019-05-24 17:01:38 +02005082 if (x == NULL && !_PyErr_Occurred(tstate)) {
Brett Cannon3008bc02015-08-11 18:01:31 -07005083 goto error;
5084 }
Matthias Bussonnier1bc15642017-02-22 07:06:50 -08005085 Py_DECREF(pkgname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005086 return x;
Brett Cannon3008bc02015-08-11 18:01:31 -07005087 error:
Matthias Bussonnierbc4bed42017-02-14 16:05:25 -08005088 pkgpath = PyModule_GetFilenameObject(v);
Matthias Bussonnier1bc15642017-02-22 07:06:50 -08005089 if (pkgname == NULL) {
5090 pkgname_or_unknown = PyUnicode_FromString("<unknown module name>");
5091 if (pkgname_or_unknown == NULL) {
5092 Py_XDECREF(pkgpath);
5093 return NULL;
5094 }
5095 } else {
5096 pkgname_or_unknown = pkgname;
5097 }
Matthias Bussonnierbc4bed42017-02-14 16:05:25 -08005098
5099 if (pkgpath == NULL || !PyUnicode_Check(pkgpath)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005100 _PyErr_Clear(tstate);
Xiang Zhang4830f582017-03-21 11:13:42 +08005101 errmsg = PyUnicode_FromFormat(
5102 "cannot import name %R from %R (unknown location)",
5103 name, pkgname_or_unknown
5104 );
Stefan Krah027b09c2019-03-25 21:50:58 +01005105 /* NULL checks for errmsg and pkgname done by PyErr_SetImportError. */
Xiang Zhang4830f582017-03-21 11:13:42 +08005106 PyErr_SetImportError(errmsg, pkgname, NULL);
5107 }
5108 else {
Anthony Sottile65366bc2019-09-09 08:17:50 -07005109 _Py_IDENTIFIER(__spec__);
5110 PyObject *spec = _PyObject_GetAttrId(v, &PyId___spec__);
Anthony Sottile65366bc2019-09-09 08:17:50 -07005111 const char *fmt =
5112 _PyModuleSpec_IsInitializing(spec) ?
5113 "cannot import name %R from partially initialized module %R "
5114 "(most likely due to a circular import) (%S)" :
5115 "cannot import name %R from %R (%S)";
5116 Py_XDECREF(spec);
5117
5118 errmsg = PyUnicode_FromFormat(fmt, name, pkgname_or_unknown, pkgpath);
Stefan Krah027b09c2019-03-25 21:50:58 +01005119 /* NULL checks for errmsg and pkgname done by PyErr_SetImportError. */
Xiang Zhang4830f582017-03-21 11:13:42 +08005120 PyErr_SetImportError(errmsg, pkgname, pkgpath);
Matthias Bussonnierbc4bed42017-02-14 16:05:25 -08005121 }
5122
Xiang Zhang4830f582017-03-21 11:13:42 +08005123 Py_XDECREF(errmsg);
Matthias Bussonnier1bc15642017-02-22 07:06:50 -08005124 Py_XDECREF(pkgname_or_unknown);
5125 Py_XDECREF(pkgpath);
Brett Cannon3008bc02015-08-11 18:01:31 -07005126 return NULL;
Thomas Wouters52152252000-08-17 22:55:00 +00005127}
Guido van Rossumac7be682001-01-17 15:42:30 +00005128
Thomas Wouters52152252000-08-17 22:55:00 +00005129static int
Victor Stinner438a12d2019-05-24 17:01:38 +02005130import_all_from(PyThreadState *tstate, PyObject *locals, PyObject *v)
Thomas Wouters52152252000-08-17 22:55:00 +00005131{
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02005132 _Py_IDENTIFIER(__all__);
5133 _Py_IDENTIFIER(__dict__);
Xiang Zhangd8b291a2018-03-24 18:39:36 +08005134 _Py_IDENTIFIER(__name__);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005135 PyObject *all, *dict, *name, *value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005136 int skip_leading_underscores = 0;
5137 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00005138
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005139 if (_PyObject_LookupAttrId(v, &PyId___all__, &all) < 0) {
5140 return -1; /* Unexpected error */
5141 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005142 if (all == NULL) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005143 if (_PyObject_LookupAttrId(v, &PyId___dict__, &dict) < 0) {
5144 return -1;
5145 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005146 if (dict == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005147 _PyErr_SetString(tstate, PyExc_ImportError,
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005148 "from-import-* object has no __dict__ and no __all__");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005149 return -1;
5150 }
5151 all = PyMapping_Keys(dict);
5152 Py_DECREF(dict);
5153 if (all == NULL)
5154 return -1;
5155 skip_leading_underscores = 1;
5156 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00005157
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005158 for (pos = 0, err = 0; ; pos++) {
5159 name = PySequence_GetItem(all, pos);
5160 if (name == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005161 if (!_PyErr_ExceptionMatches(tstate, PyExc_IndexError)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005162 err = -1;
Victor Stinner438a12d2019-05-24 17:01:38 +02005163 }
5164 else {
5165 _PyErr_Clear(tstate);
5166 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005167 break;
5168 }
Xiang Zhangd8b291a2018-03-24 18:39:36 +08005169 if (!PyUnicode_Check(name)) {
5170 PyObject *modname = _PyObject_GetAttrId(v, &PyId___name__);
5171 if (modname == NULL) {
5172 Py_DECREF(name);
5173 err = -1;
5174 break;
5175 }
5176 if (!PyUnicode_Check(modname)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005177 _PyErr_Format(tstate, PyExc_TypeError,
5178 "module __name__ must be a string, not %.100s",
5179 Py_TYPE(modname)->tp_name);
Xiang Zhangd8b291a2018-03-24 18:39:36 +08005180 }
5181 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02005182 _PyErr_Format(tstate, PyExc_TypeError,
5183 "%s in %U.%s must be str, not %.100s",
5184 skip_leading_underscores ? "Key" : "Item",
5185 modname,
5186 skip_leading_underscores ? "__dict__" : "__all__",
5187 Py_TYPE(name)->tp_name);
Xiang Zhangd8b291a2018-03-24 18:39:36 +08005188 }
5189 Py_DECREF(modname);
5190 Py_DECREF(name);
5191 err = -1;
5192 break;
5193 }
5194 if (skip_leading_underscores) {
Serhiy Storchakae3b2b4b2017-09-08 09:58:51 +03005195 if (PyUnicode_READY(name) == -1) {
5196 Py_DECREF(name);
5197 err = -1;
5198 break;
5199 }
5200 if (PyUnicode_READ_CHAR(name, 0) == '_') {
5201 Py_DECREF(name);
5202 continue;
5203 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005204 }
5205 value = PyObject_GetAttr(v, name);
5206 if (value == NULL)
5207 err = -1;
5208 else if (PyDict_CheckExact(locals))
5209 err = PyDict_SetItem(locals, name, value);
5210 else
5211 err = PyObject_SetItem(locals, name, value);
5212 Py_DECREF(name);
5213 Py_XDECREF(value);
5214 if (err != 0)
5215 break;
5216 }
5217 Py_DECREF(all);
5218 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00005219}
5220
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005221static int
Victor Stinner438a12d2019-05-24 17:01:38 +02005222check_args_iterable(PyThreadState *tstate, PyObject *func, PyObject *args)
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005223{
5224 if (args->ob_type->tp_iter == NULL && !PySequence_Check(args)) {
Jeroen Demeyerbf17d412019-11-05 16:48:04 +01005225 /* check_args_iterable() may be called with a live exception:
5226 * clear it to prevent calling _PyObject_FunctionStr() with an
5227 * exception set. */
5228 PyErr_Clear();
5229 PyObject *funcstr = _PyObject_FunctionStr(func);
5230 if (funcstr != NULL) {
5231 _PyErr_Format(tstate, PyExc_TypeError,
5232 "%U argument after * must be an iterable, not %.200s",
5233 funcstr, Py_TYPE(args)->tp_name);
5234 Py_DECREF(funcstr);
5235 }
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005236 return -1;
5237 }
5238 return 0;
5239}
5240
5241static void
Victor Stinner438a12d2019-05-24 17:01:38 +02005242format_kwargs_error(PyThreadState *tstate, PyObject *func, PyObject *kwargs)
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005243{
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005244 /* _PyDict_MergeEx raises attribute
5245 * error (percolated from an attempt
5246 * to get 'keys' attribute) instead of
5247 * a type error if its second argument
5248 * is not a mapping.
5249 */
Victor Stinner438a12d2019-05-24 17:01:38 +02005250 if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) {
Jeroen Demeyerbf17d412019-11-05 16:48:04 +01005251 PyErr_Clear();
5252 PyObject *funcstr = _PyObject_FunctionStr(func);
5253 if (funcstr != NULL) {
5254 _PyErr_Format(
5255 tstate, PyExc_TypeError,
5256 "%U argument after ** must be a mapping, not %.200s",
5257 funcstr, Py_TYPE(kwargs)->tp_name);
5258 Py_DECREF(funcstr);
5259 }
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005260 }
Victor Stinner438a12d2019-05-24 17:01:38 +02005261 else if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005262 PyObject *exc, *val, *tb;
Victor Stinner438a12d2019-05-24 17:01:38 +02005263 _PyErr_Fetch(tstate, &exc, &val, &tb);
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005264 if (val && PyTuple_Check(val) && PyTuple_GET_SIZE(val) == 1) {
Jeroen Demeyerbf17d412019-11-05 16:48:04 +01005265 PyErr_Clear();
5266 PyObject *funcstr = _PyObject_FunctionStr(func);
5267 if (funcstr != NULL) {
5268 PyObject *key = PyTuple_GET_ITEM(val, 0);
5269 _PyErr_Format(
5270 tstate, PyExc_TypeError,
5271 "%U got multiple values for keyword argument '%S'",
5272 funcstr, key);
5273 Py_DECREF(funcstr);
5274 }
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005275 Py_XDECREF(exc);
5276 Py_XDECREF(val);
5277 Py_XDECREF(tb);
5278 }
5279 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02005280 _PyErr_Restore(tstate, exc, val, tb);
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005281 }
5282 }
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005283}
5284
Guido van Rossumac7be682001-01-17 15:42:30 +00005285static void
Victor Stinner438a12d2019-05-24 17:01:38 +02005286format_exc_check_arg(PyThreadState *tstate, PyObject *exc,
5287 const char *format_str, PyObject *obj)
Paul Prescode68140d2000-08-30 20:25:01 +00005288{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005289 const char *obj_str;
Paul Prescode68140d2000-08-30 20:25:01 +00005290
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005291 if (!obj)
5292 return;
Paul Prescode68140d2000-08-30 20:25:01 +00005293
Serhiy Storchaka06515832016-11-20 09:13:07 +02005294 obj_str = PyUnicode_AsUTF8(obj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005295 if (!obj_str)
5296 return;
Paul Prescode68140d2000-08-30 20:25:01 +00005297
Victor Stinner438a12d2019-05-24 17:01:38 +02005298 _PyErr_Format(tstate, exc, format_str, obj_str);
Paul Prescode68140d2000-08-30 20:25:01 +00005299}
Guido van Rossum950361c1997-01-24 13:49:28 +00005300
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005301static void
Victor Stinner438a12d2019-05-24 17:01:38 +02005302format_exc_unbound(PyThreadState *tstate, PyCodeObject *co, int oparg)
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005303{
5304 PyObject *name;
5305 /* Don't stomp existing exception */
Victor Stinner438a12d2019-05-24 17:01:38 +02005306 if (_PyErr_Occurred(tstate))
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005307 return;
5308 if (oparg < PyTuple_GET_SIZE(co->co_cellvars)) {
5309 name = PyTuple_GET_ITEM(co->co_cellvars,
5310 oparg);
Victor Stinner438a12d2019-05-24 17:01:38 +02005311 format_exc_check_arg(tstate,
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005312 PyExc_UnboundLocalError,
5313 UNBOUNDLOCAL_ERROR_MSG,
5314 name);
5315 } else {
5316 name = PyTuple_GET_ITEM(co->co_freevars, oparg -
5317 PyTuple_GET_SIZE(co->co_cellvars));
Victor Stinner438a12d2019-05-24 17:01:38 +02005318 format_exc_check_arg(tstate, PyExc_NameError,
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005319 UNBOUNDFREE_ERROR_MSG, name);
5320 }
5321}
5322
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03005323static void
Mark Shannonfee55262019-11-21 09:11:43 +00005324format_awaitable_error(PyThreadState *tstate, PyTypeObject *type, int prevprevopcode, int prevopcode)
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03005325{
5326 if (type->tp_as_async == NULL || type->tp_as_async->am_await == NULL) {
5327 if (prevopcode == BEFORE_ASYNC_WITH) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005328 _PyErr_Format(tstate, PyExc_TypeError,
5329 "'async with' received an object from __aenter__ "
5330 "that does not implement __await__: %.100s",
5331 type->tp_name);
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03005332 }
Mark Shannonfee55262019-11-21 09:11:43 +00005333 else if (prevopcode == WITH_EXCEPT_START || (prevopcode == CALL_FUNCTION && prevprevopcode == DUP_TOP)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005334 _PyErr_Format(tstate, PyExc_TypeError,
5335 "'async with' received an object from __aexit__ "
5336 "that does not implement __await__: %.100s",
5337 type->tp_name);
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03005338 }
5339 }
5340}
5341
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005342static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02005343unicode_concatenate(PyThreadState *tstate, PyObject *v, PyObject *w,
Serhiy Storchakaab874002016-09-11 13:48:15 +03005344 PyFrameObject *f, const _Py_CODEUNIT *next_instr)
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005345{
5346 PyObject *res;
5347 if (Py_REFCNT(v) == 2) {
5348 /* In the common case, there are 2 references to the value
5349 * stored in 'variable' when the += is performed: one on the
5350 * value stack (in 'v') and one still stored in the
5351 * 'variable'. We try to delete the variable now to reduce
5352 * the refcnt to 1.
5353 */
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03005354 int opcode, oparg;
5355 NEXTOPARG();
5356 switch (opcode) {
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005357 case STORE_FAST:
5358 {
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005359 PyObject **fastlocals = f->f_localsplus;
5360 if (GETLOCAL(oparg) == v)
5361 SETLOCAL(oparg, NULL);
5362 break;
5363 }
5364 case STORE_DEREF:
5365 {
5366 PyObject **freevars = (f->f_localsplus +
5367 f->f_code->co_nlocals);
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03005368 PyObject *c = freevars[oparg];
Raymond Hettingerc32f9db2016-11-12 04:10:35 -05005369 if (PyCell_GET(c) == v) {
5370 PyCell_SET(c, NULL);
5371 Py_DECREF(v);
5372 }
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005373 break;
5374 }
5375 case STORE_NAME:
5376 {
5377 PyObject *names = f->f_code->co_names;
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03005378 PyObject *name = GETITEM(names, oparg);
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005379 PyObject *locals = f->f_locals;
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02005380 if (locals && PyDict_CheckExact(locals)) {
5381 PyObject *w = PyDict_GetItemWithError(locals, name);
5382 if ((w == v && PyDict_DelItem(locals, name) != 0) ||
Victor Stinner438a12d2019-05-24 17:01:38 +02005383 (w == NULL && _PyErr_Occurred(tstate)))
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02005384 {
5385 Py_DECREF(v);
5386 return NULL;
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005387 }
5388 }
5389 break;
5390 }
5391 }
5392 }
5393 res = v;
5394 PyUnicode_Append(&res, w);
5395 return res;
5396}
5397
Guido van Rossum950361c1997-01-24 13:49:28 +00005398#ifdef DYNAMIC_EXECUTION_PROFILE
5399
Skip Montanarof118cb12001-10-15 20:51:38 +00005400static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005401getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00005402{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005403 int i;
5404 PyObject *l = PyList_New(256);
5405 if (l == NULL) return NULL;
5406 for (i = 0; i < 256; i++) {
5407 PyObject *x = PyLong_FromLong(a[i]);
5408 if (x == NULL) {
5409 Py_DECREF(l);
5410 return NULL;
5411 }
Zackery Spytz99d56b52018-12-08 07:16:55 -07005412 PyList_SET_ITEM(l, i, x);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005413 }
5414 for (i = 0; i < 256; i++)
5415 a[i] = 0;
5416 return l;
Guido van Rossum950361c1997-01-24 13:49:28 +00005417}
5418
5419PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005420_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00005421{
5422#ifndef DXPAIRS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005423 return getarray(dxp);
Guido van Rossum950361c1997-01-24 13:49:28 +00005424#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005425 int i;
5426 PyObject *l = PyList_New(257);
5427 if (l == NULL) return NULL;
5428 for (i = 0; i < 257; i++) {
5429 PyObject *x = getarray(dxpairs[i]);
5430 if (x == NULL) {
5431 Py_DECREF(l);
5432 return NULL;
5433 }
Zackery Spytz99d56b52018-12-08 07:16:55 -07005434 PyList_SET_ITEM(l, i, x);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005435 }
5436 return l;
Guido van Rossum950361c1997-01-24 13:49:28 +00005437#endif
5438}
5439
5440#endif
Brett Cannon5c4de282016-09-07 11:16:41 -07005441
5442Py_ssize_t
5443_PyEval_RequestCodeExtraIndex(freefunc free)
5444{
Victor Stinnercaba55b2018-08-03 15:33:52 +02005445 PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE();
Brett Cannon5c4de282016-09-07 11:16:41 -07005446 Py_ssize_t new_index;
5447
Dino Viehlandf3cffd22017-06-21 14:44:36 -07005448 if (interp->co_extra_user_count == MAX_CO_EXTRA_USERS - 1) {
Brett Cannon5c4de282016-09-07 11:16:41 -07005449 return -1;
5450 }
Dino Viehlandf3cffd22017-06-21 14:44:36 -07005451 new_index = interp->co_extra_user_count++;
5452 interp->co_extra_freefuncs[new_index] = free;
Brett Cannon5c4de282016-09-07 11:16:41 -07005453 return new_index;
5454}
Łukasz Langaa785c872016-09-09 17:37:37 -07005455
5456static void
5457dtrace_function_entry(PyFrameObject *f)
5458{
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02005459 const char *filename;
5460 const char *funcname;
Łukasz Langaa785c872016-09-09 17:37:37 -07005461 int lineno;
5462
5463 filename = PyUnicode_AsUTF8(f->f_code->co_filename);
5464 funcname = PyUnicode_AsUTF8(f->f_code->co_name);
5465 lineno = PyCode_Addr2Line(f->f_code, f->f_lasti);
5466
5467 PyDTrace_FUNCTION_ENTRY(filename, funcname, lineno);
5468}
5469
5470static void
5471dtrace_function_return(PyFrameObject *f)
5472{
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02005473 const char *filename;
5474 const char *funcname;
Łukasz Langaa785c872016-09-09 17:37:37 -07005475 int lineno;
5476
5477 filename = PyUnicode_AsUTF8(f->f_code->co_filename);
5478 funcname = PyUnicode_AsUTF8(f->f_code->co_name);
5479 lineno = PyCode_Addr2Line(f->f_code, f->f_lasti);
5480
5481 PyDTrace_FUNCTION_RETURN(filename, funcname, lineno);
5482}
5483
5484/* DTrace equivalent of maybe_call_line_trace. */
5485static void
5486maybe_dtrace_line(PyFrameObject *frame,
5487 int *instr_lb, int *instr_ub, int *instr_prev)
5488{
5489 int line = frame->f_lineno;
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02005490 const char *co_filename, *co_name;
Łukasz Langaa785c872016-09-09 17:37:37 -07005491
5492 /* If the last instruction executed isn't in the current
5493 instruction window, reset the window.
5494 */
5495 if (frame->f_lasti < *instr_lb || frame->f_lasti >= *instr_ub) {
5496 PyAddrPair bounds;
5497 line = _PyCode_CheckLineNumber(frame->f_code, frame->f_lasti,
5498 &bounds);
5499 *instr_lb = bounds.ap_lower;
5500 *instr_ub = bounds.ap_upper;
5501 }
5502 /* If the last instruction falls at the start of a line or if
5503 it represents a jump backwards, update the frame's line
5504 number and call the trace function. */
5505 if (frame->f_lasti == *instr_lb || frame->f_lasti < *instr_prev) {
5506 frame->f_lineno = line;
5507 co_filename = PyUnicode_AsUTF8(frame->f_code->co_filename);
5508 if (!co_filename)
5509 co_filename = "?";
5510 co_name = PyUnicode_AsUTF8(frame->f_code->co_name);
5511 if (!co_name)
5512 co_name = "?";
5513 PyDTrace_LINE(co_filename, co_name, line);
5514 }
5515 *instr_prev = frame->f_lasti;
5516}
Victor Stinnerf4b1e3d2019-11-04 19:48:34 +01005517
5518
5519/* Implement Py_EnterRecursiveCall() and Py_LeaveRecursiveCall() as functions
5520 for the limited API. */
5521
5522#undef Py_EnterRecursiveCall
5523
5524int Py_EnterRecursiveCall(const char *where)
5525{
Victor Stinnerbe434dc2019-11-05 00:51:22 +01005526 return _Py_EnterRecursiveCall_inline(where);
Victor Stinnerf4b1e3d2019-11-04 19:48:34 +01005527}
5528
5529#undef Py_LeaveRecursiveCall
5530
5531void Py_LeaveRecursiveCall(void)
5532{
Victor Stinnerbe434dc2019-11-05 00:51:22 +01005533 _Py_LeaveRecursiveCall_inline();
Victor Stinnerf4b1e3d2019-11-04 19:48:34 +01005534}