blob: 5e586589e961894d27065746bcac7f274531ee45 [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
Benjamin Petersonddd19492018-09-16 22:38:02 -07002624 case TARGET(BUILD_TUPLE_UNPACK_WITH_CALL):
2625 case TARGET(BUILD_TUPLE_UNPACK):
2626 case TARGET(BUILD_LIST_UNPACK): {
Serhiy Storchaka73442852016-10-02 10:33:46 +03002627 int convert_to_tuple = opcode != BUILD_LIST_UNPACK;
Victor Stinner74319ae2016-08-25 00:04:09 +02002628 Py_ssize_t i;
Serhiy Storchakab7281052016-09-12 00:52:40 +03002629 PyObject *sum = PyList_New(0);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002630 PyObject *return_value;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07002631
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002632 if (sum == NULL)
2633 goto error;
2634
2635 for (i = oparg; i > 0; i--) {
2636 PyObject *none_val;
2637
2638 none_val = _PyList_Extend((PyListObject *)sum, PEEK(i));
2639 if (none_val == NULL) {
Serhiy Storchaka73442852016-10-02 10:33:46 +03002640 if (opcode == BUILD_TUPLE_UNPACK_WITH_CALL &&
Victor Stinner438a12d2019-05-24 17:01:38 +02002641 _PyErr_ExceptionMatches(tstate, PyExc_TypeError))
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03002642 {
Victor Stinner438a12d2019-05-24 17:01:38 +02002643 check_args_iterable(tstate, PEEK(1 + oparg), PEEK(i));
Serhiy Storchaka73442852016-10-02 10:33:46 +03002644 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002645 Py_DECREF(sum);
2646 goto error;
2647 }
2648 Py_DECREF(none_val);
2649 }
2650
2651 if (convert_to_tuple) {
2652 return_value = PyList_AsTuple(sum);
2653 Py_DECREF(sum);
2654 if (return_value == NULL)
2655 goto error;
2656 }
2657 else {
2658 return_value = sum;
2659 }
2660
2661 while (oparg--)
2662 Py_DECREF(POP());
2663 PUSH(return_value);
2664 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_SET_UNPACK): {
Victor Stinner74319ae2016-08-25 00:04:09 +02002689 Py_ssize_t i;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002690 PyObject *sum = PySet_New(NULL);
2691 if (sum == NULL)
2692 goto error;
2693
2694 for (i = oparg; i > 0; i--) {
2695 if (_PySet_Update(sum, PEEK(i)) < 0) {
2696 Py_DECREF(sum);
2697 goto error;
2698 }
2699 }
2700
2701 while (oparg--)
2702 Py_DECREF(POP());
2703 PUSH(sum);
2704 DISPATCH();
2705 }
2706
Benjamin Petersonddd19492018-09-16 22:38:02 -07002707 case TARGET(BUILD_MAP): {
Victor Stinner74319ae2016-08-25 00:04:09 +02002708 Py_ssize_t i;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002709 PyObject *map = _PyDict_NewPresized((Py_ssize_t)oparg);
2710 if (map == NULL)
2711 goto error;
Benjamin Petersond5d77aa2015-07-05 10:37:25 -05002712 for (i = oparg; i > 0; i--) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002713 int err;
Benjamin Petersond5d77aa2015-07-05 10:37:25 -05002714 PyObject *key = PEEK(2*i);
2715 PyObject *value = PEEK(2*i - 1);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002716 err = PyDict_SetItem(map, key, value);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002717 if (err != 0) {
2718 Py_DECREF(map);
2719 goto error;
2720 }
2721 }
Benjamin Petersond5d77aa2015-07-05 10:37:25 -05002722
2723 while (oparg--) {
2724 Py_DECREF(POP());
2725 Py_DECREF(POP());
2726 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002727 PUSH(map);
2728 DISPATCH();
2729 }
2730
Benjamin Petersonddd19492018-09-16 22:38:02 -07002731 case TARGET(SETUP_ANNOTATIONS): {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002732 _Py_IDENTIFIER(__annotations__);
2733 int err;
2734 PyObject *ann_dict;
2735 if (f->f_locals == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002736 _PyErr_Format(tstate, PyExc_SystemError,
2737 "no locals found when setting up annotations");
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002738 goto error;
2739 }
2740 /* check if __annotations__ in locals()... */
2741 if (PyDict_CheckExact(f->f_locals)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002742 ann_dict = _PyDict_GetItemIdWithError(f->f_locals,
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002743 &PyId___annotations__);
2744 if (ann_dict == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002745 if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002746 goto error;
2747 }
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002748 /* ...if not, create a new one */
2749 ann_dict = PyDict_New();
2750 if (ann_dict == NULL) {
2751 goto error;
2752 }
2753 err = _PyDict_SetItemId(f->f_locals,
2754 &PyId___annotations__, ann_dict);
2755 Py_DECREF(ann_dict);
2756 if (err != 0) {
2757 goto error;
2758 }
2759 }
2760 }
2761 else {
2762 /* do the same if locals() is not a dict */
2763 PyObject *ann_str = _PyUnicode_FromId(&PyId___annotations__);
2764 if (ann_str == NULL) {
Serhiy Storchaka4678b2f2016-11-08 23:13:36 +02002765 goto error;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002766 }
2767 ann_dict = PyObject_GetItem(f->f_locals, ann_str);
2768 if (ann_dict == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002769 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002770 goto error;
2771 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002772 _PyErr_Clear(tstate);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002773 ann_dict = PyDict_New();
2774 if (ann_dict == NULL) {
2775 goto error;
2776 }
2777 err = PyObject_SetItem(f->f_locals, ann_str, ann_dict);
2778 Py_DECREF(ann_dict);
2779 if (err != 0) {
2780 goto error;
2781 }
2782 }
2783 else {
2784 Py_DECREF(ann_dict);
2785 }
2786 }
2787 DISPATCH();
2788 }
2789
Benjamin Petersonddd19492018-09-16 22:38:02 -07002790 case TARGET(BUILD_CONST_KEY_MAP): {
Victor Stinner74319ae2016-08-25 00:04:09 +02002791 Py_ssize_t i;
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03002792 PyObject *map;
2793 PyObject *keys = TOP();
2794 if (!PyTuple_CheckExact(keys) ||
2795 PyTuple_GET_SIZE(keys) != (Py_ssize_t)oparg) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002796 _PyErr_SetString(tstate, PyExc_SystemError,
2797 "bad BUILD_CONST_KEY_MAP keys argument");
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03002798 goto error;
2799 }
2800 map = _PyDict_NewPresized((Py_ssize_t)oparg);
2801 if (map == NULL) {
2802 goto error;
2803 }
2804 for (i = oparg; i > 0; i--) {
2805 int err;
2806 PyObject *key = PyTuple_GET_ITEM(keys, oparg - i);
2807 PyObject *value = PEEK(i + 1);
2808 err = PyDict_SetItem(map, key, value);
2809 if (err != 0) {
2810 Py_DECREF(map);
2811 goto error;
2812 }
2813 }
2814
2815 Py_DECREF(POP());
2816 while (oparg--) {
2817 Py_DECREF(POP());
2818 }
2819 PUSH(map);
2820 DISPATCH();
2821 }
2822
Benjamin Petersonddd19492018-09-16 22:38:02 -07002823 case TARGET(BUILD_MAP_UNPACK): {
Victor Stinner74319ae2016-08-25 00:04:09 +02002824 Py_ssize_t i;
Serhiy Storchakab7281052016-09-12 00:52:40 +03002825 PyObject *sum = PyDict_New();
Victor Stinnerf9b760f2016-09-09 10:17:08 -07002826 if (sum == NULL)
2827 goto error;
2828
2829 for (i = oparg; i > 0; i--) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002830 PyObject *arg = PEEK(i);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002831 if (PyDict_Update(sum, arg) < 0) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002832 if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) {
2833 _PyErr_Format(tstate, PyExc_TypeError,
2834 "'%.200s' object is not a mapping",
2835 arg->ob_type->tp_name);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002836 }
2837 Py_DECREF(sum);
2838 goto error;
2839 }
2840 }
2841
Victor Stinnerf9b760f2016-09-09 10:17:08 -07002842 while (oparg--)
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002843 Py_DECREF(POP());
2844 PUSH(sum);
2845 DISPATCH();
2846 }
2847
Benjamin Petersonddd19492018-09-16 22:38:02 -07002848 case TARGET(BUILD_MAP_UNPACK_WITH_CALL): {
Serhiy Storchakae036ef82016-10-02 11:06:43 +03002849 Py_ssize_t i;
2850 PyObject *sum = PyDict_New();
2851 if (sum == NULL)
2852 goto error;
2853
2854 for (i = oparg; i > 0; i--) {
2855 PyObject *arg = PEEK(i);
2856 if (_PyDict_MergeEx(sum, arg, 2) < 0) {
Serhiy Storchakae036ef82016-10-02 11:06:43 +03002857 Py_DECREF(sum);
Victor Stinner438a12d2019-05-24 17:01:38 +02002858 format_kwargs_error(tstate, PEEK(2 + oparg), arg);
Serhiy Storchakae036ef82016-10-02 11:06:43 +03002859 goto error;
2860 }
2861 }
2862
2863 while (oparg--)
2864 Py_DECREF(POP());
2865 PUSH(sum);
Brandt Bucherf185a732019-09-28 17:12:49 -07002866 PREDICT(CALL_FUNCTION_EX);
Serhiy Storchakae036ef82016-10-02 11:06:43 +03002867 DISPATCH();
2868 }
2869
Benjamin Petersonddd19492018-09-16 22:38:02 -07002870 case TARGET(MAP_ADD): {
Jörn Heisslerc8a35412019-06-22 16:40:55 +02002871 PyObject *value = TOP();
2872 PyObject *key = SECOND();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002873 PyObject *map;
2874 int err;
costypetrisor8ed317f2018-07-31 20:55:14 +00002875 STACK_SHRINK(2);
Raymond Hettinger41862222016-10-15 19:03:06 -07002876 map = PEEK(oparg); /* dict */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002877 assert(PyDict_CheckExact(map));
Martin Panter95f53c12016-07-18 08:23:26 +00002878 err = PyDict_SetItem(map, key, value); /* map[key] = value */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002879 Py_DECREF(value);
2880 Py_DECREF(key);
2881 if (err != 0)
2882 goto error;
2883 PREDICT(JUMP_ABSOLUTE);
2884 DISPATCH();
2885 }
2886
Benjamin Petersonddd19492018-09-16 22:38:02 -07002887 case TARGET(LOAD_ATTR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002888 PyObject *name = GETITEM(names, oparg);
2889 PyObject *owner = TOP();
2890 PyObject *res = PyObject_GetAttr(owner, name);
2891 Py_DECREF(owner);
2892 SET_TOP(res);
2893 if (res == NULL)
2894 goto error;
2895 DISPATCH();
2896 }
2897
Benjamin Petersonddd19492018-09-16 22:38:02 -07002898 case TARGET(COMPARE_OP): {
Mark Shannon9af0e472020-01-14 10:12:45 +00002899 assert(oparg <= Py_GE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002900 PyObject *right = POP();
2901 PyObject *left = TOP();
Mark Shannon9af0e472020-01-14 10:12:45 +00002902 PyObject *res = PyObject_RichCompare(left, right, oparg);
2903 SET_TOP(res);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002904 Py_DECREF(left);
2905 Py_DECREF(right);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002906 if (res == NULL)
2907 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002908 PREDICT(POP_JUMP_IF_FALSE);
2909 PREDICT(POP_JUMP_IF_TRUE);
2910 DISPATCH();
Victor Stinner3c1e4812012-03-26 22:10:51 +02002911 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002912
Mark Shannon9af0e472020-01-14 10:12:45 +00002913 case TARGET(IS_OP): {
2914 PyObject *right = POP();
2915 PyObject *left = TOP();
2916 int res = (left == right)^oparg;
2917 PyObject *b = res ? Py_True : Py_False;
2918 Py_INCREF(b);
2919 SET_TOP(b);
2920 Py_DECREF(left);
2921 Py_DECREF(right);
2922 PREDICT(POP_JUMP_IF_FALSE);
2923 PREDICT(POP_JUMP_IF_TRUE);
2924 FAST_DISPATCH();
2925 }
2926
2927 case TARGET(CONTAINS_OP): {
2928 PyObject *right = POP();
2929 PyObject *left = POP();
2930 int res = PySequence_Contains(right, left);
2931 Py_DECREF(left);
2932 Py_DECREF(right);
2933 if (res < 0) {
2934 goto error;
2935 }
2936 PyObject *b = (res^oparg) ? Py_True : Py_False;
2937 Py_INCREF(b);
2938 PUSH(b);
2939 PREDICT(POP_JUMP_IF_FALSE);
2940 PREDICT(POP_JUMP_IF_TRUE);
2941 FAST_DISPATCH();
2942 }
2943
2944#define CANNOT_CATCH_MSG "catching classes that do not inherit from "\
2945 "BaseException is not allowed"
2946
2947 case TARGET(JUMP_IF_NOT_EXC_MATCH): {
2948 PyObject *right = POP();
2949 PyObject *left = POP();
2950 if (PyTuple_Check(right)) {
2951 Py_ssize_t i, length;
2952 length = PyTuple_GET_SIZE(right);
2953 for (i = 0; i < length; i++) {
2954 PyObject *exc = PyTuple_GET_ITEM(right, i);
2955 if (!PyExceptionClass_Check(exc)) {
2956 _PyErr_SetString(tstate, PyExc_TypeError,
2957 CANNOT_CATCH_MSG);
2958 Py_DECREF(left);
2959 Py_DECREF(right);
2960 goto error;
2961 }
2962 }
2963 }
2964 else {
2965 if (!PyExceptionClass_Check(right)) {
2966 _PyErr_SetString(tstate, PyExc_TypeError,
2967 CANNOT_CATCH_MSG);
2968 Py_DECREF(left);
2969 Py_DECREF(right);
2970 goto error;
2971 }
2972 }
2973 int res = PyErr_GivenExceptionMatches(left, right);
2974 Py_DECREF(left);
2975 Py_DECREF(right);
2976 if (res > 0) {
2977 /* Exception matches -- Do nothing */;
2978 }
2979 else if (res == 0) {
2980 JUMPTO(oparg);
2981 }
2982 else {
2983 goto error;
2984 }
2985 DISPATCH();
2986 }
2987
Benjamin Petersonddd19492018-09-16 22:38:02 -07002988 case TARGET(IMPORT_NAME): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002989 PyObject *name = GETITEM(names, oparg);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03002990 PyObject *fromlist = POP();
2991 PyObject *level = TOP();
2992 PyObject *res;
Victor Stinner438a12d2019-05-24 17:01:38 +02002993 res = import_name(tstate, f, name, fromlist, level);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03002994 Py_DECREF(level);
2995 Py_DECREF(fromlist);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002996 SET_TOP(res);
2997 if (res == NULL)
2998 goto error;
2999 DISPATCH();
3000 }
3001
Benjamin Petersonddd19492018-09-16 22:38:02 -07003002 case TARGET(IMPORT_STAR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003003 PyObject *from = POP(), *locals;
3004 int err;
Matthias Bussonnier160edb42017-02-25 21:58:05 -08003005 if (PyFrame_FastToLocalsWithError(f) < 0) {
3006 Py_DECREF(from);
Victor Stinner41bb43a2013-10-29 01:19:37 +01003007 goto error;
Matthias Bussonnier160edb42017-02-25 21:58:05 -08003008 }
Victor Stinner41bb43a2013-10-29 01:19:37 +01003009
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003010 locals = f->f_locals;
3011 if (locals == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003012 _PyErr_SetString(tstate, PyExc_SystemError,
3013 "no locals found during 'import *'");
Matthias Bussonnier160edb42017-02-25 21:58:05 -08003014 Py_DECREF(from);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003015 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003016 }
Victor Stinner438a12d2019-05-24 17:01:38 +02003017 err = import_all_from(tstate, locals, from);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003018 PyFrame_LocalsToFast(f, 0);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003019 Py_DECREF(from);
3020 if (err != 0)
3021 goto error;
3022 DISPATCH();
3023 }
Guido van Rossum25831651993-05-19 14:50:45 +00003024
Benjamin Petersonddd19492018-09-16 22:38:02 -07003025 case TARGET(IMPORT_FROM): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003026 PyObject *name = GETITEM(names, oparg);
3027 PyObject *from = TOP();
3028 PyObject *res;
Victor Stinner438a12d2019-05-24 17:01:38 +02003029 res = import_from(tstate, from, name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003030 PUSH(res);
3031 if (res == NULL)
3032 goto error;
3033 DISPATCH();
3034 }
Thomas Wouters52152252000-08-17 22:55:00 +00003035
Benjamin Petersonddd19492018-09-16 22:38:02 -07003036 case TARGET(JUMP_FORWARD): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003037 JUMPBY(oparg);
3038 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003039 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003040
Benjamin Petersonddd19492018-09-16 22:38:02 -07003041 case TARGET(POP_JUMP_IF_FALSE): {
3042 PREDICTED(POP_JUMP_IF_FALSE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003043 PyObject *cond = POP();
3044 int err;
3045 if (cond == Py_True) {
3046 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003047 FAST_DISPATCH();
3048 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003049 if (cond == Py_False) {
3050 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003051 JUMPTO(oparg);
3052 FAST_DISPATCH();
3053 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003054 err = PyObject_IsTrue(cond);
3055 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003056 if (err > 0)
Adrian Wielgosik50c28502017-06-23 13:35:41 -07003057 ;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003058 else if (err == 0)
3059 JUMPTO(oparg);
3060 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003061 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003062 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003063 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003064
Benjamin Petersonddd19492018-09-16 22:38:02 -07003065 case TARGET(POP_JUMP_IF_TRUE): {
3066 PREDICTED(POP_JUMP_IF_TRUE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003067 PyObject *cond = POP();
3068 int err;
3069 if (cond == Py_False) {
3070 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003071 FAST_DISPATCH();
3072 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003073 if (cond == Py_True) {
3074 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003075 JUMPTO(oparg);
3076 FAST_DISPATCH();
3077 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003078 err = PyObject_IsTrue(cond);
3079 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003080 if (err > 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003081 JUMPTO(oparg);
3082 }
3083 else if (err == 0)
3084 ;
3085 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003086 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003087 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003088 }
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00003089
Benjamin Petersonddd19492018-09-16 22:38:02 -07003090 case TARGET(JUMP_IF_FALSE_OR_POP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003091 PyObject *cond = TOP();
3092 int err;
3093 if (cond == Py_True) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003094 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003095 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003096 FAST_DISPATCH();
3097 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003098 if (cond == Py_False) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003099 JUMPTO(oparg);
3100 FAST_DISPATCH();
3101 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003102 err = PyObject_IsTrue(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003103 if (err > 0) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003104 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003105 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003106 }
3107 else if (err == 0)
3108 JUMPTO(oparg);
3109 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003110 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003111 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003112 }
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00003113
Benjamin Petersonddd19492018-09-16 22:38:02 -07003114 case TARGET(JUMP_IF_TRUE_OR_POP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003115 PyObject *cond = TOP();
3116 int err;
3117 if (cond == Py_False) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003118 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003119 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003120 FAST_DISPATCH();
3121 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003122 if (cond == Py_True) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003123 JUMPTO(oparg);
3124 FAST_DISPATCH();
3125 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003126 err = PyObject_IsTrue(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003127 if (err > 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003128 JUMPTO(oparg);
3129 }
3130 else if (err == 0) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003131 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003132 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003133 }
3134 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003135 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003136 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003137 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003138
Benjamin Petersonddd19492018-09-16 22:38:02 -07003139 case TARGET(JUMP_ABSOLUTE): {
3140 PREDICTED(JUMP_ABSOLUTE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003141 JUMPTO(oparg);
Guido van Rossum58da9312007-11-10 23:39:45 +00003142#if FAST_LOOPS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003143 /* Enabling this path speeds-up all while and for-loops by bypassing
3144 the per-loop checks for signals. By default, this should be turned-off
3145 because it prevents detection of a control-break in tight loops like
3146 "while 1: pass". Compile with this option turned-on when you need
3147 the speed-up and do not need break checking inside tight loops (ones
3148 that contain only instructions ending with FAST_DISPATCH).
3149 */
3150 FAST_DISPATCH();
Guido van Rossum58da9312007-11-10 23:39:45 +00003151#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003152 DISPATCH();
Guido van Rossum58da9312007-11-10 23:39:45 +00003153#endif
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003154 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003155
Benjamin Petersonddd19492018-09-16 22:38:02 -07003156 case TARGET(GET_ITER): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003157 /* before: [obj]; after [getiter(obj)] */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003158 PyObject *iterable = TOP();
Yury Selivanov5376ba92015-06-22 12:19:30 -04003159 PyObject *iter = PyObject_GetIter(iterable);
3160 Py_DECREF(iterable);
3161 SET_TOP(iter);
3162 if (iter == NULL)
3163 goto error;
3164 PREDICT(FOR_ITER);
Serhiy Storchakada9c5132016-06-27 18:58:57 +03003165 PREDICT(CALL_FUNCTION);
Yury Selivanov5376ba92015-06-22 12:19:30 -04003166 DISPATCH();
3167 }
3168
Benjamin Petersonddd19492018-09-16 22:38:02 -07003169 case TARGET(GET_YIELD_FROM_ITER): {
Yury Selivanov5376ba92015-06-22 12:19:30 -04003170 /* before: [obj]; after [getiter(obj)] */
3171 PyObject *iterable = TOP();
Yury Selivanov75445082015-05-11 22:57:16 -04003172 PyObject *iter;
Yury Selivanov5376ba92015-06-22 12:19:30 -04003173 if (PyCoro_CheckExact(iterable)) {
3174 /* `iterable` is a coroutine */
3175 if (!(co->co_flags & (CO_COROUTINE | CO_ITERABLE_COROUTINE))) {
3176 /* and it is used in a 'yield from' expression of a
3177 regular generator. */
3178 Py_DECREF(iterable);
3179 SET_TOP(NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02003180 _PyErr_SetString(tstate, PyExc_TypeError,
3181 "cannot 'yield from' a coroutine object "
3182 "in a non-coroutine generator");
Yury Selivanov5376ba92015-06-22 12:19:30 -04003183 goto error;
3184 }
3185 }
3186 else if (!PyGen_CheckExact(iterable)) {
Yury Selivanov75445082015-05-11 22:57:16 -04003187 /* `iterable` is not a generator. */
3188 iter = PyObject_GetIter(iterable);
3189 Py_DECREF(iterable);
3190 SET_TOP(iter);
3191 if (iter == NULL)
3192 goto error;
3193 }
Serhiy Storchakada9c5132016-06-27 18:58:57 +03003194 PREDICT(LOAD_CONST);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003195 DISPATCH();
3196 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003197
Benjamin Petersonddd19492018-09-16 22:38:02 -07003198 case TARGET(FOR_ITER): {
3199 PREDICTED(FOR_ITER);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003200 /* before: [iter]; after: [iter, iter()] *or* [] */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003201 PyObject *iter = TOP();
3202 PyObject *next = (*iter->ob_type->tp_iternext)(iter);
3203 if (next != NULL) {
3204 PUSH(next);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003205 PREDICT(STORE_FAST);
3206 PREDICT(UNPACK_SEQUENCE);
3207 DISPATCH();
3208 }
Victor Stinner438a12d2019-05-24 17:01:38 +02003209 if (_PyErr_Occurred(tstate)) {
3210 if (!_PyErr_ExceptionMatches(tstate, PyExc_StopIteration)) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003211 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02003212 }
3213 else if (tstate->c_tracefunc != NULL) {
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003214 call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj, tstate, f);
Victor Stinner438a12d2019-05-24 17:01:38 +02003215 }
3216 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003217 }
3218 /* iterator ended normally */
costypetrisor8ed317f2018-07-31 20:55:14 +00003219 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003220 Py_DECREF(iter);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003221 JUMPBY(oparg);
Serhiy Storchakada9c5132016-06-27 18:58:57 +03003222 PREDICT(POP_BLOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003223 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003224 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003225
Benjamin Petersonddd19492018-09-16 22:38:02 -07003226 case TARGET(SETUP_FINALLY): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003227 PyFrame_BlockSetup(f, SETUP_FINALLY, INSTR_OFFSET() + oparg,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003228 STACK_LEVEL());
3229 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003230 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003231
Benjamin Petersonddd19492018-09-16 22:38:02 -07003232 case TARGET(BEFORE_ASYNC_WITH): {
Yury Selivanov75445082015-05-11 22:57:16 -04003233 _Py_IDENTIFIER(__aenter__);
Géry Ogam1d1b97a2020-01-14 12:58:29 +01003234 _Py_IDENTIFIER(__aexit__);
Yury Selivanov75445082015-05-11 22:57:16 -04003235 PyObject *mgr = TOP();
Géry Ogam1d1b97a2020-01-14 12:58:29 +01003236 PyObject *enter = special_lookup(tstate, mgr, &PyId___aenter__);
Yury Selivanov75445082015-05-11 22:57:16 -04003237 PyObject *res;
Géry Ogam1d1b97a2020-01-14 12:58:29 +01003238 if (enter == NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04003239 goto error;
Géry Ogam1d1b97a2020-01-14 12:58:29 +01003240 }
3241 PyObject *exit = special_lookup(tstate, mgr, &PyId___aexit__);
3242 if (exit == NULL) {
3243 Py_DECREF(enter);
3244 goto error;
3245 }
Yury Selivanov75445082015-05-11 22:57:16 -04003246 SET_TOP(exit);
Yury Selivanov75445082015-05-11 22:57:16 -04003247 Py_DECREF(mgr);
Victor Stinnerf17c3de2016-12-06 18:46:19 +01003248 res = _PyObject_CallNoArg(enter);
Yury Selivanov75445082015-05-11 22:57:16 -04003249 Py_DECREF(enter);
3250 if (res == NULL)
3251 goto error;
3252 PUSH(res);
Serhiy Storchakada9c5132016-06-27 18:58:57 +03003253 PREDICT(GET_AWAITABLE);
Yury Selivanov75445082015-05-11 22:57:16 -04003254 DISPATCH();
3255 }
3256
Benjamin Petersonddd19492018-09-16 22:38:02 -07003257 case TARGET(SETUP_ASYNC_WITH): {
Yury Selivanov75445082015-05-11 22:57:16 -04003258 PyObject *res = POP();
3259 /* Setup the finally block before pushing the result
3260 of __aenter__ on the stack. */
3261 PyFrame_BlockSetup(f, SETUP_FINALLY, INSTR_OFFSET() + oparg,
3262 STACK_LEVEL());
3263 PUSH(res);
3264 DISPATCH();
3265 }
3266
Benjamin Petersonddd19492018-09-16 22:38:02 -07003267 case TARGET(SETUP_WITH): {
Benjamin Petersonce798522012-01-22 11:24:29 -05003268 _Py_IDENTIFIER(__enter__);
Géry Ogam1d1b97a2020-01-14 12:58:29 +01003269 _Py_IDENTIFIER(__exit__);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003270 PyObject *mgr = TOP();
Victor Stinner438a12d2019-05-24 17:01:38 +02003271 PyObject *enter = special_lookup(tstate, mgr, &PyId___enter__);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003272 PyObject *res;
Victor Stinner438a12d2019-05-24 17:01:38 +02003273 if (enter == NULL) {
Raymond Hettingera3fec152016-11-21 17:24:23 -08003274 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02003275 }
3276 PyObject *exit = special_lookup(tstate, mgr, &PyId___exit__);
Raymond Hettinger64e2f9a2016-11-22 11:50:40 -08003277 if (exit == NULL) {
3278 Py_DECREF(enter);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003279 goto error;
Raymond Hettinger64e2f9a2016-11-22 11:50:40 -08003280 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003281 SET_TOP(exit);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003282 Py_DECREF(mgr);
Victor Stinnerf17c3de2016-12-06 18:46:19 +01003283 res = _PyObject_CallNoArg(enter);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003284 Py_DECREF(enter);
3285 if (res == NULL)
3286 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003287 /* Setup the finally block before pushing the result
3288 of __enter__ on the stack. */
3289 PyFrame_BlockSetup(f, SETUP_FINALLY, INSTR_OFFSET() + oparg,
3290 STACK_LEVEL());
Benjamin Peterson876b2f22009-06-28 03:18:59 +00003291
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003292 PUSH(res);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003293 DISPATCH();
3294 }
Benjamin Peterson876b2f22009-06-28 03:18:59 +00003295
Mark Shannonfee55262019-11-21 09:11:43 +00003296 case TARGET(WITH_EXCEPT_START): {
3297 /* At the top of the stack are 7 values:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003298 - (TOP, SECOND, THIRD) = exc_info()
Mark Shannonfee55262019-11-21 09:11:43 +00003299 - (FOURTH, FIFTH, SIXTH) = previous exception for EXCEPT_HANDLER
3300 - SEVENTH: the context.__exit__ bound method
3301 We call SEVENTH(TOP, SECOND, THIRD).
3302 Then we push again the TOP exception and the __exit__
3303 return value.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003304 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003305 PyObject *exit_func;
Victor Stinner842cfff2016-12-01 14:45:31 +01003306 PyObject *exc, *val, *tb, *res;
3307
Victor Stinner842cfff2016-12-01 14:45:31 +01003308 exc = TOP();
Mark Shannonfee55262019-11-21 09:11:43 +00003309 val = SECOND();
3310 tb = THIRD();
3311 assert(exc != Py_None);
3312 assert(!PyLong_Check(exc));
3313 exit_func = PEEK(7);
Jeroen Demeyer469d1a72019-07-03 12:52:21 +02003314 PyObject *stack[4] = {NULL, exc, val, tb};
3315 res = _PyObject_Vectorcall(exit_func, stack + 1,
3316 3 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003317 if (res == NULL)
3318 goto error;
Amaury Forgeot d'Arc10b24e82008-12-10 23:49:33 +00003319
Yury Selivanov75445082015-05-11 22:57:16 -04003320 PUSH(res);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003321 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003322 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00003323
Benjamin Petersonddd19492018-09-16 22:38:02 -07003324 case TARGET(LOAD_METHOD): {
Andreyb021ba52019-04-29 14:33:26 +10003325 /* Designed to work in tandem with CALL_METHOD. */
Yury Selivanovf2392132016-12-13 19:03:51 -05003326 PyObject *name = GETITEM(names, oparg);
3327 PyObject *obj = TOP();
3328 PyObject *meth = NULL;
3329
3330 int meth_found = _PyObject_GetMethod(obj, name, &meth);
3331
Yury Selivanovf2392132016-12-13 19:03:51 -05003332 if (meth == NULL) {
3333 /* Most likely attribute wasn't found. */
Yury Selivanovf2392132016-12-13 19:03:51 -05003334 goto error;
3335 }
3336
3337 if (meth_found) {
INADA Naoki015bce62017-01-16 17:23:30 +09003338 /* We can bypass temporary bound method object.
3339 meth is unbound method and obj is self.
Victor Stinnera8cb5152017-01-18 14:12:51 +01003340
INADA Naoki015bce62017-01-16 17:23:30 +09003341 meth | self | arg1 | ... | argN
3342 */
3343 SET_TOP(meth);
3344 PUSH(obj); // self
Yury Selivanovf2392132016-12-13 19:03:51 -05003345 }
3346 else {
INADA Naoki015bce62017-01-16 17:23:30 +09003347 /* meth is not an unbound method (but a regular attr, or
3348 something was returned by a descriptor protocol). Set
3349 the second element of the stack to NULL, to signal
Yury Selivanovf2392132016-12-13 19:03:51 -05003350 CALL_METHOD that it's not a method call.
INADA Naoki015bce62017-01-16 17:23:30 +09003351
3352 NULL | meth | arg1 | ... | argN
Yury Selivanovf2392132016-12-13 19:03:51 -05003353 */
INADA Naoki015bce62017-01-16 17:23:30 +09003354 SET_TOP(NULL);
Yury Selivanovf2392132016-12-13 19:03:51 -05003355 Py_DECREF(obj);
INADA Naoki015bce62017-01-16 17:23:30 +09003356 PUSH(meth);
Yury Selivanovf2392132016-12-13 19:03:51 -05003357 }
3358 DISPATCH();
3359 }
3360
Benjamin Petersonddd19492018-09-16 22:38:02 -07003361 case TARGET(CALL_METHOD): {
Yury Selivanovf2392132016-12-13 19:03:51 -05003362 /* Designed to work in tamdem with LOAD_METHOD. */
INADA Naoki015bce62017-01-16 17:23:30 +09003363 PyObject **sp, *res, *meth;
Yury Selivanovf2392132016-12-13 19:03:51 -05003364
3365 sp = stack_pointer;
3366
INADA Naoki015bce62017-01-16 17:23:30 +09003367 meth = PEEK(oparg + 2);
3368 if (meth == NULL) {
3369 /* `meth` is NULL when LOAD_METHOD thinks that it's not
3370 a method call.
Yury Selivanovf2392132016-12-13 19:03:51 -05003371
3372 Stack layout:
3373
INADA Naoki015bce62017-01-16 17:23:30 +09003374 ... | NULL | callable | arg1 | ... | argN
3375 ^- TOP()
3376 ^- (-oparg)
3377 ^- (-oparg-1)
3378 ^- (-oparg-2)
Yury Selivanovf2392132016-12-13 19:03:51 -05003379
Ville Skyttä49b27342017-08-03 09:00:59 +03003380 `callable` will be POPed by call_function.
INADA Naoki015bce62017-01-16 17:23:30 +09003381 NULL will will be POPed manually later.
Yury Selivanovf2392132016-12-13 19:03:51 -05003382 */
Victor Stinner09532fe2019-05-10 23:39:09 +02003383 res = call_function(tstate, &sp, oparg, NULL);
Yury Selivanovf2392132016-12-13 19:03:51 -05003384 stack_pointer = sp;
INADA Naoki015bce62017-01-16 17:23:30 +09003385 (void)POP(); /* POP the NULL. */
Yury Selivanovf2392132016-12-13 19:03:51 -05003386 }
3387 else {
3388 /* This is a method call. Stack layout:
3389
INADA Naoki015bce62017-01-16 17:23:30 +09003390 ... | method | self | arg1 | ... | argN
Yury Selivanovf2392132016-12-13 19:03:51 -05003391 ^- TOP()
3392 ^- (-oparg)
INADA Naoki015bce62017-01-16 17:23:30 +09003393 ^- (-oparg-1)
3394 ^- (-oparg-2)
Yury Selivanovf2392132016-12-13 19:03:51 -05003395
INADA Naoki015bce62017-01-16 17:23:30 +09003396 `self` and `method` will be POPed by call_function.
Yury Selivanovf2392132016-12-13 19:03:51 -05003397 We'll be passing `oparg + 1` to call_function, to
INADA Naoki015bce62017-01-16 17:23:30 +09003398 make it accept the `self` as a first argument.
Yury Selivanovf2392132016-12-13 19:03:51 -05003399 */
Victor Stinner09532fe2019-05-10 23:39:09 +02003400 res = call_function(tstate, &sp, oparg + 1, NULL);
Yury Selivanovf2392132016-12-13 19:03:51 -05003401 stack_pointer = sp;
3402 }
3403
3404 PUSH(res);
3405 if (res == NULL)
3406 goto error;
3407 DISPATCH();
3408 }
3409
Benjamin Petersonddd19492018-09-16 22:38:02 -07003410 case TARGET(CALL_FUNCTION): {
3411 PREDICTED(CALL_FUNCTION);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003412 PyObject **sp, *res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003413 sp = stack_pointer;
Victor Stinner09532fe2019-05-10 23:39:09 +02003414 res = call_function(tstate, &sp, oparg, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003415 stack_pointer = sp;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003416 PUSH(res);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003417 if (res == NULL) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003418 goto error;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003419 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003420 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003421 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003422
Benjamin Petersonddd19492018-09-16 22:38:02 -07003423 case TARGET(CALL_FUNCTION_KW): {
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003424 PyObject **sp, *res, *names;
3425
3426 names = POP();
Jeroen Demeyer05677862019-08-16 12:41:27 +02003427 assert(PyTuple_Check(names));
3428 assert(PyTuple_GET_SIZE(names) <= oparg);
3429 /* We assume without checking that names contains only strings */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003430 sp = stack_pointer;
Victor Stinner09532fe2019-05-10 23:39:09 +02003431 res = call_function(tstate, &sp, oparg, names);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003432 stack_pointer = sp;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003433 PUSH(res);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003434 Py_DECREF(names);
3435
3436 if (res == NULL) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003437 goto error;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003438 }
3439 DISPATCH();
3440 }
3441
Benjamin Petersonddd19492018-09-16 22:38:02 -07003442 case TARGET(CALL_FUNCTION_EX): {
Brandt Bucherf185a732019-09-28 17:12:49 -07003443 PREDICTED(CALL_FUNCTION_EX);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003444 PyObject *func, *callargs, *kwargs = NULL, *result;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003445 if (oparg & 0x01) {
3446 kwargs = POP();
Serhiy Storchakab7281052016-09-12 00:52:40 +03003447 if (!PyDict_CheckExact(kwargs)) {
3448 PyObject *d = PyDict_New();
3449 if (d == NULL)
3450 goto error;
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02003451 if (_PyDict_MergeEx(d, kwargs, 2) < 0) {
Serhiy Storchakab7281052016-09-12 00:52:40 +03003452 Py_DECREF(d);
Victor Stinner438a12d2019-05-24 17:01:38 +02003453 format_kwargs_error(tstate, SECOND(), kwargs);
Victor Stinnereece2222016-09-12 11:16:37 +02003454 Py_DECREF(kwargs);
Serhiy Storchakab7281052016-09-12 00:52:40 +03003455 goto error;
3456 }
3457 Py_DECREF(kwargs);
3458 kwargs = d;
3459 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003460 assert(PyDict_CheckExact(kwargs));
3461 }
3462 callargs = POP();
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003463 func = TOP();
Serhiy Storchaka63dc5482016-09-22 19:41:20 +03003464 if (!PyTuple_CheckExact(callargs)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003465 if (check_args_iterable(tstate, func, callargs) < 0) {
Victor Stinnereece2222016-09-12 11:16:37 +02003466 Py_DECREF(callargs);
Serhiy Storchakab7281052016-09-12 00:52:40 +03003467 goto error;
3468 }
3469 Py_SETREF(callargs, PySequence_Tuple(callargs));
3470 if (callargs == NULL) {
3471 goto error;
3472 }
3473 }
Serhiy Storchaka63dc5482016-09-22 19:41:20 +03003474 assert(PyTuple_CheckExact(callargs));
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003475
Victor Stinner09532fe2019-05-10 23:39:09 +02003476 result = do_call_core(tstate, func, callargs, kwargs);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003477 Py_DECREF(func);
3478 Py_DECREF(callargs);
3479 Py_XDECREF(kwargs);
3480
3481 SET_TOP(result);
3482 if (result == NULL) {
3483 goto error;
3484 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003485 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003486 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003487
Benjamin Petersonddd19492018-09-16 22:38:02 -07003488 case TARGET(MAKE_FUNCTION): {
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003489 PyObject *qualname = POP();
3490 PyObject *codeobj = POP();
3491 PyFunctionObject *func = (PyFunctionObject *)
3492 PyFunction_NewWithQualName(codeobj, f->f_globals, qualname);
Guido van Rossum4f72a782006-10-27 23:31:49 +00003493
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003494 Py_DECREF(codeobj);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003495 Py_DECREF(qualname);
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003496 if (func == NULL) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003497 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003498 }
Neal Norwitzc1505362006-12-28 06:47:50 +00003499
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003500 if (oparg & 0x08) {
3501 assert(PyTuple_CheckExact(TOP()));
3502 func ->func_closure = POP();
3503 }
3504 if (oparg & 0x04) {
3505 assert(PyDict_CheckExact(TOP()));
3506 func->func_annotations = POP();
3507 }
3508 if (oparg & 0x02) {
3509 assert(PyDict_CheckExact(TOP()));
3510 func->func_kwdefaults = POP();
3511 }
3512 if (oparg & 0x01) {
3513 assert(PyTuple_CheckExact(TOP()));
3514 func->func_defaults = POP();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003515 }
Neal Norwitzc1505362006-12-28 06:47:50 +00003516
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003517 PUSH((PyObject *)func);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003518 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003519 }
Guido van Rossum8861b741996-07-30 16:49:37 +00003520
Benjamin Petersonddd19492018-09-16 22:38:02 -07003521 case TARGET(BUILD_SLICE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003522 PyObject *start, *stop, *step, *slice;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003523 if (oparg == 3)
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003524 step = POP();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003525 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003526 step = NULL;
3527 stop = POP();
3528 start = TOP();
3529 slice = PySlice_New(start, stop, step);
3530 Py_DECREF(start);
3531 Py_DECREF(stop);
3532 Py_XDECREF(step);
3533 SET_TOP(slice);
3534 if (slice == NULL)
3535 goto error;
3536 DISPATCH();
3537 }
Guido van Rossum8861b741996-07-30 16:49:37 +00003538
Benjamin Petersonddd19492018-09-16 22:38:02 -07003539 case TARGET(FORMAT_VALUE): {
Eric V. Smitha78c7952015-11-03 12:45:05 -05003540 /* Handles f-string value formatting. */
3541 PyObject *result;
3542 PyObject *fmt_spec;
3543 PyObject *value;
3544 PyObject *(*conv_fn)(PyObject *);
3545 int which_conversion = oparg & FVC_MASK;
3546 int have_fmt_spec = (oparg & FVS_MASK) == FVS_HAVE_SPEC;
3547
3548 fmt_spec = have_fmt_spec ? POP() : NULL;
Eric V. Smith135d5f42016-02-05 18:23:08 -05003549 value = POP();
Eric V. Smitha78c7952015-11-03 12:45:05 -05003550
3551 /* See if any conversion is specified. */
3552 switch (which_conversion) {
Eric V. Smith9a4135e2019-05-08 16:28:48 -04003553 case FVC_NONE: conv_fn = NULL; break;
Eric V. Smitha78c7952015-11-03 12:45:05 -05003554 case FVC_STR: conv_fn = PyObject_Str; break;
3555 case FVC_REPR: conv_fn = PyObject_Repr; break;
3556 case FVC_ASCII: conv_fn = PyObject_ASCII; break;
Eric V. Smith9a4135e2019-05-08 16:28:48 -04003557 default:
Victor Stinner438a12d2019-05-24 17:01:38 +02003558 _PyErr_Format(tstate, PyExc_SystemError,
3559 "unexpected conversion flag %d",
3560 which_conversion);
Eric V. Smith9a4135e2019-05-08 16:28:48 -04003561 goto error;
Eric V. Smitha78c7952015-11-03 12:45:05 -05003562 }
3563
3564 /* If there's a conversion function, call it and replace
3565 value with that result. Otherwise, just use value,
3566 without conversion. */
Eric V. Smitheb588a12016-02-05 18:26:20 -05003567 if (conv_fn != NULL) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05003568 result = conv_fn(value);
3569 Py_DECREF(value);
Eric V. Smitheb588a12016-02-05 18:26:20 -05003570 if (result == NULL) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05003571 Py_XDECREF(fmt_spec);
3572 goto error;
3573 }
3574 value = result;
3575 }
3576
3577 /* If value is a unicode object, and there's no fmt_spec,
3578 then we know the result of format(value) is value
3579 itself. In that case, skip calling format(). I plan to
3580 move this optimization in to PyObject_Format()
3581 itself. */
3582 if (PyUnicode_CheckExact(value) && fmt_spec == NULL) {
3583 /* Do nothing, just transfer ownership to result. */
3584 result = value;
3585 } else {
3586 /* Actually call format(). */
3587 result = PyObject_Format(value, fmt_spec);
3588 Py_DECREF(value);
3589 Py_XDECREF(fmt_spec);
Eric V. Smitheb588a12016-02-05 18:26:20 -05003590 if (result == NULL) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05003591 goto error;
Eric V. Smitheb588a12016-02-05 18:26:20 -05003592 }
Eric V. Smitha78c7952015-11-03 12:45:05 -05003593 }
3594
Eric V. Smith135d5f42016-02-05 18:23:08 -05003595 PUSH(result);
Eric V. Smitha78c7952015-11-03 12:45:05 -05003596 DISPATCH();
3597 }
3598
Benjamin Petersonddd19492018-09-16 22:38:02 -07003599 case TARGET(EXTENDED_ARG): {
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03003600 int oldoparg = oparg;
3601 NEXTOPARG();
3602 oparg |= oldoparg << 8;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003603 goto dispatch_opcode;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003604 }
Guido van Rossum8861b741996-07-30 16:49:37 +00003605
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003606
Antoine Pitrou042b1282010-08-13 21:15:58 +00003607#if USE_COMPUTED_GOTOS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003608 _unknown_opcode:
Antoine Pitroub52ec782009-01-25 16:34:23 +00003609#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003610 default:
3611 fprintf(stderr,
3612 "XXX lineno: %d, opcode: %d\n",
3613 PyFrame_GetLineNumber(f),
3614 opcode);
Victor Stinner438a12d2019-05-24 17:01:38 +02003615 _PyErr_SetString(tstate, PyExc_SystemError, "unknown opcode");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003616 goto error;
Guido van Rossum04691fc1992-08-12 15:35:34 +00003617
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003618 } /* switch */
Guido van Rossum374a9221991-04-04 10:40:29 +00003619
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003620 /* This should never be reached. Every opcode should end with DISPATCH()
3621 or goto error. */
Barry Warsawb2e57942017-09-14 18:13:16 -07003622 Py_UNREACHABLE();
Guido van Rossumac7be682001-01-17 15:42:30 +00003623
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003624error:
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003625 /* Double-check exception status. */
Victor Stinner365b6932013-07-12 00:11:58 +02003626#ifdef NDEBUG
Victor Stinner438a12d2019-05-24 17:01:38 +02003627 if (!_PyErr_Occurred(tstate)) {
3628 _PyErr_SetString(tstate, PyExc_SystemError,
3629 "error return without exception set");
3630 }
Victor Stinner365b6932013-07-12 00:11:58 +02003631#else
Victor Stinner438a12d2019-05-24 17:01:38 +02003632 assert(_PyErr_Occurred(tstate));
Victor Stinner365b6932013-07-12 00:11:58 +02003633#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00003634
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003635 /* Log traceback info. */
3636 PyTraceBack_Here(f);
Guido van Rossumac7be682001-01-17 15:42:30 +00003637
Benjamin Peterson51f46162013-01-23 08:38:47 -05003638 if (tstate->c_tracefunc != NULL)
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003639 call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj,
3640 tstate, f);
Guido van Rossumac7be682001-01-17 15:42:30 +00003641
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003642exception_unwind:
3643 /* Unwind stacks if an exception occurred */
3644 while (f->f_iblock > 0) {
3645 /* Pop the current block. */
3646 PyTryBlock *b = &f->f_blockstack[--f->f_iblock];
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003647
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003648 if (b->b_type == EXCEPT_HANDLER) {
3649 UNWIND_EXCEPT_HANDLER(b);
3650 continue;
3651 }
3652 UNWIND_BLOCK(b);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003653 if (b->b_type == SETUP_FINALLY) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003654 PyObject *exc, *val, *tb;
3655 int handler = b->b_handler;
Mark Shannonae3087c2017-10-22 22:41:51 +01003656 _PyErr_StackItem *exc_info = tstate->exc_info;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003657 /* Beware, this invalidates all b->b_* fields */
3658 PyFrame_BlockSetup(f, EXCEPT_HANDLER, -1, STACK_LEVEL());
Mark Shannonae3087c2017-10-22 22:41:51 +01003659 PUSH(exc_info->exc_traceback);
3660 PUSH(exc_info->exc_value);
3661 if (exc_info->exc_type != NULL) {
3662 PUSH(exc_info->exc_type);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003663 }
3664 else {
3665 Py_INCREF(Py_None);
3666 PUSH(Py_None);
3667 }
Victor Stinner438a12d2019-05-24 17:01:38 +02003668 _PyErr_Fetch(tstate, &exc, &val, &tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003669 /* Make the raw exception data
3670 available to the handler,
3671 so a program can emulate the
3672 Python main loop. */
Victor Stinner438a12d2019-05-24 17:01:38 +02003673 _PyErr_NormalizeException(tstate, &exc, &val, &tb);
Victor Stinner7eab0d02013-07-15 21:16:27 +02003674 if (tb != NULL)
3675 PyException_SetTraceback(val, tb);
3676 else
3677 PyException_SetTraceback(val, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003678 Py_INCREF(exc);
Mark Shannonae3087c2017-10-22 22:41:51 +01003679 exc_info->exc_type = exc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003680 Py_INCREF(val);
Mark Shannonae3087c2017-10-22 22:41:51 +01003681 exc_info->exc_value = val;
3682 exc_info->exc_traceback = tb;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003683 if (tb == NULL)
3684 tb = Py_None;
3685 Py_INCREF(tb);
3686 PUSH(tb);
3687 PUSH(val);
3688 PUSH(exc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003689 JUMPTO(handler);
Pablo Galindo4c53e632020-01-10 09:24:22 +00003690 if (_Py_TracingPossible(ceval)) {
3691 int needs_new_execution_window = (f->f_lasti < instr_lb || f->f_lasti >= instr_ub);
3692 int needs_line_update = (f->f_lasti == instr_lb || f->f_lasti < instr_prev);
3693 /* Make sure that we trace line after exception if we are in a new execution
3694 * window or we don't need a line update and we are not in the first instruction
3695 * of the line. */
3696 if (needs_new_execution_window || (!needs_line_update && instr_lb > 0)) {
3697 instr_prev = INT_MAX;
3698 }
Mark Shannonfee55262019-11-21 09:11:43 +00003699 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003700 /* Resume normal execution */
3701 goto main_loop;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003702 }
3703 } /* unwind stack */
Guido van Rossum374a9221991-04-04 10:40:29 +00003704
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003705 /* End the loop as we still have an error */
3706 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003707 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00003708
Pablo Galindof00828a2019-05-09 16:52:02 +01003709 assert(retval == NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02003710 assert(_PyErr_Occurred(tstate));
Pablo Galindof00828a2019-05-09 16:52:02 +01003711
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003712 /* Pop remaining stack entries. */
3713 while (!EMPTY()) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003714 PyObject *o = POP();
3715 Py_XDECREF(o);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003716 }
Guido van Rossum35974fb2001-12-06 21:28:18 +00003717
Mark Shannone7c9f4a2020-01-13 12:51:26 +00003718exiting:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003719 if (tstate->use_tracing) {
Benjamin Peterson51f46162013-01-23 08:38:47 -05003720 if (tstate->c_tracefunc) {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003721 if (call_trace_protected(tstate->c_tracefunc, tstate->c_traceobj,
3722 tstate, f, PyTrace_RETURN, retval)) {
3723 Py_CLEAR(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003724 }
3725 }
3726 if (tstate->c_profilefunc) {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003727 if (call_trace_protected(tstate->c_profilefunc, tstate->c_profileobj,
3728 tstate, f, PyTrace_RETURN, retval)) {
Serhiy Storchaka505ff752014-02-09 13:33:53 +02003729 Py_CLEAR(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003730 }
3731 }
3732 }
Guido van Rossuma4240131997-01-21 21:18:36 +00003733
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003734 /* pop frame */
Thomas Woutersce272b62007-09-19 21:19:28 +00003735exit_eval_frame:
Łukasz Langaa785c872016-09-09 17:37:37 -07003736 if (PyDTrace_FUNCTION_RETURN_ENABLED())
3737 dtrace_function_return(f);
Victor Stinnerbe434dc2019-11-05 00:51:22 +01003738 _Py_LeaveRecursiveCall(tstate);
Antoine Pitrou58720d62013-08-05 23:26:40 +02003739 f->f_executing = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003740 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00003741
Victor Stinner17269092019-11-05 01:22:12 +01003742 return _Py_CheckFunctionResult(tstate, NULL, retval, "PyEval_EvalFrameEx");
Guido van Rossum374a9221991-04-04 10:40:29 +00003743}
3744
Benjamin Petersonb204a422011-06-05 22:04:07 -05003745static void
Victor Stinner438a12d2019-05-24 17:01:38 +02003746format_missing(PyThreadState *tstate, const char *kind,
3747 PyCodeObject *co, PyObject *names)
Benjamin Petersone109c702011-06-24 09:37:26 -05003748{
3749 int err;
3750 Py_ssize_t len = PyList_GET_SIZE(names);
3751 PyObject *name_str, *comma, *tail, *tmp;
3752
3753 assert(PyList_CheckExact(names));
3754 assert(len >= 1);
3755 /* Deal with the joys of natural language. */
3756 switch (len) {
3757 case 1:
3758 name_str = PyList_GET_ITEM(names, 0);
3759 Py_INCREF(name_str);
3760 break;
3761 case 2:
3762 name_str = PyUnicode_FromFormat("%U and %U",
3763 PyList_GET_ITEM(names, len - 2),
3764 PyList_GET_ITEM(names, len - 1));
3765 break;
3766 default:
3767 tail = PyUnicode_FromFormat(", %U, and %U",
3768 PyList_GET_ITEM(names, len - 2),
3769 PyList_GET_ITEM(names, len - 1));
Benjamin Petersond1ab6082012-06-01 11:18:22 -07003770 if (tail == NULL)
3771 return;
Benjamin Petersone109c702011-06-24 09:37:26 -05003772 /* Chop off the last two objects in the list. This shouldn't actually
3773 fail, but we can't be too careful. */
3774 err = PyList_SetSlice(names, len - 2, len, NULL);
3775 if (err == -1) {
3776 Py_DECREF(tail);
3777 return;
3778 }
3779 /* Stitch everything up into a nice comma-separated list. */
3780 comma = PyUnicode_FromString(", ");
3781 if (comma == NULL) {
3782 Py_DECREF(tail);
3783 return;
3784 }
3785 tmp = PyUnicode_Join(comma, names);
3786 Py_DECREF(comma);
3787 if (tmp == NULL) {
3788 Py_DECREF(tail);
3789 return;
3790 }
3791 name_str = PyUnicode_Concat(tmp, tail);
3792 Py_DECREF(tmp);
3793 Py_DECREF(tail);
3794 break;
3795 }
3796 if (name_str == NULL)
3797 return;
Victor Stinner438a12d2019-05-24 17:01:38 +02003798 _PyErr_Format(tstate, PyExc_TypeError,
3799 "%U() missing %i required %s argument%s: %U",
3800 co->co_name,
3801 len,
3802 kind,
3803 len == 1 ? "" : "s",
3804 name_str);
Benjamin Petersone109c702011-06-24 09:37:26 -05003805 Py_DECREF(name_str);
3806}
3807
3808static void
Victor Stinner438a12d2019-05-24 17:01:38 +02003809missing_arguments(PyThreadState *tstate, PyCodeObject *co,
3810 Py_ssize_t missing, Py_ssize_t defcount,
Benjamin Petersone109c702011-06-24 09:37:26 -05003811 PyObject **fastlocals)
3812{
Victor Stinner74319ae2016-08-25 00:04:09 +02003813 Py_ssize_t i, j = 0;
3814 Py_ssize_t start, end;
3815 int positional = (defcount != -1);
Benjamin Petersone109c702011-06-24 09:37:26 -05003816 const char *kind = positional ? "positional" : "keyword-only";
3817 PyObject *missing_names;
3818
3819 /* Compute the names of the arguments that are missing. */
3820 missing_names = PyList_New(missing);
3821 if (missing_names == NULL)
3822 return;
3823 if (positional) {
3824 start = 0;
Pablo Galindocd74e662019-06-01 18:08:04 +01003825 end = co->co_argcount - defcount;
Benjamin Petersone109c702011-06-24 09:37:26 -05003826 }
3827 else {
Pablo Galindocd74e662019-06-01 18:08:04 +01003828 start = co->co_argcount;
Benjamin Petersone109c702011-06-24 09:37:26 -05003829 end = start + co->co_kwonlyargcount;
3830 }
3831 for (i = start; i < end; i++) {
3832 if (GETLOCAL(i) == NULL) {
3833 PyObject *raw = PyTuple_GET_ITEM(co->co_varnames, i);
3834 PyObject *name = PyObject_Repr(raw);
3835 if (name == NULL) {
3836 Py_DECREF(missing_names);
3837 return;
3838 }
3839 PyList_SET_ITEM(missing_names, j++, name);
3840 }
3841 }
3842 assert(j == missing);
Victor Stinner438a12d2019-05-24 17:01:38 +02003843 format_missing(tstate, kind, co, missing_names);
Benjamin Petersone109c702011-06-24 09:37:26 -05003844 Py_DECREF(missing_names);
3845}
3846
3847static void
Victor Stinner438a12d2019-05-24 17:01:38 +02003848too_many_positional(PyThreadState *tstate, PyCodeObject *co,
3849 Py_ssize_t given, Py_ssize_t defcount,
Victor Stinner74319ae2016-08-25 00:04:09 +02003850 PyObject **fastlocals)
Benjamin Petersonb204a422011-06-05 22:04:07 -05003851{
3852 int plural;
Victor Stinner74319ae2016-08-25 00:04:09 +02003853 Py_ssize_t kwonly_given = 0;
3854 Py_ssize_t i;
Benjamin Petersonb204a422011-06-05 22:04:07 -05003855 PyObject *sig, *kwonly_sig;
Victor Stinner74319ae2016-08-25 00:04:09 +02003856 Py_ssize_t co_argcount = co->co_argcount;
Benjamin Petersonb204a422011-06-05 22:04:07 -05003857
Benjamin Petersone109c702011-06-24 09:37:26 -05003858 assert((co->co_flags & CO_VARARGS) == 0);
3859 /* Count missing keyword-only args. */
Pablo Galindocd74e662019-06-01 18:08:04 +01003860 for (i = co_argcount; i < co_argcount + co->co_kwonlyargcount; i++) {
Victor Stinner74319ae2016-08-25 00:04:09 +02003861 if (GETLOCAL(i) != NULL) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05003862 kwonly_given++;
Victor Stinner74319ae2016-08-25 00:04:09 +02003863 }
3864 }
Benjamin Petersone109c702011-06-24 09:37:26 -05003865 if (defcount) {
Pablo Galindocd74e662019-06-01 18:08:04 +01003866 Py_ssize_t atleast = co_argcount - defcount;
Benjamin Petersonb204a422011-06-05 22:04:07 -05003867 plural = 1;
Pablo Galindocd74e662019-06-01 18:08:04 +01003868 sig = PyUnicode_FromFormat("from %zd to %zd", atleast, co_argcount);
Benjamin Petersonb204a422011-06-05 22:04:07 -05003869 }
3870 else {
Pablo Galindocd74e662019-06-01 18:08:04 +01003871 plural = (co_argcount != 1);
3872 sig = PyUnicode_FromFormat("%zd", co_argcount);
Benjamin Petersonb204a422011-06-05 22:04:07 -05003873 }
3874 if (sig == NULL)
3875 return;
3876 if (kwonly_given) {
Victor Stinner74319ae2016-08-25 00:04:09 +02003877 const char *format = " positional argument%s (and %zd keyword-only argument%s)";
3878 kwonly_sig = PyUnicode_FromFormat(format,
3879 given != 1 ? "s" : "",
3880 kwonly_given,
3881 kwonly_given != 1 ? "s" : "");
Benjamin Petersonb204a422011-06-05 22:04:07 -05003882 if (kwonly_sig == NULL) {
3883 Py_DECREF(sig);
3884 return;
3885 }
3886 }
3887 else {
3888 /* This will not fail. */
3889 kwonly_sig = PyUnicode_FromString("");
Benjamin Petersone109c702011-06-24 09:37:26 -05003890 assert(kwonly_sig != NULL);
Benjamin Petersonb204a422011-06-05 22:04:07 -05003891 }
Victor Stinner438a12d2019-05-24 17:01:38 +02003892 _PyErr_Format(tstate, PyExc_TypeError,
3893 "%U() takes %U positional argument%s but %zd%U %s given",
3894 co->co_name,
3895 sig,
3896 plural ? "s" : "",
3897 given,
3898 kwonly_sig,
3899 given == 1 && !kwonly_given ? "was" : "were");
Benjamin Petersonb204a422011-06-05 22:04:07 -05003900 Py_DECREF(sig);
3901 Py_DECREF(kwonly_sig);
3902}
3903
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01003904static int
Victor Stinner438a12d2019-05-24 17:01:38 +02003905positional_only_passed_as_keyword(PyThreadState *tstate, PyCodeObject *co,
3906 Py_ssize_t kwcount, PyObject* const* kwnames)
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01003907{
3908 int posonly_conflicts = 0;
3909 PyObject* posonly_names = PyList_New(0);
3910
3911 for(int k=0; k < co->co_posonlyargcount; k++){
3912 PyObject* posonly_name = PyTuple_GET_ITEM(co->co_varnames, k);
3913
3914 for (int k2=0; k2<kwcount; k2++){
3915 /* Compare the pointers first and fallback to PyObject_RichCompareBool*/
3916 PyObject* kwname = kwnames[k2];
3917 if (kwname == posonly_name){
3918 if(PyList_Append(posonly_names, kwname) != 0) {
3919 goto fail;
3920 }
3921 posonly_conflicts++;
3922 continue;
3923 }
3924
3925 int cmp = PyObject_RichCompareBool(posonly_name, kwname, Py_EQ);
3926
3927 if ( cmp > 0) {
3928 if(PyList_Append(posonly_names, kwname) != 0) {
3929 goto fail;
3930 }
3931 posonly_conflicts++;
3932 } else if (cmp < 0) {
3933 goto fail;
3934 }
3935
3936 }
3937 }
3938 if (posonly_conflicts) {
3939 PyObject* comma = PyUnicode_FromString(", ");
3940 if (comma == NULL) {
3941 goto fail;
3942 }
3943 PyObject* error_names = PyUnicode_Join(comma, posonly_names);
3944 Py_DECREF(comma);
3945 if (error_names == NULL) {
3946 goto fail;
3947 }
Victor Stinner438a12d2019-05-24 17:01:38 +02003948 _PyErr_Format(tstate, PyExc_TypeError,
3949 "%U() got some positional-only arguments passed"
3950 " as keyword arguments: '%U'",
3951 co->co_name, error_names);
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01003952 Py_DECREF(error_names);
3953 goto fail;
3954 }
3955
3956 Py_DECREF(posonly_names);
3957 return 0;
3958
3959fail:
3960 Py_XDECREF(posonly_names);
3961 return 1;
3962
3963}
3964
Guido van Rossumc2e20742006-02-27 22:32:47 +00003965/* This is gonna seem *real weird*, but if you put some other code between
Marcel Plch3a9ccee2018-04-06 23:22:04 +02003966 PyEval_EvalFrame() and _PyEval_EvalFrameDefault() you will need to adjust
Guido van Rossumc2e20742006-02-27 22:32:47 +00003967 the test in the if statements in Misc/gdbinit (pystack and pystackv). */
Skip Montanaro786ea6b2004-03-01 15:44:05 +00003968
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01003969PyObject *
Victor Stinnerb5e170f2019-11-16 01:03:22 +01003970_PyEval_EvalCode(PyThreadState *tstate,
3971 PyObject *_co, PyObject *globals, PyObject *locals,
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02003972 PyObject *const *args, Py_ssize_t argcount,
3973 PyObject *const *kwnames, PyObject *const *kwargs,
Serhiy Storchakab7281052016-09-12 00:52:40 +03003974 Py_ssize_t kwcount, int kwstep,
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02003975 PyObject *const *defs, Py_ssize_t defcount,
Victor Stinner74319ae2016-08-25 00:04:09 +02003976 PyObject *kwdefs, PyObject *closure,
Victor Stinner40ee3012014-06-16 15:59:28 +02003977 PyObject *name, PyObject *qualname)
Tim Peters5ca576e2001-06-18 22:08:13 +00003978{
Victor Stinnerb5e170f2019-11-16 01:03:22 +01003979 assert(tstate != NULL);
3980
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00003981 PyCodeObject* co = (PyCodeObject*)_co;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02003982 PyFrameObject *f;
3983 PyObject *retval = NULL;
3984 PyObject **fastlocals, **freevars;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003985 PyObject *x, *u;
Pablo Galindocd74e662019-06-01 18:08:04 +01003986 const Py_ssize_t total_args = co->co_argcount + co->co_kwonlyargcount;
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01003987 Py_ssize_t i, j, n;
Victor Stinnerc7020012016-08-16 23:40:29 +02003988 PyObject *kwdict;
Tim Peters5ca576e2001-06-18 22:08:13 +00003989
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003990 if (globals == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003991 _PyErr_SetString(tstate, PyExc_SystemError,
3992 "PyEval_EvalCodeEx: NULL globals");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003993 return NULL;
3994 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003995
Victor Stinnerc7020012016-08-16 23:40:29 +02003996 /* Create the frame */
INADA Naoki5a625d02016-12-24 20:19:08 +09003997 f = _PyFrame_New_NoTrack(tstate, co, globals, locals);
Victor Stinnerc7020012016-08-16 23:40:29 +02003998 if (f == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003999 return NULL;
Victor Stinnerc7020012016-08-16 23:40:29 +02004000 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004001 fastlocals = f->f_localsplus;
4002 freevars = f->f_localsplus + co->co_nlocals;
Tim Peters5ca576e2001-06-18 22:08:13 +00004003
Victor Stinnerc7020012016-08-16 23:40:29 +02004004 /* Create a dictionary for keyword parameters (**kwags) */
Benjamin Petersonb204a422011-06-05 22:04:07 -05004005 if (co->co_flags & CO_VARKEYWORDS) {
4006 kwdict = PyDict_New();
4007 if (kwdict == NULL)
4008 goto fail;
4009 i = total_args;
Victor Stinnerc7020012016-08-16 23:40:29 +02004010 if (co->co_flags & CO_VARARGS) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004011 i++;
Victor Stinnerc7020012016-08-16 23:40:29 +02004012 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004013 SETLOCAL(i, kwdict);
4014 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004015 else {
4016 kwdict = NULL;
4017 }
4018
Pablo Galindocd74e662019-06-01 18:08:04 +01004019 /* Copy all positional arguments into local variables */
4020 if (argcount > co->co_argcount) {
4021 n = co->co_argcount;
Victor Stinnerc7020012016-08-16 23:40:29 +02004022 }
4023 else {
4024 n = argcount;
4025 }
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004026 for (j = 0; j < n; j++) {
4027 x = args[j];
4028 Py_INCREF(x);
4029 SETLOCAL(j, x);
4030 }
4031
Victor Stinnerc7020012016-08-16 23:40:29 +02004032 /* Pack other positional arguments into the *args argument */
Benjamin Petersonb204a422011-06-05 22:04:07 -05004033 if (co->co_flags & CO_VARARGS) {
Sergey Fedoseev234531b2019-02-25 21:59:12 +05004034 u = _PyTuple_FromArray(args + n, argcount - n);
Victor Stinnerc7020012016-08-16 23:40:29 +02004035 if (u == NULL) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004036 goto fail;
Victor Stinnerc7020012016-08-16 23:40:29 +02004037 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004038 SETLOCAL(total_args, u);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004039 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004040
Serhiy Storchakab7281052016-09-12 00:52:40 +03004041 /* Handle keyword arguments passed as two strided arrays */
4042 kwcount *= kwstep;
4043 for (i = 0; i < kwcount; i += kwstep) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004044 PyObject **co_varnames;
Serhiy Storchakab7281052016-09-12 00:52:40 +03004045 PyObject *keyword = kwnames[i];
4046 PyObject *value = kwargs[i];
Victor Stinner17061a92016-08-16 23:39:42 +02004047 Py_ssize_t j;
Victor Stinnerc7020012016-08-16 23:40:29 +02004048
Benjamin Petersonb204a422011-06-05 22:04:07 -05004049 if (keyword == NULL || !PyUnicode_Check(keyword)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004050 _PyErr_Format(tstate, PyExc_TypeError,
4051 "%U() keywords must be strings",
4052 co->co_name);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004053 goto fail;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004054 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004055
Benjamin Petersonb204a422011-06-05 22:04:07 -05004056 /* Speed hack: do raw pointer compares. As names are
4057 normally interned this should almost always hit. */
4058 co_varnames = ((PyTupleObject *)(co->co_varnames))->ob_item;
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004059 for (j = co->co_posonlyargcount; j < total_args; j++) {
Victor Stinner6fea7f72016-08-22 23:17:30 +02004060 PyObject *name = co_varnames[j];
4061 if (name == keyword) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004062 goto kw_found;
Victor Stinner6fea7f72016-08-22 23:17:30 +02004063 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004064 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004065
Benjamin Petersonb204a422011-06-05 22:04:07 -05004066 /* Slow fallback, just in case */
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004067 for (j = co->co_posonlyargcount; j < total_args; j++) {
Victor Stinner6fea7f72016-08-22 23:17:30 +02004068 PyObject *name = co_varnames[j];
4069 int cmp = PyObject_RichCompareBool( keyword, name, Py_EQ);
4070 if (cmp > 0) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004071 goto kw_found;
Victor Stinner6fea7f72016-08-22 23:17:30 +02004072 }
4073 else if (cmp < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004074 goto fail;
Victor Stinner6fea7f72016-08-22 23:17:30 +02004075 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004076 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004077
Victor Stinner231d1f32017-01-11 02:12:06 +01004078 assert(j >= total_args);
4079 if (kwdict == NULL) {
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004080
Victor Stinner438a12d2019-05-24 17:01:38 +02004081 if (co->co_posonlyargcount
4082 && positional_only_passed_as_keyword(tstate, co,
4083 kwcount, kwnames))
4084 {
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004085 goto fail;
4086 }
4087
Victor Stinner438a12d2019-05-24 17:01:38 +02004088 _PyErr_Format(tstate, PyExc_TypeError,
4089 "%U() got an unexpected keyword argument '%S'",
4090 co->co_name, keyword);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004091 goto fail;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004092 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004093
Christian Heimes0bd447f2013-07-20 14:48:10 +02004094 if (PyDict_SetItem(kwdict, keyword, value) == -1) {
4095 goto fail;
4096 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004097 continue;
Victor Stinnerc7020012016-08-16 23:40:29 +02004098
Benjamin Petersonb204a422011-06-05 22:04:07 -05004099 kw_found:
4100 if (GETLOCAL(j) != NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004101 _PyErr_Format(tstate, PyExc_TypeError,
4102 "%U() got multiple values for argument '%S'",
4103 co->co_name, keyword);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004104 goto fail;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004105 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004106 Py_INCREF(value);
4107 SETLOCAL(j, value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004108 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004109
4110 /* Check the number of positional arguments */
Pablo Galindocd74e662019-06-01 18:08:04 +01004111 if ((argcount > co->co_argcount) && !(co->co_flags & CO_VARARGS)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004112 too_many_positional(tstate, co, argcount, defcount, fastlocals);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004113 goto fail;
4114 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004115
4116 /* Add missing positional arguments (copy default values from defs) */
Pablo Galindocd74e662019-06-01 18:08:04 +01004117 if (argcount < co->co_argcount) {
4118 Py_ssize_t m = co->co_argcount - defcount;
Victor Stinner17061a92016-08-16 23:39:42 +02004119 Py_ssize_t missing = 0;
4120 for (i = argcount; i < m; i++) {
4121 if (GETLOCAL(i) == NULL) {
Benjamin Petersone109c702011-06-24 09:37:26 -05004122 missing++;
Victor Stinner17061a92016-08-16 23:39:42 +02004123 }
4124 }
Benjamin Petersone109c702011-06-24 09:37:26 -05004125 if (missing) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004126 missing_arguments(tstate, co, missing, defcount, fastlocals);
Benjamin Petersone109c702011-06-24 09:37:26 -05004127 goto fail;
Benjamin Petersonb204a422011-06-05 22:04:07 -05004128 }
4129 if (n > m)
4130 i = n - m;
4131 else
4132 i = 0;
4133 for (; i < defcount; i++) {
4134 if (GETLOCAL(m+i) == NULL) {
4135 PyObject *def = defs[i];
4136 Py_INCREF(def);
4137 SETLOCAL(m+i, def);
4138 }
4139 }
4140 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004141
4142 /* Add missing keyword arguments (copy default values from kwdefs) */
Benjamin Petersonb204a422011-06-05 22:04:07 -05004143 if (co->co_kwonlyargcount > 0) {
Victor Stinner17061a92016-08-16 23:39:42 +02004144 Py_ssize_t missing = 0;
Pablo Galindocd74e662019-06-01 18:08:04 +01004145 for (i = co->co_argcount; i < total_args; i++) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004146 PyObject *name;
4147 if (GETLOCAL(i) != NULL)
4148 continue;
4149 name = PyTuple_GET_ITEM(co->co_varnames, i);
4150 if (kwdefs != NULL) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02004151 PyObject *def = PyDict_GetItemWithError(kwdefs, name);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004152 if (def) {
4153 Py_INCREF(def);
4154 SETLOCAL(i, def);
4155 continue;
4156 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004157 else if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02004158 goto fail;
4159 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004160 }
Benjamin Petersone109c702011-06-24 09:37:26 -05004161 missing++;
4162 }
4163 if (missing) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004164 missing_arguments(tstate, co, missing, -1, fastlocals);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004165 goto fail;
4166 }
4167 }
4168
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004169 /* Allocate and initialize storage for cell vars, and copy free
Benjamin Peterson90037602011-06-25 22:54:45 -05004170 vars into frame. */
4171 for (i = 0; i < PyTuple_GET_SIZE(co->co_cellvars); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004172 PyObject *c;
Serhiy Storchaka5bb8b912016-12-16 19:19:02 +02004173 Py_ssize_t arg;
Benjamin Peterson90037602011-06-25 22:54:45 -05004174 /* Possibly account for the cell variable being an argument. */
4175 if (co->co_cell2arg != NULL &&
Guido van Rossum6832c812013-05-10 08:47:42 -07004176 (arg = co->co_cell2arg[i]) != CO_CELL_NOT_AN_ARG) {
Benjamin Peterson90037602011-06-25 22:54:45 -05004177 c = PyCell_New(GETLOCAL(arg));
Benjamin Peterson159ae412013-05-12 18:16:06 -05004178 /* Clear the local copy. */
4179 SETLOCAL(arg, NULL);
Guido van Rossum6832c812013-05-10 08:47:42 -07004180 }
4181 else {
Benjamin Peterson90037602011-06-25 22:54:45 -05004182 c = PyCell_New(NULL);
Guido van Rossum6832c812013-05-10 08:47:42 -07004183 }
Benjamin Peterson159ae412013-05-12 18:16:06 -05004184 if (c == NULL)
4185 goto fail;
Benjamin Peterson90037602011-06-25 22:54:45 -05004186 SETLOCAL(co->co_nlocals + i, c);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004187 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004188
4189 /* Copy closure variables to free variables */
Benjamin Peterson90037602011-06-25 22:54:45 -05004190 for (i = 0; i < PyTuple_GET_SIZE(co->co_freevars); ++i) {
4191 PyObject *o = PyTuple_GET_ITEM(closure, i);
4192 Py_INCREF(o);
4193 freevars[PyTuple_GET_SIZE(co->co_cellvars) + i] = o;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004194 }
Tim Peters5ca576e2001-06-18 22:08:13 +00004195
Yury Selivanoveb636452016-09-08 22:01:51 -07004196 /* Handle generator/coroutine/asynchronous generator */
4197 if (co->co_flags & (CO_GENERATOR | CO_COROUTINE | CO_ASYNC_GENERATOR)) {
Yury Selivanov75445082015-05-11 22:57:16 -04004198 PyObject *gen;
Yury Selivanov5376ba92015-06-22 12:19:30 -04004199 int is_coro = co->co_flags & CO_COROUTINE;
Yury Selivanov94c22632015-06-04 10:16:51 -04004200
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004201 /* Don't need to keep the reference to f_back, it will be set
4202 * when the generator is resumed. */
Serhiy Storchaka505ff752014-02-09 13:33:53 +02004203 Py_CLEAR(f->f_back);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00004204
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004205 /* Create a new generator that owns the ready to run frame
4206 * and return that as the value. */
Yury Selivanov5376ba92015-06-22 12:19:30 -04004207 if (is_coro) {
4208 gen = PyCoro_New(f, name, qualname);
Yury Selivanoveb636452016-09-08 22:01:51 -07004209 } else if (co->co_flags & CO_ASYNC_GENERATOR) {
4210 gen = PyAsyncGen_New(f, name, qualname);
Yury Selivanov5376ba92015-06-22 12:19:30 -04004211 } else {
4212 gen = PyGen_NewWithQualName(f, name, qualname);
4213 }
INADA Naoki6a3cedf2016-12-26 18:01:46 +09004214 if (gen == NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04004215 return NULL;
INADA Naoki6a3cedf2016-12-26 18:01:46 +09004216 }
INADA Naoki9c157762016-12-26 18:52:46 +09004217
INADA Naoki6a3cedf2016-12-26 18:01:46 +09004218 _PyObject_GC_TRACK(f);
Yury Selivanov75445082015-05-11 22:57:16 -04004219
Yury Selivanov75445082015-05-11 22:57:16 -04004220 return gen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004221 }
Tim Peters5ca576e2001-06-18 22:08:13 +00004222
Victor Stinnerb9e68122019-11-14 12:20:46 +01004223 retval = _PyEval_EvalFrame(tstate, f, 0);
Tim Peters5ca576e2001-06-18 22:08:13 +00004224
Thomas Woutersce272b62007-09-19 21:19:28 +00004225fail: /* Jump here from prelude on failure */
Tim Peters5ca576e2001-06-18 22:08:13 +00004226
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004227 /* decref'ing the frame can cause __del__ methods to get invoked,
4228 which can call back into Python. While we're done with the
4229 current Python frame (f), the associated C stack is still in use,
4230 so recursion_depth must be boosted for the duration.
4231 */
INADA Naoki5a625d02016-12-24 20:19:08 +09004232 if (Py_REFCNT(f) > 1) {
4233 Py_DECREF(f);
4234 _PyObject_GC_TRACK(f);
4235 }
4236 else {
4237 ++tstate->recursion_depth;
4238 Py_DECREF(f);
4239 --tstate->recursion_depth;
4240 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004241 return retval;
Tim Peters5ca576e2001-06-18 22:08:13 +00004242}
4243
Victor Stinnerb5e170f2019-11-16 01:03:22 +01004244
4245PyObject *
4246_PyEval_EvalCodeWithName(PyObject *_co, PyObject *globals, PyObject *locals,
4247 PyObject *const *args, Py_ssize_t argcount,
4248 PyObject *const *kwnames, PyObject *const *kwargs,
4249 Py_ssize_t kwcount, int kwstep,
4250 PyObject *const *defs, Py_ssize_t defcount,
4251 PyObject *kwdefs, PyObject *closure,
4252 PyObject *name, PyObject *qualname)
4253{
4254 PyThreadState *tstate = _PyThreadState_GET();
4255 return _PyEval_EvalCode(tstate, _co, globals, locals,
4256 args, argcount,
4257 kwnames, kwargs,
4258 kwcount, kwstep,
4259 defs, defcount,
4260 kwdefs, closure,
4261 name, qualname);
4262}
4263
Victor Stinner40ee3012014-06-16 15:59:28 +02004264PyObject *
4265PyEval_EvalCodeEx(PyObject *_co, PyObject *globals, PyObject *locals,
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02004266 PyObject *const *args, int argcount,
4267 PyObject *const *kws, int kwcount,
4268 PyObject *const *defs, int defcount,
4269 PyObject *kwdefs, PyObject *closure)
Victor Stinner40ee3012014-06-16 15:59:28 +02004270{
4271 return _PyEval_EvalCodeWithName(_co, globals, locals,
Victor Stinner9be7e7b2016-08-19 16:11:43 +02004272 args, argcount,
Zackery Spytzc6ea8972017-07-31 08:24:37 -06004273 kws, kws != NULL ? kws + 1 : NULL,
4274 kwcount, 2,
Victor Stinner9be7e7b2016-08-19 16:11:43 +02004275 defs, defcount,
4276 kwdefs, closure,
Victor Stinner40ee3012014-06-16 15:59:28 +02004277 NULL, NULL);
4278}
Tim Peters5ca576e2001-06-18 22:08:13 +00004279
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004280static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02004281special_lookup(PyThreadState *tstate, PyObject *o, _Py_Identifier *id)
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004282{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004283 PyObject *res;
Benjamin Petersonce798522012-01-22 11:24:29 -05004284 res = _PyObject_LookupSpecial(o, id);
Victor Stinner438a12d2019-05-24 17:01:38 +02004285 if (res == NULL && !_PyErr_Occurred(tstate)) {
4286 _PyErr_SetObject(tstate, PyExc_AttributeError, id->object);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004287 return NULL;
4288 }
4289 return res;
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004290}
4291
4292
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00004293/* Logic for the raise statement (too complicated for inlining).
4294 This *consumes* a reference count to each of its arguments. */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004295static int
Victor Stinner09532fe2019-05-10 23:39:09 +02004296do_raise(PyThreadState *tstate, PyObject *exc, PyObject *cause)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00004297{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004298 PyObject *type = NULL, *value = NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00004299
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004300 if (exc == NULL) {
4301 /* Reraise */
Mark Shannonae3087c2017-10-22 22:41:51 +01004302 _PyErr_StackItem *exc_info = _PyErr_GetTopmostException(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004303 PyObject *tb;
Mark Shannonae3087c2017-10-22 22:41:51 +01004304 type = exc_info->exc_type;
4305 value = exc_info->exc_value;
4306 tb = exc_info->exc_traceback;
Victor Stinnereec93312016-08-18 18:13:10 +02004307 if (type == Py_None || type == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004308 _PyErr_SetString(tstate, PyExc_RuntimeError,
4309 "No active exception to reraise");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004310 return 0;
4311 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004312 Py_XINCREF(type);
4313 Py_XINCREF(value);
4314 Py_XINCREF(tb);
Victor Stinner438a12d2019-05-24 17:01:38 +02004315 _PyErr_Restore(tstate, type, value, tb);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004316 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004317 }
Guido van Rossumac7be682001-01-17 15:42:30 +00004318
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004319 /* We support the following forms of raise:
4320 raise
Collin Winter828f04a2007-08-31 00:04:24 +00004321 raise <instance>
4322 raise <type> */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00004323
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004324 if (PyExceptionClass_Check(exc)) {
4325 type = exc;
Victor Stinnera5ed5f02016-12-06 18:45:50 +01004326 value = _PyObject_CallNoArg(exc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004327 if (value == NULL)
4328 goto raise_error;
Benjamin Peterson5afa03a2011-07-15 14:09:26 -05004329 if (!PyExceptionInstance_Check(value)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004330 _PyErr_Format(tstate, PyExc_TypeError,
4331 "calling %R should have returned an instance of "
4332 "BaseException, not %R",
4333 type, Py_TYPE(value));
4334 goto raise_error;
Benjamin Peterson5afa03a2011-07-15 14:09:26 -05004335 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004336 }
4337 else if (PyExceptionInstance_Check(exc)) {
4338 value = exc;
4339 type = PyExceptionInstance_Class(exc);
4340 Py_INCREF(type);
4341 }
4342 else {
4343 /* Not something you can raise. You get an exception
4344 anyway, just not what you specified :-) */
4345 Py_DECREF(exc);
Victor Stinner438a12d2019-05-24 17:01:38 +02004346 _PyErr_SetString(tstate, PyExc_TypeError,
4347 "exceptions must derive from BaseException");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004348 goto raise_error;
4349 }
Collin Winter828f04a2007-08-31 00:04:24 +00004350
Serhiy Storchakac0191582016-09-27 11:37:10 +03004351 assert(type != NULL);
4352 assert(value != NULL);
4353
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004354 if (cause) {
4355 PyObject *fixed_cause;
4356 if (PyExceptionClass_Check(cause)) {
Victor Stinnera5ed5f02016-12-06 18:45:50 +01004357 fixed_cause = _PyObject_CallNoArg(cause);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004358 if (fixed_cause == NULL)
4359 goto raise_error;
Benjamin Petersond5a1c442012-05-14 22:09:31 -07004360 Py_DECREF(cause);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004361 }
Benjamin Petersond5a1c442012-05-14 22:09:31 -07004362 else if (PyExceptionInstance_Check(cause)) {
4363 fixed_cause = cause;
4364 }
4365 else if (cause == Py_None) {
4366 Py_DECREF(cause);
4367 fixed_cause = NULL;
4368 }
4369 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02004370 _PyErr_SetString(tstate, PyExc_TypeError,
4371 "exception causes must derive from "
4372 "BaseException");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004373 goto raise_error;
4374 }
Benjamin Petersond5a1c442012-05-14 22:09:31 -07004375 PyException_SetCause(value, fixed_cause);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004376 }
Collin Winter828f04a2007-08-31 00:04:24 +00004377
Victor Stinner438a12d2019-05-24 17:01:38 +02004378 _PyErr_SetObject(tstate, type, value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004379 /* PyErr_SetObject incref's its arguments */
Serhiy Storchakac0191582016-09-27 11:37:10 +03004380 Py_DECREF(value);
4381 Py_DECREF(type);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004382 return 0;
Collin Winter828f04a2007-08-31 00:04:24 +00004383
4384raise_error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004385 Py_XDECREF(value);
4386 Py_XDECREF(type);
4387 Py_XDECREF(cause);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004388 return 0;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00004389}
4390
Tim Petersd6d010b2001-06-21 02:49:55 +00004391/* Iterate v argcnt times and store the results on the stack (via decreasing
Guido van Rossum0368b722007-05-11 16:50:42 +00004392 sp). Return 1 for success, 0 if error.
Antoine Pitrou9a2310d2008-07-25 22:39:39 +00004393
Guido van Rossum0368b722007-05-11 16:50:42 +00004394 If argcntafter == -1, do a simple unpack. If it is >= 0, do an unpack
4395 with a variable target.
4396*/
Tim Petersd6d010b2001-06-21 02:49:55 +00004397
Barry Warsawe42b18f1997-08-25 22:13:04 +00004398static int
Victor Stinner438a12d2019-05-24 17:01:38 +02004399unpack_iterable(PyThreadState *tstate, PyObject *v,
4400 int argcnt, int argcntafter, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00004401{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004402 int i = 0, j = 0;
4403 Py_ssize_t ll = 0;
4404 PyObject *it; /* iter(v) */
4405 PyObject *w;
4406 PyObject *l = NULL; /* variable list */
Guido van Rossumac7be682001-01-17 15:42:30 +00004407
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004408 assert(v != NULL);
Tim Petersd6d010b2001-06-21 02:49:55 +00004409
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004410 it = PyObject_GetIter(v);
Serhiy Storchaka13a6c092017-12-26 12:30:41 +02004411 if (it == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004412 if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError) &&
Serhiy Storchaka13a6c092017-12-26 12:30:41 +02004413 v->ob_type->tp_iter == NULL && !PySequence_Check(v))
4414 {
Victor Stinner438a12d2019-05-24 17:01:38 +02004415 _PyErr_Format(tstate, PyExc_TypeError,
4416 "cannot unpack non-iterable %.200s object",
4417 v->ob_type->tp_name);
Serhiy Storchaka13a6c092017-12-26 12:30:41 +02004418 }
4419 return 0;
4420 }
Tim Petersd6d010b2001-06-21 02:49:55 +00004421
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004422 for (; i < argcnt; i++) {
4423 w = PyIter_Next(it);
4424 if (w == NULL) {
4425 /* Iterator done, via error or exhaustion. */
Victor Stinner438a12d2019-05-24 17:01:38 +02004426 if (!_PyErr_Occurred(tstate)) {
R David Murray4171bbe2015-04-15 17:08:45 -04004427 if (argcntafter == -1) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004428 _PyErr_Format(tstate, PyExc_ValueError,
4429 "not enough values to unpack "
4430 "(expected %d, got %d)",
4431 argcnt, i);
R David Murray4171bbe2015-04-15 17:08:45 -04004432 }
4433 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02004434 _PyErr_Format(tstate, PyExc_ValueError,
4435 "not enough values to unpack "
4436 "(expected at least %d, got %d)",
4437 argcnt + argcntafter, i);
R David Murray4171bbe2015-04-15 17:08:45 -04004438 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004439 }
4440 goto Error;
4441 }
4442 *--sp = w;
4443 }
Tim Petersd6d010b2001-06-21 02:49:55 +00004444
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004445 if (argcntafter == -1) {
4446 /* We better have exhausted the iterator now. */
4447 w = PyIter_Next(it);
4448 if (w == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004449 if (_PyErr_Occurred(tstate))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004450 goto Error;
4451 Py_DECREF(it);
4452 return 1;
4453 }
4454 Py_DECREF(w);
Victor Stinner438a12d2019-05-24 17:01:38 +02004455 _PyErr_Format(tstate, PyExc_ValueError,
4456 "too many values to unpack (expected %d)",
4457 argcnt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004458 goto Error;
4459 }
Guido van Rossum0368b722007-05-11 16:50:42 +00004460
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004461 l = PySequence_List(it);
4462 if (l == NULL)
4463 goto Error;
4464 *--sp = l;
4465 i++;
Guido van Rossum0368b722007-05-11 16:50:42 +00004466
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004467 ll = PyList_GET_SIZE(l);
4468 if (ll < argcntafter) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004469 _PyErr_Format(tstate, PyExc_ValueError,
R David Murray4171bbe2015-04-15 17:08:45 -04004470 "not enough values to unpack (expected at least %d, got %zd)",
4471 argcnt + argcntafter, argcnt + ll);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004472 goto Error;
4473 }
Guido van Rossum0368b722007-05-11 16:50:42 +00004474
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004475 /* Pop the "after-variable" args off the list. */
4476 for (j = argcntafter; j > 0; j--, i++) {
4477 *--sp = PyList_GET_ITEM(l, ll - j);
4478 }
4479 /* Resize the list. */
4480 Py_SIZE(l) = ll - argcntafter;
4481 Py_DECREF(it);
4482 return 1;
Guido van Rossum0368b722007-05-11 16:50:42 +00004483
Tim Petersd6d010b2001-06-21 02:49:55 +00004484Error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004485 for (; i > 0; i--, sp++)
4486 Py_DECREF(*sp);
4487 Py_XDECREF(it);
4488 return 0;
Barry Warsawe42b18f1997-08-25 22:13:04 +00004489}
4490
4491
Guido van Rossum96a42c81992-01-12 02:29:51 +00004492#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00004493static int
Victor Stinner438a12d2019-05-24 17:01:38 +02004494prtrace(PyThreadState *tstate, PyObject *v, const char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004495{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004496 printf("%s ", str);
Victor Stinner438a12d2019-05-24 17:01:38 +02004497 if (PyObject_Print(v, stdout, 0) != 0) {
4498 /* Don't know what else to do */
4499 _PyErr_Clear(tstate);
4500 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004501 printf("\n");
4502 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004503}
Guido van Rossum3f5da241990-12-20 15:06:42 +00004504#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004505
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00004506static void
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004507call_exc_trace(Py_tracefunc func, PyObject *self,
4508 PyThreadState *tstate, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00004509{
Victor Stinneraaa8ed82013-07-10 13:57:55 +02004510 PyObject *type, *value, *traceback, *orig_traceback, *arg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004511 int err;
Victor Stinner438a12d2019-05-24 17:01:38 +02004512 _PyErr_Fetch(tstate, &type, &value, &orig_traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004513 if (value == NULL) {
4514 value = Py_None;
4515 Py_INCREF(value);
4516 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004517 _PyErr_NormalizeException(tstate, &type, &value, &orig_traceback);
Antoine Pitrou89335212013-11-23 14:05:23 +01004518 traceback = (orig_traceback != NULL) ? orig_traceback : Py_None;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004519 arg = PyTuple_Pack(3, type, value, traceback);
4520 if (arg == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004521 _PyErr_Restore(tstate, type, value, orig_traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004522 return;
4523 }
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004524 err = call_trace(func, self, tstate, f, PyTrace_EXCEPTION, arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004525 Py_DECREF(arg);
Victor Stinner438a12d2019-05-24 17:01:38 +02004526 if (err == 0) {
4527 _PyErr_Restore(tstate, type, value, orig_traceback);
4528 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004529 else {
4530 Py_XDECREF(type);
4531 Py_XDECREF(value);
Victor Stinneraaa8ed82013-07-10 13:57:55 +02004532 Py_XDECREF(orig_traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004533 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00004534}
4535
Amaury Forgeot d'Arcf05149a2007-11-13 01:05:30 +00004536static int
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004537call_trace_protected(Py_tracefunc func, PyObject *obj,
4538 PyThreadState *tstate, PyFrameObject *frame,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004539 int what, PyObject *arg)
Fred Drake4ec5d562001-10-04 19:26:43 +00004540{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004541 PyObject *type, *value, *traceback;
4542 int err;
Victor Stinner438a12d2019-05-24 17:01:38 +02004543 _PyErr_Fetch(tstate, &type, &value, &traceback);
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004544 err = call_trace(func, obj, tstate, frame, what, arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004545 if (err == 0)
4546 {
Victor Stinner438a12d2019-05-24 17:01:38 +02004547 _PyErr_Restore(tstate, type, value, traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004548 return 0;
4549 }
4550 else {
4551 Py_XDECREF(type);
4552 Py_XDECREF(value);
4553 Py_XDECREF(traceback);
4554 return -1;
4555 }
Fred Drake4ec5d562001-10-04 19:26:43 +00004556}
4557
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00004558static int
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004559call_trace(Py_tracefunc func, PyObject *obj,
4560 PyThreadState *tstate, PyFrameObject *frame,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004561 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00004562{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004563 int result;
4564 if (tstate->tracing)
4565 return 0;
4566 tstate->tracing++;
4567 tstate->use_tracing = 0;
4568 result = func(obj, frame, what, arg);
4569 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
4570 || (tstate->c_profilefunc != NULL));
4571 tstate->tracing--;
4572 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00004573}
4574
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00004575PyObject *
4576_PyEval_CallTracing(PyObject *func, PyObject *args)
4577{
Victor Stinner50b48572018-11-01 01:51:40 +01004578 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004579 int save_tracing = tstate->tracing;
4580 int save_use_tracing = tstate->use_tracing;
4581 PyObject *result;
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00004582
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004583 tstate->tracing = 0;
4584 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
4585 || (tstate->c_profilefunc != NULL));
4586 result = PyObject_Call(func, args, NULL);
4587 tstate->tracing = save_tracing;
4588 tstate->use_tracing = save_use_tracing;
4589 return result;
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00004590}
4591
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00004592/* See Objects/lnotab_notes.txt for a description of how tracing works. */
Michael W. Hudson006c7522002-11-08 13:08:46 +00004593static int
Tim Peters8a5c3c72004-04-05 19:36:21 +00004594maybe_call_line_trace(Py_tracefunc func, PyObject *obj,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004595 PyThreadState *tstate, PyFrameObject *frame,
4596 int *instr_lb, int *instr_ub, int *instr_prev)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004597{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004598 int result = 0;
4599 int line = frame->f_lineno;
Michael W. Hudson006c7522002-11-08 13:08:46 +00004600
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004601 /* If the last instruction executed isn't in the current
4602 instruction window, reset the window.
4603 */
4604 if (frame->f_lasti < *instr_lb || frame->f_lasti >= *instr_ub) {
4605 PyAddrPair bounds;
4606 line = _PyCode_CheckLineNumber(frame->f_code, frame->f_lasti,
4607 &bounds);
4608 *instr_lb = bounds.ap_lower;
4609 *instr_ub = bounds.ap_upper;
4610 }
Nick Coghlan5a851672017-09-08 10:14:16 +10004611 /* If the last instruction falls at the start of a line or if it
4612 represents a jump backwards, update the frame's line number and
4613 then call the trace function if we're tracing source lines.
4614 */
4615 if ((frame->f_lasti == *instr_lb || frame->f_lasti < *instr_prev)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004616 frame->f_lineno = line;
Nick Coghlan5a851672017-09-08 10:14:16 +10004617 if (frame->f_trace_lines) {
4618 result = call_trace(func, obj, tstate, frame, PyTrace_LINE, Py_None);
4619 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004620 }
George King20faa682017-10-18 17:44:22 -07004621 /* Always emit an opcode event if we're tracing all opcodes. */
4622 if (frame->f_trace_opcodes) {
4623 result = call_trace(func, obj, tstate, frame, PyTrace_OPCODE, Py_None);
4624 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004625 *instr_prev = frame->f_lasti;
4626 return result;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004627}
4628
Fred Drake5755ce62001-06-27 19:19:46 +00004629void
4630PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00004631{
Steve Dowerb82e17e2019-05-23 08:45:22 -07004632 if (PySys_Audit("sys.setprofile", NULL) < 0) {
4633 return;
4634 }
4635
Victor Stinner50b48572018-11-01 01:51:40 +01004636 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004637 PyObject *temp = tstate->c_profileobj;
4638 Py_XINCREF(arg);
4639 tstate->c_profilefunc = NULL;
4640 tstate->c_profileobj = NULL;
4641 /* Must make sure that tracing is not ignored if 'temp' is freed */
4642 tstate->use_tracing = tstate->c_tracefunc != NULL;
4643 Py_XDECREF(temp);
4644 tstate->c_profilefunc = func;
4645 tstate->c_profileobj = arg;
4646 /* Flag that tracing or profiling is turned on */
4647 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
Fred Drake5755ce62001-06-27 19:19:46 +00004648}
4649
4650void
4651PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
4652{
Steve Dowerb82e17e2019-05-23 08:45:22 -07004653 if (PySys_Audit("sys.settrace", NULL) < 0) {
4654 return;
4655 }
4656
Victor Stinner09532fe2019-05-10 23:39:09 +02004657 _PyRuntimeState *runtime = &_PyRuntime;
4658 PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004659 PyObject *temp = tstate->c_traceobj;
Victor Stinner09532fe2019-05-10 23:39:09 +02004660 runtime->ceval.tracing_possible += (func != NULL) - (tstate->c_tracefunc != NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004661 Py_XINCREF(arg);
4662 tstate->c_tracefunc = NULL;
4663 tstate->c_traceobj = NULL;
4664 /* Must make sure that profiling is not ignored if 'temp' is freed */
4665 tstate->use_tracing = tstate->c_profilefunc != NULL;
4666 Py_XDECREF(temp);
4667 tstate->c_tracefunc = func;
4668 tstate->c_traceobj = arg;
4669 /* Flag that tracing or profiling is turned on */
4670 tstate->use_tracing = ((func != NULL)
4671 || (tstate->c_profilefunc != NULL));
Fred Draked0838392001-06-16 21:02:31 +00004672}
4673
Yury Selivanov75445082015-05-11 22:57:16 -04004674void
Victor Stinner838f2642019-06-13 22:41:23 +02004675_PyEval_SetCoroutineOriginTrackingDepth(PyThreadState *tstate, int new_depth)
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08004676{
4677 assert(new_depth >= 0);
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08004678 tstate->coroutine_origin_tracking_depth = new_depth;
4679}
4680
4681int
4682_PyEval_GetCoroutineOriginTrackingDepth(void)
4683{
Victor Stinner50b48572018-11-01 01:51:40 +01004684 PyThreadState *tstate = _PyThreadState_GET();
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08004685 return tstate->coroutine_origin_tracking_depth;
4686}
4687
4688void
Yury Selivanoveb636452016-09-08 22:01:51 -07004689_PyEval_SetAsyncGenFirstiter(PyObject *firstiter)
4690{
Victor Stinner50b48572018-11-01 01:51:40 +01004691 PyThreadState *tstate = _PyThreadState_GET();
Steve Dowerb82e17e2019-05-23 08:45:22 -07004692
4693 if (PySys_Audit("sys.set_asyncgen_hook_firstiter", NULL) < 0) {
4694 return;
4695 }
4696
Yury Selivanoveb636452016-09-08 22:01:51 -07004697 Py_XINCREF(firstiter);
4698 Py_XSETREF(tstate->async_gen_firstiter, firstiter);
4699}
4700
4701PyObject *
4702_PyEval_GetAsyncGenFirstiter(void)
4703{
Victor Stinner50b48572018-11-01 01:51:40 +01004704 PyThreadState *tstate = _PyThreadState_GET();
Yury Selivanoveb636452016-09-08 22:01:51 -07004705 return tstate->async_gen_firstiter;
4706}
4707
4708void
4709_PyEval_SetAsyncGenFinalizer(PyObject *finalizer)
4710{
Victor Stinner50b48572018-11-01 01:51:40 +01004711 PyThreadState *tstate = _PyThreadState_GET();
Steve Dowerb82e17e2019-05-23 08:45:22 -07004712
4713 if (PySys_Audit("sys.set_asyncgen_hook_finalizer", NULL) < 0) {
4714 return;
4715 }
4716
Yury Selivanoveb636452016-09-08 22:01:51 -07004717 Py_XINCREF(finalizer);
4718 Py_XSETREF(tstate->async_gen_finalizer, finalizer);
4719}
4720
4721PyObject *
4722_PyEval_GetAsyncGenFinalizer(void)
4723{
Victor Stinner50b48572018-11-01 01:51:40 +01004724 PyThreadState *tstate = _PyThreadState_GET();
Yury Selivanoveb636452016-09-08 22:01:51 -07004725 return tstate->async_gen_finalizer;
4726}
4727
Victor Stinner438a12d2019-05-24 17:01:38 +02004728static PyFrameObject *
4729_PyEval_GetFrame(PyThreadState *tstate)
4730{
Victor Stinner01b1cc12019-11-20 02:27:56 +01004731 _PyRuntimeState *runtime = tstate->interp->runtime;
4732 return runtime->gilstate.getframe(tstate);
Victor Stinner438a12d2019-05-24 17:01:38 +02004733}
4734
4735PyFrameObject *
4736PyEval_GetFrame(void)
4737{
4738 PyThreadState *tstate = _PyThreadState_GET();
4739 return _PyEval_GetFrame(tstate);
4740}
4741
Guido van Rossumb209a111997-04-29 18:18:01 +00004742PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004743PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00004744{
Victor Stinner438a12d2019-05-24 17:01:38 +02004745 PyThreadState *tstate = _PyThreadState_GET();
4746 PyFrameObject *current_frame = _PyEval_GetFrame(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004747 if (current_frame == NULL)
Victor Stinner438a12d2019-05-24 17:01:38 +02004748 return tstate->interp->builtins;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004749 else
4750 return current_frame->f_builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00004751}
4752
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02004753/* Convenience function to get a builtin from its name */
4754PyObject *
4755_PyEval_GetBuiltinId(_Py_Identifier *name)
4756{
Victor Stinner438a12d2019-05-24 17:01:38 +02004757 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02004758 PyObject *attr = _PyDict_GetItemIdWithError(PyEval_GetBuiltins(), name);
4759 if (attr) {
4760 Py_INCREF(attr);
4761 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004762 else if (!_PyErr_Occurred(tstate)) {
4763 _PyErr_SetObject(tstate, PyExc_AttributeError, _PyUnicode_FromId(name));
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02004764 }
4765 return attr;
4766}
4767
Guido van Rossumb209a111997-04-29 18:18:01 +00004768PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004769PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00004770{
Victor Stinner438a12d2019-05-24 17:01:38 +02004771 PyThreadState *tstate = _PyThreadState_GET();
4772 PyFrameObject *current_frame = _PyEval_GetFrame(tstate);
Victor Stinner41bb43a2013-10-29 01:19:37 +01004773 if (current_frame == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004774 _PyErr_SetString(tstate, PyExc_SystemError, "frame does not exist");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004775 return NULL;
Victor Stinner41bb43a2013-10-29 01:19:37 +01004776 }
4777
Victor Stinner438a12d2019-05-24 17:01:38 +02004778 if (PyFrame_FastToLocalsWithError(current_frame) < 0) {
Victor Stinner41bb43a2013-10-29 01:19:37 +01004779 return NULL;
Victor Stinner438a12d2019-05-24 17:01:38 +02004780 }
Victor Stinner41bb43a2013-10-29 01:19:37 +01004781
4782 assert(current_frame->f_locals != NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004783 return current_frame->f_locals;
Guido van Rossum5b722181993-03-30 17:46:03 +00004784}
4785
Guido van Rossumb209a111997-04-29 18:18:01 +00004786PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004787PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00004788{
Victor Stinner438a12d2019-05-24 17:01:38 +02004789 PyThreadState *tstate = _PyThreadState_GET();
4790 PyFrameObject *current_frame = _PyEval_GetFrame(tstate);
4791 if (current_frame == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004792 return NULL;
Victor Stinner438a12d2019-05-24 17:01:38 +02004793 }
Victor Stinner41bb43a2013-10-29 01:19:37 +01004794
4795 assert(current_frame->f_globals != NULL);
4796 return current_frame->f_globals;
Guido van Rossum3f5da241990-12-20 15:06:42 +00004797}
4798
Guido van Rossum6135a871995-01-09 17:53:26 +00004799int
Tim Peters5ba58662001-07-16 02:29:45 +00004800PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
Jeremy Hylton061d1062001-03-22 02:32:48 +00004801{
Victor Stinner438a12d2019-05-24 17:01:38 +02004802 PyThreadState *tstate = _PyThreadState_GET();
4803 PyFrameObject *current_frame = _PyEval_GetFrame(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004804 int result = cf->cf_flags != 0;
Tim Peters5ba58662001-07-16 02:29:45 +00004805
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004806 if (current_frame != NULL) {
4807 const int codeflags = current_frame->f_code->co_flags;
4808 const int compilerflags = codeflags & PyCF_MASK;
4809 if (compilerflags) {
4810 result = 1;
4811 cf->cf_flags |= compilerflags;
4812 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00004813#if 0 /* future keyword */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004814 if (codeflags & CO_GENERATOR_ALLOWED) {
4815 result = 1;
4816 cf->cf_flags |= CO_GENERATOR_ALLOWED;
4817 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00004818#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004819 }
4820 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00004821}
4822
Guido van Rossum3f5da241990-12-20 15:06:42 +00004823
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00004824const char *
Tim Peters6d6c1a32001-08-02 04:15:00 +00004825PyEval_GetFuncName(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00004826{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004827 if (PyMethod_Check(func))
4828 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
4829 else if (PyFunction_Check(func))
Serhiy Storchaka06515832016-11-20 09:13:07 +02004830 return PyUnicode_AsUTF8(((PyFunctionObject*)func)->func_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004831 else if (PyCFunction_Check(func))
4832 return ((PyCFunctionObject*)func)->m_ml->ml_name;
4833 else
4834 return func->ob_type->tp_name;
Jeremy Hylton512a2372001-04-11 13:52:29 +00004835}
4836
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00004837const char *
Tim Peters6d6c1a32001-08-02 04:15:00 +00004838PyEval_GetFuncDesc(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00004839{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004840 if (PyMethod_Check(func))
4841 return "()";
4842 else if (PyFunction_Check(func))
4843 return "()";
4844 else if (PyCFunction_Check(func))
4845 return "()";
4846 else
4847 return " object";
Jeremy Hylton512a2372001-04-11 13:52:29 +00004848}
4849
Armin Rigo1c2d7e52005-09-20 18:34:01 +00004850#define C_TRACE(x, call) \
Nicholas Bastind858a772004-06-25 23:31:06 +00004851if (tstate->use_tracing && tstate->c_profilefunc) { \
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004852 if (call_trace(tstate->c_profilefunc, tstate->c_profileobj, \
4853 tstate, tstate->frame, \
4854 PyTrace_C_CALL, func)) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004855 x = NULL; \
4856 } \
4857 else { \
4858 x = call; \
4859 if (tstate->c_profilefunc != NULL) { \
4860 if (x == NULL) { \
4861 call_trace_protected(tstate->c_profilefunc, \
4862 tstate->c_profileobj, \
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004863 tstate, tstate->frame, \
4864 PyTrace_C_EXCEPTION, func); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004865 /* XXX should pass (type, value, tb) */ \
4866 } else { \
4867 if (call_trace(tstate->c_profilefunc, \
4868 tstate->c_profileobj, \
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004869 tstate, tstate->frame, \
4870 PyTrace_C_RETURN, func)) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004871 Py_DECREF(x); \
4872 x = NULL; \
4873 } \
4874 } \
4875 } \
4876 } \
Nicholas Bastind858a772004-06-25 23:31:06 +00004877} else { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004878 x = call; \
4879 }
Nicholas Bastinc69ebe82004-03-24 21:57:10 +00004880
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02004881
4882static PyObject *
4883trace_call_function(PyThreadState *tstate,
4884 PyObject *func,
4885 PyObject **args, Py_ssize_t nargs,
4886 PyObject *kwnames)
4887{
4888 PyObject *x;
4889 if (PyCFunction_Check(func)) {
Jeroen Demeyer0d722f32019-07-05 14:48:24 +02004890 C_TRACE(x, _PyObject_Vectorcall(func, args, nargs, kwnames));
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02004891 return x;
4892 }
4893 else if (Py_TYPE(func) == &PyMethodDescr_Type && nargs > 0) {
4894 /* We need to create a temporary bound method as argument
4895 for profiling.
4896
4897 If nargs == 0, then this cannot work because we have no
4898 "self". In any case, the call itself would raise
4899 TypeError (foo needs an argument), so we just skip
4900 profiling. */
4901 PyObject *self = args[0];
4902 func = Py_TYPE(func)->tp_descr_get(func, self, (PyObject*)Py_TYPE(self));
4903 if (func == NULL) {
4904 return NULL;
4905 }
Jeroen Demeyer0d722f32019-07-05 14:48:24 +02004906 C_TRACE(x, _PyObject_Vectorcall(func,
4907 args+1, nargs-1,
4908 kwnames));
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02004909 Py_DECREF(func);
4910 return x;
4911 }
4912 return _PyObject_Vectorcall(func, args, nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames);
4913}
4914
Victor Stinner415c5102017-01-11 00:54:57 +01004915/* Issue #29227: Inline call_function() into _PyEval_EvalFrameDefault()
4916 to reduce the stack consumption. */
4917Py_LOCAL_INLINE(PyObject *) _Py_HOT_FUNCTION
Victor Stinner09532fe2019-05-10 23:39:09 +02004918call_function(PyThreadState *tstate, PyObject ***pp_stack, Py_ssize_t oparg, PyObject *kwnames)
Jeremy Hyltone8c04322002-08-16 17:47:26 +00004919{
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004920 PyObject **pfunc = (*pp_stack) - oparg - 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004921 PyObject *func = *pfunc;
4922 PyObject *x, *w;
Victor Stinnerd8735722016-09-09 12:36:44 -07004923 Py_ssize_t nkwargs = (kwnames == NULL) ? 0 : PyTuple_GET_SIZE(kwnames);
4924 Py_ssize_t nargs = oparg - nkwargs;
INADA Naoki5566bbb2017-02-03 07:43:03 +09004925 PyObject **stack = (*pp_stack) - nargs - nkwargs;
Jeremy Hyltone8c04322002-08-16 17:47:26 +00004926
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02004927 if (tstate->use_tracing) {
4928 x = trace_call_function(tstate, func, stack, nargs, kwnames);
INADA Naoki5566bbb2017-02-03 07:43:03 +09004929 }
Victor Stinner4a7cc882015-03-06 23:35:27 +01004930 else {
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02004931 x = _PyObject_Vectorcall(func, stack, nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004932 }
Tim Peters8a5c3c72004-04-05 19:36:21 +00004933
Victor Stinner438a12d2019-05-24 17:01:38 +02004934 assert((x != NULL) ^ (_PyErr_Occurred(tstate) != NULL));
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004935
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01004936 /* Clear the stack of the function object. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004937 while ((*pp_stack) > pfunc) {
4938 w = EXT_POP(*pp_stack);
4939 Py_DECREF(w);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004940 }
Victor Stinnerace47d72013-07-18 01:41:08 +02004941
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004942 return x;
Jeremy Hyltone8c04322002-08-16 17:47:26 +00004943}
4944
Jeremy Hylton52820442001-01-03 23:52:36 +00004945static PyObject *
Victor Stinner09532fe2019-05-10 23:39:09 +02004946do_call_core(PyThreadState *tstate, PyObject *func, PyObject *callargs, PyObject *kwdict)
Jeremy Hylton52820442001-01-03 23:52:36 +00004947{
jdemeyere89de732018-09-19 12:06:20 +02004948 PyObject *result;
4949
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004950 if (PyCFunction_Check(func)) {
Jeroen Demeyer7a6873c2019-09-11 13:01:01 +02004951 C_TRACE(result, PyObject_Call(func, callargs, kwdict));
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004952 return result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004953 }
jdemeyere89de732018-09-19 12:06:20 +02004954 else if (Py_TYPE(func) == &PyMethodDescr_Type) {
jdemeyere89de732018-09-19 12:06:20 +02004955 Py_ssize_t nargs = PyTuple_GET_SIZE(callargs);
4956 if (nargs > 0 && tstate->use_tracing) {
4957 /* We need to create a temporary bound method as argument
4958 for profiling.
4959
4960 If nargs == 0, then this cannot work because we have no
4961 "self". In any case, the call itself would raise
4962 TypeError (foo needs an argument), so we just skip
4963 profiling. */
4964 PyObject *self = PyTuple_GET_ITEM(callargs, 0);
4965 func = Py_TYPE(func)->tp_descr_get(func, self, (PyObject*)Py_TYPE(self));
4966 if (func == NULL) {
4967 return NULL;
4968 }
4969
Victor Stinner4d231bc2019-11-14 13:36:21 +01004970 C_TRACE(result, _PyObject_FastCallDictTstate(
4971 tstate, func,
4972 &_PyTuple_ITEMS(callargs)[1],
4973 nargs - 1,
4974 kwdict));
jdemeyere89de732018-09-19 12:06:20 +02004975 Py_DECREF(func);
4976 return result;
4977 }
Victor Stinner74319ae2016-08-25 00:04:09 +02004978 }
jdemeyere89de732018-09-19 12:06:20 +02004979 return PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00004980}
4981
Serhiy Storchaka483405b2015-02-17 10:14:30 +02004982/* Extract a slice index from a PyLong or an object with the
Guido van Rossum38fff8c2006-03-07 18:50:55 +00004983 nb_index slot defined, and store in *pi.
4984 Silently reduce values larger than PY_SSIZE_T_MAX to PY_SSIZE_T_MAX,
Xiang Zhang2ddf5a12017-05-10 18:19:41 +08004985 and silently boost values less than PY_SSIZE_T_MIN to PY_SSIZE_T_MIN.
Martin v. Löwisdde99d22006-02-17 15:57:41 +00004986 Return 0 on error, 1 on success.
Tim Peterscb479e72001-12-16 19:11:44 +00004987*/
Guido van Rossum20c6add2000-05-08 14:06:50 +00004988int
Martin v. Löwis18e16552006-02-15 17:27:45 +00004989_PyEval_SliceIndex(PyObject *v, Py_ssize_t *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004990{
Victor Stinner438a12d2019-05-24 17:01:38 +02004991 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03004992 if (v != Py_None) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004993 Py_ssize_t x;
4994 if (PyIndex_Check(v)) {
4995 x = PyNumber_AsSsize_t(v, NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02004996 if (x == -1 && _PyErr_Occurred(tstate))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004997 return 0;
4998 }
4999 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02005000 _PyErr_SetString(tstate, PyExc_TypeError,
5001 "slice indices must be integers or "
5002 "None or have an __index__ method");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005003 return 0;
5004 }
5005 *pi = x;
5006 }
5007 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005008}
5009
Serhiy Storchaka80ec8362017-03-19 19:37:40 +02005010int
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005011_PyEval_SliceIndexNotNone(PyObject *v, Py_ssize_t *pi)
Serhiy Storchaka80ec8362017-03-19 19:37:40 +02005012{
Victor Stinner438a12d2019-05-24 17:01:38 +02005013 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005014 Py_ssize_t x;
5015 if (PyIndex_Check(v)) {
5016 x = PyNumber_AsSsize_t(v, NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02005017 if (x == -1 && _PyErr_Occurred(tstate))
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005018 return 0;
5019 }
5020 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02005021 _PyErr_SetString(tstate, PyExc_TypeError,
5022 "slice indices must be integers or "
5023 "have an __index__ method");
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005024 return 0;
5025 }
5026 *pi = x;
5027 return 1;
Serhiy Storchaka80ec8362017-03-19 19:37:40 +02005028}
5029
Thomas Wouters52152252000-08-17 22:55:00 +00005030static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02005031import_name(PyThreadState *tstate, PyFrameObject *f,
5032 PyObject *name, PyObject *fromlist, PyObject *level)
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005033{
5034 _Py_IDENTIFIER(__import__);
Victor Stinnerdf142fd2016-08-20 00:44:42 +02005035 PyObject *import_func, *res;
5036 PyObject* stack[5];
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005037
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02005038 import_func = _PyDict_GetItemIdWithError(f->f_builtins, &PyId___import__);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005039 if (import_func == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005040 if (!_PyErr_Occurred(tstate)) {
5041 _PyErr_SetString(tstate, PyExc_ImportError, "__import__ not found");
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02005042 }
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005043 return NULL;
5044 }
5045
5046 /* Fast path for not overloaded __import__. */
Victor Stinner438a12d2019-05-24 17:01:38 +02005047 if (import_func == tstate->interp->import_func) {
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005048 int ilevel = _PyLong_AsInt(level);
Victor Stinner438a12d2019-05-24 17:01:38 +02005049 if (ilevel == -1 && _PyErr_Occurred(tstate)) {
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005050 return NULL;
5051 }
5052 res = PyImport_ImportModuleLevelObject(
5053 name,
5054 f->f_globals,
5055 f->f_locals == NULL ? Py_None : f->f_locals,
5056 fromlist,
5057 ilevel);
5058 return res;
5059 }
5060
5061 Py_INCREF(import_func);
Victor Stinnerdf142fd2016-08-20 00:44:42 +02005062
5063 stack[0] = name;
5064 stack[1] = f->f_globals;
5065 stack[2] = f->f_locals == NULL ? Py_None : f->f_locals;
5066 stack[3] = fromlist;
5067 stack[4] = level;
Victor Stinner559bb6a2016-08-22 22:48:54 +02005068 res = _PyObject_FastCall(import_func, stack, 5);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005069 Py_DECREF(import_func);
5070 return res;
5071}
5072
5073static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02005074import_from(PyThreadState *tstate, PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00005075{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005076 PyObject *x;
Antoine Pitrou0373a102014-10-13 20:19:45 +02005077 _Py_IDENTIFIER(__name__);
Xiang Zhang4830f582017-03-21 11:13:42 +08005078 PyObject *fullmodname, *pkgname, *pkgpath, *pkgname_or_unknown, *errmsg;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00005079
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005080 if (_PyObject_LookupAttr(v, name, &x) != 0) {
Antoine Pitrou0373a102014-10-13 20:19:45 +02005081 return x;
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005082 }
Antoine Pitrou0373a102014-10-13 20:19:45 +02005083 /* Issue #17636: in case this failed because of a circular relative
5084 import, try to fallback on reading the module directly from
5085 sys.modules. */
Antoine Pitrou0373a102014-10-13 20:19:45 +02005086 pkgname = _PyObject_GetAttrId(v, &PyId___name__);
Brett Cannon3008bc02015-08-11 18:01:31 -07005087 if (pkgname == NULL) {
5088 goto error;
5089 }
Oren Milman6db70332017-09-19 14:23:01 +03005090 if (!PyUnicode_Check(pkgname)) {
5091 Py_CLEAR(pkgname);
5092 goto error;
5093 }
Antoine Pitrou0373a102014-10-13 20:19:45 +02005094 fullmodname = PyUnicode_FromFormat("%U.%U", pkgname, name);
Brett Cannon3008bc02015-08-11 18:01:31 -07005095 if (fullmodname == NULL) {
Xiang Zhang4830f582017-03-21 11:13:42 +08005096 Py_DECREF(pkgname);
Antoine Pitrou0373a102014-10-13 20:19:45 +02005097 return NULL;
Brett Cannon3008bc02015-08-11 18:01:31 -07005098 }
Eric Snow3f9eee62017-09-15 16:35:20 -06005099 x = PyImport_GetModule(fullmodname);
Antoine Pitrou0373a102014-10-13 20:19:45 +02005100 Py_DECREF(fullmodname);
Victor Stinner438a12d2019-05-24 17:01:38 +02005101 if (x == NULL && !_PyErr_Occurred(tstate)) {
Brett Cannon3008bc02015-08-11 18:01:31 -07005102 goto error;
5103 }
Matthias Bussonnier1bc15642017-02-22 07:06:50 -08005104 Py_DECREF(pkgname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005105 return x;
Brett Cannon3008bc02015-08-11 18:01:31 -07005106 error:
Matthias Bussonnierbc4bed42017-02-14 16:05:25 -08005107 pkgpath = PyModule_GetFilenameObject(v);
Matthias Bussonnier1bc15642017-02-22 07:06:50 -08005108 if (pkgname == NULL) {
5109 pkgname_or_unknown = PyUnicode_FromString("<unknown module name>");
5110 if (pkgname_or_unknown == NULL) {
5111 Py_XDECREF(pkgpath);
5112 return NULL;
5113 }
5114 } else {
5115 pkgname_or_unknown = pkgname;
5116 }
Matthias Bussonnierbc4bed42017-02-14 16:05:25 -08005117
5118 if (pkgpath == NULL || !PyUnicode_Check(pkgpath)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005119 _PyErr_Clear(tstate);
Xiang Zhang4830f582017-03-21 11:13:42 +08005120 errmsg = PyUnicode_FromFormat(
5121 "cannot import name %R from %R (unknown location)",
5122 name, pkgname_or_unknown
5123 );
Stefan Krah027b09c2019-03-25 21:50:58 +01005124 /* NULL checks for errmsg and pkgname done by PyErr_SetImportError. */
Xiang Zhang4830f582017-03-21 11:13:42 +08005125 PyErr_SetImportError(errmsg, pkgname, NULL);
5126 }
5127 else {
Anthony Sottile65366bc2019-09-09 08:17:50 -07005128 _Py_IDENTIFIER(__spec__);
5129 PyObject *spec = _PyObject_GetAttrId(v, &PyId___spec__);
Anthony Sottile65366bc2019-09-09 08:17:50 -07005130 const char *fmt =
5131 _PyModuleSpec_IsInitializing(spec) ?
5132 "cannot import name %R from partially initialized module %R "
5133 "(most likely due to a circular import) (%S)" :
5134 "cannot import name %R from %R (%S)";
5135 Py_XDECREF(spec);
5136
5137 errmsg = PyUnicode_FromFormat(fmt, name, pkgname_or_unknown, pkgpath);
Stefan Krah027b09c2019-03-25 21:50:58 +01005138 /* NULL checks for errmsg and pkgname done by PyErr_SetImportError. */
Xiang Zhang4830f582017-03-21 11:13:42 +08005139 PyErr_SetImportError(errmsg, pkgname, pkgpath);
Matthias Bussonnierbc4bed42017-02-14 16:05:25 -08005140 }
5141
Xiang Zhang4830f582017-03-21 11:13:42 +08005142 Py_XDECREF(errmsg);
Matthias Bussonnier1bc15642017-02-22 07:06:50 -08005143 Py_XDECREF(pkgname_or_unknown);
5144 Py_XDECREF(pkgpath);
Brett Cannon3008bc02015-08-11 18:01:31 -07005145 return NULL;
Thomas Wouters52152252000-08-17 22:55:00 +00005146}
Guido van Rossumac7be682001-01-17 15:42:30 +00005147
Thomas Wouters52152252000-08-17 22:55:00 +00005148static int
Victor Stinner438a12d2019-05-24 17:01:38 +02005149import_all_from(PyThreadState *tstate, PyObject *locals, PyObject *v)
Thomas Wouters52152252000-08-17 22:55:00 +00005150{
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02005151 _Py_IDENTIFIER(__all__);
5152 _Py_IDENTIFIER(__dict__);
Xiang Zhangd8b291a2018-03-24 18:39:36 +08005153 _Py_IDENTIFIER(__name__);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005154 PyObject *all, *dict, *name, *value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005155 int skip_leading_underscores = 0;
5156 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00005157
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005158 if (_PyObject_LookupAttrId(v, &PyId___all__, &all) < 0) {
5159 return -1; /* Unexpected error */
5160 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005161 if (all == NULL) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005162 if (_PyObject_LookupAttrId(v, &PyId___dict__, &dict) < 0) {
5163 return -1;
5164 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005165 if (dict == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005166 _PyErr_SetString(tstate, PyExc_ImportError,
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005167 "from-import-* object has no __dict__ and no __all__");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005168 return -1;
5169 }
5170 all = PyMapping_Keys(dict);
5171 Py_DECREF(dict);
5172 if (all == NULL)
5173 return -1;
5174 skip_leading_underscores = 1;
5175 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00005176
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005177 for (pos = 0, err = 0; ; pos++) {
5178 name = PySequence_GetItem(all, pos);
5179 if (name == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005180 if (!_PyErr_ExceptionMatches(tstate, PyExc_IndexError)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005181 err = -1;
Victor Stinner438a12d2019-05-24 17:01:38 +02005182 }
5183 else {
5184 _PyErr_Clear(tstate);
5185 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005186 break;
5187 }
Xiang Zhangd8b291a2018-03-24 18:39:36 +08005188 if (!PyUnicode_Check(name)) {
5189 PyObject *modname = _PyObject_GetAttrId(v, &PyId___name__);
5190 if (modname == NULL) {
5191 Py_DECREF(name);
5192 err = -1;
5193 break;
5194 }
5195 if (!PyUnicode_Check(modname)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005196 _PyErr_Format(tstate, PyExc_TypeError,
5197 "module __name__ must be a string, not %.100s",
5198 Py_TYPE(modname)->tp_name);
Xiang Zhangd8b291a2018-03-24 18:39:36 +08005199 }
5200 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02005201 _PyErr_Format(tstate, PyExc_TypeError,
5202 "%s in %U.%s must be str, not %.100s",
5203 skip_leading_underscores ? "Key" : "Item",
5204 modname,
5205 skip_leading_underscores ? "__dict__" : "__all__",
5206 Py_TYPE(name)->tp_name);
Xiang Zhangd8b291a2018-03-24 18:39:36 +08005207 }
5208 Py_DECREF(modname);
5209 Py_DECREF(name);
5210 err = -1;
5211 break;
5212 }
5213 if (skip_leading_underscores) {
Serhiy Storchakae3b2b4b2017-09-08 09:58:51 +03005214 if (PyUnicode_READY(name) == -1) {
5215 Py_DECREF(name);
5216 err = -1;
5217 break;
5218 }
5219 if (PyUnicode_READ_CHAR(name, 0) == '_') {
5220 Py_DECREF(name);
5221 continue;
5222 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005223 }
5224 value = PyObject_GetAttr(v, name);
5225 if (value == NULL)
5226 err = -1;
5227 else if (PyDict_CheckExact(locals))
5228 err = PyDict_SetItem(locals, name, value);
5229 else
5230 err = PyObject_SetItem(locals, name, value);
5231 Py_DECREF(name);
5232 Py_XDECREF(value);
5233 if (err != 0)
5234 break;
5235 }
5236 Py_DECREF(all);
5237 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00005238}
5239
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005240static int
Victor Stinner438a12d2019-05-24 17:01:38 +02005241check_args_iterable(PyThreadState *tstate, PyObject *func, PyObject *args)
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005242{
5243 if (args->ob_type->tp_iter == NULL && !PySequence_Check(args)) {
Jeroen Demeyerbf17d412019-11-05 16:48:04 +01005244 /* check_args_iterable() may be called with a live exception:
5245 * clear it to prevent calling _PyObject_FunctionStr() with an
5246 * exception set. */
5247 PyErr_Clear();
5248 PyObject *funcstr = _PyObject_FunctionStr(func);
5249 if (funcstr != NULL) {
5250 _PyErr_Format(tstate, PyExc_TypeError,
5251 "%U argument after * must be an iterable, not %.200s",
5252 funcstr, Py_TYPE(args)->tp_name);
5253 Py_DECREF(funcstr);
5254 }
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005255 return -1;
5256 }
5257 return 0;
5258}
5259
5260static void
Victor Stinner438a12d2019-05-24 17:01:38 +02005261format_kwargs_error(PyThreadState *tstate, PyObject *func, PyObject *kwargs)
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005262{
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005263 /* _PyDict_MergeEx raises attribute
5264 * error (percolated from an attempt
5265 * to get 'keys' attribute) instead of
5266 * a type error if its second argument
5267 * is not a mapping.
5268 */
Victor Stinner438a12d2019-05-24 17:01:38 +02005269 if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) {
Jeroen Demeyerbf17d412019-11-05 16:48:04 +01005270 PyErr_Clear();
5271 PyObject *funcstr = _PyObject_FunctionStr(func);
5272 if (funcstr != NULL) {
5273 _PyErr_Format(
5274 tstate, PyExc_TypeError,
5275 "%U argument after ** must be a mapping, not %.200s",
5276 funcstr, Py_TYPE(kwargs)->tp_name);
5277 Py_DECREF(funcstr);
5278 }
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005279 }
Victor Stinner438a12d2019-05-24 17:01:38 +02005280 else if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005281 PyObject *exc, *val, *tb;
Victor Stinner438a12d2019-05-24 17:01:38 +02005282 _PyErr_Fetch(tstate, &exc, &val, &tb);
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005283 if (val && PyTuple_Check(val) && PyTuple_GET_SIZE(val) == 1) {
Jeroen Demeyerbf17d412019-11-05 16:48:04 +01005284 PyErr_Clear();
5285 PyObject *funcstr = _PyObject_FunctionStr(func);
5286 if (funcstr != NULL) {
5287 PyObject *key = PyTuple_GET_ITEM(val, 0);
5288 _PyErr_Format(
5289 tstate, PyExc_TypeError,
5290 "%U got multiple values for keyword argument '%S'",
5291 funcstr, key);
5292 Py_DECREF(funcstr);
5293 }
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005294 Py_XDECREF(exc);
5295 Py_XDECREF(val);
5296 Py_XDECREF(tb);
5297 }
5298 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02005299 _PyErr_Restore(tstate, exc, val, tb);
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005300 }
5301 }
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005302}
5303
Guido van Rossumac7be682001-01-17 15:42:30 +00005304static void
Victor Stinner438a12d2019-05-24 17:01:38 +02005305format_exc_check_arg(PyThreadState *tstate, PyObject *exc,
5306 const char *format_str, PyObject *obj)
Paul Prescode68140d2000-08-30 20:25:01 +00005307{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005308 const char *obj_str;
Paul Prescode68140d2000-08-30 20:25:01 +00005309
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005310 if (!obj)
5311 return;
Paul Prescode68140d2000-08-30 20:25:01 +00005312
Serhiy Storchaka06515832016-11-20 09:13:07 +02005313 obj_str = PyUnicode_AsUTF8(obj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005314 if (!obj_str)
5315 return;
Paul Prescode68140d2000-08-30 20:25:01 +00005316
Victor Stinner438a12d2019-05-24 17:01:38 +02005317 _PyErr_Format(tstate, exc, format_str, obj_str);
Paul Prescode68140d2000-08-30 20:25:01 +00005318}
Guido van Rossum950361c1997-01-24 13:49:28 +00005319
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005320static void
Victor Stinner438a12d2019-05-24 17:01:38 +02005321format_exc_unbound(PyThreadState *tstate, PyCodeObject *co, int oparg)
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005322{
5323 PyObject *name;
5324 /* Don't stomp existing exception */
Victor Stinner438a12d2019-05-24 17:01:38 +02005325 if (_PyErr_Occurred(tstate))
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005326 return;
5327 if (oparg < PyTuple_GET_SIZE(co->co_cellvars)) {
5328 name = PyTuple_GET_ITEM(co->co_cellvars,
5329 oparg);
Victor Stinner438a12d2019-05-24 17:01:38 +02005330 format_exc_check_arg(tstate,
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005331 PyExc_UnboundLocalError,
5332 UNBOUNDLOCAL_ERROR_MSG,
5333 name);
5334 } else {
5335 name = PyTuple_GET_ITEM(co->co_freevars, oparg -
5336 PyTuple_GET_SIZE(co->co_cellvars));
Victor Stinner438a12d2019-05-24 17:01:38 +02005337 format_exc_check_arg(tstate, PyExc_NameError,
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005338 UNBOUNDFREE_ERROR_MSG, name);
5339 }
5340}
5341
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03005342static void
Mark Shannonfee55262019-11-21 09:11:43 +00005343format_awaitable_error(PyThreadState *tstate, PyTypeObject *type, int prevprevopcode, int prevopcode)
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03005344{
5345 if (type->tp_as_async == NULL || type->tp_as_async->am_await == NULL) {
5346 if (prevopcode == BEFORE_ASYNC_WITH) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005347 _PyErr_Format(tstate, PyExc_TypeError,
5348 "'async with' received an object from __aenter__ "
5349 "that does not implement __await__: %.100s",
5350 type->tp_name);
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03005351 }
Mark Shannonfee55262019-11-21 09:11:43 +00005352 else if (prevopcode == WITH_EXCEPT_START || (prevopcode == CALL_FUNCTION && prevprevopcode == DUP_TOP)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005353 _PyErr_Format(tstate, PyExc_TypeError,
5354 "'async with' received an object from __aexit__ "
5355 "that does not implement __await__: %.100s",
5356 type->tp_name);
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03005357 }
5358 }
5359}
5360
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005361static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02005362unicode_concatenate(PyThreadState *tstate, PyObject *v, PyObject *w,
Serhiy Storchakaab874002016-09-11 13:48:15 +03005363 PyFrameObject *f, const _Py_CODEUNIT *next_instr)
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005364{
5365 PyObject *res;
5366 if (Py_REFCNT(v) == 2) {
5367 /* In the common case, there are 2 references to the value
5368 * stored in 'variable' when the += is performed: one on the
5369 * value stack (in 'v') and one still stored in the
5370 * 'variable'. We try to delete the variable now to reduce
5371 * the refcnt to 1.
5372 */
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03005373 int opcode, oparg;
5374 NEXTOPARG();
5375 switch (opcode) {
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005376 case STORE_FAST:
5377 {
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005378 PyObject **fastlocals = f->f_localsplus;
5379 if (GETLOCAL(oparg) == v)
5380 SETLOCAL(oparg, NULL);
5381 break;
5382 }
5383 case STORE_DEREF:
5384 {
5385 PyObject **freevars = (f->f_localsplus +
5386 f->f_code->co_nlocals);
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03005387 PyObject *c = freevars[oparg];
Raymond Hettingerc32f9db2016-11-12 04:10:35 -05005388 if (PyCell_GET(c) == v) {
5389 PyCell_SET(c, NULL);
5390 Py_DECREF(v);
5391 }
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005392 break;
5393 }
5394 case STORE_NAME:
5395 {
5396 PyObject *names = f->f_code->co_names;
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03005397 PyObject *name = GETITEM(names, oparg);
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005398 PyObject *locals = f->f_locals;
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02005399 if (locals && PyDict_CheckExact(locals)) {
5400 PyObject *w = PyDict_GetItemWithError(locals, name);
5401 if ((w == v && PyDict_DelItem(locals, name) != 0) ||
Victor Stinner438a12d2019-05-24 17:01:38 +02005402 (w == NULL && _PyErr_Occurred(tstate)))
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02005403 {
5404 Py_DECREF(v);
5405 return NULL;
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005406 }
5407 }
5408 break;
5409 }
5410 }
5411 }
5412 res = v;
5413 PyUnicode_Append(&res, w);
5414 return res;
5415}
5416
Guido van Rossum950361c1997-01-24 13:49:28 +00005417#ifdef DYNAMIC_EXECUTION_PROFILE
5418
Skip Montanarof118cb12001-10-15 20:51:38 +00005419static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005420getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00005421{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005422 int i;
5423 PyObject *l = PyList_New(256);
5424 if (l == NULL) return NULL;
5425 for (i = 0; i < 256; i++) {
5426 PyObject *x = PyLong_FromLong(a[i]);
5427 if (x == NULL) {
5428 Py_DECREF(l);
5429 return NULL;
5430 }
Zackery Spytz99d56b52018-12-08 07:16:55 -07005431 PyList_SET_ITEM(l, i, x);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005432 }
5433 for (i = 0; i < 256; i++)
5434 a[i] = 0;
5435 return l;
Guido van Rossum950361c1997-01-24 13:49:28 +00005436}
5437
5438PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005439_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00005440{
5441#ifndef DXPAIRS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005442 return getarray(dxp);
Guido van Rossum950361c1997-01-24 13:49:28 +00005443#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005444 int i;
5445 PyObject *l = PyList_New(257);
5446 if (l == NULL) return NULL;
5447 for (i = 0; i < 257; i++) {
5448 PyObject *x = getarray(dxpairs[i]);
5449 if (x == NULL) {
5450 Py_DECREF(l);
5451 return NULL;
5452 }
Zackery Spytz99d56b52018-12-08 07:16:55 -07005453 PyList_SET_ITEM(l, i, x);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005454 }
5455 return l;
Guido van Rossum950361c1997-01-24 13:49:28 +00005456#endif
5457}
5458
5459#endif
Brett Cannon5c4de282016-09-07 11:16:41 -07005460
5461Py_ssize_t
5462_PyEval_RequestCodeExtraIndex(freefunc free)
5463{
Victor Stinnercaba55b2018-08-03 15:33:52 +02005464 PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE();
Brett Cannon5c4de282016-09-07 11:16:41 -07005465 Py_ssize_t new_index;
5466
Dino Viehlandf3cffd22017-06-21 14:44:36 -07005467 if (interp->co_extra_user_count == MAX_CO_EXTRA_USERS - 1) {
Brett Cannon5c4de282016-09-07 11:16:41 -07005468 return -1;
5469 }
Dino Viehlandf3cffd22017-06-21 14:44:36 -07005470 new_index = interp->co_extra_user_count++;
5471 interp->co_extra_freefuncs[new_index] = free;
Brett Cannon5c4de282016-09-07 11:16:41 -07005472 return new_index;
5473}
Łukasz Langaa785c872016-09-09 17:37:37 -07005474
5475static void
5476dtrace_function_entry(PyFrameObject *f)
5477{
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02005478 const char *filename;
5479 const char *funcname;
Łukasz Langaa785c872016-09-09 17:37:37 -07005480 int lineno;
5481
5482 filename = PyUnicode_AsUTF8(f->f_code->co_filename);
5483 funcname = PyUnicode_AsUTF8(f->f_code->co_name);
5484 lineno = PyCode_Addr2Line(f->f_code, f->f_lasti);
5485
5486 PyDTrace_FUNCTION_ENTRY(filename, funcname, lineno);
5487}
5488
5489static void
5490dtrace_function_return(PyFrameObject *f)
5491{
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02005492 const char *filename;
5493 const char *funcname;
Łukasz Langaa785c872016-09-09 17:37:37 -07005494 int lineno;
5495
5496 filename = PyUnicode_AsUTF8(f->f_code->co_filename);
5497 funcname = PyUnicode_AsUTF8(f->f_code->co_name);
5498 lineno = PyCode_Addr2Line(f->f_code, f->f_lasti);
5499
5500 PyDTrace_FUNCTION_RETURN(filename, funcname, lineno);
5501}
5502
5503/* DTrace equivalent of maybe_call_line_trace. */
5504static void
5505maybe_dtrace_line(PyFrameObject *frame,
5506 int *instr_lb, int *instr_ub, int *instr_prev)
5507{
5508 int line = frame->f_lineno;
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02005509 const char *co_filename, *co_name;
Łukasz Langaa785c872016-09-09 17:37:37 -07005510
5511 /* If the last instruction executed isn't in the current
5512 instruction window, reset the window.
5513 */
5514 if (frame->f_lasti < *instr_lb || frame->f_lasti >= *instr_ub) {
5515 PyAddrPair bounds;
5516 line = _PyCode_CheckLineNumber(frame->f_code, frame->f_lasti,
5517 &bounds);
5518 *instr_lb = bounds.ap_lower;
5519 *instr_ub = bounds.ap_upper;
5520 }
5521 /* If the last instruction falls at the start of a line or if
5522 it represents a jump backwards, update the frame's line
5523 number and call the trace function. */
5524 if (frame->f_lasti == *instr_lb || frame->f_lasti < *instr_prev) {
5525 frame->f_lineno = line;
5526 co_filename = PyUnicode_AsUTF8(frame->f_code->co_filename);
5527 if (!co_filename)
5528 co_filename = "?";
5529 co_name = PyUnicode_AsUTF8(frame->f_code->co_name);
5530 if (!co_name)
5531 co_name = "?";
5532 PyDTrace_LINE(co_filename, co_name, line);
5533 }
5534 *instr_prev = frame->f_lasti;
5535}
Victor Stinnerf4b1e3d2019-11-04 19:48:34 +01005536
5537
5538/* Implement Py_EnterRecursiveCall() and Py_LeaveRecursiveCall() as functions
5539 for the limited API. */
5540
5541#undef Py_EnterRecursiveCall
5542
5543int Py_EnterRecursiveCall(const char *where)
5544{
Victor Stinnerbe434dc2019-11-05 00:51:22 +01005545 return _Py_EnterRecursiveCall_inline(where);
Victor Stinnerf4b1e3d2019-11-04 19:48:34 +01005546}
5547
5548#undef Py_LeaveRecursiveCall
5549
5550void Py_LeaveRecursiveCall(void)
5551{
Victor Stinnerbe434dc2019-11-05 00:51:22 +01005552 _Py_LeaveRecursiveCall_inline();
Victor Stinnerf4b1e3d2019-11-04 19:48:34 +01005553}