blob: 60367a665d7d623cb4f8e2515c88fbf52eb365da [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 }
Victor Stinnerde4ae3d2016-12-04 22:59:09 +01001877 res = PyObject_CallFunctionObjArgs(hook, value, NULL);
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): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002943 PyObject *key = TOP();
2944 PyObject *value = SECOND();
2945 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 */
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003317 PyObject *stack[3];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003318 PyObject *exit_func;
Victor Stinner842cfff2016-12-01 14:45:31 +01003319 PyObject *exc, *val, *tb, *res;
3320
3321 val = tb = Py_None;
3322 exc = TOP();
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003323 if (exc == NULL) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003324 STACK_SHRINK(1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003325 exit_func = TOP();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003326 SET_TOP(exc);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003327 exc = Py_None;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003328 }
3329 else {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003330 assert(PyExceptionClass_Check(exc));
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003331 PyObject *tp2, *exc2, *tb2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003332 PyTryBlock *block;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003333 val = SECOND();
3334 tb = THIRD();
3335 tp2 = FOURTH();
3336 exc2 = PEEK(5);
3337 tb2 = PEEK(6);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003338 exit_func = PEEK(7);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003339 SET_VALUE(7, tb2);
3340 SET_VALUE(6, exc2);
3341 SET_VALUE(5, tp2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003342 /* UNWIND_EXCEPT_HANDLER will pop this off. */
3343 SET_FOURTH(NULL);
3344 /* We just shifted the stack down, so we have
3345 to tell the except handler block that the
3346 values are lower than it expects. */
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003347 assert(f->f_iblock > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003348 block = &f->f_blockstack[f->f_iblock - 1];
3349 assert(block->b_type == EXCEPT_HANDLER);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003350 assert(block->b_level > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003351 block->b_level--;
3352 }
Victor Stinner842cfff2016-12-01 14:45:31 +01003353
3354 stack[0] = exc;
3355 stack[1] = val;
3356 stack[2] = tb;
3357 res = _PyObject_FastCall(exit_func, stack, 3);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003358 Py_DECREF(exit_func);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003359 if (res == NULL)
3360 goto error;
Amaury Forgeot d'Arc10b24e82008-12-10 23:49:33 +00003361
Nick Coghlanbaaadbf2015-05-13 15:54:02 +10003362 Py_INCREF(exc); /* Duplicating the exception on the stack */
Yury Selivanov75445082015-05-11 22:57:16 -04003363 PUSH(exc);
3364 PUSH(res);
3365 PREDICT(WITH_CLEANUP_FINISH);
3366 DISPATCH();
3367 }
3368
Benjamin Petersonddd19492018-09-16 22:38:02 -07003369 case TARGET(WITH_CLEANUP_FINISH): {
3370 PREDICTED(WITH_CLEANUP_FINISH);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003371 /* TOP = the result of calling the context.__exit__ bound method
3372 SECOND = either None or exception type
3373
3374 If SECOND is None below is NULL or the return address,
3375 otherwise below are 7 values representing an exception.
3376 */
Yury Selivanov75445082015-05-11 22:57:16 -04003377 PyObject *res = POP();
3378 PyObject *exc = POP();
3379 int err;
3380
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003381 if (exc != Py_None)
3382 err = PyObject_IsTrue(res);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003383 else
3384 err = 0;
Yury Selivanov75445082015-05-11 22:57:16 -04003385
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003386 Py_DECREF(res);
Nick Coghlanbaaadbf2015-05-13 15:54:02 +10003387 Py_DECREF(exc);
Amaury Forgeot d'Arc10b24e82008-12-10 23:49:33 +00003388
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003389 if (err < 0)
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003390 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003391 else if (err > 0) {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003392 /* There was an exception and a True return.
3393 * We must manually unwind the EXCEPT_HANDLER block
3394 * which was created when the exception was caught,
Quan Tian3bd0d622018-10-20 05:30:03 +08003395 * otherwise the stack will be in an inconsistent state.
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003396 */
3397 PyTryBlock *b = PyFrame_BlockPop(f);
3398 assert(b->b_type == EXCEPT_HANDLER);
3399 UNWIND_EXCEPT_HANDLER(b);
3400 PUSH(NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003401 }
3402 PREDICT(END_FINALLY);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003403 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003404 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00003405
Benjamin Petersonddd19492018-09-16 22:38:02 -07003406 case TARGET(LOAD_METHOD): {
Andreyb021ba52019-04-29 14:33:26 +10003407 /* Designed to work in tandem with CALL_METHOD. */
Yury Selivanovf2392132016-12-13 19:03:51 -05003408 PyObject *name = GETITEM(names, oparg);
3409 PyObject *obj = TOP();
3410 PyObject *meth = NULL;
3411
3412 int meth_found = _PyObject_GetMethod(obj, name, &meth);
3413
Yury Selivanovf2392132016-12-13 19:03:51 -05003414 if (meth == NULL) {
3415 /* Most likely attribute wasn't found. */
Yury Selivanovf2392132016-12-13 19:03:51 -05003416 goto error;
3417 }
3418
3419 if (meth_found) {
INADA Naoki015bce62017-01-16 17:23:30 +09003420 /* We can bypass temporary bound method object.
3421 meth is unbound method and obj is self.
Victor Stinnera8cb5152017-01-18 14:12:51 +01003422
INADA Naoki015bce62017-01-16 17:23:30 +09003423 meth | self | arg1 | ... | argN
3424 */
3425 SET_TOP(meth);
3426 PUSH(obj); // self
Yury Selivanovf2392132016-12-13 19:03:51 -05003427 }
3428 else {
INADA Naoki015bce62017-01-16 17:23:30 +09003429 /* meth is not an unbound method (but a regular attr, or
3430 something was returned by a descriptor protocol). Set
3431 the second element of the stack to NULL, to signal
Yury Selivanovf2392132016-12-13 19:03:51 -05003432 CALL_METHOD that it's not a method call.
INADA Naoki015bce62017-01-16 17:23:30 +09003433
3434 NULL | meth | arg1 | ... | argN
Yury Selivanovf2392132016-12-13 19:03:51 -05003435 */
INADA Naoki015bce62017-01-16 17:23:30 +09003436 SET_TOP(NULL);
Yury Selivanovf2392132016-12-13 19:03:51 -05003437 Py_DECREF(obj);
INADA Naoki015bce62017-01-16 17:23:30 +09003438 PUSH(meth);
Yury Selivanovf2392132016-12-13 19:03:51 -05003439 }
3440 DISPATCH();
3441 }
3442
Benjamin Petersonddd19492018-09-16 22:38:02 -07003443 case TARGET(CALL_METHOD): {
Yury Selivanovf2392132016-12-13 19:03:51 -05003444 /* Designed to work in tamdem with LOAD_METHOD. */
INADA Naoki015bce62017-01-16 17:23:30 +09003445 PyObject **sp, *res, *meth;
Yury Selivanovf2392132016-12-13 19:03:51 -05003446
3447 sp = stack_pointer;
3448
INADA Naoki015bce62017-01-16 17:23:30 +09003449 meth = PEEK(oparg + 2);
3450 if (meth == NULL) {
3451 /* `meth` is NULL when LOAD_METHOD thinks that it's not
3452 a method call.
Yury Selivanovf2392132016-12-13 19:03:51 -05003453
3454 Stack layout:
3455
INADA Naoki015bce62017-01-16 17:23:30 +09003456 ... | NULL | callable | arg1 | ... | argN
3457 ^- TOP()
3458 ^- (-oparg)
3459 ^- (-oparg-1)
3460 ^- (-oparg-2)
Yury Selivanovf2392132016-12-13 19:03:51 -05003461
Ville Skyttä49b27342017-08-03 09:00:59 +03003462 `callable` will be POPed by call_function.
INADA Naoki015bce62017-01-16 17:23:30 +09003463 NULL will will be POPed manually later.
Yury Selivanovf2392132016-12-13 19:03:51 -05003464 */
Victor Stinner09532fe2019-05-10 23:39:09 +02003465 res = call_function(tstate, &sp, oparg, NULL);
Yury Selivanovf2392132016-12-13 19:03:51 -05003466 stack_pointer = sp;
INADA Naoki015bce62017-01-16 17:23:30 +09003467 (void)POP(); /* POP the NULL. */
Yury Selivanovf2392132016-12-13 19:03:51 -05003468 }
3469 else {
3470 /* This is a method call. Stack layout:
3471
INADA Naoki015bce62017-01-16 17:23:30 +09003472 ... | method | self | arg1 | ... | argN
Yury Selivanovf2392132016-12-13 19:03:51 -05003473 ^- TOP()
3474 ^- (-oparg)
INADA Naoki015bce62017-01-16 17:23:30 +09003475 ^- (-oparg-1)
3476 ^- (-oparg-2)
Yury Selivanovf2392132016-12-13 19:03:51 -05003477
INADA Naoki015bce62017-01-16 17:23:30 +09003478 `self` and `method` will be POPed by call_function.
Yury Selivanovf2392132016-12-13 19:03:51 -05003479 We'll be passing `oparg + 1` to call_function, to
INADA Naoki015bce62017-01-16 17:23:30 +09003480 make it accept the `self` as a first argument.
Yury Selivanovf2392132016-12-13 19:03:51 -05003481 */
Victor Stinner09532fe2019-05-10 23:39:09 +02003482 res = call_function(tstate, &sp, oparg + 1, NULL);
Yury Selivanovf2392132016-12-13 19:03:51 -05003483 stack_pointer = sp;
3484 }
3485
3486 PUSH(res);
3487 if (res == NULL)
3488 goto error;
3489 DISPATCH();
3490 }
3491
Benjamin Petersonddd19492018-09-16 22:38:02 -07003492 case TARGET(CALL_FUNCTION): {
3493 PREDICTED(CALL_FUNCTION);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003494 PyObject **sp, *res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003495 sp = stack_pointer;
Victor Stinner09532fe2019-05-10 23:39:09 +02003496 res = call_function(tstate, &sp, oparg, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003497 stack_pointer = sp;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003498 PUSH(res);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003499 if (res == NULL) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003500 goto error;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003501 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003502 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003503 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003504
Benjamin Petersonddd19492018-09-16 22:38:02 -07003505 case TARGET(CALL_FUNCTION_KW): {
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003506 PyObject **sp, *res, *names;
3507
3508 names = POP();
3509 assert(PyTuple_CheckExact(names) && PyTuple_GET_SIZE(names) <= oparg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003510 sp = stack_pointer;
Victor Stinner09532fe2019-05-10 23:39:09 +02003511 res = call_function(tstate, &sp, oparg, names);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003512 stack_pointer = sp;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003513 PUSH(res);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003514 Py_DECREF(names);
3515
3516 if (res == NULL) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003517 goto error;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003518 }
3519 DISPATCH();
3520 }
3521
Benjamin Petersonddd19492018-09-16 22:38:02 -07003522 case TARGET(CALL_FUNCTION_EX): {
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003523 PyObject *func, *callargs, *kwargs = NULL, *result;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003524 if (oparg & 0x01) {
3525 kwargs = POP();
Serhiy Storchakab7281052016-09-12 00:52:40 +03003526 if (!PyDict_CheckExact(kwargs)) {
3527 PyObject *d = PyDict_New();
3528 if (d == NULL)
3529 goto error;
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02003530 if (_PyDict_MergeEx(d, kwargs, 2) < 0) {
Serhiy Storchakab7281052016-09-12 00:52:40 +03003531 Py_DECREF(d);
Victor Stinner438a12d2019-05-24 17:01:38 +02003532 format_kwargs_error(tstate, SECOND(), kwargs);
Victor Stinnereece2222016-09-12 11:16:37 +02003533 Py_DECREF(kwargs);
Serhiy Storchakab7281052016-09-12 00:52:40 +03003534 goto error;
3535 }
3536 Py_DECREF(kwargs);
3537 kwargs = d;
3538 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003539 assert(PyDict_CheckExact(kwargs));
3540 }
3541 callargs = POP();
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003542 func = TOP();
Serhiy Storchaka63dc5482016-09-22 19:41:20 +03003543 if (!PyTuple_CheckExact(callargs)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003544 if (check_args_iterable(tstate, func, callargs) < 0) {
Victor Stinnereece2222016-09-12 11:16:37 +02003545 Py_DECREF(callargs);
Serhiy Storchakab7281052016-09-12 00:52:40 +03003546 goto error;
3547 }
3548 Py_SETREF(callargs, PySequence_Tuple(callargs));
3549 if (callargs == NULL) {
3550 goto error;
3551 }
3552 }
Serhiy Storchaka63dc5482016-09-22 19:41:20 +03003553 assert(PyTuple_CheckExact(callargs));
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003554
Victor Stinner09532fe2019-05-10 23:39:09 +02003555 result = do_call_core(tstate, func, callargs, kwargs);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003556 Py_DECREF(func);
3557 Py_DECREF(callargs);
3558 Py_XDECREF(kwargs);
3559
3560 SET_TOP(result);
3561 if (result == NULL) {
3562 goto error;
3563 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003564 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003565 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003566
Benjamin Petersonddd19492018-09-16 22:38:02 -07003567 case TARGET(MAKE_FUNCTION): {
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003568 PyObject *qualname = POP();
3569 PyObject *codeobj = POP();
3570 PyFunctionObject *func = (PyFunctionObject *)
3571 PyFunction_NewWithQualName(codeobj, f->f_globals, qualname);
Guido van Rossum4f72a782006-10-27 23:31:49 +00003572
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003573 Py_DECREF(codeobj);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003574 Py_DECREF(qualname);
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003575 if (func == NULL) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003576 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003577 }
Neal Norwitzc1505362006-12-28 06:47:50 +00003578
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003579 if (oparg & 0x08) {
3580 assert(PyTuple_CheckExact(TOP()));
3581 func ->func_closure = POP();
3582 }
3583 if (oparg & 0x04) {
3584 assert(PyDict_CheckExact(TOP()));
3585 func->func_annotations = POP();
3586 }
3587 if (oparg & 0x02) {
3588 assert(PyDict_CheckExact(TOP()));
3589 func->func_kwdefaults = POP();
3590 }
3591 if (oparg & 0x01) {
3592 assert(PyTuple_CheckExact(TOP()));
3593 func->func_defaults = POP();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003594 }
Neal Norwitzc1505362006-12-28 06:47:50 +00003595
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003596 PUSH((PyObject *)func);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003597 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003598 }
Guido van Rossum8861b741996-07-30 16:49:37 +00003599
Benjamin Petersonddd19492018-09-16 22:38:02 -07003600 case TARGET(BUILD_SLICE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003601 PyObject *start, *stop, *step, *slice;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003602 if (oparg == 3)
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003603 step = POP();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003604 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003605 step = NULL;
3606 stop = POP();
3607 start = TOP();
3608 slice = PySlice_New(start, stop, step);
3609 Py_DECREF(start);
3610 Py_DECREF(stop);
3611 Py_XDECREF(step);
3612 SET_TOP(slice);
3613 if (slice == NULL)
3614 goto error;
3615 DISPATCH();
3616 }
Guido van Rossum8861b741996-07-30 16:49:37 +00003617
Benjamin Petersonddd19492018-09-16 22:38:02 -07003618 case TARGET(FORMAT_VALUE): {
Eric V. Smitha78c7952015-11-03 12:45:05 -05003619 /* Handles f-string value formatting. */
3620 PyObject *result;
3621 PyObject *fmt_spec;
3622 PyObject *value;
3623 PyObject *(*conv_fn)(PyObject *);
3624 int which_conversion = oparg & FVC_MASK;
3625 int have_fmt_spec = (oparg & FVS_MASK) == FVS_HAVE_SPEC;
3626
3627 fmt_spec = have_fmt_spec ? POP() : NULL;
Eric V. Smith135d5f42016-02-05 18:23:08 -05003628 value = POP();
Eric V. Smitha78c7952015-11-03 12:45:05 -05003629
3630 /* See if any conversion is specified. */
3631 switch (which_conversion) {
Eric V. Smith9a4135e2019-05-08 16:28:48 -04003632 case FVC_NONE: conv_fn = NULL; break;
Eric V. Smitha78c7952015-11-03 12:45:05 -05003633 case FVC_STR: conv_fn = PyObject_Str; break;
3634 case FVC_REPR: conv_fn = PyObject_Repr; break;
3635 case FVC_ASCII: conv_fn = PyObject_ASCII; break;
Eric V. Smith9a4135e2019-05-08 16:28:48 -04003636 default:
Victor Stinner438a12d2019-05-24 17:01:38 +02003637 _PyErr_Format(tstate, PyExc_SystemError,
3638 "unexpected conversion flag %d",
3639 which_conversion);
Eric V. Smith9a4135e2019-05-08 16:28:48 -04003640 goto error;
Eric V. Smitha78c7952015-11-03 12:45:05 -05003641 }
3642
3643 /* If there's a conversion function, call it and replace
3644 value with that result. Otherwise, just use value,
3645 without conversion. */
Eric V. Smitheb588a12016-02-05 18:26:20 -05003646 if (conv_fn != NULL) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05003647 result = conv_fn(value);
3648 Py_DECREF(value);
Eric V. Smitheb588a12016-02-05 18:26:20 -05003649 if (result == NULL) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05003650 Py_XDECREF(fmt_spec);
3651 goto error;
3652 }
3653 value = result;
3654 }
3655
3656 /* If value is a unicode object, and there's no fmt_spec,
3657 then we know the result of format(value) is value
3658 itself. In that case, skip calling format(). I plan to
3659 move this optimization in to PyObject_Format()
3660 itself. */
3661 if (PyUnicode_CheckExact(value) && fmt_spec == NULL) {
3662 /* Do nothing, just transfer ownership to result. */
3663 result = value;
3664 } else {
3665 /* Actually call format(). */
3666 result = PyObject_Format(value, fmt_spec);
3667 Py_DECREF(value);
3668 Py_XDECREF(fmt_spec);
Eric V. Smitheb588a12016-02-05 18:26:20 -05003669 if (result == NULL) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05003670 goto error;
Eric V. Smitheb588a12016-02-05 18:26:20 -05003671 }
Eric V. Smitha78c7952015-11-03 12:45:05 -05003672 }
3673
Eric V. Smith135d5f42016-02-05 18:23:08 -05003674 PUSH(result);
Eric V. Smitha78c7952015-11-03 12:45:05 -05003675 DISPATCH();
3676 }
3677
Benjamin Petersonddd19492018-09-16 22:38:02 -07003678 case TARGET(EXTENDED_ARG): {
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03003679 int oldoparg = oparg;
3680 NEXTOPARG();
3681 oparg |= oldoparg << 8;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003682 goto dispatch_opcode;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003683 }
Guido van Rossum8861b741996-07-30 16:49:37 +00003684
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003685
Antoine Pitrou042b1282010-08-13 21:15:58 +00003686#if USE_COMPUTED_GOTOS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003687 _unknown_opcode:
Antoine Pitroub52ec782009-01-25 16:34:23 +00003688#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003689 default:
3690 fprintf(stderr,
3691 "XXX lineno: %d, opcode: %d\n",
3692 PyFrame_GetLineNumber(f),
3693 opcode);
Victor Stinner438a12d2019-05-24 17:01:38 +02003694 _PyErr_SetString(tstate, PyExc_SystemError, "unknown opcode");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003695 goto error;
Guido van Rossum04691fc1992-08-12 15:35:34 +00003696
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003697 } /* switch */
Guido van Rossum374a9221991-04-04 10:40:29 +00003698
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003699 /* This should never be reached. Every opcode should end with DISPATCH()
3700 or goto error. */
Barry Warsawb2e57942017-09-14 18:13:16 -07003701 Py_UNREACHABLE();
Guido van Rossumac7be682001-01-17 15:42:30 +00003702
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003703error:
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003704 /* Double-check exception status. */
Victor Stinner365b6932013-07-12 00:11:58 +02003705#ifdef NDEBUG
Victor Stinner438a12d2019-05-24 17:01:38 +02003706 if (!_PyErr_Occurred(tstate)) {
3707 _PyErr_SetString(tstate, PyExc_SystemError,
3708 "error return without exception set");
3709 }
Victor Stinner365b6932013-07-12 00:11:58 +02003710#else
Victor Stinner438a12d2019-05-24 17:01:38 +02003711 assert(_PyErr_Occurred(tstate));
Victor Stinner365b6932013-07-12 00:11:58 +02003712#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00003713
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003714 /* Log traceback info. */
3715 PyTraceBack_Here(f);
Guido van Rossumac7be682001-01-17 15:42:30 +00003716
Benjamin Peterson51f46162013-01-23 08:38:47 -05003717 if (tstate->c_tracefunc != NULL)
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003718 call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj,
3719 tstate, f);
Guido van Rossumac7be682001-01-17 15:42:30 +00003720
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003721exception_unwind:
3722 /* Unwind stacks if an exception occurred */
3723 while (f->f_iblock > 0) {
3724 /* Pop the current block. */
3725 PyTryBlock *b = &f->f_blockstack[--f->f_iblock];
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003726
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003727 if (b->b_type == EXCEPT_HANDLER) {
3728 UNWIND_EXCEPT_HANDLER(b);
3729 continue;
3730 }
3731 UNWIND_BLOCK(b);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003732 if (b->b_type == SETUP_FINALLY) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003733 PyObject *exc, *val, *tb;
3734 int handler = b->b_handler;
Mark Shannonae3087c2017-10-22 22:41:51 +01003735 _PyErr_StackItem *exc_info = tstate->exc_info;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003736 /* Beware, this invalidates all b->b_* fields */
3737 PyFrame_BlockSetup(f, EXCEPT_HANDLER, -1, STACK_LEVEL());
Mark Shannonae3087c2017-10-22 22:41:51 +01003738 PUSH(exc_info->exc_traceback);
3739 PUSH(exc_info->exc_value);
3740 if (exc_info->exc_type != NULL) {
3741 PUSH(exc_info->exc_type);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003742 }
3743 else {
3744 Py_INCREF(Py_None);
3745 PUSH(Py_None);
3746 }
Victor Stinner438a12d2019-05-24 17:01:38 +02003747 _PyErr_Fetch(tstate, &exc, &val, &tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003748 /* Make the raw exception data
3749 available to the handler,
3750 so a program can emulate the
3751 Python main loop. */
Victor Stinner438a12d2019-05-24 17:01:38 +02003752 _PyErr_NormalizeException(tstate, &exc, &val, &tb);
Victor Stinner7eab0d02013-07-15 21:16:27 +02003753 if (tb != NULL)
3754 PyException_SetTraceback(val, tb);
3755 else
3756 PyException_SetTraceback(val, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003757 Py_INCREF(exc);
Mark Shannonae3087c2017-10-22 22:41:51 +01003758 exc_info->exc_type = exc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003759 Py_INCREF(val);
Mark Shannonae3087c2017-10-22 22:41:51 +01003760 exc_info->exc_value = val;
3761 exc_info->exc_traceback = tb;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003762 if (tb == NULL)
3763 tb = Py_None;
3764 Py_INCREF(tb);
3765 PUSH(tb);
3766 PUSH(val);
3767 PUSH(exc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003768 JUMPTO(handler);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003769 /* Resume normal execution */
3770 goto main_loop;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003771 }
3772 } /* unwind stack */
Guido van Rossum374a9221991-04-04 10:40:29 +00003773
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003774 /* End the loop as we still have an error */
3775 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003776 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00003777
Pablo Galindof00828a2019-05-09 16:52:02 +01003778 assert(retval == NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02003779 assert(_PyErr_Occurred(tstate));
Pablo Galindof00828a2019-05-09 16:52:02 +01003780
3781exit_returning:
3782
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003783 /* Pop remaining stack entries. */
3784 while (!EMPTY()) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003785 PyObject *o = POP();
3786 Py_XDECREF(o);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003787 }
Guido van Rossum35974fb2001-12-06 21:28:18 +00003788
Pablo Galindof00828a2019-05-09 16:52:02 +01003789exit_yielding:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003790 if (tstate->use_tracing) {
Benjamin Peterson51f46162013-01-23 08:38:47 -05003791 if (tstate->c_tracefunc) {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003792 if (call_trace_protected(tstate->c_tracefunc, tstate->c_traceobj,
3793 tstate, f, PyTrace_RETURN, retval)) {
3794 Py_CLEAR(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003795 }
3796 }
3797 if (tstate->c_profilefunc) {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003798 if (call_trace_protected(tstate->c_profilefunc, tstate->c_profileobj,
3799 tstate, f, PyTrace_RETURN, retval)) {
Serhiy Storchaka505ff752014-02-09 13:33:53 +02003800 Py_CLEAR(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003801 }
3802 }
3803 }
Guido van Rossuma4240131997-01-21 21:18:36 +00003804
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003805 /* pop frame */
Thomas Woutersce272b62007-09-19 21:19:28 +00003806exit_eval_frame:
Łukasz Langaa785c872016-09-09 17:37:37 -07003807 if (PyDTrace_FUNCTION_RETURN_ENABLED())
3808 dtrace_function_return(f);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003809 Py_LeaveRecursiveCall();
Antoine Pitrou58720d62013-08-05 23:26:40 +02003810 f->f_executing = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003811 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00003812
Victor Stinnerefde1462015-03-21 15:04:43 +01003813 return _Py_CheckFunctionResult(NULL, retval, "PyEval_EvalFrameEx");
Guido van Rossum374a9221991-04-04 10:40:29 +00003814}
3815
Benjamin Petersonb204a422011-06-05 22:04:07 -05003816static void
Victor Stinner438a12d2019-05-24 17:01:38 +02003817format_missing(PyThreadState *tstate, const char *kind,
3818 PyCodeObject *co, PyObject *names)
Benjamin Petersone109c702011-06-24 09:37:26 -05003819{
3820 int err;
3821 Py_ssize_t len = PyList_GET_SIZE(names);
3822 PyObject *name_str, *comma, *tail, *tmp;
3823
3824 assert(PyList_CheckExact(names));
3825 assert(len >= 1);
3826 /* Deal with the joys of natural language. */
3827 switch (len) {
3828 case 1:
3829 name_str = PyList_GET_ITEM(names, 0);
3830 Py_INCREF(name_str);
3831 break;
3832 case 2:
3833 name_str = PyUnicode_FromFormat("%U and %U",
3834 PyList_GET_ITEM(names, len - 2),
3835 PyList_GET_ITEM(names, len - 1));
3836 break;
3837 default:
3838 tail = PyUnicode_FromFormat(", %U, and %U",
3839 PyList_GET_ITEM(names, len - 2),
3840 PyList_GET_ITEM(names, len - 1));
Benjamin Petersond1ab6082012-06-01 11:18:22 -07003841 if (tail == NULL)
3842 return;
Benjamin Petersone109c702011-06-24 09:37:26 -05003843 /* Chop off the last two objects in the list. This shouldn't actually
3844 fail, but we can't be too careful. */
3845 err = PyList_SetSlice(names, len - 2, len, NULL);
3846 if (err == -1) {
3847 Py_DECREF(tail);
3848 return;
3849 }
3850 /* Stitch everything up into a nice comma-separated list. */
3851 comma = PyUnicode_FromString(", ");
3852 if (comma == NULL) {
3853 Py_DECREF(tail);
3854 return;
3855 }
3856 tmp = PyUnicode_Join(comma, names);
3857 Py_DECREF(comma);
3858 if (tmp == NULL) {
3859 Py_DECREF(tail);
3860 return;
3861 }
3862 name_str = PyUnicode_Concat(tmp, tail);
3863 Py_DECREF(tmp);
3864 Py_DECREF(tail);
3865 break;
3866 }
3867 if (name_str == NULL)
3868 return;
Victor Stinner438a12d2019-05-24 17:01:38 +02003869 _PyErr_Format(tstate, PyExc_TypeError,
3870 "%U() missing %i required %s argument%s: %U",
3871 co->co_name,
3872 len,
3873 kind,
3874 len == 1 ? "" : "s",
3875 name_str);
Benjamin Petersone109c702011-06-24 09:37:26 -05003876 Py_DECREF(name_str);
3877}
3878
3879static void
Victor Stinner438a12d2019-05-24 17:01:38 +02003880missing_arguments(PyThreadState *tstate, PyCodeObject *co,
3881 Py_ssize_t missing, Py_ssize_t defcount,
Benjamin Petersone109c702011-06-24 09:37:26 -05003882 PyObject **fastlocals)
3883{
Victor Stinner74319ae2016-08-25 00:04:09 +02003884 Py_ssize_t i, j = 0;
3885 Py_ssize_t start, end;
3886 int positional = (defcount != -1);
Benjamin Petersone109c702011-06-24 09:37:26 -05003887 const char *kind = positional ? "positional" : "keyword-only";
3888 PyObject *missing_names;
3889
3890 /* Compute the names of the arguments that are missing. */
3891 missing_names = PyList_New(missing);
3892 if (missing_names == NULL)
3893 return;
3894 if (positional) {
3895 start = 0;
Pablo Galindocd74e662019-06-01 18:08:04 +01003896 end = co->co_argcount - defcount;
Benjamin Petersone109c702011-06-24 09:37:26 -05003897 }
3898 else {
Pablo Galindocd74e662019-06-01 18:08:04 +01003899 start = co->co_argcount;
Benjamin Petersone109c702011-06-24 09:37:26 -05003900 end = start + co->co_kwonlyargcount;
3901 }
3902 for (i = start; i < end; i++) {
3903 if (GETLOCAL(i) == NULL) {
3904 PyObject *raw = PyTuple_GET_ITEM(co->co_varnames, i);
3905 PyObject *name = PyObject_Repr(raw);
3906 if (name == NULL) {
3907 Py_DECREF(missing_names);
3908 return;
3909 }
3910 PyList_SET_ITEM(missing_names, j++, name);
3911 }
3912 }
3913 assert(j == missing);
Victor Stinner438a12d2019-05-24 17:01:38 +02003914 format_missing(tstate, kind, co, missing_names);
Benjamin Petersone109c702011-06-24 09:37:26 -05003915 Py_DECREF(missing_names);
3916}
3917
3918static void
Victor Stinner438a12d2019-05-24 17:01:38 +02003919too_many_positional(PyThreadState *tstate, PyCodeObject *co,
3920 Py_ssize_t given, Py_ssize_t defcount,
Victor Stinner74319ae2016-08-25 00:04:09 +02003921 PyObject **fastlocals)
Benjamin Petersonb204a422011-06-05 22:04:07 -05003922{
3923 int plural;
Victor Stinner74319ae2016-08-25 00:04:09 +02003924 Py_ssize_t kwonly_given = 0;
3925 Py_ssize_t i;
Benjamin Petersonb204a422011-06-05 22:04:07 -05003926 PyObject *sig, *kwonly_sig;
Victor Stinner74319ae2016-08-25 00:04:09 +02003927 Py_ssize_t co_argcount = co->co_argcount;
Benjamin Petersonb204a422011-06-05 22:04:07 -05003928
Benjamin Petersone109c702011-06-24 09:37:26 -05003929 assert((co->co_flags & CO_VARARGS) == 0);
3930 /* Count missing keyword-only args. */
Pablo Galindocd74e662019-06-01 18:08:04 +01003931 for (i = co_argcount; i < co_argcount + co->co_kwonlyargcount; i++) {
Victor Stinner74319ae2016-08-25 00:04:09 +02003932 if (GETLOCAL(i) != NULL) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05003933 kwonly_given++;
Victor Stinner74319ae2016-08-25 00:04:09 +02003934 }
3935 }
Benjamin Petersone109c702011-06-24 09:37:26 -05003936 if (defcount) {
Pablo Galindocd74e662019-06-01 18:08:04 +01003937 Py_ssize_t atleast = co_argcount - defcount;
Benjamin Petersonb204a422011-06-05 22:04:07 -05003938 plural = 1;
Pablo Galindocd74e662019-06-01 18:08:04 +01003939 sig = PyUnicode_FromFormat("from %zd to %zd", atleast, co_argcount);
Benjamin Petersonb204a422011-06-05 22:04:07 -05003940 }
3941 else {
Pablo Galindocd74e662019-06-01 18:08:04 +01003942 plural = (co_argcount != 1);
3943 sig = PyUnicode_FromFormat("%zd", co_argcount);
Benjamin Petersonb204a422011-06-05 22:04:07 -05003944 }
3945 if (sig == NULL)
3946 return;
3947 if (kwonly_given) {
Victor Stinner74319ae2016-08-25 00:04:09 +02003948 const char *format = " positional argument%s (and %zd keyword-only argument%s)";
3949 kwonly_sig = PyUnicode_FromFormat(format,
3950 given != 1 ? "s" : "",
3951 kwonly_given,
3952 kwonly_given != 1 ? "s" : "");
Benjamin Petersonb204a422011-06-05 22:04:07 -05003953 if (kwonly_sig == NULL) {
3954 Py_DECREF(sig);
3955 return;
3956 }
3957 }
3958 else {
3959 /* This will not fail. */
3960 kwonly_sig = PyUnicode_FromString("");
Benjamin Petersone109c702011-06-24 09:37:26 -05003961 assert(kwonly_sig != NULL);
Benjamin Petersonb204a422011-06-05 22:04:07 -05003962 }
Victor Stinner438a12d2019-05-24 17:01:38 +02003963 _PyErr_Format(tstate, PyExc_TypeError,
3964 "%U() takes %U positional argument%s but %zd%U %s given",
3965 co->co_name,
3966 sig,
3967 plural ? "s" : "",
3968 given,
3969 kwonly_sig,
3970 given == 1 && !kwonly_given ? "was" : "were");
Benjamin Petersonb204a422011-06-05 22:04:07 -05003971 Py_DECREF(sig);
3972 Py_DECREF(kwonly_sig);
3973}
3974
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01003975static int
Victor Stinner438a12d2019-05-24 17:01:38 +02003976positional_only_passed_as_keyword(PyThreadState *tstate, PyCodeObject *co,
3977 Py_ssize_t kwcount, PyObject* const* kwnames)
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01003978{
3979 int posonly_conflicts = 0;
3980 PyObject* posonly_names = PyList_New(0);
3981
3982 for(int k=0; k < co->co_posonlyargcount; k++){
3983 PyObject* posonly_name = PyTuple_GET_ITEM(co->co_varnames, k);
3984
3985 for (int k2=0; k2<kwcount; k2++){
3986 /* Compare the pointers first and fallback to PyObject_RichCompareBool*/
3987 PyObject* kwname = kwnames[k2];
3988 if (kwname == posonly_name){
3989 if(PyList_Append(posonly_names, kwname) != 0) {
3990 goto fail;
3991 }
3992 posonly_conflicts++;
3993 continue;
3994 }
3995
3996 int cmp = PyObject_RichCompareBool(posonly_name, kwname, Py_EQ);
3997
3998 if ( cmp > 0) {
3999 if(PyList_Append(posonly_names, kwname) != 0) {
4000 goto fail;
4001 }
4002 posonly_conflicts++;
4003 } else if (cmp < 0) {
4004 goto fail;
4005 }
4006
4007 }
4008 }
4009 if (posonly_conflicts) {
4010 PyObject* comma = PyUnicode_FromString(", ");
4011 if (comma == NULL) {
4012 goto fail;
4013 }
4014 PyObject* error_names = PyUnicode_Join(comma, posonly_names);
4015 Py_DECREF(comma);
4016 if (error_names == NULL) {
4017 goto fail;
4018 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004019 _PyErr_Format(tstate, PyExc_TypeError,
4020 "%U() got some positional-only arguments passed"
4021 " as keyword arguments: '%U'",
4022 co->co_name, error_names);
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004023 Py_DECREF(error_names);
4024 goto fail;
4025 }
4026
4027 Py_DECREF(posonly_names);
4028 return 0;
4029
4030fail:
4031 Py_XDECREF(posonly_names);
4032 return 1;
4033
4034}
4035
Guido van Rossumc2e20742006-02-27 22:32:47 +00004036/* This is gonna seem *real weird*, but if you put some other code between
Marcel Plch3a9ccee2018-04-06 23:22:04 +02004037 PyEval_EvalFrame() and _PyEval_EvalFrameDefault() you will need to adjust
Guido van Rossumc2e20742006-02-27 22:32:47 +00004038 the test in the if statements in Misc/gdbinit (pystack and pystackv). */
Skip Montanaro786ea6b2004-03-01 15:44:05 +00004039
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01004040PyObject *
Victor Stinner40ee3012014-06-16 15:59:28 +02004041_PyEval_EvalCodeWithName(PyObject *_co, PyObject *globals, PyObject *locals,
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02004042 PyObject *const *args, Py_ssize_t argcount,
4043 PyObject *const *kwnames, PyObject *const *kwargs,
Serhiy Storchakab7281052016-09-12 00:52:40 +03004044 Py_ssize_t kwcount, int kwstep,
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02004045 PyObject *const *defs, Py_ssize_t defcount,
Victor Stinner74319ae2016-08-25 00:04:09 +02004046 PyObject *kwdefs, PyObject *closure,
Victor Stinner40ee3012014-06-16 15:59:28 +02004047 PyObject *name, PyObject *qualname)
Tim Peters5ca576e2001-06-18 22:08:13 +00004048{
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00004049 PyCodeObject* co = (PyCodeObject*)_co;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02004050 PyFrameObject *f;
4051 PyObject *retval = NULL;
4052 PyObject **fastlocals, **freevars;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004053 PyObject *x, *u;
Pablo Galindocd74e662019-06-01 18:08:04 +01004054 const Py_ssize_t total_args = co->co_argcount + co->co_kwonlyargcount;
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004055 Py_ssize_t i, j, n;
Victor Stinnerc7020012016-08-16 23:40:29 +02004056 PyObject *kwdict;
Tim Peters5ca576e2001-06-18 22:08:13 +00004057
Victor Stinner438a12d2019-05-24 17:01:38 +02004058 PyThreadState *tstate = _PyThreadState_GET();
4059 assert(tstate != NULL);
4060
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004061 if (globals == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004062 _PyErr_SetString(tstate, PyExc_SystemError,
4063 "PyEval_EvalCodeEx: NULL globals");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004064 return NULL;
4065 }
Tim Peters5ca576e2001-06-18 22:08:13 +00004066
Victor Stinnerc7020012016-08-16 23:40:29 +02004067 /* Create the frame */
INADA Naoki5a625d02016-12-24 20:19:08 +09004068 f = _PyFrame_New_NoTrack(tstate, co, globals, locals);
Victor Stinnerc7020012016-08-16 23:40:29 +02004069 if (f == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004070 return NULL;
Victor Stinnerc7020012016-08-16 23:40:29 +02004071 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004072 fastlocals = f->f_localsplus;
4073 freevars = f->f_localsplus + co->co_nlocals;
Tim Peters5ca576e2001-06-18 22:08:13 +00004074
Victor Stinnerc7020012016-08-16 23:40:29 +02004075 /* Create a dictionary for keyword parameters (**kwags) */
Benjamin Petersonb204a422011-06-05 22:04:07 -05004076 if (co->co_flags & CO_VARKEYWORDS) {
4077 kwdict = PyDict_New();
4078 if (kwdict == NULL)
4079 goto fail;
4080 i = total_args;
Victor Stinnerc7020012016-08-16 23:40:29 +02004081 if (co->co_flags & CO_VARARGS) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004082 i++;
Victor Stinnerc7020012016-08-16 23:40:29 +02004083 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004084 SETLOCAL(i, kwdict);
4085 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004086 else {
4087 kwdict = NULL;
4088 }
4089
Pablo Galindocd74e662019-06-01 18:08:04 +01004090 /* Copy all positional arguments into local variables */
4091 if (argcount > co->co_argcount) {
4092 n = co->co_argcount;
Victor Stinnerc7020012016-08-16 23:40:29 +02004093 }
4094 else {
4095 n = argcount;
4096 }
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004097 for (j = 0; j < n; j++) {
4098 x = args[j];
4099 Py_INCREF(x);
4100 SETLOCAL(j, x);
4101 }
4102
Victor Stinnerc7020012016-08-16 23:40:29 +02004103 /* Pack other positional arguments into the *args argument */
Benjamin Petersonb204a422011-06-05 22:04:07 -05004104 if (co->co_flags & CO_VARARGS) {
Sergey Fedoseev234531b2019-02-25 21:59:12 +05004105 u = _PyTuple_FromArray(args + n, argcount - n);
Victor Stinnerc7020012016-08-16 23:40:29 +02004106 if (u == NULL) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004107 goto fail;
Victor Stinnerc7020012016-08-16 23:40:29 +02004108 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004109 SETLOCAL(total_args, u);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004110 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004111
Serhiy Storchakab7281052016-09-12 00:52:40 +03004112 /* Handle keyword arguments passed as two strided arrays */
4113 kwcount *= kwstep;
4114 for (i = 0; i < kwcount; i += kwstep) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004115 PyObject **co_varnames;
Serhiy Storchakab7281052016-09-12 00:52:40 +03004116 PyObject *keyword = kwnames[i];
4117 PyObject *value = kwargs[i];
Victor Stinner17061a92016-08-16 23:39:42 +02004118 Py_ssize_t j;
Victor Stinnerc7020012016-08-16 23:40:29 +02004119
Benjamin Petersonb204a422011-06-05 22:04:07 -05004120 if (keyword == NULL || !PyUnicode_Check(keyword)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004121 _PyErr_Format(tstate, PyExc_TypeError,
4122 "%U() keywords must be strings",
4123 co->co_name);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004124 goto fail;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004125 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004126
Benjamin Petersonb204a422011-06-05 22:04:07 -05004127 /* Speed hack: do raw pointer compares. As names are
4128 normally interned this should almost always hit. */
4129 co_varnames = ((PyTupleObject *)(co->co_varnames))->ob_item;
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004130 for (j = co->co_posonlyargcount; j < total_args; j++) {
Victor Stinner6fea7f72016-08-22 23:17:30 +02004131 PyObject *name = co_varnames[j];
4132 if (name == keyword) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004133 goto kw_found;
Victor Stinner6fea7f72016-08-22 23:17:30 +02004134 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004135 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004136
Benjamin Petersonb204a422011-06-05 22:04:07 -05004137 /* Slow fallback, just in case */
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004138 for (j = co->co_posonlyargcount; j < total_args; j++) {
Victor Stinner6fea7f72016-08-22 23:17:30 +02004139 PyObject *name = co_varnames[j];
4140 int cmp = PyObject_RichCompareBool( keyword, name, Py_EQ);
4141 if (cmp > 0) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004142 goto kw_found;
Victor Stinner6fea7f72016-08-22 23:17:30 +02004143 }
4144 else if (cmp < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004145 goto fail;
Victor Stinner6fea7f72016-08-22 23:17:30 +02004146 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004147 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004148
Victor Stinner231d1f32017-01-11 02:12:06 +01004149 assert(j >= total_args);
4150 if (kwdict == NULL) {
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004151
Victor Stinner438a12d2019-05-24 17:01:38 +02004152 if (co->co_posonlyargcount
4153 && positional_only_passed_as_keyword(tstate, co,
4154 kwcount, kwnames))
4155 {
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004156 goto fail;
4157 }
4158
Victor Stinner438a12d2019-05-24 17:01:38 +02004159 _PyErr_Format(tstate, PyExc_TypeError,
4160 "%U() got an unexpected keyword argument '%S'",
4161 co->co_name, keyword);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004162 goto fail;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004163 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004164
Christian Heimes0bd447f2013-07-20 14:48:10 +02004165 if (PyDict_SetItem(kwdict, keyword, value) == -1) {
4166 goto fail;
4167 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004168 continue;
Victor Stinnerc7020012016-08-16 23:40:29 +02004169
Benjamin Petersonb204a422011-06-05 22:04:07 -05004170 kw_found:
4171 if (GETLOCAL(j) != NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004172 _PyErr_Format(tstate, PyExc_TypeError,
4173 "%U() got multiple values for argument '%S'",
4174 co->co_name, keyword);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004175 goto fail;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004176 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004177 Py_INCREF(value);
4178 SETLOCAL(j, value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004179 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004180
4181 /* Check the number of positional arguments */
Pablo Galindocd74e662019-06-01 18:08:04 +01004182 if ((argcount > co->co_argcount) && !(co->co_flags & CO_VARARGS)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004183 too_many_positional(tstate, co, argcount, defcount, fastlocals);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004184 goto fail;
4185 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004186
4187 /* Add missing positional arguments (copy default values from defs) */
Pablo Galindocd74e662019-06-01 18:08:04 +01004188 if (argcount < co->co_argcount) {
4189 Py_ssize_t m = co->co_argcount - defcount;
Victor Stinner17061a92016-08-16 23:39:42 +02004190 Py_ssize_t missing = 0;
4191 for (i = argcount; i < m; i++) {
4192 if (GETLOCAL(i) == NULL) {
Benjamin Petersone109c702011-06-24 09:37:26 -05004193 missing++;
Victor Stinner17061a92016-08-16 23:39:42 +02004194 }
4195 }
Benjamin Petersone109c702011-06-24 09:37:26 -05004196 if (missing) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004197 missing_arguments(tstate, co, missing, defcount, fastlocals);
Benjamin Petersone109c702011-06-24 09:37:26 -05004198 goto fail;
Benjamin Petersonb204a422011-06-05 22:04:07 -05004199 }
4200 if (n > m)
4201 i = n - m;
4202 else
4203 i = 0;
4204 for (; i < defcount; i++) {
4205 if (GETLOCAL(m+i) == NULL) {
4206 PyObject *def = defs[i];
4207 Py_INCREF(def);
4208 SETLOCAL(m+i, def);
4209 }
4210 }
4211 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004212
4213 /* Add missing keyword arguments (copy default values from kwdefs) */
Benjamin Petersonb204a422011-06-05 22:04:07 -05004214 if (co->co_kwonlyargcount > 0) {
Victor Stinner17061a92016-08-16 23:39:42 +02004215 Py_ssize_t missing = 0;
Pablo Galindocd74e662019-06-01 18:08:04 +01004216 for (i = co->co_argcount; i < total_args; i++) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004217 PyObject *name;
4218 if (GETLOCAL(i) != NULL)
4219 continue;
4220 name = PyTuple_GET_ITEM(co->co_varnames, i);
4221 if (kwdefs != NULL) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02004222 PyObject *def = PyDict_GetItemWithError(kwdefs, name);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004223 if (def) {
4224 Py_INCREF(def);
4225 SETLOCAL(i, def);
4226 continue;
4227 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004228 else if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02004229 goto fail;
4230 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004231 }
Benjamin Petersone109c702011-06-24 09:37:26 -05004232 missing++;
4233 }
4234 if (missing) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004235 missing_arguments(tstate, co, missing, -1, fastlocals);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004236 goto fail;
4237 }
4238 }
4239
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004240 /* Allocate and initialize storage for cell vars, and copy free
Benjamin Peterson90037602011-06-25 22:54:45 -05004241 vars into frame. */
4242 for (i = 0; i < PyTuple_GET_SIZE(co->co_cellvars); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004243 PyObject *c;
Serhiy Storchaka5bb8b912016-12-16 19:19:02 +02004244 Py_ssize_t arg;
Benjamin Peterson90037602011-06-25 22:54:45 -05004245 /* Possibly account for the cell variable being an argument. */
4246 if (co->co_cell2arg != NULL &&
Guido van Rossum6832c812013-05-10 08:47:42 -07004247 (arg = co->co_cell2arg[i]) != CO_CELL_NOT_AN_ARG) {
Benjamin Peterson90037602011-06-25 22:54:45 -05004248 c = PyCell_New(GETLOCAL(arg));
Benjamin Peterson159ae412013-05-12 18:16:06 -05004249 /* Clear the local copy. */
4250 SETLOCAL(arg, NULL);
Guido van Rossum6832c812013-05-10 08:47:42 -07004251 }
4252 else {
Benjamin Peterson90037602011-06-25 22:54:45 -05004253 c = PyCell_New(NULL);
Guido van Rossum6832c812013-05-10 08:47:42 -07004254 }
Benjamin Peterson159ae412013-05-12 18:16:06 -05004255 if (c == NULL)
4256 goto fail;
Benjamin Peterson90037602011-06-25 22:54:45 -05004257 SETLOCAL(co->co_nlocals + i, c);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004258 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004259
4260 /* Copy closure variables to free variables */
Benjamin Peterson90037602011-06-25 22:54:45 -05004261 for (i = 0; i < PyTuple_GET_SIZE(co->co_freevars); ++i) {
4262 PyObject *o = PyTuple_GET_ITEM(closure, i);
4263 Py_INCREF(o);
4264 freevars[PyTuple_GET_SIZE(co->co_cellvars) + i] = o;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004265 }
Tim Peters5ca576e2001-06-18 22:08:13 +00004266
Yury Selivanoveb636452016-09-08 22:01:51 -07004267 /* Handle generator/coroutine/asynchronous generator */
4268 if (co->co_flags & (CO_GENERATOR | CO_COROUTINE | CO_ASYNC_GENERATOR)) {
Yury Selivanov75445082015-05-11 22:57:16 -04004269 PyObject *gen;
Yury Selivanov5376ba92015-06-22 12:19:30 -04004270 int is_coro = co->co_flags & CO_COROUTINE;
Yury Selivanov94c22632015-06-04 10:16:51 -04004271
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004272 /* Don't need to keep the reference to f_back, it will be set
4273 * when the generator is resumed. */
Serhiy Storchaka505ff752014-02-09 13:33:53 +02004274 Py_CLEAR(f->f_back);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00004275
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004276 /* Create a new generator that owns the ready to run frame
4277 * and return that as the value. */
Yury Selivanov5376ba92015-06-22 12:19:30 -04004278 if (is_coro) {
4279 gen = PyCoro_New(f, name, qualname);
Yury Selivanoveb636452016-09-08 22:01:51 -07004280 } else if (co->co_flags & CO_ASYNC_GENERATOR) {
4281 gen = PyAsyncGen_New(f, name, qualname);
Yury Selivanov5376ba92015-06-22 12:19:30 -04004282 } else {
4283 gen = PyGen_NewWithQualName(f, name, qualname);
4284 }
INADA Naoki6a3cedf2016-12-26 18:01:46 +09004285 if (gen == NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04004286 return NULL;
INADA Naoki6a3cedf2016-12-26 18:01:46 +09004287 }
INADA Naoki9c157762016-12-26 18:52:46 +09004288
INADA Naoki6a3cedf2016-12-26 18:01:46 +09004289 _PyObject_GC_TRACK(f);
Yury Selivanov75445082015-05-11 22:57:16 -04004290
Yury Selivanov75445082015-05-11 22:57:16 -04004291 return gen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004292 }
Tim Peters5ca576e2001-06-18 22:08:13 +00004293
Victor Stinner59a73272016-12-09 18:51:13 +01004294 retval = PyEval_EvalFrameEx(f,0);
Tim Peters5ca576e2001-06-18 22:08:13 +00004295
Thomas Woutersce272b62007-09-19 21:19:28 +00004296fail: /* Jump here from prelude on failure */
Tim Peters5ca576e2001-06-18 22:08:13 +00004297
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004298 /* decref'ing the frame can cause __del__ methods to get invoked,
4299 which can call back into Python. While we're done with the
4300 current Python frame (f), the associated C stack is still in use,
4301 so recursion_depth must be boosted for the duration.
4302 */
4303 assert(tstate != NULL);
INADA Naoki5a625d02016-12-24 20:19:08 +09004304 if (Py_REFCNT(f) > 1) {
4305 Py_DECREF(f);
4306 _PyObject_GC_TRACK(f);
4307 }
4308 else {
4309 ++tstate->recursion_depth;
4310 Py_DECREF(f);
4311 --tstate->recursion_depth;
4312 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004313 return retval;
Tim Peters5ca576e2001-06-18 22:08:13 +00004314}
4315
Victor Stinner40ee3012014-06-16 15:59:28 +02004316PyObject *
4317PyEval_EvalCodeEx(PyObject *_co, PyObject *globals, PyObject *locals,
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02004318 PyObject *const *args, int argcount,
4319 PyObject *const *kws, int kwcount,
4320 PyObject *const *defs, int defcount,
4321 PyObject *kwdefs, PyObject *closure)
Victor Stinner40ee3012014-06-16 15:59:28 +02004322{
4323 return _PyEval_EvalCodeWithName(_co, globals, locals,
Victor Stinner9be7e7b2016-08-19 16:11:43 +02004324 args, argcount,
Zackery Spytzc6ea8972017-07-31 08:24:37 -06004325 kws, kws != NULL ? kws + 1 : NULL,
4326 kwcount, 2,
Victor Stinner9be7e7b2016-08-19 16:11:43 +02004327 defs, defcount,
4328 kwdefs, closure,
Victor Stinner40ee3012014-06-16 15:59:28 +02004329 NULL, NULL);
4330}
Tim Peters5ca576e2001-06-18 22:08:13 +00004331
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004332static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02004333special_lookup(PyThreadState *tstate, PyObject *o, _Py_Identifier *id)
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004334{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004335 PyObject *res;
Benjamin Petersonce798522012-01-22 11:24:29 -05004336 res = _PyObject_LookupSpecial(o, id);
Victor Stinner438a12d2019-05-24 17:01:38 +02004337 if (res == NULL && !_PyErr_Occurred(tstate)) {
4338 _PyErr_SetObject(tstate, PyExc_AttributeError, id->object);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004339 return NULL;
4340 }
4341 return res;
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004342}
4343
4344
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00004345/* Logic for the raise statement (too complicated for inlining).
4346 This *consumes* a reference count to each of its arguments. */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004347static int
Victor Stinner09532fe2019-05-10 23:39:09 +02004348do_raise(PyThreadState *tstate, PyObject *exc, PyObject *cause)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00004349{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004350 PyObject *type = NULL, *value = NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00004351
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004352 if (exc == NULL) {
4353 /* Reraise */
Mark Shannonae3087c2017-10-22 22:41:51 +01004354 _PyErr_StackItem *exc_info = _PyErr_GetTopmostException(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004355 PyObject *tb;
Mark Shannonae3087c2017-10-22 22:41:51 +01004356 type = exc_info->exc_type;
4357 value = exc_info->exc_value;
4358 tb = exc_info->exc_traceback;
Victor Stinnereec93312016-08-18 18:13:10 +02004359 if (type == Py_None || type == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004360 _PyErr_SetString(tstate, PyExc_RuntimeError,
4361 "No active exception to reraise");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004362 return 0;
4363 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004364 Py_XINCREF(type);
4365 Py_XINCREF(value);
4366 Py_XINCREF(tb);
Victor Stinner438a12d2019-05-24 17:01:38 +02004367 _PyErr_Restore(tstate, type, value, tb);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004368 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004369 }
Guido van Rossumac7be682001-01-17 15:42:30 +00004370
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004371 /* We support the following forms of raise:
4372 raise
Collin Winter828f04a2007-08-31 00:04:24 +00004373 raise <instance>
4374 raise <type> */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00004375
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004376 if (PyExceptionClass_Check(exc)) {
4377 type = exc;
Victor Stinnera5ed5f02016-12-06 18:45:50 +01004378 value = _PyObject_CallNoArg(exc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004379 if (value == NULL)
4380 goto raise_error;
Benjamin Peterson5afa03a2011-07-15 14:09:26 -05004381 if (!PyExceptionInstance_Check(value)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004382 _PyErr_Format(tstate, PyExc_TypeError,
4383 "calling %R should have returned an instance of "
4384 "BaseException, not %R",
4385 type, Py_TYPE(value));
4386 goto raise_error;
Benjamin Peterson5afa03a2011-07-15 14:09:26 -05004387 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004388 }
4389 else if (PyExceptionInstance_Check(exc)) {
4390 value = exc;
4391 type = PyExceptionInstance_Class(exc);
4392 Py_INCREF(type);
4393 }
4394 else {
4395 /* Not something you can raise. You get an exception
4396 anyway, just not what you specified :-) */
4397 Py_DECREF(exc);
Victor Stinner438a12d2019-05-24 17:01:38 +02004398 _PyErr_SetString(tstate, PyExc_TypeError,
4399 "exceptions must derive from BaseException");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004400 goto raise_error;
4401 }
Collin Winter828f04a2007-08-31 00:04:24 +00004402
Serhiy Storchakac0191582016-09-27 11:37:10 +03004403 assert(type != NULL);
4404 assert(value != NULL);
4405
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004406 if (cause) {
4407 PyObject *fixed_cause;
4408 if (PyExceptionClass_Check(cause)) {
Victor Stinnera5ed5f02016-12-06 18:45:50 +01004409 fixed_cause = _PyObject_CallNoArg(cause);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004410 if (fixed_cause == NULL)
4411 goto raise_error;
Benjamin Petersond5a1c442012-05-14 22:09:31 -07004412 Py_DECREF(cause);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004413 }
Benjamin Petersond5a1c442012-05-14 22:09:31 -07004414 else if (PyExceptionInstance_Check(cause)) {
4415 fixed_cause = cause;
4416 }
4417 else if (cause == Py_None) {
4418 Py_DECREF(cause);
4419 fixed_cause = NULL;
4420 }
4421 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02004422 _PyErr_SetString(tstate, PyExc_TypeError,
4423 "exception causes must derive from "
4424 "BaseException");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004425 goto raise_error;
4426 }
Benjamin Petersond5a1c442012-05-14 22:09:31 -07004427 PyException_SetCause(value, fixed_cause);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004428 }
Collin Winter828f04a2007-08-31 00:04:24 +00004429
Victor Stinner438a12d2019-05-24 17:01:38 +02004430 _PyErr_SetObject(tstate, type, value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004431 /* PyErr_SetObject incref's its arguments */
Serhiy Storchakac0191582016-09-27 11:37:10 +03004432 Py_DECREF(value);
4433 Py_DECREF(type);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004434 return 0;
Collin Winter828f04a2007-08-31 00:04:24 +00004435
4436raise_error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004437 Py_XDECREF(value);
4438 Py_XDECREF(type);
4439 Py_XDECREF(cause);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004440 return 0;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00004441}
4442
Tim Petersd6d010b2001-06-21 02:49:55 +00004443/* Iterate v argcnt times and store the results on the stack (via decreasing
Guido van Rossum0368b722007-05-11 16:50:42 +00004444 sp). Return 1 for success, 0 if error.
Antoine Pitrou9a2310d2008-07-25 22:39:39 +00004445
Guido van Rossum0368b722007-05-11 16:50:42 +00004446 If argcntafter == -1, do a simple unpack. If it is >= 0, do an unpack
4447 with a variable target.
4448*/
Tim Petersd6d010b2001-06-21 02:49:55 +00004449
Barry Warsawe42b18f1997-08-25 22:13:04 +00004450static int
Victor Stinner438a12d2019-05-24 17:01:38 +02004451unpack_iterable(PyThreadState *tstate, PyObject *v,
4452 int argcnt, int argcntafter, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00004453{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004454 int i = 0, j = 0;
4455 Py_ssize_t ll = 0;
4456 PyObject *it; /* iter(v) */
4457 PyObject *w;
4458 PyObject *l = NULL; /* variable list */
Guido van Rossumac7be682001-01-17 15:42:30 +00004459
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004460 assert(v != NULL);
Tim Petersd6d010b2001-06-21 02:49:55 +00004461
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004462 it = PyObject_GetIter(v);
Serhiy Storchaka13a6c092017-12-26 12:30:41 +02004463 if (it == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004464 if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError) &&
Serhiy Storchaka13a6c092017-12-26 12:30:41 +02004465 v->ob_type->tp_iter == NULL && !PySequence_Check(v))
4466 {
Victor Stinner438a12d2019-05-24 17:01:38 +02004467 _PyErr_Format(tstate, PyExc_TypeError,
4468 "cannot unpack non-iterable %.200s object",
4469 v->ob_type->tp_name);
Serhiy Storchaka13a6c092017-12-26 12:30:41 +02004470 }
4471 return 0;
4472 }
Tim Petersd6d010b2001-06-21 02:49:55 +00004473
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004474 for (; i < argcnt; i++) {
4475 w = PyIter_Next(it);
4476 if (w == NULL) {
4477 /* Iterator done, via error or exhaustion. */
Victor Stinner438a12d2019-05-24 17:01:38 +02004478 if (!_PyErr_Occurred(tstate)) {
R David Murray4171bbe2015-04-15 17:08:45 -04004479 if (argcntafter == -1) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004480 _PyErr_Format(tstate, PyExc_ValueError,
4481 "not enough values to unpack "
4482 "(expected %d, got %d)",
4483 argcnt, i);
R David Murray4171bbe2015-04-15 17:08:45 -04004484 }
4485 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02004486 _PyErr_Format(tstate, PyExc_ValueError,
4487 "not enough values to unpack "
4488 "(expected at least %d, got %d)",
4489 argcnt + argcntafter, i);
R David Murray4171bbe2015-04-15 17:08:45 -04004490 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004491 }
4492 goto Error;
4493 }
4494 *--sp = w;
4495 }
Tim Petersd6d010b2001-06-21 02:49:55 +00004496
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004497 if (argcntafter == -1) {
4498 /* We better have exhausted the iterator now. */
4499 w = PyIter_Next(it);
4500 if (w == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004501 if (_PyErr_Occurred(tstate))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004502 goto Error;
4503 Py_DECREF(it);
4504 return 1;
4505 }
4506 Py_DECREF(w);
Victor Stinner438a12d2019-05-24 17:01:38 +02004507 _PyErr_Format(tstate, PyExc_ValueError,
4508 "too many values to unpack (expected %d)",
4509 argcnt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004510 goto Error;
4511 }
Guido van Rossum0368b722007-05-11 16:50:42 +00004512
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004513 l = PySequence_List(it);
4514 if (l == NULL)
4515 goto Error;
4516 *--sp = l;
4517 i++;
Guido van Rossum0368b722007-05-11 16:50:42 +00004518
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004519 ll = PyList_GET_SIZE(l);
4520 if (ll < argcntafter) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004521 _PyErr_Format(tstate, PyExc_ValueError,
R David Murray4171bbe2015-04-15 17:08:45 -04004522 "not enough values to unpack (expected at least %d, got %zd)",
4523 argcnt + argcntafter, argcnt + ll);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004524 goto Error;
4525 }
Guido van Rossum0368b722007-05-11 16:50:42 +00004526
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004527 /* Pop the "after-variable" args off the list. */
4528 for (j = argcntafter; j > 0; j--, i++) {
4529 *--sp = PyList_GET_ITEM(l, ll - j);
4530 }
4531 /* Resize the list. */
4532 Py_SIZE(l) = ll - argcntafter;
4533 Py_DECREF(it);
4534 return 1;
Guido van Rossum0368b722007-05-11 16:50:42 +00004535
Tim Petersd6d010b2001-06-21 02:49:55 +00004536Error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004537 for (; i > 0; i--, sp++)
4538 Py_DECREF(*sp);
4539 Py_XDECREF(it);
4540 return 0;
Barry Warsawe42b18f1997-08-25 22:13:04 +00004541}
4542
4543
Guido van Rossum96a42c81992-01-12 02:29:51 +00004544#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00004545static int
Victor Stinner438a12d2019-05-24 17:01:38 +02004546prtrace(PyThreadState *tstate, PyObject *v, const char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004547{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004548 printf("%s ", str);
Victor Stinner438a12d2019-05-24 17:01:38 +02004549 if (PyObject_Print(v, stdout, 0) != 0) {
4550 /* Don't know what else to do */
4551 _PyErr_Clear(tstate);
4552 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004553 printf("\n");
4554 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004555}
Guido van Rossum3f5da241990-12-20 15:06:42 +00004556#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004557
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00004558static void
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004559call_exc_trace(Py_tracefunc func, PyObject *self,
4560 PyThreadState *tstate, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00004561{
Victor Stinneraaa8ed82013-07-10 13:57:55 +02004562 PyObject *type, *value, *traceback, *orig_traceback, *arg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004563 int err;
Victor Stinner438a12d2019-05-24 17:01:38 +02004564 _PyErr_Fetch(tstate, &type, &value, &orig_traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004565 if (value == NULL) {
4566 value = Py_None;
4567 Py_INCREF(value);
4568 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004569 _PyErr_NormalizeException(tstate, &type, &value, &orig_traceback);
Antoine Pitrou89335212013-11-23 14:05:23 +01004570 traceback = (orig_traceback != NULL) ? orig_traceback : Py_None;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004571 arg = PyTuple_Pack(3, type, value, traceback);
4572 if (arg == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004573 _PyErr_Restore(tstate, type, value, orig_traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004574 return;
4575 }
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004576 err = call_trace(func, self, tstate, f, PyTrace_EXCEPTION, arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004577 Py_DECREF(arg);
Victor Stinner438a12d2019-05-24 17:01:38 +02004578 if (err == 0) {
4579 _PyErr_Restore(tstate, type, value, orig_traceback);
4580 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004581 else {
4582 Py_XDECREF(type);
4583 Py_XDECREF(value);
Victor Stinneraaa8ed82013-07-10 13:57:55 +02004584 Py_XDECREF(orig_traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004585 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00004586}
4587
Amaury Forgeot d'Arcf05149a2007-11-13 01:05:30 +00004588static int
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004589call_trace_protected(Py_tracefunc func, PyObject *obj,
4590 PyThreadState *tstate, PyFrameObject *frame,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004591 int what, PyObject *arg)
Fred Drake4ec5d562001-10-04 19:26:43 +00004592{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004593 PyObject *type, *value, *traceback;
4594 int err;
Victor Stinner438a12d2019-05-24 17:01:38 +02004595 _PyErr_Fetch(tstate, &type, &value, &traceback);
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004596 err = call_trace(func, obj, tstate, frame, what, arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004597 if (err == 0)
4598 {
Victor Stinner438a12d2019-05-24 17:01:38 +02004599 _PyErr_Restore(tstate, type, value, traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004600 return 0;
4601 }
4602 else {
4603 Py_XDECREF(type);
4604 Py_XDECREF(value);
4605 Py_XDECREF(traceback);
4606 return -1;
4607 }
Fred Drake4ec5d562001-10-04 19:26:43 +00004608}
4609
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00004610static int
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004611call_trace(Py_tracefunc func, PyObject *obj,
4612 PyThreadState *tstate, PyFrameObject *frame,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004613 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00004614{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004615 int result;
4616 if (tstate->tracing)
4617 return 0;
4618 tstate->tracing++;
4619 tstate->use_tracing = 0;
4620 result = func(obj, frame, what, arg);
4621 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
4622 || (tstate->c_profilefunc != NULL));
4623 tstate->tracing--;
4624 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00004625}
4626
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00004627PyObject *
4628_PyEval_CallTracing(PyObject *func, PyObject *args)
4629{
Victor Stinner50b48572018-11-01 01:51:40 +01004630 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004631 int save_tracing = tstate->tracing;
4632 int save_use_tracing = tstate->use_tracing;
4633 PyObject *result;
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00004634
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004635 tstate->tracing = 0;
4636 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
4637 || (tstate->c_profilefunc != NULL));
4638 result = PyObject_Call(func, args, NULL);
4639 tstate->tracing = save_tracing;
4640 tstate->use_tracing = save_use_tracing;
4641 return result;
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00004642}
4643
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00004644/* See Objects/lnotab_notes.txt for a description of how tracing works. */
Michael W. Hudson006c7522002-11-08 13:08:46 +00004645static int
Tim Peters8a5c3c72004-04-05 19:36:21 +00004646maybe_call_line_trace(Py_tracefunc func, PyObject *obj,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004647 PyThreadState *tstate, PyFrameObject *frame,
4648 int *instr_lb, int *instr_ub, int *instr_prev)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004649{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004650 int result = 0;
4651 int line = frame->f_lineno;
Michael W. Hudson006c7522002-11-08 13:08:46 +00004652
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004653 /* If the last instruction executed isn't in the current
4654 instruction window, reset the window.
4655 */
4656 if (frame->f_lasti < *instr_lb || frame->f_lasti >= *instr_ub) {
4657 PyAddrPair bounds;
4658 line = _PyCode_CheckLineNumber(frame->f_code, frame->f_lasti,
4659 &bounds);
4660 *instr_lb = bounds.ap_lower;
4661 *instr_ub = bounds.ap_upper;
4662 }
Nick Coghlan5a851672017-09-08 10:14:16 +10004663 /* If the last instruction falls at the start of a line or if it
4664 represents a jump backwards, update the frame's line number and
4665 then call the trace function if we're tracing source lines.
4666 */
4667 if ((frame->f_lasti == *instr_lb || frame->f_lasti < *instr_prev)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004668 frame->f_lineno = line;
Nick Coghlan5a851672017-09-08 10:14:16 +10004669 if (frame->f_trace_lines) {
4670 result = call_trace(func, obj, tstate, frame, PyTrace_LINE, Py_None);
4671 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004672 }
George King20faa682017-10-18 17:44:22 -07004673 /* Always emit an opcode event if we're tracing all opcodes. */
4674 if (frame->f_trace_opcodes) {
4675 result = call_trace(func, obj, tstate, frame, PyTrace_OPCODE, Py_None);
4676 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004677 *instr_prev = frame->f_lasti;
4678 return result;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004679}
4680
Fred Drake5755ce62001-06-27 19:19:46 +00004681void
4682PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00004683{
Steve Dowerb82e17e2019-05-23 08:45:22 -07004684 if (PySys_Audit("sys.setprofile", NULL) < 0) {
4685 return;
4686 }
4687
Victor Stinner50b48572018-11-01 01:51:40 +01004688 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004689 PyObject *temp = tstate->c_profileobj;
4690 Py_XINCREF(arg);
4691 tstate->c_profilefunc = NULL;
4692 tstate->c_profileobj = NULL;
4693 /* Must make sure that tracing is not ignored if 'temp' is freed */
4694 tstate->use_tracing = tstate->c_tracefunc != NULL;
4695 Py_XDECREF(temp);
4696 tstate->c_profilefunc = func;
4697 tstate->c_profileobj = arg;
4698 /* Flag that tracing or profiling is turned on */
4699 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
Fred Drake5755ce62001-06-27 19:19:46 +00004700}
4701
4702void
4703PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
4704{
Steve Dowerb82e17e2019-05-23 08:45:22 -07004705 if (PySys_Audit("sys.settrace", NULL) < 0) {
4706 return;
4707 }
4708
Victor Stinner09532fe2019-05-10 23:39:09 +02004709 _PyRuntimeState *runtime = &_PyRuntime;
4710 PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004711 PyObject *temp = tstate->c_traceobj;
Victor Stinner09532fe2019-05-10 23:39:09 +02004712 runtime->ceval.tracing_possible += (func != NULL) - (tstate->c_tracefunc != NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004713 Py_XINCREF(arg);
4714 tstate->c_tracefunc = NULL;
4715 tstate->c_traceobj = NULL;
4716 /* Must make sure that profiling is not ignored if 'temp' is freed */
4717 tstate->use_tracing = tstate->c_profilefunc != NULL;
4718 Py_XDECREF(temp);
4719 tstate->c_tracefunc = func;
4720 tstate->c_traceobj = arg;
4721 /* Flag that tracing or profiling is turned on */
4722 tstate->use_tracing = ((func != NULL)
4723 || (tstate->c_profilefunc != NULL));
Fred Draked0838392001-06-16 21:02:31 +00004724}
4725
Yury Selivanov75445082015-05-11 22:57:16 -04004726void
Victor Stinner838f2642019-06-13 22:41:23 +02004727_PyEval_SetCoroutineOriginTrackingDepth(PyThreadState *tstate, int new_depth)
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08004728{
4729 assert(new_depth >= 0);
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08004730 tstate->coroutine_origin_tracking_depth = new_depth;
4731}
4732
4733int
4734_PyEval_GetCoroutineOriginTrackingDepth(void)
4735{
Victor Stinner50b48572018-11-01 01:51:40 +01004736 PyThreadState *tstate = _PyThreadState_GET();
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08004737 return tstate->coroutine_origin_tracking_depth;
4738}
4739
4740void
Yury Selivanoveb636452016-09-08 22:01:51 -07004741_PyEval_SetAsyncGenFirstiter(PyObject *firstiter)
4742{
Victor Stinner50b48572018-11-01 01:51:40 +01004743 PyThreadState *tstate = _PyThreadState_GET();
Steve Dowerb82e17e2019-05-23 08:45:22 -07004744
4745 if (PySys_Audit("sys.set_asyncgen_hook_firstiter", NULL) < 0) {
4746 return;
4747 }
4748
Yury Selivanoveb636452016-09-08 22:01:51 -07004749 Py_XINCREF(firstiter);
4750 Py_XSETREF(tstate->async_gen_firstiter, firstiter);
4751}
4752
4753PyObject *
4754_PyEval_GetAsyncGenFirstiter(void)
4755{
Victor Stinner50b48572018-11-01 01:51:40 +01004756 PyThreadState *tstate = _PyThreadState_GET();
Yury Selivanoveb636452016-09-08 22:01:51 -07004757 return tstate->async_gen_firstiter;
4758}
4759
4760void
4761_PyEval_SetAsyncGenFinalizer(PyObject *finalizer)
4762{
Victor Stinner50b48572018-11-01 01:51:40 +01004763 PyThreadState *tstate = _PyThreadState_GET();
Steve Dowerb82e17e2019-05-23 08:45:22 -07004764
4765 if (PySys_Audit("sys.set_asyncgen_hook_finalizer", NULL) < 0) {
4766 return;
4767 }
4768
Yury Selivanoveb636452016-09-08 22:01:51 -07004769 Py_XINCREF(finalizer);
4770 Py_XSETREF(tstate->async_gen_finalizer, finalizer);
4771}
4772
4773PyObject *
4774_PyEval_GetAsyncGenFinalizer(void)
4775{
Victor Stinner50b48572018-11-01 01:51:40 +01004776 PyThreadState *tstate = _PyThreadState_GET();
Yury Selivanoveb636452016-09-08 22:01:51 -07004777 return tstate->async_gen_finalizer;
4778}
4779
Victor Stinner438a12d2019-05-24 17:01:38 +02004780static PyFrameObject *
4781_PyEval_GetFrame(PyThreadState *tstate)
4782{
4783 return _PyRuntime.gilstate.getframe(tstate);
4784}
4785
4786PyFrameObject *
4787PyEval_GetFrame(void)
4788{
4789 PyThreadState *tstate = _PyThreadState_GET();
4790 return _PyEval_GetFrame(tstate);
4791}
4792
Guido van Rossumb209a111997-04-29 18:18:01 +00004793PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004794PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00004795{
Victor Stinner438a12d2019-05-24 17:01:38 +02004796 PyThreadState *tstate = _PyThreadState_GET();
4797 PyFrameObject *current_frame = _PyEval_GetFrame(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004798 if (current_frame == NULL)
Victor Stinner438a12d2019-05-24 17:01:38 +02004799 return tstate->interp->builtins;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004800 else
4801 return current_frame->f_builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00004802}
4803
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02004804/* Convenience function to get a builtin from its name */
4805PyObject *
4806_PyEval_GetBuiltinId(_Py_Identifier *name)
4807{
Victor Stinner438a12d2019-05-24 17:01:38 +02004808 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02004809 PyObject *attr = _PyDict_GetItemIdWithError(PyEval_GetBuiltins(), name);
4810 if (attr) {
4811 Py_INCREF(attr);
4812 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004813 else if (!_PyErr_Occurred(tstate)) {
4814 _PyErr_SetObject(tstate, PyExc_AttributeError, _PyUnicode_FromId(name));
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02004815 }
4816 return attr;
4817}
4818
Guido van Rossumb209a111997-04-29 18:18:01 +00004819PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004820PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00004821{
Victor Stinner438a12d2019-05-24 17:01:38 +02004822 PyThreadState *tstate = _PyThreadState_GET();
4823 PyFrameObject *current_frame = _PyEval_GetFrame(tstate);
Victor Stinner41bb43a2013-10-29 01:19:37 +01004824 if (current_frame == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004825 _PyErr_SetString(tstate, PyExc_SystemError, "frame does not exist");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004826 return NULL;
Victor Stinner41bb43a2013-10-29 01:19:37 +01004827 }
4828
Victor Stinner438a12d2019-05-24 17:01:38 +02004829 if (PyFrame_FastToLocalsWithError(current_frame) < 0) {
Victor Stinner41bb43a2013-10-29 01:19:37 +01004830 return NULL;
Victor Stinner438a12d2019-05-24 17:01:38 +02004831 }
Victor Stinner41bb43a2013-10-29 01:19:37 +01004832
4833 assert(current_frame->f_locals != NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004834 return current_frame->f_locals;
Guido van Rossum5b722181993-03-30 17:46:03 +00004835}
4836
Guido van Rossumb209a111997-04-29 18:18:01 +00004837PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004838PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00004839{
Victor Stinner438a12d2019-05-24 17:01:38 +02004840 PyThreadState *tstate = _PyThreadState_GET();
4841 PyFrameObject *current_frame = _PyEval_GetFrame(tstate);
4842 if (current_frame == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004843 return NULL;
Victor Stinner438a12d2019-05-24 17:01:38 +02004844 }
Victor Stinner41bb43a2013-10-29 01:19:37 +01004845
4846 assert(current_frame->f_globals != NULL);
4847 return current_frame->f_globals;
Guido van Rossum3f5da241990-12-20 15:06:42 +00004848}
4849
Guido van Rossum6135a871995-01-09 17:53:26 +00004850int
Tim Peters5ba58662001-07-16 02:29:45 +00004851PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
Jeremy Hylton061d1062001-03-22 02:32:48 +00004852{
Victor Stinner438a12d2019-05-24 17:01:38 +02004853 PyThreadState *tstate = _PyThreadState_GET();
4854 PyFrameObject *current_frame = _PyEval_GetFrame(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004855 int result = cf->cf_flags != 0;
Tim Peters5ba58662001-07-16 02:29:45 +00004856
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004857 if (current_frame != NULL) {
4858 const int codeflags = current_frame->f_code->co_flags;
4859 const int compilerflags = codeflags & PyCF_MASK;
4860 if (compilerflags) {
4861 result = 1;
4862 cf->cf_flags |= compilerflags;
4863 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00004864#if 0 /* future keyword */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004865 if (codeflags & CO_GENERATOR_ALLOWED) {
4866 result = 1;
4867 cf->cf_flags |= CO_GENERATOR_ALLOWED;
4868 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00004869#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004870 }
4871 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00004872}
4873
Guido van Rossum3f5da241990-12-20 15:06:42 +00004874
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00004875const char *
Tim Peters6d6c1a32001-08-02 04:15:00 +00004876PyEval_GetFuncName(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00004877{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004878 if (PyMethod_Check(func))
4879 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
4880 else if (PyFunction_Check(func))
Serhiy Storchaka06515832016-11-20 09:13:07 +02004881 return PyUnicode_AsUTF8(((PyFunctionObject*)func)->func_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004882 else if (PyCFunction_Check(func))
4883 return ((PyCFunctionObject*)func)->m_ml->ml_name;
4884 else
4885 return func->ob_type->tp_name;
Jeremy Hylton512a2372001-04-11 13:52:29 +00004886}
4887
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00004888const char *
Tim Peters6d6c1a32001-08-02 04:15:00 +00004889PyEval_GetFuncDesc(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00004890{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004891 if (PyMethod_Check(func))
4892 return "()";
4893 else if (PyFunction_Check(func))
4894 return "()";
4895 else if (PyCFunction_Check(func))
4896 return "()";
4897 else
4898 return " object";
Jeremy Hylton512a2372001-04-11 13:52:29 +00004899}
4900
Armin Rigo1c2d7e52005-09-20 18:34:01 +00004901#define C_TRACE(x, call) \
Nicholas Bastind858a772004-06-25 23:31:06 +00004902if (tstate->use_tracing && tstate->c_profilefunc) { \
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004903 if (call_trace(tstate->c_profilefunc, tstate->c_profileobj, \
4904 tstate, tstate->frame, \
4905 PyTrace_C_CALL, func)) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004906 x = NULL; \
4907 } \
4908 else { \
4909 x = call; \
4910 if (tstate->c_profilefunc != NULL) { \
4911 if (x == NULL) { \
4912 call_trace_protected(tstate->c_profilefunc, \
4913 tstate->c_profileobj, \
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004914 tstate, tstate->frame, \
4915 PyTrace_C_EXCEPTION, func); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004916 /* XXX should pass (type, value, tb) */ \
4917 } else { \
4918 if (call_trace(tstate->c_profilefunc, \
4919 tstate->c_profileobj, \
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004920 tstate, tstate->frame, \
4921 PyTrace_C_RETURN, func)) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004922 Py_DECREF(x); \
4923 x = NULL; \
4924 } \
4925 } \
4926 } \
4927 } \
Nicholas Bastind858a772004-06-25 23:31:06 +00004928} else { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004929 x = call; \
4930 }
Nicholas Bastinc69ebe82004-03-24 21:57:10 +00004931
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02004932
4933static PyObject *
4934trace_call_function(PyThreadState *tstate,
4935 PyObject *func,
4936 PyObject **args, Py_ssize_t nargs,
4937 PyObject *kwnames)
4938{
4939 PyObject *x;
4940 if (PyCFunction_Check(func)) {
Jeroen Demeyer37788bc2019-05-30 15:11:22 +02004941 C_TRACE(x, _PyCFunction_Vectorcall(func, args, nargs, kwnames));
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02004942 return x;
4943 }
4944 else if (Py_TYPE(func) == &PyMethodDescr_Type && nargs > 0) {
4945 /* We need to create a temporary bound method as argument
4946 for profiling.
4947
4948 If nargs == 0, then this cannot work because we have no
4949 "self". In any case, the call itself would raise
4950 TypeError (foo needs an argument), so we just skip
4951 profiling. */
4952 PyObject *self = args[0];
4953 func = Py_TYPE(func)->tp_descr_get(func, self, (PyObject*)Py_TYPE(self));
4954 if (func == NULL) {
4955 return NULL;
4956 }
Jeroen Demeyer37788bc2019-05-30 15:11:22 +02004957 C_TRACE(x, _PyCFunction_Vectorcall(func,
4958 args+1, nargs-1,
4959 kwnames));
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02004960 Py_DECREF(func);
4961 return x;
4962 }
4963 return _PyObject_Vectorcall(func, args, nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames);
4964}
4965
Victor Stinner415c5102017-01-11 00:54:57 +01004966/* Issue #29227: Inline call_function() into _PyEval_EvalFrameDefault()
4967 to reduce the stack consumption. */
4968Py_LOCAL_INLINE(PyObject *) _Py_HOT_FUNCTION
Victor Stinner09532fe2019-05-10 23:39:09 +02004969call_function(PyThreadState *tstate, PyObject ***pp_stack, Py_ssize_t oparg, PyObject *kwnames)
Jeremy Hyltone8c04322002-08-16 17:47:26 +00004970{
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004971 PyObject **pfunc = (*pp_stack) - oparg - 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004972 PyObject *func = *pfunc;
4973 PyObject *x, *w;
Victor Stinnerd8735722016-09-09 12:36:44 -07004974 Py_ssize_t nkwargs = (kwnames == NULL) ? 0 : PyTuple_GET_SIZE(kwnames);
4975 Py_ssize_t nargs = oparg - nkwargs;
INADA Naoki5566bbb2017-02-03 07:43:03 +09004976 PyObject **stack = (*pp_stack) - nargs - nkwargs;
Jeremy Hyltone8c04322002-08-16 17:47:26 +00004977
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02004978 if (tstate->use_tracing) {
4979 x = trace_call_function(tstate, func, stack, nargs, kwnames);
INADA Naoki5566bbb2017-02-03 07:43:03 +09004980 }
Victor Stinner4a7cc882015-03-06 23:35:27 +01004981 else {
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02004982 x = _PyObject_Vectorcall(func, stack, nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004983 }
Tim Peters8a5c3c72004-04-05 19:36:21 +00004984
Victor Stinner438a12d2019-05-24 17:01:38 +02004985 assert((x != NULL) ^ (_PyErr_Occurred(tstate) != NULL));
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004986
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01004987 /* Clear the stack of the function object. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004988 while ((*pp_stack) > pfunc) {
4989 w = EXT_POP(*pp_stack);
4990 Py_DECREF(w);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004991 }
Victor Stinnerace47d72013-07-18 01:41:08 +02004992
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004993 return x;
Jeremy Hyltone8c04322002-08-16 17:47:26 +00004994}
4995
Jeremy Hylton52820442001-01-03 23:52:36 +00004996static PyObject *
Victor Stinner09532fe2019-05-10 23:39:09 +02004997do_call_core(PyThreadState *tstate, PyObject *func, PyObject *callargs, PyObject *kwdict)
Jeremy Hylton52820442001-01-03 23:52:36 +00004998{
jdemeyere89de732018-09-19 12:06:20 +02004999 PyObject *result;
5000
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005001 if (PyCFunction_Check(func)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005002 C_TRACE(result, PyCFunction_Call(func, callargs, kwdict));
Victor Stinnerf9b760f2016-09-09 10:17:08 -07005003 return result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005004 }
jdemeyere89de732018-09-19 12:06:20 +02005005 else if (Py_TYPE(func) == &PyMethodDescr_Type) {
jdemeyere89de732018-09-19 12:06:20 +02005006 Py_ssize_t nargs = PyTuple_GET_SIZE(callargs);
5007 if (nargs > 0 && tstate->use_tracing) {
5008 /* We need to create a temporary bound method as argument
5009 for profiling.
5010
5011 If nargs == 0, then this cannot work because we have no
5012 "self". In any case, the call itself would raise
5013 TypeError (foo needs an argument), so we just skip
5014 profiling. */
5015 PyObject *self = PyTuple_GET_ITEM(callargs, 0);
5016 func = Py_TYPE(func)->tp_descr_get(func, self, (PyObject*)Py_TYPE(self));
5017 if (func == NULL) {
5018 return NULL;
5019 }
5020
5021 C_TRACE(result, _PyCFunction_FastCallDict(func,
Victor Stinnerd17a6932018-11-09 16:56:48 +01005022 &_PyTuple_ITEMS(callargs)[1],
jdemeyere89de732018-09-19 12:06:20 +02005023 nargs - 1,
5024 kwdict));
5025 Py_DECREF(func);
5026 return result;
5027 }
Victor Stinner74319ae2016-08-25 00:04:09 +02005028 }
jdemeyere89de732018-09-19 12:06:20 +02005029 return PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00005030}
5031
Serhiy Storchaka483405b2015-02-17 10:14:30 +02005032/* Extract a slice index from a PyLong or an object with the
Guido van Rossum38fff8c2006-03-07 18:50:55 +00005033 nb_index slot defined, and store in *pi.
5034 Silently reduce values larger than PY_SSIZE_T_MAX to PY_SSIZE_T_MAX,
Xiang Zhang2ddf5a12017-05-10 18:19:41 +08005035 and silently boost values less than PY_SSIZE_T_MIN to PY_SSIZE_T_MIN.
Martin v. Löwisdde99d22006-02-17 15:57:41 +00005036 Return 0 on error, 1 on success.
Tim Peterscb479e72001-12-16 19:11:44 +00005037*/
Guido van Rossum20c6add2000-05-08 14:06:50 +00005038int
Martin v. Löwis18e16552006-02-15 17:27:45 +00005039_PyEval_SliceIndex(PyObject *v, Py_ssize_t *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005040{
Victor Stinner438a12d2019-05-24 17:01:38 +02005041 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005042 if (v != Py_None) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005043 Py_ssize_t x;
5044 if (PyIndex_Check(v)) {
5045 x = PyNumber_AsSsize_t(v, NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02005046 if (x == -1 && _PyErr_Occurred(tstate))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005047 return 0;
5048 }
5049 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02005050 _PyErr_SetString(tstate, PyExc_TypeError,
5051 "slice indices must be integers or "
5052 "None or have an __index__ method");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005053 return 0;
5054 }
5055 *pi = x;
5056 }
5057 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005058}
5059
Serhiy Storchaka80ec8362017-03-19 19:37:40 +02005060int
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005061_PyEval_SliceIndexNotNone(PyObject *v, Py_ssize_t *pi)
Serhiy Storchaka80ec8362017-03-19 19:37:40 +02005062{
Victor Stinner438a12d2019-05-24 17:01:38 +02005063 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005064 Py_ssize_t x;
5065 if (PyIndex_Check(v)) {
5066 x = PyNumber_AsSsize_t(v, NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02005067 if (x == -1 && _PyErr_Occurred(tstate))
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005068 return 0;
5069 }
5070 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02005071 _PyErr_SetString(tstate, PyExc_TypeError,
5072 "slice indices must be integers or "
5073 "have an __index__ method");
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005074 return 0;
5075 }
5076 *pi = x;
5077 return 1;
Serhiy Storchaka80ec8362017-03-19 19:37:40 +02005078}
5079
5080
Guido van Rossum486364b2007-06-30 05:01:58 +00005081#define CANNOT_CATCH_MSG "catching classes that do not inherit from "\
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005082 "BaseException is not allowed"
Brett Cannonf74225d2007-02-26 21:10:16 +00005083
Guido van Rossumb209a111997-04-29 18:18:01 +00005084static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02005085cmp_outcome(PyThreadState *tstate, int op, PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005086{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005087 int res = 0;
5088 switch (op) {
5089 case PyCmp_IS:
5090 res = (v == w);
5091 break;
5092 case PyCmp_IS_NOT:
5093 res = (v != w);
5094 break;
5095 case PyCmp_IN:
5096 res = PySequence_Contains(w, v);
5097 if (res < 0)
5098 return NULL;
5099 break;
5100 case PyCmp_NOT_IN:
5101 res = PySequence_Contains(w, v);
5102 if (res < 0)
5103 return NULL;
5104 res = !res;
5105 break;
5106 case PyCmp_EXC_MATCH:
5107 if (PyTuple_Check(w)) {
5108 Py_ssize_t i, length;
5109 length = PyTuple_Size(w);
5110 for (i = 0; i < length; i += 1) {
5111 PyObject *exc = PyTuple_GET_ITEM(w, i);
5112 if (!PyExceptionClass_Check(exc)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005113 _PyErr_SetString(tstate, PyExc_TypeError,
5114 CANNOT_CATCH_MSG);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005115 return NULL;
5116 }
5117 }
5118 }
5119 else {
5120 if (!PyExceptionClass_Check(w)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005121 _PyErr_SetString(tstate, PyExc_TypeError,
5122 CANNOT_CATCH_MSG);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005123 return NULL;
5124 }
5125 }
5126 res = PyErr_GivenExceptionMatches(v, w);
5127 break;
5128 default:
5129 return PyObject_RichCompare(v, w, op);
5130 }
5131 v = res ? Py_True : Py_False;
5132 Py_INCREF(v);
5133 return v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005134}
5135
Thomas Wouters52152252000-08-17 22:55:00 +00005136static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02005137import_name(PyThreadState *tstate, PyFrameObject *f,
5138 PyObject *name, PyObject *fromlist, PyObject *level)
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005139{
5140 _Py_IDENTIFIER(__import__);
Victor Stinnerdf142fd2016-08-20 00:44:42 +02005141 PyObject *import_func, *res;
5142 PyObject* stack[5];
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005143
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02005144 import_func = _PyDict_GetItemIdWithError(f->f_builtins, &PyId___import__);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005145 if (import_func == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005146 if (!_PyErr_Occurred(tstate)) {
5147 _PyErr_SetString(tstate, PyExc_ImportError, "__import__ not found");
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02005148 }
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005149 return NULL;
5150 }
5151
5152 /* Fast path for not overloaded __import__. */
Victor Stinner438a12d2019-05-24 17:01:38 +02005153 if (import_func == tstate->interp->import_func) {
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005154 int ilevel = _PyLong_AsInt(level);
Victor Stinner438a12d2019-05-24 17:01:38 +02005155 if (ilevel == -1 && _PyErr_Occurred(tstate)) {
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005156 return NULL;
5157 }
5158 res = PyImport_ImportModuleLevelObject(
5159 name,
5160 f->f_globals,
5161 f->f_locals == NULL ? Py_None : f->f_locals,
5162 fromlist,
5163 ilevel);
5164 return res;
5165 }
5166
5167 Py_INCREF(import_func);
Victor Stinnerdf142fd2016-08-20 00:44:42 +02005168
5169 stack[0] = name;
5170 stack[1] = f->f_globals;
5171 stack[2] = f->f_locals == NULL ? Py_None : f->f_locals;
5172 stack[3] = fromlist;
5173 stack[4] = level;
Victor Stinner559bb6a2016-08-22 22:48:54 +02005174 res = _PyObject_FastCall(import_func, stack, 5);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005175 Py_DECREF(import_func);
5176 return res;
5177}
5178
5179static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02005180import_from(PyThreadState *tstate, PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00005181{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005182 PyObject *x;
Antoine Pitrou0373a102014-10-13 20:19:45 +02005183 _Py_IDENTIFIER(__name__);
Xiang Zhang4830f582017-03-21 11:13:42 +08005184 PyObject *fullmodname, *pkgname, *pkgpath, *pkgname_or_unknown, *errmsg;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00005185
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005186 if (_PyObject_LookupAttr(v, name, &x) != 0) {
Antoine Pitrou0373a102014-10-13 20:19:45 +02005187 return x;
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005188 }
Antoine Pitrou0373a102014-10-13 20:19:45 +02005189 /* Issue #17636: in case this failed because of a circular relative
5190 import, try to fallback on reading the module directly from
5191 sys.modules. */
Antoine Pitrou0373a102014-10-13 20:19:45 +02005192 pkgname = _PyObject_GetAttrId(v, &PyId___name__);
Brett Cannon3008bc02015-08-11 18:01:31 -07005193 if (pkgname == NULL) {
5194 goto error;
5195 }
Oren Milman6db70332017-09-19 14:23:01 +03005196 if (!PyUnicode_Check(pkgname)) {
5197 Py_CLEAR(pkgname);
5198 goto error;
5199 }
Antoine Pitrou0373a102014-10-13 20:19:45 +02005200 fullmodname = PyUnicode_FromFormat("%U.%U", pkgname, name);
Brett Cannon3008bc02015-08-11 18:01:31 -07005201 if (fullmodname == NULL) {
Xiang Zhang4830f582017-03-21 11:13:42 +08005202 Py_DECREF(pkgname);
Antoine Pitrou0373a102014-10-13 20:19:45 +02005203 return NULL;
Brett Cannon3008bc02015-08-11 18:01:31 -07005204 }
Eric Snow3f9eee62017-09-15 16:35:20 -06005205 x = PyImport_GetModule(fullmodname);
Antoine Pitrou0373a102014-10-13 20:19:45 +02005206 Py_DECREF(fullmodname);
Victor Stinner438a12d2019-05-24 17:01:38 +02005207 if (x == NULL && !_PyErr_Occurred(tstate)) {
Brett Cannon3008bc02015-08-11 18:01:31 -07005208 goto error;
5209 }
Matthias Bussonnier1bc15642017-02-22 07:06:50 -08005210 Py_DECREF(pkgname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005211 return x;
Brett Cannon3008bc02015-08-11 18:01:31 -07005212 error:
Matthias Bussonnierbc4bed42017-02-14 16:05:25 -08005213 pkgpath = PyModule_GetFilenameObject(v);
Matthias Bussonnier1bc15642017-02-22 07:06:50 -08005214 if (pkgname == NULL) {
5215 pkgname_or_unknown = PyUnicode_FromString("<unknown module name>");
5216 if (pkgname_or_unknown == NULL) {
5217 Py_XDECREF(pkgpath);
5218 return NULL;
5219 }
5220 } else {
5221 pkgname_or_unknown = pkgname;
5222 }
Matthias Bussonnierbc4bed42017-02-14 16:05:25 -08005223
5224 if (pkgpath == NULL || !PyUnicode_Check(pkgpath)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005225 _PyErr_Clear(tstate);
Xiang Zhang4830f582017-03-21 11:13:42 +08005226 errmsg = PyUnicode_FromFormat(
5227 "cannot import name %R from %R (unknown location)",
5228 name, pkgname_or_unknown
5229 );
Stefan Krah027b09c2019-03-25 21:50:58 +01005230 /* NULL checks for errmsg and pkgname done by PyErr_SetImportError. */
Xiang Zhang4830f582017-03-21 11:13:42 +08005231 PyErr_SetImportError(errmsg, pkgname, NULL);
5232 }
5233 else {
5234 errmsg = PyUnicode_FromFormat(
5235 "cannot import name %R from %R (%S)",
5236 name, pkgname_or_unknown, pkgpath
5237 );
Stefan Krah027b09c2019-03-25 21:50:58 +01005238 /* NULL checks for errmsg and pkgname done by PyErr_SetImportError. */
Xiang Zhang4830f582017-03-21 11:13:42 +08005239 PyErr_SetImportError(errmsg, pkgname, pkgpath);
Matthias Bussonnierbc4bed42017-02-14 16:05:25 -08005240 }
5241
Xiang Zhang4830f582017-03-21 11:13:42 +08005242 Py_XDECREF(errmsg);
Matthias Bussonnier1bc15642017-02-22 07:06:50 -08005243 Py_XDECREF(pkgname_or_unknown);
5244 Py_XDECREF(pkgpath);
Brett Cannon3008bc02015-08-11 18:01:31 -07005245 return NULL;
Thomas Wouters52152252000-08-17 22:55:00 +00005246}
Guido van Rossumac7be682001-01-17 15:42:30 +00005247
Thomas Wouters52152252000-08-17 22:55:00 +00005248static int
Victor Stinner438a12d2019-05-24 17:01:38 +02005249import_all_from(PyThreadState *tstate, PyObject *locals, PyObject *v)
Thomas Wouters52152252000-08-17 22:55:00 +00005250{
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02005251 _Py_IDENTIFIER(__all__);
5252 _Py_IDENTIFIER(__dict__);
Xiang Zhangd8b291a2018-03-24 18:39:36 +08005253 _Py_IDENTIFIER(__name__);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005254 PyObject *all, *dict, *name, *value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005255 int skip_leading_underscores = 0;
5256 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00005257
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005258 if (_PyObject_LookupAttrId(v, &PyId___all__, &all) < 0) {
5259 return -1; /* Unexpected error */
5260 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005261 if (all == NULL) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005262 if (_PyObject_LookupAttrId(v, &PyId___dict__, &dict) < 0) {
5263 return -1;
5264 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005265 if (dict == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005266 _PyErr_SetString(tstate, PyExc_ImportError,
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005267 "from-import-* object has no __dict__ and no __all__");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005268 return -1;
5269 }
5270 all = PyMapping_Keys(dict);
5271 Py_DECREF(dict);
5272 if (all == NULL)
5273 return -1;
5274 skip_leading_underscores = 1;
5275 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00005276
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005277 for (pos = 0, err = 0; ; pos++) {
5278 name = PySequence_GetItem(all, pos);
5279 if (name == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005280 if (!_PyErr_ExceptionMatches(tstate, PyExc_IndexError)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005281 err = -1;
Victor Stinner438a12d2019-05-24 17:01:38 +02005282 }
5283 else {
5284 _PyErr_Clear(tstate);
5285 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005286 break;
5287 }
Xiang Zhangd8b291a2018-03-24 18:39:36 +08005288 if (!PyUnicode_Check(name)) {
5289 PyObject *modname = _PyObject_GetAttrId(v, &PyId___name__);
5290 if (modname == NULL) {
5291 Py_DECREF(name);
5292 err = -1;
5293 break;
5294 }
5295 if (!PyUnicode_Check(modname)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005296 _PyErr_Format(tstate, PyExc_TypeError,
5297 "module __name__ must be a string, not %.100s",
5298 Py_TYPE(modname)->tp_name);
Xiang Zhangd8b291a2018-03-24 18:39:36 +08005299 }
5300 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02005301 _PyErr_Format(tstate, PyExc_TypeError,
5302 "%s in %U.%s must be str, not %.100s",
5303 skip_leading_underscores ? "Key" : "Item",
5304 modname,
5305 skip_leading_underscores ? "__dict__" : "__all__",
5306 Py_TYPE(name)->tp_name);
Xiang Zhangd8b291a2018-03-24 18:39:36 +08005307 }
5308 Py_DECREF(modname);
5309 Py_DECREF(name);
5310 err = -1;
5311 break;
5312 }
5313 if (skip_leading_underscores) {
Serhiy Storchakae3b2b4b2017-09-08 09:58:51 +03005314 if (PyUnicode_READY(name) == -1) {
5315 Py_DECREF(name);
5316 err = -1;
5317 break;
5318 }
5319 if (PyUnicode_READ_CHAR(name, 0) == '_') {
5320 Py_DECREF(name);
5321 continue;
5322 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005323 }
5324 value = PyObject_GetAttr(v, name);
5325 if (value == NULL)
5326 err = -1;
5327 else if (PyDict_CheckExact(locals))
5328 err = PyDict_SetItem(locals, name, value);
5329 else
5330 err = PyObject_SetItem(locals, name, value);
5331 Py_DECREF(name);
5332 Py_XDECREF(value);
5333 if (err != 0)
5334 break;
5335 }
5336 Py_DECREF(all);
5337 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00005338}
5339
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005340static int
Victor Stinner438a12d2019-05-24 17:01:38 +02005341check_args_iterable(PyThreadState *tstate, PyObject *func, PyObject *args)
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005342{
5343 if (args->ob_type->tp_iter == NULL && !PySequence_Check(args)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005344 _PyErr_Format(tstate, PyExc_TypeError,
5345 "%.200s%.200s argument after * "
5346 "must be an iterable, not %.200s",
5347 PyEval_GetFuncName(func),
5348 PyEval_GetFuncDesc(func),
5349 args->ob_type->tp_name);
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005350 return -1;
5351 }
5352 return 0;
5353}
5354
5355static void
Victor Stinner438a12d2019-05-24 17:01:38 +02005356format_kwargs_error(PyThreadState *tstate, PyObject *func, PyObject *kwargs)
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005357{
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005358 /* _PyDict_MergeEx raises attribute
5359 * error (percolated from an attempt
5360 * to get 'keys' attribute) instead of
5361 * a type error if its second argument
5362 * is not a mapping.
5363 */
Victor Stinner438a12d2019-05-24 17:01:38 +02005364 if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) {
5365 _PyErr_Format(tstate, PyExc_TypeError,
5366 "%.200s%.200s argument after ** "
5367 "must be a mapping, not %.200s",
5368 PyEval_GetFuncName(func),
5369 PyEval_GetFuncDesc(func),
5370 kwargs->ob_type->tp_name);
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005371 }
Victor Stinner438a12d2019-05-24 17:01:38 +02005372 else if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005373 PyObject *exc, *val, *tb;
Victor Stinner438a12d2019-05-24 17:01:38 +02005374 _PyErr_Fetch(tstate, &exc, &val, &tb);
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005375 if (val && PyTuple_Check(val) && PyTuple_GET_SIZE(val) == 1) {
5376 PyObject *key = PyTuple_GET_ITEM(val, 0);
5377 if (!PyUnicode_Check(key)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005378 _PyErr_Format(tstate, PyExc_TypeError,
5379 "%.200s%.200s keywords must be strings",
5380 PyEval_GetFuncName(func),
5381 PyEval_GetFuncDesc(func));
5382 }
5383 else {
5384 _PyErr_Format(tstate, PyExc_TypeError,
5385 "%.200s%.200s got multiple "
5386 "values for keyword argument '%U'",
5387 PyEval_GetFuncName(func),
5388 PyEval_GetFuncDesc(func),
5389 key);
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005390 }
5391 Py_XDECREF(exc);
5392 Py_XDECREF(val);
5393 Py_XDECREF(tb);
5394 }
5395 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02005396 _PyErr_Restore(tstate, exc, val, tb);
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005397 }
5398 }
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005399}
5400
Guido van Rossumac7be682001-01-17 15:42:30 +00005401static void
Victor Stinner438a12d2019-05-24 17:01:38 +02005402format_exc_check_arg(PyThreadState *tstate, PyObject *exc,
5403 const char *format_str, PyObject *obj)
Paul Prescode68140d2000-08-30 20:25:01 +00005404{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005405 const char *obj_str;
Paul Prescode68140d2000-08-30 20:25:01 +00005406
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005407 if (!obj)
5408 return;
Paul Prescode68140d2000-08-30 20:25:01 +00005409
Serhiy Storchaka06515832016-11-20 09:13:07 +02005410 obj_str = PyUnicode_AsUTF8(obj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005411 if (!obj_str)
5412 return;
Paul Prescode68140d2000-08-30 20:25:01 +00005413
Victor Stinner438a12d2019-05-24 17:01:38 +02005414 _PyErr_Format(tstate, exc, format_str, obj_str);
Paul Prescode68140d2000-08-30 20:25:01 +00005415}
Guido van Rossum950361c1997-01-24 13:49:28 +00005416
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005417static void
Victor Stinner438a12d2019-05-24 17:01:38 +02005418format_exc_unbound(PyThreadState *tstate, PyCodeObject *co, int oparg)
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005419{
5420 PyObject *name;
5421 /* Don't stomp existing exception */
Victor Stinner438a12d2019-05-24 17:01:38 +02005422 if (_PyErr_Occurred(tstate))
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005423 return;
5424 if (oparg < PyTuple_GET_SIZE(co->co_cellvars)) {
5425 name = PyTuple_GET_ITEM(co->co_cellvars,
5426 oparg);
Victor Stinner438a12d2019-05-24 17:01:38 +02005427 format_exc_check_arg(tstate,
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005428 PyExc_UnboundLocalError,
5429 UNBOUNDLOCAL_ERROR_MSG,
5430 name);
5431 } else {
5432 name = PyTuple_GET_ITEM(co->co_freevars, oparg -
5433 PyTuple_GET_SIZE(co->co_cellvars));
Victor Stinner438a12d2019-05-24 17:01:38 +02005434 format_exc_check_arg(tstate, PyExc_NameError,
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005435 UNBOUNDFREE_ERROR_MSG, name);
5436 }
5437}
5438
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03005439static void
Victor Stinner438a12d2019-05-24 17:01:38 +02005440format_awaitable_error(PyThreadState *tstate, PyTypeObject *type, int prevopcode)
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03005441{
5442 if (type->tp_as_async == NULL || type->tp_as_async->am_await == NULL) {
5443 if (prevopcode == BEFORE_ASYNC_WITH) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005444 _PyErr_Format(tstate, PyExc_TypeError,
5445 "'async with' received an object from __aenter__ "
5446 "that does not implement __await__: %.100s",
5447 type->tp_name);
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03005448 }
5449 else if (prevopcode == WITH_CLEANUP_START) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005450 _PyErr_Format(tstate, PyExc_TypeError,
5451 "'async with' received an object from __aexit__ "
5452 "that does not implement __await__: %.100s",
5453 type->tp_name);
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03005454 }
5455 }
5456}
5457
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005458static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02005459unicode_concatenate(PyThreadState *tstate, PyObject *v, PyObject *w,
Serhiy Storchakaab874002016-09-11 13:48:15 +03005460 PyFrameObject *f, const _Py_CODEUNIT *next_instr)
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005461{
5462 PyObject *res;
5463 if (Py_REFCNT(v) == 2) {
5464 /* In the common case, there are 2 references to the value
5465 * stored in 'variable' when the += is performed: one on the
5466 * value stack (in 'v') and one still stored in the
5467 * 'variable'. We try to delete the variable now to reduce
5468 * the refcnt to 1.
5469 */
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03005470 int opcode, oparg;
5471 NEXTOPARG();
5472 switch (opcode) {
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005473 case STORE_FAST:
5474 {
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005475 PyObject **fastlocals = f->f_localsplus;
5476 if (GETLOCAL(oparg) == v)
5477 SETLOCAL(oparg, NULL);
5478 break;
5479 }
5480 case STORE_DEREF:
5481 {
5482 PyObject **freevars = (f->f_localsplus +
5483 f->f_code->co_nlocals);
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03005484 PyObject *c = freevars[oparg];
Raymond Hettingerc32f9db2016-11-12 04:10:35 -05005485 if (PyCell_GET(c) == v) {
5486 PyCell_SET(c, NULL);
5487 Py_DECREF(v);
5488 }
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005489 break;
5490 }
5491 case STORE_NAME:
5492 {
5493 PyObject *names = f->f_code->co_names;
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03005494 PyObject *name = GETITEM(names, oparg);
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005495 PyObject *locals = f->f_locals;
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02005496 if (locals && PyDict_CheckExact(locals)) {
5497 PyObject *w = PyDict_GetItemWithError(locals, name);
5498 if ((w == v && PyDict_DelItem(locals, name) != 0) ||
Victor Stinner438a12d2019-05-24 17:01:38 +02005499 (w == NULL && _PyErr_Occurred(tstate)))
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02005500 {
5501 Py_DECREF(v);
5502 return NULL;
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005503 }
5504 }
5505 break;
5506 }
5507 }
5508 }
5509 res = v;
5510 PyUnicode_Append(&res, w);
5511 return res;
5512}
5513
Guido van Rossum950361c1997-01-24 13:49:28 +00005514#ifdef DYNAMIC_EXECUTION_PROFILE
5515
Skip Montanarof118cb12001-10-15 20:51:38 +00005516static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005517getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00005518{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005519 int i;
5520 PyObject *l = PyList_New(256);
5521 if (l == NULL) return NULL;
5522 for (i = 0; i < 256; i++) {
5523 PyObject *x = PyLong_FromLong(a[i]);
5524 if (x == NULL) {
5525 Py_DECREF(l);
5526 return NULL;
5527 }
Zackery Spytz99d56b52018-12-08 07:16:55 -07005528 PyList_SET_ITEM(l, i, x);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005529 }
5530 for (i = 0; i < 256; i++)
5531 a[i] = 0;
5532 return l;
Guido van Rossum950361c1997-01-24 13:49:28 +00005533}
5534
5535PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005536_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00005537{
5538#ifndef DXPAIRS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005539 return getarray(dxp);
Guido van Rossum950361c1997-01-24 13:49:28 +00005540#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005541 int i;
5542 PyObject *l = PyList_New(257);
5543 if (l == NULL) return NULL;
5544 for (i = 0; i < 257; i++) {
5545 PyObject *x = getarray(dxpairs[i]);
5546 if (x == NULL) {
5547 Py_DECREF(l);
5548 return NULL;
5549 }
Zackery Spytz99d56b52018-12-08 07:16:55 -07005550 PyList_SET_ITEM(l, i, x);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005551 }
5552 return l;
Guido van Rossum950361c1997-01-24 13:49:28 +00005553#endif
5554}
5555
5556#endif
Brett Cannon5c4de282016-09-07 11:16:41 -07005557
5558Py_ssize_t
5559_PyEval_RequestCodeExtraIndex(freefunc free)
5560{
Victor Stinnercaba55b2018-08-03 15:33:52 +02005561 PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE();
Brett Cannon5c4de282016-09-07 11:16:41 -07005562 Py_ssize_t new_index;
5563
Dino Viehlandf3cffd22017-06-21 14:44:36 -07005564 if (interp->co_extra_user_count == MAX_CO_EXTRA_USERS - 1) {
Brett Cannon5c4de282016-09-07 11:16:41 -07005565 return -1;
5566 }
Dino Viehlandf3cffd22017-06-21 14:44:36 -07005567 new_index = interp->co_extra_user_count++;
5568 interp->co_extra_freefuncs[new_index] = free;
Brett Cannon5c4de282016-09-07 11:16:41 -07005569 return new_index;
5570}
Łukasz Langaa785c872016-09-09 17:37:37 -07005571
5572static void
5573dtrace_function_entry(PyFrameObject *f)
5574{
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02005575 const char *filename;
5576 const char *funcname;
Łukasz Langaa785c872016-09-09 17:37:37 -07005577 int lineno;
5578
5579 filename = PyUnicode_AsUTF8(f->f_code->co_filename);
5580 funcname = PyUnicode_AsUTF8(f->f_code->co_name);
5581 lineno = PyCode_Addr2Line(f->f_code, f->f_lasti);
5582
5583 PyDTrace_FUNCTION_ENTRY(filename, funcname, lineno);
5584}
5585
5586static void
5587dtrace_function_return(PyFrameObject *f)
5588{
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02005589 const char *filename;
5590 const char *funcname;
Łukasz Langaa785c872016-09-09 17:37:37 -07005591 int lineno;
5592
5593 filename = PyUnicode_AsUTF8(f->f_code->co_filename);
5594 funcname = PyUnicode_AsUTF8(f->f_code->co_name);
5595 lineno = PyCode_Addr2Line(f->f_code, f->f_lasti);
5596
5597 PyDTrace_FUNCTION_RETURN(filename, funcname, lineno);
5598}
5599
5600/* DTrace equivalent of maybe_call_line_trace. */
5601static void
5602maybe_dtrace_line(PyFrameObject *frame,
5603 int *instr_lb, int *instr_ub, int *instr_prev)
5604{
5605 int line = frame->f_lineno;
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02005606 const char *co_filename, *co_name;
Łukasz Langaa785c872016-09-09 17:37:37 -07005607
5608 /* If the last instruction executed isn't in the current
5609 instruction window, reset the window.
5610 */
5611 if (frame->f_lasti < *instr_lb || frame->f_lasti >= *instr_ub) {
5612 PyAddrPair bounds;
5613 line = _PyCode_CheckLineNumber(frame->f_code, frame->f_lasti,
5614 &bounds);
5615 *instr_lb = bounds.ap_lower;
5616 *instr_ub = bounds.ap_upper;
5617 }
5618 /* If the last instruction falls at the start of a line or if
5619 it represents a jump backwards, update the frame's line
5620 number and call the trace function. */
5621 if (frame->f_lasti == *instr_lb || frame->f_lasti < *instr_prev) {
5622 frame->f_lineno = line;
5623 co_filename = PyUnicode_AsUTF8(frame->f_code->co_filename);
5624 if (!co_filename)
5625 co_filename = "?";
5626 co_name = PyUnicode_AsUTF8(frame->f_code->co_name);
5627 if (!co_name)
5628 co_name = "?";
5629 PyDTrace_LINE(co_filename, co_name, line);
5630 }
5631 *instr_prev = frame->f_lasti;
5632}