blob: b0fd6eec63a3776afff5262be9cec4bfeceecb62 [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 Stinner09532fe2019-05-10 23:39:09 +020013#include "pycore_ceval.h"
Inada Naoki91234a12019-06-03 21:30:58 +090014#include "pycore_code.h"
Victor Stinnerbcda8f12018-11-21 22:27:47 +010015#include "pycore_object.h"
Victor Stinner438a12d2019-05-24 17:01:38 +020016#include "pycore_pyerrors.h"
17#include "pycore_pylifecycle.h"
Victor Stinner621cebe2018-11-12 16:53:38 +010018#include "pycore_pystate.h"
Victor Stinnerec13b932018-11-25 23:56:17 +010019#include "pycore_tupleobject.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000020
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000021#include "code.h"
Benjamin Peterson025e9eb2015-05-05 20:16:41 -040022#include "dictobject.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000023#include "frameobject.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000024#include "opcode.h"
Łukasz Langaa785c872016-09-09 17:37:37 -070025#include "pydtrace.h"
Benjamin Peterson025e9eb2015-05-05 20:16:41 -040026#include "setobject.h"
Tim Peters6d6c1a32001-08-02 04:15:00 +000027#include "structmember.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000028
Guido van Rossumc6004111993-11-05 10:22:19 +000029#include <ctype.h>
30
Guido van Rossum408027e1996-12-30 16:17:54 +000031#ifdef Py_DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000032/* For debugging the interpreter: */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000033#define LLTRACE 1 /* Low-level trace feature */
34#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000035#endif
36
Victor Stinner5c75f372019-04-17 23:02:26 +020037#if !defined(Py_BUILD_CORE)
38# error "ceval.c must be build with Py_BUILD_CORE define for best performance"
39#endif
40
Guido van Rossum5b722181993-03-30 17:46:03 +000041
Guido van Rossum374a9221991-04-04 10:40:29 +000042/* Forward declarations */
Victor Stinner09532fe2019-05-10 23:39:09 +020043Py_LOCAL_INLINE(PyObject *) call_function(
44 PyThreadState *tstate, PyObject ***pp_stack,
45 Py_ssize_t oparg, PyObject *kwnames);
46static PyObject * do_call_core(
47 PyThreadState *tstate, PyObject *func,
48 PyObject *callargs, PyObject *kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +000049
Guido van Rossum0a066c01992-03-27 17:29:15 +000050#ifdef LLTRACE
Guido van Rossumc2e20742006-02-27 22:32:47 +000051static int lltrace;
Victor Stinner438a12d2019-05-24 17:01:38 +020052static int prtrace(PyThreadState *, PyObject *, const char *);
Guido van Rossum0a066c01992-03-27 17:29:15 +000053#endif
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +010054static int call_trace(Py_tracefunc, PyObject *,
55 PyThreadState *, PyFrameObject *,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000056 int, PyObject *);
Amaury Forgeot d'Arcf05149a2007-11-13 01:05:30 +000057static int call_trace_protected(Py_tracefunc, PyObject *,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +010058 PyThreadState *, PyFrameObject *,
59 int, PyObject *);
60static void call_exc_trace(Py_tracefunc, PyObject *,
61 PyThreadState *, PyFrameObject *);
Tim Peters8a5c3c72004-04-05 19:36:21 +000062static int maybe_call_line_trace(Py_tracefunc, PyObject *,
Eric Snow2ebc5ce2017-09-07 23:51:28 -060063 PyThreadState *, PyFrameObject *,
64 int *, int *, int *);
Łukasz Langaa785c872016-09-09 17:37:37 -070065static void maybe_dtrace_line(PyFrameObject *, int *, int *, int *);
66static void dtrace_function_entry(PyFrameObject *);
67static void dtrace_function_return(PyFrameObject *);
Michael W. Hudsondd32a912002-08-15 14:59:02 +000068
Victor Stinner438a12d2019-05-24 17:01:38 +020069static PyObject * cmp_outcome(PyThreadState *, int, PyObject *, PyObject *);
70static 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);
81static void format_awaitable_error(PyThreadState *, PyTypeObject *, 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 Stinner09532fe2019-05-10 23:39:09 +0200193 return gil_created(&_PyRuntime.ceval.gil);
Tim Peters7f468f22004-10-11 02:40:51 +0000194}
195
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000196void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000197PyEval_InitThreads(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000198{
Victor Stinner09532fe2019-05-10 23:39:09 +0200199 _PyRuntimeState *runtime = &_PyRuntime;
Victor Stinnere225beb2019-06-03 18:14:24 +0200200 struct _ceval_runtime_state *ceval = &runtime->ceval;
201 struct _gil_runtime_state *gil = &ceval->gil;
Victor Stinner09532fe2019-05-10 23:39:09 +0200202 if (gil_created(gil)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000203 return;
Victor Stinnera7126792019-03-19 14:19:38 +0100204 }
205
Inada Naoki001fee12019-02-20 10:00:09 +0900206 PyThread_init_thread();
Victor Stinner09532fe2019-05-10 23:39:09 +0200207 create_gil(gil);
208 PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime);
Victor Stinnere225beb2019-06-03 18:14:24 +0200209 take_gil(ceval, tstate);
Eric Snow8479a342019-03-08 23:44:33 -0700210
Victor Stinnere225beb2019-06-03 18:14:24 +0200211 struct _pending_calls *pending = &ceval->pending;
212 pending->lock = PyThread_allocate_lock();
213 if (pending->lock == NULL) {
214 Py_FatalError("Can't initialize threads for pending calls");
215 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000216}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000217
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000218void
Victor Stinnere225beb2019-06-03 18:14:24 +0200219_PyEval_FiniThreads(struct _ceval_runtime_state *ceval)
Antoine Pitrou1df15362010-09-13 14:16:46 +0000220{
Victor Stinnere225beb2019-06-03 18:14:24 +0200221 struct _gil_runtime_state *gil = &ceval->gil;
Victor Stinner09532fe2019-05-10 23:39:09 +0200222 if (!gil_created(gil)) {
Antoine Pitrou1df15362010-09-13 14:16:46 +0000223 return;
Victor Stinnera7126792019-03-19 14:19:38 +0100224 }
225
Victor Stinner09532fe2019-05-10 23:39:09 +0200226 destroy_gil(gil);
227 assert(!gil_created(gil));
Victor Stinner99fcc612019-04-29 13:04:07 +0200228
Victor Stinnere225beb2019-06-03 18:14:24 +0200229 struct _pending_calls *pending = &ceval->pending;
230 if (pending->lock != NULL) {
231 PyThread_free_lock(pending->lock);
232 pending->lock = NULL;
233 }
Antoine Pitrou1df15362010-09-13 14:16:46 +0000234}
235
Joannah Nanjekyef781d202019-04-29 04:38:45 -0400236static inline void
Victor Stinner0fd2c302019-06-04 03:15:09 +0200237exit_thread_if_finalizing(_PyRuntimeState *runtime, PyThreadState *tstate)
Joannah Nanjekyef781d202019-04-29 04:38:45 -0400238{
Victor Stinnere225beb2019-06-03 18:14:24 +0200239 /* _Py_Finalizing is protected by the GIL */
Victor Stinner09532fe2019-05-10 23:39:09 +0200240 if (runtime->finalizing != NULL && !_Py_CURRENTLY_FINALIZING(runtime, tstate)) {
Victor Stinnere225beb2019-06-03 18:14:24 +0200241 drop_gil(&runtime->ceval, tstate);
Joannah Nanjekyef781d202019-04-29 04:38:45 -0400242 PyThread_exit_thread();
Joannah Nanjekyef781d202019-04-29 04:38:45 -0400243 }
244}
245
Antoine Pitrou1df15362010-09-13 14:16:46 +0000246void
Inada Naoki91234a12019-06-03 21:30:58 +0900247_PyEval_Fini(void)
248{
249#if OPCACHE_STATS
250 fprintf(stderr, "-- Opcode cache number of objects = %zd\n",
251 opcache_code_objects);
252
253 fprintf(stderr, "-- Opcode cache total extra mem = %zd\n",
254 opcache_code_objects_extra_mem);
255
256 fprintf(stderr, "\n");
257
258 fprintf(stderr, "-- Opcode cache LOAD_GLOBAL hits = %zd (%d%%)\n",
259 opcache_global_hits,
260 (int) (100.0 * opcache_global_hits /
261 (opcache_global_hits + opcache_global_misses)));
262
263 fprintf(stderr, "-- Opcode cache LOAD_GLOBAL misses = %zd (%d%%)\n",
264 opcache_global_misses,
265 (int) (100.0 * opcache_global_misses /
266 (opcache_global_hits + opcache_global_misses)));
267
268 fprintf(stderr, "-- Opcode cache LOAD_GLOBAL opts = %zd\n",
269 opcache_global_opts);
270
271 fprintf(stderr, "\n");
272#endif
273}
274
275void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000276PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000277{
Victor Stinner09532fe2019-05-10 23:39:09 +0200278 _PyRuntimeState *runtime = &_PyRuntime;
Victor Stinnere225beb2019-06-03 18:14:24 +0200279 struct _ceval_runtime_state *ceval = &runtime->ceval;
Victor Stinner09532fe2019-05-10 23:39:09 +0200280 PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime);
281 if (tstate == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000282 Py_FatalError("PyEval_AcquireLock: current thread state is NULL");
Victor Stinner09532fe2019-05-10 23:39:09 +0200283 }
Victor Stinnere225beb2019-06-03 18:14:24 +0200284 take_gil(ceval, tstate);
Victor Stinner0fd2c302019-06-04 03:15:09 +0200285 exit_thread_if_finalizing(runtime, tstate);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000286}
287
288void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000289PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000290{
Victor Stinner09532fe2019-05-10 23:39:09 +0200291 _PyRuntimeState *runtime = &_PyRuntime;
Victor Stinnere225beb2019-06-03 18:14:24 +0200292 PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000293 /* This function must succeed when the current thread state is NULL.
Victor Stinner50b48572018-11-01 01:51:40 +0100294 We therefore avoid PyThreadState_Get() which dumps a fatal error
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000295 in debug mode.
296 */
Victor Stinnere225beb2019-06-03 18:14:24 +0200297 drop_gil(&runtime->ceval, tstate);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000298}
299
300void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000301PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000302{
Victor Stinner09532fe2019-05-10 23:39:09 +0200303 if (tstate == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000304 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
Victor Stinner09532fe2019-05-10 23:39:09 +0200305 }
Victor Stinnere225beb2019-06-03 18:14:24 +0200306
Victor Stinner0fd2c302019-06-04 03:15:09 +0200307 _PyRuntimeState *runtime = &_PyRuntime;
Victor Stinnere225beb2019-06-03 18:14:24 +0200308 struct _ceval_runtime_state *ceval = &runtime->ceval;
Victor Stinner09532fe2019-05-10 23:39:09 +0200309
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000310 /* Check someone has called PyEval_InitThreads() to create the lock */
Victor Stinnere225beb2019-06-03 18:14:24 +0200311 assert(gil_created(&ceval->gil));
312 take_gil(ceval, tstate);
Victor Stinner0fd2c302019-06-04 03:15:09 +0200313 exit_thread_if_finalizing(runtime, tstate);
Victor Stinner09532fe2019-05-10 23:39:09 +0200314 if (_PyThreadState_Swap(&runtime->gilstate, tstate) != NULL) {
315 Py_FatalError("PyEval_AcquireThread: non-NULL old thread state");
316 }
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000317}
318
319void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000320PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000321{
Victor Stinner09532fe2019-05-10 23:39:09 +0200322 if (tstate == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000323 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
Victor Stinner09532fe2019-05-10 23:39:09 +0200324 }
325
Victor Stinner0fd2c302019-06-04 03:15:09 +0200326 _PyRuntimeState *runtime = &_PyRuntime;
Victor Stinner09532fe2019-05-10 23:39:09 +0200327 PyThreadState *new_tstate = _PyThreadState_Swap(&runtime->gilstate, NULL);
328 if (new_tstate != tstate) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000329 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
Victor Stinner09532fe2019-05-10 23:39:09 +0200330 }
Victor Stinnere225beb2019-06-03 18:14:24 +0200331 drop_gil(&runtime->ceval, tstate);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000332}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000333
Antoine Pitrouf7ecfac2017-05-28 11:35:14 +0200334/* This function is called from PyOS_AfterFork_Child to destroy all threads
335 * which are not running in the child process, and clear internal locks
336 * which might be held by those threads.
337 */
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000338
339void
Victor Stinnerd5d9e812019-05-13 12:35:37 +0200340_PyEval_ReInitThreads(_PyRuntimeState *runtime)
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000341{
Victor Stinnere225beb2019-06-03 18:14:24 +0200342 struct _ceval_runtime_state *ceval = &runtime->ceval;
343 if (!gil_created(&ceval->gil)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000344 return;
Victor Stinner09532fe2019-05-10 23:39:09 +0200345 }
Victor Stinnere225beb2019-06-03 18:14:24 +0200346 recreate_gil(&ceval->gil);
Victor Stinner09532fe2019-05-10 23:39:09 +0200347 PyThreadState *current_tstate = _PyRuntimeState_GetThreadState(runtime);
Victor Stinnere225beb2019-06-03 18:14:24 +0200348 take_gil(ceval, current_tstate);
Eric Snow8479a342019-03-08 23:44:33 -0700349
Victor Stinnere225beb2019-06-03 18:14:24 +0200350 struct _pending_calls *pending = &ceval->pending;
Victor Stinner09532fe2019-05-10 23:39:09 +0200351 pending->lock = PyThread_allocate_lock();
352 if (pending->lock == NULL) {
Eric Snow8479a342019-03-08 23:44:33 -0700353 Py_FatalError("Can't initialize threads for pending calls");
354 }
Jesse Nollera8513972008-07-17 16:49:17 +0000355
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200356 /* Destroy all threads except the current one */
Victor Stinner0fd2c302019-06-04 03:15:09 +0200357 _PyThreadState_DeleteExcept(runtime, current_tstate);
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000358}
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000359
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000360/* This function is used to signal that async exceptions are waiting to be
Zackery Spytzeef05962018-09-29 10:07:11 -0600361 raised. */
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000362
363void
Victor Stinnere225beb2019-06-03 18:14:24 +0200364_PyEval_SignalAsyncExc(struct _ceval_runtime_state *ceval)
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000365{
Victor Stinnere225beb2019-06-03 18:14:24 +0200366 SIGNAL_ASYNC_EXC(ceval);
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000367}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000368
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000369PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000370PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000371{
Victor Stinner09532fe2019-05-10 23:39:09 +0200372 _PyRuntimeState *runtime = &_PyRuntime;
Victor Stinnere225beb2019-06-03 18:14:24 +0200373 struct _ceval_runtime_state *ceval = &runtime->ceval;
Victor Stinner09532fe2019-05-10 23:39:09 +0200374 PyThreadState *tstate = _PyThreadState_Swap(&runtime->gilstate, NULL);
375 if (tstate == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000376 Py_FatalError("PyEval_SaveThread: NULL tstate");
Victor Stinner09532fe2019-05-10 23:39:09 +0200377 }
Victor Stinnere225beb2019-06-03 18:14:24 +0200378 assert(gil_created(&ceval->gil));
379 drop_gil(ceval, tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000380 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000381}
382
383void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000384PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000385{
Victor Stinner0fd2c302019-06-04 03:15:09 +0200386 _PyRuntimeState *runtime = &_PyRuntime;
387 struct _ceval_runtime_state *ceval = &runtime->ceval;
388
Victor Stinner09532fe2019-05-10 23:39:09 +0200389 if (tstate == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000390 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Victor Stinner09532fe2019-05-10 23:39:09 +0200391 }
Victor Stinnere225beb2019-06-03 18:14:24 +0200392 assert(gil_created(&ceval->gil));
Victor Stinner2914bb32018-01-29 11:57:45 +0100393
394 int err = errno;
Victor Stinnere225beb2019-06-03 18:14:24 +0200395 take_gil(ceval, tstate);
Victor Stinner0fd2c302019-06-04 03:15:09 +0200396 exit_thread_if_finalizing(runtime, tstate);
Victor Stinner2914bb32018-01-29 11:57:45 +0100397 errno = err;
398
Victor Stinner09532fe2019-05-10 23:39:09 +0200399 _PyThreadState_Swap(&runtime->gilstate, tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000400}
401
402
Guido van Rossuma9672091994-09-14 13:31:22 +0000403/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
404 signal handlers or Mac I/O completion routines) can schedule calls
405 to a function to be called synchronously.
406 The synchronous function is called with one void* argument.
407 It should return 0 for success or -1 for failure -- failure should
408 be accompanied by an exception.
409
410 If registry succeeds, the registry function returns 0; if it fails
411 (e.g. due to too many pending calls) it returns -1 (without setting
412 an exception condition).
413
414 Note that because registry may occur from within signal handlers,
415 or other asynchronous events, calling malloc() is unsafe!
416
Guido van Rossuma9672091994-09-14 13:31:22 +0000417 Any thread can schedule pending calls, but only the main thread
418 will execute them.
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000419 There is no facility to schedule calls to a particular thread, but
420 that should be easy to change, should that ever be required. In
421 that case, the static variables here should go into the python
422 threadstate.
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000423*/
Guido van Rossuma9672091994-09-14 13:31:22 +0000424
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200425void
Victor Stinnere225beb2019-06-03 18:14:24 +0200426_PyEval_SignalReceived(struct _ceval_runtime_state *ceval)
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200427{
428 /* bpo-30703: Function called when the C signal handler of Python gets a
429 signal. We cannot queue a callback using Py_AddPendingCall() since
430 that function is not async-signal-safe. */
Victor Stinnere225beb2019-06-03 18:14:24 +0200431 SIGNAL_PENDING_SIGNALS(ceval);
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200432}
433
Eric Snow5be45a62019-03-08 22:47:07 -0700434/* Push one item onto the queue while holding the lock. */
435static int
Victor Stinnere225beb2019-06-03 18:14:24 +0200436_push_pending_call(struct _pending_calls *pending,
Eric Snow842a2f02019-03-15 15:47:51 -0600437 int (*func)(void *), void *arg)
Eric Snow5be45a62019-03-08 22:47:07 -0700438{
Eric Snow842a2f02019-03-15 15:47:51 -0600439 int i = pending->last;
Eric Snow5be45a62019-03-08 22:47:07 -0700440 int j = (i + 1) % NPENDINGCALLS;
Eric Snow842a2f02019-03-15 15:47:51 -0600441 if (j == pending->first) {
Eric Snow5be45a62019-03-08 22:47:07 -0700442 return -1; /* Queue full */
443 }
Eric Snow842a2f02019-03-15 15:47:51 -0600444 pending->calls[i].func = func;
445 pending->calls[i].arg = arg;
446 pending->last = j;
Eric Snow5be45a62019-03-08 22:47:07 -0700447 return 0;
448}
449
450/* Pop one item off the queue while holding the lock. */
451static void
Victor Stinnere225beb2019-06-03 18:14:24 +0200452_pop_pending_call(struct _pending_calls *pending,
Eric Snow842a2f02019-03-15 15:47:51 -0600453 int (**func)(void *), void **arg)
Eric Snow5be45a62019-03-08 22:47:07 -0700454{
Eric Snow842a2f02019-03-15 15:47:51 -0600455 int i = pending->first;
456 if (i == pending->last) {
Eric Snow5be45a62019-03-08 22:47:07 -0700457 return; /* Queue empty */
458 }
459
Eric Snow842a2f02019-03-15 15:47:51 -0600460 *func = pending->calls[i].func;
461 *arg = pending->calls[i].arg;
462 pending->first = (i + 1) % NPENDINGCALLS;
Eric Snow5be45a62019-03-08 22:47:07 -0700463}
464
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200465/* This implementation is thread-safe. It allows
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000466 scheduling to be made from any thread, and even from an executing
467 callback.
468 */
469
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000470int
Victor Stinner438a12d2019-05-24 17:01:38 +0200471_PyEval_AddPendingCall(PyThreadState *tstate,
Victor Stinnere225beb2019-06-03 18:14:24 +0200472 struct _ceval_runtime_state *ceval,
Victor Stinner09532fe2019-05-10 23:39:09 +0200473 int (*func)(void *), void *arg)
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000474{
Victor Stinnere225beb2019-06-03 18:14:24 +0200475 struct _pending_calls *pending = &ceval->pending;
Eric Snow842a2f02019-03-15 15:47:51 -0600476
477 PyThread_acquire_lock(pending->lock, WAIT_LOCK);
478 if (pending->finishing) {
479 PyThread_release_lock(pending->lock);
480
481 PyObject *exc, *val, *tb;
Victor Stinner438a12d2019-05-24 17:01:38 +0200482 _PyErr_Fetch(tstate, &exc, &val, &tb);
483 _PyErr_SetString(tstate, PyExc_SystemError,
Eric Snow842a2f02019-03-15 15:47:51 -0600484 "Py_AddPendingCall: cannot add pending calls "
485 "(Python shutting down)");
Victor Stinner438a12d2019-05-24 17:01:38 +0200486 _PyErr_Print(tstate);
487 _PyErr_Restore(tstate, exc, val, tb);
Eric Snow842a2f02019-03-15 15:47:51 -0600488 return -1;
489 }
Victor Stinnere225beb2019-06-03 18:14:24 +0200490 int result = _push_pending_call(pending, func, arg);
Eric Snow842a2f02019-03-15 15:47:51 -0600491 PyThread_release_lock(pending->lock);
Eric Snow5be45a62019-03-08 22:47:07 -0700492
Victor Stinnere225beb2019-06-03 18:14:24 +0200493 /* signal main loop */
494 SIGNAL_PENDING_CALLS(ceval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000495 return result;
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000496}
497
Victor Stinner09532fe2019-05-10 23:39:09 +0200498int
499Py_AddPendingCall(int (*func)(void *), void *arg)
500{
Victor Stinner438a12d2019-05-24 17:01:38 +0200501 _PyRuntimeState *runtime = &_PyRuntime;
502 PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime);
Victor Stinnere225beb2019-06-03 18:14:24 +0200503 return _PyEval_AddPendingCall(tstate, &runtime->ceval, func, arg);
Victor Stinner09532fe2019-05-10 23:39:09 +0200504}
505
Eric Snowfdf282d2019-01-11 14:26:55 -0700506static int
Victor Stinner09532fe2019-05-10 23:39:09 +0200507handle_signals(_PyRuntimeState *runtime)
Eric Snowfdf282d2019-01-11 14:26:55 -0700508{
Eric Snow5be45a62019-03-08 22:47:07 -0700509 /* Only handle signals on main thread. PyEval_InitThreads must
510 * have been called already.
511 */
Victor Stinner09532fe2019-05-10 23:39:09 +0200512 if (PyThread_get_thread_ident() != runtime->main_thread) {
Eric Snowfdf282d2019-01-11 14:26:55 -0700513 return 0;
514 }
Eric Snow64d6cc82019-02-23 15:40:43 -0700515 /*
516 * Ensure that the thread isn't currently running some other
517 * interpreter.
518 */
Victor Stinner09532fe2019-05-10 23:39:09 +0200519 PyInterpreterState *interp = _PyRuntimeState_GetThreadState(runtime)->interp;
520 if (interp != runtime->interpreters.main) {
Eric Snow64d6cc82019-02-23 15:40:43 -0700521 return 0;
522 }
Eric Snowfdf282d2019-01-11 14:26:55 -0700523
Victor Stinnere225beb2019-06-03 18:14:24 +0200524 struct _ceval_runtime_state *ceval = &runtime->ceval;
525 UNSIGNAL_PENDING_SIGNALS(ceval);
Eric Snow64d6cc82019-02-23 15:40:43 -0700526 if (_PyErr_CheckSignals() < 0) {
Victor Stinnere225beb2019-06-03 18:14:24 +0200527 SIGNAL_PENDING_SIGNALS(ceval); /* We're not done yet */
Eric Snowfdf282d2019-01-11 14:26:55 -0700528 return -1;
529 }
530 return 0;
531}
532
533static int
Victor Stinnere225beb2019-06-03 18:14:24 +0200534make_pending_calls(_PyRuntimeState *runtime)
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000535{
Eric Snow6a150bc2019-06-01 15:39:46 -0600536 static int busy = 0;
Eric Snowb75b1a352019-04-12 10:20:10 -0600537
Victor Stinnere225beb2019-06-03 18:14:24 +0200538 /* only service pending calls on main thread */
539 if (PyThread_get_thread_ident() != runtime->main_thread) {
540 return 0;
541 }
542
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000543 /* don't perform recursive pending calls */
Eric Snowfdf282d2019-01-11 14:26:55 -0700544 if (busy) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000545 return 0;
Eric Snowfdf282d2019-01-11 14:26:55 -0700546 }
Charles-François Natalif23339a2011-07-23 18:15:43 +0200547 busy = 1;
Victor Stinnere225beb2019-06-03 18:14:24 +0200548 struct _ceval_runtime_state *ceval = &runtime->ceval;
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200549 /* unsignal before starting to call callbacks, so that any callback
550 added in-between re-signals */
Victor Stinnere225beb2019-06-03 18:14:24 +0200551 UNSIGNAL_PENDING_CALLS(ceval);
Eric Snowfdf282d2019-01-11 14:26:55 -0700552 int res = 0;
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200553
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000554 /* perform a bounded number of calls, in case of recursion */
Victor Stinnere225beb2019-06-03 18:14:24 +0200555 struct _pending_calls *pending = &ceval->pending;
Eric Snowfdf282d2019-01-11 14:26:55 -0700556 for (int i=0; i<NPENDINGCALLS; i++) {
Eric Snow5be45a62019-03-08 22:47:07 -0700557 int (*func)(void *) = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000558 void *arg = NULL;
559
560 /* pop one item off the queue while holding the lock */
Eric Snow842a2f02019-03-15 15:47:51 -0600561 PyThread_acquire_lock(pending->lock, WAIT_LOCK);
Victor Stinnere225beb2019-06-03 18:14:24 +0200562 _pop_pending_call(pending, &func, &arg);
Eric Snow842a2f02019-03-15 15:47:51 -0600563 PyThread_release_lock(pending->lock);
Eric Snow5be45a62019-03-08 22:47:07 -0700564
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100565 /* having released the lock, perform the callback */
Eric Snow5be45a62019-03-08 22:47:07 -0700566 if (func == NULL) {
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100567 break;
Eric Snow5be45a62019-03-08 22:47:07 -0700568 }
Eric Snowfdf282d2019-01-11 14:26:55 -0700569 res = func(arg);
570 if (res) {
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200571 goto error;
572 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000573 }
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200574
Charles-François Natalif23339a2011-07-23 18:15:43 +0200575 busy = 0;
Eric Snowfdf282d2019-01-11 14:26:55 -0700576 return res;
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200577
578error:
579 busy = 0;
Victor Stinnere225beb2019-06-03 18:14:24 +0200580 SIGNAL_PENDING_CALLS(ceval);
Eric Snowfdf282d2019-01-11 14:26:55 -0700581 return res;
582}
583
Eric Snow842a2f02019-03-15 15:47:51 -0600584void
Victor Stinnere225beb2019-06-03 18:14:24 +0200585_Py_FinishPendingCalls(_PyRuntimeState *runtime)
Eric Snow842a2f02019-03-15 15:47:51 -0600586{
Eric Snow842a2f02019-03-15 15:47:51 -0600587 assert(PyGILState_Check());
588
Victor Stinnere225beb2019-06-03 18:14:24 +0200589 PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime);
590 struct _pending_calls *pending = &runtime->ceval.pending;
Victor Stinner09532fe2019-05-10 23:39:09 +0200591
Eric Snow842a2f02019-03-15 15:47:51 -0600592 PyThread_acquire_lock(pending->lock, WAIT_LOCK);
593 pending->finishing = 1;
594 PyThread_release_lock(pending->lock);
595
596 if (!_Py_atomic_load_relaxed(&(pending->calls_to_do))) {
597 return;
598 }
599
Victor Stinnere225beb2019-06-03 18:14:24 +0200600 if (make_pending_calls(runtime) < 0) {
601 PyObject *exc, *val, *tb;
602 _PyErr_Fetch(tstate, &exc, &val, &tb);
603 PyErr_BadInternalCall();
604 _PyErr_ChainExceptions(exc, val, tb);
605 _PyErr_Print(tstate);
Eric Snow842a2f02019-03-15 15:47:51 -0600606 }
607}
608
Eric Snowfdf282d2019-01-11 14:26:55 -0700609/* Py_MakePendingCalls() is a simple wrapper for the sake
610 of backward-compatibility. */
611int
612Py_MakePendingCalls(void)
613{
614 assert(PyGILState_Check());
615
616 /* Python signal handler doesn't really queue a callback: it only signals
617 that a signal was received, see _PyEval_SignalReceived(). */
Victor Stinner09532fe2019-05-10 23:39:09 +0200618 _PyRuntimeState *runtime = &_PyRuntime;
619 int res = handle_signals(runtime);
Eric Snowfdf282d2019-01-11 14:26:55 -0700620 if (res != 0) {
621 return res;
622 }
623
Victor Stinnere225beb2019-06-03 18:14:24 +0200624 res = make_pending_calls(runtime);
Eric Snowb75b1a352019-04-12 10:20:10 -0600625 if (res != 0) {
626 return res;
627 }
628
629 return 0;
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000630}
631
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000632/* The interpreter's recursion limit */
633
Hye-Shik Changb6fa2812005-04-04 15:49:02 +0000634#ifndef Py_DEFAULT_RECURSION_LIMIT
635#define Py_DEFAULT_RECURSION_LIMIT 1000
636#endif
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600637
Eric Snow05351c12017-09-05 21:43:08 -0700638int _Py_CheckRecursionLimit = Py_DEFAULT_RECURSION_LIMIT;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000639
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600640void
Victor Stinnere225beb2019-06-03 18:14:24 +0200641_PyEval_Initialize(struct _ceval_runtime_state *state)
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600642{
Victor Stinnere225beb2019-06-03 18:14:24 +0200643 state->recursion_limit = Py_DEFAULT_RECURSION_LIMIT;
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600644 _Py_CheckRecursionLimit = Py_DEFAULT_RECURSION_LIMIT;
Victor Stinnere225beb2019-06-03 18:14:24 +0200645 _gil_initialize(&state->gil);
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600646}
647
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000648int
649Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000650{
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600651 return _PyRuntime.ceval.recursion_limit;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000652}
653
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000654void
655Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000656{
Victor Stinnere225beb2019-06-03 18:14:24 +0200657 struct _ceval_runtime_state *ceval = &_PyRuntime.ceval;
658 ceval->recursion_limit = new_limit;
659 _Py_CheckRecursionLimit = ceval->recursion_limit;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000660}
661
Armin Rigo2b3eb402003-10-28 12:05:48 +0000662/* the macro Py_EnterRecursiveCall() only calls _Py_CheckRecursiveCall()
663 if the recursion_depth reaches _Py_CheckRecursionLimit.
664 If USE_STACKCHECK, the macro decrements _Py_CheckRecursionLimit
665 to guarantee that _Py_CheckRecursiveCall() is regularly called.
666 Without USE_STACKCHECK, there is no need for this. */
667int
Serhiy Storchaka5fa22fc2015-06-21 16:26:28 +0300668_Py_CheckRecursiveCall(const char *where)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000669{
Victor Stinner09532fe2019-05-10 23:39:09 +0200670 _PyRuntimeState *runtime = &_PyRuntime;
671 PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime);
672 int recursion_limit = runtime->ceval.recursion_limit;
Armin Rigo2b3eb402003-10-28 12:05:48 +0000673
674#ifdef USE_STACKCHECK
pdox18967932017-10-25 23:03:01 -0700675 tstate->stackcheck_counter = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000676 if (PyOS_CheckStack()) {
677 --tstate->recursion_depth;
Victor Stinner438a12d2019-05-24 17:01:38 +0200678 _PyErr_SetString(tstate, PyExc_MemoryError, "Stack overflow");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000679 return -1;
680 }
pdox18967932017-10-25 23:03:01 -0700681 /* Needed for ABI backwards-compatibility (see bpo-31857) */
Eric Snow05351c12017-09-05 21:43:08 -0700682 _Py_CheckRecursionLimit = recursion_limit;
pdox18967932017-10-25 23:03:01 -0700683#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000684 if (tstate->recursion_critical)
685 /* Somebody asked that we don't check for recursion. */
686 return 0;
687 if (tstate->overflowed) {
688 if (tstate->recursion_depth > recursion_limit + 50) {
689 /* Overflowing while handling an overflow. Give up. */
690 Py_FatalError("Cannot recover from stack overflow.");
691 }
692 return 0;
693 }
694 if (tstate->recursion_depth > recursion_limit) {
695 --tstate->recursion_depth;
696 tstate->overflowed = 1;
Victor Stinner438a12d2019-05-24 17:01:38 +0200697 _PyErr_Format(tstate, PyExc_RecursionError,
698 "maximum recursion depth exceeded%s",
699 where);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000700 return -1;
701 }
702 return 0;
Armin Rigo2b3eb402003-10-28 12:05:48 +0000703}
704
Victor Stinner09532fe2019-05-10 23:39:09 +0200705static int do_raise(PyThreadState *tstate, PyObject *exc, PyObject *cause);
Victor Stinner438a12d2019-05-24 17:01:38 +0200706static int unpack_iterable(PyThreadState *, PyObject *, int, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000707
Victor Stinnere225beb2019-06-03 18:14:24 +0200708#define _Py_TracingPossible(ceval) ((ceval)->tracing_possible)
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000709
Guido van Rossum374a9221991-04-04 10:40:29 +0000710
Guido van Rossumb209a111997-04-29 18:18:01 +0000711PyObject *
Martin v. Löwis4d0d4712010-12-03 20:14:31 +0000712PyEval_EvalCode(PyObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000713{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000714 return PyEval_EvalCodeEx(co,
715 globals, locals,
716 (PyObject **)NULL, 0,
717 (PyObject **)NULL, 0,
718 (PyObject **)NULL, 0,
719 NULL, NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000720}
721
722
723/* Interpreter main loop */
724
Martin v. Löwis8d97e332004-06-27 15:43:12 +0000725PyObject *
Phillip J. Eby0d6615f2005-08-02 00:46:46 +0000726PyEval_EvalFrame(PyFrameObject *f) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000727 /* This is for backward compatibility with extension modules that
728 used this API; core interpreter code should call
729 PyEval_EvalFrameEx() */
730 return PyEval_EvalFrameEx(f, 0);
Phillip J. Eby0d6615f2005-08-02 00:46:46 +0000731}
732
733PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000734PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
Guido van Rossum374a9221991-04-04 10:40:29 +0000735{
Victor Stinnercaba55b2018-08-03 15:33:52 +0200736 PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE();
737 return interp->eval_frame(f, throwflag);
Brett Cannon3cebf932016-09-05 15:33:46 -0700738}
739
Victor Stinnerc6944e72016-11-11 02:13:35 +0100740PyObject* _Py_HOT_FUNCTION
Brett Cannon3cebf932016-09-05 15:33:46 -0700741_PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag)
742{
Guido van Rossum950361c1997-01-24 13:49:28 +0000743#ifdef DXPAIRS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000744 int lastopcode = 0;
Guido van Rossum950361c1997-01-24 13:49:28 +0000745#endif
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200746 PyObject **stack_pointer; /* Next free slot in value stack */
Serhiy Storchakaab874002016-09-11 13:48:15 +0300747 const _Py_CODEUNIT *next_instr;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200748 int opcode; /* Current opcode */
749 int oparg; /* Current opcode argument, if any */
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200750 PyObject **fastlocals, **freevars;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000751 PyObject *retval = NULL; /* Return value */
Victor Stinner09532fe2019-05-10 23:39:09 +0200752 _PyRuntimeState * const runtime = &_PyRuntime;
753 PyThreadState * const tstate = _PyRuntimeState_GetThreadState(runtime);
Victor Stinnere225beb2019-06-03 18:14:24 +0200754 struct _ceval_runtime_state * const ceval = &runtime->ceval;
755 _Py_atomic_int * const eval_breaker = &ceval->eval_breaker;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000756 PyCodeObject *co;
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000757
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000758 /* when tracing we set things up so that
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000759
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000760 not (instr_lb <= current_bytecode_offset < instr_ub)
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000761
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000762 is true when the line being executed has changed. The
763 initial values are such as to make this false the first
764 time it is tested. */
765 int instr_ub = -1, instr_lb = 0, instr_prev = -1;
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000766
Serhiy Storchakaab874002016-09-11 13:48:15 +0300767 const _Py_CODEUNIT *first_instr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000768 PyObject *names;
769 PyObject *consts;
Inada Naoki91234a12019-06-03 21:30:58 +0900770 _PyOpcache *co_opcache;
Guido van Rossum374a9221991-04-04 10:40:29 +0000771
Brett Cannon368b4b72012-04-02 12:17:59 -0400772#ifdef LLTRACE
Victor Stinner3c1e4812012-03-26 22:10:51 +0200773 _Py_IDENTIFIER(__ltrace__);
Brett Cannon368b4b72012-04-02 12:17:59 -0400774#endif
Victor Stinner3c1e4812012-03-26 22:10:51 +0200775
Antoine Pitroub52ec782009-01-25 16:34:23 +0000776/* Computed GOTOs, or
777 the-optimization-commonly-but-improperly-known-as-"threaded code"
778 using gcc's labels-as-values extension
779 (http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html).
780
781 The traditional bytecode evaluation loop uses a "switch" statement, which
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000782 decent compilers will optimize as a single indirect branch instruction
Antoine Pitroub52ec782009-01-25 16:34:23 +0000783 combined with a lookup table of jump addresses. However, since the
784 indirect jump instruction is shared by all opcodes, the CPU will have a
785 hard time making the right prediction for where to jump next (actually,
786 it will be always wrong except in the uncommon case of a sequence of
787 several identical opcodes).
788
789 "Threaded code" in contrast, uses an explicit jump table and an explicit
790 indirect jump instruction at the end of each opcode. Since the jump
791 instruction is at a different address for each opcode, the CPU will make a
792 separate prediction for each of these instructions, which is equivalent to
793 predicting the second opcode of each opcode pair. These predictions have
794 a much better chance to turn out valid, especially in small bytecode loops.
795
796 A mispredicted branch on a modern CPU flushes the whole pipeline and
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000797 can cost several CPU cycles (depending on the pipeline depth),
Antoine Pitroub52ec782009-01-25 16:34:23 +0000798 and potentially many more instructions (depending on the pipeline width).
799 A correctly predicted branch, however, is nearly free.
800
801 At the time of this writing, the "threaded code" version is up to 15-20%
802 faster than the normal "switch" version, depending on the compiler and the
803 CPU architecture.
804
805 We disable the optimization if DYNAMIC_EXECUTION_PROFILE is defined,
806 because it would render the measurements invalid.
807
808
809 NOTE: care must be taken that the compiler doesn't try to "optimize" the
810 indirect jumps by sharing them between all opcodes. Such optimizations
811 can be disabled on gcc by using the -fno-gcse flag (or possibly
812 -fno-crossjumping).
813*/
814
Antoine Pitrou042b1282010-08-13 21:15:58 +0000815#ifdef DYNAMIC_EXECUTION_PROFILE
Antoine Pitroub52ec782009-01-25 16:34:23 +0000816#undef USE_COMPUTED_GOTOS
Antoine Pitrou042b1282010-08-13 21:15:58 +0000817#define USE_COMPUTED_GOTOS 0
Antoine Pitroub52ec782009-01-25 16:34:23 +0000818#endif
819
Antoine Pitrou042b1282010-08-13 21:15:58 +0000820#ifdef HAVE_COMPUTED_GOTOS
821 #ifndef USE_COMPUTED_GOTOS
822 #define USE_COMPUTED_GOTOS 1
823 #endif
824#else
825 #if defined(USE_COMPUTED_GOTOS) && USE_COMPUTED_GOTOS
826 #error "Computed gotos are not supported on this compiler."
827 #endif
828 #undef USE_COMPUTED_GOTOS
829 #define USE_COMPUTED_GOTOS 0
830#endif
831
832#if USE_COMPUTED_GOTOS
Antoine Pitroub52ec782009-01-25 16:34:23 +0000833/* Import the static jump table */
834#include "opcode_targets.h"
835
Antoine Pitroub52ec782009-01-25 16:34:23 +0000836#define TARGET(op) \
Benjamin Petersonddd19492018-09-16 22:38:02 -0700837 op: \
838 TARGET_##op
Antoine Pitroub52ec782009-01-25 16:34:23 +0000839
Antoine Pitroub52ec782009-01-25 16:34:23 +0000840#ifdef LLTRACE
841#define FAST_DISPATCH() \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000842 { \
Victor Stinnere225beb2019-06-03 18:14:24 +0200843 if (!lltrace && !_Py_TracingPossible(ceval) && !PyDTrace_LINE_ENABLED()) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000844 f->f_lasti = INSTR_OFFSET(); \
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +0300845 NEXTOPARG(); \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +0300846 goto *opcode_targets[opcode]; \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000847 } \
848 goto fast_next_opcode; \
849 }
Antoine Pitroub52ec782009-01-25 16:34:23 +0000850#else
851#define FAST_DISPATCH() \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000852 { \
Victor Stinnere225beb2019-06-03 18:14:24 +0200853 if (!_Py_TracingPossible(ceval) && !PyDTrace_LINE_ENABLED()) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000854 f->f_lasti = INSTR_OFFSET(); \
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +0300855 NEXTOPARG(); \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +0300856 goto *opcode_targets[opcode]; \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000857 } \
858 goto fast_next_opcode; \
859 }
Antoine Pitroub52ec782009-01-25 16:34:23 +0000860#endif
861
Victor Stinner09532fe2019-05-10 23:39:09 +0200862#define DISPATCH() \
863 { \
864 if (!_Py_atomic_load_relaxed(eval_breaker)) { \
865 FAST_DISPATCH(); \
866 } \
867 continue; \
868 }
869
Antoine Pitroub52ec782009-01-25 16:34:23 +0000870#else
Benjamin Petersonddd19492018-09-16 22:38:02 -0700871#define TARGET(op) op
Antoine Pitroub52ec782009-01-25 16:34:23 +0000872#define FAST_DISPATCH() goto fast_next_opcode
Victor Stinner09532fe2019-05-10 23:39:09 +0200873#define DISPATCH() continue
Antoine Pitroub52ec782009-01-25 16:34:23 +0000874#endif
875
876
Neal Norwitza81d2202002-07-14 00:27:26 +0000877/* Tuple access macros */
878
879#ifndef Py_DEBUG
880#define GETITEM(v, i) PyTuple_GET_ITEM((PyTupleObject *)(v), (i))
881#else
882#define GETITEM(v, i) PyTuple_GetItem((v), (i))
883#endif
884
Guido van Rossum374a9221991-04-04 10:40:29 +0000885/* Code access macros */
886
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +0300887/* The integer overflow is checked by an assertion below. */
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600888#define INSTR_OFFSET() \
889 (sizeof(_Py_CODEUNIT) * (int)(next_instr - first_instr))
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +0300890#define NEXTOPARG() do { \
Serhiy Storchakaab874002016-09-11 13:48:15 +0300891 _Py_CODEUNIT word = *next_instr; \
892 opcode = _Py_OPCODE(word); \
893 oparg = _Py_OPARG(word); \
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +0300894 next_instr++; \
895 } while (0)
Serhiy Storchakaab874002016-09-11 13:48:15 +0300896#define JUMPTO(x) (next_instr = first_instr + (x) / sizeof(_Py_CODEUNIT))
897#define JUMPBY(x) (next_instr += (x) / sizeof(_Py_CODEUNIT))
Guido van Rossum374a9221991-04-04 10:40:29 +0000898
Raymond Hettingerf606f872003-03-16 03:11:04 +0000899/* OpCode prediction macros
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000900 Some opcodes tend to come in pairs thus making it possible to
901 predict the second code when the first is run. For example,
Serhiy Storchakada9c5132016-06-27 18:58:57 +0300902 COMPARE_OP is often followed by POP_JUMP_IF_FALSE or POP_JUMP_IF_TRUE.
Raymond Hettingerf606f872003-03-16 03:11:04 +0000903
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000904 Verifying the prediction costs a single high-speed test of a register
905 variable against a constant. If the pairing was good, then the
906 processor's own internal branch predication has a high likelihood of
907 success, resulting in a nearly zero-overhead transition to the
908 next opcode. A successful prediction saves a trip through the eval-loop
Serhiy Storchakab0f80b02016-05-24 09:15:14 +0300909 including its unpredictable switch-case branch. Combined with the
910 processor's internal branch prediction, a successful PREDICT has the
911 effect of making the two opcodes run as if they were a single new opcode
912 with the bodies combined.
Raymond Hettingerf606f872003-03-16 03:11:04 +0000913
Georg Brandl86b2fb92008-07-16 03:43:04 +0000914 If collecting opcode statistics, your choices are to either keep the
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000915 predictions turned-on and interpret the results as if some opcodes
916 had been combined or turn-off predictions so that the opcode frequency
917 counter updates for both opcodes.
Antoine Pitroub52ec782009-01-25 16:34:23 +0000918
919 Opcode prediction is disabled with threaded code, since the latter allows
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000920 the CPU to record separate branch prediction information for each
921 opcode.
Antoine Pitroub52ec782009-01-25 16:34:23 +0000922
Raymond Hettingerf606f872003-03-16 03:11:04 +0000923*/
924
Antoine Pitrou042b1282010-08-13 21:15:58 +0000925#if defined(DYNAMIC_EXECUTION_PROFILE) || USE_COMPUTED_GOTOS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000926#define PREDICT(op) if (0) goto PRED_##op
Raymond Hettingera7216982004-02-08 19:59:27 +0000927#else
Serhiy Storchakab0f80b02016-05-24 09:15:14 +0300928#define PREDICT(op) \
929 do{ \
Serhiy Storchakaab874002016-09-11 13:48:15 +0300930 _Py_CODEUNIT word = *next_instr; \
931 opcode = _Py_OPCODE(word); \
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +0300932 if (opcode == op){ \
Serhiy Storchakaab874002016-09-11 13:48:15 +0300933 oparg = _Py_OPARG(word); \
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +0300934 next_instr++; \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +0300935 goto PRED_##op; \
936 } \
937 } while(0)
Antoine Pitroub52ec782009-01-25 16:34:23 +0000938#endif
Serhiy Storchakab0f80b02016-05-24 09:15:14 +0300939#define PREDICTED(op) PRED_##op:
Antoine Pitroub52ec782009-01-25 16:34:23 +0000940
Raymond Hettingerf606f872003-03-16 03:11:04 +0000941
Guido van Rossum374a9221991-04-04 10:40:29 +0000942/* Stack manipulation macros */
943
Martin v. Löwis18e16552006-02-15 17:27:45 +0000944/* The stack can grow at most MAXINT deep, as co_nlocals and
945 co_stacksize are ints. */
Stefan Krahb7e10102010-06-23 18:42:39 +0000946#define STACK_LEVEL() ((int)(stack_pointer - f->f_valuestack))
947#define EMPTY() (STACK_LEVEL() == 0)
948#define TOP() (stack_pointer[-1])
949#define SECOND() (stack_pointer[-2])
950#define THIRD() (stack_pointer[-3])
951#define FOURTH() (stack_pointer[-4])
952#define PEEK(n) (stack_pointer[-(n)])
953#define SET_TOP(v) (stack_pointer[-1] = (v))
954#define SET_SECOND(v) (stack_pointer[-2] = (v))
955#define SET_THIRD(v) (stack_pointer[-3] = (v))
956#define SET_FOURTH(v) (stack_pointer[-4] = (v))
957#define SET_VALUE(n, v) (stack_pointer[-(n)] = (v))
958#define BASIC_STACKADJ(n) (stack_pointer += n)
959#define BASIC_PUSH(v) (*stack_pointer++ = (v))
960#define BASIC_POP() (*--stack_pointer)
Guido van Rossum374a9221991-04-04 10:40:29 +0000961
Guido van Rossum96a42c81992-01-12 02:29:51 +0000962#ifdef LLTRACE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000963#define PUSH(v) { (void)(BASIC_PUSH(v), \
Victor Stinner438a12d2019-05-24 17:01:38 +0200964 lltrace && prtrace(tstate, TOP(), "push")); \
Stefan Krahb7e10102010-06-23 18:42:39 +0000965 assert(STACK_LEVEL() <= co->co_stacksize); }
Victor Stinner438a12d2019-05-24 17:01:38 +0200966#define POP() ((void)(lltrace && prtrace(tstate, TOP(), "pop")), \
Stefan Krahb7e10102010-06-23 18:42:39 +0000967 BASIC_POP())
costypetrisor8ed317f2018-07-31 20:55:14 +0000968#define STACK_GROW(n) do { \
969 assert(n >= 0); \
970 (void)(BASIC_STACKADJ(n), \
Victor Stinner438a12d2019-05-24 17:01:38 +0200971 lltrace && prtrace(tstate, TOP(), "stackadj")); \
costypetrisor8ed317f2018-07-31 20:55:14 +0000972 assert(STACK_LEVEL() <= co->co_stacksize); \
973 } while (0)
974#define STACK_SHRINK(n) do { \
975 assert(n >= 0); \
Victor Stinner438a12d2019-05-24 17:01:38 +0200976 (void)(lltrace && prtrace(tstate, TOP(), "stackadj")); \
costypetrisor8ed317f2018-07-31 20:55:14 +0000977 (void)(BASIC_STACKADJ(-n)); \
978 assert(STACK_LEVEL() <= co->co_stacksize); \
979 } while (0)
Christian Heimes0449f632007-12-15 01:27:15 +0000980#define EXT_POP(STACK_POINTER) ((void)(lltrace && \
Victor Stinner438a12d2019-05-24 17:01:38 +0200981 prtrace(tstate, (STACK_POINTER)[-1], "ext_pop")), \
Stefan Krahb7e10102010-06-23 18:42:39 +0000982 *--(STACK_POINTER))
Guido van Rossum374a9221991-04-04 10:40:29 +0000983#else
Stefan Krahb7e10102010-06-23 18:42:39 +0000984#define PUSH(v) BASIC_PUSH(v)
985#define POP() BASIC_POP()
costypetrisor8ed317f2018-07-31 20:55:14 +0000986#define STACK_GROW(n) BASIC_STACKADJ(n)
987#define STACK_SHRINK(n) BASIC_STACKADJ(-n)
Guido van Rossumc2e20742006-02-27 22:32:47 +0000988#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
Guido van Rossum374a9221991-04-04 10:40:29 +0000989#endif
990
Guido van Rossum681d79a1995-07-18 14:51:37 +0000991/* Local variable macros */
992
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000993#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumcfbf1a32002-03-28 20:17:52 +0000994
995/* The SETLOCAL() macro must not DECREF the local variable in-place and
996 then store the new value; it must copy the old value to a temporary
997 value, then store the new value, and then DECREF the temporary value.
998 This is because it is possible that during the DECREF the frame is
999 accessed by other code (e.g. a __del__ method or gc.collect()) and the
1000 variable would be pointing to already-freed memory. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001001#define SETLOCAL(i, value) do { PyObject *tmp = GETLOCAL(i); \
Stefan Krahb7e10102010-06-23 18:42:39 +00001002 GETLOCAL(i) = value; \
1003 Py_XDECREF(tmp); } while (0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00001004
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001005
1006#define UNWIND_BLOCK(b) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001007 while (STACK_LEVEL() > (b)->b_level) { \
1008 PyObject *v = POP(); \
1009 Py_XDECREF(v); \
1010 }
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001011
1012#define UNWIND_EXCEPT_HANDLER(b) \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001013 do { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001014 PyObject *type, *value, *traceback; \
Mark Shannonae3087c2017-10-22 22:41:51 +01001015 _PyErr_StackItem *exc_info; \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001016 assert(STACK_LEVEL() >= (b)->b_level + 3); \
1017 while (STACK_LEVEL() > (b)->b_level + 3) { \
1018 value = POP(); \
1019 Py_XDECREF(value); \
1020 } \
Mark Shannonae3087c2017-10-22 22:41:51 +01001021 exc_info = tstate->exc_info; \
1022 type = exc_info->exc_type; \
1023 value = exc_info->exc_value; \
1024 traceback = exc_info->exc_traceback; \
1025 exc_info->exc_type = POP(); \
1026 exc_info->exc_value = POP(); \
1027 exc_info->exc_traceback = POP(); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001028 Py_XDECREF(type); \
1029 Py_XDECREF(value); \
1030 Py_XDECREF(traceback); \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001031 } while(0)
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001032
Inada Naoki91234a12019-06-03 21:30:58 +09001033 /* macros for opcode cache */
1034#define OPCACHE_CHECK() \
1035 do { \
1036 co_opcache = NULL; \
1037 if (co->co_opcache != NULL) { \
1038 unsigned char co_opt_offset = \
1039 co->co_opcache_map[next_instr - first_instr]; \
1040 if (co_opt_offset > 0) { \
1041 assert(co_opt_offset <= co->co_opcache_size); \
1042 co_opcache = &co->co_opcache[co_opt_offset - 1]; \
1043 assert(co_opcache != NULL); \
Inada Naoki91234a12019-06-03 21:30:58 +09001044 } \
1045 } \
1046 } while (0)
1047
1048#if OPCACHE_STATS
1049
1050#define OPCACHE_STAT_GLOBAL_HIT() \
1051 do { \
1052 if (co->co_opcache != NULL) opcache_global_hits++; \
1053 } while (0)
1054
1055#define OPCACHE_STAT_GLOBAL_MISS() \
1056 do { \
1057 if (co->co_opcache != NULL) opcache_global_misses++; \
1058 } while (0)
1059
1060#define OPCACHE_STAT_GLOBAL_OPT() \
1061 do { \
1062 if (co->co_opcache != NULL) opcache_global_opts++; \
1063 } while (0)
1064
1065#else /* OPCACHE_STATS */
1066
1067#define OPCACHE_STAT_GLOBAL_HIT()
1068#define OPCACHE_STAT_GLOBAL_MISS()
1069#define OPCACHE_STAT_GLOBAL_OPT()
1070
1071#endif
1072
Guido van Rossuma027efa1997-05-05 20:56:21 +00001073/* Start of code */
1074
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001075 /* push frame */
1076 if (Py_EnterRecursiveCall(""))
1077 return NULL;
Guido van Rossum8861b741996-07-30 16:49:37 +00001078
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001079 tstate->frame = f;
Tim Peters5ca576e2001-06-18 22:08:13 +00001080
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001081 if (tstate->use_tracing) {
1082 if (tstate->c_tracefunc != NULL) {
1083 /* tstate->c_tracefunc, if defined, is a
1084 function that will be called on *every* entry
1085 to a code block. Its return value, if not
1086 None, is a function that will be called at
1087 the start of each executed line of code.
1088 (Actually, the function must return itself
1089 in order to continue tracing.) The trace
1090 functions are called with three arguments:
1091 a pointer to the current frame, a string
1092 indicating why the function is called, and
1093 an argument which depends on the situation.
1094 The global trace function is also called
1095 whenever an exception is detected. */
1096 if (call_trace_protected(tstate->c_tracefunc,
1097 tstate->c_traceobj,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01001098 tstate, f, PyTrace_CALL, Py_None)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001099 /* Trace function raised an error */
1100 goto exit_eval_frame;
1101 }
1102 }
1103 if (tstate->c_profilefunc != NULL) {
1104 /* Similar for c_profilefunc, except it needn't
1105 return itself and isn't called for "line" events */
1106 if (call_trace_protected(tstate->c_profilefunc,
1107 tstate->c_profileobj,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01001108 tstate, f, PyTrace_CALL, Py_None)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001109 /* Profile function raised an error */
1110 goto exit_eval_frame;
1111 }
1112 }
1113 }
Neil Schemenauer6c0f2002001-09-04 19:03:35 +00001114
Łukasz Langaa785c872016-09-09 17:37:37 -07001115 if (PyDTrace_FUNCTION_ENTRY_ENABLED())
1116 dtrace_function_entry(f);
1117
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001118 co = f->f_code;
1119 names = co->co_names;
1120 consts = co->co_consts;
1121 fastlocals = f->f_localsplus;
1122 freevars = f->f_localsplus + co->co_nlocals;
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001123 assert(PyBytes_Check(co->co_code));
1124 assert(PyBytes_GET_SIZE(co->co_code) <= INT_MAX);
Serhiy Storchakaab874002016-09-11 13:48:15 +03001125 assert(PyBytes_GET_SIZE(co->co_code) % sizeof(_Py_CODEUNIT) == 0);
1126 assert(_Py_IS_ALIGNED(PyBytes_AS_STRING(co->co_code), sizeof(_Py_CODEUNIT)));
1127 first_instr = (_Py_CODEUNIT *) PyBytes_AS_STRING(co->co_code);
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001128 /*
1129 f->f_lasti refers to the index of the last instruction,
1130 unless it's -1 in which case next_instr should be first_instr.
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001131
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001132 YIELD_FROM sets f_lasti to itself, in order to repeatedly yield
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05001133 multiple values.
Thomas Wouters902d6eb2007-01-09 23:18:33 +00001134
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001135 When the PREDICT() macros are enabled, some opcode pairs follow in
1136 direct succession without updating f->f_lasti. A successful
1137 prediction effectively links the two codes together as if they
1138 were a single new opcode; accordingly,f->f_lasti will point to
1139 the first code in the pair (for instance, GET_ITER followed by
1140 FOR_ITER is effectively a single opcode and f->f_lasti will point
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001141 to the beginning of the combined pair.)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001142 */
Serhiy Storchakaab874002016-09-11 13:48:15 +03001143 assert(f->f_lasti >= -1);
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001144 next_instr = first_instr;
1145 if (f->f_lasti >= 0) {
Serhiy Storchakaab874002016-09-11 13:48:15 +03001146 assert(f->f_lasti % sizeof(_Py_CODEUNIT) == 0);
1147 next_instr += f->f_lasti / sizeof(_Py_CODEUNIT) + 1;
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001148 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001149 stack_pointer = f->f_stacktop;
1150 assert(stack_pointer != NULL);
1151 f->f_stacktop = NULL; /* remains NULL unless yield suspends frame */
Antoine Pitrou58720d62013-08-05 23:26:40 +02001152 f->f_executing = 1;
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001153
Inada Naoki91234a12019-06-03 21:30:58 +09001154 if (co->co_opcache_flag < OPCACHE_MIN_RUNS) {
1155 co->co_opcache_flag++;
1156 if (co->co_opcache_flag == OPCACHE_MIN_RUNS) {
1157 if (_PyCode_InitOpcache(co) < 0) {
1158 return NULL;
1159 }
1160#if OPCACHE_STATS
1161 opcache_code_objects_extra_mem +=
1162 PyBytes_Size(co->co_code) / sizeof(_Py_CODEUNIT) +
1163 sizeof(_PyOpcache) * co->co_opcache_size;
1164 opcache_code_objects++;
1165#endif
1166 }
1167 }
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001168
Tim Peters5ca576e2001-06-18 22:08:13 +00001169#ifdef LLTRACE
Victor Stinner3c1e4812012-03-26 22:10:51 +02001170 lltrace = _PyDict_GetItemId(f->f_globals, &PyId___ltrace__) != NULL;
Tim Peters5ca576e2001-06-18 22:08:13 +00001171#endif
Guido van Rossumac7be682001-01-17 15:42:30 +00001172
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001173 if (throwflag) /* support for generator.throw() */
1174 goto error;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001175
Victor Stinnerace47d72013-07-18 01:41:08 +02001176#ifdef Py_DEBUG
1177 /* PyEval_EvalFrameEx() must not be called with an exception set,
Victor Stinnera8cb5152017-01-18 14:12:51 +01001178 because it can clear it (directly or indirectly) and so the
Martin Panter9955a372015-10-07 10:26:23 +00001179 caller loses its exception */
Victor Stinner438a12d2019-05-24 17:01:38 +02001180 assert(!_PyErr_Occurred(tstate));
Victor Stinnerace47d72013-07-18 01:41:08 +02001181#endif
1182
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001183main_loop:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001184 for (;;) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001185 assert(stack_pointer >= f->f_valuestack); /* else underflow */
1186 assert(STACK_LEVEL() <= co->co_stacksize); /* else overflow */
Victor Stinner438a12d2019-05-24 17:01:38 +02001187 assert(!_PyErr_Occurred(tstate));
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001188
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001189 /* Do periodic things. Doing this every time through
1190 the loop would add too much overhead, so we do it
1191 only every Nth instruction. We also do it if
1192 ``pendingcalls_to_do'' is set, i.e. when an asynchronous
1193 event needs attention (e.g. a signal handler or
1194 async I/O handler); see Py_AddPendingCall() and
1195 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +00001196
Eric Snow7bda9de2019-03-08 17:25:54 -07001197 if (_Py_atomic_load_relaxed(eval_breaker)) {
Serhiy Storchaka3f4d90d2018-07-09 15:40:14 +03001198 opcode = _Py_OPCODE(*next_instr);
1199 if (opcode == SETUP_FINALLY ||
1200 opcode == SETUP_WITH ||
1201 opcode == BEFORE_ASYNC_WITH ||
1202 opcode == YIELD_FROM) {
1203 /* Few cases where we skip running signal handlers and other
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07001204 pending calls:
Serhiy Storchaka3f4d90d2018-07-09 15:40:14 +03001205 - If we're about to enter the 'with:'. It will prevent
1206 emitting a resource warning in the common idiom
1207 'with open(path) as file:'.
1208 - If we're about to enter the 'async with:'.
1209 - If we're about to enter the 'try:' of a try/finally (not
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07001210 *very* useful, but might help in some cases and it's
1211 traditional)
1212 - If we're resuming a chain of nested 'yield from' or
1213 'await' calls, then each frame is parked with YIELD_FROM
1214 as its next opcode. If the user hit control-C we want to
1215 wait until we've reached the innermost frame before
1216 running the signal handler and raising KeyboardInterrupt
1217 (see bpo-30039).
1218 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001219 goto fast_next_opcode;
1220 }
Eric Snowfdf282d2019-01-11 14:26:55 -07001221
Victor Stinnere225beb2019-06-03 18:14:24 +02001222 if (_Py_atomic_load_relaxed(&ceval->signals_pending)) {
Victor Stinner09532fe2019-05-10 23:39:09 +02001223 if (handle_signals(runtime) != 0) {
Eric Snowfdf282d2019-01-11 14:26:55 -07001224 goto error;
1225 }
1226 }
Victor Stinnere225beb2019-06-03 18:14:24 +02001227 if (_Py_atomic_load_relaxed(&ceval->pending.calls_to_do)) {
1228 if (make_pending_calls(runtime) != 0) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001229 goto error;
Eric Snowfdf282d2019-01-11 14:26:55 -07001230 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001231 }
Eric Snowfdf282d2019-01-11 14:26:55 -07001232
Victor Stinnere225beb2019-06-03 18:14:24 +02001233 if (_Py_atomic_load_relaxed(&ceval->gil_drop_request)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001234 /* Give another thread a chance */
Victor Stinner09532fe2019-05-10 23:39:09 +02001235 if (_PyThreadState_Swap(&runtime->gilstate, NULL) != tstate) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001236 Py_FatalError("ceval: tstate mix-up");
Victor Stinner09532fe2019-05-10 23:39:09 +02001237 }
Victor Stinnere225beb2019-06-03 18:14:24 +02001238 drop_gil(ceval, tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001239
1240 /* Other threads may run now */
1241
Victor Stinnere225beb2019-06-03 18:14:24 +02001242 take_gil(ceval, tstate);
Benjamin Peterson17548dd2014-06-16 22:59:07 -07001243
1244 /* Check if we should make a quick exit. */
Victor Stinner0fd2c302019-06-04 03:15:09 +02001245 exit_thread_if_finalizing(runtime, tstate);
Benjamin Peterson17548dd2014-06-16 22:59:07 -07001246
Victor Stinner09532fe2019-05-10 23:39:09 +02001247 if (_PyThreadState_Swap(&runtime->gilstate, tstate) != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001248 Py_FatalError("ceval: orphan tstate");
Victor Stinner09532fe2019-05-10 23:39:09 +02001249 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001250 }
1251 /* Check for asynchronous exceptions. */
1252 if (tstate->async_exc != NULL) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001253 PyObject *exc = tstate->async_exc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001254 tstate->async_exc = NULL;
Victor Stinnere225beb2019-06-03 18:14:24 +02001255 UNSIGNAL_ASYNC_EXC(ceval);
Victor Stinner438a12d2019-05-24 17:01:38 +02001256 _PyErr_SetNone(tstate, exc);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001257 Py_DECREF(exc);
1258 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001259 }
1260 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001261
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001262 fast_next_opcode:
1263 f->f_lasti = INSTR_OFFSET();
Guido van Rossumac7be682001-01-17 15:42:30 +00001264
Łukasz Langaa785c872016-09-09 17:37:37 -07001265 if (PyDTrace_LINE_ENABLED())
1266 maybe_dtrace_line(f, &instr_lb, &instr_ub, &instr_prev);
1267
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001268 /* line-by-line tracing support */
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001269
Victor Stinnere225beb2019-06-03 18:14:24 +02001270 if (_Py_TracingPossible(ceval) &&
Benjamin Peterson51f46162013-01-23 08:38:47 -05001271 tstate->c_tracefunc != NULL && !tstate->tracing) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001272 int err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001273 /* see maybe_call_line_trace
1274 for expository comments */
1275 f->f_stacktop = stack_pointer;
Tim Peters8a5c3c72004-04-05 19:36:21 +00001276
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001277 err = maybe_call_line_trace(tstate->c_tracefunc,
1278 tstate->c_traceobj,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01001279 tstate, f,
1280 &instr_lb, &instr_ub, &instr_prev);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001281 /* Reload possibly changed frame fields */
1282 JUMPTO(f->f_lasti);
1283 if (f->f_stacktop != NULL) {
1284 stack_pointer = f->f_stacktop;
1285 f->f_stacktop = NULL;
1286 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001287 if (err)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001288 /* trace function raised an exception */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001289 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001290 }
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001291
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001292 /* Extract opcode and argument */
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001293
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001294 NEXTOPARG();
Stefan Krahb7e10102010-06-23 18:42:39 +00001295 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +00001296#ifdef DYNAMIC_EXECUTION_PROFILE
1297#ifdef DXPAIRS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001298 dxpairs[lastopcode][opcode]++;
1299 lastopcode = opcode;
Guido van Rossum950361c1997-01-24 13:49:28 +00001300#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001301 dxp[opcode]++;
Guido van Rossum950361c1997-01-24 13:49:28 +00001302#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001303
Guido van Rossum96a42c81992-01-12 02:29:51 +00001304#ifdef LLTRACE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001305 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +00001306
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001307 if (lltrace) {
1308 if (HAS_ARG(opcode)) {
1309 printf("%d: %d, %d\n",
1310 f->f_lasti, opcode, oparg);
1311 }
1312 else {
1313 printf("%d: %d\n",
1314 f->f_lasti, opcode);
1315 }
1316 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001317#endif
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001318
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001319 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +00001320
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001321 /* BEWARE!
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001322 It is essential that any operation that fails must goto error
1323 and that all operation that succeed call [FAST_]DISPATCH() ! */
Guido van Rossumac7be682001-01-17 15:42:30 +00001324
Benjamin Petersonddd19492018-09-16 22:38:02 -07001325 case TARGET(NOP): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001326 FAST_DISPATCH();
Benjamin Petersonddd19492018-09-16 22:38:02 -07001327 }
Raymond Hettinger9c18e812004-06-21 16:31:15 +00001328
Benjamin Petersonddd19492018-09-16 22:38:02 -07001329 case TARGET(LOAD_FAST): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001330 PyObject *value = GETLOCAL(oparg);
1331 if (value == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02001332 format_exc_check_arg(tstate, PyExc_UnboundLocalError,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001333 UNBOUNDLOCAL_ERROR_MSG,
1334 PyTuple_GetItem(co->co_varnames, oparg));
1335 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001336 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001337 Py_INCREF(value);
1338 PUSH(value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001339 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001340 }
1341
Benjamin Petersonddd19492018-09-16 22:38:02 -07001342 case TARGET(LOAD_CONST): {
1343 PREDICTED(LOAD_CONST);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001344 PyObject *value = GETITEM(consts, oparg);
1345 Py_INCREF(value);
1346 PUSH(value);
1347 FAST_DISPATCH();
1348 }
Neil Schemenauer63543862002-02-17 19:10:14 +00001349
Benjamin Petersonddd19492018-09-16 22:38:02 -07001350 case TARGET(STORE_FAST): {
1351 PREDICTED(STORE_FAST);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001352 PyObject *value = POP();
1353 SETLOCAL(oparg, value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001354 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001355 }
Neil Schemenauer63543862002-02-17 19:10:14 +00001356
Benjamin Petersonddd19492018-09-16 22:38:02 -07001357 case TARGET(POP_TOP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001358 PyObject *value = POP();
1359 Py_DECREF(value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001360 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001361 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001362
Benjamin Petersonddd19492018-09-16 22:38:02 -07001363 case TARGET(ROT_TWO): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001364 PyObject *top = TOP();
1365 PyObject *second = SECOND();
1366 SET_TOP(second);
1367 SET_SECOND(top);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001368 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001369 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001370
Benjamin Petersonddd19492018-09-16 22:38:02 -07001371 case TARGET(ROT_THREE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001372 PyObject *top = TOP();
1373 PyObject *second = SECOND();
1374 PyObject *third = THIRD();
1375 SET_TOP(second);
1376 SET_SECOND(third);
1377 SET_THIRD(top);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001378 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001379 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001380
Benjamin Petersonddd19492018-09-16 22:38:02 -07001381 case TARGET(ROT_FOUR): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001382 PyObject *top = TOP();
1383 PyObject *second = SECOND();
1384 PyObject *third = THIRD();
1385 PyObject *fourth = FOURTH();
1386 SET_TOP(second);
1387 SET_SECOND(third);
1388 SET_THIRD(fourth);
1389 SET_FOURTH(top);
1390 FAST_DISPATCH();
1391 }
1392
Benjamin Petersonddd19492018-09-16 22:38:02 -07001393 case TARGET(DUP_TOP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001394 PyObject *top = TOP();
1395 Py_INCREF(top);
1396 PUSH(top);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001397 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001398 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001399
Benjamin Petersonddd19492018-09-16 22:38:02 -07001400 case TARGET(DUP_TOP_TWO): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001401 PyObject *top = TOP();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001402 PyObject *second = SECOND();
Benjamin Petersonf208df32012-10-12 11:37:56 -04001403 Py_INCREF(top);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001404 Py_INCREF(second);
costypetrisor8ed317f2018-07-31 20:55:14 +00001405 STACK_GROW(2);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001406 SET_TOP(top);
1407 SET_SECOND(second);
Antoine Pitrou74a69fa2010-09-04 18:43:52 +00001408 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001409 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001410
Benjamin Petersonddd19492018-09-16 22:38:02 -07001411 case TARGET(UNARY_POSITIVE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001412 PyObject *value = TOP();
1413 PyObject *res = PyNumber_Positive(value);
1414 Py_DECREF(value);
1415 SET_TOP(res);
1416 if (res == NULL)
1417 goto error;
1418 DISPATCH();
1419 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001420
Benjamin Petersonddd19492018-09-16 22:38:02 -07001421 case TARGET(UNARY_NEGATIVE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001422 PyObject *value = TOP();
1423 PyObject *res = PyNumber_Negative(value);
1424 Py_DECREF(value);
1425 SET_TOP(res);
1426 if (res == NULL)
1427 goto error;
1428 DISPATCH();
1429 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001430
Benjamin Petersonddd19492018-09-16 22:38:02 -07001431 case TARGET(UNARY_NOT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001432 PyObject *value = TOP();
1433 int err = PyObject_IsTrue(value);
1434 Py_DECREF(value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001435 if (err == 0) {
1436 Py_INCREF(Py_True);
1437 SET_TOP(Py_True);
1438 DISPATCH();
1439 }
1440 else if (err > 0) {
1441 Py_INCREF(Py_False);
1442 SET_TOP(Py_False);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001443 DISPATCH();
1444 }
costypetrisor8ed317f2018-07-31 20:55:14 +00001445 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001446 goto error;
1447 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001448
Benjamin Petersonddd19492018-09-16 22:38:02 -07001449 case TARGET(UNARY_INVERT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001450 PyObject *value = TOP();
1451 PyObject *res = PyNumber_Invert(value);
1452 Py_DECREF(value);
1453 SET_TOP(res);
1454 if (res == NULL)
1455 goto error;
1456 DISPATCH();
1457 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001458
Benjamin Petersonddd19492018-09-16 22:38:02 -07001459 case TARGET(BINARY_POWER): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001460 PyObject *exp = POP();
1461 PyObject *base = TOP();
1462 PyObject *res = PyNumber_Power(base, exp, Py_None);
1463 Py_DECREF(base);
1464 Py_DECREF(exp);
1465 SET_TOP(res);
1466 if (res == NULL)
1467 goto error;
1468 DISPATCH();
1469 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001470
Benjamin Petersonddd19492018-09-16 22:38:02 -07001471 case TARGET(BINARY_MULTIPLY): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001472 PyObject *right = POP();
1473 PyObject *left = TOP();
1474 PyObject *res = PyNumber_Multiply(left, right);
1475 Py_DECREF(left);
1476 Py_DECREF(right);
1477 SET_TOP(res);
1478 if (res == NULL)
1479 goto error;
1480 DISPATCH();
1481 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001482
Benjamin Petersonddd19492018-09-16 22:38:02 -07001483 case TARGET(BINARY_MATRIX_MULTIPLY): {
Benjamin Petersond51374e2014-04-09 23:55:56 -04001484 PyObject *right = POP();
1485 PyObject *left = TOP();
1486 PyObject *res = PyNumber_MatrixMultiply(left, right);
1487 Py_DECREF(left);
1488 Py_DECREF(right);
1489 SET_TOP(res);
1490 if (res == NULL)
1491 goto error;
1492 DISPATCH();
1493 }
1494
Benjamin Petersonddd19492018-09-16 22:38:02 -07001495 case TARGET(BINARY_TRUE_DIVIDE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001496 PyObject *divisor = POP();
1497 PyObject *dividend = TOP();
1498 PyObject *quotient = PyNumber_TrueDivide(dividend, divisor);
1499 Py_DECREF(dividend);
1500 Py_DECREF(divisor);
1501 SET_TOP(quotient);
1502 if (quotient == NULL)
1503 goto error;
1504 DISPATCH();
1505 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001506
Benjamin Petersonddd19492018-09-16 22:38:02 -07001507 case TARGET(BINARY_FLOOR_DIVIDE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001508 PyObject *divisor = POP();
1509 PyObject *dividend = TOP();
1510 PyObject *quotient = PyNumber_FloorDivide(dividend, divisor);
1511 Py_DECREF(dividend);
1512 Py_DECREF(divisor);
1513 SET_TOP(quotient);
1514 if (quotient == NULL)
1515 goto error;
1516 DISPATCH();
1517 }
Guido van Rossum4668b002001-08-08 05:00:18 +00001518
Benjamin Petersonddd19492018-09-16 22:38:02 -07001519 case TARGET(BINARY_MODULO): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001520 PyObject *divisor = POP();
1521 PyObject *dividend = TOP();
Martijn Pietersd7e64332017-02-23 13:38:04 +00001522 PyObject *res;
1523 if (PyUnicode_CheckExact(dividend) && (
1524 !PyUnicode_Check(divisor) || PyUnicode_CheckExact(divisor))) {
1525 // fast path; string formatting, but not if the RHS is a str subclass
1526 // (see issue28598)
1527 res = PyUnicode_Format(dividend, divisor);
1528 } else {
1529 res = PyNumber_Remainder(dividend, divisor);
1530 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001531 Py_DECREF(divisor);
1532 Py_DECREF(dividend);
1533 SET_TOP(res);
1534 if (res == NULL)
1535 goto error;
1536 DISPATCH();
1537 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001538
Benjamin Petersonddd19492018-09-16 22:38:02 -07001539 case TARGET(BINARY_ADD): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001540 PyObject *right = POP();
1541 PyObject *left = TOP();
1542 PyObject *sum;
Victor Stinnerd65f42a2016-10-20 12:18:10 +02001543 /* NOTE(haypo): Please don't try to micro-optimize int+int on
1544 CPython using bytecode, it is simply worthless.
1545 See http://bugs.python.org/issue21955 and
1546 http://bugs.python.org/issue10044 for the discussion. In short,
1547 no patch shown any impact on a realistic benchmark, only a minor
1548 speedup on microbenchmarks. */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001549 if (PyUnicode_CheckExact(left) &&
1550 PyUnicode_CheckExact(right)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02001551 sum = unicode_concatenate(tstate, left, right, f, next_instr);
Martin Panter95f53c12016-07-18 08:23:26 +00001552 /* unicode_concatenate consumed the ref to left */
Victor Stinnerd2a915d2011-10-02 20:34:20 +02001553 }
1554 else {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001555 sum = PyNumber_Add(left, right);
1556 Py_DECREF(left);
Victor Stinnerd2a915d2011-10-02 20:34:20 +02001557 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001558 Py_DECREF(right);
1559 SET_TOP(sum);
1560 if (sum == NULL)
1561 goto error;
1562 DISPATCH();
1563 }
1564
Benjamin Petersonddd19492018-09-16 22:38:02 -07001565 case TARGET(BINARY_SUBTRACT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001566 PyObject *right = POP();
1567 PyObject *left = TOP();
1568 PyObject *diff = PyNumber_Subtract(left, right);
1569 Py_DECREF(right);
1570 Py_DECREF(left);
1571 SET_TOP(diff);
1572 if (diff == NULL)
1573 goto error;
1574 DISPATCH();
1575 }
1576
Benjamin Petersonddd19492018-09-16 22:38:02 -07001577 case TARGET(BINARY_SUBSCR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001578 PyObject *sub = POP();
1579 PyObject *container = TOP();
1580 PyObject *res = PyObject_GetItem(container, sub);
1581 Py_DECREF(container);
1582 Py_DECREF(sub);
1583 SET_TOP(res);
1584 if (res == NULL)
1585 goto error;
1586 DISPATCH();
1587 }
1588
Benjamin Petersonddd19492018-09-16 22:38:02 -07001589 case TARGET(BINARY_LSHIFT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001590 PyObject *right = POP();
1591 PyObject *left = TOP();
1592 PyObject *res = PyNumber_Lshift(left, right);
1593 Py_DECREF(left);
1594 Py_DECREF(right);
1595 SET_TOP(res);
1596 if (res == NULL)
1597 goto error;
1598 DISPATCH();
1599 }
1600
Benjamin Petersonddd19492018-09-16 22:38:02 -07001601 case TARGET(BINARY_RSHIFT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001602 PyObject *right = POP();
1603 PyObject *left = TOP();
1604 PyObject *res = PyNumber_Rshift(left, right);
1605 Py_DECREF(left);
1606 Py_DECREF(right);
1607 SET_TOP(res);
1608 if (res == NULL)
1609 goto error;
1610 DISPATCH();
1611 }
1612
Benjamin Petersonddd19492018-09-16 22:38:02 -07001613 case TARGET(BINARY_AND): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001614 PyObject *right = POP();
1615 PyObject *left = TOP();
1616 PyObject *res = PyNumber_And(left, right);
1617 Py_DECREF(left);
1618 Py_DECREF(right);
1619 SET_TOP(res);
1620 if (res == NULL)
1621 goto error;
1622 DISPATCH();
1623 }
1624
Benjamin Petersonddd19492018-09-16 22:38:02 -07001625 case TARGET(BINARY_XOR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001626 PyObject *right = POP();
1627 PyObject *left = TOP();
1628 PyObject *res = PyNumber_Xor(left, right);
1629 Py_DECREF(left);
1630 Py_DECREF(right);
1631 SET_TOP(res);
1632 if (res == NULL)
1633 goto error;
1634 DISPATCH();
1635 }
1636
Benjamin Petersonddd19492018-09-16 22:38:02 -07001637 case TARGET(BINARY_OR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001638 PyObject *right = POP();
1639 PyObject *left = TOP();
1640 PyObject *res = PyNumber_Or(left, right);
1641 Py_DECREF(left);
1642 Py_DECREF(right);
1643 SET_TOP(res);
1644 if (res == NULL)
1645 goto error;
1646 DISPATCH();
1647 }
1648
Benjamin Petersonddd19492018-09-16 22:38:02 -07001649 case TARGET(LIST_APPEND): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001650 PyObject *v = POP();
1651 PyObject *list = PEEK(oparg);
1652 int err;
1653 err = PyList_Append(list, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001654 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001655 if (err != 0)
1656 goto error;
1657 PREDICT(JUMP_ABSOLUTE);
1658 DISPATCH();
1659 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001660
Benjamin Petersonddd19492018-09-16 22:38:02 -07001661 case TARGET(SET_ADD): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001662 PyObject *v = POP();
Raymond Hettinger41862222016-10-15 19:03:06 -07001663 PyObject *set = PEEK(oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001664 int err;
1665 err = PySet_Add(set, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001666 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001667 if (err != 0)
1668 goto error;
1669 PREDICT(JUMP_ABSOLUTE);
1670 DISPATCH();
1671 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001672
Benjamin Petersonddd19492018-09-16 22:38:02 -07001673 case TARGET(INPLACE_POWER): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001674 PyObject *exp = POP();
1675 PyObject *base = TOP();
1676 PyObject *res = PyNumber_InPlacePower(base, exp, Py_None);
1677 Py_DECREF(base);
1678 Py_DECREF(exp);
1679 SET_TOP(res);
1680 if (res == NULL)
1681 goto error;
1682 DISPATCH();
1683 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001684
Benjamin Petersonddd19492018-09-16 22:38:02 -07001685 case TARGET(INPLACE_MULTIPLY): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001686 PyObject *right = POP();
1687 PyObject *left = TOP();
1688 PyObject *res = PyNumber_InPlaceMultiply(left, right);
1689 Py_DECREF(left);
1690 Py_DECREF(right);
1691 SET_TOP(res);
1692 if (res == NULL)
1693 goto error;
1694 DISPATCH();
1695 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001696
Benjamin Petersonddd19492018-09-16 22:38:02 -07001697 case TARGET(INPLACE_MATRIX_MULTIPLY): {
Benjamin Petersond51374e2014-04-09 23:55:56 -04001698 PyObject *right = POP();
1699 PyObject *left = TOP();
1700 PyObject *res = PyNumber_InPlaceMatrixMultiply(left, right);
1701 Py_DECREF(left);
1702 Py_DECREF(right);
1703 SET_TOP(res);
1704 if (res == NULL)
1705 goto error;
1706 DISPATCH();
1707 }
1708
Benjamin Petersonddd19492018-09-16 22:38:02 -07001709 case TARGET(INPLACE_TRUE_DIVIDE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001710 PyObject *divisor = POP();
1711 PyObject *dividend = TOP();
1712 PyObject *quotient = PyNumber_InPlaceTrueDivide(dividend, divisor);
1713 Py_DECREF(dividend);
1714 Py_DECREF(divisor);
1715 SET_TOP(quotient);
1716 if (quotient == NULL)
1717 goto error;
1718 DISPATCH();
1719 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001720
Benjamin Petersonddd19492018-09-16 22:38:02 -07001721 case TARGET(INPLACE_FLOOR_DIVIDE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001722 PyObject *divisor = POP();
1723 PyObject *dividend = TOP();
1724 PyObject *quotient = PyNumber_InPlaceFloorDivide(dividend, divisor);
1725 Py_DECREF(dividend);
1726 Py_DECREF(divisor);
1727 SET_TOP(quotient);
1728 if (quotient == NULL)
1729 goto error;
1730 DISPATCH();
1731 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001732
Benjamin Petersonddd19492018-09-16 22:38:02 -07001733 case TARGET(INPLACE_MODULO): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001734 PyObject *right = POP();
1735 PyObject *left = TOP();
1736 PyObject *mod = PyNumber_InPlaceRemainder(left, right);
1737 Py_DECREF(left);
1738 Py_DECREF(right);
1739 SET_TOP(mod);
1740 if (mod == NULL)
1741 goto error;
1742 DISPATCH();
1743 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001744
Benjamin Petersonddd19492018-09-16 22:38:02 -07001745 case TARGET(INPLACE_ADD): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001746 PyObject *right = POP();
1747 PyObject *left = TOP();
1748 PyObject *sum;
1749 if (PyUnicode_CheckExact(left) && PyUnicode_CheckExact(right)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02001750 sum = unicode_concatenate(tstate, left, right, f, next_instr);
Martin Panter95f53c12016-07-18 08:23:26 +00001751 /* unicode_concatenate consumed the ref to left */
Victor Stinnerd2a915d2011-10-02 20:34:20 +02001752 }
1753 else {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001754 sum = PyNumber_InPlaceAdd(left, right);
1755 Py_DECREF(left);
Victor Stinnerd2a915d2011-10-02 20:34:20 +02001756 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001757 Py_DECREF(right);
1758 SET_TOP(sum);
1759 if (sum == NULL)
1760 goto error;
1761 DISPATCH();
1762 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001763
Benjamin Petersonddd19492018-09-16 22:38:02 -07001764 case TARGET(INPLACE_SUBTRACT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001765 PyObject *right = POP();
1766 PyObject *left = TOP();
1767 PyObject *diff = PyNumber_InPlaceSubtract(left, right);
1768 Py_DECREF(left);
1769 Py_DECREF(right);
1770 SET_TOP(diff);
1771 if (diff == NULL)
1772 goto error;
1773 DISPATCH();
1774 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001775
Benjamin Petersonddd19492018-09-16 22:38:02 -07001776 case TARGET(INPLACE_LSHIFT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001777 PyObject *right = POP();
1778 PyObject *left = TOP();
1779 PyObject *res = PyNumber_InPlaceLshift(left, right);
1780 Py_DECREF(left);
1781 Py_DECREF(right);
1782 SET_TOP(res);
1783 if (res == NULL)
1784 goto error;
1785 DISPATCH();
1786 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001787
Benjamin Petersonddd19492018-09-16 22:38:02 -07001788 case TARGET(INPLACE_RSHIFT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001789 PyObject *right = POP();
1790 PyObject *left = TOP();
1791 PyObject *res = PyNumber_InPlaceRshift(left, right);
1792 Py_DECREF(left);
1793 Py_DECREF(right);
1794 SET_TOP(res);
1795 if (res == NULL)
1796 goto error;
1797 DISPATCH();
1798 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001799
Benjamin Petersonddd19492018-09-16 22:38:02 -07001800 case TARGET(INPLACE_AND): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001801 PyObject *right = POP();
1802 PyObject *left = TOP();
1803 PyObject *res = PyNumber_InPlaceAnd(left, right);
1804 Py_DECREF(left);
1805 Py_DECREF(right);
1806 SET_TOP(res);
1807 if (res == NULL)
1808 goto error;
1809 DISPATCH();
1810 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001811
Benjamin Petersonddd19492018-09-16 22:38:02 -07001812 case TARGET(INPLACE_XOR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001813 PyObject *right = POP();
1814 PyObject *left = TOP();
1815 PyObject *res = PyNumber_InPlaceXor(left, right);
1816 Py_DECREF(left);
1817 Py_DECREF(right);
1818 SET_TOP(res);
1819 if (res == NULL)
1820 goto error;
1821 DISPATCH();
1822 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001823
Benjamin Petersonddd19492018-09-16 22:38:02 -07001824 case TARGET(INPLACE_OR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001825 PyObject *right = POP();
1826 PyObject *left = TOP();
1827 PyObject *res = PyNumber_InPlaceOr(left, right);
1828 Py_DECREF(left);
1829 Py_DECREF(right);
1830 SET_TOP(res);
1831 if (res == NULL)
1832 goto error;
1833 DISPATCH();
1834 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001835
Benjamin Petersonddd19492018-09-16 22:38:02 -07001836 case TARGET(STORE_SUBSCR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001837 PyObject *sub = TOP();
1838 PyObject *container = SECOND();
1839 PyObject *v = THIRD();
1840 int err;
costypetrisor8ed317f2018-07-31 20:55:14 +00001841 STACK_SHRINK(3);
Martin Panter95f53c12016-07-18 08:23:26 +00001842 /* container[sub] = v */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001843 err = PyObject_SetItem(container, sub, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001844 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001845 Py_DECREF(container);
1846 Py_DECREF(sub);
1847 if (err != 0)
1848 goto error;
1849 DISPATCH();
1850 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001851
Benjamin Petersonddd19492018-09-16 22:38:02 -07001852 case TARGET(DELETE_SUBSCR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001853 PyObject *sub = TOP();
1854 PyObject *container = SECOND();
1855 int err;
costypetrisor8ed317f2018-07-31 20:55:14 +00001856 STACK_SHRINK(2);
Martin Panter95f53c12016-07-18 08:23:26 +00001857 /* del container[sub] */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001858 err = PyObject_DelItem(container, sub);
1859 Py_DECREF(container);
1860 Py_DECREF(sub);
1861 if (err != 0)
1862 goto error;
1863 DISPATCH();
1864 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001865
Benjamin Petersonddd19492018-09-16 22:38:02 -07001866 case TARGET(PRINT_EXPR): {
Victor Stinnercab75e32013-11-06 22:38:37 +01001867 _Py_IDENTIFIER(displayhook);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001868 PyObject *value = POP();
Victor Stinnercab75e32013-11-06 22:38:37 +01001869 PyObject *hook = _PySys_GetObjectId(&PyId_displayhook);
Benjamin Petersonfe1bcb62012-10-12 11:40:01 -04001870 PyObject *res;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001871 if (hook == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02001872 _PyErr_SetString(tstate, PyExc_RuntimeError,
1873 "lost sys.displayhook");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001874 Py_DECREF(value);
1875 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001876 }
Jeroen Demeyer196a5302019-07-04 12:31:34 +02001877 res = _PyObject_CallOneArg(hook, value);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001878 Py_DECREF(value);
1879 if (res == NULL)
1880 goto error;
1881 Py_DECREF(res);
1882 DISPATCH();
1883 }
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001884
Benjamin Petersonddd19492018-09-16 22:38:02 -07001885 case TARGET(RAISE_VARARGS): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001886 PyObject *cause = NULL, *exc = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001887 switch (oparg) {
1888 case 2:
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001889 cause = POP(); /* cause */
Stefan Krahf432a322017-08-21 13:09:59 +02001890 /* fall through */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001891 case 1:
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001892 exc = POP(); /* exc */
Stefan Krahf432a322017-08-21 13:09:59 +02001893 /* fall through */
1894 case 0:
Victor Stinner09532fe2019-05-10 23:39:09 +02001895 if (do_raise(tstate, exc, cause)) {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001896 goto exception_unwind;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001897 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001898 break;
1899 default:
Victor Stinner438a12d2019-05-24 17:01:38 +02001900 _PyErr_SetString(tstate, PyExc_SystemError,
1901 "bad RAISE_VARARGS oparg");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001902 break;
1903 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001904 goto error;
1905 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001906
Benjamin Petersonddd19492018-09-16 22:38:02 -07001907 case TARGET(RETURN_VALUE): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001908 retval = POP();
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001909 assert(f->f_iblock == 0);
Pablo Galindof00828a2019-05-09 16:52:02 +01001910 goto exit_returning;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001911 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001912
Benjamin Petersonddd19492018-09-16 22:38:02 -07001913 case TARGET(GET_AITER): {
Yury Selivanov6ef05902015-05-28 11:21:31 -04001914 unaryfunc getter = NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04001915 PyObject *iter = NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04001916 PyObject *obj = TOP();
1917 PyTypeObject *type = Py_TYPE(obj);
1918
Yury Selivanova6f6edb2016-06-09 15:08:31 -04001919 if (type->tp_as_async != NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04001920 getter = type->tp_as_async->am_aiter;
Yury Selivanova6f6edb2016-06-09 15:08:31 -04001921 }
Yury Selivanov75445082015-05-11 22:57:16 -04001922
1923 if (getter != NULL) {
1924 iter = (*getter)(obj);
1925 Py_DECREF(obj);
1926 if (iter == NULL) {
1927 SET_TOP(NULL);
1928 goto error;
1929 }
1930 }
1931 else {
1932 SET_TOP(NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02001933 _PyErr_Format(tstate, PyExc_TypeError,
1934 "'async for' requires an object with "
1935 "__aiter__ method, got %.100s",
1936 type->tp_name);
Yury Selivanov75445082015-05-11 22:57:16 -04001937 Py_DECREF(obj);
1938 goto error;
1939 }
1940
Yury Selivanovfaa135a2017-10-06 02:08:57 -04001941 if (Py_TYPE(iter)->tp_as_async == NULL ||
1942 Py_TYPE(iter)->tp_as_async->am_anext == NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04001943
Yury Selivanov398ff912017-03-02 22:20:00 -05001944 SET_TOP(NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02001945 _PyErr_Format(tstate, PyExc_TypeError,
1946 "'async for' received an object from __aiter__ "
1947 "that does not implement __anext__: %.100s",
1948 Py_TYPE(iter)->tp_name);
Yury Selivanov75445082015-05-11 22:57:16 -04001949 Py_DECREF(iter);
1950 goto error;
Yury Selivanova6f6edb2016-06-09 15:08:31 -04001951 }
1952
Yury Selivanovfaa135a2017-10-06 02:08:57 -04001953 SET_TOP(iter);
Yury Selivanov75445082015-05-11 22:57:16 -04001954 DISPATCH();
1955 }
1956
Benjamin Petersonddd19492018-09-16 22:38:02 -07001957 case TARGET(GET_ANEXT): {
Yury Selivanov6ef05902015-05-28 11:21:31 -04001958 unaryfunc getter = NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04001959 PyObject *next_iter = NULL;
1960 PyObject *awaitable = NULL;
1961 PyObject *aiter = TOP();
1962 PyTypeObject *type = Py_TYPE(aiter);
1963
Yury Selivanoveb636452016-09-08 22:01:51 -07001964 if (PyAsyncGen_CheckExact(aiter)) {
1965 awaitable = type->tp_as_async->am_anext(aiter);
1966 if (awaitable == NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04001967 goto error;
1968 }
Yury Selivanoveb636452016-09-08 22:01:51 -07001969 } else {
1970 if (type->tp_as_async != NULL){
1971 getter = type->tp_as_async->am_anext;
1972 }
Yury Selivanov75445082015-05-11 22:57:16 -04001973
Yury Selivanoveb636452016-09-08 22:01:51 -07001974 if (getter != NULL) {
1975 next_iter = (*getter)(aiter);
1976 if (next_iter == NULL) {
1977 goto error;
1978 }
1979 }
1980 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02001981 _PyErr_Format(tstate, PyExc_TypeError,
1982 "'async for' requires an iterator with "
1983 "__anext__ method, got %.100s",
1984 type->tp_name);
Yury Selivanoveb636452016-09-08 22:01:51 -07001985 goto error;
1986 }
Yury Selivanov75445082015-05-11 22:57:16 -04001987
Yury Selivanoveb636452016-09-08 22:01:51 -07001988 awaitable = _PyCoro_GetAwaitableIter(next_iter);
1989 if (awaitable == NULL) {
Yury Selivanov398ff912017-03-02 22:20:00 -05001990 _PyErr_FormatFromCause(
Yury Selivanoveb636452016-09-08 22:01:51 -07001991 PyExc_TypeError,
1992 "'async for' received an invalid object "
1993 "from __anext__: %.100s",
1994 Py_TYPE(next_iter)->tp_name);
1995
1996 Py_DECREF(next_iter);
1997 goto error;
1998 } else {
1999 Py_DECREF(next_iter);
2000 }
2001 }
Yury Selivanov75445082015-05-11 22:57:16 -04002002
2003 PUSH(awaitable);
Serhiy Storchakada9c5132016-06-27 18:58:57 +03002004 PREDICT(LOAD_CONST);
Yury Selivanov75445082015-05-11 22:57:16 -04002005 DISPATCH();
2006 }
2007
Benjamin Petersonddd19492018-09-16 22:38:02 -07002008 case TARGET(GET_AWAITABLE): {
2009 PREDICTED(GET_AWAITABLE);
Yury Selivanov75445082015-05-11 22:57:16 -04002010 PyObject *iterable = TOP();
Yury Selivanov5376ba92015-06-22 12:19:30 -04002011 PyObject *iter = _PyCoro_GetAwaitableIter(iterable);
Yury Selivanov75445082015-05-11 22:57:16 -04002012
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03002013 if (iter == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002014 format_awaitable_error(tstate, Py_TYPE(iterable),
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03002015 _Py_OPCODE(next_instr[-2]));
2016 }
2017
Yury Selivanov75445082015-05-11 22:57:16 -04002018 Py_DECREF(iterable);
2019
Yury Selivanovc724bae2016-03-02 11:30:46 -05002020 if (iter != NULL && PyCoro_CheckExact(iter)) {
2021 PyObject *yf = _PyGen_yf((PyGenObject*)iter);
2022 if (yf != NULL) {
2023 /* `iter` is a coroutine object that is being
2024 awaited, `yf` is a pointer to the current awaitable
2025 being awaited on. */
2026 Py_DECREF(yf);
2027 Py_CLEAR(iter);
Victor Stinner438a12d2019-05-24 17:01:38 +02002028 _PyErr_SetString(tstate, PyExc_RuntimeError,
2029 "coroutine is being awaited already");
Yury Selivanovc724bae2016-03-02 11:30:46 -05002030 /* The code below jumps to `error` if `iter` is NULL. */
2031 }
2032 }
2033
Yury Selivanov75445082015-05-11 22:57:16 -04002034 SET_TOP(iter); /* Even if it's NULL */
2035
2036 if (iter == NULL) {
2037 goto error;
2038 }
2039
Serhiy Storchakada9c5132016-06-27 18:58:57 +03002040 PREDICT(LOAD_CONST);
Yury Selivanov75445082015-05-11 22:57:16 -04002041 DISPATCH();
2042 }
2043
Benjamin Petersonddd19492018-09-16 22:38:02 -07002044 case TARGET(YIELD_FROM): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002045 PyObject *v = POP();
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07002046 PyObject *receiver = TOP();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002047 int err;
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07002048 if (PyGen_CheckExact(receiver) || PyCoro_CheckExact(receiver)) {
2049 retval = _PyGen_Send((PyGenObject *)receiver, v);
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05002050 } else {
Benjamin Peterson302e7902012-03-20 23:17:04 -04002051 _Py_IDENTIFIER(send);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002052 if (v == Py_None)
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07002053 retval = Py_TYPE(receiver)->tp_iternext(receiver);
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05002054 else
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07002055 retval = _PyObject_CallMethodIdObjArgs(receiver, &PyId_send, v, NULL);
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05002056 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002057 Py_DECREF(v);
2058 if (retval == NULL) {
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05002059 PyObject *val;
Guido van Rossum8820c232013-11-21 11:30:06 -08002060 if (tstate->c_tracefunc != NULL
Victor Stinner438a12d2019-05-24 17:01:38 +02002061 && _PyErr_ExceptionMatches(tstate, PyExc_StopIteration))
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01002062 call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj, tstate, f);
Nick Coghlanc40bc092012-06-17 15:15:49 +10002063 err = _PyGen_FetchStopIterationValue(&val);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002064 if (err < 0)
2065 goto error;
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07002066 Py_DECREF(receiver);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002067 SET_TOP(val);
2068 DISPATCH();
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002069 }
Martin Panter95f53c12016-07-18 08:23:26 +00002070 /* receiver remains on stack, retval is value to be yielded */
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002071 f->f_stacktop = stack_pointer;
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05002072 /* and repeat... */
Victor Stinnerf7d199f2016-11-24 22:33:01 +01002073 assert(f->f_lasti >= (int)sizeof(_Py_CODEUNIT));
Serhiy Storchakaab874002016-09-11 13:48:15 +03002074 f->f_lasti -= sizeof(_Py_CODEUNIT);
Pablo Galindof00828a2019-05-09 16:52:02 +01002075 goto exit_yielding;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002076 }
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002077
Benjamin Petersonddd19492018-09-16 22:38:02 -07002078 case TARGET(YIELD_VALUE): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002079 retval = POP();
Yury Selivanoveb636452016-09-08 22:01:51 -07002080
2081 if (co->co_flags & CO_ASYNC_GENERATOR) {
2082 PyObject *w = _PyAsyncGenValueWrapperNew(retval);
2083 Py_DECREF(retval);
2084 if (w == NULL) {
2085 retval = NULL;
2086 goto error;
2087 }
2088 retval = w;
2089 }
2090
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002091 f->f_stacktop = stack_pointer;
Pablo Galindof00828a2019-05-09 16:52:02 +01002092 goto exit_yielding;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002093 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002094
Benjamin Petersonddd19492018-09-16 22:38:02 -07002095 case TARGET(POP_EXCEPT): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002096 PyObject *type, *value, *traceback;
2097 _PyErr_StackItem *exc_info;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002098 PyTryBlock *b = PyFrame_BlockPop(f);
2099 if (b->b_type != EXCEPT_HANDLER) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002100 _PyErr_SetString(tstate, PyExc_SystemError,
2101 "popped block is not an except handler");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002102 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002103 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002104 assert(STACK_LEVEL() >= (b)->b_level + 3 &&
2105 STACK_LEVEL() <= (b)->b_level + 4);
2106 exc_info = tstate->exc_info;
2107 type = exc_info->exc_type;
2108 value = exc_info->exc_value;
2109 traceback = exc_info->exc_traceback;
2110 exc_info->exc_type = POP();
2111 exc_info->exc_value = POP();
2112 exc_info->exc_traceback = POP();
2113 Py_XDECREF(type);
2114 Py_XDECREF(value);
2115 Py_XDECREF(traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002116 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002117 }
Benjamin Petersoneec3d712008-06-11 15:59:43 +00002118
Benjamin Petersonddd19492018-09-16 22:38:02 -07002119 case TARGET(POP_BLOCK): {
2120 PREDICTED(POP_BLOCK);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002121 PyFrame_BlockPop(f);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002122 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002123 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002124
Benjamin Petersonddd19492018-09-16 22:38:02 -07002125 case TARGET(POP_FINALLY): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002126 /* If oparg is 0 at the top of the stack are 1 or 6 values:
2127 Either:
2128 - TOP = NULL or an integer
2129 or:
2130 - (TOP, SECOND, THIRD) = exc_info()
2131 - (FOURTH, FITH, SIXTH) = previous exception for EXCEPT_HANDLER
2132
2133 If oparg is 1 the value for 'return' was additionally pushed
2134 at the top of the stack.
2135 */
2136 PyObject *res = NULL;
2137 if (oparg) {
2138 res = POP();
2139 }
2140 PyObject *exc = POP();
2141 if (exc == NULL || PyLong_CheckExact(exc)) {
2142 Py_XDECREF(exc);
2143 }
2144 else {
2145 Py_DECREF(exc);
2146 Py_DECREF(POP());
2147 Py_DECREF(POP());
2148
2149 PyObject *type, *value, *traceback;
2150 _PyErr_StackItem *exc_info;
2151 PyTryBlock *b = PyFrame_BlockPop(f);
2152 if (b->b_type != EXCEPT_HANDLER) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002153 _PyErr_SetString(tstate, PyExc_SystemError,
2154 "popped block is not an except handler");
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002155 Py_XDECREF(res);
2156 goto error;
2157 }
2158 assert(STACK_LEVEL() == (b)->b_level + 3);
2159 exc_info = tstate->exc_info;
2160 type = exc_info->exc_type;
2161 value = exc_info->exc_value;
2162 traceback = exc_info->exc_traceback;
2163 exc_info->exc_type = POP();
2164 exc_info->exc_value = POP();
2165 exc_info->exc_traceback = POP();
2166 Py_XDECREF(type);
2167 Py_XDECREF(value);
2168 Py_XDECREF(traceback);
2169 }
2170 if (oparg) {
2171 PUSH(res);
2172 }
2173 DISPATCH();
2174 }
2175
Benjamin Petersonddd19492018-09-16 22:38:02 -07002176 case TARGET(CALL_FINALLY): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002177 PyObject *ret = PyLong_FromLong(INSTR_OFFSET());
2178 if (ret == NULL) {
2179 goto error;
2180 }
2181 PUSH(ret);
2182 JUMPBY(oparg);
2183 FAST_DISPATCH();
2184 }
2185
Benjamin Petersonddd19492018-09-16 22:38:02 -07002186 case TARGET(BEGIN_FINALLY): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002187 /* Push NULL onto the stack for using it in END_FINALLY,
2188 POP_FINALLY, WITH_CLEANUP_START and WITH_CLEANUP_FINISH.
2189 */
2190 PUSH(NULL);
2191 FAST_DISPATCH();
2192 }
2193
Benjamin Petersonddd19492018-09-16 22:38:02 -07002194 case TARGET(END_FINALLY): {
2195 PREDICTED(END_FINALLY);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002196 /* At the top of the stack are 1 or 6 values:
2197 Either:
2198 - TOP = NULL or an integer
2199 or:
2200 - (TOP, SECOND, THIRD) = exc_info()
2201 - (FOURTH, FITH, SIXTH) = previous exception for EXCEPT_HANDLER
2202 */
2203 PyObject *exc = POP();
2204 if (exc == NULL) {
2205 FAST_DISPATCH();
2206 }
2207 else if (PyLong_CheckExact(exc)) {
2208 int ret = _PyLong_AsInt(exc);
2209 Py_DECREF(exc);
Victor Stinner438a12d2019-05-24 17:01:38 +02002210 if (ret == -1 && _PyErr_Occurred(tstate)) {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002211 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002212 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002213 JUMPTO(ret);
2214 FAST_DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002215 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002216 else {
2217 assert(PyExceptionClass_Check(exc));
2218 PyObject *val = POP();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002219 PyObject *tb = POP();
Victor Stinner438a12d2019-05-24 17:01:38 +02002220 _PyErr_Restore(tstate, exc, val, tb);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002221 goto exception_unwind;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002222 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002223 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002224
Benjamin Petersonddd19492018-09-16 22:38:02 -07002225 case TARGET(END_ASYNC_FOR): {
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002226 PyObject *exc = POP();
2227 assert(PyExceptionClass_Check(exc));
2228 if (PyErr_GivenExceptionMatches(exc, PyExc_StopAsyncIteration)) {
2229 PyTryBlock *b = PyFrame_BlockPop(f);
2230 assert(b->b_type == EXCEPT_HANDLER);
2231 Py_DECREF(exc);
2232 UNWIND_EXCEPT_HANDLER(b);
2233 Py_DECREF(POP());
2234 JUMPBY(oparg);
2235 FAST_DISPATCH();
2236 }
2237 else {
2238 PyObject *val = POP();
2239 PyObject *tb = POP();
Victor Stinner438a12d2019-05-24 17:01:38 +02002240 _PyErr_Restore(tstate, exc, val, tb);
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002241 goto exception_unwind;
2242 }
2243 }
2244
Benjamin Petersonddd19492018-09-16 22:38:02 -07002245 case TARGET(LOAD_BUILD_CLASS): {
Victor Stinner3c1e4812012-03-26 22:10:51 +02002246 _Py_IDENTIFIER(__build_class__);
Victor Stinnerb0b22422012-04-19 00:57:45 +02002247
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002248 PyObject *bc;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002249 if (PyDict_CheckExact(f->f_builtins)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002250 bc = _PyDict_GetItemIdWithError(f->f_builtins, &PyId___build_class__);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002251 if (bc == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002252 if (!_PyErr_Occurred(tstate)) {
2253 _PyErr_SetString(tstate, PyExc_NameError,
2254 "__build_class__ not found");
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002255 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002256 goto error;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002257 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002258 Py_INCREF(bc);
Victor Stinnerb0b22422012-04-19 00:57:45 +02002259 }
2260 else {
2261 PyObject *build_class_str = _PyUnicode_FromId(&PyId___build_class__);
2262 if (build_class_str == NULL)
Serhiy Storchaka70b72f02016-11-08 23:12:46 +02002263 goto error;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002264 bc = PyObject_GetItem(f->f_builtins, build_class_str);
2265 if (bc == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002266 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError))
2267 _PyErr_SetString(tstate, PyExc_NameError,
2268 "__build_class__ not found");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002269 goto error;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002270 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002271 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002272 PUSH(bc);
Benjamin Peterson00f86f22012-10-10 14:10:33 -04002273 DISPATCH();
Victor Stinner3c1e4812012-03-26 22:10:51 +02002274 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002275
Benjamin Petersonddd19492018-09-16 22:38:02 -07002276 case TARGET(STORE_NAME): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002277 PyObject *name = GETITEM(names, oparg);
2278 PyObject *v = POP();
2279 PyObject *ns = f->f_locals;
2280 int err;
2281 if (ns == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002282 _PyErr_Format(tstate, PyExc_SystemError,
2283 "no locals found when storing %R", name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002284 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002285 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002286 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002287 if (PyDict_CheckExact(ns))
2288 err = PyDict_SetItem(ns, name, v);
2289 else
2290 err = PyObject_SetItem(ns, name, v);
2291 Py_DECREF(v);
2292 if (err != 0)
2293 goto error;
2294 DISPATCH();
2295 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002296
Benjamin Petersonddd19492018-09-16 22:38:02 -07002297 case TARGET(DELETE_NAME): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002298 PyObject *name = GETITEM(names, oparg);
2299 PyObject *ns = f->f_locals;
2300 int err;
2301 if (ns == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002302 _PyErr_Format(tstate, PyExc_SystemError,
2303 "no locals when deleting %R", name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002304 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002305 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002306 err = PyObject_DelItem(ns, name);
2307 if (err != 0) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002308 format_exc_check_arg(tstate, PyExc_NameError,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002309 NAME_ERROR_MSG,
2310 name);
2311 goto error;
2312 }
2313 DISPATCH();
2314 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00002315
Benjamin Petersonddd19492018-09-16 22:38:02 -07002316 case TARGET(UNPACK_SEQUENCE): {
2317 PREDICTED(UNPACK_SEQUENCE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002318 PyObject *seq = POP(), *item, **items;
2319 if (PyTuple_CheckExact(seq) &&
2320 PyTuple_GET_SIZE(seq) == oparg) {
2321 items = ((PyTupleObject *)seq)->ob_item;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002322 while (oparg--) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002323 item = items[oparg];
2324 Py_INCREF(item);
2325 PUSH(item);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002326 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002327 } else if (PyList_CheckExact(seq) &&
2328 PyList_GET_SIZE(seq) == oparg) {
2329 items = ((PyListObject *)seq)->ob_item;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002330 while (oparg--) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002331 item = items[oparg];
2332 Py_INCREF(item);
2333 PUSH(item);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002334 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002335 } else if (unpack_iterable(tstate, seq, oparg, -1,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002336 stack_pointer + oparg)) {
costypetrisor8ed317f2018-07-31 20:55:14 +00002337 STACK_GROW(oparg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002338 } else {
2339 /* unpack_iterable() raised an exception */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002340 Py_DECREF(seq);
2341 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002342 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002343 Py_DECREF(seq);
Benjamin Peterson00f86f22012-10-10 14:10:33 -04002344 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002345 }
Guido van Rossum0368b722007-05-11 16:50:42 +00002346
Benjamin Petersonddd19492018-09-16 22:38:02 -07002347 case TARGET(UNPACK_EX): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002348 int totalargs = 1 + (oparg & 0xFF) + (oparg >> 8);
2349 PyObject *seq = POP();
2350
Victor Stinner438a12d2019-05-24 17:01:38 +02002351 if (unpack_iterable(tstate, seq, oparg & 0xFF, oparg >> 8,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002352 stack_pointer + totalargs)) {
2353 stack_pointer += totalargs;
2354 } else {
2355 Py_DECREF(seq);
2356 goto error;
2357 }
2358 Py_DECREF(seq);
2359 DISPATCH();
2360 }
2361
Benjamin Petersonddd19492018-09-16 22:38:02 -07002362 case TARGET(STORE_ATTR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002363 PyObject *name = GETITEM(names, oparg);
2364 PyObject *owner = TOP();
2365 PyObject *v = SECOND();
2366 int err;
costypetrisor8ed317f2018-07-31 20:55:14 +00002367 STACK_SHRINK(2);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002368 err = PyObject_SetAttr(owner, name, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002369 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002370 Py_DECREF(owner);
2371 if (err != 0)
2372 goto error;
2373 DISPATCH();
2374 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002375
Benjamin Petersonddd19492018-09-16 22:38:02 -07002376 case TARGET(DELETE_ATTR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002377 PyObject *name = GETITEM(names, oparg);
2378 PyObject *owner = POP();
2379 int err;
2380 err = PyObject_SetAttr(owner, name, (PyObject *)NULL);
2381 Py_DECREF(owner);
2382 if (err != 0)
2383 goto error;
2384 DISPATCH();
2385 }
2386
Benjamin Petersonddd19492018-09-16 22:38:02 -07002387 case TARGET(STORE_GLOBAL): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002388 PyObject *name = GETITEM(names, oparg);
2389 PyObject *v = POP();
2390 int err;
2391 err = PyDict_SetItem(f->f_globals, name, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002392 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002393 if (err != 0)
2394 goto error;
2395 DISPATCH();
2396 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002397
Benjamin Petersonddd19492018-09-16 22:38:02 -07002398 case TARGET(DELETE_GLOBAL): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002399 PyObject *name = GETITEM(names, oparg);
2400 int err;
2401 err = PyDict_DelItem(f->f_globals, name);
2402 if (err != 0) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002403 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
2404 format_exc_check_arg(tstate, PyExc_NameError,
2405 NAME_ERROR_MSG, name);
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002406 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002407 goto error;
Benjamin Peterson00f86f22012-10-10 14:10:33 -04002408 }
2409 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002410 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002411
Benjamin Petersonddd19492018-09-16 22:38:02 -07002412 case TARGET(LOAD_NAME): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002413 PyObject *name = GETITEM(names, oparg);
2414 PyObject *locals = f->f_locals;
2415 PyObject *v;
2416 if (locals == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002417 _PyErr_Format(tstate, PyExc_SystemError,
2418 "no locals when loading %R", name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002419 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002420 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002421 if (PyDict_CheckExact(locals)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002422 v = PyDict_GetItemWithError(locals, name);
2423 if (v != NULL) {
2424 Py_INCREF(v);
2425 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002426 else if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002427 goto error;
2428 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002429 }
2430 else {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002431 v = PyObject_GetItem(locals, name);
Victor Stinnere20310f2015-11-05 13:56:58 +01002432 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002433 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError))
Benjamin Peterson92722792012-12-15 12:51:05 -05002434 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02002435 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002436 }
2437 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002438 if (v == NULL) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002439 v = PyDict_GetItemWithError(f->f_globals, name);
2440 if (v != NULL) {
2441 Py_INCREF(v);
2442 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002443 else if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002444 goto error;
2445 }
2446 else {
Victor Stinnerb0b22422012-04-19 00:57:45 +02002447 if (PyDict_CheckExact(f->f_builtins)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002448 v = PyDict_GetItemWithError(f->f_builtins, name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002449 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002450 if (!_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002451 format_exc_check_arg(
Victor Stinner438a12d2019-05-24 17:01:38 +02002452 tstate, PyExc_NameError,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002453 NAME_ERROR_MSG, name);
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002454 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002455 goto error;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002456 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002457 Py_INCREF(v);
Victor Stinnerb0b22422012-04-19 00:57:45 +02002458 }
2459 else {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002460 v = PyObject_GetItem(f->f_builtins, name);
2461 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002462 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Victor Stinnerb0b22422012-04-19 00:57:45 +02002463 format_exc_check_arg(
Victor Stinner438a12d2019-05-24 17:01:38 +02002464 tstate, PyExc_NameError,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002465 NAME_ERROR_MSG, name);
Victor Stinner438a12d2019-05-24 17:01:38 +02002466 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002467 goto error;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002468 }
Benjamin Peterson20f9c3c2010-07-20 22:39:34 +00002469 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002470 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002471 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002472 PUSH(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002473 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002474 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002475
Benjamin Petersonddd19492018-09-16 22:38:02 -07002476 case TARGET(LOAD_GLOBAL): {
Inada Naoki91234a12019-06-03 21:30:58 +09002477 PyObject *name;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002478 PyObject *v;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002479 if (PyDict_CheckExact(f->f_globals)
Victor Stinnerb4efc962015-11-20 09:24:02 +01002480 && PyDict_CheckExact(f->f_builtins))
2481 {
Inada Naoki91234a12019-06-03 21:30:58 +09002482 OPCACHE_CHECK();
2483 if (co_opcache != NULL && co_opcache->optimized > 0) {
2484 _PyOpcache_LoadGlobal *lg = &co_opcache->u.lg;
2485
2486 if (lg->globals_ver ==
2487 ((PyDictObject *)f->f_globals)->ma_version_tag
2488 && lg->builtins_ver ==
2489 ((PyDictObject *)f->f_builtins)->ma_version_tag)
2490 {
2491 PyObject *ptr = lg->ptr;
2492 OPCACHE_STAT_GLOBAL_HIT();
2493 assert(ptr != NULL);
2494 Py_INCREF(ptr);
2495 PUSH(ptr);
2496 DISPATCH();
2497 }
2498 }
2499
2500 name = GETITEM(names, oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002501 v = _PyDict_LoadGlobal((PyDictObject *)f->f_globals,
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002502 (PyDictObject *)f->f_builtins,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002503 name);
2504 if (v == NULL) {
Victor Stinnerb4efc962015-11-20 09:24:02 +01002505 if (!_PyErr_OCCURRED()) {
2506 /* _PyDict_LoadGlobal() returns NULL without raising
2507 * an exception if the key doesn't exist */
Victor Stinner438a12d2019-05-24 17:01:38 +02002508 format_exc_check_arg(tstate, PyExc_NameError,
Ezio Melotti04a29552013-03-03 15:12:44 +02002509 NAME_ERROR_MSG, name);
Victor Stinnerb4efc962015-11-20 09:24:02 +01002510 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002511 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002512 }
Inada Naoki91234a12019-06-03 21:30:58 +09002513
2514 if (co_opcache != NULL) {
2515 _PyOpcache_LoadGlobal *lg = &co_opcache->u.lg;
2516
2517 if (co_opcache->optimized == 0) {
2518 /* Wasn't optimized before. */
2519 OPCACHE_STAT_GLOBAL_OPT();
2520 } else {
2521 OPCACHE_STAT_GLOBAL_MISS();
2522 }
2523
2524 co_opcache->optimized = 1;
2525 lg->globals_ver =
2526 ((PyDictObject *)f->f_globals)->ma_version_tag;
2527 lg->builtins_ver =
2528 ((PyDictObject *)f->f_builtins)->ma_version_tag;
2529 lg->ptr = v; /* borrowed */
2530 }
2531
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002532 Py_INCREF(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002533 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002534 else {
2535 /* Slow-path if globals or builtins is not a dict */
Victor Stinnerb4efc962015-11-20 09:24:02 +01002536
2537 /* namespace 1: globals */
Inada Naoki91234a12019-06-03 21:30:58 +09002538 name = GETITEM(names, oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002539 v = PyObject_GetItem(f->f_globals, name);
2540 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002541 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Victor Stinner60a1d3c2015-11-05 13:55:20 +01002542 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02002543 }
2544 _PyErr_Clear(tstate);
Victor Stinner60a1d3c2015-11-05 13:55:20 +01002545
Victor Stinnerb4efc962015-11-20 09:24:02 +01002546 /* namespace 2: builtins */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002547 v = PyObject_GetItem(f->f_builtins, name);
2548 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002549 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002550 format_exc_check_arg(
Victor Stinner438a12d2019-05-24 17:01:38 +02002551 tstate, PyExc_NameError,
Ezio Melotti04a29552013-03-03 15:12:44 +02002552 NAME_ERROR_MSG, name);
Victor Stinner438a12d2019-05-24 17:01:38 +02002553 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002554 goto error;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002555 }
2556 }
2557 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002558 PUSH(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002559 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002560 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002561
Benjamin Petersonddd19492018-09-16 22:38:02 -07002562 case TARGET(DELETE_FAST): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002563 PyObject *v = GETLOCAL(oparg);
2564 if (v != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002565 SETLOCAL(oparg, NULL);
2566 DISPATCH();
2567 }
2568 format_exc_check_arg(
Victor Stinner438a12d2019-05-24 17:01:38 +02002569 tstate, PyExc_UnboundLocalError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002570 UNBOUNDLOCAL_ERROR_MSG,
2571 PyTuple_GetItem(co->co_varnames, oparg)
2572 );
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002573 goto error;
2574 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002575
Benjamin Petersonddd19492018-09-16 22:38:02 -07002576 case TARGET(DELETE_DEREF): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002577 PyObject *cell = freevars[oparg];
Raymond Hettingerc32f9db2016-11-12 04:10:35 -05002578 PyObject *oldobj = PyCell_GET(cell);
2579 if (oldobj != NULL) {
2580 PyCell_SET(cell, NULL);
2581 Py_DECREF(oldobj);
Benjamin Peterson00ebe2c2010-09-10 22:02:31 +00002582 DISPATCH();
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00002583 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002584 format_exc_unbound(tstate, co, oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002585 goto error;
2586 }
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00002587
Benjamin Petersonddd19492018-09-16 22:38:02 -07002588 case TARGET(LOAD_CLOSURE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002589 PyObject *cell = freevars[oparg];
2590 Py_INCREF(cell);
2591 PUSH(cell);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002592 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002593 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002594
Benjamin Petersonddd19492018-09-16 22:38:02 -07002595 case TARGET(LOAD_CLASSDEREF): {
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002596 PyObject *name, *value, *locals = f->f_locals;
Victor Stinnerd3dfd0e2013-05-16 23:48:01 +02002597 Py_ssize_t idx;
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002598 assert(locals);
2599 assert(oparg >= PyTuple_GET_SIZE(co->co_cellvars));
2600 idx = oparg - PyTuple_GET_SIZE(co->co_cellvars);
2601 assert(idx >= 0 && idx < PyTuple_GET_SIZE(co->co_freevars));
2602 name = PyTuple_GET_ITEM(co->co_freevars, idx);
2603 if (PyDict_CheckExact(locals)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002604 value = PyDict_GetItemWithError(locals, name);
2605 if (value != NULL) {
2606 Py_INCREF(value);
2607 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002608 else if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002609 goto error;
2610 }
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002611 }
2612 else {
2613 value = PyObject_GetItem(locals, name);
Victor Stinnere20310f2015-11-05 13:56:58 +01002614 if (value == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002615 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002616 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02002617 }
2618 _PyErr_Clear(tstate);
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002619 }
2620 }
2621 if (!value) {
2622 PyObject *cell = freevars[oparg];
2623 value = PyCell_GET(cell);
2624 if (value == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002625 format_exc_unbound(tstate, co, oparg);
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002626 goto error;
2627 }
2628 Py_INCREF(value);
2629 }
2630 PUSH(value);
2631 DISPATCH();
2632 }
2633
Benjamin Petersonddd19492018-09-16 22:38:02 -07002634 case TARGET(LOAD_DEREF): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002635 PyObject *cell = freevars[oparg];
2636 PyObject *value = PyCell_GET(cell);
2637 if (value == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002638 format_exc_unbound(tstate, co, oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002639 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002640 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002641 Py_INCREF(value);
2642 PUSH(value);
2643 DISPATCH();
2644 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002645
Benjamin Petersonddd19492018-09-16 22:38:02 -07002646 case TARGET(STORE_DEREF): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002647 PyObject *v = POP();
2648 PyObject *cell = freevars[oparg];
Raymond Hettingerb2b15432016-11-11 04:32:11 -08002649 PyObject *oldobj = PyCell_GET(cell);
2650 PyCell_SET(cell, v);
2651 Py_XDECREF(oldobj);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002652 DISPATCH();
2653 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002654
Benjamin Petersonddd19492018-09-16 22:38:02 -07002655 case TARGET(BUILD_STRING): {
Serhiy Storchakaea525a22016-09-06 22:07:53 +03002656 PyObject *str;
2657 PyObject *empty = PyUnicode_New(0, 0);
2658 if (empty == NULL) {
2659 goto error;
2660 }
2661 str = _PyUnicode_JoinArray(empty, stack_pointer - oparg, oparg);
2662 Py_DECREF(empty);
2663 if (str == NULL)
2664 goto error;
2665 while (--oparg >= 0) {
2666 PyObject *item = POP();
2667 Py_DECREF(item);
2668 }
2669 PUSH(str);
2670 DISPATCH();
2671 }
2672
Benjamin Petersonddd19492018-09-16 22:38:02 -07002673 case TARGET(BUILD_TUPLE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002674 PyObject *tup = PyTuple_New(oparg);
2675 if (tup == NULL)
2676 goto error;
2677 while (--oparg >= 0) {
2678 PyObject *item = POP();
2679 PyTuple_SET_ITEM(tup, oparg, item);
2680 }
2681 PUSH(tup);
2682 DISPATCH();
2683 }
2684
Benjamin Petersonddd19492018-09-16 22:38:02 -07002685 case TARGET(BUILD_LIST): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002686 PyObject *list = PyList_New(oparg);
2687 if (list == NULL)
2688 goto error;
2689 while (--oparg >= 0) {
2690 PyObject *item = POP();
2691 PyList_SET_ITEM(list, oparg, item);
2692 }
2693 PUSH(list);
2694 DISPATCH();
2695 }
2696
Benjamin Petersonddd19492018-09-16 22:38:02 -07002697 case TARGET(BUILD_TUPLE_UNPACK_WITH_CALL):
2698 case TARGET(BUILD_TUPLE_UNPACK):
2699 case TARGET(BUILD_LIST_UNPACK): {
Serhiy Storchaka73442852016-10-02 10:33:46 +03002700 int convert_to_tuple = opcode != BUILD_LIST_UNPACK;
Victor Stinner74319ae2016-08-25 00:04:09 +02002701 Py_ssize_t i;
Serhiy Storchakab7281052016-09-12 00:52:40 +03002702 PyObject *sum = PyList_New(0);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002703 PyObject *return_value;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07002704
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002705 if (sum == NULL)
2706 goto error;
2707
2708 for (i = oparg; i > 0; i--) {
2709 PyObject *none_val;
2710
2711 none_val = _PyList_Extend((PyListObject *)sum, PEEK(i));
2712 if (none_val == NULL) {
Serhiy Storchaka73442852016-10-02 10:33:46 +03002713 if (opcode == BUILD_TUPLE_UNPACK_WITH_CALL &&
Victor Stinner438a12d2019-05-24 17:01:38 +02002714 _PyErr_ExceptionMatches(tstate, PyExc_TypeError))
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03002715 {
Victor Stinner438a12d2019-05-24 17:01:38 +02002716 check_args_iterable(tstate, PEEK(1 + oparg), PEEK(i));
Serhiy Storchaka73442852016-10-02 10:33:46 +03002717 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002718 Py_DECREF(sum);
2719 goto error;
2720 }
2721 Py_DECREF(none_val);
2722 }
2723
2724 if (convert_to_tuple) {
2725 return_value = PyList_AsTuple(sum);
2726 Py_DECREF(sum);
2727 if (return_value == NULL)
2728 goto error;
2729 }
2730 else {
2731 return_value = sum;
2732 }
2733
2734 while (oparg--)
2735 Py_DECREF(POP());
2736 PUSH(return_value);
2737 DISPATCH();
2738 }
2739
Benjamin Petersonddd19492018-09-16 22:38:02 -07002740 case TARGET(BUILD_SET): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002741 PyObject *set = PySet_New(NULL);
2742 int err = 0;
Raymond Hettinger4c483ad2016-09-08 14:45:40 -07002743 int i;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002744 if (set == NULL)
2745 goto error;
Raymond Hettinger4c483ad2016-09-08 14:45:40 -07002746 for (i = oparg; i > 0; i--) {
2747 PyObject *item = PEEK(i);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002748 if (err == 0)
2749 err = PySet_Add(set, item);
2750 Py_DECREF(item);
2751 }
costypetrisor8ed317f2018-07-31 20:55:14 +00002752 STACK_SHRINK(oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002753 if (err != 0) {
2754 Py_DECREF(set);
2755 goto error;
2756 }
2757 PUSH(set);
2758 DISPATCH();
2759 }
2760
Benjamin Petersonddd19492018-09-16 22:38:02 -07002761 case TARGET(BUILD_SET_UNPACK): {
Victor Stinner74319ae2016-08-25 00:04:09 +02002762 Py_ssize_t i;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002763 PyObject *sum = PySet_New(NULL);
2764 if (sum == NULL)
2765 goto error;
2766
2767 for (i = oparg; i > 0; i--) {
2768 if (_PySet_Update(sum, PEEK(i)) < 0) {
2769 Py_DECREF(sum);
2770 goto error;
2771 }
2772 }
2773
2774 while (oparg--)
2775 Py_DECREF(POP());
2776 PUSH(sum);
2777 DISPATCH();
2778 }
2779
Benjamin Petersonddd19492018-09-16 22:38:02 -07002780 case TARGET(BUILD_MAP): {
Victor Stinner74319ae2016-08-25 00:04:09 +02002781 Py_ssize_t i;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002782 PyObject *map = _PyDict_NewPresized((Py_ssize_t)oparg);
2783 if (map == NULL)
2784 goto error;
Benjamin Petersond5d77aa2015-07-05 10:37:25 -05002785 for (i = oparg; i > 0; i--) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002786 int err;
Benjamin Petersond5d77aa2015-07-05 10:37:25 -05002787 PyObject *key = PEEK(2*i);
2788 PyObject *value = PEEK(2*i - 1);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002789 err = PyDict_SetItem(map, key, value);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002790 if (err != 0) {
2791 Py_DECREF(map);
2792 goto error;
2793 }
2794 }
Benjamin Petersond5d77aa2015-07-05 10:37:25 -05002795
2796 while (oparg--) {
2797 Py_DECREF(POP());
2798 Py_DECREF(POP());
2799 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002800 PUSH(map);
2801 DISPATCH();
2802 }
2803
Benjamin Petersonddd19492018-09-16 22:38:02 -07002804 case TARGET(SETUP_ANNOTATIONS): {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002805 _Py_IDENTIFIER(__annotations__);
2806 int err;
2807 PyObject *ann_dict;
2808 if (f->f_locals == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002809 _PyErr_Format(tstate, PyExc_SystemError,
2810 "no locals found when setting up annotations");
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002811 goto error;
2812 }
2813 /* check if __annotations__ in locals()... */
2814 if (PyDict_CheckExact(f->f_locals)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002815 ann_dict = _PyDict_GetItemIdWithError(f->f_locals,
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002816 &PyId___annotations__);
2817 if (ann_dict == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002818 if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002819 goto error;
2820 }
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002821 /* ...if not, create a new one */
2822 ann_dict = PyDict_New();
2823 if (ann_dict == NULL) {
2824 goto error;
2825 }
2826 err = _PyDict_SetItemId(f->f_locals,
2827 &PyId___annotations__, ann_dict);
2828 Py_DECREF(ann_dict);
2829 if (err != 0) {
2830 goto error;
2831 }
2832 }
2833 }
2834 else {
2835 /* do the same if locals() is not a dict */
2836 PyObject *ann_str = _PyUnicode_FromId(&PyId___annotations__);
2837 if (ann_str == NULL) {
Serhiy Storchaka4678b2f2016-11-08 23:13:36 +02002838 goto error;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002839 }
2840 ann_dict = PyObject_GetItem(f->f_locals, ann_str);
2841 if (ann_dict == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002842 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002843 goto error;
2844 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002845 _PyErr_Clear(tstate);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002846 ann_dict = PyDict_New();
2847 if (ann_dict == NULL) {
2848 goto error;
2849 }
2850 err = PyObject_SetItem(f->f_locals, ann_str, ann_dict);
2851 Py_DECREF(ann_dict);
2852 if (err != 0) {
2853 goto error;
2854 }
2855 }
2856 else {
2857 Py_DECREF(ann_dict);
2858 }
2859 }
2860 DISPATCH();
2861 }
2862
Benjamin Petersonddd19492018-09-16 22:38:02 -07002863 case TARGET(BUILD_CONST_KEY_MAP): {
Victor Stinner74319ae2016-08-25 00:04:09 +02002864 Py_ssize_t i;
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03002865 PyObject *map;
2866 PyObject *keys = TOP();
2867 if (!PyTuple_CheckExact(keys) ||
2868 PyTuple_GET_SIZE(keys) != (Py_ssize_t)oparg) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002869 _PyErr_SetString(tstate, PyExc_SystemError,
2870 "bad BUILD_CONST_KEY_MAP keys argument");
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03002871 goto error;
2872 }
2873 map = _PyDict_NewPresized((Py_ssize_t)oparg);
2874 if (map == NULL) {
2875 goto error;
2876 }
2877 for (i = oparg; i > 0; i--) {
2878 int err;
2879 PyObject *key = PyTuple_GET_ITEM(keys, oparg - i);
2880 PyObject *value = PEEK(i + 1);
2881 err = PyDict_SetItem(map, key, value);
2882 if (err != 0) {
2883 Py_DECREF(map);
2884 goto error;
2885 }
2886 }
2887
2888 Py_DECREF(POP());
2889 while (oparg--) {
2890 Py_DECREF(POP());
2891 }
2892 PUSH(map);
2893 DISPATCH();
2894 }
2895
Benjamin Petersonddd19492018-09-16 22:38:02 -07002896 case TARGET(BUILD_MAP_UNPACK): {
Victor Stinner74319ae2016-08-25 00:04:09 +02002897 Py_ssize_t i;
Serhiy Storchakab7281052016-09-12 00:52:40 +03002898 PyObject *sum = PyDict_New();
Victor Stinnerf9b760f2016-09-09 10:17:08 -07002899 if (sum == NULL)
2900 goto error;
2901
2902 for (i = oparg; i > 0; i--) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002903 PyObject *arg = PEEK(i);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002904 if (PyDict_Update(sum, arg) < 0) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002905 if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) {
2906 _PyErr_Format(tstate, PyExc_TypeError,
2907 "'%.200s' object is not a mapping",
2908 arg->ob_type->tp_name);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002909 }
2910 Py_DECREF(sum);
2911 goto error;
2912 }
2913 }
2914
Victor Stinnerf9b760f2016-09-09 10:17:08 -07002915 while (oparg--)
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002916 Py_DECREF(POP());
2917 PUSH(sum);
2918 DISPATCH();
2919 }
2920
Benjamin Petersonddd19492018-09-16 22:38:02 -07002921 case TARGET(BUILD_MAP_UNPACK_WITH_CALL): {
Serhiy Storchakae036ef82016-10-02 11:06:43 +03002922 Py_ssize_t i;
2923 PyObject *sum = PyDict_New();
2924 if (sum == NULL)
2925 goto error;
2926
2927 for (i = oparg; i > 0; i--) {
2928 PyObject *arg = PEEK(i);
2929 if (_PyDict_MergeEx(sum, arg, 2) < 0) {
Serhiy Storchakae036ef82016-10-02 11:06:43 +03002930 Py_DECREF(sum);
Victor Stinner438a12d2019-05-24 17:01:38 +02002931 format_kwargs_error(tstate, PEEK(2 + oparg), arg);
Serhiy Storchakae036ef82016-10-02 11:06:43 +03002932 goto error;
2933 }
2934 }
2935
2936 while (oparg--)
2937 Py_DECREF(POP());
2938 PUSH(sum);
2939 DISPATCH();
2940 }
2941
Benjamin Petersonddd19492018-09-16 22:38:02 -07002942 case TARGET(MAP_ADD): {
Jörn Heisslerc8a35412019-06-22 16:40:55 +02002943 PyObject *value = TOP();
2944 PyObject *key = SECOND();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002945 PyObject *map;
2946 int err;
costypetrisor8ed317f2018-07-31 20:55:14 +00002947 STACK_SHRINK(2);
Raymond Hettinger41862222016-10-15 19:03:06 -07002948 map = PEEK(oparg); /* dict */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002949 assert(PyDict_CheckExact(map));
Martin Panter95f53c12016-07-18 08:23:26 +00002950 err = PyDict_SetItem(map, key, value); /* map[key] = value */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002951 Py_DECREF(value);
2952 Py_DECREF(key);
2953 if (err != 0)
2954 goto error;
2955 PREDICT(JUMP_ABSOLUTE);
2956 DISPATCH();
2957 }
2958
Benjamin Petersonddd19492018-09-16 22:38:02 -07002959 case TARGET(LOAD_ATTR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002960 PyObject *name = GETITEM(names, oparg);
2961 PyObject *owner = TOP();
2962 PyObject *res = PyObject_GetAttr(owner, name);
2963 Py_DECREF(owner);
2964 SET_TOP(res);
2965 if (res == NULL)
2966 goto error;
2967 DISPATCH();
2968 }
2969
Benjamin Petersonddd19492018-09-16 22:38:02 -07002970 case TARGET(COMPARE_OP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002971 PyObject *right = POP();
2972 PyObject *left = TOP();
Victor Stinner438a12d2019-05-24 17:01:38 +02002973 PyObject *res = cmp_outcome(tstate, oparg, left, right);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002974 Py_DECREF(left);
2975 Py_DECREF(right);
2976 SET_TOP(res);
2977 if (res == NULL)
2978 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002979 PREDICT(POP_JUMP_IF_FALSE);
2980 PREDICT(POP_JUMP_IF_TRUE);
2981 DISPATCH();
Victor Stinner3c1e4812012-03-26 22:10:51 +02002982 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002983
Benjamin Petersonddd19492018-09-16 22:38:02 -07002984 case TARGET(IMPORT_NAME): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002985 PyObject *name = GETITEM(names, oparg);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03002986 PyObject *fromlist = POP();
2987 PyObject *level = TOP();
2988 PyObject *res;
Victor Stinner438a12d2019-05-24 17:01:38 +02002989 res = import_name(tstate, f, name, fromlist, level);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03002990 Py_DECREF(level);
2991 Py_DECREF(fromlist);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002992 SET_TOP(res);
2993 if (res == NULL)
2994 goto error;
2995 DISPATCH();
2996 }
2997
Benjamin Petersonddd19492018-09-16 22:38:02 -07002998 case TARGET(IMPORT_STAR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002999 PyObject *from = POP(), *locals;
3000 int err;
Matthias Bussonnier160edb42017-02-25 21:58:05 -08003001 if (PyFrame_FastToLocalsWithError(f) < 0) {
3002 Py_DECREF(from);
Victor Stinner41bb43a2013-10-29 01:19:37 +01003003 goto error;
Matthias Bussonnier160edb42017-02-25 21:58:05 -08003004 }
Victor Stinner41bb43a2013-10-29 01:19:37 +01003005
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003006 locals = f->f_locals;
3007 if (locals == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003008 _PyErr_SetString(tstate, PyExc_SystemError,
3009 "no locals found during 'import *'");
Matthias Bussonnier160edb42017-02-25 21:58:05 -08003010 Py_DECREF(from);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003011 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003012 }
Victor Stinner438a12d2019-05-24 17:01:38 +02003013 err = import_all_from(tstate, locals, from);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003014 PyFrame_LocalsToFast(f, 0);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003015 Py_DECREF(from);
3016 if (err != 0)
3017 goto error;
3018 DISPATCH();
3019 }
Guido van Rossum25831651993-05-19 14:50:45 +00003020
Benjamin Petersonddd19492018-09-16 22:38:02 -07003021 case TARGET(IMPORT_FROM): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003022 PyObject *name = GETITEM(names, oparg);
3023 PyObject *from = TOP();
3024 PyObject *res;
Victor Stinner438a12d2019-05-24 17:01:38 +02003025 res = import_from(tstate, from, name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003026 PUSH(res);
3027 if (res == NULL)
3028 goto error;
3029 DISPATCH();
3030 }
Thomas Wouters52152252000-08-17 22:55:00 +00003031
Benjamin Petersonddd19492018-09-16 22:38:02 -07003032 case TARGET(JUMP_FORWARD): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003033 JUMPBY(oparg);
3034 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003035 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003036
Benjamin Petersonddd19492018-09-16 22:38:02 -07003037 case TARGET(POP_JUMP_IF_FALSE): {
3038 PREDICTED(POP_JUMP_IF_FALSE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003039 PyObject *cond = POP();
3040 int err;
3041 if (cond == Py_True) {
3042 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003043 FAST_DISPATCH();
3044 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003045 if (cond == Py_False) {
3046 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003047 JUMPTO(oparg);
3048 FAST_DISPATCH();
3049 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003050 err = PyObject_IsTrue(cond);
3051 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003052 if (err > 0)
Adrian Wielgosik50c28502017-06-23 13:35:41 -07003053 ;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003054 else if (err == 0)
3055 JUMPTO(oparg);
3056 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003057 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003058 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003059 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003060
Benjamin Petersonddd19492018-09-16 22:38:02 -07003061 case TARGET(POP_JUMP_IF_TRUE): {
3062 PREDICTED(POP_JUMP_IF_TRUE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003063 PyObject *cond = POP();
3064 int err;
3065 if (cond == Py_False) {
3066 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003067 FAST_DISPATCH();
3068 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003069 if (cond == Py_True) {
3070 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003071 JUMPTO(oparg);
3072 FAST_DISPATCH();
3073 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003074 err = PyObject_IsTrue(cond);
3075 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003076 if (err > 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003077 JUMPTO(oparg);
3078 }
3079 else if (err == 0)
3080 ;
3081 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003082 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003083 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003084 }
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00003085
Benjamin Petersonddd19492018-09-16 22:38:02 -07003086 case TARGET(JUMP_IF_FALSE_OR_POP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003087 PyObject *cond = TOP();
3088 int err;
3089 if (cond == Py_True) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003090 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003091 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003092 FAST_DISPATCH();
3093 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003094 if (cond == Py_False) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003095 JUMPTO(oparg);
3096 FAST_DISPATCH();
3097 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003098 err = PyObject_IsTrue(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003099 if (err > 0) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003100 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003101 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003102 }
3103 else if (err == 0)
3104 JUMPTO(oparg);
3105 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003106 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003107 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003108 }
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00003109
Benjamin Petersonddd19492018-09-16 22:38:02 -07003110 case TARGET(JUMP_IF_TRUE_OR_POP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003111 PyObject *cond = TOP();
3112 int err;
3113 if (cond == Py_False) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003114 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003115 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003116 FAST_DISPATCH();
3117 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003118 if (cond == Py_True) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003119 JUMPTO(oparg);
3120 FAST_DISPATCH();
3121 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003122 err = PyObject_IsTrue(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003123 if (err > 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003124 JUMPTO(oparg);
3125 }
3126 else if (err == 0) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003127 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003128 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003129 }
3130 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003131 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003132 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003133 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003134
Benjamin Petersonddd19492018-09-16 22:38:02 -07003135 case TARGET(JUMP_ABSOLUTE): {
3136 PREDICTED(JUMP_ABSOLUTE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003137 JUMPTO(oparg);
Guido van Rossum58da9312007-11-10 23:39:45 +00003138#if FAST_LOOPS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003139 /* Enabling this path speeds-up all while and for-loops by bypassing
3140 the per-loop checks for signals. By default, this should be turned-off
3141 because it prevents detection of a control-break in tight loops like
3142 "while 1: pass". Compile with this option turned-on when you need
3143 the speed-up and do not need break checking inside tight loops (ones
3144 that contain only instructions ending with FAST_DISPATCH).
3145 */
3146 FAST_DISPATCH();
Guido van Rossum58da9312007-11-10 23:39:45 +00003147#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003148 DISPATCH();
Guido van Rossum58da9312007-11-10 23:39:45 +00003149#endif
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003150 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003151
Benjamin Petersonddd19492018-09-16 22:38:02 -07003152 case TARGET(GET_ITER): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003153 /* before: [obj]; after [getiter(obj)] */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003154 PyObject *iterable = TOP();
Yury Selivanov5376ba92015-06-22 12:19:30 -04003155 PyObject *iter = PyObject_GetIter(iterable);
3156 Py_DECREF(iterable);
3157 SET_TOP(iter);
3158 if (iter == NULL)
3159 goto error;
3160 PREDICT(FOR_ITER);
Serhiy Storchakada9c5132016-06-27 18:58:57 +03003161 PREDICT(CALL_FUNCTION);
Yury Selivanov5376ba92015-06-22 12:19:30 -04003162 DISPATCH();
3163 }
3164
Benjamin Petersonddd19492018-09-16 22:38:02 -07003165 case TARGET(GET_YIELD_FROM_ITER): {
Yury Selivanov5376ba92015-06-22 12:19:30 -04003166 /* before: [obj]; after [getiter(obj)] */
3167 PyObject *iterable = TOP();
Yury Selivanov75445082015-05-11 22:57:16 -04003168 PyObject *iter;
Yury Selivanov5376ba92015-06-22 12:19:30 -04003169 if (PyCoro_CheckExact(iterable)) {
3170 /* `iterable` is a coroutine */
3171 if (!(co->co_flags & (CO_COROUTINE | CO_ITERABLE_COROUTINE))) {
3172 /* and it is used in a 'yield from' expression of a
3173 regular generator. */
3174 Py_DECREF(iterable);
3175 SET_TOP(NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02003176 _PyErr_SetString(tstate, PyExc_TypeError,
3177 "cannot 'yield from' a coroutine object "
3178 "in a non-coroutine generator");
Yury Selivanov5376ba92015-06-22 12:19:30 -04003179 goto error;
3180 }
3181 }
3182 else if (!PyGen_CheckExact(iterable)) {
Yury Selivanov75445082015-05-11 22:57:16 -04003183 /* `iterable` is not a generator. */
3184 iter = PyObject_GetIter(iterable);
3185 Py_DECREF(iterable);
3186 SET_TOP(iter);
3187 if (iter == NULL)
3188 goto error;
3189 }
Serhiy Storchakada9c5132016-06-27 18:58:57 +03003190 PREDICT(LOAD_CONST);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003191 DISPATCH();
3192 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003193
Benjamin Petersonddd19492018-09-16 22:38:02 -07003194 case TARGET(FOR_ITER): {
3195 PREDICTED(FOR_ITER);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003196 /* before: [iter]; after: [iter, iter()] *or* [] */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003197 PyObject *iter = TOP();
3198 PyObject *next = (*iter->ob_type->tp_iternext)(iter);
3199 if (next != NULL) {
3200 PUSH(next);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003201 PREDICT(STORE_FAST);
3202 PREDICT(UNPACK_SEQUENCE);
3203 DISPATCH();
3204 }
Victor Stinner438a12d2019-05-24 17:01:38 +02003205 if (_PyErr_Occurred(tstate)) {
3206 if (!_PyErr_ExceptionMatches(tstate, PyExc_StopIteration)) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003207 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02003208 }
3209 else if (tstate->c_tracefunc != NULL) {
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003210 call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj, tstate, f);
Victor Stinner438a12d2019-05-24 17:01:38 +02003211 }
3212 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003213 }
3214 /* iterator ended normally */
costypetrisor8ed317f2018-07-31 20:55:14 +00003215 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003216 Py_DECREF(iter);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003217 JUMPBY(oparg);
Serhiy Storchakada9c5132016-06-27 18:58:57 +03003218 PREDICT(POP_BLOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003219 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003220 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003221
Benjamin Petersonddd19492018-09-16 22:38:02 -07003222 case TARGET(SETUP_FINALLY): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003223 /* NOTE: If you add any new block-setup opcodes that
3224 are not try/except/finally handlers, you may need
3225 to update the PyGen_NeedsFinalizing() function.
3226 */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003227
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003228 PyFrame_BlockSetup(f, SETUP_FINALLY, INSTR_OFFSET() + oparg,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003229 STACK_LEVEL());
3230 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003231 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003232
Benjamin Petersonddd19492018-09-16 22:38:02 -07003233 case TARGET(BEFORE_ASYNC_WITH): {
Yury Selivanov75445082015-05-11 22:57:16 -04003234 _Py_IDENTIFIER(__aexit__);
3235 _Py_IDENTIFIER(__aenter__);
3236
3237 PyObject *mgr = TOP();
Victor Stinner438a12d2019-05-24 17:01:38 +02003238 PyObject *exit = special_lookup(tstate, mgr, &PyId___aexit__),
Yury Selivanov75445082015-05-11 22:57:16 -04003239 *enter;
3240 PyObject *res;
3241 if (exit == NULL)
3242 goto error;
3243 SET_TOP(exit);
Victor Stinner438a12d2019-05-24 17:01:38 +02003244 enter = special_lookup(tstate, mgr, &PyId___aenter__);
Yury Selivanov75445082015-05-11 22:57:16 -04003245 Py_DECREF(mgr);
3246 if (enter == NULL)
3247 goto error;
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(__exit__);
3269 _Py_IDENTIFIER(__enter__);
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
Benjamin Petersonddd19492018-09-16 22:38:02 -07003296 case TARGET(WITH_CLEANUP_START): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003297 /* At the top of the stack are 1 or 6 values indicating
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003298 how/why we entered the finally clause:
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003299 - TOP = NULL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003300 - (TOP, SECOND, THIRD) = exc_info()
3301 (FOURTH, FITH, SIXTH) = previous exception for EXCEPT_HANDLER
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003302 Below them is EXIT, the context.__exit__ or context.__aexit__
3303 bound method.
3304 In the first case, we must call
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003305 EXIT(None, None, None)
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003306 otherwise we must call
3307 EXIT(TOP, SECOND, THIRD)
Christian Heimesdd15f6c2008-03-16 00:07:10 +00003308
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003309 In the first case, we remove EXIT from the
3310 stack, leaving TOP, and push TOP on the stack.
3311 Otherwise we shift the bottom 3 values of the
3312 stack down, replace the empty spot with NULL, and push
3313 None on the stack.
Guido van Rossum1a5e21e2006-02-28 21:57:43 +00003314
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003315 Finally we push the result of the call.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003316 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003317 PyObject *exit_func;
Victor Stinner842cfff2016-12-01 14:45:31 +01003318 PyObject *exc, *val, *tb, *res;
3319
3320 val = tb = Py_None;
3321 exc = TOP();
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003322 if (exc == NULL) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003323 STACK_SHRINK(1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003324 exit_func = TOP();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003325 SET_TOP(exc);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003326 exc = Py_None;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003327 }
3328 else {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003329 assert(PyExceptionClass_Check(exc));
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003330 PyObject *tp2, *exc2, *tb2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003331 PyTryBlock *block;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003332 val = SECOND();
3333 tb = THIRD();
3334 tp2 = FOURTH();
3335 exc2 = PEEK(5);
3336 tb2 = PEEK(6);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003337 exit_func = PEEK(7);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003338 SET_VALUE(7, tb2);
3339 SET_VALUE(6, exc2);
3340 SET_VALUE(5, tp2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003341 /* UNWIND_EXCEPT_HANDLER will pop this off. */
3342 SET_FOURTH(NULL);
3343 /* We just shifted the stack down, so we have
3344 to tell the except handler block that the
3345 values are lower than it expects. */
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003346 assert(f->f_iblock > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003347 block = &f->f_blockstack[f->f_iblock - 1];
3348 assert(block->b_type == EXCEPT_HANDLER);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003349 assert(block->b_level > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003350 block->b_level--;
3351 }
Victor Stinner842cfff2016-12-01 14:45:31 +01003352
Jeroen Demeyer469d1a72019-07-03 12:52:21 +02003353 PyObject *stack[4] = {NULL, exc, val, tb};
3354 res = _PyObject_Vectorcall(exit_func, stack + 1,
3355 3 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003356 Py_DECREF(exit_func);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003357 if (res == NULL)
3358 goto error;
Amaury Forgeot d'Arc10b24e82008-12-10 23:49:33 +00003359
Nick Coghlanbaaadbf2015-05-13 15:54:02 +10003360 Py_INCREF(exc); /* Duplicating the exception on the stack */
Yury Selivanov75445082015-05-11 22:57:16 -04003361 PUSH(exc);
3362 PUSH(res);
3363 PREDICT(WITH_CLEANUP_FINISH);
3364 DISPATCH();
3365 }
3366
Benjamin Petersonddd19492018-09-16 22:38:02 -07003367 case TARGET(WITH_CLEANUP_FINISH): {
3368 PREDICTED(WITH_CLEANUP_FINISH);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003369 /* TOP = the result of calling the context.__exit__ bound method
3370 SECOND = either None or exception type
3371
3372 If SECOND is None below is NULL or the return address,
3373 otherwise below are 7 values representing an exception.
3374 */
Yury Selivanov75445082015-05-11 22:57:16 -04003375 PyObject *res = POP();
3376 PyObject *exc = POP();
3377 int err;
3378
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003379 if (exc != Py_None)
3380 err = PyObject_IsTrue(res);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003381 else
3382 err = 0;
Yury Selivanov75445082015-05-11 22:57:16 -04003383
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003384 Py_DECREF(res);
Nick Coghlanbaaadbf2015-05-13 15:54:02 +10003385 Py_DECREF(exc);
Amaury Forgeot d'Arc10b24e82008-12-10 23:49:33 +00003386
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003387 if (err < 0)
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003388 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003389 else if (err > 0) {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003390 /* There was an exception and a True return.
3391 * We must manually unwind the EXCEPT_HANDLER block
3392 * which was created when the exception was caught,
Quan Tian3bd0d622018-10-20 05:30:03 +08003393 * otherwise the stack will be in an inconsistent state.
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003394 */
3395 PyTryBlock *b = PyFrame_BlockPop(f);
3396 assert(b->b_type == EXCEPT_HANDLER);
3397 UNWIND_EXCEPT_HANDLER(b);
3398 PUSH(NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003399 }
3400 PREDICT(END_FINALLY);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003401 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003402 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00003403
Benjamin Petersonddd19492018-09-16 22:38:02 -07003404 case TARGET(LOAD_METHOD): {
Andreyb021ba52019-04-29 14:33:26 +10003405 /* Designed to work in tandem with CALL_METHOD. */
Yury Selivanovf2392132016-12-13 19:03:51 -05003406 PyObject *name = GETITEM(names, oparg);
3407 PyObject *obj = TOP();
3408 PyObject *meth = NULL;
3409
3410 int meth_found = _PyObject_GetMethod(obj, name, &meth);
3411
Yury Selivanovf2392132016-12-13 19:03:51 -05003412 if (meth == NULL) {
3413 /* Most likely attribute wasn't found. */
Yury Selivanovf2392132016-12-13 19:03:51 -05003414 goto error;
3415 }
3416
3417 if (meth_found) {
INADA Naoki015bce62017-01-16 17:23:30 +09003418 /* We can bypass temporary bound method object.
3419 meth is unbound method and obj is self.
Victor Stinnera8cb5152017-01-18 14:12:51 +01003420
INADA Naoki015bce62017-01-16 17:23:30 +09003421 meth | self | arg1 | ... | argN
3422 */
3423 SET_TOP(meth);
3424 PUSH(obj); // self
Yury Selivanovf2392132016-12-13 19:03:51 -05003425 }
3426 else {
INADA Naoki015bce62017-01-16 17:23:30 +09003427 /* meth is not an unbound method (but a regular attr, or
3428 something was returned by a descriptor protocol). Set
3429 the second element of the stack to NULL, to signal
Yury Selivanovf2392132016-12-13 19:03:51 -05003430 CALL_METHOD that it's not a method call.
INADA Naoki015bce62017-01-16 17:23:30 +09003431
3432 NULL | meth | arg1 | ... | argN
Yury Selivanovf2392132016-12-13 19:03:51 -05003433 */
INADA Naoki015bce62017-01-16 17:23:30 +09003434 SET_TOP(NULL);
Yury Selivanovf2392132016-12-13 19:03:51 -05003435 Py_DECREF(obj);
INADA Naoki015bce62017-01-16 17:23:30 +09003436 PUSH(meth);
Yury Selivanovf2392132016-12-13 19:03:51 -05003437 }
3438 DISPATCH();
3439 }
3440
Benjamin Petersonddd19492018-09-16 22:38:02 -07003441 case TARGET(CALL_METHOD): {
Yury Selivanovf2392132016-12-13 19:03:51 -05003442 /* Designed to work in tamdem with LOAD_METHOD. */
INADA Naoki015bce62017-01-16 17:23:30 +09003443 PyObject **sp, *res, *meth;
Yury Selivanovf2392132016-12-13 19:03:51 -05003444
3445 sp = stack_pointer;
3446
INADA Naoki015bce62017-01-16 17:23:30 +09003447 meth = PEEK(oparg + 2);
3448 if (meth == NULL) {
3449 /* `meth` is NULL when LOAD_METHOD thinks that it's not
3450 a method call.
Yury Selivanovf2392132016-12-13 19:03:51 -05003451
3452 Stack layout:
3453
INADA Naoki015bce62017-01-16 17:23:30 +09003454 ... | NULL | callable | arg1 | ... | argN
3455 ^- TOP()
3456 ^- (-oparg)
3457 ^- (-oparg-1)
3458 ^- (-oparg-2)
Yury Selivanovf2392132016-12-13 19:03:51 -05003459
Ville Skyttä49b27342017-08-03 09:00:59 +03003460 `callable` will be POPed by call_function.
INADA Naoki015bce62017-01-16 17:23:30 +09003461 NULL will will be POPed manually later.
Yury Selivanovf2392132016-12-13 19:03:51 -05003462 */
Victor Stinner09532fe2019-05-10 23:39:09 +02003463 res = call_function(tstate, &sp, oparg, NULL);
Yury Selivanovf2392132016-12-13 19:03:51 -05003464 stack_pointer = sp;
INADA Naoki015bce62017-01-16 17:23:30 +09003465 (void)POP(); /* POP the NULL. */
Yury Selivanovf2392132016-12-13 19:03:51 -05003466 }
3467 else {
3468 /* This is a method call. Stack layout:
3469
INADA Naoki015bce62017-01-16 17:23:30 +09003470 ... | method | self | arg1 | ... | argN
Yury Selivanovf2392132016-12-13 19:03:51 -05003471 ^- TOP()
3472 ^- (-oparg)
INADA Naoki015bce62017-01-16 17:23:30 +09003473 ^- (-oparg-1)
3474 ^- (-oparg-2)
Yury Selivanovf2392132016-12-13 19:03:51 -05003475
INADA Naoki015bce62017-01-16 17:23:30 +09003476 `self` and `method` will be POPed by call_function.
Yury Selivanovf2392132016-12-13 19:03:51 -05003477 We'll be passing `oparg + 1` to call_function, to
INADA Naoki015bce62017-01-16 17:23:30 +09003478 make it accept the `self` as a first argument.
Yury Selivanovf2392132016-12-13 19:03:51 -05003479 */
Victor Stinner09532fe2019-05-10 23:39:09 +02003480 res = call_function(tstate, &sp, oparg + 1, NULL);
Yury Selivanovf2392132016-12-13 19:03:51 -05003481 stack_pointer = sp;
3482 }
3483
3484 PUSH(res);
3485 if (res == NULL)
3486 goto error;
3487 DISPATCH();
3488 }
3489
Benjamin Petersonddd19492018-09-16 22:38:02 -07003490 case TARGET(CALL_FUNCTION): {
3491 PREDICTED(CALL_FUNCTION);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003492 PyObject **sp, *res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003493 sp = stack_pointer;
Victor Stinner09532fe2019-05-10 23:39:09 +02003494 res = call_function(tstate, &sp, oparg, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003495 stack_pointer = sp;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003496 PUSH(res);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003497 if (res == NULL) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003498 goto error;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003499 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003500 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003501 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003502
Benjamin Petersonddd19492018-09-16 22:38:02 -07003503 case TARGET(CALL_FUNCTION_KW): {
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003504 PyObject **sp, *res, *names;
3505
3506 names = POP();
3507 assert(PyTuple_CheckExact(names) && PyTuple_GET_SIZE(names) <= oparg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003508 sp = stack_pointer;
Victor Stinner09532fe2019-05-10 23:39:09 +02003509 res = call_function(tstate, &sp, oparg, names);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003510 stack_pointer = sp;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003511 PUSH(res);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003512 Py_DECREF(names);
3513
3514 if (res == NULL) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003515 goto error;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003516 }
3517 DISPATCH();
3518 }
3519
Benjamin Petersonddd19492018-09-16 22:38:02 -07003520 case TARGET(CALL_FUNCTION_EX): {
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003521 PyObject *func, *callargs, *kwargs = NULL, *result;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003522 if (oparg & 0x01) {
3523 kwargs = POP();
Serhiy Storchakab7281052016-09-12 00:52:40 +03003524 if (!PyDict_CheckExact(kwargs)) {
3525 PyObject *d = PyDict_New();
3526 if (d == NULL)
3527 goto error;
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02003528 if (_PyDict_MergeEx(d, kwargs, 2) < 0) {
Serhiy Storchakab7281052016-09-12 00:52:40 +03003529 Py_DECREF(d);
Victor Stinner438a12d2019-05-24 17:01:38 +02003530 format_kwargs_error(tstate, SECOND(), kwargs);
Victor Stinnereece2222016-09-12 11:16:37 +02003531 Py_DECREF(kwargs);
Serhiy Storchakab7281052016-09-12 00:52:40 +03003532 goto error;
3533 }
3534 Py_DECREF(kwargs);
3535 kwargs = d;
3536 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003537 assert(PyDict_CheckExact(kwargs));
3538 }
3539 callargs = POP();
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003540 func = TOP();
Serhiy Storchaka63dc5482016-09-22 19:41:20 +03003541 if (!PyTuple_CheckExact(callargs)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003542 if (check_args_iterable(tstate, func, callargs) < 0) {
Victor Stinnereece2222016-09-12 11:16:37 +02003543 Py_DECREF(callargs);
Serhiy Storchakab7281052016-09-12 00:52:40 +03003544 goto error;
3545 }
3546 Py_SETREF(callargs, PySequence_Tuple(callargs));
3547 if (callargs == NULL) {
3548 goto error;
3549 }
3550 }
Serhiy Storchaka63dc5482016-09-22 19:41:20 +03003551 assert(PyTuple_CheckExact(callargs));
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003552
Victor Stinner09532fe2019-05-10 23:39:09 +02003553 result = do_call_core(tstate, func, callargs, kwargs);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003554 Py_DECREF(func);
3555 Py_DECREF(callargs);
3556 Py_XDECREF(kwargs);
3557
3558 SET_TOP(result);
3559 if (result == NULL) {
3560 goto error;
3561 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003562 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003563 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003564
Benjamin Petersonddd19492018-09-16 22:38:02 -07003565 case TARGET(MAKE_FUNCTION): {
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003566 PyObject *qualname = POP();
3567 PyObject *codeobj = POP();
3568 PyFunctionObject *func = (PyFunctionObject *)
3569 PyFunction_NewWithQualName(codeobj, f->f_globals, qualname);
Guido van Rossum4f72a782006-10-27 23:31:49 +00003570
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003571 Py_DECREF(codeobj);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003572 Py_DECREF(qualname);
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003573 if (func == NULL) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003574 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003575 }
Neal Norwitzc1505362006-12-28 06:47:50 +00003576
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003577 if (oparg & 0x08) {
3578 assert(PyTuple_CheckExact(TOP()));
3579 func ->func_closure = POP();
3580 }
3581 if (oparg & 0x04) {
3582 assert(PyDict_CheckExact(TOP()));
3583 func->func_annotations = POP();
3584 }
3585 if (oparg & 0x02) {
3586 assert(PyDict_CheckExact(TOP()));
3587 func->func_kwdefaults = POP();
3588 }
3589 if (oparg & 0x01) {
3590 assert(PyTuple_CheckExact(TOP()));
3591 func->func_defaults = POP();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003592 }
Neal Norwitzc1505362006-12-28 06:47:50 +00003593
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003594 PUSH((PyObject *)func);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003595 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003596 }
Guido van Rossum8861b741996-07-30 16:49:37 +00003597
Benjamin Petersonddd19492018-09-16 22:38:02 -07003598 case TARGET(BUILD_SLICE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003599 PyObject *start, *stop, *step, *slice;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003600 if (oparg == 3)
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003601 step = POP();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003602 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003603 step = NULL;
3604 stop = POP();
3605 start = TOP();
3606 slice = PySlice_New(start, stop, step);
3607 Py_DECREF(start);
3608 Py_DECREF(stop);
3609 Py_XDECREF(step);
3610 SET_TOP(slice);
3611 if (slice == NULL)
3612 goto error;
3613 DISPATCH();
3614 }
Guido van Rossum8861b741996-07-30 16:49:37 +00003615
Benjamin Petersonddd19492018-09-16 22:38:02 -07003616 case TARGET(FORMAT_VALUE): {
Eric V. Smitha78c7952015-11-03 12:45:05 -05003617 /* Handles f-string value formatting. */
3618 PyObject *result;
3619 PyObject *fmt_spec;
3620 PyObject *value;
3621 PyObject *(*conv_fn)(PyObject *);
3622 int which_conversion = oparg & FVC_MASK;
3623 int have_fmt_spec = (oparg & FVS_MASK) == FVS_HAVE_SPEC;
3624
3625 fmt_spec = have_fmt_spec ? POP() : NULL;
Eric V. Smith135d5f42016-02-05 18:23:08 -05003626 value = POP();
Eric V. Smitha78c7952015-11-03 12:45:05 -05003627
3628 /* See if any conversion is specified. */
3629 switch (which_conversion) {
Eric V. Smith9a4135e2019-05-08 16:28:48 -04003630 case FVC_NONE: conv_fn = NULL; break;
Eric V. Smitha78c7952015-11-03 12:45:05 -05003631 case FVC_STR: conv_fn = PyObject_Str; break;
3632 case FVC_REPR: conv_fn = PyObject_Repr; break;
3633 case FVC_ASCII: conv_fn = PyObject_ASCII; break;
Eric V. Smith9a4135e2019-05-08 16:28:48 -04003634 default:
Victor Stinner438a12d2019-05-24 17:01:38 +02003635 _PyErr_Format(tstate, PyExc_SystemError,
3636 "unexpected conversion flag %d",
3637 which_conversion);
Eric V. Smith9a4135e2019-05-08 16:28:48 -04003638 goto error;
Eric V. Smitha78c7952015-11-03 12:45:05 -05003639 }
3640
3641 /* If there's a conversion function, call it and replace
3642 value with that result. Otherwise, just use value,
3643 without conversion. */
Eric V. Smitheb588a12016-02-05 18:26:20 -05003644 if (conv_fn != NULL) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05003645 result = conv_fn(value);
3646 Py_DECREF(value);
Eric V. Smitheb588a12016-02-05 18:26:20 -05003647 if (result == NULL) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05003648 Py_XDECREF(fmt_spec);
3649 goto error;
3650 }
3651 value = result;
3652 }
3653
3654 /* If value is a unicode object, and there's no fmt_spec,
3655 then we know the result of format(value) is value
3656 itself. In that case, skip calling format(). I plan to
3657 move this optimization in to PyObject_Format()
3658 itself. */
3659 if (PyUnicode_CheckExact(value) && fmt_spec == NULL) {
3660 /* Do nothing, just transfer ownership to result. */
3661 result = value;
3662 } else {
3663 /* Actually call format(). */
3664 result = PyObject_Format(value, fmt_spec);
3665 Py_DECREF(value);
3666 Py_XDECREF(fmt_spec);
Eric V. Smitheb588a12016-02-05 18:26:20 -05003667 if (result == NULL) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05003668 goto error;
Eric V. Smitheb588a12016-02-05 18:26:20 -05003669 }
Eric V. Smitha78c7952015-11-03 12:45:05 -05003670 }
3671
Eric V. Smith135d5f42016-02-05 18:23:08 -05003672 PUSH(result);
Eric V. Smitha78c7952015-11-03 12:45:05 -05003673 DISPATCH();
3674 }
3675
Benjamin Petersonddd19492018-09-16 22:38:02 -07003676 case TARGET(EXTENDED_ARG): {
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03003677 int oldoparg = oparg;
3678 NEXTOPARG();
3679 oparg |= oldoparg << 8;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003680 goto dispatch_opcode;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003681 }
Guido van Rossum8861b741996-07-30 16:49:37 +00003682
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003683
Antoine Pitrou042b1282010-08-13 21:15:58 +00003684#if USE_COMPUTED_GOTOS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003685 _unknown_opcode:
Antoine Pitroub52ec782009-01-25 16:34:23 +00003686#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003687 default:
3688 fprintf(stderr,
3689 "XXX lineno: %d, opcode: %d\n",
3690 PyFrame_GetLineNumber(f),
3691 opcode);
Victor Stinner438a12d2019-05-24 17:01:38 +02003692 _PyErr_SetString(tstate, PyExc_SystemError, "unknown opcode");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003693 goto error;
Guido van Rossum04691fc1992-08-12 15:35:34 +00003694
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003695 } /* switch */
Guido van Rossum374a9221991-04-04 10:40:29 +00003696
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003697 /* This should never be reached. Every opcode should end with DISPATCH()
3698 or goto error. */
Barry Warsawb2e57942017-09-14 18:13:16 -07003699 Py_UNREACHABLE();
Guido van Rossumac7be682001-01-17 15:42:30 +00003700
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003701error:
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003702 /* Double-check exception status. */
Victor Stinner365b6932013-07-12 00:11:58 +02003703#ifdef NDEBUG
Victor Stinner438a12d2019-05-24 17:01:38 +02003704 if (!_PyErr_Occurred(tstate)) {
3705 _PyErr_SetString(tstate, PyExc_SystemError,
3706 "error return without exception set");
3707 }
Victor Stinner365b6932013-07-12 00:11:58 +02003708#else
Victor Stinner438a12d2019-05-24 17:01:38 +02003709 assert(_PyErr_Occurred(tstate));
Victor Stinner365b6932013-07-12 00:11:58 +02003710#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00003711
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003712 /* Log traceback info. */
3713 PyTraceBack_Here(f);
Guido van Rossumac7be682001-01-17 15:42:30 +00003714
Benjamin Peterson51f46162013-01-23 08:38:47 -05003715 if (tstate->c_tracefunc != NULL)
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003716 call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj,
3717 tstate, f);
Guido van Rossumac7be682001-01-17 15:42:30 +00003718
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003719exception_unwind:
3720 /* Unwind stacks if an exception occurred */
3721 while (f->f_iblock > 0) {
3722 /* Pop the current block. */
3723 PyTryBlock *b = &f->f_blockstack[--f->f_iblock];
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003724
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003725 if (b->b_type == EXCEPT_HANDLER) {
3726 UNWIND_EXCEPT_HANDLER(b);
3727 continue;
3728 }
3729 UNWIND_BLOCK(b);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003730 if (b->b_type == SETUP_FINALLY) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003731 PyObject *exc, *val, *tb;
3732 int handler = b->b_handler;
Mark Shannonae3087c2017-10-22 22:41:51 +01003733 _PyErr_StackItem *exc_info = tstate->exc_info;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003734 /* Beware, this invalidates all b->b_* fields */
3735 PyFrame_BlockSetup(f, EXCEPT_HANDLER, -1, STACK_LEVEL());
Mark Shannonae3087c2017-10-22 22:41:51 +01003736 PUSH(exc_info->exc_traceback);
3737 PUSH(exc_info->exc_value);
3738 if (exc_info->exc_type != NULL) {
3739 PUSH(exc_info->exc_type);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003740 }
3741 else {
3742 Py_INCREF(Py_None);
3743 PUSH(Py_None);
3744 }
Victor Stinner438a12d2019-05-24 17:01:38 +02003745 _PyErr_Fetch(tstate, &exc, &val, &tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003746 /* Make the raw exception data
3747 available to the handler,
3748 so a program can emulate the
3749 Python main loop. */
Victor Stinner438a12d2019-05-24 17:01:38 +02003750 _PyErr_NormalizeException(tstate, &exc, &val, &tb);
Victor Stinner7eab0d02013-07-15 21:16:27 +02003751 if (tb != NULL)
3752 PyException_SetTraceback(val, tb);
3753 else
3754 PyException_SetTraceback(val, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003755 Py_INCREF(exc);
Mark Shannonae3087c2017-10-22 22:41:51 +01003756 exc_info->exc_type = exc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003757 Py_INCREF(val);
Mark Shannonae3087c2017-10-22 22:41:51 +01003758 exc_info->exc_value = val;
3759 exc_info->exc_traceback = tb;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003760 if (tb == NULL)
3761 tb = Py_None;
3762 Py_INCREF(tb);
3763 PUSH(tb);
3764 PUSH(val);
3765 PUSH(exc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003766 JUMPTO(handler);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003767 /* Resume normal execution */
3768 goto main_loop;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003769 }
3770 } /* unwind stack */
Guido van Rossum374a9221991-04-04 10:40:29 +00003771
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003772 /* End the loop as we still have an error */
3773 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003774 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00003775
Pablo Galindof00828a2019-05-09 16:52:02 +01003776 assert(retval == NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02003777 assert(_PyErr_Occurred(tstate));
Pablo Galindof00828a2019-05-09 16:52:02 +01003778
3779exit_returning:
3780
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003781 /* Pop remaining stack entries. */
3782 while (!EMPTY()) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003783 PyObject *o = POP();
3784 Py_XDECREF(o);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003785 }
Guido van Rossum35974fb2001-12-06 21:28:18 +00003786
Pablo Galindof00828a2019-05-09 16:52:02 +01003787exit_yielding:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003788 if (tstate->use_tracing) {
Benjamin Peterson51f46162013-01-23 08:38:47 -05003789 if (tstate->c_tracefunc) {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003790 if (call_trace_protected(tstate->c_tracefunc, tstate->c_traceobj,
3791 tstate, f, PyTrace_RETURN, retval)) {
3792 Py_CLEAR(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003793 }
3794 }
3795 if (tstate->c_profilefunc) {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003796 if (call_trace_protected(tstate->c_profilefunc, tstate->c_profileobj,
3797 tstate, f, PyTrace_RETURN, retval)) {
Serhiy Storchaka505ff752014-02-09 13:33:53 +02003798 Py_CLEAR(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003799 }
3800 }
3801 }
Guido van Rossuma4240131997-01-21 21:18:36 +00003802
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003803 /* pop frame */
Thomas Woutersce272b62007-09-19 21:19:28 +00003804exit_eval_frame:
Łukasz Langaa785c872016-09-09 17:37:37 -07003805 if (PyDTrace_FUNCTION_RETURN_ENABLED())
3806 dtrace_function_return(f);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003807 Py_LeaveRecursiveCall();
Antoine Pitrou58720d62013-08-05 23:26:40 +02003808 f->f_executing = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003809 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00003810
Victor Stinnerefde1462015-03-21 15:04:43 +01003811 return _Py_CheckFunctionResult(NULL, retval, "PyEval_EvalFrameEx");
Guido van Rossum374a9221991-04-04 10:40:29 +00003812}
3813
Benjamin Petersonb204a422011-06-05 22:04:07 -05003814static void
Victor Stinner438a12d2019-05-24 17:01:38 +02003815format_missing(PyThreadState *tstate, const char *kind,
3816 PyCodeObject *co, PyObject *names)
Benjamin Petersone109c702011-06-24 09:37:26 -05003817{
3818 int err;
3819 Py_ssize_t len = PyList_GET_SIZE(names);
3820 PyObject *name_str, *comma, *tail, *tmp;
3821
3822 assert(PyList_CheckExact(names));
3823 assert(len >= 1);
3824 /* Deal with the joys of natural language. */
3825 switch (len) {
3826 case 1:
3827 name_str = PyList_GET_ITEM(names, 0);
3828 Py_INCREF(name_str);
3829 break;
3830 case 2:
3831 name_str = PyUnicode_FromFormat("%U and %U",
3832 PyList_GET_ITEM(names, len - 2),
3833 PyList_GET_ITEM(names, len - 1));
3834 break;
3835 default:
3836 tail = PyUnicode_FromFormat(", %U, and %U",
3837 PyList_GET_ITEM(names, len - 2),
3838 PyList_GET_ITEM(names, len - 1));
Benjamin Petersond1ab6082012-06-01 11:18:22 -07003839 if (tail == NULL)
3840 return;
Benjamin Petersone109c702011-06-24 09:37:26 -05003841 /* Chop off the last two objects in the list. This shouldn't actually
3842 fail, but we can't be too careful. */
3843 err = PyList_SetSlice(names, len - 2, len, NULL);
3844 if (err == -1) {
3845 Py_DECREF(tail);
3846 return;
3847 }
3848 /* Stitch everything up into a nice comma-separated list. */
3849 comma = PyUnicode_FromString(", ");
3850 if (comma == NULL) {
3851 Py_DECREF(tail);
3852 return;
3853 }
3854 tmp = PyUnicode_Join(comma, names);
3855 Py_DECREF(comma);
3856 if (tmp == NULL) {
3857 Py_DECREF(tail);
3858 return;
3859 }
3860 name_str = PyUnicode_Concat(tmp, tail);
3861 Py_DECREF(tmp);
3862 Py_DECREF(tail);
3863 break;
3864 }
3865 if (name_str == NULL)
3866 return;
Victor Stinner438a12d2019-05-24 17:01:38 +02003867 _PyErr_Format(tstate, PyExc_TypeError,
3868 "%U() missing %i required %s argument%s: %U",
3869 co->co_name,
3870 len,
3871 kind,
3872 len == 1 ? "" : "s",
3873 name_str);
Benjamin Petersone109c702011-06-24 09:37:26 -05003874 Py_DECREF(name_str);
3875}
3876
3877static void
Victor Stinner438a12d2019-05-24 17:01:38 +02003878missing_arguments(PyThreadState *tstate, PyCodeObject *co,
3879 Py_ssize_t missing, Py_ssize_t defcount,
Benjamin Petersone109c702011-06-24 09:37:26 -05003880 PyObject **fastlocals)
3881{
Victor Stinner74319ae2016-08-25 00:04:09 +02003882 Py_ssize_t i, j = 0;
3883 Py_ssize_t start, end;
3884 int positional = (defcount != -1);
Benjamin Petersone109c702011-06-24 09:37:26 -05003885 const char *kind = positional ? "positional" : "keyword-only";
3886 PyObject *missing_names;
3887
3888 /* Compute the names of the arguments that are missing. */
3889 missing_names = PyList_New(missing);
3890 if (missing_names == NULL)
3891 return;
3892 if (positional) {
3893 start = 0;
Pablo Galindocd74e662019-06-01 18:08:04 +01003894 end = co->co_argcount - defcount;
Benjamin Petersone109c702011-06-24 09:37:26 -05003895 }
3896 else {
Pablo Galindocd74e662019-06-01 18:08:04 +01003897 start = co->co_argcount;
Benjamin Petersone109c702011-06-24 09:37:26 -05003898 end = start + co->co_kwonlyargcount;
3899 }
3900 for (i = start; i < end; i++) {
3901 if (GETLOCAL(i) == NULL) {
3902 PyObject *raw = PyTuple_GET_ITEM(co->co_varnames, i);
3903 PyObject *name = PyObject_Repr(raw);
3904 if (name == NULL) {
3905 Py_DECREF(missing_names);
3906 return;
3907 }
3908 PyList_SET_ITEM(missing_names, j++, name);
3909 }
3910 }
3911 assert(j == missing);
Victor Stinner438a12d2019-05-24 17:01:38 +02003912 format_missing(tstate, kind, co, missing_names);
Benjamin Petersone109c702011-06-24 09:37:26 -05003913 Py_DECREF(missing_names);
3914}
3915
3916static void
Victor Stinner438a12d2019-05-24 17:01:38 +02003917too_many_positional(PyThreadState *tstate, PyCodeObject *co,
3918 Py_ssize_t given, Py_ssize_t defcount,
Victor Stinner74319ae2016-08-25 00:04:09 +02003919 PyObject **fastlocals)
Benjamin Petersonb204a422011-06-05 22:04:07 -05003920{
3921 int plural;
Victor Stinner74319ae2016-08-25 00:04:09 +02003922 Py_ssize_t kwonly_given = 0;
3923 Py_ssize_t i;
Benjamin Petersonb204a422011-06-05 22:04:07 -05003924 PyObject *sig, *kwonly_sig;
Victor Stinner74319ae2016-08-25 00:04:09 +02003925 Py_ssize_t co_argcount = co->co_argcount;
Benjamin Petersonb204a422011-06-05 22:04:07 -05003926
Benjamin Petersone109c702011-06-24 09:37:26 -05003927 assert((co->co_flags & CO_VARARGS) == 0);
3928 /* Count missing keyword-only args. */
Pablo Galindocd74e662019-06-01 18:08:04 +01003929 for (i = co_argcount; i < co_argcount + co->co_kwonlyargcount; i++) {
Victor Stinner74319ae2016-08-25 00:04:09 +02003930 if (GETLOCAL(i) != NULL) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05003931 kwonly_given++;
Victor Stinner74319ae2016-08-25 00:04:09 +02003932 }
3933 }
Benjamin Petersone109c702011-06-24 09:37:26 -05003934 if (defcount) {
Pablo Galindocd74e662019-06-01 18:08:04 +01003935 Py_ssize_t atleast = co_argcount - defcount;
Benjamin Petersonb204a422011-06-05 22:04:07 -05003936 plural = 1;
Pablo Galindocd74e662019-06-01 18:08:04 +01003937 sig = PyUnicode_FromFormat("from %zd to %zd", atleast, co_argcount);
Benjamin Petersonb204a422011-06-05 22:04:07 -05003938 }
3939 else {
Pablo Galindocd74e662019-06-01 18:08:04 +01003940 plural = (co_argcount != 1);
3941 sig = PyUnicode_FromFormat("%zd", co_argcount);
Benjamin Petersonb204a422011-06-05 22:04:07 -05003942 }
3943 if (sig == NULL)
3944 return;
3945 if (kwonly_given) {
Victor Stinner74319ae2016-08-25 00:04:09 +02003946 const char *format = " positional argument%s (and %zd keyword-only argument%s)";
3947 kwonly_sig = PyUnicode_FromFormat(format,
3948 given != 1 ? "s" : "",
3949 kwonly_given,
3950 kwonly_given != 1 ? "s" : "");
Benjamin Petersonb204a422011-06-05 22:04:07 -05003951 if (kwonly_sig == NULL) {
3952 Py_DECREF(sig);
3953 return;
3954 }
3955 }
3956 else {
3957 /* This will not fail. */
3958 kwonly_sig = PyUnicode_FromString("");
Benjamin Petersone109c702011-06-24 09:37:26 -05003959 assert(kwonly_sig != NULL);
Benjamin Petersonb204a422011-06-05 22:04:07 -05003960 }
Victor Stinner438a12d2019-05-24 17:01:38 +02003961 _PyErr_Format(tstate, PyExc_TypeError,
3962 "%U() takes %U positional argument%s but %zd%U %s given",
3963 co->co_name,
3964 sig,
3965 plural ? "s" : "",
3966 given,
3967 kwonly_sig,
3968 given == 1 && !kwonly_given ? "was" : "were");
Benjamin Petersonb204a422011-06-05 22:04:07 -05003969 Py_DECREF(sig);
3970 Py_DECREF(kwonly_sig);
3971}
3972
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01003973static int
Victor Stinner438a12d2019-05-24 17:01:38 +02003974positional_only_passed_as_keyword(PyThreadState *tstate, PyCodeObject *co,
3975 Py_ssize_t kwcount, PyObject* const* kwnames)
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01003976{
3977 int posonly_conflicts = 0;
3978 PyObject* posonly_names = PyList_New(0);
3979
3980 for(int k=0; k < co->co_posonlyargcount; k++){
3981 PyObject* posonly_name = PyTuple_GET_ITEM(co->co_varnames, k);
3982
3983 for (int k2=0; k2<kwcount; k2++){
3984 /* Compare the pointers first and fallback to PyObject_RichCompareBool*/
3985 PyObject* kwname = kwnames[k2];
3986 if (kwname == posonly_name){
3987 if(PyList_Append(posonly_names, kwname) != 0) {
3988 goto fail;
3989 }
3990 posonly_conflicts++;
3991 continue;
3992 }
3993
3994 int cmp = PyObject_RichCompareBool(posonly_name, kwname, Py_EQ);
3995
3996 if ( cmp > 0) {
3997 if(PyList_Append(posonly_names, kwname) != 0) {
3998 goto fail;
3999 }
4000 posonly_conflicts++;
4001 } else if (cmp < 0) {
4002 goto fail;
4003 }
4004
4005 }
4006 }
4007 if (posonly_conflicts) {
4008 PyObject* comma = PyUnicode_FromString(", ");
4009 if (comma == NULL) {
4010 goto fail;
4011 }
4012 PyObject* error_names = PyUnicode_Join(comma, posonly_names);
4013 Py_DECREF(comma);
4014 if (error_names == NULL) {
4015 goto fail;
4016 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004017 _PyErr_Format(tstate, PyExc_TypeError,
4018 "%U() got some positional-only arguments passed"
4019 " as keyword arguments: '%U'",
4020 co->co_name, error_names);
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004021 Py_DECREF(error_names);
4022 goto fail;
4023 }
4024
4025 Py_DECREF(posonly_names);
4026 return 0;
4027
4028fail:
4029 Py_XDECREF(posonly_names);
4030 return 1;
4031
4032}
4033
Guido van Rossumc2e20742006-02-27 22:32:47 +00004034/* This is gonna seem *real weird*, but if you put some other code between
Marcel Plch3a9ccee2018-04-06 23:22:04 +02004035 PyEval_EvalFrame() and _PyEval_EvalFrameDefault() you will need to adjust
Guido van Rossumc2e20742006-02-27 22:32:47 +00004036 the test in the if statements in Misc/gdbinit (pystack and pystackv). */
Skip Montanaro786ea6b2004-03-01 15:44:05 +00004037
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01004038PyObject *
Victor Stinner40ee3012014-06-16 15:59:28 +02004039_PyEval_EvalCodeWithName(PyObject *_co, PyObject *globals, PyObject *locals,
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02004040 PyObject *const *args, Py_ssize_t argcount,
4041 PyObject *const *kwnames, PyObject *const *kwargs,
Serhiy Storchakab7281052016-09-12 00:52:40 +03004042 Py_ssize_t kwcount, int kwstep,
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02004043 PyObject *const *defs, Py_ssize_t defcount,
Victor Stinner74319ae2016-08-25 00:04:09 +02004044 PyObject *kwdefs, PyObject *closure,
Victor Stinner40ee3012014-06-16 15:59:28 +02004045 PyObject *name, PyObject *qualname)
Tim Peters5ca576e2001-06-18 22:08:13 +00004046{
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00004047 PyCodeObject* co = (PyCodeObject*)_co;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02004048 PyFrameObject *f;
4049 PyObject *retval = NULL;
4050 PyObject **fastlocals, **freevars;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004051 PyObject *x, *u;
Pablo Galindocd74e662019-06-01 18:08:04 +01004052 const Py_ssize_t total_args = co->co_argcount + co->co_kwonlyargcount;
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004053 Py_ssize_t i, j, n;
Victor Stinnerc7020012016-08-16 23:40:29 +02004054 PyObject *kwdict;
Tim Peters5ca576e2001-06-18 22:08:13 +00004055
Victor Stinner438a12d2019-05-24 17:01:38 +02004056 PyThreadState *tstate = _PyThreadState_GET();
4057 assert(tstate != NULL);
4058
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004059 if (globals == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004060 _PyErr_SetString(tstate, PyExc_SystemError,
4061 "PyEval_EvalCodeEx: NULL globals");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004062 return NULL;
4063 }
Tim Peters5ca576e2001-06-18 22:08:13 +00004064
Victor Stinnerc7020012016-08-16 23:40:29 +02004065 /* Create the frame */
INADA Naoki5a625d02016-12-24 20:19:08 +09004066 f = _PyFrame_New_NoTrack(tstate, co, globals, locals);
Victor Stinnerc7020012016-08-16 23:40:29 +02004067 if (f == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004068 return NULL;
Victor Stinnerc7020012016-08-16 23:40:29 +02004069 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004070 fastlocals = f->f_localsplus;
4071 freevars = f->f_localsplus + co->co_nlocals;
Tim Peters5ca576e2001-06-18 22:08:13 +00004072
Victor Stinnerc7020012016-08-16 23:40:29 +02004073 /* Create a dictionary for keyword parameters (**kwags) */
Benjamin Petersonb204a422011-06-05 22:04:07 -05004074 if (co->co_flags & CO_VARKEYWORDS) {
4075 kwdict = PyDict_New();
4076 if (kwdict == NULL)
4077 goto fail;
4078 i = total_args;
Victor Stinnerc7020012016-08-16 23:40:29 +02004079 if (co->co_flags & CO_VARARGS) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004080 i++;
Victor Stinnerc7020012016-08-16 23:40:29 +02004081 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004082 SETLOCAL(i, kwdict);
4083 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004084 else {
4085 kwdict = NULL;
4086 }
4087
Pablo Galindocd74e662019-06-01 18:08:04 +01004088 /* Copy all positional arguments into local variables */
4089 if (argcount > co->co_argcount) {
4090 n = co->co_argcount;
Victor Stinnerc7020012016-08-16 23:40:29 +02004091 }
4092 else {
4093 n = argcount;
4094 }
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004095 for (j = 0; j < n; j++) {
4096 x = args[j];
4097 Py_INCREF(x);
4098 SETLOCAL(j, x);
4099 }
4100
Victor Stinnerc7020012016-08-16 23:40:29 +02004101 /* Pack other positional arguments into the *args argument */
Benjamin Petersonb204a422011-06-05 22:04:07 -05004102 if (co->co_flags & CO_VARARGS) {
Sergey Fedoseev234531b2019-02-25 21:59:12 +05004103 u = _PyTuple_FromArray(args + n, argcount - n);
Victor Stinnerc7020012016-08-16 23:40:29 +02004104 if (u == NULL) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004105 goto fail;
Victor Stinnerc7020012016-08-16 23:40:29 +02004106 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004107 SETLOCAL(total_args, u);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004108 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004109
Serhiy Storchakab7281052016-09-12 00:52:40 +03004110 /* Handle keyword arguments passed as two strided arrays */
4111 kwcount *= kwstep;
4112 for (i = 0; i < kwcount; i += kwstep) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004113 PyObject **co_varnames;
Serhiy Storchakab7281052016-09-12 00:52:40 +03004114 PyObject *keyword = kwnames[i];
4115 PyObject *value = kwargs[i];
Victor Stinner17061a92016-08-16 23:39:42 +02004116 Py_ssize_t j;
Victor Stinnerc7020012016-08-16 23:40:29 +02004117
Benjamin Petersonb204a422011-06-05 22:04:07 -05004118 if (keyword == NULL || !PyUnicode_Check(keyword)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004119 _PyErr_Format(tstate, PyExc_TypeError,
4120 "%U() keywords must be strings",
4121 co->co_name);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004122 goto fail;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004123 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004124
Benjamin Petersonb204a422011-06-05 22:04:07 -05004125 /* Speed hack: do raw pointer compares. As names are
4126 normally interned this should almost always hit. */
4127 co_varnames = ((PyTupleObject *)(co->co_varnames))->ob_item;
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004128 for (j = co->co_posonlyargcount; j < total_args; j++) {
Victor Stinner6fea7f72016-08-22 23:17:30 +02004129 PyObject *name = co_varnames[j];
4130 if (name == keyword) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004131 goto kw_found;
Victor Stinner6fea7f72016-08-22 23:17:30 +02004132 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004133 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004134
Benjamin Petersonb204a422011-06-05 22:04:07 -05004135 /* Slow fallback, just in case */
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004136 for (j = co->co_posonlyargcount; j < total_args; j++) {
Victor Stinner6fea7f72016-08-22 23:17:30 +02004137 PyObject *name = co_varnames[j];
4138 int cmp = PyObject_RichCompareBool( keyword, name, Py_EQ);
4139 if (cmp > 0) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004140 goto kw_found;
Victor Stinner6fea7f72016-08-22 23:17:30 +02004141 }
4142 else if (cmp < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004143 goto fail;
Victor Stinner6fea7f72016-08-22 23:17:30 +02004144 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004145 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004146
Victor Stinner231d1f32017-01-11 02:12:06 +01004147 assert(j >= total_args);
4148 if (kwdict == NULL) {
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004149
Victor Stinner438a12d2019-05-24 17:01:38 +02004150 if (co->co_posonlyargcount
4151 && positional_only_passed_as_keyword(tstate, co,
4152 kwcount, kwnames))
4153 {
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004154 goto fail;
4155 }
4156
Victor Stinner438a12d2019-05-24 17:01:38 +02004157 _PyErr_Format(tstate, PyExc_TypeError,
4158 "%U() got an unexpected keyword argument '%S'",
4159 co->co_name, keyword);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004160 goto fail;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004161 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004162
Christian Heimes0bd447f2013-07-20 14:48:10 +02004163 if (PyDict_SetItem(kwdict, keyword, value) == -1) {
4164 goto fail;
4165 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004166 continue;
Victor Stinnerc7020012016-08-16 23:40:29 +02004167
Benjamin Petersonb204a422011-06-05 22:04:07 -05004168 kw_found:
4169 if (GETLOCAL(j) != NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004170 _PyErr_Format(tstate, PyExc_TypeError,
4171 "%U() got multiple values for argument '%S'",
4172 co->co_name, keyword);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004173 goto fail;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004174 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004175 Py_INCREF(value);
4176 SETLOCAL(j, value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004177 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004178
4179 /* Check the number of positional arguments */
Pablo Galindocd74e662019-06-01 18:08:04 +01004180 if ((argcount > co->co_argcount) && !(co->co_flags & CO_VARARGS)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004181 too_many_positional(tstate, co, argcount, defcount, fastlocals);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004182 goto fail;
4183 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004184
4185 /* Add missing positional arguments (copy default values from defs) */
Pablo Galindocd74e662019-06-01 18:08:04 +01004186 if (argcount < co->co_argcount) {
4187 Py_ssize_t m = co->co_argcount - defcount;
Victor Stinner17061a92016-08-16 23:39:42 +02004188 Py_ssize_t missing = 0;
4189 for (i = argcount; i < m; i++) {
4190 if (GETLOCAL(i) == NULL) {
Benjamin Petersone109c702011-06-24 09:37:26 -05004191 missing++;
Victor Stinner17061a92016-08-16 23:39:42 +02004192 }
4193 }
Benjamin Petersone109c702011-06-24 09:37:26 -05004194 if (missing) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004195 missing_arguments(tstate, co, missing, defcount, fastlocals);
Benjamin Petersone109c702011-06-24 09:37:26 -05004196 goto fail;
Benjamin Petersonb204a422011-06-05 22:04:07 -05004197 }
4198 if (n > m)
4199 i = n - m;
4200 else
4201 i = 0;
4202 for (; i < defcount; i++) {
4203 if (GETLOCAL(m+i) == NULL) {
4204 PyObject *def = defs[i];
4205 Py_INCREF(def);
4206 SETLOCAL(m+i, def);
4207 }
4208 }
4209 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004210
4211 /* Add missing keyword arguments (copy default values from kwdefs) */
Benjamin Petersonb204a422011-06-05 22:04:07 -05004212 if (co->co_kwonlyargcount > 0) {
Victor Stinner17061a92016-08-16 23:39:42 +02004213 Py_ssize_t missing = 0;
Pablo Galindocd74e662019-06-01 18:08:04 +01004214 for (i = co->co_argcount; i < total_args; i++) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004215 PyObject *name;
4216 if (GETLOCAL(i) != NULL)
4217 continue;
4218 name = PyTuple_GET_ITEM(co->co_varnames, i);
4219 if (kwdefs != NULL) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02004220 PyObject *def = PyDict_GetItemWithError(kwdefs, name);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004221 if (def) {
4222 Py_INCREF(def);
4223 SETLOCAL(i, def);
4224 continue;
4225 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004226 else if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02004227 goto fail;
4228 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004229 }
Benjamin Petersone109c702011-06-24 09:37:26 -05004230 missing++;
4231 }
4232 if (missing) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004233 missing_arguments(tstate, co, missing, -1, fastlocals);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004234 goto fail;
4235 }
4236 }
4237
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004238 /* Allocate and initialize storage for cell vars, and copy free
Benjamin Peterson90037602011-06-25 22:54:45 -05004239 vars into frame. */
4240 for (i = 0; i < PyTuple_GET_SIZE(co->co_cellvars); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004241 PyObject *c;
Serhiy Storchaka5bb8b912016-12-16 19:19:02 +02004242 Py_ssize_t arg;
Benjamin Peterson90037602011-06-25 22:54:45 -05004243 /* Possibly account for the cell variable being an argument. */
4244 if (co->co_cell2arg != NULL &&
Guido van Rossum6832c812013-05-10 08:47:42 -07004245 (arg = co->co_cell2arg[i]) != CO_CELL_NOT_AN_ARG) {
Benjamin Peterson90037602011-06-25 22:54:45 -05004246 c = PyCell_New(GETLOCAL(arg));
Benjamin Peterson159ae412013-05-12 18:16:06 -05004247 /* Clear the local copy. */
4248 SETLOCAL(arg, NULL);
Guido van Rossum6832c812013-05-10 08:47:42 -07004249 }
4250 else {
Benjamin Peterson90037602011-06-25 22:54:45 -05004251 c = PyCell_New(NULL);
Guido van Rossum6832c812013-05-10 08:47:42 -07004252 }
Benjamin Peterson159ae412013-05-12 18:16:06 -05004253 if (c == NULL)
4254 goto fail;
Benjamin Peterson90037602011-06-25 22:54:45 -05004255 SETLOCAL(co->co_nlocals + i, c);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004256 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004257
4258 /* Copy closure variables to free variables */
Benjamin Peterson90037602011-06-25 22:54:45 -05004259 for (i = 0; i < PyTuple_GET_SIZE(co->co_freevars); ++i) {
4260 PyObject *o = PyTuple_GET_ITEM(closure, i);
4261 Py_INCREF(o);
4262 freevars[PyTuple_GET_SIZE(co->co_cellvars) + i] = o;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004263 }
Tim Peters5ca576e2001-06-18 22:08:13 +00004264
Yury Selivanoveb636452016-09-08 22:01:51 -07004265 /* Handle generator/coroutine/asynchronous generator */
4266 if (co->co_flags & (CO_GENERATOR | CO_COROUTINE | CO_ASYNC_GENERATOR)) {
Yury Selivanov75445082015-05-11 22:57:16 -04004267 PyObject *gen;
Yury Selivanov5376ba92015-06-22 12:19:30 -04004268 int is_coro = co->co_flags & CO_COROUTINE;
Yury Selivanov94c22632015-06-04 10:16:51 -04004269
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004270 /* Don't need to keep the reference to f_back, it will be set
4271 * when the generator is resumed. */
Serhiy Storchaka505ff752014-02-09 13:33:53 +02004272 Py_CLEAR(f->f_back);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00004273
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004274 /* Create a new generator that owns the ready to run frame
4275 * and return that as the value. */
Yury Selivanov5376ba92015-06-22 12:19:30 -04004276 if (is_coro) {
4277 gen = PyCoro_New(f, name, qualname);
Yury Selivanoveb636452016-09-08 22:01:51 -07004278 } else if (co->co_flags & CO_ASYNC_GENERATOR) {
4279 gen = PyAsyncGen_New(f, name, qualname);
Yury Selivanov5376ba92015-06-22 12:19:30 -04004280 } else {
4281 gen = PyGen_NewWithQualName(f, name, qualname);
4282 }
INADA Naoki6a3cedf2016-12-26 18:01:46 +09004283 if (gen == NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04004284 return NULL;
INADA Naoki6a3cedf2016-12-26 18:01:46 +09004285 }
INADA Naoki9c157762016-12-26 18:52:46 +09004286
INADA Naoki6a3cedf2016-12-26 18:01:46 +09004287 _PyObject_GC_TRACK(f);
Yury Selivanov75445082015-05-11 22:57:16 -04004288
Yury Selivanov75445082015-05-11 22:57:16 -04004289 return gen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004290 }
Tim Peters5ca576e2001-06-18 22:08:13 +00004291
Victor Stinner59a73272016-12-09 18:51:13 +01004292 retval = PyEval_EvalFrameEx(f,0);
Tim Peters5ca576e2001-06-18 22:08:13 +00004293
Thomas Woutersce272b62007-09-19 21:19:28 +00004294fail: /* Jump here from prelude on failure */
Tim Peters5ca576e2001-06-18 22:08:13 +00004295
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004296 /* decref'ing the frame can cause __del__ methods to get invoked,
4297 which can call back into Python. While we're done with the
4298 current Python frame (f), the associated C stack is still in use,
4299 so recursion_depth must be boosted for the duration.
4300 */
4301 assert(tstate != NULL);
INADA Naoki5a625d02016-12-24 20:19:08 +09004302 if (Py_REFCNT(f) > 1) {
4303 Py_DECREF(f);
4304 _PyObject_GC_TRACK(f);
4305 }
4306 else {
4307 ++tstate->recursion_depth;
4308 Py_DECREF(f);
4309 --tstate->recursion_depth;
4310 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004311 return retval;
Tim Peters5ca576e2001-06-18 22:08:13 +00004312}
4313
Victor Stinner40ee3012014-06-16 15:59:28 +02004314PyObject *
4315PyEval_EvalCodeEx(PyObject *_co, PyObject *globals, PyObject *locals,
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02004316 PyObject *const *args, int argcount,
4317 PyObject *const *kws, int kwcount,
4318 PyObject *const *defs, int defcount,
4319 PyObject *kwdefs, PyObject *closure)
Victor Stinner40ee3012014-06-16 15:59:28 +02004320{
4321 return _PyEval_EvalCodeWithName(_co, globals, locals,
Victor Stinner9be7e7b2016-08-19 16:11:43 +02004322 args, argcount,
Zackery Spytzc6ea8972017-07-31 08:24:37 -06004323 kws, kws != NULL ? kws + 1 : NULL,
4324 kwcount, 2,
Victor Stinner9be7e7b2016-08-19 16:11:43 +02004325 defs, defcount,
4326 kwdefs, closure,
Victor Stinner40ee3012014-06-16 15:59:28 +02004327 NULL, NULL);
4328}
Tim Peters5ca576e2001-06-18 22:08:13 +00004329
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004330static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02004331special_lookup(PyThreadState *tstate, PyObject *o, _Py_Identifier *id)
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004332{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004333 PyObject *res;
Benjamin Petersonce798522012-01-22 11:24:29 -05004334 res = _PyObject_LookupSpecial(o, id);
Victor Stinner438a12d2019-05-24 17:01:38 +02004335 if (res == NULL && !_PyErr_Occurred(tstate)) {
4336 _PyErr_SetObject(tstate, PyExc_AttributeError, id->object);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004337 return NULL;
4338 }
4339 return res;
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004340}
4341
4342
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00004343/* Logic for the raise statement (too complicated for inlining).
4344 This *consumes* a reference count to each of its arguments. */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004345static int
Victor Stinner09532fe2019-05-10 23:39:09 +02004346do_raise(PyThreadState *tstate, PyObject *exc, PyObject *cause)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00004347{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004348 PyObject *type = NULL, *value = NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00004349
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004350 if (exc == NULL) {
4351 /* Reraise */
Mark Shannonae3087c2017-10-22 22:41:51 +01004352 _PyErr_StackItem *exc_info = _PyErr_GetTopmostException(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004353 PyObject *tb;
Mark Shannonae3087c2017-10-22 22:41:51 +01004354 type = exc_info->exc_type;
4355 value = exc_info->exc_value;
4356 tb = exc_info->exc_traceback;
Victor Stinnereec93312016-08-18 18:13:10 +02004357 if (type == Py_None || type == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004358 _PyErr_SetString(tstate, PyExc_RuntimeError,
4359 "No active exception to reraise");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004360 return 0;
4361 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004362 Py_XINCREF(type);
4363 Py_XINCREF(value);
4364 Py_XINCREF(tb);
Victor Stinner438a12d2019-05-24 17:01:38 +02004365 _PyErr_Restore(tstate, type, value, tb);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004366 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004367 }
Guido van Rossumac7be682001-01-17 15:42:30 +00004368
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004369 /* We support the following forms of raise:
4370 raise
Collin Winter828f04a2007-08-31 00:04:24 +00004371 raise <instance>
4372 raise <type> */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00004373
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004374 if (PyExceptionClass_Check(exc)) {
4375 type = exc;
Victor Stinnera5ed5f02016-12-06 18:45:50 +01004376 value = _PyObject_CallNoArg(exc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004377 if (value == NULL)
4378 goto raise_error;
Benjamin Peterson5afa03a2011-07-15 14:09:26 -05004379 if (!PyExceptionInstance_Check(value)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004380 _PyErr_Format(tstate, PyExc_TypeError,
4381 "calling %R should have returned an instance of "
4382 "BaseException, not %R",
4383 type, Py_TYPE(value));
4384 goto raise_error;
Benjamin Peterson5afa03a2011-07-15 14:09:26 -05004385 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004386 }
4387 else if (PyExceptionInstance_Check(exc)) {
4388 value = exc;
4389 type = PyExceptionInstance_Class(exc);
4390 Py_INCREF(type);
4391 }
4392 else {
4393 /* Not something you can raise. You get an exception
4394 anyway, just not what you specified :-) */
4395 Py_DECREF(exc);
Victor Stinner438a12d2019-05-24 17:01:38 +02004396 _PyErr_SetString(tstate, PyExc_TypeError,
4397 "exceptions must derive from BaseException");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004398 goto raise_error;
4399 }
Collin Winter828f04a2007-08-31 00:04:24 +00004400
Serhiy Storchakac0191582016-09-27 11:37:10 +03004401 assert(type != NULL);
4402 assert(value != NULL);
4403
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004404 if (cause) {
4405 PyObject *fixed_cause;
4406 if (PyExceptionClass_Check(cause)) {
Victor Stinnera5ed5f02016-12-06 18:45:50 +01004407 fixed_cause = _PyObject_CallNoArg(cause);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004408 if (fixed_cause == NULL)
4409 goto raise_error;
Benjamin Petersond5a1c442012-05-14 22:09:31 -07004410 Py_DECREF(cause);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004411 }
Benjamin Petersond5a1c442012-05-14 22:09:31 -07004412 else if (PyExceptionInstance_Check(cause)) {
4413 fixed_cause = cause;
4414 }
4415 else if (cause == Py_None) {
4416 Py_DECREF(cause);
4417 fixed_cause = NULL;
4418 }
4419 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02004420 _PyErr_SetString(tstate, PyExc_TypeError,
4421 "exception causes must derive from "
4422 "BaseException");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004423 goto raise_error;
4424 }
Benjamin Petersond5a1c442012-05-14 22:09:31 -07004425 PyException_SetCause(value, fixed_cause);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004426 }
Collin Winter828f04a2007-08-31 00:04:24 +00004427
Victor Stinner438a12d2019-05-24 17:01:38 +02004428 _PyErr_SetObject(tstate, type, value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004429 /* PyErr_SetObject incref's its arguments */
Serhiy Storchakac0191582016-09-27 11:37:10 +03004430 Py_DECREF(value);
4431 Py_DECREF(type);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004432 return 0;
Collin Winter828f04a2007-08-31 00:04:24 +00004433
4434raise_error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004435 Py_XDECREF(value);
4436 Py_XDECREF(type);
4437 Py_XDECREF(cause);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004438 return 0;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00004439}
4440
Tim Petersd6d010b2001-06-21 02:49:55 +00004441/* Iterate v argcnt times and store the results on the stack (via decreasing
Guido van Rossum0368b722007-05-11 16:50:42 +00004442 sp). Return 1 for success, 0 if error.
Antoine Pitrou9a2310d2008-07-25 22:39:39 +00004443
Guido van Rossum0368b722007-05-11 16:50:42 +00004444 If argcntafter == -1, do a simple unpack. If it is >= 0, do an unpack
4445 with a variable target.
4446*/
Tim Petersd6d010b2001-06-21 02:49:55 +00004447
Barry Warsawe42b18f1997-08-25 22:13:04 +00004448static int
Victor Stinner438a12d2019-05-24 17:01:38 +02004449unpack_iterable(PyThreadState *tstate, PyObject *v,
4450 int argcnt, int argcntafter, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00004451{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004452 int i = 0, j = 0;
4453 Py_ssize_t ll = 0;
4454 PyObject *it; /* iter(v) */
4455 PyObject *w;
4456 PyObject *l = NULL; /* variable list */
Guido van Rossumac7be682001-01-17 15:42:30 +00004457
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004458 assert(v != NULL);
Tim Petersd6d010b2001-06-21 02:49:55 +00004459
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004460 it = PyObject_GetIter(v);
Serhiy Storchaka13a6c092017-12-26 12:30:41 +02004461 if (it == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004462 if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError) &&
Serhiy Storchaka13a6c092017-12-26 12:30:41 +02004463 v->ob_type->tp_iter == NULL && !PySequence_Check(v))
4464 {
Victor Stinner438a12d2019-05-24 17:01:38 +02004465 _PyErr_Format(tstate, PyExc_TypeError,
4466 "cannot unpack non-iterable %.200s object",
4467 v->ob_type->tp_name);
Serhiy Storchaka13a6c092017-12-26 12:30:41 +02004468 }
4469 return 0;
4470 }
Tim Petersd6d010b2001-06-21 02:49:55 +00004471
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004472 for (; i < argcnt; i++) {
4473 w = PyIter_Next(it);
4474 if (w == NULL) {
4475 /* Iterator done, via error or exhaustion. */
Victor Stinner438a12d2019-05-24 17:01:38 +02004476 if (!_PyErr_Occurred(tstate)) {
R David Murray4171bbe2015-04-15 17:08:45 -04004477 if (argcntafter == -1) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004478 _PyErr_Format(tstate, PyExc_ValueError,
4479 "not enough values to unpack "
4480 "(expected %d, got %d)",
4481 argcnt, i);
R David Murray4171bbe2015-04-15 17:08:45 -04004482 }
4483 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02004484 _PyErr_Format(tstate, PyExc_ValueError,
4485 "not enough values to unpack "
4486 "(expected at least %d, got %d)",
4487 argcnt + argcntafter, i);
R David Murray4171bbe2015-04-15 17:08:45 -04004488 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004489 }
4490 goto Error;
4491 }
4492 *--sp = w;
4493 }
Tim Petersd6d010b2001-06-21 02:49:55 +00004494
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004495 if (argcntafter == -1) {
4496 /* We better have exhausted the iterator now. */
4497 w = PyIter_Next(it);
4498 if (w == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004499 if (_PyErr_Occurred(tstate))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004500 goto Error;
4501 Py_DECREF(it);
4502 return 1;
4503 }
4504 Py_DECREF(w);
Victor Stinner438a12d2019-05-24 17:01:38 +02004505 _PyErr_Format(tstate, PyExc_ValueError,
4506 "too many values to unpack (expected %d)",
4507 argcnt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004508 goto Error;
4509 }
Guido van Rossum0368b722007-05-11 16:50:42 +00004510
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004511 l = PySequence_List(it);
4512 if (l == NULL)
4513 goto Error;
4514 *--sp = l;
4515 i++;
Guido van Rossum0368b722007-05-11 16:50:42 +00004516
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004517 ll = PyList_GET_SIZE(l);
4518 if (ll < argcntafter) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004519 _PyErr_Format(tstate, PyExc_ValueError,
R David Murray4171bbe2015-04-15 17:08:45 -04004520 "not enough values to unpack (expected at least %d, got %zd)",
4521 argcnt + argcntafter, argcnt + ll);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004522 goto Error;
4523 }
Guido van Rossum0368b722007-05-11 16:50:42 +00004524
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004525 /* Pop the "after-variable" args off the list. */
4526 for (j = argcntafter; j > 0; j--, i++) {
4527 *--sp = PyList_GET_ITEM(l, ll - j);
4528 }
4529 /* Resize the list. */
4530 Py_SIZE(l) = ll - argcntafter;
4531 Py_DECREF(it);
4532 return 1;
Guido van Rossum0368b722007-05-11 16:50:42 +00004533
Tim Petersd6d010b2001-06-21 02:49:55 +00004534Error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004535 for (; i > 0; i--, sp++)
4536 Py_DECREF(*sp);
4537 Py_XDECREF(it);
4538 return 0;
Barry Warsawe42b18f1997-08-25 22:13:04 +00004539}
4540
4541
Guido van Rossum96a42c81992-01-12 02:29:51 +00004542#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00004543static int
Victor Stinner438a12d2019-05-24 17:01:38 +02004544prtrace(PyThreadState *tstate, PyObject *v, const char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004545{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004546 printf("%s ", str);
Victor Stinner438a12d2019-05-24 17:01:38 +02004547 if (PyObject_Print(v, stdout, 0) != 0) {
4548 /* Don't know what else to do */
4549 _PyErr_Clear(tstate);
4550 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004551 printf("\n");
4552 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004553}
Guido van Rossum3f5da241990-12-20 15:06:42 +00004554#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004555
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00004556static void
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004557call_exc_trace(Py_tracefunc func, PyObject *self,
4558 PyThreadState *tstate, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00004559{
Victor Stinneraaa8ed82013-07-10 13:57:55 +02004560 PyObject *type, *value, *traceback, *orig_traceback, *arg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004561 int err;
Victor Stinner438a12d2019-05-24 17:01:38 +02004562 _PyErr_Fetch(tstate, &type, &value, &orig_traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004563 if (value == NULL) {
4564 value = Py_None;
4565 Py_INCREF(value);
4566 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004567 _PyErr_NormalizeException(tstate, &type, &value, &orig_traceback);
Antoine Pitrou89335212013-11-23 14:05:23 +01004568 traceback = (orig_traceback != NULL) ? orig_traceback : Py_None;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004569 arg = PyTuple_Pack(3, type, value, traceback);
4570 if (arg == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004571 _PyErr_Restore(tstate, type, value, orig_traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004572 return;
4573 }
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004574 err = call_trace(func, self, tstate, f, PyTrace_EXCEPTION, arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004575 Py_DECREF(arg);
Victor Stinner438a12d2019-05-24 17:01:38 +02004576 if (err == 0) {
4577 _PyErr_Restore(tstate, type, value, orig_traceback);
4578 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004579 else {
4580 Py_XDECREF(type);
4581 Py_XDECREF(value);
Victor Stinneraaa8ed82013-07-10 13:57:55 +02004582 Py_XDECREF(orig_traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004583 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00004584}
4585
Amaury Forgeot d'Arcf05149a2007-11-13 01:05:30 +00004586static int
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004587call_trace_protected(Py_tracefunc func, PyObject *obj,
4588 PyThreadState *tstate, PyFrameObject *frame,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004589 int what, PyObject *arg)
Fred Drake4ec5d562001-10-04 19:26:43 +00004590{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004591 PyObject *type, *value, *traceback;
4592 int err;
Victor Stinner438a12d2019-05-24 17:01:38 +02004593 _PyErr_Fetch(tstate, &type, &value, &traceback);
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004594 err = call_trace(func, obj, tstate, frame, what, arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004595 if (err == 0)
4596 {
Victor Stinner438a12d2019-05-24 17:01:38 +02004597 _PyErr_Restore(tstate, type, value, traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004598 return 0;
4599 }
4600 else {
4601 Py_XDECREF(type);
4602 Py_XDECREF(value);
4603 Py_XDECREF(traceback);
4604 return -1;
4605 }
Fred Drake4ec5d562001-10-04 19:26:43 +00004606}
4607
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00004608static int
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004609call_trace(Py_tracefunc func, PyObject *obj,
4610 PyThreadState *tstate, PyFrameObject *frame,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004611 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00004612{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004613 int result;
4614 if (tstate->tracing)
4615 return 0;
4616 tstate->tracing++;
4617 tstate->use_tracing = 0;
4618 result = func(obj, frame, what, arg);
4619 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
4620 || (tstate->c_profilefunc != NULL));
4621 tstate->tracing--;
4622 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00004623}
4624
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00004625PyObject *
4626_PyEval_CallTracing(PyObject *func, PyObject *args)
4627{
Victor Stinner50b48572018-11-01 01:51:40 +01004628 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004629 int save_tracing = tstate->tracing;
4630 int save_use_tracing = tstate->use_tracing;
4631 PyObject *result;
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00004632
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004633 tstate->tracing = 0;
4634 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
4635 || (tstate->c_profilefunc != NULL));
4636 result = PyObject_Call(func, args, NULL);
4637 tstate->tracing = save_tracing;
4638 tstate->use_tracing = save_use_tracing;
4639 return result;
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00004640}
4641
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00004642/* See Objects/lnotab_notes.txt for a description of how tracing works. */
Michael W. Hudson006c7522002-11-08 13:08:46 +00004643static int
Tim Peters8a5c3c72004-04-05 19:36:21 +00004644maybe_call_line_trace(Py_tracefunc func, PyObject *obj,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004645 PyThreadState *tstate, PyFrameObject *frame,
4646 int *instr_lb, int *instr_ub, int *instr_prev)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004647{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004648 int result = 0;
4649 int line = frame->f_lineno;
Michael W. Hudson006c7522002-11-08 13:08:46 +00004650
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004651 /* If the last instruction executed isn't in the current
4652 instruction window, reset the window.
4653 */
4654 if (frame->f_lasti < *instr_lb || frame->f_lasti >= *instr_ub) {
4655 PyAddrPair bounds;
4656 line = _PyCode_CheckLineNumber(frame->f_code, frame->f_lasti,
4657 &bounds);
4658 *instr_lb = bounds.ap_lower;
4659 *instr_ub = bounds.ap_upper;
4660 }
Nick Coghlan5a851672017-09-08 10:14:16 +10004661 /* If the last instruction falls at the start of a line or if it
4662 represents a jump backwards, update the frame's line number and
4663 then call the trace function if we're tracing source lines.
4664 */
4665 if ((frame->f_lasti == *instr_lb || frame->f_lasti < *instr_prev)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004666 frame->f_lineno = line;
Nick Coghlan5a851672017-09-08 10:14:16 +10004667 if (frame->f_trace_lines) {
4668 result = call_trace(func, obj, tstate, frame, PyTrace_LINE, Py_None);
4669 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004670 }
George King20faa682017-10-18 17:44:22 -07004671 /* Always emit an opcode event if we're tracing all opcodes. */
4672 if (frame->f_trace_opcodes) {
4673 result = call_trace(func, obj, tstate, frame, PyTrace_OPCODE, Py_None);
4674 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004675 *instr_prev = frame->f_lasti;
4676 return result;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004677}
4678
Fred Drake5755ce62001-06-27 19:19:46 +00004679void
4680PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00004681{
Steve Dowerb82e17e2019-05-23 08:45:22 -07004682 if (PySys_Audit("sys.setprofile", NULL) < 0) {
4683 return;
4684 }
4685
Victor Stinner50b48572018-11-01 01:51:40 +01004686 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004687 PyObject *temp = tstate->c_profileobj;
4688 Py_XINCREF(arg);
4689 tstate->c_profilefunc = NULL;
4690 tstate->c_profileobj = NULL;
4691 /* Must make sure that tracing is not ignored if 'temp' is freed */
4692 tstate->use_tracing = tstate->c_tracefunc != NULL;
4693 Py_XDECREF(temp);
4694 tstate->c_profilefunc = func;
4695 tstate->c_profileobj = arg;
4696 /* Flag that tracing or profiling is turned on */
4697 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
Fred Drake5755ce62001-06-27 19:19:46 +00004698}
4699
4700void
4701PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
4702{
Steve Dowerb82e17e2019-05-23 08:45:22 -07004703 if (PySys_Audit("sys.settrace", NULL) < 0) {
4704 return;
4705 }
4706
Victor Stinner09532fe2019-05-10 23:39:09 +02004707 _PyRuntimeState *runtime = &_PyRuntime;
4708 PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004709 PyObject *temp = tstate->c_traceobj;
Victor Stinner09532fe2019-05-10 23:39:09 +02004710 runtime->ceval.tracing_possible += (func != NULL) - (tstate->c_tracefunc != NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004711 Py_XINCREF(arg);
4712 tstate->c_tracefunc = NULL;
4713 tstate->c_traceobj = NULL;
4714 /* Must make sure that profiling is not ignored if 'temp' is freed */
4715 tstate->use_tracing = tstate->c_profilefunc != NULL;
4716 Py_XDECREF(temp);
4717 tstate->c_tracefunc = func;
4718 tstate->c_traceobj = arg;
4719 /* Flag that tracing or profiling is turned on */
4720 tstate->use_tracing = ((func != NULL)
4721 || (tstate->c_profilefunc != NULL));
Fred Draked0838392001-06-16 21:02:31 +00004722}
4723
Yury Selivanov75445082015-05-11 22:57:16 -04004724void
Victor Stinner838f2642019-06-13 22:41:23 +02004725_PyEval_SetCoroutineOriginTrackingDepth(PyThreadState *tstate, int new_depth)
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08004726{
4727 assert(new_depth >= 0);
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08004728 tstate->coroutine_origin_tracking_depth = new_depth;
4729}
4730
4731int
4732_PyEval_GetCoroutineOriginTrackingDepth(void)
4733{
Victor Stinner50b48572018-11-01 01:51:40 +01004734 PyThreadState *tstate = _PyThreadState_GET();
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08004735 return tstate->coroutine_origin_tracking_depth;
4736}
4737
4738void
Yury Selivanoveb636452016-09-08 22:01:51 -07004739_PyEval_SetAsyncGenFirstiter(PyObject *firstiter)
4740{
Victor Stinner50b48572018-11-01 01:51:40 +01004741 PyThreadState *tstate = _PyThreadState_GET();
Steve Dowerb82e17e2019-05-23 08:45:22 -07004742
4743 if (PySys_Audit("sys.set_asyncgen_hook_firstiter", NULL) < 0) {
4744 return;
4745 }
4746
Yury Selivanoveb636452016-09-08 22:01:51 -07004747 Py_XINCREF(firstiter);
4748 Py_XSETREF(tstate->async_gen_firstiter, firstiter);
4749}
4750
4751PyObject *
4752_PyEval_GetAsyncGenFirstiter(void)
4753{
Victor Stinner50b48572018-11-01 01:51:40 +01004754 PyThreadState *tstate = _PyThreadState_GET();
Yury Selivanoveb636452016-09-08 22:01:51 -07004755 return tstate->async_gen_firstiter;
4756}
4757
4758void
4759_PyEval_SetAsyncGenFinalizer(PyObject *finalizer)
4760{
Victor Stinner50b48572018-11-01 01:51:40 +01004761 PyThreadState *tstate = _PyThreadState_GET();
Steve Dowerb82e17e2019-05-23 08:45:22 -07004762
4763 if (PySys_Audit("sys.set_asyncgen_hook_finalizer", NULL) < 0) {
4764 return;
4765 }
4766
Yury Selivanoveb636452016-09-08 22:01:51 -07004767 Py_XINCREF(finalizer);
4768 Py_XSETREF(tstate->async_gen_finalizer, finalizer);
4769}
4770
4771PyObject *
4772_PyEval_GetAsyncGenFinalizer(void)
4773{
Victor Stinner50b48572018-11-01 01:51:40 +01004774 PyThreadState *tstate = _PyThreadState_GET();
Yury Selivanoveb636452016-09-08 22:01:51 -07004775 return tstate->async_gen_finalizer;
4776}
4777
Victor Stinner438a12d2019-05-24 17:01:38 +02004778static PyFrameObject *
4779_PyEval_GetFrame(PyThreadState *tstate)
4780{
4781 return _PyRuntime.gilstate.getframe(tstate);
4782}
4783
4784PyFrameObject *
4785PyEval_GetFrame(void)
4786{
4787 PyThreadState *tstate = _PyThreadState_GET();
4788 return _PyEval_GetFrame(tstate);
4789}
4790
Guido van Rossumb209a111997-04-29 18:18:01 +00004791PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004792PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00004793{
Victor Stinner438a12d2019-05-24 17:01:38 +02004794 PyThreadState *tstate = _PyThreadState_GET();
4795 PyFrameObject *current_frame = _PyEval_GetFrame(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004796 if (current_frame == NULL)
Victor Stinner438a12d2019-05-24 17:01:38 +02004797 return tstate->interp->builtins;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004798 else
4799 return current_frame->f_builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00004800}
4801
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02004802/* Convenience function to get a builtin from its name */
4803PyObject *
4804_PyEval_GetBuiltinId(_Py_Identifier *name)
4805{
Victor Stinner438a12d2019-05-24 17:01:38 +02004806 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02004807 PyObject *attr = _PyDict_GetItemIdWithError(PyEval_GetBuiltins(), name);
4808 if (attr) {
4809 Py_INCREF(attr);
4810 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004811 else if (!_PyErr_Occurred(tstate)) {
4812 _PyErr_SetObject(tstate, PyExc_AttributeError, _PyUnicode_FromId(name));
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02004813 }
4814 return attr;
4815}
4816
Guido van Rossumb209a111997-04-29 18:18:01 +00004817PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004818PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00004819{
Victor Stinner438a12d2019-05-24 17:01:38 +02004820 PyThreadState *tstate = _PyThreadState_GET();
4821 PyFrameObject *current_frame = _PyEval_GetFrame(tstate);
Victor Stinner41bb43a2013-10-29 01:19:37 +01004822 if (current_frame == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004823 _PyErr_SetString(tstate, PyExc_SystemError, "frame does not exist");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004824 return NULL;
Victor Stinner41bb43a2013-10-29 01:19:37 +01004825 }
4826
Victor Stinner438a12d2019-05-24 17:01:38 +02004827 if (PyFrame_FastToLocalsWithError(current_frame) < 0) {
Victor Stinner41bb43a2013-10-29 01:19:37 +01004828 return NULL;
Victor Stinner438a12d2019-05-24 17:01:38 +02004829 }
Victor Stinner41bb43a2013-10-29 01:19:37 +01004830
4831 assert(current_frame->f_locals != NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004832 return current_frame->f_locals;
Guido van Rossum5b722181993-03-30 17:46:03 +00004833}
4834
Guido van Rossumb209a111997-04-29 18:18:01 +00004835PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004836PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00004837{
Victor Stinner438a12d2019-05-24 17:01:38 +02004838 PyThreadState *tstate = _PyThreadState_GET();
4839 PyFrameObject *current_frame = _PyEval_GetFrame(tstate);
4840 if (current_frame == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004841 return NULL;
Victor Stinner438a12d2019-05-24 17:01:38 +02004842 }
Victor Stinner41bb43a2013-10-29 01:19:37 +01004843
4844 assert(current_frame->f_globals != NULL);
4845 return current_frame->f_globals;
Guido van Rossum3f5da241990-12-20 15:06:42 +00004846}
4847
Guido van Rossum6135a871995-01-09 17:53:26 +00004848int
Tim Peters5ba58662001-07-16 02:29:45 +00004849PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
Jeremy Hylton061d1062001-03-22 02:32:48 +00004850{
Victor Stinner438a12d2019-05-24 17:01:38 +02004851 PyThreadState *tstate = _PyThreadState_GET();
4852 PyFrameObject *current_frame = _PyEval_GetFrame(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004853 int result = cf->cf_flags != 0;
Tim Peters5ba58662001-07-16 02:29:45 +00004854
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004855 if (current_frame != NULL) {
4856 const int codeflags = current_frame->f_code->co_flags;
4857 const int compilerflags = codeflags & PyCF_MASK;
4858 if (compilerflags) {
4859 result = 1;
4860 cf->cf_flags |= compilerflags;
4861 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00004862#if 0 /* future keyword */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004863 if (codeflags & CO_GENERATOR_ALLOWED) {
4864 result = 1;
4865 cf->cf_flags |= CO_GENERATOR_ALLOWED;
4866 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00004867#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004868 }
4869 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00004870}
4871
Guido van Rossum3f5da241990-12-20 15:06:42 +00004872
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00004873const char *
Tim Peters6d6c1a32001-08-02 04:15:00 +00004874PyEval_GetFuncName(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00004875{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004876 if (PyMethod_Check(func))
4877 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
4878 else if (PyFunction_Check(func))
Serhiy Storchaka06515832016-11-20 09:13:07 +02004879 return PyUnicode_AsUTF8(((PyFunctionObject*)func)->func_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004880 else if (PyCFunction_Check(func))
4881 return ((PyCFunctionObject*)func)->m_ml->ml_name;
4882 else
4883 return func->ob_type->tp_name;
Jeremy Hylton512a2372001-04-11 13:52:29 +00004884}
4885
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00004886const char *
Tim Peters6d6c1a32001-08-02 04:15:00 +00004887PyEval_GetFuncDesc(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00004888{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004889 if (PyMethod_Check(func))
4890 return "()";
4891 else if (PyFunction_Check(func))
4892 return "()";
4893 else if (PyCFunction_Check(func))
4894 return "()";
4895 else
4896 return " object";
Jeremy Hylton512a2372001-04-11 13:52:29 +00004897}
4898
Armin Rigo1c2d7e52005-09-20 18:34:01 +00004899#define C_TRACE(x, call) \
Nicholas Bastind858a772004-06-25 23:31:06 +00004900if (tstate->use_tracing && tstate->c_profilefunc) { \
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004901 if (call_trace(tstate->c_profilefunc, tstate->c_profileobj, \
4902 tstate, tstate->frame, \
4903 PyTrace_C_CALL, func)) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004904 x = NULL; \
4905 } \
4906 else { \
4907 x = call; \
4908 if (tstate->c_profilefunc != NULL) { \
4909 if (x == NULL) { \
4910 call_trace_protected(tstate->c_profilefunc, \
4911 tstate->c_profileobj, \
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004912 tstate, tstate->frame, \
4913 PyTrace_C_EXCEPTION, func); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004914 /* XXX should pass (type, value, tb) */ \
4915 } else { \
4916 if (call_trace(tstate->c_profilefunc, \
4917 tstate->c_profileobj, \
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004918 tstate, tstate->frame, \
4919 PyTrace_C_RETURN, func)) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004920 Py_DECREF(x); \
4921 x = NULL; \
4922 } \
4923 } \
4924 } \
4925 } \
Nicholas Bastind858a772004-06-25 23:31:06 +00004926} else { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004927 x = call; \
4928 }
Nicholas Bastinc69ebe82004-03-24 21:57:10 +00004929
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02004930
4931static PyObject *
4932trace_call_function(PyThreadState *tstate,
4933 PyObject *func,
4934 PyObject **args, Py_ssize_t nargs,
4935 PyObject *kwnames)
4936{
4937 PyObject *x;
4938 if (PyCFunction_Check(func)) {
Jeroen Demeyer37788bc2019-05-30 15:11:22 +02004939 C_TRACE(x, _PyCFunction_Vectorcall(func, args, nargs, kwnames));
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02004940 return x;
4941 }
4942 else if (Py_TYPE(func) == &PyMethodDescr_Type && nargs > 0) {
4943 /* We need to create a temporary bound method as argument
4944 for profiling.
4945
4946 If nargs == 0, then this cannot work because we have no
4947 "self". In any case, the call itself would raise
4948 TypeError (foo needs an argument), so we just skip
4949 profiling. */
4950 PyObject *self = args[0];
4951 func = Py_TYPE(func)->tp_descr_get(func, self, (PyObject*)Py_TYPE(self));
4952 if (func == NULL) {
4953 return NULL;
4954 }
Jeroen Demeyer37788bc2019-05-30 15:11:22 +02004955 C_TRACE(x, _PyCFunction_Vectorcall(func,
4956 args+1, nargs-1,
4957 kwnames));
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02004958 Py_DECREF(func);
4959 return x;
4960 }
4961 return _PyObject_Vectorcall(func, args, nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames);
4962}
4963
Victor Stinner415c5102017-01-11 00:54:57 +01004964/* Issue #29227: Inline call_function() into _PyEval_EvalFrameDefault()
4965 to reduce the stack consumption. */
4966Py_LOCAL_INLINE(PyObject *) _Py_HOT_FUNCTION
Victor Stinner09532fe2019-05-10 23:39:09 +02004967call_function(PyThreadState *tstate, PyObject ***pp_stack, Py_ssize_t oparg, PyObject *kwnames)
Jeremy Hyltone8c04322002-08-16 17:47:26 +00004968{
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004969 PyObject **pfunc = (*pp_stack) - oparg - 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004970 PyObject *func = *pfunc;
4971 PyObject *x, *w;
Victor Stinnerd8735722016-09-09 12:36:44 -07004972 Py_ssize_t nkwargs = (kwnames == NULL) ? 0 : PyTuple_GET_SIZE(kwnames);
4973 Py_ssize_t nargs = oparg - nkwargs;
INADA Naoki5566bbb2017-02-03 07:43:03 +09004974 PyObject **stack = (*pp_stack) - nargs - nkwargs;
Jeremy Hyltone8c04322002-08-16 17:47:26 +00004975
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02004976 if (tstate->use_tracing) {
4977 x = trace_call_function(tstate, func, stack, nargs, kwnames);
INADA Naoki5566bbb2017-02-03 07:43:03 +09004978 }
Victor Stinner4a7cc882015-03-06 23:35:27 +01004979 else {
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02004980 x = _PyObject_Vectorcall(func, stack, nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004981 }
Tim Peters8a5c3c72004-04-05 19:36:21 +00004982
Victor Stinner438a12d2019-05-24 17:01:38 +02004983 assert((x != NULL) ^ (_PyErr_Occurred(tstate) != NULL));
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004984
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01004985 /* Clear the stack of the function object. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004986 while ((*pp_stack) > pfunc) {
4987 w = EXT_POP(*pp_stack);
4988 Py_DECREF(w);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004989 }
Victor Stinnerace47d72013-07-18 01:41:08 +02004990
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004991 return x;
Jeremy Hyltone8c04322002-08-16 17:47:26 +00004992}
4993
Jeremy Hylton52820442001-01-03 23:52:36 +00004994static PyObject *
Victor Stinner09532fe2019-05-10 23:39:09 +02004995do_call_core(PyThreadState *tstate, PyObject *func, PyObject *callargs, PyObject *kwdict)
Jeremy Hylton52820442001-01-03 23:52:36 +00004996{
jdemeyere89de732018-09-19 12:06:20 +02004997 PyObject *result;
4998
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004999 if (PyCFunction_Check(func)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005000 C_TRACE(result, PyCFunction_Call(func, callargs, kwdict));
Victor Stinnerf9b760f2016-09-09 10:17:08 -07005001 return result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005002 }
jdemeyere89de732018-09-19 12:06:20 +02005003 else if (Py_TYPE(func) == &PyMethodDescr_Type) {
jdemeyere89de732018-09-19 12:06:20 +02005004 Py_ssize_t nargs = PyTuple_GET_SIZE(callargs);
5005 if (nargs > 0 && tstate->use_tracing) {
5006 /* We need to create a temporary bound method as argument
5007 for profiling.
5008
5009 If nargs == 0, then this cannot work because we have no
5010 "self". In any case, the call itself would raise
5011 TypeError (foo needs an argument), so we just skip
5012 profiling. */
5013 PyObject *self = PyTuple_GET_ITEM(callargs, 0);
5014 func = Py_TYPE(func)->tp_descr_get(func, self, (PyObject*)Py_TYPE(self));
5015 if (func == NULL) {
5016 return NULL;
5017 }
5018
Jeroen Demeyer7e1a9aa2019-06-20 17:38:46 +02005019 C_TRACE(result, _PyObject_FastCallDict(func,
5020 &_PyTuple_ITEMS(callargs)[1],
5021 nargs - 1,
5022 kwdict));
jdemeyere89de732018-09-19 12:06:20 +02005023 Py_DECREF(func);
5024 return result;
5025 }
Victor Stinner74319ae2016-08-25 00:04:09 +02005026 }
jdemeyere89de732018-09-19 12:06:20 +02005027 return PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00005028}
5029
Serhiy Storchaka483405b2015-02-17 10:14:30 +02005030/* Extract a slice index from a PyLong or an object with the
Guido van Rossum38fff8c2006-03-07 18:50:55 +00005031 nb_index slot defined, and store in *pi.
5032 Silently reduce values larger than PY_SSIZE_T_MAX to PY_SSIZE_T_MAX,
Xiang Zhang2ddf5a12017-05-10 18:19:41 +08005033 and silently boost values less than PY_SSIZE_T_MIN to PY_SSIZE_T_MIN.
Martin v. Löwisdde99d22006-02-17 15:57:41 +00005034 Return 0 on error, 1 on success.
Tim Peterscb479e72001-12-16 19:11:44 +00005035*/
Guido van Rossum20c6add2000-05-08 14:06:50 +00005036int
Martin v. Löwis18e16552006-02-15 17:27:45 +00005037_PyEval_SliceIndex(PyObject *v, Py_ssize_t *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005038{
Victor Stinner438a12d2019-05-24 17:01:38 +02005039 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005040 if (v != Py_None) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005041 Py_ssize_t x;
5042 if (PyIndex_Check(v)) {
5043 x = PyNumber_AsSsize_t(v, NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02005044 if (x == -1 && _PyErr_Occurred(tstate))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005045 return 0;
5046 }
5047 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02005048 _PyErr_SetString(tstate, PyExc_TypeError,
5049 "slice indices must be integers or "
5050 "None or have an __index__ method");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005051 return 0;
5052 }
5053 *pi = x;
5054 }
5055 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005056}
5057
Serhiy Storchaka80ec8362017-03-19 19:37:40 +02005058int
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005059_PyEval_SliceIndexNotNone(PyObject *v, Py_ssize_t *pi)
Serhiy Storchaka80ec8362017-03-19 19:37:40 +02005060{
Victor Stinner438a12d2019-05-24 17:01:38 +02005061 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005062 Py_ssize_t x;
5063 if (PyIndex_Check(v)) {
5064 x = PyNumber_AsSsize_t(v, NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02005065 if (x == -1 && _PyErr_Occurred(tstate))
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005066 return 0;
5067 }
5068 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02005069 _PyErr_SetString(tstate, PyExc_TypeError,
5070 "slice indices must be integers or "
5071 "have an __index__ method");
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005072 return 0;
5073 }
5074 *pi = x;
5075 return 1;
Serhiy Storchaka80ec8362017-03-19 19:37:40 +02005076}
5077
5078
Guido van Rossum486364b2007-06-30 05:01:58 +00005079#define CANNOT_CATCH_MSG "catching classes that do not inherit from "\
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005080 "BaseException is not allowed"
Brett Cannonf74225d2007-02-26 21:10:16 +00005081
Guido van Rossumb209a111997-04-29 18:18:01 +00005082static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02005083cmp_outcome(PyThreadState *tstate, int op, PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005084{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005085 int res = 0;
5086 switch (op) {
5087 case PyCmp_IS:
5088 res = (v == w);
5089 break;
5090 case PyCmp_IS_NOT:
5091 res = (v != w);
5092 break;
5093 case PyCmp_IN:
5094 res = PySequence_Contains(w, v);
5095 if (res < 0)
5096 return NULL;
5097 break;
5098 case PyCmp_NOT_IN:
5099 res = PySequence_Contains(w, v);
5100 if (res < 0)
5101 return NULL;
5102 res = !res;
5103 break;
5104 case PyCmp_EXC_MATCH:
5105 if (PyTuple_Check(w)) {
5106 Py_ssize_t i, length;
5107 length = PyTuple_Size(w);
5108 for (i = 0; i < length; i += 1) {
5109 PyObject *exc = PyTuple_GET_ITEM(w, i);
5110 if (!PyExceptionClass_Check(exc)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005111 _PyErr_SetString(tstate, PyExc_TypeError,
5112 CANNOT_CATCH_MSG);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005113 return NULL;
5114 }
5115 }
5116 }
5117 else {
5118 if (!PyExceptionClass_Check(w)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005119 _PyErr_SetString(tstate, PyExc_TypeError,
5120 CANNOT_CATCH_MSG);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005121 return NULL;
5122 }
5123 }
5124 res = PyErr_GivenExceptionMatches(v, w);
5125 break;
5126 default:
5127 return PyObject_RichCompare(v, w, op);
5128 }
5129 v = res ? Py_True : Py_False;
5130 Py_INCREF(v);
5131 return v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005132}
5133
Thomas Wouters52152252000-08-17 22:55:00 +00005134static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02005135import_name(PyThreadState *tstate, PyFrameObject *f,
5136 PyObject *name, PyObject *fromlist, PyObject *level)
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005137{
5138 _Py_IDENTIFIER(__import__);
Victor Stinnerdf142fd2016-08-20 00:44:42 +02005139 PyObject *import_func, *res;
5140 PyObject* stack[5];
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005141
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02005142 import_func = _PyDict_GetItemIdWithError(f->f_builtins, &PyId___import__);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005143 if (import_func == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005144 if (!_PyErr_Occurred(tstate)) {
5145 _PyErr_SetString(tstate, PyExc_ImportError, "__import__ not found");
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02005146 }
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005147 return NULL;
5148 }
5149
5150 /* Fast path for not overloaded __import__. */
Victor Stinner438a12d2019-05-24 17:01:38 +02005151 if (import_func == tstate->interp->import_func) {
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005152 int ilevel = _PyLong_AsInt(level);
Victor Stinner438a12d2019-05-24 17:01:38 +02005153 if (ilevel == -1 && _PyErr_Occurred(tstate)) {
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005154 return NULL;
5155 }
5156 res = PyImport_ImportModuleLevelObject(
5157 name,
5158 f->f_globals,
5159 f->f_locals == NULL ? Py_None : f->f_locals,
5160 fromlist,
5161 ilevel);
5162 return res;
5163 }
5164
5165 Py_INCREF(import_func);
Victor Stinnerdf142fd2016-08-20 00:44:42 +02005166
5167 stack[0] = name;
5168 stack[1] = f->f_globals;
5169 stack[2] = f->f_locals == NULL ? Py_None : f->f_locals;
5170 stack[3] = fromlist;
5171 stack[4] = level;
Victor Stinner559bb6a2016-08-22 22:48:54 +02005172 res = _PyObject_FastCall(import_func, stack, 5);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005173 Py_DECREF(import_func);
5174 return res;
5175}
5176
5177static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02005178import_from(PyThreadState *tstate, PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00005179{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005180 PyObject *x;
Antoine Pitrou0373a102014-10-13 20:19:45 +02005181 _Py_IDENTIFIER(__name__);
Xiang Zhang4830f582017-03-21 11:13:42 +08005182 PyObject *fullmodname, *pkgname, *pkgpath, *pkgname_or_unknown, *errmsg;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00005183
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005184 if (_PyObject_LookupAttr(v, name, &x) != 0) {
Antoine Pitrou0373a102014-10-13 20:19:45 +02005185 return x;
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005186 }
Antoine Pitrou0373a102014-10-13 20:19:45 +02005187 /* Issue #17636: in case this failed because of a circular relative
5188 import, try to fallback on reading the module directly from
5189 sys.modules. */
Antoine Pitrou0373a102014-10-13 20:19:45 +02005190 pkgname = _PyObject_GetAttrId(v, &PyId___name__);
Brett Cannon3008bc02015-08-11 18:01:31 -07005191 if (pkgname == NULL) {
5192 goto error;
5193 }
Oren Milman6db70332017-09-19 14:23:01 +03005194 if (!PyUnicode_Check(pkgname)) {
5195 Py_CLEAR(pkgname);
5196 goto error;
5197 }
Antoine Pitrou0373a102014-10-13 20:19:45 +02005198 fullmodname = PyUnicode_FromFormat("%U.%U", pkgname, name);
Brett Cannon3008bc02015-08-11 18:01:31 -07005199 if (fullmodname == NULL) {
Xiang Zhang4830f582017-03-21 11:13:42 +08005200 Py_DECREF(pkgname);
Antoine Pitrou0373a102014-10-13 20:19:45 +02005201 return NULL;
Brett Cannon3008bc02015-08-11 18:01:31 -07005202 }
Eric Snow3f9eee62017-09-15 16:35:20 -06005203 x = PyImport_GetModule(fullmodname);
Antoine Pitrou0373a102014-10-13 20:19:45 +02005204 Py_DECREF(fullmodname);
Victor Stinner438a12d2019-05-24 17:01:38 +02005205 if (x == NULL && !_PyErr_Occurred(tstate)) {
Brett Cannon3008bc02015-08-11 18:01:31 -07005206 goto error;
5207 }
Matthias Bussonnier1bc15642017-02-22 07:06:50 -08005208 Py_DECREF(pkgname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005209 return x;
Brett Cannon3008bc02015-08-11 18:01:31 -07005210 error:
Matthias Bussonnierbc4bed42017-02-14 16:05:25 -08005211 pkgpath = PyModule_GetFilenameObject(v);
Matthias Bussonnier1bc15642017-02-22 07:06:50 -08005212 if (pkgname == NULL) {
5213 pkgname_or_unknown = PyUnicode_FromString("<unknown module name>");
5214 if (pkgname_or_unknown == NULL) {
5215 Py_XDECREF(pkgpath);
5216 return NULL;
5217 }
5218 } else {
5219 pkgname_or_unknown = pkgname;
5220 }
Matthias Bussonnierbc4bed42017-02-14 16:05:25 -08005221
5222 if (pkgpath == NULL || !PyUnicode_Check(pkgpath)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005223 _PyErr_Clear(tstate);
Xiang Zhang4830f582017-03-21 11:13:42 +08005224 errmsg = PyUnicode_FromFormat(
5225 "cannot import name %R from %R (unknown location)",
5226 name, pkgname_or_unknown
5227 );
Stefan Krah027b09c2019-03-25 21:50:58 +01005228 /* NULL checks for errmsg and pkgname done by PyErr_SetImportError. */
Xiang Zhang4830f582017-03-21 11:13:42 +08005229 PyErr_SetImportError(errmsg, pkgname, NULL);
5230 }
5231 else {
5232 errmsg = PyUnicode_FromFormat(
5233 "cannot import name %R from %R (%S)",
5234 name, pkgname_or_unknown, pkgpath
5235 );
Stefan Krah027b09c2019-03-25 21:50:58 +01005236 /* NULL checks for errmsg and pkgname done by PyErr_SetImportError. */
Xiang Zhang4830f582017-03-21 11:13:42 +08005237 PyErr_SetImportError(errmsg, pkgname, pkgpath);
Matthias Bussonnierbc4bed42017-02-14 16:05:25 -08005238 }
5239
Xiang Zhang4830f582017-03-21 11:13:42 +08005240 Py_XDECREF(errmsg);
Matthias Bussonnier1bc15642017-02-22 07:06:50 -08005241 Py_XDECREF(pkgname_or_unknown);
5242 Py_XDECREF(pkgpath);
Brett Cannon3008bc02015-08-11 18:01:31 -07005243 return NULL;
Thomas Wouters52152252000-08-17 22:55:00 +00005244}
Guido van Rossumac7be682001-01-17 15:42:30 +00005245
Thomas Wouters52152252000-08-17 22:55:00 +00005246static int
Victor Stinner438a12d2019-05-24 17:01:38 +02005247import_all_from(PyThreadState *tstate, PyObject *locals, PyObject *v)
Thomas Wouters52152252000-08-17 22:55:00 +00005248{
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02005249 _Py_IDENTIFIER(__all__);
5250 _Py_IDENTIFIER(__dict__);
Xiang Zhangd8b291a2018-03-24 18:39:36 +08005251 _Py_IDENTIFIER(__name__);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005252 PyObject *all, *dict, *name, *value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005253 int skip_leading_underscores = 0;
5254 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00005255
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005256 if (_PyObject_LookupAttrId(v, &PyId___all__, &all) < 0) {
5257 return -1; /* Unexpected error */
5258 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005259 if (all == NULL) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005260 if (_PyObject_LookupAttrId(v, &PyId___dict__, &dict) < 0) {
5261 return -1;
5262 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005263 if (dict == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005264 _PyErr_SetString(tstate, PyExc_ImportError,
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005265 "from-import-* object has no __dict__ and no __all__");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005266 return -1;
5267 }
5268 all = PyMapping_Keys(dict);
5269 Py_DECREF(dict);
5270 if (all == NULL)
5271 return -1;
5272 skip_leading_underscores = 1;
5273 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00005274
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005275 for (pos = 0, err = 0; ; pos++) {
5276 name = PySequence_GetItem(all, pos);
5277 if (name == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005278 if (!_PyErr_ExceptionMatches(tstate, PyExc_IndexError)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005279 err = -1;
Victor Stinner438a12d2019-05-24 17:01:38 +02005280 }
5281 else {
5282 _PyErr_Clear(tstate);
5283 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005284 break;
5285 }
Xiang Zhangd8b291a2018-03-24 18:39:36 +08005286 if (!PyUnicode_Check(name)) {
5287 PyObject *modname = _PyObject_GetAttrId(v, &PyId___name__);
5288 if (modname == NULL) {
5289 Py_DECREF(name);
5290 err = -1;
5291 break;
5292 }
5293 if (!PyUnicode_Check(modname)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005294 _PyErr_Format(tstate, PyExc_TypeError,
5295 "module __name__ must be a string, not %.100s",
5296 Py_TYPE(modname)->tp_name);
Xiang Zhangd8b291a2018-03-24 18:39:36 +08005297 }
5298 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02005299 _PyErr_Format(tstate, PyExc_TypeError,
5300 "%s in %U.%s must be str, not %.100s",
5301 skip_leading_underscores ? "Key" : "Item",
5302 modname,
5303 skip_leading_underscores ? "__dict__" : "__all__",
5304 Py_TYPE(name)->tp_name);
Xiang Zhangd8b291a2018-03-24 18:39:36 +08005305 }
5306 Py_DECREF(modname);
5307 Py_DECREF(name);
5308 err = -1;
5309 break;
5310 }
5311 if (skip_leading_underscores) {
Serhiy Storchakae3b2b4b2017-09-08 09:58:51 +03005312 if (PyUnicode_READY(name) == -1) {
5313 Py_DECREF(name);
5314 err = -1;
5315 break;
5316 }
5317 if (PyUnicode_READ_CHAR(name, 0) == '_') {
5318 Py_DECREF(name);
5319 continue;
5320 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005321 }
5322 value = PyObject_GetAttr(v, name);
5323 if (value == NULL)
5324 err = -1;
5325 else if (PyDict_CheckExact(locals))
5326 err = PyDict_SetItem(locals, name, value);
5327 else
5328 err = PyObject_SetItem(locals, name, value);
5329 Py_DECREF(name);
5330 Py_XDECREF(value);
5331 if (err != 0)
5332 break;
5333 }
5334 Py_DECREF(all);
5335 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00005336}
5337
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005338static int
Victor Stinner438a12d2019-05-24 17:01:38 +02005339check_args_iterable(PyThreadState *tstate, PyObject *func, PyObject *args)
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005340{
5341 if (args->ob_type->tp_iter == NULL && !PySequence_Check(args)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005342 _PyErr_Format(tstate, PyExc_TypeError,
5343 "%.200s%.200s argument after * "
5344 "must be an iterable, not %.200s",
5345 PyEval_GetFuncName(func),
5346 PyEval_GetFuncDesc(func),
5347 args->ob_type->tp_name);
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005348 return -1;
5349 }
5350 return 0;
5351}
5352
5353static void
Victor Stinner438a12d2019-05-24 17:01:38 +02005354format_kwargs_error(PyThreadState *tstate, PyObject *func, PyObject *kwargs)
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005355{
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005356 /* _PyDict_MergeEx raises attribute
5357 * error (percolated from an attempt
5358 * to get 'keys' attribute) instead of
5359 * a type error if its second argument
5360 * is not a mapping.
5361 */
Victor Stinner438a12d2019-05-24 17:01:38 +02005362 if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) {
5363 _PyErr_Format(tstate, PyExc_TypeError,
5364 "%.200s%.200s argument after ** "
5365 "must be a mapping, not %.200s",
5366 PyEval_GetFuncName(func),
5367 PyEval_GetFuncDesc(func),
5368 kwargs->ob_type->tp_name);
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005369 }
Victor Stinner438a12d2019-05-24 17:01:38 +02005370 else if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005371 PyObject *exc, *val, *tb;
Victor Stinner438a12d2019-05-24 17:01:38 +02005372 _PyErr_Fetch(tstate, &exc, &val, &tb);
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005373 if (val && PyTuple_Check(val) && PyTuple_GET_SIZE(val) == 1) {
5374 PyObject *key = PyTuple_GET_ITEM(val, 0);
5375 if (!PyUnicode_Check(key)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005376 _PyErr_Format(tstate, PyExc_TypeError,
5377 "%.200s%.200s keywords must be strings",
5378 PyEval_GetFuncName(func),
5379 PyEval_GetFuncDesc(func));
5380 }
5381 else {
5382 _PyErr_Format(tstate, PyExc_TypeError,
5383 "%.200s%.200s got multiple "
5384 "values for keyword argument '%U'",
5385 PyEval_GetFuncName(func),
5386 PyEval_GetFuncDesc(func),
5387 key);
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005388 }
5389 Py_XDECREF(exc);
5390 Py_XDECREF(val);
5391 Py_XDECREF(tb);
5392 }
5393 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02005394 _PyErr_Restore(tstate, exc, val, tb);
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005395 }
5396 }
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005397}
5398
Guido van Rossumac7be682001-01-17 15:42:30 +00005399static void
Victor Stinner438a12d2019-05-24 17:01:38 +02005400format_exc_check_arg(PyThreadState *tstate, PyObject *exc,
5401 const char *format_str, PyObject *obj)
Paul Prescode68140d2000-08-30 20:25:01 +00005402{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005403 const char *obj_str;
Paul Prescode68140d2000-08-30 20:25:01 +00005404
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005405 if (!obj)
5406 return;
Paul Prescode68140d2000-08-30 20:25:01 +00005407
Serhiy Storchaka06515832016-11-20 09:13:07 +02005408 obj_str = PyUnicode_AsUTF8(obj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005409 if (!obj_str)
5410 return;
Paul Prescode68140d2000-08-30 20:25:01 +00005411
Victor Stinner438a12d2019-05-24 17:01:38 +02005412 _PyErr_Format(tstate, exc, format_str, obj_str);
Paul Prescode68140d2000-08-30 20:25:01 +00005413}
Guido van Rossum950361c1997-01-24 13:49:28 +00005414
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005415static void
Victor Stinner438a12d2019-05-24 17:01:38 +02005416format_exc_unbound(PyThreadState *tstate, PyCodeObject *co, int oparg)
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005417{
5418 PyObject *name;
5419 /* Don't stomp existing exception */
Victor Stinner438a12d2019-05-24 17:01:38 +02005420 if (_PyErr_Occurred(tstate))
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005421 return;
5422 if (oparg < PyTuple_GET_SIZE(co->co_cellvars)) {
5423 name = PyTuple_GET_ITEM(co->co_cellvars,
5424 oparg);
Victor Stinner438a12d2019-05-24 17:01:38 +02005425 format_exc_check_arg(tstate,
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005426 PyExc_UnboundLocalError,
5427 UNBOUNDLOCAL_ERROR_MSG,
5428 name);
5429 } else {
5430 name = PyTuple_GET_ITEM(co->co_freevars, oparg -
5431 PyTuple_GET_SIZE(co->co_cellvars));
Victor Stinner438a12d2019-05-24 17:01:38 +02005432 format_exc_check_arg(tstate, PyExc_NameError,
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005433 UNBOUNDFREE_ERROR_MSG, name);
5434 }
5435}
5436
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03005437static void
Victor Stinner438a12d2019-05-24 17:01:38 +02005438format_awaitable_error(PyThreadState *tstate, PyTypeObject *type, int prevopcode)
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03005439{
5440 if (type->tp_as_async == NULL || type->tp_as_async->am_await == NULL) {
5441 if (prevopcode == BEFORE_ASYNC_WITH) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005442 _PyErr_Format(tstate, PyExc_TypeError,
5443 "'async with' received an object from __aenter__ "
5444 "that does not implement __await__: %.100s",
5445 type->tp_name);
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03005446 }
5447 else if (prevopcode == WITH_CLEANUP_START) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005448 _PyErr_Format(tstate, PyExc_TypeError,
5449 "'async with' received an object from __aexit__ "
5450 "that does not implement __await__: %.100s",
5451 type->tp_name);
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03005452 }
5453 }
5454}
5455
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005456static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02005457unicode_concatenate(PyThreadState *tstate, PyObject *v, PyObject *w,
Serhiy Storchakaab874002016-09-11 13:48:15 +03005458 PyFrameObject *f, const _Py_CODEUNIT *next_instr)
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005459{
5460 PyObject *res;
5461 if (Py_REFCNT(v) == 2) {
5462 /* In the common case, there are 2 references to the value
5463 * stored in 'variable' when the += is performed: one on the
5464 * value stack (in 'v') and one still stored in the
5465 * 'variable'. We try to delete the variable now to reduce
5466 * the refcnt to 1.
5467 */
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03005468 int opcode, oparg;
5469 NEXTOPARG();
5470 switch (opcode) {
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005471 case STORE_FAST:
5472 {
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005473 PyObject **fastlocals = f->f_localsplus;
5474 if (GETLOCAL(oparg) == v)
5475 SETLOCAL(oparg, NULL);
5476 break;
5477 }
5478 case STORE_DEREF:
5479 {
5480 PyObject **freevars = (f->f_localsplus +
5481 f->f_code->co_nlocals);
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03005482 PyObject *c = freevars[oparg];
Raymond Hettingerc32f9db2016-11-12 04:10:35 -05005483 if (PyCell_GET(c) == v) {
5484 PyCell_SET(c, NULL);
5485 Py_DECREF(v);
5486 }
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005487 break;
5488 }
5489 case STORE_NAME:
5490 {
5491 PyObject *names = f->f_code->co_names;
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03005492 PyObject *name = GETITEM(names, oparg);
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005493 PyObject *locals = f->f_locals;
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02005494 if (locals && PyDict_CheckExact(locals)) {
5495 PyObject *w = PyDict_GetItemWithError(locals, name);
5496 if ((w == v && PyDict_DelItem(locals, name) != 0) ||
Victor Stinner438a12d2019-05-24 17:01:38 +02005497 (w == NULL && _PyErr_Occurred(tstate)))
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02005498 {
5499 Py_DECREF(v);
5500 return NULL;
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005501 }
5502 }
5503 break;
5504 }
5505 }
5506 }
5507 res = v;
5508 PyUnicode_Append(&res, w);
5509 return res;
5510}
5511
Guido van Rossum950361c1997-01-24 13:49:28 +00005512#ifdef DYNAMIC_EXECUTION_PROFILE
5513
Skip Montanarof118cb12001-10-15 20:51:38 +00005514static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005515getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00005516{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005517 int i;
5518 PyObject *l = PyList_New(256);
5519 if (l == NULL) return NULL;
5520 for (i = 0; i < 256; i++) {
5521 PyObject *x = PyLong_FromLong(a[i]);
5522 if (x == NULL) {
5523 Py_DECREF(l);
5524 return NULL;
5525 }
Zackery Spytz99d56b52018-12-08 07:16:55 -07005526 PyList_SET_ITEM(l, i, x);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005527 }
5528 for (i = 0; i < 256; i++)
5529 a[i] = 0;
5530 return l;
Guido van Rossum950361c1997-01-24 13:49:28 +00005531}
5532
5533PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005534_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00005535{
5536#ifndef DXPAIRS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005537 return getarray(dxp);
Guido van Rossum950361c1997-01-24 13:49:28 +00005538#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005539 int i;
5540 PyObject *l = PyList_New(257);
5541 if (l == NULL) return NULL;
5542 for (i = 0; i < 257; i++) {
5543 PyObject *x = getarray(dxpairs[i]);
5544 if (x == NULL) {
5545 Py_DECREF(l);
5546 return NULL;
5547 }
Zackery Spytz99d56b52018-12-08 07:16:55 -07005548 PyList_SET_ITEM(l, i, x);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005549 }
5550 return l;
Guido van Rossum950361c1997-01-24 13:49:28 +00005551#endif
5552}
5553
5554#endif
Brett Cannon5c4de282016-09-07 11:16:41 -07005555
5556Py_ssize_t
5557_PyEval_RequestCodeExtraIndex(freefunc free)
5558{
Victor Stinnercaba55b2018-08-03 15:33:52 +02005559 PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE();
Brett Cannon5c4de282016-09-07 11:16:41 -07005560 Py_ssize_t new_index;
5561
Dino Viehlandf3cffd22017-06-21 14:44:36 -07005562 if (interp->co_extra_user_count == MAX_CO_EXTRA_USERS - 1) {
Brett Cannon5c4de282016-09-07 11:16:41 -07005563 return -1;
5564 }
Dino Viehlandf3cffd22017-06-21 14:44:36 -07005565 new_index = interp->co_extra_user_count++;
5566 interp->co_extra_freefuncs[new_index] = free;
Brett Cannon5c4de282016-09-07 11:16:41 -07005567 return new_index;
5568}
Łukasz Langaa785c872016-09-09 17:37:37 -07005569
5570static void
5571dtrace_function_entry(PyFrameObject *f)
5572{
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02005573 const char *filename;
5574 const char *funcname;
Łukasz Langaa785c872016-09-09 17:37:37 -07005575 int lineno;
5576
5577 filename = PyUnicode_AsUTF8(f->f_code->co_filename);
5578 funcname = PyUnicode_AsUTF8(f->f_code->co_name);
5579 lineno = PyCode_Addr2Line(f->f_code, f->f_lasti);
5580
5581 PyDTrace_FUNCTION_ENTRY(filename, funcname, lineno);
5582}
5583
5584static void
5585dtrace_function_return(PyFrameObject *f)
5586{
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02005587 const char *filename;
5588 const char *funcname;
Łukasz Langaa785c872016-09-09 17:37:37 -07005589 int lineno;
5590
5591 filename = PyUnicode_AsUTF8(f->f_code->co_filename);
5592 funcname = PyUnicode_AsUTF8(f->f_code->co_name);
5593 lineno = PyCode_Addr2Line(f->f_code, f->f_lasti);
5594
5595 PyDTrace_FUNCTION_RETURN(filename, funcname, lineno);
5596}
5597
5598/* DTrace equivalent of maybe_call_line_trace. */
5599static void
5600maybe_dtrace_line(PyFrameObject *frame,
5601 int *instr_lb, int *instr_ub, int *instr_prev)
5602{
5603 int line = frame->f_lineno;
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02005604 const char *co_filename, *co_name;
Łukasz Langaa785c872016-09-09 17:37:37 -07005605
5606 /* If the last instruction executed isn't in the current
5607 instruction window, reset the window.
5608 */
5609 if (frame->f_lasti < *instr_lb || frame->f_lasti >= *instr_ub) {
5610 PyAddrPair bounds;
5611 line = _PyCode_CheckLineNumber(frame->f_code, frame->f_lasti,
5612 &bounds);
5613 *instr_lb = bounds.ap_lower;
5614 *instr_ub = bounds.ap_upper;
5615 }
5616 /* If the last instruction falls at the start of a line or if
5617 it represents a jump backwards, update the frame's line
5618 number and call the trace function. */
5619 if (frame->f_lasti == *instr_lb || frame->f_lasti < *instr_prev) {
5620 frame->f_lineno = line;
5621 co_filename = PyUnicode_AsUTF8(frame->f_code->co_filename);
5622 if (!co_filename)
5623 co_filename = "?";
5624 co_name = PyUnicode_AsUTF8(frame->f_code->co_name);
5625 if (!co_name)
5626 co_name = "?";
5627 PyDTrace_LINE(co_filename, co_name, line);
5628 }
5629 *instr_prev = frame->f_lasti;
5630}