blob: 3306fb9728e8cde545aac6a7c807f04403c2c2bd [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
Yury Selivanovf2392132016-12-13 19:03:51 -050041/* Private API for the LOAD_METHOD opcode. */
42extern int _PyObject_GetMethod(PyObject *, PyObject *, PyObject **);
43
Jeremy Hylton52820442001-01-03 23:52:36 +000044typedef PyObject *(*callproc)(PyObject *, PyObject *, PyObject *);
Guido van Rossum5b722181993-03-30 17:46:03 +000045
Guido van Rossum374a9221991-04-04 10:40:29 +000046/* Forward declarations */
Victor Stinner09532fe2019-05-10 23:39:09 +020047Py_LOCAL_INLINE(PyObject *) call_function(
48 PyThreadState *tstate, PyObject ***pp_stack,
49 Py_ssize_t oparg, PyObject *kwnames);
50static PyObject * do_call_core(
51 PyThreadState *tstate, PyObject *func,
52 PyObject *callargs, PyObject *kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +000053
Guido van Rossum0a066c01992-03-27 17:29:15 +000054#ifdef LLTRACE
Guido van Rossumc2e20742006-02-27 22:32:47 +000055static int lltrace;
Victor Stinner438a12d2019-05-24 17:01:38 +020056static int prtrace(PyThreadState *, PyObject *, const char *);
Guido van Rossum0a066c01992-03-27 17:29:15 +000057#endif
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +010058static int call_trace(Py_tracefunc, PyObject *,
59 PyThreadState *, PyFrameObject *,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000060 int, PyObject *);
Amaury Forgeot d'Arcf05149a2007-11-13 01:05:30 +000061static int call_trace_protected(Py_tracefunc, PyObject *,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +010062 PyThreadState *, PyFrameObject *,
63 int, PyObject *);
64static void call_exc_trace(Py_tracefunc, PyObject *,
65 PyThreadState *, PyFrameObject *);
Tim Peters8a5c3c72004-04-05 19:36:21 +000066static int maybe_call_line_trace(Py_tracefunc, PyObject *,
Eric Snow2ebc5ce2017-09-07 23:51:28 -060067 PyThreadState *, PyFrameObject *,
68 int *, int *, int *);
Łukasz Langaa785c872016-09-09 17:37:37 -070069static void maybe_dtrace_line(PyFrameObject *, int *, int *, int *);
70static void dtrace_function_entry(PyFrameObject *);
71static void dtrace_function_return(PyFrameObject *);
Michael W. Hudsondd32a912002-08-15 14:59:02 +000072
Victor Stinner438a12d2019-05-24 17:01:38 +020073static PyObject * cmp_outcome(PyThreadState *, int, PyObject *, PyObject *);
74static PyObject * import_name(PyThreadState *, PyFrameObject *,
75 PyObject *, PyObject *, PyObject *);
76static PyObject * import_from(PyThreadState *, PyObject *, PyObject *);
77static int import_all_from(PyThreadState *, PyObject *, PyObject *);
78static void format_exc_check_arg(PyThreadState *, PyObject *, const char *, PyObject *);
79static void format_exc_unbound(PyThreadState *tstate, PyCodeObject *co, int oparg);
80static PyObject * unicode_concatenate(PyThreadState *, PyObject *, PyObject *,
Serhiy Storchakaab874002016-09-11 13:48:15 +030081 PyFrameObject *, const _Py_CODEUNIT *);
Victor Stinner438a12d2019-05-24 17:01:38 +020082static PyObject * special_lookup(PyThreadState *, PyObject *, _Py_Identifier *);
83static int check_args_iterable(PyThreadState *, PyObject *func, PyObject *vararg);
84static void format_kwargs_error(PyThreadState *, PyObject *func, PyObject *kwargs);
85static void format_awaitable_error(PyThreadState *, PyTypeObject *, int);
Guido van Rossum374a9221991-04-04 10:40:29 +000086
Paul Prescode68140d2000-08-30 20:25:01 +000087#define NAME_ERROR_MSG \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000088 "name '%.200s' is not defined"
Paul Prescode68140d2000-08-30 20:25:01 +000089#define UNBOUNDLOCAL_ERROR_MSG \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000090 "local variable '%.200s' referenced before assignment"
Jeremy Hyltonc76770c2001-04-13 16:51:46 +000091#define UNBOUNDFREE_ERROR_MSG \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000092 "free variable '%.200s' referenced before assignment" \
93 " in enclosing scope"
Guido van Rossum374a9221991-04-04 10:40:29 +000094
Guido van Rossum950361c1997-01-24 13:49:28 +000095/* Dynamic execution profile */
96#ifdef DYNAMIC_EXECUTION_PROFILE
97#ifdef DXPAIRS
98static long dxpairs[257][256];
99#define dxp dxpairs[256]
100#else
101static long dxp[256];
102#endif
103#endif
104
Inada Naoki91234a12019-06-03 21:30:58 +0900105/* per opcode cache */
Inada Naokieddef862019-06-04 07:38:10 +0900106#ifdef Py_DEBUG
107// --with-pydebug is used to find memory leak. opcache makes it harder.
108// So we disable opcache when Py_DEBUG is defined.
109// See bpo-37146
110#define OPCACHE_MIN_RUNS 0 /* disable opcache */
111#else
Inada Naoki91234a12019-06-03 21:30:58 +0900112#define OPCACHE_MIN_RUNS 1024 /* create opcache when code executed this time */
Inada Naokieddef862019-06-04 07:38:10 +0900113#endif
Inada Naoki91234a12019-06-03 21:30:58 +0900114#define OPCACHE_STATS 0 /* Enable stats */
115
116#if OPCACHE_STATS
117static size_t opcache_code_objects = 0;
118static size_t opcache_code_objects_extra_mem = 0;
119
120static size_t opcache_global_opts = 0;
121static size_t opcache_global_hits = 0;
122static size_t opcache_global_misses = 0;
123#endif
124
Victor Stinnere225beb2019-06-03 18:14:24 +0200125#define GIL_REQUEST _Py_atomic_load_relaxed(&ceval->gil_drop_request)
Inada Naoki91234a12019-06-03 21:30:58 +0900126
Jeffrey Yasskin39370832010-05-03 19:29:34 +0000127/* This can set eval_breaker to 0 even though gil_drop_request became
128 1. We believe this is all right because the eval loop will release
129 the GIL eventually anyway. */
Victor Stinnere225beb2019-06-03 18:14:24 +0200130#define COMPUTE_EVAL_BREAKER(ceval) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000131 _Py_atomic_store_relaxed( \
Victor Stinnere225beb2019-06-03 18:14:24 +0200132 &(ceval)->eval_breaker, \
133 GIL_REQUEST | \
134 _Py_atomic_load_relaxed(&(ceval)->signals_pending) | \
135 _Py_atomic_load_relaxed(&(ceval)->pending.calls_to_do) | \
136 (ceval)->pending.async_exc)
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000137
Victor Stinnere225beb2019-06-03 18:14:24 +0200138#define SET_GIL_DROP_REQUEST(ceval) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000139 do { \
Victor Stinnere225beb2019-06-03 18:14:24 +0200140 _Py_atomic_store_relaxed(&(ceval)->gil_drop_request, 1); \
141 _Py_atomic_store_relaxed(&(ceval)->eval_breaker, 1); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000142 } while (0)
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000143
Victor Stinnere225beb2019-06-03 18:14:24 +0200144#define RESET_GIL_DROP_REQUEST(ceval) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000145 do { \
Victor Stinnere225beb2019-06-03 18:14:24 +0200146 _Py_atomic_store_relaxed(&(ceval)->gil_drop_request, 0); \
147 COMPUTE_EVAL_BREAKER(ceval); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000148 } while (0)
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000149
Jeffrey Yasskin39370832010-05-03 19:29:34 +0000150/* Pending calls are only modified under pending_lock */
Victor Stinnere225beb2019-06-03 18:14:24 +0200151#define SIGNAL_PENDING_CALLS(ceval) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000152 do { \
Victor Stinnere225beb2019-06-03 18:14:24 +0200153 _Py_atomic_store_relaxed(&(ceval)->pending.calls_to_do, 1); \
154 _Py_atomic_store_relaxed(&(ceval)->eval_breaker, 1); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000155 } while (0)
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000156
Victor Stinnere225beb2019-06-03 18:14:24 +0200157#define UNSIGNAL_PENDING_CALLS(ceval) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000158 do { \
Victor Stinnere225beb2019-06-03 18:14:24 +0200159 _Py_atomic_store_relaxed(&(ceval)->pending.calls_to_do, 0); \
160 COMPUTE_EVAL_BREAKER(ceval); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000161 } while (0)
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000162
Victor Stinnere225beb2019-06-03 18:14:24 +0200163#define SIGNAL_PENDING_SIGNALS(ceval) \
Eric Snowfdf282d2019-01-11 14:26:55 -0700164 do { \
Victor Stinnere225beb2019-06-03 18:14:24 +0200165 _Py_atomic_store_relaxed(&(ceval)->signals_pending, 1); \
166 _Py_atomic_store_relaxed(&(ceval)->eval_breaker, 1); \
Eric Snowfdf282d2019-01-11 14:26:55 -0700167 } while (0)
168
Victor Stinnere225beb2019-06-03 18:14:24 +0200169#define UNSIGNAL_PENDING_SIGNALS(ceval) \
Eric Snowfdf282d2019-01-11 14:26:55 -0700170 do { \
Victor Stinnere225beb2019-06-03 18:14:24 +0200171 _Py_atomic_store_relaxed(&(ceval)->signals_pending, 0); \
172 COMPUTE_EVAL_BREAKER(ceval); \
Eric Snowfdf282d2019-01-11 14:26:55 -0700173 } while (0)
174
Victor Stinnere225beb2019-06-03 18:14:24 +0200175#define SIGNAL_ASYNC_EXC(ceval) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000176 do { \
Victor Stinnere225beb2019-06-03 18:14:24 +0200177 (ceval)->pending.async_exc = 1; \
178 _Py_atomic_store_relaxed(&(ceval)->eval_breaker, 1); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000179 } while (0)
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000180
Victor Stinnere225beb2019-06-03 18:14:24 +0200181#define UNSIGNAL_ASYNC_EXC(ceval) \
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600182 do { \
Victor Stinnere225beb2019-06-03 18:14:24 +0200183 (ceval)->pending.async_exc = 0; \
184 COMPUTE_EVAL_BREAKER(ceval); \
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600185 } while (0)
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000186
187
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000188#ifdef HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000189#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +0000190#endif
Guido van Rossum49b56061998-10-01 20:42:43 +0000191#include "pythread.h"
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000192#include "ceval_gil.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000193
Tim Peters7f468f22004-10-11 02:40:51 +0000194int
195PyEval_ThreadsInitialized(void)
196{
Victor Stinner09532fe2019-05-10 23:39:09 +0200197 return gil_created(&_PyRuntime.ceval.gil);
Tim Peters7f468f22004-10-11 02:40:51 +0000198}
199
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000200void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000201PyEval_InitThreads(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000202{
Victor Stinner09532fe2019-05-10 23:39:09 +0200203 _PyRuntimeState *runtime = &_PyRuntime;
Victor Stinnere225beb2019-06-03 18:14:24 +0200204 struct _ceval_runtime_state *ceval = &runtime->ceval;
205 struct _gil_runtime_state *gil = &ceval->gil;
Victor Stinner09532fe2019-05-10 23:39:09 +0200206 if (gil_created(gil)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000207 return;
Victor Stinnera7126792019-03-19 14:19:38 +0100208 }
209
Inada Naoki001fee12019-02-20 10:00:09 +0900210 PyThread_init_thread();
Victor Stinner09532fe2019-05-10 23:39:09 +0200211 create_gil(gil);
212 PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime);
Victor Stinnere225beb2019-06-03 18:14:24 +0200213 take_gil(ceval, tstate);
Eric Snow8479a342019-03-08 23:44:33 -0700214
Victor Stinnere225beb2019-06-03 18:14:24 +0200215 struct _pending_calls *pending = &ceval->pending;
216 pending->lock = PyThread_allocate_lock();
217 if (pending->lock == NULL) {
218 Py_FatalError("Can't initialize threads for pending calls");
219 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000220}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000221
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000222void
Victor Stinnere225beb2019-06-03 18:14:24 +0200223_PyEval_FiniThreads(struct _ceval_runtime_state *ceval)
Antoine Pitrou1df15362010-09-13 14:16:46 +0000224{
Victor Stinnere225beb2019-06-03 18:14:24 +0200225 struct _gil_runtime_state *gil = &ceval->gil;
Victor Stinner09532fe2019-05-10 23:39:09 +0200226 if (!gil_created(gil)) {
Antoine Pitrou1df15362010-09-13 14:16:46 +0000227 return;
Victor Stinnera7126792019-03-19 14:19:38 +0100228 }
229
Victor Stinner09532fe2019-05-10 23:39:09 +0200230 destroy_gil(gil);
231 assert(!gil_created(gil));
Victor Stinner99fcc612019-04-29 13:04:07 +0200232
Victor Stinnere225beb2019-06-03 18:14:24 +0200233 struct _pending_calls *pending = &ceval->pending;
234 if (pending->lock != NULL) {
235 PyThread_free_lock(pending->lock);
236 pending->lock = NULL;
237 }
Antoine Pitrou1df15362010-09-13 14:16:46 +0000238}
239
Joannah Nanjekyef781d202019-04-29 04:38:45 -0400240static inline void
Victor Stinner0fd2c302019-06-04 03:15:09 +0200241exit_thread_if_finalizing(_PyRuntimeState *runtime, PyThreadState *tstate)
Joannah Nanjekyef781d202019-04-29 04:38:45 -0400242{
Victor Stinnere225beb2019-06-03 18:14:24 +0200243 /* _Py_Finalizing is protected by the GIL */
Victor Stinner09532fe2019-05-10 23:39:09 +0200244 if (runtime->finalizing != NULL && !_Py_CURRENTLY_FINALIZING(runtime, tstate)) {
Victor Stinnere225beb2019-06-03 18:14:24 +0200245 drop_gil(&runtime->ceval, tstate);
Joannah Nanjekyef781d202019-04-29 04:38:45 -0400246 PyThread_exit_thread();
Joannah Nanjekyef781d202019-04-29 04:38:45 -0400247 }
248}
249
Antoine Pitrou1df15362010-09-13 14:16:46 +0000250void
Inada Naoki91234a12019-06-03 21:30:58 +0900251_PyEval_Fini(void)
252{
253#if OPCACHE_STATS
254 fprintf(stderr, "-- Opcode cache number of objects = %zd\n",
255 opcache_code_objects);
256
257 fprintf(stderr, "-- Opcode cache total extra mem = %zd\n",
258 opcache_code_objects_extra_mem);
259
260 fprintf(stderr, "\n");
261
262 fprintf(stderr, "-- Opcode cache LOAD_GLOBAL hits = %zd (%d%%)\n",
263 opcache_global_hits,
264 (int) (100.0 * opcache_global_hits /
265 (opcache_global_hits + opcache_global_misses)));
266
267 fprintf(stderr, "-- Opcode cache LOAD_GLOBAL misses = %zd (%d%%)\n",
268 opcache_global_misses,
269 (int) (100.0 * opcache_global_misses /
270 (opcache_global_hits + opcache_global_misses)));
271
272 fprintf(stderr, "-- Opcode cache LOAD_GLOBAL opts = %zd\n",
273 opcache_global_opts);
274
275 fprintf(stderr, "\n");
276#endif
277}
278
279void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000280PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000281{
Victor Stinner09532fe2019-05-10 23:39:09 +0200282 _PyRuntimeState *runtime = &_PyRuntime;
Victor Stinnere225beb2019-06-03 18:14:24 +0200283 struct _ceval_runtime_state *ceval = &runtime->ceval;
Victor Stinner09532fe2019-05-10 23:39:09 +0200284 PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime);
285 if (tstate == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000286 Py_FatalError("PyEval_AcquireLock: current thread state is NULL");
Victor Stinner09532fe2019-05-10 23:39:09 +0200287 }
Victor Stinnere225beb2019-06-03 18:14:24 +0200288 take_gil(ceval, tstate);
Victor Stinner0fd2c302019-06-04 03:15:09 +0200289 exit_thread_if_finalizing(runtime, tstate);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000290}
291
292void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000293PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000294{
Victor Stinner09532fe2019-05-10 23:39:09 +0200295 _PyRuntimeState *runtime = &_PyRuntime;
Victor Stinnere225beb2019-06-03 18:14:24 +0200296 PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000297 /* This function must succeed when the current thread state is NULL.
Victor Stinner50b48572018-11-01 01:51:40 +0100298 We therefore avoid PyThreadState_Get() which dumps a fatal error
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000299 in debug mode.
300 */
Victor Stinnere225beb2019-06-03 18:14:24 +0200301 drop_gil(&runtime->ceval, tstate);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000302}
303
304void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000305PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000306{
Victor Stinner09532fe2019-05-10 23:39:09 +0200307 if (tstate == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000308 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
Victor Stinner09532fe2019-05-10 23:39:09 +0200309 }
Victor Stinnere225beb2019-06-03 18:14:24 +0200310
Victor Stinner0fd2c302019-06-04 03:15:09 +0200311 _PyRuntimeState *runtime = &_PyRuntime;
Victor Stinnere225beb2019-06-03 18:14:24 +0200312 struct _ceval_runtime_state *ceval = &runtime->ceval;
Victor Stinner09532fe2019-05-10 23:39:09 +0200313
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000314 /* Check someone has called PyEval_InitThreads() to create the lock */
Victor Stinnere225beb2019-06-03 18:14:24 +0200315 assert(gil_created(&ceval->gil));
316 take_gil(ceval, tstate);
Victor Stinner0fd2c302019-06-04 03:15:09 +0200317 exit_thread_if_finalizing(runtime, tstate);
Victor Stinner09532fe2019-05-10 23:39:09 +0200318 if (_PyThreadState_Swap(&runtime->gilstate, tstate) != NULL) {
319 Py_FatalError("PyEval_AcquireThread: non-NULL old thread state");
320 }
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000321}
322
323void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000324PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000325{
Victor Stinner09532fe2019-05-10 23:39:09 +0200326 if (tstate == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000327 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
Victor Stinner09532fe2019-05-10 23:39:09 +0200328 }
329
Victor Stinner0fd2c302019-06-04 03:15:09 +0200330 _PyRuntimeState *runtime = &_PyRuntime;
Victor Stinner09532fe2019-05-10 23:39:09 +0200331 PyThreadState *new_tstate = _PyThreadState_Swap(&runtime->gilstate, NULL);
332 if (new_tstate != tstate) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000333 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
Victor Stinner09532fe2019-05-10 23:39:09 +0200334 }
Victor Stinnere225beb2019-06-03 18:14:24 +0200335 drop_gil(&runtime->ceval, tstate);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000336}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000337
Antoine Pitrouf7ecfac2017-05-28 11:35:14 +0200338/* This function is called from PyOS_AfterFork_Child to destroy all threads
339 * which are not running in the child process, and clear internal locks
340 * which might be held by those threads.
341 */
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000342
343void
Victor Stinnerd5d9e812019-05-13 12:35:37 +0200344_PyEval_ReInitThreads(_PyRuntimeState *runtime)
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000345{
Victor Stinnere225beb2019-06-03 18:14:24 +0200346 struct _ceval_runtime_state *ceval = &runtime->ceval;
347 if (!gil_created(&ceval->gil)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000348 return;
Victor Stinner09532fe2019-05-10 23:39:09 +0200349 }
Victor Stinnere225beb2019-06-03 18:14:24 +0200350 recreate_gil(&ceval->gil);
Victor Stinner09532fe2019-05-10 23:39:09 +0200351 PyThreadState *current_tstate = _PyRuntimeState_GetThreadState(runtime);
Victor Stinnere225beb2019-06-03 18:14:24 +0200352 take_gil(ceval, current_tstate);
Eric Snow8479a342019-03-08 23:44:33 -0700353
Victor Stinnere225beb2019-06-03 18:14:24 +0200354 struct _pending_calls *pending = &ceval->pending;
Victor Stinner09532fe2019-05-10 23:39:09 +0200355 pending->lock = PyThread_allocate_lock();
356 if (pending->lock == NULL) {
Eric Snow8479a342019-03-08 23:44:33 -0700357 Py_FatalError("Can't initialize threads for pending calls");
358 }
Jesse Nollera8513972008-07-17 16:49:17 +0000359
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200360 /* Destroy all threads except the current one */
Victor Stinner0fd2c302019-06-04 03:15:09 +0200361 _PyThreadState_DeleteExcept(runtime, current_tstate);
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000362}
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000363
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000364/* This function is used to signal that async exceptions are waiting to be
Zackery Spytzeef05962018-09-29 10:07:11 -0600365 raised. */
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000366
367void
Victor Stinnere225beb2019-06-03 18:14:24 +0200368_PyEval_SignalAsyncExc(struct _ceval_runtime_state *ceval)
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000369{
Victor Stinnere225beb2019-06-03 18:14:24 +0200370 SIGNAL_ASYNC_EXC(ceval);
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000371}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000372
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000373PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000374PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000375{
Victor Stinner09532fe2019-05-10 23:39:09 +0200376 _PyRuntimeState *runtime = &_PyRuntime;
Victor Stinnere225beb2019-06-03 18:14:24 +0200377 struct _ceval_runtime_state *ceval = &runtime->ceval;
Victor Stinner09532fe2019-05-10 23:39:09 +0200378 PyThreadState *tstate = _PyThreadState_Swap(&runtime->gilstate, NULL);
379 if (tstate == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000380 Py_FatalError("PyEval_SaveThread: NULL tstate");
Victor Stinner09532fe2019-05-10 23:39:09 +0200381 }
Victor Stinnere225beb2019-06-03 18:14:24 +0200382 assert(gil_created(&ceval->gil));
383 drop_gil(ceval, tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000384 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000385}
386
387void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000388PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000389{
Victor Stinner0fd2c302019-06-04 03:15:09 +0200390 _PyRuntimeState *runtime = &_PyRuntime;
391 struct _ceval_runtime_state *ceval = &runtime->ceval;
392
Victor Stinner09532fe2019-05-10 23:39:09 +0200393 if (tstate == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000394 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Victor Stinner09532fe2019-05-10 23:39:09 +0200395 }
Victor Stinnere225beb2019-06-03 18:14:24 +0200396 assert(gil_created(&ceval->gil));
Victor Stinner2914bb32018-01-29 11:57:45 +0100397
398 int err = errno;
Victor Stinnere225beb2019-06-03 18:14:24 +0200399 take_gil(ceval, tstate);
Victor Stinner0fd2c302019-06-04 03:15:09 +0200400 exit_thread_if_finalizing(runtime, tstate);
Victor Stinner2914bb32018-01-29 11:57:45 +0100401 errno = err;
402
Victor Stinner09532fe2019-05-10 23:39:09 +0200403 _PyThreadState_Swap(&runtime->gilstate, tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000404}
405
406
Guido van Rossuma9672091994-09-14 13:31:22 +0000407/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
408 signal handlers or Mac I/O completion routines) can schedule calls
409 to a function to be called synchronously.
410 The synchronous function is called with one void* argument.
411 It should return 0 for success or -1 for failure -- failure should
412 be accompanied by an exception.
413
414 If registry succeeds, the registry function returns 0; if it fails
415 (e.g. due to too many pending calls) it returns -1 (without setting
416 an exception condition).
417
418 Note that because registry may occur from within signal handlers,
419 or other asynchronous events, calling malloc() is unsafe!
420
Guido van Rossuma9672091994-09-14 13:31:22 +0000421 Any thread can schedule pending calls, but only the main thread
422 will execute them.
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000423 There is no facility to schedule calls to a particular thread, but
424 that should be easy to change, should that ever be required. In
425 that case, the static variables here should go into the python
426 threadstate.
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000427*/
Guido van Rossuma9672091994-09-14 13:31:22 +0000428
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200429void
Victor Stinnere225beb2019-06-03 18:14:24 +0200430_PyEval_SignalReceived(struct _ceval_runtime_state *ceval)
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200431{
432 /* bpo-30703: Function called when the C signal handler of Python gets a
433 signal. We cannot queue a callback using Py_AddPendingCall() since
434 that function is not async-signal-safe. */
Victor Stinnere225beb2019-06-03 18:14:24 +0200435 SIGNAL_PENDING_SIGNALS(ceval);
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200436}
437
Eric Snow5be45a62019-03-08 22:47:07 -0700438/* Push one item onto the queue while holding the lock. */
439static int
Victor Stinnere225beb2019-06-03 18:14:24 +0200440_push_pending_call(struct _pending_calls *pending,
Eric Snow842a2f02019-03-15 15:47:51 -0600441 int (*func)(void *), void *arg)
Eric Snow5be45a62019-03-08 22:47:07 -0700442{
Eric Snow842a2f02019-03-15 15:47:51 -0600443 int i = pending->last;
Eric Snow5be45a62019-03-08 22:47:07 -0700444 int j = (i + 1) % NPENDINGCALLS;
Eric Snow842a2f02019-03-15 15:47:51 -0600445 if (j == pending->first) {
Eric Snow5be45a62019-03-08 22:47:07 -0700446 return -1; /* Queue full */
447 }
Eric Snow842a2f02019-03-15 15:47:51 -0600448 pending->calls[i].func = func;
449 pending->calls[i].arg = arg;
450 pending->last = j;
Eric Snow5be45a62019-03-08 22:47:07 -0700451 return 0;
452}
453
454/* Pop one item off the queue while holding the lock. */
455static void
Victor Stinnere225beb2019-06-03 18:14:24 +0200456_pop_pending_call(struct _pending_calls *pending,
Eric Snow842a2f02019-03-15 15:47:51 -0600457 int (**func)(void *), void **arg)
Eric Snow5be45a62019-03-08 22:47:07 -0700458{
Eric Snow842a2f02019-03-15 15:47:51 -0600459 int i = pending->first;
460 if (i == pending->last) {
Eric Snow5be45a62019-03-08 22:47:07 -0700461 return; /* Queue empty */
462 }
463
Eric Snow842a2f02019-03-15 15:47:51 -0600464 *func = pending->calls[i].func;
465 *arg = pending->calls[i].arg;
466 pending->first = (i + 1) % NPENDINGCALLS;
Eric Snow5be45a62019-03-08 22:47:07 -0700467}
468
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200469/* This implementation is thread-safe. It allows
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000470 scheduling to be made from any thread, and even from an executing
471 callback.
472 */
473
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000474int
Victor Stinner438a12d2019-05-24 17:01:38 +0200475_PyEval_AddPendingCall(PyThreadState *tstate,
Victor Stinnere225beb2019-06-03 18:14:24 +0200476 struct _ceval_runtime_state *ceval,
Victor Stinner09532fe2019-05-10 23:39:09 +0200477 int (*func)(void *), void *arg)
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000478{
Victor Stinnere225beb2019-06-03 18:14:24 +0200479 struct _pending_calls *pending = &ceval->pending;
Eric Snow842a2f02019-03-15 15:47:51 -0600480
481 PyThread_acquire_lock(pending->lock, WAIT_LOCK);
482 if (pending->finishing) {
483 PyThread_release_lock(pending->lock);
484
485 PyObject *exc, *val, *tb;
Victor Stinner438a12d2019-05-24 17:01:38 +0200486 _PyErr_Fetch(tstate, &exc, &val, &tb);
487 _PyErr_SetString(tstate, PyExc_SystemError,
Eric Snow842a2f02019-03-15 15:47:51 -0600488 "Py_AddPendingCall: cannot add pending calls "
489 "(Python shutting down)");
Victor Stinner438a12d2019-05-24 17:01:38 +0200490 _PyErr_Print(tstate);
491 _PyErr_Restore(tstate, exc, val, tb);
Eric Snow842a2f02019-03-15 15:47:51 -0600492 return -1;
493 }
Victor Stinnere225beb2019-06-03 18:14:24 +0200494 int result = _push_pending_call(pending, func, arg);
Eric Snow842a2f02019-03-15 15:47:51 -0600495 PyThread_release_lock(pending->lock);
Eric Snow5be45a62019-03-08 22:47:07 -0700496
Victor Stinnere225beb2019-06-03 18:14:24 +0200497 /* signal main loop */
498 SIGNAL_PENDING_CALLS(ceval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000499 return result;
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000500}
501
Victor Stinner09532fe2019-05-10 23:39:09 +0200502int
503Py_AddPendingCall(int (*func)(void *), void *arg)
504{
Victor Stinner438a12d2019-05-24 17:01:38 +0200505 _PyRuntimeState *runtime = &_PyRuntime;
506 PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime);
Victor Stinnere225beb2019-06-03 18:14:24 +0200507 return _PyEval_AddPendingCall(tstate, &runtime->ceval, func, arg);
Victor Stinner09532fe2019-05-10 23:39:09 +0200508}
509
Eric Snowfdf282d2019-01-11 14:26:55 -0700510static int
Victor Stinner09532fe2019-05-10 23:39:09 +0200511handle_signals(_PyRuntimeState *runtime)
Eric Snowfdf282d2019-01-11 14:26:55 -0700512{
Eric Snow5be45a62019-03-08 22:47:07 -0700513 /* Only handle signals on main thread. PyEval_InitThreads must
514 * have been called already.
515 */
Victor Stinner09532fe2019-05-10 23:39:09 +0200516 if (PyThread_get_thread_ident() != runtime->main_thread) {
Eric Snowfdf282d2019-01-11 14:26:55 -0700517 return 0;
518 }
Eric Snow64d6cc82019-02-23 15:40:43 -0700519 /*
520 * Ensure that the thread isn't currently running some other
521 * interpreter.
522 */
Victor Stinner09532fe2019-05-10 23:39:09 +0200523 PyInterpreterState *interp = _PyRuntimeState_GetThreadState(runtime)->interp;
524 if (interp != runtime->interpreters.main) {
Eric Snow64d6cc82019-02-23 15:40:43 -0700525 return 0;
526 }
Eric Snowfdf282d2019-01-11 14:26:55 -0700527
Victor Stinnere225beb2019-06-03 18:14:24 +0200528 struct _ceval_runtime_state *ceval = &runtime->ceval;
529 UNSIGNAL_PENDING_SIGNALS(ceval);
Eric Snow64d6cc82019-02-23 15:40:43 -0700530 if (_PyErr_CheckSignals() < 0) {
Victor Stinnere225beb2019-06-03 18:14:24 +0200531 SIGNAL_PENDING_SIGNALS(ceval); /* We're not done yet */
Eric Snowfdf282d2019-01-11 14:26:55 -0700532 return -1;
533 }
534 return 0;
535}
536
537static int
Victor Stinnere225beb2019-06-03 18:14:24 +0200538make_pending_calls(_PyRuntimeState *runtime)
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000539{
Eric Snow6a150bc2019-06-01 15:39:46 -0600540 static int busy = 0;
Eric Snowb75b1a352019-04-12 10:20:10 -0600541
Victor Stinnere225beb2019-06-03 18:14:24 +0200542 /* only service pending calls on main thread */
543 if (PyThread_get_thread_ident() != runtime->main_thread) {
544 return 0;
545 }
546
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000547 /* don't perform recursive pending calls */
Eric Snowfdf282d2019-01-11 14:26:55 -0700548 if (busy) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000549 return 0;
Eric Snowfdf282d2019-01-11 14:26:55 -0700550 }
Charles-François Natalif23339a2011-07-23 18:15:43 +0200551 busy = 1;
Victor Stinnere225beb2019-06-03 18:14:24 +0200552 struct _ceval_runtime_state *ceval = &runtime->ceval;
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200553 /* unsignal before starting to call callbacks, so that any callback
554 added in-between re-signals */
Victor Stinnere225beb2019-06-03 18:14:24 +0200555 UNSIGNAL_PENDING_CALLS(ceval);
Eric Snowfdf282d2019-01-11 14:26:55 -0700556 int res = 0;
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200557
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000558 /* perform a bounded number of calls, in case of recursion */
Victor Stinnere225beb2019-06-03 18:14:24 +0200559 struct _pending_calls *pending = &ceval->pending;
Eric Snowfdf282d2019-01-11 14:26:55 -0700560 for (int i=0; i<NPENDINGCALLS; i++) {
Eric Snow5be45a62019-03-08 22:47:07 -0700561 int (*func)(void *) = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000562 void *arg = NULL;
563
564 /* pop one item off the queue while holding the lock */
Eric Snow842a2f02019-03-15 15:47:51 -0600565 PyThread_acquire_lock(pending->lock, WAIT_LOCK);
Victor Stinnere225beb2019-06-03 18:14:24 +0200566 _pop_pending_call(pending, &func, &arg);
Eric Snow842a2f02019-03-15 15:47:51 -0600567 PyThread_release_lock(pending->lock);
Eric Snow5be45a62019-03-08 22:47:07 -0700568
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100569 /* having released the lock, perform the callback */
Eric Snow5be45a62019-03-08 22:47:07 -0700570 if (func == NULL) {
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100571 break;
Eric Snow5be45a62019-03-08 22:47:07 -0700572 }
Eric Snowfdf282d2019-01-11 14:26:55 -0700573 res = func(arg);
574 if (res) {
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200575 goto error;
576 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000577 }
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200578
Charles-François Natalif23339a2011-07-23 18:15:43 +0200579 busy = 0;
Eric Snowfdf282d2019-01-11 14:26:55 -0700580 return res;
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200581
582error:
583 busy = 0;
Victor Stinnere225beb2019-06-03 18:14:24 +0200584 SIGNAL_PENDING_CALLS(ceval);
Eric Snowfdf282d2019-01-11 14:26:55 -0700585 return res;
586}
587
Eric Snow842a2f02019-03-15 15:47:51 -0600588void
Victor Stinnere225beb2019-06-03 18:14:24 +0200589_Py_FinishPendingCalls(_PyRuntimeState *runtime)
Eric Snow842a2f02019-03-15 15:47:51 -0600590{
Eric Snow842a2f02019-03-15 15:47:51 -0600591 assert(PyGILState_Check());
592
Victor Stinnere225beb2019-06-03 18:14:24 +0200593 PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime);
594 struct _pending_calls *pending = &runtime->ceval.pending;
Victor Stinner09532fe2019-05-10 23:39:09 +0200595
Eric Snow842a2f02019-03-15 15:47:51 -0600596 PyThread_acquire_lock(pending->lock, WAIT_LOCK);
597 pending->finishing = 1;
598 PyThread_release_lock(pending->lock);
599
600 if (!_Py_atomic_load_relaxed(&(pending->calls_to_do))) {
601 return;
602 }
603
Victor Stinnere225beb2019-06-03 18:14:24 +0200604 if (make_pending_calls(runtime) < 0) {
605 PyObject *exc, *val, *tb;
606 _PyErr_Fetch(tstate, &exc, &val, &tb);
607 PyErr_BadInternalCall();
608 _PyErr_ChainExceptions(exc, val, tb);
609 _PyErr_Print(tstate);
Eric Snow842a2f02019-03-15 15:47:51 -0600610 }
611}
612
Eric Snowfdf282d2019-01-11 14:26:55 -0700613/* Py_MakePendingCalls() is a simple wrapper for the sake
614 of backward-compatibility. */
615int
616Py_MakePendingCalls(void)
617{
618 assert(PyGILState_Check());
619
620 /* Python signal handler doesn't really queue a callback: it only signals
621 that a signal was received, see _PyEval_SignalReceived(). */
Victor Stinner09532fe2019-05-10 23:39:09 +0200622 _PyRuntimeState *runtime = &_PyRuntime;
623 int res = handle_signals(runtime);
Eric Snowfdf282d2019-01-11 14:26:55 -0700624 if (res != 0) {
625 return res;
626 }
627
Victor Stinnere225beb2019-06-03 18:14:24 +0200628 res = make_pending_calls(runtime);
Eric Snowb75b1a352019-04-12 10:20:10 -0600629 if (res != 0) {
630 return res;
631 }
632
633 return 0;
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000634}
635
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000636/* The interpreter's recursion limit */
637
Hye-Shik Changb6fa2812005-04-04 15:49:02 +0000638#ifndef Py_DEFAULT_RECURSION_LIMIT
639#define Py_DEFAULT_RECURSION_LIMIT 1000
640#endif
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600641
Eric Snow05351c12017-09-05 21:43:08 -0700642int _Py_CheckRecursionLimit = Py_DEFAULT_RECURSION_LIMIT;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000643
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600644void
Victor Stinnere225beb2019-06-03 18:14:24 +0200645_PyEval_Initialize(struct _ceval_runtime_state *state)
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600646{
Victor Stinnere225beb2019-06-03 18:14:24 +0200647 state->recursion_limit = Py_DEFAULT_RECURSION_LIMIT;
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600648 _Py_CheckRecursionLimit = Py_DEFAULT_RECURSION_LIMIT;
Victor Stinnere225beb2019-06-03 18:14:24 +0200649 _gil_initialize(&state->gil);
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600650}
651
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000652int
653Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000654{
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600655 return _PyRuntime.ceval.recursion_limit;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000656}
657
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000658void
659Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000660{
Victor Stinnere225beb2019-06-03 18:14:24 +0200661 struct _ceval_runtime_state *ceval = &_PyRuntime.ceval;
662 ceval->recursion_limit = new_limit;
663 _Py_CheckRecursionLimit = ceval->recursion_limit;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000664}
665
Armin Rigo2b3eb402003-10-28 12:05:48 +0000666/* the macro Py_EnterRecursiveCall() only calls _Py_CheckRecursiveCall()
667 if the recursion_depth reaches _Py_CheckRecursionLimit.
668 If USE_STACKCHECK, the macro decrements _Py_CheckRecursionLimit
669 to guarantee that _Py_CheckRecursiveCall() is regularly called.
670 Without USE_STACKCHECK, there is no need for this. */
671int
Serhiy Storchaka5fa22fc2015-06-21 16:26:28 +0300672_Py_CheckRecursiveCall(const char *where)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000673{
Victor Stinner09532fe2019-05-10 23:39:09 +0200674 _PyRuntimeState *runtime = &_PyRuntime;
675 PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime);
676 int recursion_limit = runtime->ceval.recursion_limit;
Armin Rigo2b3eb402003-10-28 12:05:48 +0000677
678#ifdef USE_STACKCHECK
pdox18967932017-10-25 23:03:01 -0700679 tstate->stackcheck_counter = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000680 if (PyOS_CheckStack()) {
681 --tstate->recursion_depth;
Victor Stinner438a12d2019-05-24 17:01:38 +0200682 _PyErr_SetString(tstate, PyExc_MemoryError, "Stack overflow");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000683 return -1;
684 }
pdox18967932017-10-25 23:03:01 -0700685 /* Needed for ABI backwards-compatibility (see bpo-31857) */
Eric Snow05351c12017-09-05 21:43:08 -0700686 _Py_CheckRecursionLimit = recursion_limit;
pdox18967932017-10-25 23:03:01 -0700687#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000688 if (tstate->recursion_critical)
689 /* Somebody asked that we don't check for recursion. */
690 return 0;
691 if (tstate->overflowed) {
692 if (tstate->recursion_depth > recursion_limit + 50) {
693 /* Overflowing while handling an overflow. Give up. */
694 Py_FatalError("Cannot recover from stack overflow.");
695 }
696 return 0;
697 }
698 if (tstate->recursion_depth > recursion_limit) {
699 --tstate->recursion_depth;
700 tstate->overflowed = 1;
Victor Stinner438a12d2019-05-24 17:01:38 +0200701 _PyErr_Format(tstate, PyExc_RecursionError,
702 "maximum recursion depth exceeded%s",
703 where);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000704 return -1;
705 }
706 return 0;
Armin Rigo2b3eb402003-10-28 12:05:48 +0000707}
708
Victor Stinner09532fe2019-05-10 23:39:09 +0200709static int do_raise(PyThreadState *tstate, PyObject *exc, PyObject *cause);
Victor Stinner438a12d2019-05-24 17:01:38 +0200710static int unpack_iterable(PyThreadState *, PyObject *, int, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000711
Victor Stinnere225beb2019-06-03 18:14:24 +0200712#define _Py_TracingPossible(ceval) ((ceval)->tracing_possible)
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000713
Guido van Rossum374a9221991-04-04 10:40:29 +0000714
Guido van Rossumb209a111997-04-29 18:18:01 +0000715PyObject *
Martin v. Löwis4d0d4712010-12-03 20:14:31 +0000716PyEval_EvalCode(PyObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000717{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000718 return PyEval_EvalCodeEx(co,
719 globals, locals,
720 (PyObject **)NULL, 0,
721 (PyObject **)NULL, 0,
722 (PyObject **)NULL, 0,
723 NULL, NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000724}
725
726
727/* Interpreter main loop */
728
Martin v. Löwis8d97e332004-06-27 15:43:12 +0000729PyObject *
Phillip J. Eby0d6615f2005-08-02 00:46:46 +0000730PyEval_EvalFrame(PyFrameObject *f) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000731 /* This is for backward compatibility with extension modules that
732 used this API; core interpreter code should call
733 PyEval_EvalFrameEx() */
734 return PyEval_EvalFrameEx(f, 0);
Phillip J. Eby0d6615f2005-08-02 00:46:46 +0000735}
736
737PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000738PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
Guido van Rossum374a9221991-04-04 10:40:29 +0000739{
Victor Stinnercaba55b2018-08-03 15:33:52 +0200740 PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE();
741 return interp->eval_frame(f, throwflag);
Brett Cannon3cebf932016-09-05 15:33:46 -0700742}
743
Victor Stinnerc6944e72016-11-11 02:13:35 +0100744PyObject* _Py_HOT_FUNCTION
Brett Cannon3cebf932016-09-05 15:33:46 -0700745_PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag)
746{
Guido van Rossum950361c1997-01-24 13:49:28 +0000747#ifdef DXPAIRS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000748 int lastopcode = 0;
Guido van Rossum950361c1997-01-24 13:49:28 +0000749#endif
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200750 PyObject **stack_pointer; /* Next free slot in value stack */
Serhiy Storchakaab874002016-09-11 13:48:15 +0300751 const _Py_CODEUNIT *next_instr;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200752 int opcode; /* Current opcode */
753 int oparg; /* Current opcode argument, if any */
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200754 PyObject **fastlocals, **freevars;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000755 PyObject *retval = NULL; /* Return value */
Victor Stinner09532fe2019-05-10 23:39:09 +0200756 _PyRuntimeState * const runtime = &_PyRuntime;
757 PyThreadState * const tstate = _PyRuntimeState_GetThreadState(runtime);
Victor Stinnere225beb2019-06-03 18:14:24 +0200758 struct _ceval_runtime_state * const ceval = &runtime->ceval;
759 _Py_atomic_int * const eval_breaker = &ceval->eval_breaker;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000760 PyCodeObject *co;
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000761
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000762 /* when tracing we set things up so that
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000763
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000764 not (instr_lb <= current_bytecode_offset < instr_ub)
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000765
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000766 is true when the line being executed has changed. The
767 initial values are such as to make this false the first
768 time it is tested. */
769 int instr_ub = -1, instr_lb = 0, instr_prev = -1;
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000770
Serhiy Storchakaab874002016-09-11 13:48:15 +0300771 const _Py_CODEUNIT *first_instr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000772 PyObject *names;
773 PyObject *consts;
Inada Naoki91234a12019-06-03 21:30:58 +0900774 _PyOpcache *co_opcache;
Guido van Rossum374a9221991-04-04 10:40:29 +0000775
Brett Cannon368b4b72012-04-02 12:17:59 -0400776#ifdef LLTRACE
Victor Stinner3c1e4812012-03-26 22:10:51 +0200777 _Py_IDENTIFIER(__ltrace__);
Brett Cannon368b4b72012-04-02 12:17:59 -0400778#endif
Victor Stinner3c1e4812012-03-26 22:10:51 +0200779
Antoine Pitroub52ec782009-01-25 16:34:23 +0000780/* Computed GOTOs, or
781 the-optimization-commonly-but-improperly-known-as-"threaded code"
782 using gcc's labels-as-values extension
783 (http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html).
784
785 The traditional bytecode evaluation loop uses a "switch" statement, which
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000786 decent compilers will optimize as a single indirect branch instruction
Antoine Pitroub52ec782009-01-25 16:34:23 +0000787 combined with a lookup table of jump addresses. However, since the
788 indirect jump instruction is shared by all opcodes, the CPU will have a
789 hard time making the right prediction for where to jump next (actually,
790 it will be always wrong except in the uncommon case of a sequence of
791 several identical opcodes).
792
793 "Threaded code" in contrast, uses an explicit jump table and an explicit
794 indirect jump instruction at the end of each opcode. Since the jump
795 instruction is at a different address for each opcode, the CPU will make a
796 separate prediction for each of these instructions, which is equivalent to
797 predicting the second opcode of each opcode pair. These predictions have
798 a much better chance to turn out valid, especially in small bytecode loops.
799
800 A mispredicted branch on a modern CPU flushes the whole pipeline and
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000801 can cost several CPU cycles (depending on the pipeline depth),
Antoine Pitroub52ec782009-01-25 16:34:23 +0000802 and potentially many more instructions (depending on the pipeline width).
803 A correctly predicted branch, however, is nearly free.
804
805 At the time of this writing, the "threaded code" version is up to 15-20%
806 faster than the normal "switch" version, depending on the compiler and the
807 CPU architecture.
808
809 We disable the optimization if DYNAMIC_EXECUTION_PROFILE is defined,
810 because it would render the measurements invalid.
811
812
813 NOTE: care must be taken that the compiler doesn't try to "optimize" the
814 indirect jumps by sharing them between all opcodes. Such optimizations
815 can be disabled on gcc by using the -fno-gcse flag (or possibly
816 -fno-crossjumping).
817*/
818
Antoine Pitrou042b1282010-08-13 21:15:58 +0000819#ifdef DYNAMIC_EXECUTION_PROFILE
Antoine Pitroub52ec782009-01-25 16:34:23 +0000820#undef USE_COMPUTED_GOTOS
Antoine Pitrou042b1282010-08-13 21:15:58 +0000821#define USE_COMPUTED_GOTOS 0
Antoine Pitroub52ec782009-01-25 16:34:23 +0000822#endif
823
Antoine Pitrou042b1282010-08-13 21:15:58 +0000824#ifdef HAVE_COMPUTED_GOTOS
825 #ifndef USE_COMPUTED_GOTOS
826 #define USE_COMPUTED_GOTOS 1
827 #endif
828#else
829 #if defined(USE_COMPUTED_GOTOS) && USE_COMPUTED_GOTOS
830 #error "Computed gotos are not supported on this compiler."
831 #endif
832 #undef USE_COMPUTED_GOTOS
833 #define USE_COMPUTED_GOTOS 0
834#endif
835
836#if USE_COMPUTED_GOTOS
Antoine Pitroub52ec782009-01-25 16:34:23 +0000837/* Import the static jump table */
838#include "opcode_targets.h"
839
Antoine Pitroub52ec782009-01-25 16:34:23 +0000840#define TARGET(op) \
Benjamin Petersonddd19492018-09-16 22:38:02 -0700841 op: \
842 TARGET_##op
Antoine Pitroub52ec782009-01-25 16:34:23 +0000843
Antoine Pitroub52ec782009-01-25 16:34:23 +0000844#ifdef LLTRACE
845#define FAST_DISPATCH() \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000846 { \
Victor Stinnere225beb2019-06-03 18:14:24 +0200847 if (!lltrace && !_Py_TracingPossible(ceval) && !PyDTrace_LINE_ENABLED()) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000848 f->f_lasti = INSTR_OFFSET(); \
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +0300849 NEXTOPARG(); \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +0300850 goto *opcode_targets[opcode]; \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000851 } \
852 goto fast_next_opcode; \
853 }
Antoine Pitroub52ec782009-01-25 16:34:23 +0000854#else
855#define FAST_DISPATCH() \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000856 { \
Victor Stinnere225beb2019-06-03 18:14:24 +0200857 if (!_Py_TracingPossible(ceval) && !PyDTrace_LINE_ENABLED()) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000858 f->f_lasti = INSTR_OFFSET(); \
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +0300859 NEXTOPARG(); \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +0300860 goto *opcode_targets[opcode]; \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000861 } \
862 goto fast_next_opcode; \
863 }
Antoine Pitroub52ec782009-01-25 16:34:23 +0000864#endif
865
Victor Stinner09532fe2019-05-10 23:39:09 +0200866#define DISPATCH() \
867 { \
868 if (!_Py_atomic_load_relaxed(eval_breaker)) { \
869 FAST_DISPATCH(); \
870 } \
871 continue; \
872 }
873
Antoine Pitroub52ec782009-01-25 16:34:23 +0000874#else
Benjamin Petersonddd19492018-09-16 22:38:02 -0700875#define TARGET(op) op
Antoine Pitroub52ec782009-01-25 16:34:23 +0000876#define FAST_DISPATCH() goto fast_next_opcode
Victor Stinner09532fe2019-05-10 23:39:09 +0200877#define DISPATCH() continue
Antoine Pitroub52ec782009-01-25 16:34:23 +0000878#endif
879
880
Neal Norwitza81d2202002-07-14 00:27:26 +0000881/* Tuple access macros */
882
883#ifndef Py_DEBUG
884#define GETITEM(v, i) PyTuple_GET_ITEM((PyTupleObject *)(v), (i))
885#else
886#define GETITEM(v, i) PyTuple_GetItem((v), (i))
887#endif
888
Guido van Rossum374a9221991-04-04 10:40:29 +0000889/* Code access macros */
890
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +0300891/* The integer overflow is checked by an assertion below. */
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600892#define INSTR_OFFSET() \
893 (sizeof(_Py_CODEUNIT) * (int)(next_instr - first_instr))
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +0300894#define NEXTOPARG() do { \
Serhiy Storchakaab874002016-09-11 13:48:15 +0300895 _Py_CODEUNIT word = *next_instr; \
896 opcode = _Py_OPCODE(word); \
897 oparg = _Py_OPARG(word); \
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +0300898 next_instr++; \
899 } while (0)
Serhiy Storchakaab874002016-09-11 13:48:15 +0300900#define JUMPTO(x) (next_instr = first_instr + (x) / sizeof(_Py_CODEUNIT))
901#define JUMPBY(x) (next_instr += (x) / sizeof(_Py_CODEUNIT))
Guido van Rossum374a9221991-04-04 10:40:29 +0000902
Raymond Hettingerf606f872003-03-16 03:11:04 +0000903/* OpCode prediction macros
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000904 Some opcodes tend to come in pairs thus making it possible to
905 predict the second code when the first is run. For example,
Serhiy Storchakada9c5132016-06-27 18:58:57 +0300906 COMPARE_OP is often followed by POP_JUMP_IF_FALSE or POP_JUMP_IF_TRUE.
Raymond Hettingerf606f872003-03-16 03:11:04 +0000907
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000908 Verifying the prediction costs a single high-speed test of a register
909 variable against a constant. If the pairing was good, then the
910 processor's own internal branch predication has a high likelihood of
911 success, resulting in a nearly zero-overhead transition to the
912 next opcode. A successful prediction saves a trip through the eval-loop
Serhiy Storchakab0f80b02016-05-24 09:15:14 +0300913 including its unpredictable switch-case branch. Combined with the
914 processor's internal branch prediction, a successful PREDICT has the
915 effect of making the two opcodes run as if they were a single new opcode
916 with the bodies combined.
Raymond Hettingerf606f872003-03-16 03:11:04 +0000917
Georg Brandl86b2fb92008-07-16 03:43:04 +0000918 If collecting opcode statistics, your choices are to either keep the
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000919 predictions turned-on and interpret the results as if some opcodes
920 had been combined or turn-off predictions so that the opcode frequency
921 counter updates for both opcodes.
Antoine Pitroub52ec782009-01-25 16:34:23 +0000922
923 Opcode prediction is disabled with threaded code, since the latter allows
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000924 the CPU to record separate branch prediction information for each
925 opcode.
Antoine Pitroub52ec782009-01-25 16:34:23 +0000926
Raymond Hettingerf606f872003-03-16 03:11:04 +0000927*/
928
Antoine Pitrou042b1282010-08-13 21:15:58 +0000929#if defined(DYNAMIC_EXECUTION_PROFILE) || USE_COMPUTED_GOTOS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000930#define PREDICT(op) if (0) goto PRED_##op
Raymond Hettingera7216982004-02-08 19:59:27 +0000931#else
Serhiy Storchakab0f80b02016-05-24 09:15:14 +0300932#define PREDICT(op) \
933 do{ \
Serhiy Storchakaab874002016-09-11 13:48:15 +0300934 _Py_CODEUNIT word = *next_instr; \
935 opcode = _Py_OPCODE(word); \
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +0300936 if (opcode == op){ \
Serhiy Storchakaab874002016-09-11 13:48:15 +0300937 oparg = _Py_OPARG(word); \
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +0300938 next_instr++; \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +0300939 goto PRED_##op; \
940 } \
941 } while(0)
Antoine Pitroub52ec782009-01-25 16:34:23 +0000942#endif
Serhiy Storchakab0f80b02016-05-24 09:15:14 +0300943#define PREDICTED(op) PRED_##op:
Antoine Pitroub52ec782009-01-25 16:34:23 +0000944
Raymond Hettingerf606f872003-03-16 03:11:04 +0000945
Guido van Rossum374a9221991-04-04 10:40:29 +0000946/* Stack manipulation macros */
947
Martin v. Löwis18e16552006-02-15 17:27:45 +0000948/* The stack can grow at most MAXINT deep, as co_nlocals and
949 co_stacksize are ints. */
Stefan Krahb7e10102010-06-23 18:42:39 +0000950#define STACK_LEVEL() ((int)(stack_pointer - f->f_valuestack))
951#define EMPTY() (STACK_LEVEL() == 0)
952#define TOP() (stack_pointer[-1])
953#define SECOND() (stack_pointer[-2])
954#define THIRD() (stack_pointer[-3])
955#define FOURTH() (stack_pointer[-4])
956#define PEEK(n) (stack_pointer[-(n)])
957#define SET_TOP(v) (stack_pointer[-1] = (v))
958#define SET_SECOND(v) (stack_pointer[-2] = (v))
959#define SET_THIRD(v) (stack_pointer[-3] = (v))
960#define SET_FOURTH(v) (stack_pointer[-4] = (v))
961#define SET_VALUE(n, v) (stack_pointer[-(n)] = (v))
962#define BASIC_STACKADJ(n) (stack_pointer += n)
963#define BASIC_PUSH(v) (*stack_pointer++ = (v))
964#define BASIC_POP() (*--stack_pointer)
Guido van Rossum374a9221991-04-04 10:40:29 +0000965
Guido van Rossum96a42c81992-01-12 02:29:51 +0000966#ifdef LLTRACE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000967#define PUSH(v) { (void)(BASIC_PUSH(v), \
Victor Stinner438a12d2019-05-24 17:01:38 +0200968 lltrace && prtrace(tstate, TOP(), "push")); \
Stefan Krahb7e10102010-06-23 18:42:39 +0000969 assert(STACK_LEVEL() <= co->co_stacksize); }
Victor Stinner438a12d2019-05-24 17:01:38 +0200970#define POP() ((void)(lltrace && prtrace(tstate, TOP(), "pop")), \
Stefan Krahb7e10102010-06-23 18:42:39 +0000971 BASIC_POP())
costypetrisor8ed317f2018-07-31 20:55:14 +0000972#define STACK_GROW(n) do { \
973 assert(n >= 0); \
974 (void)(BASIC_STACKADJ(n), \
Victor Stinner438a12d2019-05-24 17:01:38 +0200975 lltrace && prtrace(tstate, TOP(), "stackadj")); \
costypetrisor8ed317f2018-07-31 20:55:14 +0000976 assert(STACK_LEVEL() <= co->co_stacksize); \
977 } while (0)
978#define STACK_SHRINK(n) do { \
979 assert(n >= 0); \
Victor Stinner438a12d2019-05-24 17:01:38 +0200980 (void)(lltrace && prtrace(tstate, TOP(), "stackadj")); \
costypetrisor8ed317f2018-07-31 20:55:14 +0000981 (void)(BASIC_STACKADJ(-n)); \
982 assert(STACK_LEVEL() <= co->co_stacksize); \
983 } while (0)
Christian Heimes0449f632007-12-15 01:27:15 +0000984#define EXT_POP(STACK_POINTER) ((void)(lltrace && \
Victor Stinner438a12d2019-05-24 17:01:38 +0200985 prtrace(tstate, (STACK_POINTER)[-1], "ext_pop")), \
Stefan Krahb7e10102010-06-23 18:42:39 +0000986 *--(STACK_POINTER))
Guido van Rossum374a9221991-04-04 10:40:29 +0000987#else
Stefan Krahb7e10102010-06-23 18:42:39 +0000988#define PUSH(v) BASIC_PUSH(v)
989#define POP() BASIC_POP()
costypetrisor8ed317f2018-07-31 20:55:14 +0000990#define STACK_GROW(n) BASIC_STACKADJ(n)
991#define STACK_SHRINK(n) BASIC_STACKADJ(-n)
Guido van Rossumc2e20742006-02-27 22:32:47 +0000992#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
Guido van Rossum374a9221991-04-04 10:40:29 +0000993#endif
994
Guido van Rossum681d79a1995-07-18 14:51:37 +0000995/* Local variable macros */
996
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000997#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumcfbf1a32002-03-28 20:17:52 +0000998
999/* The SETLOCAL() macro must not DECREF the local variable in-place and
1000 then store the new value; it must copy the old value to a temporary
1001 value, then store the new value, and then DECREF the temporary value.
1002 This is because it is possible that during the DECREF the frame is
1003 accessed by other code (e.g. a __del__ method or gc.collect()) and the
1004 variable would be pointing to already-freed memory. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001005#define SETLOCAL(i, value) do { PyObject *tmp = GETLOCAL(i); \
Stefan Krahb7e10102010-06-23 18:42:39 +00001006 GETLOCAL(i) = value; \
1007 Py_XDECREF(tmp); } while (0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00001008
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001009
1010#define UNWIND_BLOCK(b) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001011 while (STACK_LEVEL() > (b)->b_level) { \
1012 PyObject *v = POP(); \
1013 Py_XDECREF(v); \
1014 }
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001015
1016#define UNWIND_EXCEPT_HANDLER(b) \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001017 do { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001018 PyObject *type, *value, *traceback; \
Mark Shannonae3087c2017-10-22 22:41:51 +01001019 _PyErr_StackItem *exc_info; \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001020 assert(STACK_LEVEL() >= (b)->b_level + 3); \
1021 while (STACK_LEVEL() > (b)->b_level + 3) { \
1022 value = POP(); \
1023 Py_XDECREF(value); \
1024 } \
Mark Shannonae3087c2017-10-22 22:41:51 +01001025 exc_info = tstate->exc_info; \
1026 type = exc_info->exc_type; \
1027 value = exc_info->exc_value; \
1028 traceback = exc_info->exc_traceback; \
1029 exc_info->exc_type = POP(); \
1030 exc_info->exc_value = POP(); \
1031 exc_info->exc_traceback = POP(); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001032 Py_XDECREF(type); \
1033 Py_XDECREF(value); \
1034 Py_XDECREF(traceback); \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001035 } while(0)
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001036
Inada Naoki91234a12019-06-03 21:30:58 +09001037 /* macros for opcode cache */
1038#define OPCACHE_CHECK() \
1039 do { \
1040 co_opcache = NULL; \
1041 if (co->co_opcache != NULL) { \
1042 unsigned char co_opt_offset = \
1043 co->co_opcache_map[next_instr - first_instr]; \
1044 if (co_opt_offset > 0) { \
1045 assert(co_opt_offset <= co->co_opcache_size); \
1046 co_opcache = &co->co_opcache[co_opt_offset - 1]; \
1047 assert(co_opcache != NULL); \
Inada Naoki91234a12019-06-03 21:30:58 +09001048 } \
1049 } \
1050 } while (0)
1051
1052#if OPCACHE_STATS
1053
1054#define OPCACHE_STAT_GLOBAL_HIT() \
1055 do { \
1056 if (co->co_opcache != NULL) opcache_global_hits++; \
1057 } while (0)
1058
1059#define OPCACHE_STAT_GLOBAL_MISS() \
1060 do { \
1061 if (co->co_opcache != NULL) opcache_global_misses++; \
1062 } while (0)
1063
1064#define OPCACHE_STAT_GLOBAL_OPT() \
1065 do { \
1066 if (co->co_opcache != NULL) opcache_global_opts++; \
1067 } while (0)
1068
1069#else /* OPCACHE_STATS */
1070
1071#define OPCACHE_STAT_GLOBAL_HIT()
1072#define OPCACHE_STAT_GLOBAL_MISS()
1073#define OPCACHE_STAT_GLOBAL_OPT()
1074
1075#endif
1076
Guido van Rossuma027efa1997-05-05 20:56:21 +00001077/* Start of code */
1078
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001079 /* push frame */
1080 if (Py_EnterRecursiveCall(""))
1081 return NULL;
Guido van Rossum8861b741996-07-30 16:49:37 +00001082
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001083 tstate->frame = f;
Tim Peters5ca576e2001-06-18 22:08:13 +00001084
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001085 if (tstate->use_tracing) {
1086 if (tstate->c_tracefunc != NULL) {
1087 /* tstate->c_tracefunc, if defined, is a
1088 function that will be called on *every* entry
1089 to a code block. Its return value, if not
1090 None, is a function that will be called at
1091 the start of each executed line of code.
1092 (Actually, the function must return itself
1093 in order to continue tracing.) The trace
1094 functions are called with three arguments:
1095 a pointer to the current frame, a string
1096 indicating why the function is called, and
1097 an argument which depends on the situation.
1098 The global trace function is also called
1099 whenever an exception is detected. */
1100 if (call_trace_protected(tstate->c_tracefunc,
1101 tstate->c_traceobj,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01001102 tstate, f, PyTrace_CALL, Py_None)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001103 /* Trace function raised an error */
1104 goto exit_eval_frame;
1105 }
1106 }
1107 if (tstate->c_profilefunc != NULL) {
1108 /* Similar for c_profilefunc, except it needn't
1109 return itself and isn't called for "line" events */
1110 if (call_trace_protected(tstate->c_profilefunc,
1111 tstate->c_profileobj,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01001112 tstate, f, PyTrace_CALL, Py_None)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001113 /* Profile function raised an error */
1114 goto exit_eval_frame;
1115 }
1116 }
1117 }
Neil Schemenauer6c0f2002001-09-04 19:03:35 +00001118
Łukasz Langaa785c872016-09-09 17:37:37 -07001119 if (PyDTrace_FUNCTION_ENTRY_ENABLED())
1120 dtrace_function_entry(f);
1121
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001122 co = f->f_code;
1123 names = co->co_names;
1124 consts = co->co_consts;
1125 fastlocals = f->f_localsplus;
1126 freevars = f->f_localsplus + co->co_nlocals;
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001127 assert(PyBytes_Check(co->co_code));
1128 assert(PyBytes_GET_SIZE(co->co_code) <= INT_MAX);
Serhiy Storchakaab874002016-09-11 13:48:15 +03001129 assert(PyBytes_GET_SIZE(co->co_code) % sizeof(_Py_CODEUNIT) == 0);
1130 assert(_Py_IS_ALIGNED(PyBytes_AS_STRING(co->co_code), sizeof(_Py_CODEUNIT)));
1131 first_instr = (_Py_CODEUNIT *) PyBytes_AS_STRING(co->co_code);
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001132 /*
1133 f->f_lasti refers to the index of the last instruction,
1134 unless it's -1 in which case next_instr should be first_instr.
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001135
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001136 YIELD_FROM sets f_lasti to itself, in order to repeatedly yield
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05001137 multiple values.
Thomas Wouters902d6eb2007-01-09 23:18:33 +00001138
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001139 When the PREDICT() macros are enabled, some opcode pairs follow in
1140 direct succession without updating f->f_lasti. A successful
1141 prediction effectively links the two codes together as if they
1142 were a single new opcode; accordingly,f->f_lasti will point to
1143 the first code in the pair (for instance, GET_ITER followed by
1144 FOR_ITER is effectively a single opcode and f->f_lasti will point
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001145 to the beginning of the combined pair.)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001146 */
Serhiy Storchakaab874002016-09-11 13:48:15 +03001147 assert(f->f_lasti >= -1);
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001148 next_instr = first_instr;
1149 if (f->f_lasti >= 0) {
Serhiy Storchakaab874002016-09-11 13:48:15 +03001150 assert(f->f_lasti % sizeof(_Py_CODEUNIT) == 0);
1151 next_instr += f->f_lasti / sizeof(_Py_CODEUNIT) + 1;
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001152 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001153 stack_pointer = f->f_stacktop;
1154 assert(stack_pointer != NULL);
1155 f->f_stacktop = NULL; /* remains NULL unless yield suspends frame */
Antoine Pitrou58720d62013-08-05 23:26:40 +02001156 f->f_executing = 1;
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001157
Inada Naoki91234a12019-06-03 21:30:58 +09001158 if (co->co_opcache_flag < OPCACHE_MIN_RUNS) {
1159 co->co_opcache_flag++;
1160 if (co->co_opcache_flag == OPCACHE_MIN_RUNS) {
1161 if (_PyCode_InitOpcache(co) < 0) {
1162 return NULL;
1163 }
1164#if OPCACHE_STATS
1165 opcache_code_objects_extra_mem +=
1166 PyBytes_Size(co->co_code) / sizeof(_Py_CODEUNIT) +
1167 sizeof(_PyOpcache) * co->co_opcache_size;
1168 opcache_code_objects++;
1169#endif
1170 }
1171 }
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001172
Tim Peters5ca576e2001-06-18 22:08:13 +00001173#ifdef LLTRACE
Victor Stinner3c1e4812012-03-26 22:10:51 +02001174 lltrace = _PyDict_GetItemId(f->f_globals, &PyId___ltrace__) != NULL;
Tim Peters5ca576e2001-06-18 22:08:13 +00001175#endif
Guido van Rossumac7be682001-01-17 15:42:30 +00001176
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001177 if (throwflag) /* support for generator.throw() */
1178 goto error;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001179
Victor Stinnerace47d72013-07-18 01:41:08 +02001180#ifdef Py_DEBUG
1181 /* PyEval_EvalFrameEx() must not be called with an exception set,
Victor Stinnera8cb5152017-01-18 14:12:51 +01001182 because it can clear it (directly or indirectly) and so the
Martin Panter9955a372015-10-07 10:26:23 +00001183 caller loses its exception */
Victor Stinner438a12d2019-05-24 17:01:38 +02001184 assert(!_PyErr_Occurred(tstate));
Victor Stinnerace47d72013-07-18 01:41:08 +02001185#endif
1186
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001187main_loop:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001188 for (;;) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001189 assert(stack_pointer >= f->f_valuestack); /* else underflow */
1190 assert(STACK_LEVEL() <= co->co_stacksize); /* else overflow */
Victor Stinner438a12d2019-05-24 17:01:38 +02001191 assert(!_PyErr_Occurred(tstate));
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001192
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001193 /* Do periodic things. Doing this every time through
1194 the loop would add too much overhead, so we do it
1195 only every Nth instruction. We also do it if
1196 ``pendingcalls_to_do'' is set, i.e. when an asynchronous
1197 event needs attention (e.g. a signal handler or
1198 async I/O handler); see Py_AddPendingCall() and
1199 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +00001200
Eric Snow7bda9de2019-03-08 17:25:54 -07001201 if (_Py_atomic_load_relaxed(eval_breaker)) {
Serhiy Storchaka3f4d90d2018-07-09 15:40:14 +03001202 opcode = _Py_OPCODE(*next_instr);
1203 if (opcode == SETUP_FINALLY ||
1204 opcode == SETUP_WITH ||
1205 opcode == BEFORE_ASYNC_WITH ||
1206 opcode == YIELD_FROM) {
1207 /* Few cases where we skip running signal handlers and other
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07001208 pending calls:
Serhiy Storchaka3f4d90d2018-07-09 15:40:14 +03001209 - If we're about to enter the 'with:'. It will prevent
1210 emitting a resource warning in the common idiom
1211 'with open(path) as file:'.
1212 - If we're about to enter the 'async with:'.
1213 - If we're about to enter the 'try:' of a try/finally (not
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07001214 *very* useful, but might help in some cases and it's
1215 traditional)
1216 - If we're resuming a chain of nested 'yield from' or
1217 'await' calls, then each frame is parked with YIELD_FROM
1218 as its next opcode. If the user hit control-C we want to
1219 wait until we've reached the innermost frame before
1220 running the signal handler and raising KeyboardInterrupt
1221 (see bpo-30039).
1222 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001223 goto fast_next_opcode;
1224 }
Eric Snowfdf282d2019-01-11 14:26:55 -07001225
Victor Stinnere225beb2019-06-03 18:14:24 +02001226 if (_Py_atomic_load_relaxed(&ceval->signals_pending)) {
Victor Stinner09532fe2019-05-10 23:39:09 +02001227 if (handle_signals(runtime) != 0) {
Eric Snowfdf282d2019-01-11 14:26:55 -07001228 goto error;
1229 }
1230 }
Victor Stinnere225beb2019-06-03 18:14:24 +02001231 if (_Py_atomic_load_relaxed(&ceval->pending.calls_to_do)) {
1232 if (make_pending_calls(runtime) != 0) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001233 goto error;
Eric Snowfdf282d2019-01-11 14:26:55 -07001234 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001235 }
Eric Snowfdf282d2019-01-11 14:26:55 -07001236
Victor Stinnere225beb2019-06-03 18:14:24 +02001237 if (_Py_atomic_load_relaxed(&ceval->gil_drop_request)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001238 /* Give another thread a chance */
Victor Stinner09532fe2019-05-10 23:39:09 +02001239 if (_PyThreadState_Swap(&runtime->gilstate, NULL) != tstate) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001240 Py_FatalError("ceval: tstate mix-up");
Victor Stinner09532fe2019-05-10 23:39:09 +02001241 }
Victor Stinnere225beb2019-06-03 18:14:24 +02001242 drop_gil(ceval, tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001243
1244 /* Other threads may run now */
1245
Victor Stinnere225beb2019-06-03 18:14:24 +02001246 take_gil(ceval, tstate);
Benjamin Peterson17548dd2014-06-16 22:59:07 -07001247
1248 /* Check if we should make a quick exit. */
Victor Stinner0fd2c302019-06-04 03:15:09 +02001249 exit_thread_if_finalizing(runtime, tstate);
Benjamin Peterson17548dd2014-06-16 22:59:07 -07001250
Victor Stinner09532fe2019-05-10 23:39:09 +02001251 if (_PyThreadState_Swap(&runtime->gilstate, tstate) != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001252 Py_FatalError("ceval: orphan tstate");
Victor Stinner09532fe2019-05-10 23:39:09 +02001253 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001254 }
1255 /* Check for asynchronous exceptions. */
1256 if (tstate->async_exc != NULL) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001257 PyObject *exc = tstate->async_exc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001258 tstate->async_exc = NULL;
Victor Stinnere225beb2019-06-03 18:14:24 +02001259 UNSIGNAL_ASYNC_EXC(ceval);
Victor Stinner438a12d2019-05-24 17:01:38 +02001260 _PyErr_SetNone(tstate, exc);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001261 Py_DECREF(exc);
1262 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001263 }
1264 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001265
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001266 fast_next_opcode:
1267 f->f_lasti = INSTR_OFFSET();
Guido van Rossumac7be682001-01-17 15:42:30 +00001268
Łukasz Langaa785c872016-09-09 17:37:37 -07001269 if (PyDTrace_LINE_ENABLED())
1270 maybe_dtrace_line(f, &instr_lb, &instr_ub, &instr_prev);
1271
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001272 /* line-by-line tracing support */
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001273
Victor Stinnere225beb2019-06-03 18:14:24 +02001274 if (_Py_TracingPossible(ceval) &&
Benjamin Peterson51f46162013-01-23 08:38:47 -05001275 tstate->c_tracefunc != NULL && !tstate->tracing) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001276 int err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001277 /* see maybe_call_line_trace
1278 for expository comments */
1279 f->f_stacktop = stack_pointer;
Tim Peters8a5c3c72004-04-05 19:36:21 +00001280
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001281 err = maybe_call_line_trace(tstate->c_tracefunc,
1282 tstate->c_traceobj,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01001283 tstate, f,
1284 &instr_lb, &instr_ub, &instr_prev);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001285 /* Reload possibly changed frame fields */
1286 JUMPTO(f->f_lasti);
1287 if (f->f_stacktop != NULL) {
1288 stack_pointer = f->f_stacktop;
1289 f->f_stacktop = NULL;
1290 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001291 if (err)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001292 /* trace function raised an exception */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001293 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001294 }
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001295
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001296 /* Extract opcode and argument */
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001297
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001298 NEXTOPARG();
Stefan Krahb7e10102010-06-23 18:42:39 +00001299 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +00001300#ifdef DYNAMIC_EXECUTION_PROFILE
1301#ifdef DXPAIRS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001302 dxpairs[lastopcode][opcode]++;
1303 lastopcode = opcode;
Guido van Rossum950361c1997-01-24 13:49:28 +00001304#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001305 dxp[opcode]++;
Guido van Rossum950361c1997-01-24 13:49:28 +00001306#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001307
Guido van Rossum96a42c81992-01-12 02:29:51 +00001308#ifdef LLTRACE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001309 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +00001310
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001311 if (lltrace) {
1312 if (HAS_ARG(opcode)) {
1313 printf("%d: %d, %d\n",
1314 f->f_lasti, opcode, oparg);
1315 }
1316 else {
1317 printf("%d: %d\n",
1318 f->f_lasti, opcode);
1319 }
1320 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001321#endif
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001322
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001323 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +00001324
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001325 /* BEWARE!
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001326 It is essential that any operation that fails must goto error
1327 and that all operation that succeed call [FAST_]DISPATCH() ! */
Guido van Rossumac7be682001-01-17 15:42:30 +00001328
Benjamin Petersonddd19492018-09-16 22:38:02 -07001329 case TARGET(NOP): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001330 FAST_DISPATCH();
Benjamin Petersonddd19492018-09-16 22:38:02 -07001331 }
Raymond Hettinger9c18e812004-06-21 16:31:15 +00001332
Benjamin Petersonddd19492018-09-16 22:38:02 -07001333 case TARGET(LOAD_FAST): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001334 PyObject *value = GETLOCAL(oparg);
1335 if (value == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02001336 format_exc_check_arg(tstate, PyExc_UnboundLocalError,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001337 UNBOUNDLOCAL_ERROR_MSG,
1338 PyTuple_GetItem(co->co_varnames, oparg));
1339 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001340 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001341 Py_INCREF(value);
1342 PUSH(value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001343 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001344 }
1345
Benjamin Petersonddd19492018-09-16 22:38:02 -07001346 case TARGET(LOAD_CONST): {
1347 PREDICTED(LOAD_CONST);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001348 PyObject *value = GETITEM(consts, oparg);
1349 Py_INCREF(value);
1350 PUSH(value);
1351 FAST_DISPATCH();
1352 }
Neil Schemenauer63543862002-02-17 19:10:14 +00001353
Benjamin Petersonddd19492018-09-16 22:38:02 -07001354 case TARGET(STORE_FAST): {
1355 PREDICTED(STORE_FAST);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001356 PyObject *value = POP();
1357 SETLOCAL(oparg, value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001358 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001359 }
Neil Schemenauer63543862002-02-17 19:10:14 +00001360
Benjamin Petersonddd19492018-09-16 22:38:02 -07001361 case TARGET(POP_TOP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001362 PyObject *value = POP();
1363 Py_DECREF(value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001364 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001365 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001366
Benjamin Petersonddd19492018-09-16 22:38:02 -07001367 case TARGET(ROT_TWO): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001368 PyObject *top = TOP();
1369 PyObject *second = SECOND();
1370 SET_TOP(second);
1371 SET_SECOND(top);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001372 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001373 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001374
Benjamin Petersonddd19492018-09-16 22:38:02 -07001375 case TARGET(ROT_THREE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001376 PyObject *top = TOP();
1377 PyObject *second = SECOND();
1378 PyObject *third = THIRD();
1379 SET_TOP(second);
1380 SET_SECOND(third);
1381 SET_THIRD(top);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001382 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001383 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001384
Benjamin Petersonddd19492018-09-16 22:38:02 -07001385 case TARGET(ROT_FOUR): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001386 PyObject *top = TOP();
1387 PyObject *second = SECOND();
1388 PyObject *third = THIRD();
1389 PyObject *fourth = FOURTH();
1390 SET_TOP(second);
1391 SET_SECOND(third);
1392 SET_THIRD(fourth);
1393 SET_FOURTH(top);
1394 FAST_DISPATCH();
1395 }
1396
Benjamin Petersonddd19492018-09-16 22:38:02 -07001397 case TARGET(DUP_TOP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001398 PyObject *top = TOP();
1399 Py_INCREF(top);
1400 PUSH(top);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001401 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001402 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001403
Benjamin Petersonddd19492018-09-16 22:38:02 -07001404 case TARGET(DUP_TOP_TWO): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001405 PyObject *top = TOP();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001406 PyObject *second = SECOND();
Benjamin Petersonf208df32012-10-12 11:37:56 -04001407 Py_INCREF(top);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001408 Py_INCREF(second);
costypetrisor8ed317f2018-07-31 20:55:14 +00001409 STACK_GROW(2);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001410 SET_TOP(top);
1411 SET_SECOND(second);
Antoine Pitrou74a69fa2010-09-04 18:43:52 +00001412 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001413 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001414
Benjamin Petersonddd19492018-09-16 22:38:02 -07001415 case TARGET(UNARY_POSITIVE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001416 PyObject *value = TOP();
1417 PyObject *res = PyNumber_Positive(value);
1418 Py_DECREF(value);
1419 SET_TOP(res);
1420 if (res == NULL)
1421 goto error;
1422 DISPATCH();
1423 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001424
Benjamin Petersonddd19492018-09-16 22:38:02 -07001425 case TARGET(UNARY_NEGATIVE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001426 PyObject *value = TOP();
1427 PyObject *res = PyNumber_Negative(value);
1428 Py_DECREF(value);
1429 SET_TOP(res);
1430 if (res == NULL)
1431 goto error;
1432 DISPATCH();
1433 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001434
Benjamin Petersonddd19492018-09-16 22:38:02 -07001435 case TARGET(UNARY_NOT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001436 PyObject *value = TOP();
1437 int err = PyObject_IsTrue(value);
1438 Py_DECREF(value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001439 if (err == 0) {
1440 Py_INCREF(Py_True);
1441 SET_TOP(Py_True);
1442 DISPATCH();
1443 }
1444 else if (err > 0) {
1445 Py_INCREF(Py_False);
1446 SET_TOP(Py_False);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001447 DISPATCH();
1448 }
costypetrisor8ed317f2018-07-31 20:55:14 +00001449 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001450 goto error;
1451 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001452
Benjamin Petersonddd19492018-09-16 22:38:02 -07001453 case TARGET(UNARY_INVERT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001454 PyObject *value = TOP();
1455 PyObject *res = PyNumber_Invert(value);
1456 Py_DECREF(value);
1457 SET_TOP(res);
1458 if (res == NULL)
1459 goto error;
1460 DISPATCH();
1461 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001462
Benjamin Petersonddd19492018-09-16 22:38:02 -07001463 case TARGET(BINARY_POWER): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001464 PyObject *exp = POP();
1465 PyObject *base = TOP();
1466 PyObject *res = PyNumber_Power(base, exp, Py_None);
1467 Py_DECREF(base);
1468 Py_DECREF(exp);
1469 SET_TOP(res);
1470 if (res == NULL)
1471 goto error;
1472 DISPATCH();
1473 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001474
Benjamin Petersonddd19492018-09-16 22:38:02 -07001475 case TARGET(BINARY_MULTIPLY): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001476 PyObject *right = POP();
1477 PyObject *left = TOP();
1478 PyObject *res = PyNumber_Multiply(left, right);
1479 Py_DECREF(left);
1480 Py_DECREF(right);
1481 SET_TOP(res);
1482 if (res == NULL)
1483 goto error;
1484 DISPATCH();
1485 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001486
Benjamin Petersonddd19492018-09-16 22:38:02 -07001487 case TARGET(BINARY_MATRIX_MULTIPLY): {
Benjamin Petersond51374e2014-04-09 23:55:56 -04001488 PyObject *right = POP();
1489 PyObject *left = TOP();
1490 PyObject *res = PyNumber_MatrixMultiply(left, right);
1491 Py_DECREF(left);
1492 Py_DECREF(right);
1493 SET_TOP(res);
1494 if (res == NULL)
1495 goto error;
1496 DISPATCH();
1497 }
1498
Benjamin Petersonddd19492018-09-16 22:38:02 -07001499 case TARGET(BINARY_TRUE_DIVIDE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001500 PyObject *divisor = POP();
1501 PyObject *dividend = TOP();
1502 PyObject *quotient = PyNumber_TrueDivide(dividend, divisor);
1503 Py_DECREF(dividend);
1504 Py_DECREF(divisor);
1505 SET_TOP(quotient);
1506 if (quotient == NULL)
1507 goto error;
1508 DISPATCH();
1509 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001510
Benjamin Petersonddd19492018-09-16 22:38:02 -07001511 case TARGET(BINARY_FLOOR_DIVIDE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001512 PyObject *divisor = POP();
1513 PyObject *dividend = TOP();
1514 PyObject *quotient = PyNumber_FloorDivide(dividend, divisor);
1515 Py_DECREF(dividend);
1516 Py_DECREF(divisor);
1517 SET_TOP(quotient);
1518 if (quotient == NULL)
1519 goto error;
1520 DISPATCH();
1521 }
Guido van Rossum4668b002001-08-08 05:00:18 +00001522
Benjamin Petersonddd19492018-09-16 22:38:02 -07001523 case TARGET(BINARY_MODULO): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001524 PyObject *divisor = POP();
1525 PyObject *dividend = TOP();
Martijn Pietersd7e64332017-02-23 13:38:04 +00001526 PyObject *res;
1527 if (PyUnicode_CheckExact(dividend) && (
1528 !PyUnicode_Check(divisor) || PyUnicode_CheckExact(divisor))) {
1529 // fast path; string formatting, but not if the RHS is a str subclass
1530 // (see issue28598)
1531 res = PyUnicode_Format(dividend, divisor);
1532 } else {
1533 res = PyNumber_Remainder(dividend, divisor);
1534 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001535 Py_DECREF(divisor);
1536 Py_DECREF(dividend);
1537 SET_TOP(res);
1538 if (res == NULL)
1539 goto error;
1540 DISPATCH();
1541 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001542
Benjamin Petersonddd19492018-09-16 22:38:02 -07001543 case TARGET(BINARY_ADD): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001544 PyObject *right = POP();
1545 PyObject *left = TOP();
1546 PyObject *sum;
Victor Stinnerd65f42a2016-10-20 12:18:10 +02001547 /* NOTE(haypo): Please don't try to micro-optimize int+int on
1548 CPython using bytecode, it is simply worthless.
1549 See http://bugs.python.org/issue21955 and
1550 http://bugs.python.org/issue10044 for the discussion. In short,
1551 no patch shown any impact on a realistic benchmark, only a minor
1552 speedup on microbenchmarks. */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001553 if (PyUnicode_CheckExact(left) &&
1554 PyUnicode_CheckExact(right)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02001555 sum = unicode_concatenate(tstate, left, right, f, next_instr);
Martin Panter95f53c12016-07-18 08:23:26 +00001556 /* unicode_concatenate consumed the ref to left */
Victor Stinnerd2a915d2011-10-02 20:34:20 +02001557 }
1558 else {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001559 sum = PyNumber_Add(left, right);
1560 Py_DECREF(left);
Victor Stinnerd2a915d2011-10-02 20:34:20 +02001561 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001562 Py_DECREF(right);
1563 SET_TOP(sum);
1564 if (sum == NULL)
1565 goto error;
1566 DISPATCH();
1567 }
1568
Benjamin Petersonddd19492018-09-16 22:38:02 -07001569 case TARGET(BINARY_SUBTRACT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001570 PyObject *right = POP();
1571 PyObject *left = TOP();
1572 PyObject *diff = PyNumber_Subtract(left, right);
1573 Py_DECREF(right);
1574 Py_DECREF(left);
1575 SET_TOP(diff);
1576 if (diff == NULL)
1577 goto error;
1578 DISPATCH();
1579 }
1580
Benjamin Petersonddd19492018-09-16 22:38:02 -07001581 case TARGET(BINARY_SUBSCR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001582 PyObject *sub = POP();
1583 PyObject *container = TOP();
1584 PyObject *res = PyObject_GetItem(container, sub);
1585 Py_DECREF(container);
1586 Py_DECREF(sub);
1587 SET_TOP(res);
1588 if (res == NULL)
1589 goto error;
1590 DISPATCH();
1591 }
1592
Benjamin Petersonddd19492018-09-16 22:38:02 -07001593 case TARGET(BINARY_LSHIFT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001594 PyObject *right = POP();
1595 PyObject *left = TOP();
1596 PyObject *res = PyNumber_Lshift(left, right);
1597 Py_DECREF(left);
1598 Py_DECREF(right);
1599 SET_TOP(res);
1600 if (res == NULL)
1601 goto error;
1602 DISPATCH();
1603 }
1604
Benjamin Petersonddd19492018-09-16 22:38:02 -07001605 case TARGET(BINARY_RSHIFT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001606 PyObject *right = POP();
1607 PyObject *left = TOP();
1608 PyObject *res = PyNumber_Rshift(left, right);
1609 Py_DECREF(left);
1610 Py_DECREF(right);
1611 SET_TOP(res);
1612 if (res == NULL)
1613 goto error;
1614 DISPATCH();
1615 }
1616
Benjamin Petersonddd19492018-09-16 22:38:02 -07001617 case TARGET(BINARY_AND): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001618 PyObject *right = POP();
1619 PyObject *left = TOP();
1620 PyObject *res = PyNumber_And(left, right);
1621 Py_DECREF(left);
1622 Py_DECREF(right);
1623 SET_TOP(res);
1624 if (res == NULL)
1625 goto error;
1626 DISPATCH();
1627 }
1628
Benjamin Petersonddd19492018-09-16 22:38:02 -07001629 case TARGET(BINARY_XOR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001630 PyObject *right = POP();
1631 PyObject *left = TOP();
1632 PyObject *res = PyNumber_Xor(left, right);
1633 Py_DECREF(left);
1634 Py_DECREF(right);
1635 SET_TOP(res);
1636 if (res == NULL)
1637 goto error;
1638 DISPATCH();
1639 }
1640
Benjamin Petersonddd19492018-09-16 22:38:02 -07001641 case TARGET(BINARY_OR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001642 PyObject *right = POP();
1643 PyObject *left = TOP();
1644 PyObject *res = PyNumber_Or(left, right);
1645 Py_DECREF(left);
1646 Py_DECREF(right);
1647 SET_TOP(res);
1648 if (res == NULL)
1649 goto error;
1650 DISPATCH();
1651 }
1652
Benjamin Petersonddd19492018-09-16 22:38:02 -07001653 case TARGET(LIST_APPEND): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001654 PyObject *v = POP();
1655 PyObject *list = PEEK(oparg);
1656 int err;
1657 err = PyList_Append(list, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001658 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001659 if (err != 0)
1660 goto error;
1661 PREDICT(JUMP_ABSOLUTE);
1662 DISPATCH();
1663 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001664
Benjamin Petersonddd19492018-09-16 22:38:02 -07001665 case TARGET(SET_ADD): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001666 PyObject *v = POP();
Raymond Hettinger41862222016-10-15 19:03:06 -07001667 PyObject *set = PEEK(oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001668 int err;
1669 err = PySet_Add(set, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001670 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001671 if (err != 0)
1672 goto error;
1673 PREDICT(JUMP_ABSOLUTE);
1674 DISPATCH();
1675 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001676
Benjamin Petersonddd19492018-09-16 22:38:02 -07001677 case TARGET(INPLACE_POWER): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001678 PyObject *exp = POP();
1679 PyObject *base = TOP();
1680 PyObject *res = PyNumber_InPlacePower(base, exp, Py_None);
1681 Py_DECREF(base);
1682 Py_DECREF(exp);
1683 SET_TOP(res);
1684 if (res == NULL)
1685 goto error;
1686 DISPATCH();
1687 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001688
Benjamin Petersonddd19492018-09-16 22:38:02 -07001689 case TARGET(INPLACE_MULTIPLY): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001690 PyObject *right = POP();
1691 PyObject *left = TOP();
1692 PyObject *res = PyNumber_InPlaceMultiply(left, right);
1693 Py_DECREF(left);
1694 Py_DECREF(right);
1695 SET_TOP(res);
1696 if (res == NULL)
1697 goto error;
1698 DISPATCH();
1699 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001700
Benjamin Petersonddd19492018-09-16 22:38:02 -07001701 case TARGET(INPLACE_MATRIX_MULTIPLY): {
Benjamin Petersond51374e2014-04-09 23:55:56 -04001702 PyObject *right = POP();
1703 PyObject *left = TOP();
1704 PyObject *res = PyNumber_InPlaceMatrixMultiply(left, right);
1705 Py_DECREF(left);
1706 Py_DECREF(right);
1707 SET_TOP(res);
1708 if (res == NULL)
1709 goto error;
1710 DISPATCH();
1711 }
1712
Benjamin Petersonddd19492018-09-16 22:38:02 -07001713 case TARGET(INPLACE_TRUE_DIVIDE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001714 PyObject *divisor = POP();
1715 PyObject *dividend = TOP();
1716 PyObject *quotient = PyNumber_InPlaceTrueDivide(dividend, divisor);
1717 Py_DECREF(dividend);
1718 Py_DECREF(divisor);
1719 SET_TOP(quotient);
1720 if (quotient == NULL)
1721 goto error;
1722 DISPATCH();
1723 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001724
Benjamin Petersonddd19492018-09-16 22:38:02 -07001725 case TARGET(INPLACE_FLOOR_DIVIDE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001726 PyObject *divisor = POP();
1727 PyObject *dividend = TOP();
1728 PyObject *quotient = PyNumber_InPlaceFloorDivide(dividend, divisor);
1729 Py_DECREF(dividend);
1730 Py_DECREF(divisor);
1731 SET_TOP(quotient);
1732 if (quotient == NULL)
1733 goto error;
1734 DISPATCH();
1735 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001736
Benjamin Petersonddd19492018-09-16 22:38:02 -07001737 case TARGET(INPLACE_MODULO): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001738 PyObject *right = POP();
1739 PyObject *left = TOP();
1740 PyObject *mod = PyNumber_InPlaceRemainder(left, right);
1741 Py_DECREF(left);
1742 Py_DECREF(right);
1743 SET_TOP(mod);
1744 if (mod == NULL)
1745 goto error;
1746 DISPATCH();
1747 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001748
Benjamin Petersonddd19492018-09-16 22:38:02 -07001749 case TARGET(INPLACE_ADD): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001750 PyObject *right = POP();
1751 PyObject *left = TOP();
1752 PyObject *sum;
1753 if (PyUnicode_CheckExact(left) && PyUnicode_CheckExact(right)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02001754 sum = unicode_concatenate(tstate, left, right, f, next_instr);
Martin Panter95f53c12016-07-18 08:23:26 +00001755 /* unicode_concatenate consumed the ref to left */
Victor Stinnerd2a915d2011-10-02 20:34:20 +02001756 }
1757 else {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001758 sum = PyNumber_InPlaceAdd(left, right);
1759 Py_DECREF(left);
Victor Stinnerd2a915d2011-10-02 20:34:20 +02001760 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001761 Py_DECREF(right);
1762 SET_TOP(sum);
1763 if (sum == NULL)
1764 goto error;
1765 DISPATCH();
1766 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001767
Benjamin Petersonddd19492018-09-16 22:38:02 -07001768 case TARGET(INPLACE_SUBTRACT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001769 PyObject *right = POP();
1770 PyObject *left = TOP();
1771 PyObject *diff = PyNumber_InPlaceSubtract(left, right);
1772 Py_DECREF(left);
1773 Py_DECREF(right);
1774 SET_TOP(diff);
1775 if (diff == NULL)
1776 goto error;
1777 DISPATCH();
1778 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001779
Benjamin Petersonddd19492018-09-16 22:38:02 -07001780 case TARGET(INPLACE_LSHIFT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001781 PyObject *right = POP();
1782 PyObject *left = TOP();
1783 PyObject *res = PyNumber_InPlaceLshift(left, right);
1784 Py_DECREF(left);
1785 Py_DECREF(right);
1786 SET_TOP(res);
1787 if (res == NULL)
1788 goto error;
1789 DISPATCH();
1790 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001791
Benjamin Petersonddd19492018-09-16 22:38:02 -07001792 case TARGET(INPLACE_RSHIFT): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001793 PyObject *right = POP();
1794 PyObject *left = TOP();
1795 PyObject *res = PyNumber_InPlaceRshift(left, right);
1796 Py_DECREF(left);
1797 Py_DECREF(right);
1798 SET_TOP(res);
1799 if (res == NULL)
1800 goto error;
1801 DISPATCH();
1802 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001803
Benjamin Petersonddd19492018-09-16 22:38:02 -07001804 case TARGET(INPLACE_AND): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001805 PyObject *right = POP();
1806 PyObject *left = TOP();
1807 PyObject *res = PyNumber_InPlaceAnd(left, right);
1808 Py_DECREF(left);
1809 Py_DECREF(right);
1810 SET_TOP(res);
1811 if (res == NULL)
1812 goto error;
1813 DISPATCH();
1814 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001815
Benjamin Petersonddd19492018-09-16 22:38:02 -07001816 case TARGET(INPLACE_XOR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001817 PyObject *right = POP();
1818 PyObject *left = TOP();
1819 PyObject *res = PyNumber_InPlaceXor(left, right);
1820 Py_DECREF(left);
1821 Py_DECREF(right);
1822 SET_TOP(res);
1823 if (res == NULL)
1824 goto error;
1825 DISPATCH();
1826 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001827
Benjamin Petersonddd19492018-09-16 22:38:02 -07001828 case TARGET(INPLACE_OR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001829 PyObject *right = POP();
1830 PyObject *left = TOP();
1831 PyObject *res = PyNumber_InPlaceOr(left, right);
1832 Py_DECREF(left);
1833 Py_DECREF(right);
1834 SET_TOP(res);
1835 if (res == NULL)
1836 goto error;
1837 DISPATCH();
1838 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001839
Benjamin Petersonddd19492018-09-16 22:38:02 -07001840 case TARGET(STORE_SUBSCR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001841 PyObject *sub = TOP();
1842 PyObject *container = SECOND();
1843 PyObject *v = THIRD();
1844 int err;
costypetrisor8ed317f2018-07-31 20:55:14 +00001845 STACK_SHRINK(3);
Martin Panter95f53c12016-07-18 08:23:26 +00001846 /* container[sub] = v */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001847 err = PyObject_SetItem(container, sub, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001848 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001849 Py_DECREF(container);
1850 Py_DECREF(sub);
1851 if (err != 0)
1852 goto error;
1853 DISPATCH();
1854 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001855
Benjamin Petersonddd19492018-09-16 22:38:02 -07001856 case TARGET(DELETE_SUBSCR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001857 PyObject *sub = TOP();
1858 PyObject *container = SECOND();
1859 int err;
costypetrisor8ed317f2018-07-31 20:55:14 +00001860 STACK_SHRINK(2);
Martin Panter95f53c12016-07-18 08:23:26 +00001861 /* del container[sub] */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001862 err = PyObject_DelItem(container, sub);
1863 Py_DECREF(container);
1864 Py_DECREF(sub);
1865 if (err != 0)
1866 goto error;
1867 DISPATCH();
1868 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001869
Benjamin Petersonddd19492018-09-16 22:38:02 -07001870 case TARGET(PRINT_EXPR): {
Victor Stinnercab75e32013-11-06 22:38:37 +01001871 _Py_IDENTIFIER(displayhook);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001872 PyObject *value = POP();
Victor Stinnercab75e32013-11-06 22:38:37 +01001873 PyObject *hook = _PySys_GetObjectId(&PyId_displayhook);
Benjamin Petersonfe1bcb62012-10-12 11:40:01 -04001874 PyObject *res;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001875 if (hook == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02001876 _PyErr_SetString(tstate, PyExc_RuntimeError,
1877 "lost sys.displayhook");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001878 Py_DECREF(value);
1879 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001880 }
Victor Stinnerde4ae3d2016-12-04 22:59:09 +01001881 res = PyObject_CallFunctionObjArgs(hook, value, NULL);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001882 Py_DECREF(value);
1883 if (res == NULL)
1884 goto error;
1885 Py_DECREF(res);
1886 DISPATCH();
1887 }
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001888
Benjamin Petersonddd19492018-09-16 22:38:02 -07001889 case TARGET(RAISE_VARARGS): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001890 PyObject *cause = NULL, *exc = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001891 switch (oparg) {
1892 case 2:
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001893 cause = POP(); /* cause */
Stefan Krahf432a322017-08-21 13:09:59 +02001894 /* fall through */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001895 case 1:
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001896 exc = POP(); /* exc */
Stefan Krahf432a322017-08-21 13:09:59 +02001897 /* fall through */
1898 case 0:
Victor Stinner09532fe2019-05-10 23:39:09 +02001899 if (do_raise(tstate, exc, cause)) {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001900 goto exception_unwind;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001901 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001902 break;
1903 default:
Victor Stinner438a12d2019-05-24 17:01:38 +02001904 _PyErr_SetString(tstate, PyExc_SystemError,
1905 "bad RAISE_VARARGS oparg");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001906 break;
1907 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001908 goto error;
1909 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001910
Benjamin Petersonddd19492018-09-16 22:38:02 -07001911 case TARGET(RETURN_VALUE): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001912 retval = POP();
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001913 assert(f->f_iblock == 0);
Pablo Galindof00828a2019-05-09 16:52:02 +01001914 goto exit_returning;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001915 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001916
Benjamin Petersonddd19492018-09-16 22:38:02 -07001917 case TARGET(GET_AITER): {
Yury Selivanov6ef05902015-05-28 11:21:31 -04001918 unaryfunc getter = NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04001919 PyObject *iter = NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04001920 PyObject *obj = TOP();
1921 PyTypeObject *type = Py_TYPE(obj);
1922
Yury Selivanova6f6edb2016-06-09 15:08:31 -04001923 if (type->tp_as_async != NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04001924 getter = type->tp_as_async->am_aiter;
Yury Selivanova6f6edb2016-06-09 15:08:31 -04001925 }
Yury Selivanov75445082015-05-11 22:57:16 -04001926
1927 if (getter != NULL) {
1928 iter = (*getter)(obj);
1929 Py_DECREF(obj);
1930 if (iter == NULL) {
1931 SET_TOP(NULL);
1932 goto error;
1933 }
1934 }
1935 else {
1936 SET_TOP(NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02001937 _PyErr_Format(tstate, PyExc_TypeError,
1938 "'async for' requires an object with "
1939 "__aiter__ method, got %.100s",
1940 type->tp_name);
Yury Selivanov75445082015-05-11 22:57:16 -04001941 Py_DECREF(obj);
1942 goto error;
1943 }
1944
Yury Selivanovfaa135a2017-10-06 02:08:57 -04001945 if (Py_TYPE(iter)->tp_as_async == NULL ||
1946 Py_TYPE(iter)->tp_as_async->am_anext == NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04001947
Yury Selivanov398ff912017-03-02 22:20:00 -05001948 SET_TOP(NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02001949 _PyErr_Format(tstate, PyExc_TypeError,
1950 "'async for' received an object from __aiter__ "
1951 "that does not implement __anext__: %.100s",
1952 Py_TYPE(iter)->tp_name);
Yury Selivanov75445082015-05-11 22:57:16 -04001953 Py_DECREF(iter);
1954 goto error;
Yury Selivanova6f6edb2016-06-09 15:08:31 -04001955 }
1956
Yury Selivanovfaa135a2017-10-06 02:08:57 -04001957 SET_TOP(iter);
Yury Selivanov75445082015-05-11 22:57:16 -04001958 DISPATCH();
1959 }
1960
Benjamin Petersonddd19492018-09-16 22:38:02 -07001961 case TARGET(GET_ANEXT): {
Yury Selivanov6ef05902015-05-28 11:21:31 -04001962 unaryfunc getter = NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04001963 PyObject *next_iter = NULL;
1964 PyObject *awaitable = NULL;
1965 PyObject *aiter = TOP();
1966 PyTypeObject *type = Py_TYPE(aiter);
1967
Yury Selivanoveb636452016-09-08 22:01:51 -07001968 if (PyAsyncGen_CheckExact(aiter)) {
1969 awaitable = type->tp_as_async->am_anext(aiter);
1970 if (awaitable == NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04001971 goto error;
1972 }
Yury Selivanoveb636452016-09-08 22:01:51 -07001973 } else {
1974 if (type->tp_as_async != NULL){
1975 getter = type->tp_as_async->am_anext;
1976 }
Yury Selivanov75445082015-05-11 22:57:16 -04001977
Yury Selivanoveb636452016-09-08 22:01:51 -07001978 if (getter != NULL) {
1979 next_iter = (*getter)(aiter);
1980 if (next_iter == NULL) {
1981 goto error;
1982 }
1983 }
1984 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02001985 _PyErr_Format(tstate, PyExc_TypeError,
1986 "'async for' requires an iterator with "
1987 "__anext__ method, got %.100s",
1988 type->tp_name);
Yury Selivanoveb636452016-09-08 22:01:51 -07001989 goto error;
1990 }
Yury Selivanov75445082015-05-11 22:57:16 -04001991
Yury Selivanoveb636452016-09-08 22:01:51 -07001992 awaitable = _PyCoro_GetAwaitableIter(next_iter);
1993 if (awaitable == NULL) {
Yury Selivanov398ff912017-03-02 22:20:00 -05001994 _PyErr_FormatFromCause(
Yury Selivanoveb636452016-09-08 22:01:51 -07001995 PyExc_TypeError,
1996 "'async for' received an invalid object "
1997 "from __anext__: %.100s",
1998 Py_TYPE(next_iter)->tp_name);
1999
2000 Py_DECREF(next_iter);
2001 goto error;
2002 } else {
2003 Py_DECREF(next_iter);
2004 }
2005 }
Yury Selivanov75445082015-05-11 22:57:16 -04002006
2007 PUSH(awaitable);
Serhiy Storchakada9c5132016-06-27 18:58:57 +03002008 PREDICT(LOAD_CONST);
Yury Selivanov75445082015-05-11 22:57:16 -04002009 DISPATCH();
2010 }
2011
Benjamin Petersonddd19492018-09-16 22:38:02 -07002012 case TARGET(GET_AWAITABLE): {
2013 PREDICTED(GET_AWAITABLE);
Yury Selivanov75445082015-05-11 22:57:16 -04002014 PyObject *iterable = TOP();
Yury Selivanov5376ba92015-06-22 12:19:30 -04002015 PyObject *iter = _PyCoro_GetAwaitableIter(iterable);
Yury Selivanov75445082015-05-11 22:57:16 -04002016
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03002017 if (iter == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002018 format_awaitable_error(tstate, Py_TYPE(iterable),
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03002019 _Py_OPCODE(next_instr[-2]));
2020 }
2021
Yury Selivanov75445082015-05-11 22:57:16 -04002022 Py_DECREF(iterable);
2023
Yury Selivanovc724bae2016-03-02 11:30:46 -05002024 if (iter != NULL && PyCoro_CheckExact(iter)) {
2025 PyObject *yf = _PyGen_yf((PyGenObject*)iter);
2026 if (yf != NULL) {
2027 /* `iter` is a coroutine object that is being
2028 awaited, `yf` is a pointer to the current awaitable
2029 being awaited on. */
2030 Py_DECREF(yf);
2031 Py_CLEAR(iter);
Victor Stinner438a12d2019-05-24 17:01:38 +02002032 _PyErr_SetString(tstate, PyExc_RuntimeError,
2033 "coroutine is being awaited already");
Yury Selivanovc724bae2016-03-02 11:30:46 -05002034 /* The code below jumps to `error` if `iter` is NULL. */
2035 }
2036 }
2037
Yury Selivanov75445082015-05-11 22:57:16 -04002038 SET_TOP(iter); /* Even if it's NULL */
2039
2040 if (iter == NULL) {
2041 goto error;
2042 }
2043
Serhiy Storchakada9c5132016-06-27 18:58:57 +03002044 PREDICT(LOAD_CONST);
Yury Selivanov75445082015-05-11 22:57:16 -04002045 DISPATCH();
2046 }
2047
Benjamin Petersonddd19492018-09-16 22:38:02 -07002048 case TARGET(YIELD_FROM): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002049 PyObject *v = POP();
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07002050 PyObject *receiver = TOP();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002051 int err;
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07002052 if (PyGen_CheckExact(receiver) || PyCoro_CheckExact(receiver)) {
2053 retval = _PyGen_Send((PyGenObject *)receiver, v);
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05002054 } else {
Benjamin Peterson302e7902012-03-20 23:17:04 -04002055 _Py_IDENTIFIER(send);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002056 if (v == Py_None)
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07002057 retval = Py_TYPE(receiver)->tp_iternext(receiver);
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05002058 else
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07002059 retval = _PyObject_CallMethodIdObjArgs(receiver, &PyId_send, v, NULL);
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05002060 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002061 Py_DECREF(v);
2062 if (retval == NULL) {
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05002063 PyObject *val;
Guido van Rossum8820c232013-11-21 11:30:06 -08002064 if (tstate->c_tracefunc != NULL
Victor Stinner438a12d2019-05-24 17:01:38 +02002065 && _PyErr_ExceptionMatches(tstate, PyExc_StopIteration))
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01002066 call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj, tstate, f);
Nick Coghlanc40bc092012-06-17 15:15:49 +10002067 err = _PyGen_FetchStopIterationValue(&val);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002068 if (err < 0)
2069 goto error;
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07002070 Py_DECREF(receiver);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002071 SET_TOP(val);
2072 DISPATCH();
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002073 }
Martin Panter95f53c12016-07-18 08:23:26 +00002074 /* receiver remains on stack, retval is value to be yielded */
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002075 f->f_stacktop = stack_pointer;
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05002076 /* and repeat... */
Victor Stinnerf7d199f2016-11-24 22:33:01 +01002077 assert(f->f_lasti >= (int)sizeof(_Py_CODEUNIT));
Serhiy Storchakaab874002016-09-11 13:48:15 +03002078 f->f_lasti -= sizeof(_Py_CODEUNIT);
Pablo Galindof00828a2019-05-09 16:52:02 +01002079 goto exit_yielding;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002080 }
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002081
Benjamin Petersonddd19492018-09-16 22:38:02 -07002082 case TARGET(YIELD_VALUE): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002083 retval = POP();
Yury Selivanoveb636452016-09-08 22:01:51 -07002084
2085 if (co->co_flags & CO_ASYNC_GENERATOR) {
2086 PyObject *w = _PyAsyncGenValueWrapperNew(retval);
2087 Py_DECREF(retval);
2088 if (w == NULL) {
2089 retval = NULL;
2090 goto error;
2091 }
2092 retval = w;
2093 }
2094
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002095 f->f_stacktop = stack_pointer;
Pablo Galindof00828a2019-05-09 16:52:02 +01002096 goto exit_yielding;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002097 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002098
Benjamin Petersonddd19492018-09-16 22:38:02 -07002099 case TARGET(POP_EXCEPT): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002100 PyObject *type, *value, *traceback;
2101 _PyErr_StackItem *exc_info;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002102 PyTryBlock *b = PyFrame_BlockPop(f);
2103 if (b->b_type != EXCEPT_HANDLER) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002104 _PyErr_SetString(tstate, PyExc_SystemError,
2105 "popped block is not an except handler");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002106 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002107 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002108 assert(STACK_LEVEL() >= (b)->b_level + 3 &&
2109 STACK_LEVEL() <= (b)->b_level + 4);
2110 exc_info = tstate->exc_info;
2111 type = exc_info->exc_type;
2112 value = exc_info->exc_value;
2113 traceback = exc_info->exc_traceback;
2114 exc_info->exc_type = POP();
2115 exc_info->exc_value = POP();
2116 exc_info->exc_traceback = POP();
2117 Py_XDECREF(type);
2118 Py_XDECREF(value);
2119 Py_XDECREF(traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002120 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002121 }
Benjamin Petersoneec3d712008-06-11 15:59:43 +00002122
Benjamin Petersonddd19492018-09-16 22:38:02 -07002123 case TARGET(POP_BLOCK): {
2124 PREDICTED(POP_BLOCK);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002125 PyFrame_BlockPop(f);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002126 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002127 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002128
Benjamin Petersonddd19492018-09-16 22:38:02 -07002129 case TARGET(POP_FINALLY): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002130 /* If oparg is 0 at the top of the stack are 1 or 6 values:
2131 Either:
2132 - TOP = NULL or an integer
2133 or:
2134 - (TOP, SECOND, THIRD) = exc_info()
2135 - (FOURTH, FITH, SIXTH) = previous exception for EXCEPT_HANDLER
2136
2137 If oparg is 1 the value for 'return' was additionally pushed
2138 at the top of the stack.
2139 */
2140 PyObject *res = NULL;
2141 if (oparg) {
2142 res = POP();
2143 }
2144 PyObject *exc = POP();
2145 if (exc == NULL || PyLong_CheckExact(exc)) {
2146 Py_XDECREF(exc);
2147 }
2148 else {
2149 Py_DECREF(exc);
2150 Py_DECREF(POP());
2151 Py_DECREF(POP());
2152
2153 PyObject *type, *value, *traceback;
2154 _PyErr_StackItem *exc_info;
2155 PyTryBlock *b = PyFrame_BlockPop(f);
2156 if (b->b_type != EXCEPT_HANDLER) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002157 _PyErr_SetString(tstate, PyExc_SystemError,
2158 "popped block is not an except handler");
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002159 Py_XDECREF(res);
2160 goto error;
2161 }
2162 assert(STACK_LEVEL() == (b)->b_level + 3);
2163 exc_info = tstate->exc_info;
2164 type = exc_info->exc_type;
2165 value = exc_info->exc_value;
2166 traceback = exc_info->exc_traceback;
2167 exc_info->exc_type = POP();
2168 exc_info->exc_value = POP();
2169 exc_info->exc_traceback = POP();
2170 Py_XDECREF(type);
2171 Py_XDECREF(value);
2172 Py_XDECREF(traceback);
2173 }
2174 if (oparg) {
2175 PUSH(res);
2176 }
2177 DISPATCH();
2178 }
2179
Benjamin Petersonddd19492018-09-16 22:38:02 -07002180 case TARGET(CALL_FINALLY): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002181 PyObject *ret = PyLong_FromLong(INSTR_OFFSET());
2182 if (ret == NULL) {
2183 goto error;
2184 }
2185 PUSH(ret);
2186 JUMPBY(oparg);
2187 FAST_DISPATCH();
2188 }
2189
Benjamin Petersonddd19492018-09-16 22:38:02 -07002190 case TARGET(BEGIN_FINALLY): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002191 /* Push NULL onto the stack for using it in END_FINALLY,
2192 POP_FINALLY, WITH_CLEANUP_START and WITH_CLEANUP_FINISH.
2193 */
2194 PUSH(NULL);
2195 FAST_DISPATCH();
2196 }
2197
Benjamin Petersonddd19492018-09-16 22:38:02 -07002198 case TARGET(END_FINALLY): {
2199 PREDICTED(END_FINALLY);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002200 /* At the top of the stack are 1 or 6 values:
2201 Either:
2202 - TOP = NULL or an integer
2203 or:
2204 - (TOP, SECOND, THIRD) = exc_info()
2205 - (FOURTH, FITH, SIXTH) = previous exception for EXCEPT_HANDLER
2206 */
2207 PyObject *exc = POP();
2208 if (exc == NULL) {
2209 FAST_DISPATCH();
2210 }
2211 else if (PyLong_CheckExact(exc)) {
2212 int ret = _PyLong_AsInt(exc);
2213 Py_DECREF(exc);
Victor Stinner438a12d2019-05-24 17:01:38 +02002214 if (ret == -1 && _PyErr_Occurred(tstate)) {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002215 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002216 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002217 JUMPTO(ret);
2218 FAST_DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002219 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002220 else {
2221 assert(PyExceptionClass_Check(exc));
2222 PyObject *val = POP();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002223 PyObject *tb = POP();
Victor Stinner438a12d2019-05-24 17:01:38 +02002224 _PyErr_Restore(tstate, exc, val, tb);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002225 goto exception_unwind;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002226 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002227 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002228
Benjamin Petersonddd19492018-09-16 22:38:02 -07002229 case TARGET(END_ASYNC_FOR): {
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002230 PyObject *exc = POP();
2231 assert(PyExceptionClass_Check(exc));
2232 if (PyErr_GivenExceptionMatches(exc, PyExc_StopAsyncIteration)) {
2233 PyTryBlock *b = PyFrame_BlockPop(f);
2234 assert(b->b_type == EXCEPT_HANDLER);
2235 Py_DECREF(exc);
2236 UNWIND_EXCEPT_HANDLER(b);
2237 Py_DECREF(POP());
2238 JUMPBY(oparg);
2239 FAST_DISPATCH();
2240 }
2241 else {
2242 PyObject *val = POP();
2243 PyObject *tb = POP();
Victor Stinner438a12d2019-05-24 17:01:38 +02002244 _PyErr_Restore(tstate, exc, val, tb);
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002245 goto exception_unwind;
2246 }
2247 }
2248
Benjamin Petersonddd19492018-09-16 22:38:02 -07002249 case TARGET(LOAD_BUILD_CLASS): {
Victor Stinner3c1e4812012-03-26 22:10:51 +02002250 _Py_IDENTIFIER(__build_class__);
Victor Stinnerb0b22422012-04-19 00:57:45 +02002251
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002252 PyObject *bc;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002253 if (PyDict_CheckExact(f->f_builtins)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002254 bc = _PyDict_GetItemIdWithError(f->f_builtins, &PyId___build_class__);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002255 if (bc == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002256 if (!_PyErr_Occurred(tstate)) {
2257 _PyErr_SetString(tstate, PyExc_NameError,
2258 "__build_class__ not found");
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002259 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002260 goto error;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002261 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002262 Py_INCREF(bc);
Victor Stinnerb0b22422012-04-19 00:57:45 +02002263 }
2264 else {
2265 PyObject *build_class_str = _PyUnicode_FromId(&PyId___build_class__);
2266 if (build_class_str == NULL)
Serhiy Storchaka70b72f02016-11-08 23:12:46 +02002267 goto error;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002268 bc = PyObject_GetItem(f->f_builtins, build_class_str);
2269 if (bc == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002270 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError))
2271 _PyErr_SetString(tstate, PyExc_NameError,
2272 "__build_class__ not found");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002273 goto error;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002274 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002275 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002276 PUSH(bc);
Benjamin Peterson00f86f22012-10-10 14:10:33 -04002277 DISPATCH();
Victor Stinner3c1e4812012-03-26 22:10:51 +02002278 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002279
Benjamin Petersonddd19492018-09-16 22:38:02 -07002280 case TARGET(STORE_NAME): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002281 PyObject *name = GETITEM(names, oparg);
2282 PyObject *v = POP();
2283 PyObject *ns = f->f_locals;
2284 int err;
2285 if (ns == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002286 _PyErr_Format(tstate, PyExc_SystemError,
2287 "no locals found when storing %R", name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002288 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002289 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002290 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002291 if (PyDict_CheckExact(ns))
2292 err = PyDict_SetItem(ns, name, v);
2293 else
2294 err = PyObject_SetItem(ns, name, v);
2295 Py_DECREF(v);
2296 if (err != 0)
2297 goto error;
2298 DISPATCH();
2299 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002300
Benjamin Petersonddd19492018-09-16 22:38:02 -07002301 case TARGET(DELETE_NAME): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002302 PyObject *name = GETITEM(names, oparg);
2303 PyObject *ns = f->f_locals;
2304 int err;
2305 if (ns == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002306 _PyErr_Format(tstate, PyExc_SystemError,
2307 "no locals when deleting %R", name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002308 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002309 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002310 err = PyObject_DelItem(ns, name);
2311 if (err != 0) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002312 format_exc_check_arg(tstate, PyExc_NameError,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002313 NAME_ERROR_MSG,
2314 name);
2315 goto error;
2316 }
2317 DISPATCH();
2318 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00002319
Benjamin Petersonddd19492018-09-16 22:38:02 -07002320 case TARGET(UNPACK_SEQUENCE): {
2321 PREDICTED(UNPACK_SEQUENCE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002322 PyObject *seq = POP(), *item, **items;
2323 if (PyTuple_CheckExact(seq) &&
2324 PyTuple_GET_SIZE(seq) == oparg) {
2325 items = ((PyTupleObject *)seq)->ob_item;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002326 while (oparg--) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002327 item = items[oparg];
2328 Py_INCREF(item);
2329 PUSH(item);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002330 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002331 } else if (PyList_CheckExact(seq) &&
2332 PyList_GET_SIZE(seq) == oparg) {
2333 items = ((PyListObject *)seq)->ob_item;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002334 while (oparg--) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002335 item = items[oparg];
2336 Py_INCREF(item);
2337 PUSH(item);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002338 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002339 } else if (unpack_iterable(tstate, seq, oparg, -1,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002340 stack_pointer + oparg)) {
costypetrisor8ed317f2018-07-31 20:55:14 +00002341 STACK_GROW(oparg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002342 } else {
2343 /* unpack_iterable() raised an exception */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002344 Py_DECREF(seq);
2345 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002346 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002347 Py_DECREF(seq);
Benjamin Peterson00f86f22012-10-10 14:10:33 -04002348 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002349 }
Guido van Rossum0368b722007-05-11 16:50:42 +00002350
Benjamin Petersonddd19492018-09-16 22:38:02 -07002351 case TARGET(UNPACK_EX): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002352 int totalargs = 1 + (oparg & 0xFF) + (oparg >> 8);
2353 PyObject *seq = POP();
2354
Victor Stinner438a12d2019-05-24 17:01:38 +02002355 if (unpack_iterable(tstate, seq, oparg & 0xFF, oparg >> 8,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002356 stack_pointer + totalargs)) {
2357 stack_pointer += totalargs;
2358 } else {
2359 Py_DECREF(seq);
2360 goto error;
2361 }
2362 Py_DECREF(seq);
2363 DISPATCH();
2364 }
2365
Benjamin Petersonddd19492018-09-16 22:38:02 -07002366 case TARGET(STORE_ATTR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002367 PyObject *name = GETITEM(names, oparg);
2368 PyObject *owner = TOP();
2369 PyObject *v = SECOND();
2370 int err;
costypetrisor8ed317f2018-07-31 20:55:14 +00002371 STACK_SHRINK(2);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002372 err = PyObject_SetAttr(owner, name, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002373 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002374 Py_DECREF(owner);
2375 if (err != 0)
2376 goto error;
2377 DISPATCH();
2378 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002379
Benjamin Petersonddd19492018-09-16 22:38:02 -07002380 case TARGET(DELETE_ATTR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002381 PyObject *name = GETITEM(names, oparg);
2382 PyObject *owner = POP();
2383 int err;
2384 err = PyObject_SetAttr(owner, name, (PyObject *)NULL);
2385 Py_DECREF(owner);
2386 if (err != 0)
2387 goto error;
2388 DISPATCH();
2389 }
2390
Benjamin Petersonddd19492018-09-16 22:38:02 -07002391 case TARGET(STORE_GLOBAL): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002392 PyObject *name = GETITEM(names, oparg);
2393 PyObject *v = POP();
2394 int err;
2395 err = PyDict_SetItem(f->f_globals, name, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002396 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002397 if (err != 0)
2398 goto error;
2399 DISPATCH();
2400 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002401
Benjamin Petersonddd19492018-09-16 22:38:02 -07002402 case TARGET(DELETE_GLOBAL): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002403 PyObject *name = GETITEM(names, oparg);
2404 int err;
2405 err = PyDict_DelItem(f->f_globals, name);
2406 if (err != 0) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002407 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
2408 format_exc_check_arg(tstate, PyExc_NameError,
2409 NAME_ERROR_MSG, name);
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002410 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002411 goto error;
Benjamin Peterson00f86f22012-10-10 14:10:33 -04002412 }
2413 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002414 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002415
Benjamin Petersonddd19492018-09-16 22:38:02 -07002416 case TARGET(LOAD_NAME): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002417 PyObject *name = GETITEM(names, oparg);
2418 PyObject *locals = f->f_locals;
2419 PyObject *v;
2420 if (locals == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002421 _PyErr_Format(tstate, PyExc_SystemError,
2422 "no locals when loading %R", name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002423 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002424 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002425 if (PyDict_CheckExact(locals)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002426 v = PyDict_GetItemWithError(locals, name);
2427 if (v != NULL) {
2428 Py_INCREF(v);
2429 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002430 else if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002431 goto error;
2432 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002433 }
2434 else {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002435 v = PyObject_GetItem(locals, name);
Victor Stinnere20310f2015-11-05 13:56:58 +01002436 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002437 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError))
Benjamin Peterson92722792012-12-15 12:51:05 -05002438 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02002439 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002440 }
2441 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002442 if (v == NULL) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002443 v = PyDict_GetItemWithError(f->f_globals, name);
2444 if (v != NULL) {
2445 Py_INCREF(v);
2446 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002447 else if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002448 goto error;
2449 }
2450 else {
Victor Stinnerb0b22422012-04-19 00:57:45 +02002451 if (PyDict_CheckExact(f->f_builtins)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002452 v = PyDict_GetItemWithError(f->f_builtins, name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002453 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002454 if (!_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002455 format_exc_check_arg(
Victor Stinner438a12d2019-05-24 17:01:38 +02002456 tstate, PyExc_NameError,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002457 NAME_ERROR_MSG, name);
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002458 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002459 goto error;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002460 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002461 Py_INCREF(v);
Victor Stinnerb0b22422012-04-19 00:57:45 +02002462 }
2463 else {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002464 v = PyObject_GetItem(f->f_builtins, name);
2465 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002466 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Victor Stinnerb0b22422012-04-19 00:57:45 +02002467 format_exc_check_arg(
Victor Stinner438a12d2019-05-24 17:01:38 +02002468 tstate, PyExc_NameError,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002469 NAME_ERROR_MSG, name);
Victor Stinner438a12d2019-05-24 17:01:38 +02002470 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002471 goto error;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002472 }
Benjamin Peterson20f9c3c2010-07-20 22:39:34 +00002473 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002474 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002475 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002476 PUSH(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002477 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002478 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002479
Benjamin Petersonddd19492018-09-16 22:38:02 -07002480 case TARGET(LOAD_GLOBAL): {
Inada Naoki91234a12019-06-03 21:30:58 +09002481 PyObject *name;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002482 PyObject *v;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002483 if (PyDict_CheckExact(f->f_globals)
Victor Stinnerb4efc962015-11-20 09:24:02 +01002484 && PyDict_CheckExact(f->f_builtins))
2485 {
Inada Naoki91234a12019-06-03 21:30:58 +09002486 OPCACHE_CHECK();
2487 if (co_opcache != NULL && co_opcache->optimized > 0) {
2488 _PyOpcache_LoadGlobal *lg = &co_opcache->u.lg;
2489
2490 if (lg->globals_ver ==
2491 ((PyDictObject *)f->f_globals)->ma_version_tag
2492 && lg->builtins_ver ==
2493 ((PyDictObject *)f->f_builtins)->ma_version_tag)
2494 {
2495 PyObject *ptr = lg->ptr;
2496 OPCACHE_STAT_GLOBAL_HIT();
2497 assert(ptr != NULL);
2498 Py_INCREF(ptr);
2499 PUSH(ptr);
2500 DISPATCH();
2501 }
2502 }
2503
2504 name = GETITEM(names, oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002505 v = _PyDict_LoadGlobal((PyDictObject *)f->f_globals,
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002506 (PyDictObject *)f->f_builtins,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002507 name);
2508 if (v == NULL) {
Victor Stinnerb4efc962015-11-20 09:24:02 +01002509 if (!_PyErr_OCCURRED()) {
2510 /* _PyDict_LoadGlobal() returns NULL without raising
2511 * an exception if the key doesn't exist */
Victor Stinner438a12d2019-05-24 17:01:38 +02002512 format_exc_check_arg(tstate, PyExc_NameError,
Ezio Melotti04a29552013-03-03 15:12:44 +02002513 NAME_ERROR_MSG, name);
Victor Stinnerb4efc962015-11-20 09:24:02 +01002514 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002515 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002516 }
Inada Naoki91234a12019-06-03 21:30:58 +09002517
2518 if (co_opcache != NULL) {
2519 _PyOpcache_LoadGlobal *lg = &co_opcache->u.lg;
2520
2521 if (co_opcache->optimized == 0) {
2522 /* Wasn't optimized before. */
2523 OPCACHE_STAT_GLOBAL_OPT();
2524 } else {
2525 OPCACHE_STAT_GLOBAL_MISS();
2526 }
2527
2528 co_opcache->optimized = 1;
2529 lg->globals_ver =
2530 ((PyDictObject *)f->f_globals)->ma_version_tag;
2531 lg->builtins_ver =
2532 ((PyDictObject *)f->f_builtins)->ma_version_tag;
2533 lg->ptr = v; /* borrowed */
2534 }
2535
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002536 Py_INCREF(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002537 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002538 else {
2539 /* Slow-path if globals or builtins is not a dict */
Victor Stinnerb4efc962015-11-20 09:24:02 +01002540
2541 /* namespace 1: globals */
Inada Naoki91234a12019-06-03 21:30:58 +09002542 name = GETITEM(names, oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002543 v = PyObject_GetItem(f->f_globals, name);
2544 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002545 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Victor Stinner60a1d3c2015-11-05 13:55:20 +01002546 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02002547 }
2548 _PyErr_Clear(tstate);
Victor Stinner60a1d3c2015-11-05 13:55:20 +01002549
Victor Stinnerb4efc962015-11-20 09:24:02 +01002550 /* namespace 2: builtins */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002551 v = PyObject_GetItem(f->f_builtins, name);
2552 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002553 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002554 format_exc_check_arg(
Victor Stinner438a12d2019-05-24 17:01:38 +02002555 tstate, PyExc_NameError,
Ezio Melotti04a29552013-03-03 15:12:44 +02002556 NAME_ERROR_MSG, name);
Victor Stinner438a12d2019-05-24 17:01:38 +02002557 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002558 goto error;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002559 }
2560 }
2561 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002562 PUSH(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002563 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002564 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002565
Benjamin Petersonddd19492018-09-16 22:38:02 -07002566 case TARGET(DELETE_FAST): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002567 PyObject *v = GETLOCAL(oparg);
2568 if (v != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002569 SETLOCAL(oparg, NULL);
2570 DISPATCH();
2571 }
2572 format_exc_check_arg(
Victor Stinner438a12d2019-05-24 17:01:38 +02002573 tstate, PyExc_UnboundLocalError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002574 UNBOUNDLOCAL_ERROR_MSG,
2575 PyTuple_GetItem(co->co_varnames, oparg)
2576 );
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002577 goto error;
2578 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002579
Benjamin Petersonddd19492018-09-16 22:38:02 -07002580 case TARGET(DELETE_DEREF): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002581 PyObject *cell = freevars[oparg];
Raymond Hettingerc32f9db2016-11-12 04:10:35 -05002582 PyObject *oldobj = PyCell_GET(cell);
2583 if (oldobj != NULL) {
2584 PyCell_SET(cell, NULL);
2585 Py_DECREF(oldobj);
Benjamin Peterson00ebe2c2010-09-10 22:02:31 +00002586 DISPATCH();
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00002587 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002588 format_exc_unbound(tstate, co, oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002589 goto error;
2590 }
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00002591
Benjamin Petersonddd19492018-09-16 22:38:02 -07002592 case TARGET(LOAD_CLOSURE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002593 PyObject *cell = freevars[oparg];
2594 Py_INCREF(cell);
2595 PUSH(cell);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002596 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002597 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002598
Benjamin Petersonddd19492018-09-16 22:38:02 -07002599 case TARGET(LOAD_CLASSDEREF): {
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002600 PyObject *name, *value, *locals = f->f_locals;
Victor Stinnerd3dfd0e2013-05-16 23:48:01 +02002601 Py_ssize_t idx;
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002602 assert(locals);
2603 assert(oparg >= PyTuple_GET_SIZE(co->co_cellvars));
2604 idx = oparg - PyTuple_GET_SIZE(co->co_cellvars);
2605 assert(idx >= 0 && idx < PyTuple_GET_SIZE(co->co_freevars));
2606 name = PyTuple_GET_ITEM(co->co_freevars, idx);
2607 if (PyDict_CheckExact(locals)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002608 value = PyDict_GetItemWithError(locals, name);
2609 if (value != NULL) {
2610 Py_INCREF(value);
2611 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002612 else if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002613 goto error;
2614 }
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002615 }
2616 else {
2617 value = PyObject_GetItem(locals, name);
Victor Stinnere20310f2015-11-05 13:56:58 +01002618 if (value == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002619 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002620 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02002621 }
2622 _PyErr_Clear(tstate);
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002623 }
2624 }
2625 if (!value) {
2626 PyObject *cell = freevars[oparg];
2627 value = PyCell_GET(cell);
2628 if (value == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002629 format_exc_unbound(tstate, co, oparg);
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002630 goto error;
2631 }
2632 Py_INCREF(value);
2633 }
2634 PUSH(value);
2635 DISPATCH();
2636 }
2637
Benjamin Petersonddd19492018-09-16 22:38:02 -07002638 case TARGET(LOAD_DEREF): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002639 PyObject *cell = freevars[oparg];
2640 PyObject *value = PyCell_GET(cell);
2641 if (value == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002642 format_exc_unbound(tstate, co, oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002643 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002644 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002645 Py_INCREF(value);
2646 PUSH(value);
2647 DISPATCH();
2648 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002649
Benjamin Petersonddd19492018-09-16 22:38:02 -07002650 case TARGET(STORE_DEREF): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002651 PyObject *v = POP();
2652 PyObject *cell = freevars[oparg];
Raymond Hettingerb2b15432016-11-11 04:32:11 -08002653 PyObject *oldobj = PyCell_GET(cell);
2654 PyCell_SET(cell, v);
2655 Py_XDECREF(oldobj);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002656 DISPATCH();
2657 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002658
Benjamin Petersonddd19492018-09-16 22:38:02 -07002659 case TARGET(BUILD_STRING): {
Serhiy Storchakaea525a22016-09-06 22:07:53 +03002660 PyObject *str;
2661 PyObject *empty = PyUnicode_New(0, 0);
2662 if (empty == NULL) {
2663 goto error;
2664 }
2665 str = _PyUnicode_JoinArray(empty, stack_pointer - oparg, oparg);
2666 Py_DECREF(empty);
2667 if (str == NULL)
2668 goto error;
2669 while (--oparg >= 0) {
2670 PyObject *item = POP();
2671 Py_DECREF(item);
2672 }
2673 PUSH(str);
2674 DISPATCH();
2675 }
2676
Benjamin Petersonddd19492018-09-16 22:38:02 -07002677 case TARGET(BUILD_TUPLE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002678 PyObject *tup = PyTuple_New(oparg);
2679 if (tup == NULL)
2680 goto error;
2681 while (--oparg >= 0) {
2682 PyObject *item = POP();
2683 PyTuple_SET_ITEM(tup, oparg, item);
2684 }
2685 PUSH(tup);
2686 DISPATCH();
2687 }
2688
Benjamin Petersonddd19492018-09-16 22:38:02 -07002689 case TARGET(BUILD_LIST): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002690 PyObject *list = PyList_New(oparg);
2691 if (list == NULL)
2692 goto error;
2693 while (--oparg >= 0) {
2694 PyObject *item = POP();
2695 PyList_SET_ITEM(list, oparg, item);
2696 }
2697 PUSH(list);
2698 DISPATCH();
2699 }
2700
Benjamin Petersonddd19492018-09-16 22:38:02 -07002701 case TARGET(BUILD_TUPLE_UNPACK_WITH_CALL):
2702 case TARGET(BUILD_TUPLE_UNPACK):
2703 case TARGET(BUILD_LIST_UNPACK): {
Serhiy Storchaka73442852016-10-02 10:33:46 +03002704 int convert_to_tuple = opcode != BUILD_LIST_UNPACK;
Victor Stinner74319ae2016-08-25 00:04:09 +02002705 Py_ssize_t i;
Serhiy Storchakab7281052016-09-12 00:52:40 +03002706 PyObject *sum = PyList_New(0);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002707 PyObject *return_value;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07002708
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002709 if (sum == NULL)
2710 goto error;
2711
2712 for (i = oparg; i > 0; i--) {
2713 PyObject *none_val;
2714
2715 none_val = _PyList_Extend((PyListObject *)sum, PEEK(i));
2716 if (none_val == NULL) {
Serhiy Storchaka73442852016-10-02 10:33:46 +03002717 if (opcode == BUILD_TUPLE_UNPACK_WITH_CALL &&
Victor Stinner438a12d2019-05-24 17:01:38 +02002718 _PyErr_ExceptionMatches(tstate, PyExc_TypeError))
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03002719 {
Victor Stinner438a12d2019-05-24 17:01:38 +02002720 check_args_iterable(tstate, PEEK(1 + oparg), PEEK(i));
Serhiy Storchaka73442852016-10-02 10:33:46 +03002721 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002722 Py_DECREF(sum);
2723 goto error;
2724 }
2725 Py_DECREF(none_val);
2726 }
2727
2728 if (convert_to_tuple) {
2729 return_value = PyList_AsTuple(sum);
2730 Py_DECREF(sum);
2731 if (return_value == NULL)
2732 goto error;
2733 }
2734 else {
2735 return_value = sum;
2736 }
2737
2738 while (oparg--)
2739 Py_DECREF(POP());
2740 PUSH(return_value);
2741 DISPATCH();
2742 }
2743
Benjamin Petersonddd19492018-09-16 22:38:02 -07002744 case TARGET(BUILD_SET): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002745 PyObject *set = PySet_New(NULL);
2746 int err = 0;
Raymond Hettinger4c483ad2016-09-08 14:45:40 -07002747 int i;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002748 if (set == NULL)
2749 goto error;
Raymond Hettinger4c483ad2016-09-08 14:45:40 -07002750 for (i = oparg; i > 0; i--) {
2751 PyObject *item = PEEK(i);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002752 if (err == 0)
2753 err = PySet_Add(set, item);
2754 Py_DECREF(item);
2755 }
costypetrisor8ed317f2018-07-31 20:55:14 +00002756 STACK_SHRINK(oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002757 if (err != 0) {
2758 Py_DECREF(set);
2759 goto error;
2760 }
2761 PUSH(set);
2762 DISPATCH();
2763 }
2764
Benjamin Petersonddd19492018-09-16 22:38:02 -07002765 case TARGET(BUILD_SET_UNPACK): {
Victor Stinner74319ae2016-08-25 00:04:09 +02002766 Py_ssize_t i;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002767 PyObject *sum = PySet_New(NULL);
2768 if (sum == NULL)
2769 goto error;
2770
2771 for (i = oparg; i > 0; i--) {
2772 if (_PySet_Update(sum, PEEK(i)) < 0) {
2773 Py_DECREF(sum);
2774 goto error;
2775 }
2776 }
2777
2778 while (oparg--)
2779 Py_DECREF(POP());
2780 PUSH(sum);
2781 DISPATCH();
2782 }
2783
Benjamin Petersonddd19492018-09-16 22:38:02 -07002784 case TARGET(BUILD_MAP): {
Victor Stinner74319ae2016-08-25 00:04:09 +02002785 Py_ssize_t i;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002786 PyObject *map = _PyDict_NewPresized((Py_ssize_t)oparg);
2787 if (map == NULL)
2788 goto error;
Benjamin Petersond5d77aa2015-07-05 10:37:25 -05002789 for (i = oparg; i > 0; i--) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002790 int err;
Benjamin Petersond5d77aa2015-07-05 10:37:25 -05002791 PyObject *key = PEEK(2*i);
2792 PyObject *value = PEEK(2*i - 1);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002793 err = PyDict_SetItem(map, key, value);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002794 if (err != 0) {
2795 Py_DECREF(map);
2796 goto error;
2797 }
2798 }
Benjamin Petersond5d77aa2015-07-05 10:37:25 -05002799
2800 while (oparg--) {
2801 Py_DECREF(POP());
2802 Py_DECREF(POP());
2803 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002804 PUSH(map);
2805 DISPATCH();
2806 }
2807
Benjamin Petersonddd19492018-09-16 22:38:02 -07002808 case TARGET(SETUP_ANNOTATIONS): {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002809 _Py_IDENTIFIER(__annotations__);
2810 int err;
2811 PyObject *ann_dict;
2812 if (f->f_locals == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002813 _PyErr_Format(tstate, PyExc_SystemError,
2814 "no locals found when setting up annotations");
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002815 goto error;
2816 }
2817 /* check if __annotations__ in locals()... */
2818 if (PyDict_CheckExact(f->f_locals)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002819 ann_dict = _PyDict_GetItemIdWithError(f->f_locals,
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002820 &PyId___annotations__);
2821 if (ann_dict == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002822 if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002823 goto error;
2824 }
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002825 /* ...if not, create a new one */
2826 ann_dict = PyDict_New();
2827 if (ann_dict == NULL) {
2828 goto error;
2829 }
2830 err = _PyDict_SetItemId(f->f_locals,
2831 &PyId___annotations__, ann_dict);
2832 Py_DECREF(ann_dict);
2833 if (err != 0) {
2834 goto error;
2835 }
2836 }
2837 }
2838 else {
2839 /* do the same if locals() is not a dict */
2840 PyObject *ann_str = _PyUnicode_FromId(&PyId___annotations__);
2841 if (ann_str == NULL) {
Serhiy Storchaka4678b2f2016-11-08 23:13:36 +02002842 goto error;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002843 }
2844 ann_dict = PyObject_GetItem(f->f_locals, ann_str);
2845 if (ann_dict == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002846 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002847 goto error;
2848 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002849 _PyErr_Clear(tstate);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002850 ann_dict = PyDict_New();
2851 if (ann_dict == NULL) {
2852 goto error;
2853 }
2854 err = PyObject_SetItem(f->f_locals, ann_str, ann_dict);
2855 Py_DECREF(ann_dict);
2856 if (err != 0) {
2857 goto error;
2858 }
2859 }
2860 else {
2861 Py_DECREF(ann_dict);
2862 }
2863 }
2864 DISPATCH();
2865 }
2866
Benjamin Petersonddd19492018-09-16 22:38:02 -07002867 case TARGET(BUILD_CONST_KEY_MAP): {
Victor Stinner74319ae2016-08-25 00:04:09 +02002868 Py_ssize_t i;
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03002869 PyObject *map;
2870 PyObject *keys = TOP();
2871 if (!PyTuple_CheckExact(keys) ||
2872 PyTuple_GET_SIZE(keys) != (Py_ssize_t)oparg) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002873 _PyErr_SetString(tstate, PyExc_SystemError,
2874 "bad BUILD_CONST_KEY_MAP keys argument");
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03002875 goto error;
2876 }
2877 map = _PyDict_NewPresized((Py_ssize_t)oparg);
2878 if (map == NULL) {
2879 goto error;
2880 }
2881 for (i = oparg; i > 0; i--) {
2882 int err;
2883 PyObject *key = PyTuple_GET_ITEM(keys, oparg - i);
2884 PyObject *value = PEEK(i + 1);
2885 err = PyDict_SetItem(map, key, value);
2886 if (err != 0) {
2887 Py_DECREF(map);
2888 goto error;
2889 }
2890 }
2891
2892 Py_DECREF(POP());
2893 while (oparg--) {
2894 Py_DECREF(POP());
2895 }
2896 PUSH(map);
2897 DISPATCH();
2898 }
2899
Benjamin Petersonddd19492018-09-16 22:38:02 -07002900 case TARGET(BUILD_MAP_UNPACK): {
Victor Stinner74319ae2016-08-25 00:04:09 +02002901 Py_ssize_t i;
Serhiy Storchakab7281052016-09-12 00:52:40 +03002902 PyObject *sum = PyDict_New();
Victor Stinnerf9b760f2016-09-09 10:17:08 -07002903 if (sum == NULL)
2904 goto error;
2905
2906 for (i = oparg; i > 0; i--) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002907 PyObject *arg = PEEK(i);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002908 if (PyDict_Update(sum, arg) < 0) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002909 if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) {
2910 _PyErr_Format(tstate, PyExc_TypeError,
2911 "'%.200s' object is not a mapping",
2912 arg->ob_type->tp_name);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002913 }
2914 Py_DECREF(sum);
2915 goto error;
2916 }
2917 }
2918
Victor Stinnerf9b760f2016-09-09 10:17:08 -07002919 while (oparg--)
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002920 Py_DECREF(POP());
2921 PUSH(sum);
2922 DISPATCH();
2923 }
2924
Benjamin Petersonddd19492018-09-16 22:38:02 -07002925 case TARGET(BUILD_MAP_UNPACK_WITH_CALL): {
Serhiy Storchakae036ef82016-10-02 11:06:43 +03002926 Py_ssize_t i;
2927 PyObject *sum = PyDict_New();
2928 if (sum == NULL)
2929 goto error;
2930
2931 for (i = oparg; i > 0; i--) {
2932 PyObject *arg = PEEK(i);
2933 if (_PyDict_MergeEx(sum, arg, 2) < 0) {
Serhiy Storchakae036ef82016-10-02 11:06:43 +03002934 Py_DECREF(sum);
Victor Stinner438a12d2019-05-24 17:01:38 +02002935 format_kwargs_error(tstate, PEEK(2 + oparg), arg);
Serhiy Storchakae036ef82016-10-02 11:06:43 +03002936 goto error;
2937 }
2938 }
2939
2940 while (oparg--)
2941 Py_DECREF(POP());
2942 PUSH(sum);
2943 DISPATCH();
2944 }
2945
Benjamin Petersonddd19492018-09-16 22:38:02 -07002946 case TARGET(MAP_ADD): {
Miss Islington (bot)874ff652019-06-22 15:34:03 -07002947 PyObject *value = TOP();
2948 PyObject *key = SECOND();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002949 PyObject *map;
2950 int err;
costypetrisor8ed317f2018-07-31 20:55:14 +00002951 STACK_SHRINK(2);
Raymond Hettinger41862222016-10-15 19:03:06 -07002952 map = PEEK(oparg); /* dict */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002953 assert(PyDict_CheckExact(map));
Martin Panter95f53c12016-07-18 08:23:26 +00002954 err = PyDict_SetItem(map, key, value); /* map[key] = value */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002955 Py_DECREF(value);
2956 Py_DECREF(key);
2957 if (err != 0)
2958 goto error;
2959 PREDICT(JUMP_ABSOLUTE);
2960 DISPATCH();
2961 }
2962
Benjamin Petersonddd19492018-09-16 22:38:02 -07002963 case TARGET(LOAD_ATTR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002964 PyObject *name = GETITEM(names, oparg);
2965 PyObject *owner = TOP();
2966 PyObject *res = PyObject_GetAttr(owner, name);
2967 Py_DECREF(owner);
2968 SET_TOP(res);
2969 if (res == NULL)
2970 goto error;
2971 DISPATCH();
2972 }
2973
Benjamin Petersonddd19492018-09-16 22:38:02 -07002974 case TARGET(COMPARE_OP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002975 PyObject *right = POP();
2976 PyObject *left = TOP();
Victor Stinner438a12d2019-05-24 17:01:38 +02002977 PyObject *res = cmp_outcome(tstate, oparg, left, right);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002978 Py_DECREF(left);
2979 Py_DECREF(right);
2980 SET_TOP(res);
2981 if (res == NULL)
2982 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002983 PREDICT(POP_JUMP_IF_FALSE);
2984 PREDICT(POP_JUMP_IF_TRUE);
2985 DISPATCH();
Victor Stinner3c1e4812012-03-26 22:10:51 +02002986 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002987
Benjamin Petersonddd19492018-09-16 22:38:02 -07002988 case TARGET(IMPORT_NAME): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002989 PyObject *name = GETITEM(names, oparg);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03002990 PyObject *fromlist = POP();
2991 PyObject *level = TOP();
2992 PyObject *res;
Victor Stinner438a12d2019-05-24 17:01:38 +02002993 res = import_name(tstate, f, name, fromlist, level);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03002994 Py_DECREF(level);
2995 Py_DECREF(fromlist);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002996 SET_TOP(res);
2997 if (res == NULL)
2998 goto error;
2999 DISPATCH();
3000 }
3001
Benjamin Petersonddd19492018-09-16 22:38:02 -07003002 case TARGET(IMPORT_STAR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003003 PyObject *from = POP(), *locals;
3004 int err;
Matthias Bussonnier160edb42017-02-25 21:58:05 -08003005 if (PyFrame_FastToLocalsWithError(f) < 0) {
3006 Py_DECREF(from);
Victor Stinner41bb43a2013-10-29 01:19:37 +01003007 goto error;
Matthias Bussonnier160edb42017-02-25 21:58:05 -08003008 }
Victor Stinner41bb43a2013-10-29 01:19:37 +01003009
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003010 locals = f->f_locals;
3011 if (locals == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003012 _PyErr_SetString(tstate, PyExc_SystemError,
3013 "no locals found during 'import *'");
Matthias Bussonnier160edb42017-02-25 21:58:05 -08003014 Py_DECREF(from);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003015 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003016 }
Victor Stinner438a12d2019-05-24 17:01:38 +02003017 err = import_all_from(tstate, locals, from);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003018 PyFrame_LocalsToFast(f, 0);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003019 Py_DECREF(from);
3020 if (err != 0)
3021 goto error;
3022 DISPATCH();
3023 }
Guido van Rossum25831651993-05-19 14:50:45 +00003024
Benjamin Petersonddd19492018-09-16 22:38:02 -07003025 case TARGET(IMPORT_FROM): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003026 PyObject *name = GETITEM(names, oparg);
3027 PyObject *from = TOP();
3028 PyObject *res;
Victor Stinner438a12d2019-05-24 17:01:38 +02003029 res = import_from(tstate, from, name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003030 PUSH(res);
3031 if (res == NULL)
3032 goto error;
3033 DISPATCH();
3034 }
Thomas Wouters52152252000-08-17 22:55:00 +00003035
Benjamin Petersonddd19492018-09-16 22:38:02 -07003036 case TARGET(JUMP_FORWARD): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003037 JUMPBY(oparg);
3038 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003039 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003040
Benjamin Petersonddd19492018-09-16 22:38:02 -07003041 case TARGET(POP_JUMP_IF_FALSE): {
3042 PREDICTED(POP_JUMP_IF_FALSE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003043 PyObject *cond = POP();
3044 int err;
3045 if (cond == Py_True) {
3046 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003047 FAST_DISPATCH();
3048 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003049 if (cond == Py_False) {
3050 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003051 JUMPTO(oparg);
3052 FAST_DISPATCH();
3053 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003054 err = PyObject_IsTrue(cond);
3055 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003056 if (err > 0)
Adrian Wielgosik50c28502017-06-23 13:35:41 -07003057 ;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003058 else if (err == 0)
3059 JUMPTO(oparg);
3060 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003061 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003062 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003063 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003064
Benjamin Petersonddd19492018-09-16 22:38:02 -07003065 case TARGET(POP_JUMP_IF_TRUE): {
3066 PREDICTED(POP_JUMP_IF_TRUE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003067 PyObject *cond = POP();
3068 int err;
3069 if (cond == Py_False) {
3070 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003071 FAST_DISPATCH();
3072 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003073 if (cond == Py_True) {
3074 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003075 JUMPTO(oparg);
3076 FAST_DISPATCH();
3077 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003078 err = PyObject_IsTrue(cond);
3079 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003080 if (err > 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003081 JUMPTO(oparg);
3082 }
3083 else if (err == 0)
3084 ;
3085 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003086 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003087 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003088 }
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00003089
Benjamin Petersonddd19492018-09-16 22:38:02 -07003090 case TARGET(JUMP_IF_FALSE_OR_POP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003091 PyObject *cond = TOP();
3092 int err;
3093 if (cond == Py_True) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003094 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003095 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003096 FAST_DISPATCH();
3097 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003098 if (cond == Py_False) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003099 JUMPTO(oparg);
3100 FAST_DISPATCH();
3101 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003102 err = PyObject_IsTrue(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003103 if (err > 0) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003104 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003105 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003106 }
3107 else if (err == 0)
3108 JUMPTO(oparg);
3109 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003110 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003111 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003112 }
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00003113
Benjamin Petersonddd19492018-09-16 22:38:02 -07003114 case TARGET(JUMP_IF_TRUE_OR_POP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003115 PyObject *cond = TOP();
3116 int err;
3117 if (cond == Py_False) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003118 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003119 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003120 FAST_DISPATCH();
3121 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003122 if (cond == Py_True) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003123 JUMPTO(oparg);
3124 FAST_DISPATCH();
3125 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003126 err = PyObject_IsTrue(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003127 if (err > 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003128 JUMPTO(oparg);
3129 }
3130 else if (err == 0) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003131 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003132 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003133 }
3134 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003135 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003136 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003137 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003138
Benjamin Petersonddd19492018-09-16 22:38:02 -07003139 case TARGET(JUMP_ABSOLUTE): {
3140 PREDICTED(JUMP_ABSOLUTE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003141 JUMPTO(oparg);
Guido van Rossum58da9312007-11-10 23:39:45 +00003142#if FAST_LOOPS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003143 /* Enabling this path speeds-up all while and for-loops by bypassing
3144 the per-loop checks for signals. By default, this should be turned-off
3145 because it prevents detection of a control-break in tight loops like
3146 "while 1: pass". Compile with this option turned-on when you need
3147 the speed-up and do not need break checking inside tight loops (ones
3148 that contain only instructions ending with FAST_DISPATCH).
3149 */
3150 FAST_DISPATCH();
Guido van Rossum58da9312007-11-10 23:39:45 +00003151#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003152 DISPATCH();
Guido van Rossum58da9312007-11-10 23:39:45 +00003153#endif
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003154 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003155
Benjamin Petersonddd19492018-09-16 22:38:02 -07003156 case TARGET(GET_ITER): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003157 /* before: [obj]; after [getiter(obj)] */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003158 PyObject *iterable = TOP();
Yury Selivanov5376ba92015-06-22 12:19:30 -04003159 PyObject *iter = PyObject_GetIter(iterable);
3160 Py_DECREF(iterable);
3161 SET_TOP(iter);
3162 if (iter == NULL)
3163 goto error;
3164 PREDICT(FOR_ITER);
Serhiy Storchakada9c5132016-06-27 18:58:57 +03003165 PREDICT(CALL_FUNCTION);
Yury Selivanov5376ba92015-06-22 12:19:30 -04003166 DISPATCH();
3167 }
3168
Benjamin Petersonddd19492018-09-16 22:38:02 -07003169 case TARGET(GET_YIELD_FROM_ITER): {
Yury Selivanov5376ba92015-06-22 12:19:30 -04003170 /* before: [obj]; after [getiter(obj)] */
3171 PyObject *iterable = TOP();
Yury Selivanov75445082015-05-11 22:57:16 -04003172 PyObject *iter;
Yury Selivanov5376ba92015-06-22 12:19:30 -04003173 if (PyCoro_CheckExact(iterable)) {
3174 /* `iterable` is a coroutine */
3175 if (!(co->co_flags & (CO_COROUTINE | CO_ITERABLE_COROUTINE))) {
3176 /* and it is used in a 'yield from' expression of a
3177 regular generator. */
3178 Py_DECREF(iterable);
3179 SET_TOP(NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02003180 _PyErr_SetString(tstate, PyExc_TypeError,
3181 "cannot 'yield from' a coroutine object "
3182 "in a non-coroutine generator");
Yury Selivanov5376ba92015-06-22 12:19:30 -04003183 goto error;
3184 }
3185 }
3186 else if (!PyGen_CheckExact(iterable)) {
Yury Selivanov75445082015-05-11 22:57:16 -04003187 /* `iterable` is not a generator. */
3188 iter = PyObject_GetIter(iterable);
3189 Py_DECREF(iterable);
3190 SET_TOP(iter);
3191 if (iter == NULL)
3192 goto error;
3193 }
Serhiy Storchakada9c5132016-06-27 18:58:57 +03003194 PREDICT(LOAD_CONST);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003195 DISPATCH();
3196 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003197
Benjamin Petersonddd19492018-09-16 22:38:02 -07003198 case TARGET(FOR_ITER): {
3199 PREDICTED(FOR_ITER);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003200 /* before: [iter]; after: [iter, iter()] *or* [] */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003201 PyObject *iter = TOP();
3202 PyObject *next = (*iter->ob_type->tp_iternext)(iter);
3203 if (next != NULL) {
3204 PUSH(next);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003205 PREDICT(STORE_FAST);
3206 PREDICT(UNPACK_SEQUENCE);
3207 DISPATCH();
3208 }
Victor Stinner438a12d2019-05-24 17:01:38 +02003209 if (_PyErr_Occurred(tstate)) {
3210 if (!_PyErr_ExceptionMatches(tstate, PyExc_StopIteration)) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003211 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02003212 }
3213 else if (tstate->c_tracefunc != NULL) {
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003214 call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj, tstate, f);
Victor Stinner438a12d2019-05-24 17:01:38 +02003215 }
3216 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003217 }
3218 /* iterator ended normally */
costypetrisor8ed317f2018-07-31 20:55:14 +00003219 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003220 Py_DECREF(iter);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003221 JUMPBY(oparg);
Serhiy Storchakada9c5132016-06-27 18:58:57 +03003222 PREDICT(POP_BLOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003223 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003224 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003225
Benjamin Petersonddd19492018-09-16 22:38:02 -07003226 case TARGET(SETUP_FINALLY): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003227 /* NOTE: If you add any new block-setup opcodes that
3228 are not try/except/finally handlers, you may need
3229 to update the PyGen_NeedsFinalizing() function.
3230 */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003231
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003232 PyFrame_BlockSetup(f, SETUP_FINALLY, INSTR_OFFSET() + oparg,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003233 STACK_LEVEL());
3234 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003235 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003236
Benjamin Petersonddd19492018-09-16 22:38:02 -07003237 case TARGET(BEFORE_ASYNC_WITH): {
Yury Selivanov75445082015-05-11 22:57:16 -04003238 _Py_IDENTIFIER(__aexit__);
3239 _Py_IDENTIFIER(__aenter__);
3240
3241 PyObject *mgr = TOP();
Victor Stinner438a12d2019-05-24 17:01:38 +02003242 PyObject *exit = special_lookup(tstate, mgr, &PyId___aexit__),
Yury Selivanov75445082015-05-11 22:57:16 -04003243 *enter;
3244 PyObject *res;
3245 if (exit == NULL)
3246 goto error;
3247 SET_TOP(exit);
Victor Stinner438a12d2019-05-24 17:01:38 +02003248 enter = special_lookup(tstate, mgr, &PyId___aenter__);
Yury Selivanov75445082015-05-11 22:57:16 -04003249 Py_DECREF(mgr);
3250 if (enter == NULL)
3251 goto error;
Victor Stinnerf17c3de2016-12-06 18:46:19 +01003252 res = _PyObject_CallNoArg(enter);
Yury Selivanov75445082015-05-11 22:57:16 -04003253 Py_DECREF(enter);
3254 if (res == NULL)
3255 goto error;
3256 PUSH(res);
Serhiy Storchakada9c5132016-06-27 18:58:57 +03003257 PREDICT(GET_AWAITABLE);
Yury Selivanov75445082015-05-11 22:57:16 -04003258 DISPATCH();
3259 }
3260
Benjamin Petersonddd19492018-09-16 22:38:02 -07003261 case TARGET(SETUP_ASYNC_WITH): {
Yury Selivanov75445082015-05-11 22:57:16 -04003262 PyObject *res = POP();
3263 /* Setup the finally block before pushing the result
3264 of __aenter__ on the stack. */
3265 PyFrame_BlockSetup(f, SETUP_FINALLY, INSTR_OFFSET() + oparg,
3266 STACK_LEVEL());
3267 PUSH(res);
3268 DISPATCH();
3269 }
3270
Benjamin Petersonddd19492018-09-16 22:38:02 -07003271 case TARGET(SETUP_WITH): {
Benjamin Petersonce798522012-01-22 11:24:29 -05003272 _Py_IDENTIFIER(__exit__);
3273 _Py_IDENTIFIER(__enter__);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003274 PyObject *mgr = TOP();
Victor Stinner438a12d2019-05-24 17:01:38 +02003275 PyObject *enter = special_lookup(tstate, mgr, &PyId___enter__);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003276 PyObject *res;
Victor Stinner438a12d2019-05-24 17:01:38 +02003277 if (enter == NULL) {
Raymond Hettingera3fec152016-11-21 17:24:23 -08003278 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02003279 }
3280 PyObject *exit = special_lookup(tstate, mgr, &PyId___exit__);
Raymond Hettinger64e2f9a2016-11-22 11:50:40 -08003281 if (exit == NULL) {
3282 Py_DECREF(enter);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003283 goto error;
Raymond Hettinger64e2f9a2016-11-22 11:50:40 -08003284 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003285 SET_TOP(exit);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003286 Py_DECREF(mgr);
Victor Stinnerf17c3de2016-12-06 18:46:19 +01003287 res = _PyObject_CallNoArg(enter);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003288 Py_DECREF(enter);
3289 if (res == NULL)
3290 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003291 /* Setup the finally block before pushing the result
3292 of __enter__ on the stack. */
3293 PyFrame_BlockSetup(f, SETUP_FINALLY, INSTR_OFFSET() + oparg,
3294 STACK_LEVEL());
Benjamin Peterson876b2f22009-06-28 03:18:59 +00003295
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003296 PUSH(res);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003297 DISPATCH();
3298 }
Benjamin Peterson876b2f22009-06-28 03:18:59 +00003299
Benjamin Petersonddd19492018-09-16 22:38:02 -07003300 case TARGET(WITH_CLEANUP_START): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003301 /* At the top of the stack are 1 or 6 values indicating
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003302 how/why we entered the finally clause:
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003303 - TOP = NULL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003304 - (TOP, SECOND, THIRD) = exc_info()
3305 (FOURTH, FITH, SIXTH) = previous exception for EXCEPT_HANDLER
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003306 Below them is EXIT, the context.__exit__ or context.__aexit__
3307 bound method.
3308 In the first case, we must call
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003309 EXIT(None, None, None)
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003310 otherwise we must call
3311 EXIT(TOP, SECOND, THIRD)
Christian Heimesdd15f6c2008-03-16 00:07:10 +00003312
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003313 In the first case, we remove EXIT from the
3314 stack, leaving TOP, and push TOP on the stack.
3315 Otherwise we shift the bottom 3 values of the
3316 stack down, replace the empty spot with NULL, and push
3317 None on the stack.
Guido van Rossum1a5e21e2006-02-28 21:57:43 +00003318
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003319 Finally we push the result of the call.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003320 */
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003321 PyObject *stack[3];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003322 PyObject *exit_func;
Victor Stinner842cfff2016-12-01 14:45:31 +01003323 PyObject *exc, *val, *tb, *res;
3324
3325 val = tb = Py_None;
3326 exc = TOP();
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003327 if (exc == NULL) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003328 STACK_SHRINK(1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003329 exit_func = TOP();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003330 SET_TOP(exc);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003331 exc = Py_None;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003332 }
3333 else {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003334 assert(PyExceptionClass_Check(exc));
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003335 PyObject *tp2, *exc2, *tb2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003336 PyTryBlock *block;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003337 val = SECOND();
3338 tb = THIRD();
3339 tp2 = FOURTH();
3340 exc2 = PEEK(5);
3341 tb2 = PEEK(6);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003342 exit_func = PEEK(7);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003343 SET_VALUE(7, tb2);
3344 SET_VALUE(6, exc2);
3345 SET_VALUE(5, tp2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003346 /* UNWIND_EXCEPT_HANDLER will pop this off. */
3347 SET_FOURTH(NULL);
3348 /* We just shifted the stack down, so we have
3349 to tell the except handler block that the
3350 values are lower than it expects. */
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003351 assert(f->f_iblock > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003352 block = &f->f_blockstack[f->f_iblock - 1];
3353 assert(block->b_type == EXCEPT_HANDLER);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003354 assert(block->b_level > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003355 block->b_level--;
3356 }
Victor Stinner842cfff2016-12-01 14:45:31 +01003357
3358 stack[0] = exc;
3359 stack[1] = val;
3360 stack[2] = tb;
3361 res = _PyObject_FastCall(exit_func, stack, 3);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003362 Py_DECREF(exit_func);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003363 if (res == NULL)
3364 goto error;
Amaury Forgeot d'Arc10b24e82008-12-10 23:49:33 +00003365
Nick Coghlanbaaadbf2015-05-13 15:54:02 +10003366 Py_INCREF(exc); /* Duplicating the exception on the stack */
Yury Selivanov75445082015-05-11 22:57:16 -04003367 PUSH(exc);
3368 PUSH(res);
3369 PREDICT(WITH_CLEANUP_FINISH);
3370 DISPATCH();
3371 }
3372
Benjamin Petersonddd19492018-09-16 22:38:02 -07003373 case TARGET(WITH_CLEANUP_FINISH): {
3374 PREDICTED(WITH_CLEANUP_FINISH);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003375 /* TOP = the result of calling the context.__exit__ bound method
3376 SECOND = either None or exception type
3377
3378 If SECOND is None below is NULL or the return address,
3379 otherwise below are 7 values representing an exception.
3380 */
Yury Selivanov75445082015-05-11 22:57:16 -04003381 PyObject *res = POP();
3382 PyObject *exc = POP();
3383 int err;
3384
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003385 if (exc != Py_None)
3386 err = PyObject_IsTrue(res);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003387 else
3388 err = 0;
Yury Selivanov75445082015-05-11 22:57:16 -04003389
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003390 Py_DECREF(res);
Nick Coghlanbaaadbf2015-05-13 15:54:02 +10003391 Py_DECREF(exc);
Amaury Forgeot d'Arc10b24e82008-12-10 23:49:33 +00003392
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003393 if (err < 0)
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003394 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003395 else if (err > 0) {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003396 /* There was an exception and a True return.
3397 * We must manually unwind the EXCEPT_HANDLER block
3398 * which was created when the exception was caught,
Quan Tian3bd0d622018-10-20 05:30:03 +08003399 * otherwise the stack will be in an inconsistent state.
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003400 */
3401 PyTryBlock *b = PyFrame_BlockPop(f);
3402 assert(b->b_type == EXCEPT_HANDLER);
3403 UNWIND_EXCEPT_HANDLER(b);
3404 PUSH(NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003405 }
3406 PREDICT(END_FINALLY);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003407 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003408 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00003409
Benjamin Petersonddd19492018-09-16 22:38:02 -07003410 case TARGET(LOAD_METHOD): {
Andreyb021ba52019-04-29 14:33:26 +10003411 /* Designed to work in tandem with CALL_METHOD. */
Yury Selivanovf2392132016-12-13 19:03:51 -05003412 PyObject *name = GETITEM(names, oparg);
3413 PyObject *obj = TOP();
3414 PyObject *meth = NULL;
3415
3416 int meth_found = _PyObject_GetMethod(obj, name, &meth);
3417
Yury Selivanovf2392132016-12-13 19:03:51 -05003418 if (meth == NULL) {
3419 /* Most likely attribute wasn't found. */
Yury Selivanovf2392132016-12-13 19:03:51 -05003420 goto error;
3421 }
3422
3423 if (meth_found) {
INADA Naoki015bce62017-01-16 17:23:30 +09003424 /* We can bypass temporary bound method object.
3425 meth is unbound method and obj is self.
Victor Stinnera8cb5152017-01-18 14:12:51 +01003426
INADA Naoki015bce62017-01-16 17:23:30 +09003427 meth | self | arg1 | ... | argN
3428 */
3429 SET_TOP(meth);
3430 PUSH(obj); // self
Yury Selivanovf2392132016-12-13 19:03:51 -05003431 }
3432 else {
INADA Naoki015bce62017-01-16 17:23:30 +09003433 /* meth is not an unbound method (but a regular attr, or
3434 something was returned by a descriptor protocol). Set
3435 the second element of the stack to NULL, to signal
Yury Selivanovf2392132016-12-13 19:03:51 -05003436 CALL_METHOD that it's not a method call.
INADA Naoki015bce62017-01-16 17:23:30 +09003437
3438 NULL | meth | arg1 | ... | argN
Yury Selivanovf2392132016-12-13 19:03:51 -05003439 */
INADA Naoki015bce62017-01-16 17:23:30 +09003440 SET_TOP(NULL);
Yury Selivanovf2392132016-12-13 19:03:51 -05003441 Py_DECREF(obj);
INADA Naoki015bce62017-01-16 17:23:30 +09003442 PUSH(meth);
Yury Selivanovf2392132016-12-13 19:03:51 -05003443 }
3444 DISPATCH();
3445 }
3446
Benjamin Petersonddd19492018-09-16 22:38:02 -07003447 case TARGET(CALL_METHOD): {
Yury Selivanovf2392132016-12-13 19:03:51 -05003448 /* Designed to work in tamdem with LOAD_METHOD. */
INADA Naoki015bce62017-01-16 17:23:30 +09003449 PyObject **sp, *res, *meth;
Yury Selivanovf2392132016-12-13 19:03:51 -05003450
3451 sp = stack_pointer;
3452
INADA Naoki015bce62017-01-16 17:23:30 +09003453 meth = PEEK(oparg + 2);
3454 if (meth == NULL) {
3455 /* `meth` is NULL when LOAD_METHOD thinks that it's not
3456 a method call.
Yury Selivanovf2392132016-12-13 19:03:51 -05003457
3458 Stack layout:
3459
INADA Naoki015bce62017-01-16 17:23:30 +09003460 ... | NULL | callable | arg1 | ... | argN
3461 ^- TOP()
3462 ^- (-oparg)
3463 ^- (-oparg-1)
3464 ^- (-oparg-2)
Yury Selivanovf2392132016-12-13 19:03:51 -05003465
Ville Skyttä49b27342017-08-03 09:00:59 +03003466 `callable` will be POPed by call_function.
INADA Naoki015bce62017-01-16 17:23:30 +09003467 NULL will will be POPed manually later.
Yury Selivanovf2392132016-12-13 19:03:51 -05003468 */
Victor Stinner09532fe2019-05-10 23:39:09 +02003469 res = call_function(tstate, &sp, oparg, NULL);
Yury Selivanovf2392132016-12-13 19:03:51 -05003470 stack_pointer = sp;
INADA Naoki015bce62017-01-16 17:23:30 +09003471 (void)POP(); /* POP the NULL. */
Yury Selivanovf2392132016-12-13 19:03:51 -05003472 }
3473 else {
3474 /* This is a method call. Stack layout:
3475
INADA Naoki015bce62017-01-16 17:23:30 +09003476 ... | method | self | arg1 | ... | argN
Yury Selivanovf2392132016-12-13 19:03:51 -05003477 ^- TOP()
3478 ^- (-oparg)
INADA Naoki015bce62017-01-16 17:23:30 +09003479 ^- (-oparg-1)
3480 ^- (-oparg-2)
Yury Selivanovf2392132016-12-13 19:03:51 -05003481
INADA Naoki015bce62017-01-16 17:23:30 +09003482 `self` and `method` will be POPed by call_function.
Yury Selivanovf2392132016-12-13 19:03:51 -05003483 We'll be passing `oparg + 1` to call_function, to
INADA Naoki015bce62017-01-16 17:23:30 +09003484 make it accept the `self` as a first argument.
Yury Selivanovf2392132016-12-13 19:03:51 -05003485 */
Victor Stinner09532fe2019-05-10 23:39:09 +02003486 res = call_function(tstate, &sp, oparg + 1, NULL);
Yury Selivanovf2392132016-12-13 19:03:51 -05003487 stack_pointer = sp;
3488 }
3489
3490 PUSH(res);
3491 if (res == NULL)
3492 goto error;
3493 DISPATCH();
3494 }
3495
Benjamin Petersonddd19492018-09-16 22:38:02 -07003496 case TARGET(CALL_FUNCTION): {
3497 PREDICTED(CALL_FUNCTION);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003498 PyObject **sp, *res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003499 sp = stack_pointer;
Victor Stinner09532fe2019-05-10 23:39:09 +02003500 res = call_function(tstate, &sp, oparg, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003501 stack_pointer = sp;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003502 PUSH(res);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003503 if (res == NULL) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003504 goto error;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003505 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003506 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003507 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003508
Benjamin Petersonddd19492018-09-16 22:38:02 -07003509 case TARGET(CALL_FUNCTION_KW): {
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003510 PyObject **sp, *res, *names;
3511
3512 names = POP();
3513 assert(PyTuple_CheckExact(names) && PyTuple_GET_SIZE(names) <= oparg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003514 sp = stack_pointer;
Victor Stinner09532fe2019-05-10 23:39:09 +02003515 res = call_function(tstate, &sp, oparg, names);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003516 stack_pointer = sp;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003517 PUSH(res);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003518 Py_DECREF(names);
3519
3520 if (res == NULL) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003521 goto error;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003522 }
3523 DISPATCH();
3524 }
3525
Benjamin Petersonddd19492018-09-16 22:38:02 -07003526 case TARGET(CALL_FUNCTION_EX): {
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003527 PyObject *func, *callargs, *kwargs = NULL, *result;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003528 if (oparg & 0x01) {
3529 kwargs = POP();
Serhiy Storchakab7281052016-09-12 00:52:40 +03003530 if (!PyDict_CheckExact(kwargs)) {
3531 PyObject *d = PyDict_New();
3532 if (d == NULL)
3533 goto error;
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02003534 if (_PyDict_MergeEx(d, kwargs, 2) < 0) {
Serhiy Storchakab7281052016-09-12 00:52:40 +03003535 Py_DECREF(d);
Victor Stinner438a12d2019-05-24 17:01:38 +02003536 format_kwargs_error(tstate, SECOND(), kwargs);
Victor Stinnereece2222016-09-12 11:16:37 +02003537 Py_DECREF(kwargs);
Serhiy Storchakab7281052016-09-12 00:52:40 +03003538 goto error;
3539 }
3540 Py_DECREF(kwargs);
3541 kwargs = d;
3542 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003543 assert(PyDict_CheckExact(kwargs));
3544 }
3545 callargs = POP();
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003546 func = TOP();
Serhiy Storchaka63dc5482016-09-22 19:41:20 +03003547 if (!PyTuple_CheckExact(callargs)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003548 if (check_args_iterable(tstate, func, callargs) < 0) {
Victor Stinnereece2222016-09-12 11:16:37 +02003549 Py_DECREF(callargs);
Serhiy Storchakab7281052016-09-12 00:52:40 +03003550 goto error;
3551 }
3552 Py_SETREF(callargs, PySequence_Tuple(callargs));
3553 if (callargs == NULL) {
3554 goto error;
3555 }
3556 }
Serhiy Storchaka63dc5482016-09-22 19:41:20 +03003557 assert(PyTuple_CheckExact(callargs));
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003558
Victor Stinner09532fe2019-05-10 23:39:09 +02003559 result = do_call_core(tstate, func, callargs, kwargs);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003560 Py_DECREF(func);
3561 Py_DECREF(callargs);
3562 Py_XDECREF(kwargs);
3563
3564 SET_TOP(result);
3565 if (result == NULL) {
3566 goto error;
3567 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003568 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003569 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003570
Benjamin Petersonddd19492018-09-16 22:38:02 -07003571 case TARGET(MAKE_FUNCTION): {
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003572 PyObject *qualname = POP();
3573 PyObject *codeobj = POP();
3574 PyFunctionObject *func = (PyFunctionObject *)
3575 PyFunction_NewWithQualName(codeobj, f->f_globals, qualname);
Guido van Rossum4f72a782006-10-27 23:31:49 +00003576
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003577 Py_DECREF(codeobj);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003578 Py_DECREF(qualname);
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003579 if (func == NULL) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003580 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003581 }
Neal Norwitzc1505362006-12-28 06:47:50 +00003582
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003583 if (oparg & 0x08) {
3584 assert(PyTuple_CheckExact(TOP()));
3585 func ->func_closure = POP();
3586 }
3587 if (oparg & 0x04) {
3588 assert(PyDict_CheckExact(TOP()));
3589 func->func_annotations = POP();
3590 }
3591 if (oparg & 0x02) {
3592 assert(PyDict_CheckExact(TOP()));
3593 func->func_kwdefaults = POP();
3594 }
3595 if (oparg & 0x01) {
3596 assert(PyTuple_CheckExact(TOP()));
3597 func->func_defaults = POP();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003598 }
Neal Norwitzc1505362006-12-28 06:47:50 +00003599
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003600 PUSH((PyObject *)func);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003601 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003602 }
Guido van Rossum8861b741996-07-30 16:49:37 +00003603
Benjamin Petersonddd19492018-09-16 22:38:02 -07003604 case TARGET(BUILD_SLICE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003605 PyObject *start, *stop, *step, *slice;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003606 if (oparg == 3)
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003607 step = POP();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003608 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003609 step = NULL;
3610 stop = POP();
3611 start = TOP();
3612 slice = PySlice_New(start, stop, step);
3613 Py_DECREF(start);
3614 Py_DECREF(stop);
3615 Py_XDECREF(step);
3616 SET_TOP(slice);
3617 if (slice == NULL)
3618 goto error;
3619 DISPATCH();
3620 }
Guido van Rossum8861b741996-07-30 16:49:37 +00003621
Benjamin Petersonddd19492018-09-16 22:38:02 -07003622 case TARGET(FORMAT_VALUE): {
Eric V. Smitha78c7952015-11-03 12:45:05 -05003623 /* Handles f-string value formatting. */
3624 PyObject *result;
3625 PyObject *fmt_spec;
3626 PyObject *value;
3627 PyObject *(*conv_fn)(PyObject *);
3628 int which_conversion = oparg & FVC_MASK;
3629 int have_fmt_spec = (oparg & FVS_MASK) == FVS_HAVE_SPEC;
3630
3631 fmt_spec = have_fmt_spec ? POP() : NULL;
Eric V. Smith135d5f42016-02-05 18:23:08 -05003632 value = POP();
Eric V. Smitha78c7952015-11-03 12:45:05 -05003633
3634 /* See if any conversion is specified. */
3635 switch (which_conversion) {
Eric V. Smith9a4135e2019-05-08 16:28:48 -04003636 case FVC_NONE: conv_fn = NULL; break;
Eric V. Smitha78c7952015-11-03 12:45:05 -05003637 case FVC_STR: conv_fn = PyObject_Str; break;
3638 case FVC_REPR: conv_fn = PyObject_Repr; break;
3639 case FVC_ASCII: conv_fn = PyObject_ASCII; break;
Eric V. Smith9a4135e2019-05-08 16:28:48 -04003640 default:
Victor Stinner438a12d2019-05-24 17:01:38 +02003641 _PyErr_Format(tstate, PyExc_SystemError,
3642 "unexpected conversion flag %d",
3643 which_conversion);
Eric V. Smith9a4135e2019-05-08 16:28:48 -04003644 goto error;
Eric V. Smitha78c7952015-11-03 12:45:05 -05003645 }
3646
3647 /* If there's a conversion function, call it and replace
3648 value with that result. Otherwise, just use value,
3649 without conversion. */
Eric V. Smitheb588a12016-02-05 18:26:20 -05003650 if (conv_fn != NULL) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05003651 result = conv_fn(value);
3652 Py_DECREF(value);
Eric V. Smitheb588a12016-02-05 18:26:20 -05003653 if (result == NULL) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05003654 Py_XDECREF(fmt_spec);
3655 goto error;
3656 }
3657 value = result;
3658 }
3659
3660 /* If value is a unicode object, and there's no fmt_spec,
3661 then we know the result of format(value) is value
3662 itself. In that case, skip calling format(). I plan to
3663 move this optimization in to PyObject_Format()
3664 itself. */
3665 if (PyUnicode_CheckExact(value) && fmt_spec == NULL) {
3666 /* Do nothing, just transfer ownership to result. */
3667 result = value;
3668 } else {
3669 /* Actually call format(). */
3670 result = PyObject_Format(value, fmt_spec);
3671 Py_DECREF(value);
3672 Py_XDECREF(fmt_spec);
Eric V. Smitheb588a12016-02-05 18:26:20 -05003673 if (result == NULL) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05003674 goto error;
Eric V. Smitheb588a12016-02-05 18:26:20 -05003675 }
Eric V. Smitha78c7952015-11-03 12:45:05 -05003676 }
3677
Eric V. Smith135d5f42016-02-05 18:23:08 -05003678 PUSH(result);
Eric V. Smitha78c7952015-11-03 12:45:05 -05003679 DISPATCH();
3680 }
3681
Benjamin Petersonddd19492018-09-16 22:38:02 -07003682 case TARGET(EXTENDED_ARG): {
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03003683 int oldoparg = oparg;
3684 NEXTOPARG();
3685 oparg |= oldoparg << 8;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003686 goto dispatch_opcode;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003687 }
Guido van Rossum8861b741996-07-30 16:49:37 +00003688
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003689
Antoine Pitrou042b1282010-08-13 21:15:58 +00003690#if USE_COMPUTED_GOTOS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003691 _unknown_opcode:
Antoine Pitroub52ec782009-01-25 16:34:23 +00003692#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003693 default:
3694 fprintf(stderr,
3695 "XXX lineno: %d, opcode: %d\n",
3696 PyFrame_GetLineNumber(f),
3697 opcode);
Victor Stinner438a12d2019-05-24 17:01:38 +02003698 _PyErr_SetString(tstate, PyExc_SystemError, "unknown opcode");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003699 goto error;
Guido van Rossum04691fc1992-08-12 15:35:34 +00003700
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003701 } /* switch */
Guido van Rossum374a9221991-04-04 10:40:29 +00003702
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003703 /* This should never be reached. Every opcode should end with DISPATCH()
3704 or goto error. */
Barry Warsawb2e57942017-09-14 18:13:16 -07003705 Py_UNREACHABLE();
Guido van Rossumac7be682001-01-17 15:42:30 +00003706
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003707error:
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003708 /* Double-check exception status. */
Victor Stinner365b6932013-07-12 00:11:58 +02003709#ifdef NDEBUG
Victor Stinner438a12d2019-05-24 17:01:38 +02003710 if (!_PyErr_Occurred(tstate)) {
3711 _PyErr_SetString(tstate, PyExc_SystemError,
3712 "error return without exception set");
3713 }
Victor Stinner365b6932013-07-12 00:11:58 +02003714#else
Victor Stinner438a12d2019-05-24 17:01:38 +02003715 assert(_PyErr_Occurred(tstate));
Victor Stinner365b6932013-07-12 00:11:58 +02003716#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00003717
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003718 /* Log traceback info. */
3719 PyTraceBack_Here(f);
Guido van Rossumac7be682001-01-17 15:42:30 +00003720
Benjamin Peterson51f46162013-01-23 08:38:47 -05003721 if (tstate->c_tracefunc != NULL)
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003722 call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj,
3723 tstate, f);
Guido van Rossumac7be682001-01-17 15:42:30 +00003724
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003725exception_unwind:
3726 /* Unwind stacks if an exception occurred */
3727 while (f->f_iblock > 0) {
3728 /* Pop the current block. */
3729 PyTryBlock *b = &f->f_blockstack[--f->f_iblock];
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003730
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003731 if (b->b_type == EXCEPT_HANDLER) {
3732 UNWIND_EXCEPT_HANDLER(b);
3733 continue;
3734 }
3735 UNWIND_BLOCK(b);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003736 if (b->b_type == SETUP_FINALLY) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003737 PyObject *exc, *val, *tb;
3738 int handler = b->b_handler;
Mark Shannonae3087c2017-10-22 22:41:51 +01003739 _PyErr_StackItem *exc_info = tstate->exc_info;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003740 /* Beware, this invalidates all b->b_* fields */
3741 PyFrame_BlockSetup(f, EXCEPT_HANDLER, -1, STACK_LEVEL());
Mark Shannonae3087c2017-10-22 22:41:51 +01003742 PUSH(exc_info->exc_traceback);
3743 PUSH(exc_info->exc_value);
3744 if (exc_info->exc_type != NULL) {
3745 PUSH(exc_info->exc_type);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003746 }
3747 else {
3748 Py_INCREF(Py_None);
3749 PUSH(Py_None);
3750 }
Victor Stinner438a12d2019-05-24 17:01:38 +02003751 _PyErr_Fetch(tstate, &exc, &val, &tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003752 /* Make the raw exception data
3753 available to the handler,
3754 so a program can emulate the
3755 Python main loop. */
Victor Stinner438a12d2019-05-24 17:01:38 +02003756 _PyErr_NormalizeException(tstate, &exc, &val, &tb);
Victor Stinner7eab0d02013-07-15 21:16:27 +02003757 if (tb != NULL)
3758 PyException_SetTraceback(val, tb);
3759 else
3760 PyException_SetTraceback(val, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003761 Py_INCREF(exc);
Mark Shannonae3087c2017-10-22 22:41:51 +01003762 exc_info->exc_type = exc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003763 Py_INCREF(val);
Mark Shannonae3087c2017-10-22 22:41:51 +01003764 exc_info->exc_value = val;
3765 exc_info->exc_traceback = tb;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003766 if (tb == NULL)
3767 tb = Py_None;
3768 Py_INCREF(tb);
3769 PUSH(tb);
3770 PUSH(val);
3771 PUSH(exc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003772 JUMPTO(handler);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003773 /* Resume normal execution */
3774 goto main_loop;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003775 }
3776 } /* unwind stack */
Guido van Rossum374a9221991-04-04 10:40:29 +00003777
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003778 /* End the loop as we still have an error */
3779 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003780 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00003781
Pablo Galindof00828a2019-05-09 16:52:02 +01003782 assert(retval == NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02003783 assert(_PyErr_Occurred(tstate));
Pablo Galindof00828a2019-05-09 16:52:02 +01003784
3785exit_returning:
3786
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003787 /* Pop remaining stack entries. */
3788 while (!EMPTY()) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003789 PyObject *o = POP();
3790 Py_XDECREF(o);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003791 }
Guido van Rossum35974fb2001-12-06 21:28:18 +00003792
Pablo Galindof00828a2019-05-09 16:52:02 +01003793exit_yielding:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003794 if (tstate->use_tracing) {
Benjamin Peterson51f46162013-01-23 08:38:47 -05003795 if (tstate->c_tracefunc) {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003796 if (call_trace_protected(tstate->c_tracefunc, tstate->c_traceobj,
3797 tstate, f, PyTrace_RETURN, retval)) {
3798 Py_CLEAR(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003799 }
3800 }
3801 if (tstate->c_profilefunc) {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003802 if (call_trace_protected(tstate->c_profilefunc, tstate->c_profileobj,
3803 tstate, f, PyTrace_RETURN, retval)) {
Serhiy Storchaka505ff752014-02-09 13:33:53 +02003804 Py_CLEAR(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003805 }
3806 }
3807 }
Guido van Rossuma4240131997-01-21 21:18:36 +00003808
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003809 /* pop frame */
Thomas Woutersce272b62007-09-19 21:19:28 +00003810exit_eval_frame:
Łukasz Langaa785c872016-09-09 17:37:37 -07003811 if (PyDTrace_FUNCTION_RETURN_ENABLED())
3812 dtrace_function_return(f);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003813 Py_LeaveRecursiveCall();
Antoine Pitrou58720d62013-08-05 23:26:40 +02003814 f->f_executing = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003815 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00003816
Victor Stinnerefde1462015-03-21 15:04:43 +01003817 return _Py_CheckFunctionResult(NULL, retval, "PyEval_EvalFrameEx");
Guido van Rossum374a9221991-04-04 10:40:29 +00003818}
3819
Benjamin Petersonb204a422011-06-05 22:04:07 -05003820static void
Victor Stinner438a12d2019-05-24 17:01:38 +02003821format_missing(PyThreadState *tstate, const char *kind,
3822 PyCodeObject *co, PyObject *names)
Benjamin Petersone109c702011-06-24 09:37:26 -05003823{
3824 int err;
3825 Py_ssize_t len = PyList_GET_SIZE(names);
3826 PyObject *name_str, *comma, *tail, *tmp;
3827
3828 assert(PyList_CheckExact(names));
3829 assert(len >= 1);
3830 /* Deal with the joys of natural language. */
3831 switch (len) {
3832 case 1:
3833 name_str = PyList_GET_ITEM(names, 0);
3834 Py_INCREF(name_str);
3835 break;
3836 case 2:
3837 name_str = PyUnicode_FromFormat("%U and %U",
3838 PyList_GET_ITEM(names, len - 2),
3839 PyList_GET_ITEM(names, len - 1));
3840 break;
3841 default:
3842 tail = PyUnicode_FromFormat(", %U, and %U",
3843 PyList_GET_ITEM(names, len - 2),
3844 PyList_GET_ITEM(names, len - 1));
Benjamin Petersond1ab6082012-06-01 11:18:22 -07003845 if (tail == NULL)
3846 return;
Benjamin Petersone109c702011-06-24 09:37:26 -05003847 /* Chop off the last two objects in the list. This shouldn't actually
3848 fail, but we can't be too careful. */
3849 err = PyList_SetSlice(names, len - 2, len, NULL);
3850 if (err == -1) {
3851 Py_DECREF(tail);
3852 return;
3853 }
3854 /* Stitch everything up into a nice comma-separated list. */
3855 comma = PyUnicode_FromString(", ");
3856 if (comma == NULL) {
3857 Py_DECREF(tail);
3858 return;
3859 }
3860 tmp = PyUnicode_Join(comma, names);
3861 Py_DECREF(comma);
3862 if (tmp == NULL) {
3863 Py_DECREF(tail);
3864 return;
3865 }
3866 name_str = PyUnicode_Concat(tmp, tail);
3867 Py_DECREF(tmp);
3868 Py_DECREF(tail);
3869 break;
3870 }
3871 if (name_str == NULL)
3872 return;
Victor Stinner438a12d2019-05-24 17:01:38 +02003873 _PyErr_Format(tstate, PyExc_TypeError,
3874 "%U() missing %i required %s argument%s: %U",
3875 co->co_name,
3876 len,
3877 kind,
3878 len == 1 ? "" : "s",
3879 name_str);
Benjamin Petersone109c702011-06-24 09:37:26 -05003880 Py_DECREF(name_str);
3881}
3882
3883static void
Victor Stinner438a12d2019-05-24 17:01:38 +02003884missing_arguments(PyThreadState *tstate, PyCodeObject *co,
3885 Py_ssize_t missing, Py_ssize_t defcount,
Benjamin Petersone109c702011-06-24 09:37:26 -05003886 PyObject **fastlocals)
3887{
Victor Stinner74319ae2016-08-25 00:04:09 +02003888 Py_ssize_t i, j = 0;
3889 Py_ssize_t start, end;
3890 int positional = (defcount != -1);
Benjamin Petersone109c702011-06-24 09:37:26 -05003891 const char *kind = positional ? "positional" : "keyword-only";
3892 PyObject *missing_names;
3893
3894 /* Compute the names of the arguments that are missing. */
3895 missing_names = PyList_New(missing);
3896 if (missing_names == NULL)
3897 return;
3898 if (positional) {
3899 start = 0;
Pablo Galindocd74e662019-06-01 18:08:04 +01003900 end = co->co_argcount - defcount;
Benjamin Petersone109c702011-06-24 09:37:26 -05003901 }
3902 else {
Pablo Galindocd74e662019-06-01 18:08:04 +01003903 start = co->co_argcount;
Benjamin Petersone109c702011-06-24 09:37:26 -05003904 end = start + co->co_kwonlyargcount;
3905 }
3906 for (i = start; i < end; i++) {
3907 if (GETLOCAL(i) == NULL) {
3908 PyObject *raw = PyTuple_GET_ITEM(co->co_varnames, i);
3909 PyObject *name = PyObject_Repr(raw);
3910 if (name == NULL) {
3911 Py_DECREF(missing_names);
3912 return;
3913 }
3914 PyList_SET_ITEM(missing_names, j++, name);
3915 }
3916 }
3917 assert(j == missing);
Victor Stinner438a12d2019-05-24 17:01:38 +02003918 format_missing(tstate, kind, co, missing_names);
Benjamin Petersone109c702011-06-24 09:37:26 -05003919 Py_DECREF(missing_names);
3920}
3921
3922static void
Victor Stinner438a12d2019-05-24 17:01:38 +02003923too_many_positional(PyThreadState *tstate, PyCodeObject *co,
3924 Py_ssize_t given, Py_ssize_t defcount,
Victor Stinner74319ae2016-08-25 00:04:09 +02003925 PyObject **fastlocals)
Benjamin Petersonb204a422011-06-05 22:04:07 -05003926{
3927 int plural;
Victor Stinner74319ae2016-08-25 00:04:09 +02003928 Py_ssize_t kwonly_given = 0;
3929 Py_ssize_t i;
Benjamin Petersonb204a422011-06-05 22:04:07 -05003930 PyObject *sig, *kwonly_sig;
Victor Stinner74319ae2016-08-25 00:04:09 +02003931 Py_ssize_t co_argcount = co->co_argcount;
Benjamin Petersonb204a422011-06-05 22:04:07 -05003932
Benjamin Petersone109c702011-06-24 09:37:26 -05003933 assert((co->co_flags & CO_VARARGS) == 0);
3934 /* Count missing keyword-only args. */
Pablo Galindocd74e662019-06-01 18:08:04 +01003935 for (i = co_argcount; i < co_argcount + co->co_kwonlyargcount; i++) {
Victor Stinner74319ae2016-08-25 00:04:09 +02003936 if (GETLOCAL(i) != NULL) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05003937 kwonly_given++;
Victor Stinner74319ae2016-08-25 00:04:09 +02003938 }
3939 }
Benjamin Petersone109c702011-06-24 09:37:26 -05003940 if (defcount) {
Pablo Galindocd74e662019-06-01 18:08:04 +01003941 Py_ssize_t atleast = co_argcount - defcount;
Benjamin Petersonb204a422011-06-05 22:04:07 -05003942 plural = 1;
Pablo Galindocd74e662019-06-01 18:08:04 +01003943 sig = PyUnicode_FromFormat("from %zd to %zd", atleast, co_argcount);
Benjamin Petersonb204a422011-06-05 22:04:07 -05003944 }
3945 else {
Pablo Galindocd74e662019-06-01 18:08:04 +01003946 plural = (co_argcount != 1);
3947 sig = PyUnicode_FromFormat("%zd", co_argcount);
Benjamin Petersonb204a422011-06-05 22:04:07 -05003948 }
3949 if (sig == NULL)
3950 return;
3951 if (kwonly_given) {
Victor Stinner74319ae2016-08-25 00:04:09 +02003952 const char *format = " positional argument%s (and %zd keyword-only argument%s)";
3953 kwonly_sig = PyUnicode_FromFormat(format,
3954 given != 1 ? "s" : "",
3955 kwonly_given,
3956 kwonly_given != 1 ? "s" : "");
Benjamin Petersonb204a422011-06-05 22:04:07 -05003957 if (kwonly_sig == NULL) {
3958 Py_DECREF(sig);
3959 return;
3960 }
3961 }
3962 else {
3963 /* This will not fail. */
3964 kwonly_sig = PyUnicode_FromString("");
Benjamin Petersone109c702011-06-24 09:37:26 -05003965 assert(kwonly_sig != NULL);
Benjamin Petersonb204a422011-06-05 22:04:07 -05003966 }
Victor Stinner438a12d2019-05-24 17:01:38 +02003967 _PyErr_Format(tstate, PyExc_TypeError,
3968 "%U() takes %U positional argument%s but %zd%U %s given",
3969 co->co_name,
3970 sig,
3971 plural ? "s" : "",
3972 given,
3973 kwonly_sig,
3974 given == 1 && !kwonly_given ? "was" : "were");
Benjamin Petersonb204a422011-06-05 22:04:07 -05003975 Py_DECREF(sig);
3976 Py_DECREF(kwonly_sig);
3977}
3978
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01003979static int
Victor Stinner438a12d2019-05-24 17:01:38 +02003980positional_only_passed_as_keyword(PyThreadState *tstate, PyCodeObject *co,
3981 Py_ssize_t kwcount, PyObject* const* kwnames)
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01003982{
3983 int posonly_conflicts = 0;
3984 PyObject* posonly_names = PyList_New(0);
3985
3986 for(int k=0; k < co->co_posonlyargcount; k++){
3987 PyObject* posonly_name = PyTuple_GET_ITEM(co->co_varnames, k);
3988
3989 for (int k2=0; k2<kwcount; k2++){
3990 /* Compare the pointers first and fallback to PyObject_RichCompareBool*/
3991 PyObject* kwname = kwnames[k2];
3992 if (kwname == posonly_name){
3993 if(PyList_Append(posonly_names, kwname) != 0) {
3994 goto fail;
3995 }
3996 posonly_conflicts++;
3997 continue;
3998 }
3999
4000 int cmp = PyObject_RichCompareBool(posonly_name, kwname, Py_EQ);
4001
4002 if ( cmp > 0) {
4003 if(PyList_Append(posonly_names, kwname) != 0) {
4004 goto fail;
4005 }
4006 posonly_conflicts++;
4007 } else if (cmp < 0) {
4008 goto fail;
4009 }
4010
4011 }
4012 }
4013 if (posonly_conflicts) {
4014 PyObject* comma = PyUnicode_FromString(", ");
4015 if (comma == NULL) {
4016 goto fail;
4017 }
4018 PyObject* error_names = PyUnicode_Join(comma, posonly_names);
4019 Py_DECREF(comma);
4020 if (error_names == NULL) {
4021 goto fail;
4022 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004023 _PyErr_Format(tstate, PyExc_TypeError,
4024 "%U() got some positional-only arguments passed"
4025 " as keyword arguments: '%U'",
4026 co->co_name, error_names);
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004027 Py_DECREF(error_names);
4028 goto fail;
4029 }
4030
4031 Py_DECREF(posonly_names);
4032 return 0;
4033
4034fail:
4035 Py_XDECREF(posonly_names);
4036 return 1;
4037
4038}
4039
Guido van Rossumc2e20742006-02-27 22:32:47 +00004040/* This is gonna seem *real weird*, but if you put some other code between
Marcel Plch3a9ccee2018-04-06 23:22:04 +02004041 PyEval_EvalFrame() and _PyEval_EvalFrameDefault() you will need to adjust
Guido van Rossumc2e20742006-02-27 22:32:47 +00004042 the test in the if statements in Misc/gdbinit (pystack and pystackv). */
Skip Montanaro786ea6b2004-03-01 15:44:05 +00004043
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01004044PyObject *
Victor Stinner40ee3012014-06-16 15:59:28 +02004045_PyEval_EvalCodeWithName(PyObject *_co, PyObject *globals, PyObject *locals,
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02004046 PyObject *const *args, Py_ssize_t argcount,
4047 PyObject *const *kwnames, PyObject *const *kwargs,
Serhiy Storchakab7281052016-09-12 00:52:40 +03004048 Py_ssize_t kwcount, int kwstep,
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02004049 PyObject *const *defs, Py_ssize_t defcount,
Victor Stinner74319ae2016-08-25 00:04:09 +02004050 PyObject *kwdefs, PyObject *closure,
Victor Stinner40ee3012014-06-16 15:59:28 +02004051 PyObject *name, PyObject *qualname)
Tim Peters5ca576e2001-06-18 22:08:13 +00004052{
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00004053 PyCodeObject* co = (PyCodeObject*)_co;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02004054 PyFrameObject *f;
4055 PyObject *retval = NULL;
4056 PyObject **fastlocals, **freevars;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004057 PyObject *x, *u;
Pablo Galindocd74e662019-06-01 18:08:04 +01004058 const Py_ssize_t total_args = co->co_argcount + co->co_kwonlyargcount;
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004059 Py_ssize_t i, j, n;
Victor Stinnerc7020012016-08-16 23:40:29 +02004060 PyObject *kwdict;
Tim Peters5ca576e2001-06-18 22:08:13 +00004061
Victor Stinner438a12d2019-05-24 17:01:38 +02004062 PyThreadState *tstate = _PyThreadState_GET();
4063 assert(tstate != NULL);
4064
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004065 if (globals == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004066 _PyErr_SetString(tstate, PyExc_SystemError,
4067 "PyEval_EvalCodeEx: NULL globals");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004068 return NULL;
4069 }
Tim Peters5ca576e2001-06-18 22:08:13 +00004070
Victor Stinnerc7020012016-08-16 23:40:29 +02004071 /* Create the frame */
INADA Naoki5a625d02016-12-24 20:19:08 +09004072 f = _PyFrame_New_NoTrack(tstate, co, globals, locals);
Victor Stinnerc7020012016-08-16 23:40:29 +02004073 if (f == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004074 return NULL;
Victor Stinnerc7020012016-08-16 23:40:29 +02004075 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004076 fastlocals = f->f_localsplus;
4077 freevars = f->f_localsplus + co->co_nlocals;
Tim Peters5ca576e2001-06-18 22:08:13 +00004078
Victor Stinnerc7020012016-08-16 23:40:29 +02004079 /* Create a dictionary for keyword parameters (**kwags) */
Benjamin Petersonb204a422011-06-05 22:04:07 -05004080 if (co->co_flags & CO_VARKEYWORDS) {
4081 kwdict = PyDict_New();
4082 if (kwdict == NULL)
4083 goto fail;
4084 i = total_args;
Victor Stinnerc7020012016-08-16 23:40:29 +02004085 if (co->co_flags & CO_VARARGS) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004086 i++;
Victor Stinnerc7020012016-08-16 23:40:29 +02004087 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004088 SETLOCAL(i, kwdict);
4089 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004090 else {
4091 kwdict = NULL;
4092 }
4093
Pablo Galindocd74e662019-06-01 18:08:04 +01004094 /* Copy all positional arguments into local variables */
4095 if (argcount > co->co_argcount) {
4096 n = co->co_argcount;
Victor Stinnerc7020012016-08-16 23:40:29 +02004097 }
4098 else {
4099 n = argcount;
4100 }
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004101 for (j = 0; j < n; j++) {
4102 x = args[j];
4103 Py_INCREF(x);
4104 SETLOCAL(j, x);
4105 }
4106
Victor Stinnerc7020012016-08-16 23:40:29 +02004107 /* Pack other positional arguments into the *args argument */
Benjamin Petersonb204a422011-06-05 22:04:07 -05004108 if (co->co_flags & CO_VARARGS) {
Sergey Fedoseev234531b2019-02-25 21:59:12 +05004109 u = _PyTuple_FromArray(args + n, argcount - n);
Victor Stinnerc7020012016-08-16 23:40:29 +02004110 if (u == NULL) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004111 goto fail;
Victor Stinnerc7020012016-08-16 23:40:29 +02004112 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004113 SETLOCAL(total_args, u);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004114 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004115
Serhiy Storchakab7281052016-09-12 00:52:40 +03004116 /* Handle keyword arguments passed as two strided arrays */
4117 kwcount *= kwstep;
4118 for (i = 0; i < kwcount; i += kwstep) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004119 PyObject **co_varnames;
Serhiy Storchakab7281052016-09-12 00:52:40 +03004120 PyObject *keyword = kwnames[i];
4121 PyObject *value = kwargs[i];
Victor Stinner17061a92016-08-16 23:39:42 +02004122 Py_ssize_t j;
Victor Stinnerc7020012016-08-16 23:40:29 +02004123
Benjamin Petersonb204a422011-06-05 22:04:07 -05004124 if (keyword == NULL || !PyUnicode_Check(keyword)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004125 _PyErr_Format(tstate, PyExc_TypeError,
4126 "%U() keywords must be strings",
4127 co->co_name);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004128 goto fail;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004129 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004130
Benjamin Petersonb204a422011-06-05 22:04:07 -05004131 /* Speed hack: do raw pointer compares. As names are
4132 normally interned this should almost always hit. */
4133 co_varnames = ((PyTupleObject *)(co->co_varnames))->ob_item;
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004134 for (j = co->co_posonlyargcount; j < total_args; j++) {
Victor Stinner6fea7f72016-08-22 23:17:30 +02004135 PyObject *name = co_varnames[j];
4136 if (name == keyword) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004137 goto kw_found;
Victor Stinner6fea7f72016-08-22 23:17:30 +02004138 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004139 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004140
Benjamin Petersonb204a422011-06-05 22:04:07 -05004141 /* Slow fallback, just in case */
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004142 for (j = co->co_posonlyargcount; j < total_args; j++) {
Victor Stinner6fea7f72016-08-22 23:17:30 +02004143 PyObject *name = co_varnames[j];
4144 int cmp = PyObject_RichCompareBool( keyword, name, Py_EQ);
4145 if (cmp > 0) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004146 goto kw_found;
Victor Stinner6fea7f72016-08-22 23:17:30 +02004147 }
4148 else if (cmp < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004149 goto fail;
Victor Stinner6fea7f72016-08-22 23:17:30 +02004150 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004151 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004152
Victor Stinner231d1f32017-01-11 02:12:06 +01004153 assert(j >= total_args);
4154 if (kwdict == NULL) {
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004155
Victor Stinner438a12d2019-05-24 17:01:38 +02004156 if (co->co_posonlyargcount
4157 && positional_only_passed_as_keyword(tstate, co,
4158 kwcount, kwnames))
4159 {
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004160 goto fail;
4161 }
4162
Victor Stinner438a12d2019-05-24 17:01:38 +02004163 _PyErr_Format(tstate, PyExc_TypeError,
4164 "%U() got an unexpected keyword argument '%S'",
4165 co->co_name, keyword);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004166 goto fail;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004167 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004168
Christian Heimes0bd447f2013-07-20 14:48:10 +02004169 if (PyDict_SetItem(kwdict, keyword, value) == -1) {
4170 goto fail;
4171 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004172 continue;
Victor Stinnerc7020012016-08-16 23:40:29 +02004173
Benjamin Petersonb204a422011-06-05 22:04:07 -05004174 kw_found:
4175 if (GETLOCAL(j) != NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004176 _PyErr_Format(tstate, PyExc_TypeError,
4177 "%U() got multiple values for argument '%S'",
4178 co->co_name, keyword);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004179 goto fail;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004180 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004181 Py_INCREF(value);
4182 SETLOCAL(j, value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004183 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004184
4185 /* Check the number of positional arguments */
Pablo Galindocd74e662019-06-01 18:08:04 +01004186 if ((argcount > co->co_argcount) && !(co->co_flags & CO_VARARGS)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004187 too_many_positional(tstate, co, argcount, defcount, fastlocals);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004188 goto fail;
4189 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004190
4191 /* Add missing positional arguments (copy default values from defs) */
Pablo Galindocd74e662019-06-01 18:08:04 +01004192 if (argcount < co->co_argcount) {
4193 Py_ssize_t m = co->co_argcount - defcount;
Victor Stinner17061a92016-08-16 23:39:42 +02004194 Py_ssize_t missing = 0;
4195 for (i = argcount; i < m; i++) {
4196 if (GETLOCAL(i) == NULL) {
Benjamin Petersone109c702011-06-24 09:37:26 -05004197 missing++;
Victor Stinner17061a92016-08-16 23:39:42 +02004198 }
4199 }
Benjamin Petersone109c702011-06-24 09:37:26 -05004200 if (missing) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004201 missing_arguments(tstate, co, missing, defcount, fastlocals);
Benjamin Petersone109c702011-06-24 09:37:26 -05004202 goto fail;
Benjamin Petersonb204a422011-06-05 22:04:07 -05004203 }
4204 if (n > m)
4205 i = n - m;
4206 else
4207 i = 0;
4208 for (; i < defcount; i++) {
4209 if (GETLOCAL(m+i) == NULL) {
4210 PyObject *def = defs[i];
4211 Py_INCREF(def);
4212 SETLOCAL(m+i, def);
4213 }
4214 }
4215 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004216
4217 /* Add missing keyword arguments (copy default values from kwdefs) */
Benjamin Petersonb204a422011-06-05 22:04:07 -05004218 if (co->co_kwonlyargcount > 0) {
Victor Stinner17061a92016-08-16 23:39:42 +02004219 Py_ssize_t missing = 0;
Pablo Galindocd74e662019-06-01 18:08:04 +01004220 for (i = co->co_argcount; i < total_args; i++) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004221 PyObject *name;
4222 if (GETLOCAL(i) != NULL)
4223 continue;
4224 name = PyTuple_GET_ITEM(co->co_varnames, i);
4225 if (kwdefs != NULL) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02004226 PyObject *def = PyDict_GetItemWithError(kwdefs, name);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004227 if (def) {
4228 Py_INCREF(def);
4229 SETLOCAL(i, def);
4230 continue;
4231 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004232 else if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02004233 goto fail;
4234 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004235 }
Benjamin Petersone109c702011-06-24 09:37:26 -05004236 missing++;
4237 }
4238 if (missing) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004239 missing_arguments(tstate, co, missing, -1, fastlocals);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004240 goto fail;
4241 }
4242 }
4243
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004244 /* Allocate and initialize storage for cell vars, and copy free
Benjamin Peterson90037602011-06-25 22:54:45 -05004245 vars into frame. */
4246 for (i = 0; i < PyTuple_GET_SIZE(co->co_cellvars); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004247 PyObject *c;
Serhiy Storchaka5bb8b912016-12-16 19:19:02 +02004248 Py_ssize_t arg;
Benjamin Peterson90037602011-06-25 22:54:45 -05004249 /* Possibly account for the cell variable being an argument. */
4250 if (co->co_cell2arg != NULL &&
Guido van Rossum6832c812013-05-10 08:47:42 -07004251 (arg = co->co_cell2arg[i]) != CO_CELL_NOT_AN_ARG) {
Benjamin Peterson90037602011-06-25 22:54:45 -05004252 c = PyCell_New(GETLOCAL(arg));
Benjamin Peterson159ae412013-05-12 18:16:06 -05004253 /* Clear the local copy. */
4254 SETLOCAL(arg, NULL);
Guido van Rossum6832c812013-05-10 08:47:42 -07004255 }
4256 else {
Benjamin Peterson90037602011-06-25 22:54:45 -05004257 c = PyCell_New(NULL);
Guido van Rossum6832c812013-05-10 08:47:42 -07004258 }
Benjamin Peterson159ae412013-05-12 18:16:06 -05004259 if (c == NULL)
4260 goto fail;
Benjamin Peterson90037602011-06-25 22:54:45 -05004261 SETLOCAL(co->co_nlocals + i, c);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004262 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004263
4264 /* Copy closure variables to free variables */
Benjamin Peterson90037602011-06-25 22:54:45 -05004265 for (i = 0; i < PyTuple_GET_SIZE(co->co_freevars); ++i) {
4266 PyObject *o = PyTuple_GET_ITEM(closure, i);
4267 Py_INCREF(o);
4268 freevars[PyTuple_GET_SIZE(co->co_cellvars) + i] = o;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004269 }
Tim Peters5ca576e2001-06-18 22:08:13 +00004270
Yury Selivanoveb636452016-09-08 22:01:51 -07004271 /* Handle generator/coroutine/asynchronous generator */
4272 if (co->co_flags & (CO_GENERATOR | CO_COROUTINE | CO_ASYNC_GENERATOR)) {
Yury Selivanov75445082015-05-11 22:57:16 -04004273 PyObject *gen;
Yury Selivanov5376ba92015-06-22 12:19:30 -04004274 int is_coro = co->co_flags & CO_COROUTINE;
Yury Selivanov94c22632015-06-04 10:16:51 -04004275
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004276 /* Don't need to keep the reference to f_back, it will be set
4277 * when the generator is resumed. */
Serhiy Storchaka505ff752014-02-09 13:33:53 +02004278 Py_CLEAR(f->f_back);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00004279
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004280 /* Create a new generator that owns the ready to run frame
4281 * and return that as the value. */
Yury Selivanov5376ba92015-06-22 12:19:30 -04004282 if (is_coro) {
4283 gen = PyCoro_New(f, name, qualname);
Yury Selivanoveb636452016-09-08 22:01:51 -07004284 } else if (co->co_flags & CO_ASYNC_GENERATOR) {
4285 gen = PyAsyncGen_New(f, name, qualname);
Yury Selivanov5376ba92015-06-22 12:19:30 -04004286 } else {
4287 gen = PyGen_NewWithQualName(f, name, qualname);
4288 }
INADA Naoki6a3cedf2016-12-26 18:01:46 +09004289 if (gen == NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04004290 return NULL;
INADA Naoki6a3cedf2016-12-26 18:01:46 +09004291 }
INADA Naoki9c157762016-12-26 18:52:46 +09004292
INADA Naoki6a3cedf2016-12-26 18:01:46 +09004293 _PyObject_GC_TRACK(f);
Yury Selivanov75445082015-05-11 22:57:16 -04004294
Yury Selivanov75445082015-05-11 22:57:16 -04004295 return gen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004296 }
Tim Peters5ca576e2001-06-18 22:08:13 +00004297
Victor Stinner59a73272016-12-09 18:51:13 +01004298 retval = PyEval_EvalFrameEx(f,0);
Tim Peters5ca576e2001-06-18 22:08:13 +00004299
Thomas Woutersce272b62007-09-19 21:19:28 +00004300fail: /* Jump here from prelude on failure */
Tim Peters5ca576e2001-06-18 22:08:13 +00004301
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004302 /* decref'ing the frame can cause __del__ methods to get invoked,
4303 which can call back into Python. While we're done with the
4304 current Python frame (f), the associated C stack is still in use,
4305 so recursion_depth must be boosted for the duration.
4306 */
4307 assert(tstate != NULL);
INADA Naoki5a625d02016-12-24 20:19:08 +09004308 if (Py_REFCNT(f) > 1) {
4309 Py_DECREF(f);
4310 _PyObject_GC_TRACK(f);
4311 }
4312 else {
4313 ++tstate->recursion_depth;
4314 Py_DECREF(f);
4315 --tstate->recursion_depth;
4316 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004317 return retval;
Tim Peters5ca576e2001-06-18 22:08:13 +00004318}
4319
Victor Stinner40ee3012014-06-16 15:59:28 +02004320PyObject *
4321PyEval_EvalCodeEx(PyObject *_co, PyObject *globals, PyObject *locals,
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02004322 PyObject *const *args, int argcount,
4323 PyObject *const *kws, int kwcount,
4324 PyObject *const *defs, int defcount,
4325 PyObject *kwdefs, PyObject *closure)
Victor Stinner40ee3012014-06-16 15:59:28 +02004326{
4327 return _PyEval_EvalCodeWithName(_co, globals, locals,
Victor Stinner9be7e7b2016-08-19 16:11:43 +02004328 args, argcount,
Zackery Spytzc6ea8972017-07-31 08:24:37 -06004329 kws, kws != NULL ? kws + 1 : NULL,
4330 kwcount, 2,
Victor Stinner9be7e7b2016-08-19 16:11:43 +02004331 defs, defcount,
4332 kwdefs, closure,
Victor Stinner40ee3012014-06-16 15:59:28 +02004333 NULL, NULL);
4334}
Tim Peters5ca576e2001-06-18 22:08:13 +00004335
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004336static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02004337special_lookup(PyThreadState *tstate, PyObject *o, _Py_Identifier *id)
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004338{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004339 PyObject *res;
Benjamin Petersonce798522012-01-22 11:24:29 -05004340 res = _PyObject_LookupSpecial(o, id);
Victor Stinner438a12d2019-05-24 17:01:38 +02004341 if (res == NULL && !_PyErr_Occurred(tstate)) {
4342 _PyErr_SetObject(tstate, PyExc_AttributeError, id->object);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004343 return NULL;
4344 }
4345 return res;
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004346}
4347
4348
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00004349/* Logic for the raise statement (too complicated for inlining).
4350 This *consumes* a reference count to each of its arguments. */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004351static int
Victor Stinner09532fe2019-05-10 23:39:09 +02004352do_raise(PyThreadState *tstate, PyObject *exc, PyObject *cause)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00004353{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004354 PyObject *type = NULL, *value = NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00004355
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004356 if (exc == NULL) {
4357 /* Reraise */
Mark Shannonae3087c2017-10-22 22:41:51 +01004358 _PyErr_StackItem *exc_info = _PyErr_GetTopmostException(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004359 PyObject *tb;
Mark Shannonae3087c2017-10-22 22:41:51 +01004360 type = exc_info->exc_type;
4361 value = exc_info->exc_value;
4362 tb = exc_info->exc_traceback;
Victor Stinnereec93312016-08-18 18:13:10 +02004363 if (type == Py_None || type == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004364 _PyErr_SetString(tstate, PyExc_RuntimeError,
4365 "No active exception to reraise");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004366 return 0;
4367 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004368 Py_XINCREF(type);
4369 Py_XINCREF(value);
4370 Py_XINCREF(tb);
Victor Stinner438a12d2019-05-24 17:01:38 +02004371 _PyErr_Restore(tstate, type, value, tb);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004372 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004373 }
Guido van Rossumac7be682001-01-17 15:42:30 +00004374
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004375 /* We support the following forms of raise:
4376 raise
Collin Winter828f04a2007-08-31 00:04:24 +00004377 raise <instance>
4378 raise <type> */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00004379
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004380 if (PyExceptionClass_Check(exc)) {
4381 type = exc;
Victor Stinnera5ed5f02016-12-06 18:45:50 +01004382 value = _PyObject_CallNoArg(exc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004383 if (value == NULL)
4384 goto raise_error;
Benjamin Peterson5afa03a2011-07-15 14:09:26 -05004385 if (!PyExceptionInstance_Check(value)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004386 _PyErr_Format(tstate, PyExc_TypeError,
4387 "calling %R should have returned an instance of "
4388 "BaseException, not %R",
4389 type, Py_TYPE(value));
4390 goto raise_error;
Benjamin Peterson5afa03a2011-07-15 14:09:26 -05004391 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004392 }
4393 else if (PyExceptionInstance_Check(exc)) {
4394 value = exc;
4395 type = PyExceptionInstance_Class(exc);
4396 Py_INCREF(type);
4397 }
4398 else {
4399 /* Not something you can raise. You get an exception
4400 anyway, just not what you specified :-) */
4401 Py_DECREF(exc);
Victor Stinner438a12d2019-05-24 17:01:38 +02004402 _PyErr_SetString(tstate, PyExc_TypeError,
4403 "exceptions must derive from BaseException");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004404 goto raise_error;
4405 }
Collin Winter828f04a2007-08-31 00:04:24 +00004406
Serhiy Storchakac0191582016-09-27 11:37:10 +03004407 assert(type != NULL);
4408 assert(value != NULL);
4409
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004410 if (cause) {
4411 PyObject *fixed_cause;
4412 if (PyExceptionClass_Check(cause)) {
Victor Stinnera5ed5f02016-12-06 18:45:50 +01004413 fixed_cause = _PyObject_CallNoArg(cause);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004414 if (fixed_cause == NULL)
4415 goto raise_error;
Benjamin Petersond5a1c442012-05-14 22:09:31 -07004416 Py_DECREF(cause);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004417 }
Benjamin Petersond5a1c442012-05-14 22:09:31 -07004418 else if (PyExceptionInstance_Check(cause)) {
4419 fixed_cause = cause;
4420 }
4421 else if (cause == Py_None) {
4422 Py_DECREF(cause);
4423 fixed_cause = NULL;
4424 }
4425 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02004426 _PyErr_SetString(tstate, PyExc_TypeError,
4427 "exception causes must derive from "
4428 "BaseException");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004429 goto raise_error;
4430 }
Benjamin Petersond5a1c442012-05-14 22:09:31 -07004431 PyException_SetCause(value, fixed_cause);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004432 }
Collin Winter828f04a2007-08-31 00:04:24 +00004433
Victor Stinner438a12d2019-05-24 17:01:38 +02004434 _PyErr_SetObject(tstate, type, value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004435 /* PyErr_SetObject incref's its arguments */
Serhiy Storchakac0191582016-09-27 11:37:10 +03004436 Py_DECREF(value);
4437 Py_DECREF(type);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004438 return 0;
Collin Winter828f04a2007-08-31 00:04:24 +00004439
4440raise_error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004441 Py_XDECREF(value);
4442 Py_XDECREF(type);
4443 Py_XDECREF(cause);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004444 return 0;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00004445}
4446
Tim Petersd6d010b2001-06-21 02:49:55 +00004447/* Iterate v argcnt times and store the results on the stack (via decreasing
Guido van Rossum0368b722007-05-11 16:50:42 +00004448 sp). Return 1 for success, 0 if error.
Antoine Pitrou9a2310d2008-07-25 22:39:39 +00004449
Guido van Rossum0368b722007-05-11 16:50:42 +00004450 If argcntafter == -1, do a simple unpack. If it is >= 0, do an unpack
4451 with a variable target.
4452*/
Tim Petersd6d010b2001-06-21 02:49:55 +00004453
Barry Warsawe42b18f1997-08-25 22:13:04 +00004454static int
Victor Stinner438a12d2019-05-24 17:01:38 +02004455unpack_iterable(PyThreadState *tstate, PyObject *v,
4456 int argcnt, int argcntafter, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00004457{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004458 int i = 0, j = 0;
4459 Py_ssize_t ll = 0;
4460 PyObject *it; /* iter(v) */
4461 PyObject *w;
4462 PyObject *l = NULL; /* variable list */
Guido van Rossumac7be682001-01-17 15:42:30 +00004463
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004464 assert(v != NULL);
Tim Petersd6d010b2001-06-21 02:49:55 +00004465
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004466 it = PyObject_GetIter(v);
Serhiy Storchaka13a6c092017-12-26 12:30:41 +02004467 if (it == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004468 if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError) &&
Serhiy Storchaka13a6c092017-12-26 12:30:41 +02004469 v->ob_type->tp_iter == NULL && !PySequence_Check(v))
4470 {
Victor Stinner438a12d2019-05-24 17:01:38 +02004471 _PyErr_Format(tstate, PyExc_TypeError,
4472 "cannot unpack non-iterable %.200s object",
4473 v->ob_type->tp_name);
Serhiy Storchaka13a6c092017-12-26 12:30:41 +02004474 }
4475 return 0;
4476 }
Tim Petersd6d010b2001-06-21 02:49:55 +00004477
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004478 for (; i < argcnt; i++) {
4479 w = PyIter_Next(it);
4480 if (w == NULL) {
4481 /* Iterator done, via error or exhaustion. */
Victor Stinner438a12d2019-05-24 17:01:38 +02004482 if (!_PyErr_Occurred(tstate)) {
R David Murray4171bbe2015-04-15 17:08:45 -04004483 if (argcntafter == -1) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004484 _PyErr_Format(tstate, PyExc_ValueError,
4485 "not enough values to unpack "
4486 "(expected %d, got %d)",
4487 argcnt, i);
R David Murray4171bbe2015-04-15 17:08:45 -04004488 }
4489 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02004490 _PyErr_Format(tstate, PyExc_ValueError,
4491 "not enough values to unpack "
4492 "(expected at least %d, got %d)",
4493 argcnt + argcntafter, i);
R David Murray4171bbe2015-04-15 17:08:45 -04004494 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004495 }
4496 goto Error;
4497 }
4498 *--sp = w;
4499 }
Tim Petersd6d010b2001-06-21 02:49:55 +00004500
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004501 if (argcntafter == -1) {
4502 /* We better have exhausted the iterator now. */
4503 w = PyIter_Next(it);
4504 if (w == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004505 if (_PyErr_Occurred(tstate))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004506 goto Error;
4507 Py_DECREF(it);
4508 return 1;
4509 }
4510 Py_DECREF(w);
Victor Stinner438a12d2019-05-24 17:01:38 +02004511 _PyErr_Format(tstate, PyExc_ValueError,
4512 "too many values to unpack (expected %d)",
4513 argcnt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004514 goto Error;
4515 }
Guido van Rossum0368b722007-05-11 16:50:42 +00004516
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004517 l = PySequence_List(it);
4518 if (l == NULL)
4519 goto Error;
4520 *--sp = l;
4521 i++;
Guido van Rossum0368b722007-05-11 16:50:42 +00004522
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004523 ll = PyList_GET_SIZE(l);
4524 if (ll < argcntafter) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004525 _PyErr_Format(tstate, PyExc_ValueError,
R David Murray4171bbe2015-04-15 17:08:45 -04004526 "not enough values to unpack (expected at least %d, got %zd)",
4527 argcnt + argcntafter, argcnt + ll);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004528 goto Error;
4529 }
Guido van Rossum0368b722007-05-11 16:50:42 +00004530
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004531 /* Pop the "after-variable" args off the list. */
4532 for (j = argcntafter; j > 0; j--, i++) {
4533 *--sp = PyList_GET_ITEM(l, ll - j);
4534 }
4535 /* Resize the list. */
4536 Py_SIZE(l) = ll - argcntafter;
4537 Py_DECREF(it);
4538 return 1;
Guido van Rossum0368b722007-05-11 16:50:42 +00004539
Tim Petersd6d010b2001-06-21 02:49:55 +00004540Error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004541 for (; i > 0; i--, sp++)
4542 Py_DECREF(*sp);
4543 Py_XDECREF(it);
4544 return 0;
Barry Warsawe42b18f1997-08-25 22:13:04 +00004545}
4546
4547
Guido van Rossum96a42c81992-01-12 02:29:51 +00004548#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00004549static int
Victor Stinner438a12d2019-05-24 17:01:38 +02004550prtrace(PyThreadState *tstate, PyObject *v, const char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004551{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004552 printf("%s ", str);
Victor Stinner438a12d2019-05-24 17:01:38 +02004553 if (PyObject_Print(v, stdout, 0) != 0) {
4554 /* Don't know what else to do */
4555 _PyErr_Clear(tstate);
4556 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004557 printf("\n");
4558 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004559}
Guido van Rossum3f5da241990-12-20 15:06:42 +00004560#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004561
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00004562static void
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004563call_exc_trace(Py_tracefunc func, PyObject *self,
4564 PyThreadState *tstate, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00004565{
Victor Stinneraaa8ed82013-07-10 13:57:55 +02004566 PyObject *type, *value, *traceback, *orig_traceback, *arg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004567 int err;
Victor Stinner438a12d2019-05-24 17:01:38 +02004568 _PyErr_Fetch(tstate, &type, &value, &orig_traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004569 if (value == NULL) {
4570 value = Py_None;
4571 Py_INCREF(value);
4572 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004573 _PyErr_NormalizeException(tstate, &type, &value, &orig_traceback);
Antoine Pitrou89335212013-11-23 14:05:23 +01004574 traceback = (orig_traceback != NULL) ? orig_traceback : Py_None;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004575 arg = PyTuple_Pack(3, type, value, traceback);
4576 if (arg == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004577 _PyErr_Restore(tstate, type, value, orig_traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004578 return;
4579 }
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004580 err = call_trace(func, self, tstate, f, PyTrace_EXCEPTION, arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004581 Py_DECREF(arg);
Victor Stinner438a12d2019-05-24 17:01:38 +02004582 if (err == 0) {
4583 _PyErr_Restore(tstate, type, value, orig_traceback);
4584 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004585 else {
4586 Py_XDECREF(type);
4587 Py_XDECREF(value);
Victor Stinneraaa8ed82013-07-10 13:57:55 +02004588 Py_XDECREF(orig_traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004589 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00004590}
4591
Amaury Forgeot d'Arcf05149a2007-11-13 01:05:30 +00004592static int
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004593call_trace_protected(Py_tracefunc func, PyObject *obj,
4594 PyThreadState *tstate, PyFrameObject *frame,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004595 int what, PyObject *arg)
Fred Drake4ec5d562001-10-04 19:26:43 +00004596{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004597 PyObject *type, *value, *traceback;
4598 int err;
Victor Stinner438a12d2019-05-24 17:01:38 +02004599 _PyErr_Fetch(tstate, &type, &value, &traceback);
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004600 err = call_trace(func, obj, tstate, frame, what, arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004601 if (err == 0)
4602 {
Victor Stinner438a12d2019-05-24 17:01:38 +02004603 _PyErr_Restore(tstate, type, value, traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004604 return 0;
4605 }
4606 else {
4607 Py_XDECREF(type);
4608 Py_XDECREF(value);
4609 Py_XDECREF(traceback);
4610 return -1;
4611 }
Fred Drake4ec5d562001-10-04 19:26:43 +00004612}
4613
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00004614static int
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004615call_trace(Py_tracefunc func, PyObject *obj,
4616 PyThreadState *tstate, PyFrameObject *frame,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004617 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00004618{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004619 int result;
4620 if (tstate->tracing)
4621 return 0;
4622 tstate->tracing++;
4623 tstate->use_tracing = 0;
4624 result = func(obj, frame, what, arg);
4625 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
4626 || (tstate->c_profilefunc != NULL));
4627 tstate->tracing--;
4628 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00004629}
4630
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00004631PyObject *
4632_PyEval_CallTracing(PyObject *func, PyObject *args)
4633{
Victor Stinner50b48572018-11-01 01:51:40 +01004634 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004635 int save_tracing = tstate->tracing;
4636 int save_use_tracing = tstate->use_tracing;
4637 PyObject *result;
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00004638
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004639 tstate->tracing = 0;
4640 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
4641 || (tstate->c_profilefunc != NULL));
4642 result = PyObject_Call(func, args, NULL);
4643 tstate->tracing = save_tracing;
4644 tstate->use_tracing = save_use_tracing;
4645 return result;
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00004646}
4647
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00004648/* See Objects/lnotab_notes.txt for a description of how tracing works. */
Michael W. Hudson006c7522002-11-08 13:08:46 +00004649static int
Tim Peters8a5c3c72004-04-05 19:36:21 +00004650maybe_call_line_trace(Py_tracefunc func, PyObject *obj,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004651 PyThreadState *tstate, PyFrameObject *frame,
4652 int *instr_lb, int *instr_ub, int *instr_prev)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004653{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004654 int result = 0;
4655 int line = frame->f_lineno;
Michael W. Hudson006c7522002-11-08 13:08:46 +00004656
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004657 /* If the last instruction executed isn't in the current
4658 instruction window, reset the window.
4659 */
4660 if (frame->f_lasti < *instr_lb || frame->f_lasti >= *instr_ub) {
4661 PyAddrPair bounds;
4662 line = _PyCode_CheckLineNumber(frame->f_code, frame->f_lasti,
4663 &bounds);
4664 *instr_lb = bounds.ap_lower;
4665 *instr_ub = bounds.ap_upper;
4666 }
Nick Coghlan5a851672017-09-08 10:14:16 +10004667 /* If the last instruction falls at the start of a line or if it
4668 represents a jump backwards, update the frame's line number and
4669 then call the trace function if we're tracing source lines.
4670 */
4671 if ((frame->f_lasti == *instr_lb || frame->f_lasti < *instr_prev)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004672 frame->f_lineno = line;
Nick Coghlan5a851672017-09-08 10:14:16 +10004673 if (frame->f_trace_lines) {
4674 result = call_trace(func, obj, tstate, frame, PyTrace_LINE, Py_None);
4675 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004676 }
George King20faa682017-10-18 17:44:22 -07004677 /* Always emit an opcode event if we're tracing all opcodes. */
4678 if (frame->f_trace_opcodes) {
4679 result = call_trace(func, obj, tstate, frame, PyTrace_OPCODE, Py_None);
4680 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004681 *instr_prev = frame->f_lasti;
4682 return result;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004683}
4684
Fred Drake5755ce62001-06-27 19:19:46 +00004685void
4686PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00004687{
Steve Dowerb82e17e2019-05-23 08:45:22 -07004688 if (PySys_Audit("sys.setprofile", NULL) < 0) {
4689 return;
4690 }
4691
Victor Stinner50b48572018-11-01 01:51:40 +01004692 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004693 PyObject *temp = tstate->c_profileobj;
4694 Py_XINCREF(arg);
4695 tstate->c_profilefunc = NULL;
4696 tstate->c_profileobj = NULL;
4697 /* Must make sure that tracing is not ignored if 'temp' is freed */
4698 tstate->use_tracing = tstate->c_tracefunc != NULL;
4699 Py_XDECREF(temp);
4700 tstate->c_profilefunc = func;
4701 tstate->c_profileobj = arg;
4702 /* Flag that tracing or profiling is turned on */
4703 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
Fred Drake5755ce62001-06-27 19:19:46 +00004704}
4705
4706void
4707PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
4708{
Steve Dowerb82e17e2019-05-23 08:45:22 -07004709 if (PySys_Audit("sys.settrace", NULL) < 0) {
4710 return;
4711 }
4712
Victor Stinner09532fe2019-05-10 23:39:09 +02004713 _PyRuntimeState *runtime = &_PyRuntime;
4714 PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004715 PyObject *temp = tstate->c_traceobj;
Victor Stinner09532fe2019-05-10 23:39:09 +02004716 runtime->ceval.tracing_possible += (func != NULL) - (tstate->c_tracefunc != NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004717 Py_XINCREF(arg);
4718 tstate->c_tracefunc = NULL;
4719 tstate->c_traceobj = NULL;
4720 /* Must make sure that profiling is not ignored if 'temp' is freed */
4721 tstate->use_tracing = tstate->c_profilefunc != NULL;
4722 Py_XDECREF(temp);
4723 tstate->c_tracefunc = func;
4724 tstate->c_traceobj = arg;
4725 /* Flag that tracing or profiling is turned on */
4726 tstate->use_tracing = ((func != NULL)
4727 || (tstate->c_profilefunc != NULL));
Fred Draked0838392001-06-16 21:02:31 +00004728}
4729
Yury Selivanov75445082015-05-11 22:57:16 -04004730void
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08004731_PyEval_SetCoroutineOriginTrackingDepth(int new_depth)
4732{
4733 assert(new_depth >= 0);
Victor Stinner50b48572018-11-01 01:51:40 +01004734 PyThreadState *tstate = _PyThreadState_GET();
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08004735 tstate->coroutine_origin_tracking_depth = new_depth;
4736}
4737
4738int
4739_PyEval_GetCoroutineOriginTrackingDepth(void)
4740{
Victor Stinner50b48572018-11-01 01:51:40 +01004741 PyThreadState *tstate = _PyThreadState_GET();
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08004742 return tstate->coroutine_origin_tracking_depth;
4743}
4744
4745void
Yury Selivanoveb636452016-09-08 22:01:51 -07004746_PyEval_SetAsyncGenFirstiter(PyObject *firstiter)
4747{
Victor Stinner50b48572018-11-01 01:51:40 +01004748 PyThreadState *tstate = _PyThreadState_GET();
Steve Dowerb82e17e2019-05-23 08:45:22 -07004749
4750 if (PySys_Audit("sys.set_asyncgen_hook_firstiter", NULL) < 0) {
4751 return;
4752 }
4753
Yury Selivanoveb636452016-09-08 22:01:51 -07004754 Py_XINCREF(firstiter);
4755 Py_XSETREF(tstate->async_gen_firstiter, firstiter);
4756}
4757
4758PyObject *
4759_PyEval_GetAsyncGenFirstiter(void)
4760{
Victor Stinner50b48572018-11-01 01:51:40 +01004761 PyThreadState *tstate = _PyThreadState_GET();
Yury Selivanoveb636452016-09-08 22:01:51 -07004762 return tstate->async_gen_firstiter;
4763}
4764
4765void
4766_PyEval_SetAsyncGenFinalizer(PyObject *finalizer)
4767{
Victor Stinner50b48572018-11-01 01:51:40 +01004768 PyThreadState *tstate = _PyThreadState_GET();
Steve Dowerb82e17e2019-05-23 08:45:22 -07004769
4770 if (PySys_Audit("sys.set_asyncgen_hook_finalizer", NULL) < 0) {
4771 return;
4772 }
4773
Yury Selivanoveb636452016-09-08 22:01:51 -07004774 Py_XINCREF(finalizer);
4775 Py_XSETREF(tstate->async_gen_finalizer, finalizer);
4776}
4777
4778PyObject *
4779_PyEval_GetAsyncGenFinalizer(void)
4780{
Victor Stinner50b48572018-11-01 01:51:40 +01004781 PyThreadState *tstate = _PyThreadState_GET();
Yury Selivanoveb636452016-09-08 22:01:51 -07004782 return tstate->async_gen_finalizer;
4783}
4784
Victor Stinner438a12d2019-05-24 17:01:38 +02004785static PyFrameObject *
4786_PyEval_GetFrame(PyThreadState *tstate)
4787{
4788 return _PyRuntime.gilstate.getframe(tstate);
4789}
4790
4791PyFrameObject *
4792PyEval_GetFrame(void)
4793{
4794 PyThreadState *tstate = _PyThreadState_GET();
4795 return _PyEval_GetFrame(tstate);
4796}
4797
Guido van Rossumb209a111997-04-29 18:18:01 +00004798PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004799PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00004800{
Victor Stinner438a12d2019-05-24 17:01:38 +02004801 PyThreadState *tstate = _PyThreadState_GET();
4802 PyFrameObject *current_frame = _PyEval_GetFrame(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004803 if (current_frame == NULL)
Victor Stinner438a12d2019-05-24 17:01:38 +02004804 return tstate->interp->builtins;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004805 else
4806 return current_frame->f_builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00004807}
4808
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02004809/* Convenience function to get a builtin from its name */
4810PyObject *
4811_PyEval_GetBuiltinId(_Py_Identifier *name)
4812{
Victor Stinner438a12d2019-05-24 17:01:38 +02004813 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02004814 PyObject *attr = _PyDict_GetItemIdWithError(PyEval_GetBuiltins(), name);
4815 if (attr) {
4816 Py_INCREF(attr);
4817 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004818 else if (!_PyErr_Occurred(tstate)) {
4819 _PyErr_SetObject(tstate, PyExc_AttributeError, _PyUnicode_FromId(name));
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02004820 }
4821 return attr;
4822}
4823
Guido van Rossumb209a111997-04-29 18:18:01 +00004824PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004825PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00004826{
Victor Stinner438a12d2019-05-24 17:01:38 +02004827 PyThreadState *tstate = _PyThreadState_GET();
4828 PyFrameObject *current_frame = _PyEval_GetFrame(tstate);
Victor Stinner41bb43a2013-10-29 01:19:37 +01004829 if (current_frame == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004830 _PyErr_SetString(tstate, PyExc_SystemError, "frame does not exist");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004831 return NULL;
Victor Stinner41bb43a2013-10-29 01:19:37 +01004832 }
4833
Victor Stinner438a12d2019-05-24 17:01:38 +02004834 if (PyFrame_FastToLocalsWithError(current_frame) < 0) {
Victor Stinner41bb43a2013-10-29 01:19:37 +01004835 return NULL;
Victor Stinner438a12d2019-05-24 17:01:38 +02004836 }
Victor Stinner41bb43a2013-10-29 01:19:37 +01004837
4838 assert(current_frame->f_locals != NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004839 return current_frame->f_locals;
Guido van Rossum5b722181993-03-30 17:46:03 +00004840}
4841
Guido van Rossumb209a111997-04-29 18:18:01 +00004842PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004843PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00004844{
Victor Stinner438a12d2019-05-24 17:01:38 +02004845 PyThreadState *tstate = _PyThreadState_GET();
4846 PyFrameObject *current_frame = _PyEval_GetFrame(tstate);
4847 if (current_frame == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004848 return NULL;
Victor Stinner438a12d2019-05-24 17:01:38 +02004849 }
Victor Stinner41bb43a2013-10-29 01:19:37 +01004850
4851 assert(current_frame->f_globals != NULL);
4852 return current_frame->f_globals;
Guido van Rossum3f5da241990-12-20 15:06:42 +00004853}
4854
Guido van Rossum6135a871995-01-09 17:53:26 +00004855int
Tim Peters5ba58662001-07-16 02:29:45 +00004856PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
Jeremy Hylton061d1062001-03-22 02:32:48 +00004857{
Victor Stinner438a12d2019-05-24 17:01:38 +02004858 PyThreadState *tstate = _PyThreadState_GET();
4859 PyFrameObject *current_frame = _PyEval_GetFrame(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004860 int result = cf->cf_flags != 0;
Tim Peters5ba58662001-07-16 02:29:45 +00004861
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004862 if (current_frame != NULL) {
4863 const int codeflags = current_frame->f_code->co_flags;
4864 const int compilerflags = codeflags & PyCF_MASK;
4865 if (compilerflags) {
4866 result = 1;
4867 cf->cf_flags |= compilerflags;
4868 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00004869#if 0 /* future keyword */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004870 if (codeflags & CO_GENERATOR_ALLOWED) {
4871 result = 1;
4872 cf->cf_flags |= CO_GENERATOR_ALLOWED;
4873 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00004874#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004875 }
4876 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00004877}
4878
Guido van Rossum3f5da241990-12-20 15:06:42 +00004879
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00004880const char *
Tim Peters6d6c1a32001-08-02 04:15:00 +00004881PyEval_GetFuncName(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00004882{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004883 if (PyMethod_Check(func))
4884 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
4885 else if (PyFunction_Check(func))
Serhiy Storchaka06515832016-11-20 09:13:07 +02004886 return PyUnicode_AsUTF8(((PyFunctionObject*)func)->func_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004887 else if (PyCFunction_Check(func))
4888 return ((PyCFunctionObject*)func)->m_ml->ml_name;
4889 else
4890 return func->ob_type->tp_name;
Jeremy Hylton512a2372001-04-11 13:52:29 +00004891}
4892
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00004893const char *
Tim Peters6d6c1a32001-08-02 04:15:00 +00004894PyEval_GetFuncDesc(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00004895{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004896 if (PyMethod_Check(func))
4897 return "()";
4898 else if (PyFunction_Check(func))
4899 return "()";
4900 else if (PyCFunction_Check(func))
4901 return "()";
4902 else
4903 return " object";
Jeremy Hylton512a2372001-04-11 13:52:29 +00004904}
4905
Armin Rigo1c2d7e52005-09-20 18:34:01 +00004906#define C_TRACE(x, call) \
Nicholas Bastind858a772004-06-25 23:31:06 +00004907if (tstate->use_tracing && tstate->c_profilefunc) { \
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004908 if (call_trace(tstate->c_profilefunc, tstate->c_profileobj, \
4909 tstate, tstate->frame, \
4910 PyTrace_C_CALL, func)) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004911 x = NULL; \
4912 } \
4913 else { \
4914 x = call; \
4915 if (tstate->c_profilefunc != NULL) { \
4916 if (x == NULL) { \
4917 call_trace_protected(tstate->c_profilefunc, \
4918 tstate->c_profileobj, \
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004919 tstate, tstate->frame, \
4920 PyTrace_C_EXCEPTION, func); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004921 /* XXX should pass (type, value, tb) */ \
4922 } else { \
4923 if (call_trace(tstate->c_profilefunc, \
4924 tstate->c_profileobj, \
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004925 tstate, tstate->frame, \
4926 PyTrace_C_RETURN, func)) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004927 Py_DECREF(x); \
4928 x = NULL; \
4929 } \
4930 } \
4931 } \
4932 } \
Nicholas Bastind858a772004-06-25 23:31:06 +00004933} else { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004934 x = call; \
4935 }
Nicholas Bastinc69ebe82004-03-24 21:57:10 +00004936
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02004937
4938static PyObject *
4939trace_call_function(PyThreadState *tstate,
4940 PyObject *func,
4941 PyObject **args, Py_ssize_t nargs,
4942 PyObject *kwnames)
4943{
4944 PyObject *x;
4945 if (PyCFunction_Check(func)) {
Jeroen Demeyerbf8e82f2019-07-23 12:39:51 +02004946 C_TRACE(x, _PyObject_Vectorcall(func, args, nargs, kwnames));
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02004947 return x;
4948 }
4949 else if (Py_TYPE(func) == &PyMethodDescr_Type && nargs > 0) {
4950 /* We need to create a temporary bound method as argument
4951 for profiling.
4952
4953 If nargs == 0, then this cannot work because we have no
4954 "self". In any case, the call itself would raise
4955 TypeError (foo needs an argument), so we just skip
4956 profiling. */
4957 PyObject *self = args[0];
4958 func = Py_TYPE(func)->tp_descr_get(func, self, (PyObject*)Py_TYPE(self));
4959 if (func == NULL) {
4960 return NULL;
4961 }
Jeroen Demeyerbf8e82f2019-07-23 12:39:51 +02004962 C_TRACE(x, _PyObject_Vectorcall(func,
4963 args+1, nargs-1,
4964 kwnames));
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02004965 Py_DECREF(func);
4966 return x;
4967 }
4968 return _PyObject_Vectorcall(func, args, nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames);
4969}
4970
Victor Stinner415c5102017-01-11 00:54:57 +01004971/* Issue #29227: Inline call_function() into _PyEval_EvalFrameDefault()
4972 to reduce the stack consumption. */
4973Py_LOCAL_INLINE(PyObject *) _Py_HOT_FUNCTION
Victor Stinner09532fe2019-05-10 23:39:09 +02004974call_function(PyThreadState *tstate, PyObject ***pp_stack, Py_ssize_t oparg, PyObject *kwnames)
Jeremy Hyltone8c04322002-08-16 17:47:26 +00004975{
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004976 PyObject **pfunc = (*pp_stack) - oparg - 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004977 PyObject *func = *pfunc;
4978 PyObject *x, *w;
Victor Stinnerd8735722016-09-09 12:36:44 -07004979 Py_ssize_t nkwargs = (kwnames == NULL) ? 0 : PyTuple_GET_SIZE(kwnames);
4980 Py_ssize_t nargs = oparg - nkwargs;
INADA Naoki5566bbb2017-02-03 07:43:03 +09004981 PyObject **stack = (*pp_stack) - nargs - nkwargs;
Jeremy Hyltone8c04322002-08-16 17:47:26 +00004982
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02004983 if (tstate->use_tracing) {
4984 x = trace_call_function(tstate, func, stack, nargs, kwnames);
INADA Naoki5566bbb2017-02-03 07:43:03 +09004985 }
Victor Stinner4a7cc882015-03-06 23:35:27 +01004986 else {
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02004987 x = _PyObject_Vectorcall(func, stack, nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004988 }
Tim Peters8a5c3c72004-04-05 19:36:21 +00004989
Victor Stinner438a12d2019-05-24 17:01:38 +02004990 assert((x != NULL) ^ (_PyErr_Occurred(tstate) != NULL));
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004991
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01004992 /* Clear the stack of the function object. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004993 while ((*pp_stack) > pfunc) {
4994 w = EXT_POP(*pp_stack);
4995 Py_DECREF(w);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004996 }
Victor Stinnerace47d72013-07-18 01:41:08 +02004997
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004998 return x;
Jeremy Hyltone8c04322002-08-16 17:47:26 +00004999}
5000
Jeremy Hylton52820442001-01-03 23:52:36 +00005001static PyObject *
Victor Stinner09532fe2019-05-10 23:39:09 +02005002do_call_core(PyThreadState *tstate, PyObject *func, PyObject *callargs, PyObject *kwdict)
Jeremy Hylton52820442001-01-03 23:52:36 +00005003{
jdemeyere89de732018-09-19 12:06:20 +02005004 PyObject *result;
5005
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005006 if (PyCFunction_Check(func)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005007 C_TRACE(result, PyCFunction_Call(func, callargs, kwdict));
Victor Stinnerf9b760f2016-09-09 10:17:08 -07005008 return result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005009 }
jdemeyere89de732018-09-19 12:06:20 +02005010 else if (Py_TYPE(func) == &PyMethodDescr_Type) {
jdemeyere89de732018-09-19 12:06:20 +02005011 Py_ssize_t nargs = PyTuple_GET_SIZE(callargs);
5012 if (nargs > 0 && tstate->use_tracing) {
5013 /* We need to create a temporary bound method as argument
5014 for profiling.
5015
5016 If nargs == 0, then this cannot work because we have no
5017 "self". In any case, the call itself would raise
5018 TypeError (foo needs an argument), so we just skip
5019 profiling. */
5020 PyObject *self = PyTuple_GET_ITEM(callargs, 0);
5021 func = Py_TYPE(func)->tp_descr_get(func, self, (PyObject*)Py_TYPE(self));
5022 if (func == NULL) {
5023 return NULL;
5024 }
5025
Jeroen Demeyerbf8e82f2019-07-23 12:39:51 +02005026 C_TRACE(result, _PyObject_FastCallDict(func,
5027 &_PyTuple_ITEMS(callargs)[1],
5028 nargs - 1,
5029 kwdict));
jdemeyere89de732018-09-19 12:06:20 +02005030 Py_DECREF(func);
5031 return result;
5032 }
Victor Stinner74319ae2016-08-25 00:04:09 +02005033 }
jdemeyere89de732018-09-19 12:06:20 +02005034 return PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00005035}
5036
Serhiy Storchaka483405b2015-02-17 10:14:30 +02005037/* Extract a slice index from a PyLong or an object with the
Guido van Rossum38fff8c2006-03-07 18:50:55 +00005038 nb_index slot defined, and store in *pi.
5039 Silently reduce values larger than PY_SSIZE_T_MAX to PY_SSIZE_T_MAX,
Xiang Zhang2ddf5a12017-05-10 18:19:41 +08005040 and silently boost values less than PY_SSIZE_T_MIN to PY_SSIZE_T_MIN.
Martin v. Löwisdde99d22006-02-17 15:57:41 +00005041 Return 0 on error, 1 on success.
Tim Peterscb479e72001-12-16 19:11:44 +00005042*/
Guido van Rossum20c6add2000-05-08 14:06:50 +00005043int
Martin v. Löwis18e16552006-02-15 17:27:45 +00005044_PyEval_SliceIndex(PyObject *v, Py_ssize_t *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005045{
Victor Stinner438a12d2019-05-24 17:01:38 +02005046 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005047 if (v != Py_None) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005048 Py_ssize_t x;
5049 if (PyIndex_Check(v)) {
5050 x = PyNumber_AsSsize_t(v, NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02005051 if (x == -1 && _PyErr_Occurred(tstate))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005052 return 0;
5053 }
5054 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02005055 _PyErr_SetString(tstate, PyExc_TypeError,
5056 "slice indices must be integers or "
5057 "None or have an __index__ method");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005058 return 0;
5059 }
5060 *pi = x;
5061 }
5062 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005063}
5064
Serhiy Storchaka80ec8362017-03-19 19:37:40 +02005065int
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005066_PyEval_SliceIndexNotNone(PyObject *v, Py_ssize_t *pi)
Serhiy Storchaka80ec8362017-03-19 19:37:40 +02005067{
Victor Stinner438a12d2019-05-24 17:01:38 +02005068 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005069 Py_ssize_t x;
5070 if (PyIndex_Check(v)) {
5071 x = PyNumber_AsSsize_t(v, NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02005072 if (x == -1 && _PyErr_Occurred(tstate))
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005073 return 0;
5074 }
5075 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02005076 _PyErr_SetString(tstate, PyExc_TypeError,
5077 "slice indices must be integers or "
5078 "have an __index__ method");
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03005079 return 0;
5080 }
5081 *pi = x;
5082 return 1;
Serhiy Storchaka80ec8362017-03-19 19:37:40 +02005083}
5084
5085
Guido van Rossum486364b2007-06-30 05:01:58 +00005086#define CANNOT_CATCH_MSG "catching classes that do not inherit from "\
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005087 "BaseException is not allowed"
Brett Cannonf74225d2007-02-26 21:10:16 +00005088
Guido van Rossumb209a111997-04-29 18:18:01 +00005089static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02005090cmp_outcome(PyThreadState *tstate, int op, PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005091{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005092 int res = 0;
5093 switch (op) {
5094 case PyCmp_IS:
5095 res = (v == w);
5096 break;
5097 case PyCmp_IS_NOT:
5098 res = (v != w);
5099 break;
5100 case PyCmp_IN:
5101 res = PySequence_Contains(w, v);
5102 if (res < 0)
5103 return NULL;
5104 break;
5105 case PyCmp_NOT_IN:
5106 res = PySequence_Contains(w, v);
5107 if (res < 0)
5108 return NULL;
5109 res = !res;
5110 break;
5111 case PyCmp_EXC_MATCH:
5112 if (PyTuple_Check(w)) {
5113 Py_ssize_t i, length;
5114 length = PyTuple_Size(w);
5115 for (i = 0; i < length; i += 1) {
5116 PyObject *exc = PyTuple_GET_ITEM(w, i);
5117 if (!PyExceptionClass_Check(exc)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005118 _PyErr_SetString(tstate, PyExc_TypeError,
5119 CANNOT_CATCH_MSG);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005120 return NULL;
5121 }
5122 }
5123 }
5124 else {
5125 if (!PyExceptionClass_Check(w)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005126 _PyErr_SetString(tstate, PyExc_TypeError,
5127 CANNOT_CATCH_MSG);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005128 return NULL;
5129 }
5130 }
5131 res = PyErr_GivenExceptionMatches(v, w);
5132 break;
5133 default:
5134 return PyObject_RichCompare(v, w, op);
5135 }
5136 v = res ? Py_True : Py_False;
5137 Py_INCREF(v);
5138 return v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005139}
5140
Thomas Wouters52152252000-08-17 22:55:00 +00005141static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02005142import_name(PyThreadState *tstate, PyFrameObject *f,
5143 PyObject *name, PyObject *fromlist, PyObject *level)
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005144{
5145 _Py_IDENTIFIER(__import__);
Victor Stinnerdf142fd2016-08-20 00:44:42 +02005146 PyObject *import_func, *res;
5147 PyObject* stack[5];
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005148
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02005149 import_func = _PyDict_GetItemIdWithError(f->f_builtins, &PyId___import__);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005150 if (import_func == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005151 if (!_PyErr_Occurred(tstate)) {
5152 _PyErr_SetString(tstate, PyExc_ImportError, "__import__ not found");
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02005153 }
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005154 return NULL;
5155 }
5156
5157 /* Fast path for not overloaded __import__. */
Victor Stinner438a12d2019-05-24 17:01:38 +02005158 if (import_func == tstate->interp->import_func) {
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005159 int ilevel = _PyLong_AsInt(level);
Victor Stinner438a12d2019-05-24 17:01:38 +02005160 if (ilevel == -1 && _PyErr_Occurred(tstate)) {
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005161 return NULL;
5162 }
5163 res = PyImport_ImportModuleLevelObject(
5164 name,
5165 f->f_globals,
5166 f->f_locals == NULL ? Py_None : f->f_locals,
5167 fromlist,
5168 ilevel);
5169 return res;
5170 }
5171
5172 Py_INCREF(import_func);
Victor Stinnerdf142fd2016-08-20 00:44:42 +02005173
5174 stack[0] = name;
5175 stack[1] = f->f_globals;
5176 stack[2] = f->f_locals == NULL ? Py_None : f->f_locals;
5177 stack[3] = fromlist;
5178 stack[4] = level;
Victor Stinner559bb6a2016-08-22 22:48:54 +02005179 res = _PyObject_FastCall(import_func, stack, 5);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005180 Py_DECREF(import_func);
5181 return res;
5182}
5183
5184static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02005185import_from(PyThreadState *tstate, PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00005186{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005187 PyObject *x;
Antoine Pitrou0373a102014-10-13 20:19:45 +02005188 _Py_IDENTIFIER(__name__);
Xiang Zhang4830f582017-03-21 11:13:42 +08005189 PyObject *fullmodname, *pkgname, *pkgpath, *pkgname_or_unknown, *errmsg;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00005190
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005191 if (_PyObject_LookupAttr(v, name, &x) != 0) {
Antoine Pitrou0373a102014-10-13 20:19:45 +02005192 return x;
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005193 }
Antoine Pitrou0373a102014-10-13 20:19:45 +02005194 /* Issue #17636: in case this failed because of a circular relative
5195 import, try to fallback on reading the module directly from
5196 sys.modules. */
Antoine Pitrou0373a102014-10-13 20:19:45 +02005197 pkgname = _PyObject_GetAttrId(v, &PyId___name__);
Brett Cannon3008bc02015-08-11 18:01:31 -07005198 if (pkgname == NULL) {
5199 goto error;
5200 }
Oren Milman6db70332017-09-19 14:23:01 +03005201 if (!PyUnicode_Check(pkgname)) {
5202 Py_CLEAR(pkgname);
5203 goto error;
5204 }
Antoine Pitrou0373a102014-10-13 20:19:45 +02005205 fullmodname = PyUnicode_FromFormat("%U.%U", pkgname, name);
Brett Cannon3008bc02015-08-11 18:01:31 -07005206 if (fullmodname == NULL) {
Xiang Zhang4830f582017-03-21 11:13:42 +08005207 Py_DECREF(pkgname);
Antoine Pitrou0373a102014-10-13 20:19:45 +02005208 return NULL;
Brett Cannon3008bc02015-08-11 18:01:31 -07005209 }
Eric Snow3f9eee62017-09-15 16:35:20 -06005210 x = PyImport_GetModule(fullmodname);
Antoine Pitrou0373a102014-10-13 20:19:45 +02005211 Py_DECREF(fullmodname);
Victor Stinner438a12d2019-05-24 17:01:38 +02005212 if (x == NULL && !_PyErr_Occurred(tstate)) {
Brett Cannon3008bc02015-08-11 18:01:31 -07005213 goto error;
5214 }
Matthias Bussonnier1bc15642017-02-22 07:06:50 -08005215 Py_DECREF(pkgname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005216 return x;
Brett Cannon3008bc02015-08-11 18:01:31 -07005217 error:
Matthias Bussonnierbc4bed42017-02-14 16:05:25 -08005218 pkgpath = PyModule_GetFilenameObject(v);
Matthias Bussonnier1bc15642017-02-22 07:06:50 -08005219 if (pkgname == NULL) {
5220 pkgname_or_unknown = PyUnicode_FromString("<unknown module name>");
5221 if (pkgname_or_unknown == NULL) {
5222 Py_XDECREF(pkgpath);
5223 return NULL;
5224 }
5225 } else {
5226 pkgname_or_unknown = pkgname;
5227 }
Matthias Bussonnierbc4bed42017-02-14 16:05:25 -08005228
5229 if (pkgpath == NULL || !PyUnicode_Check(pkgpath)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005230 _PyErr_Clear(tstate);
Xiang Zhang4830f582017-03-21 11:13:42 +08005231 errmsg = PyUnicode_FromFormat(
5232 "cannot import name %R from %R (unknown location)",
5233 name, pkgname_or_unknown
5234 );
Stefan Krah027b09c2019-03-25 21:50:58 +01005235 /* NULL checks for errmsg and pkgname done by PyErr_SetImportError. */
Xiang Zhang4830f582017-03-21 11:13:42 +08005236 PyErr_SetImportError(errmsg, pkgname, NULL);
5237 }
5238 else {
Steve Dower2d5594f2019-09-09 09:45:18 -07005239 _Py_IDENTIFIER(__spec__);
5240 PyObject *spec = _PyObject_GetAttrId(v, &PyId___spec__);
Steve Dower2d5594f2019-09-09 09:45:18 -07005241 const char *fmt =
5242 _PyModuleSpec_IsInitializing(spec) ?
5243 "cannot import name %R from partially initialized module %R "
5244 "(most likely due to a circular import) (%S)" :
5245 "cannot import name %R from %R (%S)";
5246 Py_XDECREF(spec);
5247
5248 errmsg = PyUnicode_FromFormat(fmt, name, pkgname_or_unknown, pkgpath);
Stefan Krah027b09c2019-03-25 21:50:58 +01005249 /* NULL checks for errmsg and pkgname done by PyErr_SetImportError. */
Xiang Zhang4830f582017-03-21 11:13:42 +08005250 PyErr_SetImportError(errmsg, pkgname, pkgpath);
Matthias Bussonnierbc4bed42017-02-14 16:05:25 -08005251 }
5252
Xiang Zhang4830f582017-03-21 11:13:42 +08005253 Py_XDECREF(errmsg);
Matthias Bussonnier1bc15642017-02-22 07:06:50 -08005254 Py_XDECREF(pkgname_or_unknown);
5255 Py_XDECREF(pkgpath);
Brett Cannon3008bc02015-08-11 18:01:31 -07005256 return NULL;
Thomas Wouters52152252000-08-17 22:55:00 +00005257}
Guido van Rossumac7be682001-01-17 15:42:30 +00005258
Thomas Wouters52152252000-08-17 22:55:00 +00005259static int
Victor Stinner438a12d2019-05-24 17:01:38 +02005260import_all_from(PyThreadState *tstate, PyObject *locals, PyObject *v)
Thomas Wouters52152252000-08-17 22:55:00 +00005261{
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02005262 _Py_IDENTIFIER(__all__);
5263 _Py_IDENTIFIER(__dict__);
Xiang Zhangd8b291a2018-03-24 18:39:36 +08005264 _Py_IDENTIFIER(__name__);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005265 PyObject *all, *dict, *name, *value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005266 int skip_leading_underscores = 0;
5267 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00005268
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005269 if (_PyObject_LookupAttrId(v, &PyId___all__, &all) < 0) {
5270 return -1; /* Unexpected error */
5271 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005272 if (all == NULL) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005273 if (_PyObject_LookupAttrId(v, &PyId___dict__, &dict) < 0) {
5274 return -1;
5275 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005276 if (dict == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005277 _PyErr_SetString(tstate, PyExc_ImportError,
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005278 "from-import-* object has no __dict__ and no __all__");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005279 return -1;
5280 }
5281 all = PyMapping_Keys(dict);
5282 Py_DECREF(dict);
5283 if (all == NULL)
5284 return -1;
5285 skip_leading_underscores = 1;
5286 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00005287
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005288 for (pos = 0, err = 0; ; pos++) {
5289 name = PySequence_GetItem(all, pos);
5290 if (name == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005291 if (!_PyErr_ExceptionMatches(tstate, PyExc_IndexError)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005292 err = -1;
Victor Stinner438a12d2019-05-24 17:01:38 +02005293 }
5294 else {
5295 _PyErr_Clear(tstate);
5296 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005297 break;
5298 }
Xiang Zhangd8b291a2018-03-24 18:39:36 +08005299 if (!PyUnicode_Check(name)) {
5300 PyObject *modname = _PyObject_GetAttrId(v, &PyId___name__);
5301 if (modname == NULL) {
5302 Py_DECREF(name);
5303 err = -1;
5304 break;
5305 }
5306 if (!PyUnicode_Check(modname)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005307 _PyErr_Format(tstate, PyExc_TypeError,
5308 "module __name__ must be a string, not %.100s",
5309 Py_TYPE(modname)->tp_name);
Xiang Zhangd8b291a2018-03-24 18:39:36 +08005310 }
5311 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02005312 _PyErr_Format(tstate, PyExc_TypeError,
5313 "%s in %U.%s must be str, not %.100s",
5314 skip_leading_underscores ? "Key" : "Item",
5315 modname,
5316 skip_leading_underscores ? "__dict__" : "__all__",
5317 Py_TYPE(name)->tp_name);
Xiang Zhangd8b291a2018-03-24 18:39:36 +08005318 }
5319 Py_DECREF(modname);
5320 Py_DECREF(name);
5321 err = -1;
5322 break;
5323 }
5324 if (skip_leading_underscores) {
Serhiy Storchakae3b2b4b2017-09-08 09:58:51 +03005325 if (PyUnicode_READY(name) == -1) {
5326 Py_DECREF(name);
5327 err = -1;
5328 break;
5329 }
5330 if (PyUnicode_READ_CHAR(name, 0) == '_') {
5331 Py_DECREF(name);
5332 continue;
5333 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005334 }
5335 value = PyObject_GetAttr(v, name);
5336 if (value == NULL)
5337 err = -1;
5338 else if (PyDict_CheckExact(locals))
5339 err = PyDict_SetItem(locals, name, value);
5340 else
5341 err = PyObject_SetItem(locals, name, value);
5342 Py_DECREF(name);
5343 Py_XDECREF(value);
5344 if (err != 0)
5345 break;
5346 }
5347 Py_DECREF(all);
5348 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00005349}
5350
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005351static int
Victor Stinner438a12d2019-05-24 17:01:38 +02005352check_args_iterable(PyThreadState *tstate, PyObject *func, PyObject *args)
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005353{
5354 if (args->ob_type->tp_iter == NULL && !PySequence_Check(args)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005355 _PyErr_Format(tstate, PyExc_TypeError,
5356 "%.200s%.200s argument after * "
5357 "must be an iterable, not %.200s",
5358 PyEval_GetFuncName(func),
5359 PyEval_GetFuncDesc(func),
5360 args->ob_type->tp_name);
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005361 return -1;
5362 }
5363 return 0;
5364}
5365
5366static void
Victor Stinner438a12d2019-05-24 17:01:38 +02005367format_kwargs_error(PyThreadState *tstate, PyObject *func, PyObject *kwargs)
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005368{
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005369 /* _PyDict_MergeEx raises attribute
5370 * error (percolated from an attempt
5371 * to get 'keys' attribute) instead of
5372 * a type error if its second argument
5373 * is not a mapping.
5374 */
Victor Stinner438a12d2019-05-24 17:01:38 +02005375 if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) {
5376 _PyErr_Format(tstate, PyExc_TypeError,
5377 "%.200s%.200s argument after ** "
5378 "must be a mapping, not %.200s",
5379 PyEval_GetFuncName(func),
5380 PyEval_GetFuncDesc(func),
5381 kwargs->ob_type->tp_name);
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005382 }
Victor Stinner438a12d2019-05-24 17:01:38 +02005383 else if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005384 PyObject *exc, *val, *tb;
Victor Stinner438a12d2019-05-24 17:01:38 +02005385 _PyErr_Fetch(tstate, &exc, &val, &tb);
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005386 if (val && PyTuple_Check(val) && PyTuple_GET_SIZE(val) == 1) {
5387 PyObject *key = PyTuple_GET_ITEM(val, 0);
5388 if (!PyUnicode_Check(key)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005389 _PyErr_Format(tstate, PyExc_TypeError,
5390 "%.200s%.200s keywords must be strings",
5391 PyEval_GetFuncName(func),
5392 PyEval_GetFuncDesc(func));
5393 }
5394 else {
5395 _PyErr_Format(tstate, PyExc_TypeError,
5396 "%.200s%.200s got multiple "
5397 "values for keyword argument '%U'",
5398 PyEval_GetFuncName(func),
5399 PyEval_GetFuncDesc(func),
5400 key);
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005401 }
5402 Py_XDECREF(exc);
5403 Py_XDECREF(val);
5404 Py_XDECREF(tb);
5405 }
5406 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02005407 _PyErr_Restore(tstate, exc, val, tb);
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005408 }
5409 }
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005410}
5411
Guido van Rossumac7be682001-01-17 15:42:30 +00005412static void
Victor Stinner438a12d2019-05-24 17:01:38 +02005413format_exc_check_arg(PyThreadState *tstate, PyObject *exc,
5414 const char *format_str, PyObject *obj)
Paul Prescode68140d2000-08-30 20:25:01 +00005415{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005416 const char *obj_str;
Paul Prescode68140d2000-08-30 20:25:01 +00005417
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005418 if (!obj)
5419 return;
Paul Prescode68140d2000-08-30 20:25:01 +00005420
Serhiy Storchaka06515832016-11-20 09:13:07 +02005421 obj_str = PyUnicode_AsUTF8(obj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005422 if (!obj_str)
5423 return;
Paul Prescode68140d2000-08-30 20:25:01 +00005424
Victor Stinner438a12d2019-05-24 17:01:38 +02005425 _PyErr_Format(tstate, exc, format_str, obj_str);
Paul Prescode68140d2000-08-30 20:25:01 +00005426}
Guido van Rossum950361c1997-01-24 13:49:28 +00005427
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005428static void
Victor Stinner438a12d2019-05-24 17:01:38 +02005429format_exc_unbound(PyThreadState *tstate, PyCodeObject *co, int oparg)
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005430{
5431 PyObject *name;
5432 /* Don't stomp existing exception */
Victor Stinner438a12d2019-05-24 17:01:38 +02005433 if (_PyErr_Occurred(tstate))
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005434 return;
5435 if (oparg < PyTuple_GET_SIZE(co->co_cellvars)) {
5436 name = PyTuple_GET_ITEM(co->co_cellvars,
5437 oparg);
Victor Stinner438a12d2019-05-24 17:01:38 +02005438 format_exc_check_arg(tstate,
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005439 PyExc_UnboundLocalError,
5440 UNBOUNDLOCAL_ERROR_MSG,
5441 name);
5442 } else {
5443 name = PyTuple_GET_ITEM(co->co_freevars, oparg -
5444 PyTuple_GET_SIZE(co->co_cellvars));
Victor Stinner438a12d2019-05-24 17:01:38 +02005445 format_exc_check_arg(tstate, PyExc_NameError,
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005446 UNBOUNDFREE_ERROR_MSG, name);
5447 }
5448}
5449
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03005450static void
Victor Stinner438a12d2019-05-24 17:01:38 +02005451format_awaitable_error(PyThreadState *tstate, PyTypeObject *type, int prevopcode)
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03005452{
5453 if (type->tp_as_async == NULL || type->tp_as_async->am_await == NULL) {
5454 if (prevopcode == BEFORE_ASYNC_WITH) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005455 _PyErr_Format(tstate, PyExc_TypeError,
5456 "'async with' received an object from __aenter__ "
5457 "that does not implement __await__: %.100s",
5458 type->tp_name);
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03005459 }
5460 else if (prevopcode == WITH_CLEANUP_START) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005461 _PyErr_Format(tstate, PyExc_TypeError,
5462 "'async with' received an object from __aexit__ "
5463 "that does not implement __await__: %.100s",
5464 type->tp_name);
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03005465 }
5466 }
5467}
5468
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005469static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02005470unicode_concatenate(PyThreadState *tstate, PyObject *v, PyObject *w,
Serhiy Storchakaab874002016-09-11 13:48:15 +03005471 PyFrameObject *f, const _Py_CODEUNIT *next_instr)
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005472{
5473 PyObject *res;
5474 if (Py_REFCNT(v) == 2) {
5475 /* In the common case, there are 2 references to the value
5476 * stored in 'variable' when the += is performed: one on the
5477 * value stack (in 'v') and one still stored in the
5478 * 'variable'. We try to delete the variable now to reduce
5479 * the refcnt to 1.
5480 */
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03005481 int opcode, oparg;
5482 NEXTOPARG();
5483 switch (opcode) {
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005484 case STORE_FAST:
5485 {
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005486 PyObject **fastlocals = f->f_localsplus;
5487 if (GETLOCAL(oparg) == v)
5488 SETLOCAL(oparg, NULL);
5489 break;
5490 }
5491 case STORE_DEREF:
5492 {
5493 PyObject **freevars = (f->f_localsplus +
5494 f->f_code->co_nlocals);
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03005495 PyObject *c = freevars[oparg];
Raymond Hettingerc32f9db2016-11-12 04:10:35 -05005496 if (PyCell_GET(c) == v) {
5497 PyCell_SET(c, NULL);
5498 Py_DECREF(v);
5499 }
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005500 break;
5501 }
5502 case STORE_NAME:
5503 {
5504 PyObject *names = f->f_code->co_names;
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03005505 PyObject *name = GETITEM(names, oparg);
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005506 PyObject *locals = f->f_locals;
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02005507 if (locals && PyDict_CheckExact(locals)) {
5508 PyObject *w = PyDict_GetItemWithError(locals, name);
5509 if ((w == v && PyDict_DelItem(locals, name) != 0) ||
Victor Stinner438a12d2019-05-24 17:01:38 +02005510 (w == NULL && _PyErr_Occurred(tstate)))
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02005511 {
5512 Py_DECREF(v);
5513 return NULL;
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005514 }
5515 }
5516 break;
5517 }
5518 }
5519 }
5520 res = v;
5521 PyUnicode_Append(&res, w);
5522 return res;
5523}
5524
Guido van Rossum950361c1997-01-24 13:49:28 +00005525#ifdef DYNAMIC_EXECUTION_PROFILE
5526
Skip Montanarof118cb12001-10-15 20:51:38 +00005527static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005528getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00005529{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005530 int i;
5531 PyObject *l = PyList_New(256);
5532 if (l == NULL) return NULL;
5533 for (i = 0; i < 256; i++) {
5534 PyObject *x = PyLong_FromLong(a[i]);
5535 if (x == NULL) {
5536 Py_DECREF(l);
5537 return NULL;
5538 }
Zackery Spytz99d56b52018-12-08 07:16:55 -07005539 PyList_SET_ITEM(l, i, x);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005540 }
5541 for (i = 0; i < 256; i++)
5542 a[i] = 0;
5543 return l;
Guido van Rossum950361c1997-01-24 13:49:28 +00005544}
5545
5546PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005547_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00005548{
5549#ifndef DXPAIRS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005550 return getarray(dxp);
Guido van Rossum950361c1997-01-24 13:49:28 +00005551#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005552 int i;
5553 PyObject *l = PyList_New(257);
5554 if (l == NULL) return NULL;
5555 for (i = 0; i < 257; i++) {
5556 PyObject *x = getarray(dxpairs[i]);
5557 if (x == NULL) {
5558 Py_DECREF(l);
5559 return NULL;
5560 }
Zackery Spytz99d56b52018-12-08 07:16:55 -07005561 PyList_SET_ITEM(l, i, x);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005562 }
5563 return l;
Guido van Rossum950361c1997-01-24 13:49:28 +00005564#endif
5565}
5566
5567#endif
Brett Cannon5c4de282016-09-07 11:16:41 -07005568
5569Py_ssize_t
5570_PyEval_RequestCodeExtraIndex(freefunc free)
5571{
Victor Stinnercaba55b2018-08-03 15:33:52 +02005572 PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE();
Brett Cannon5c4de282016-09-07 11:16:41 -07005573 Py_ssize_t new_index;
5574
Dino Viehlandf3cffd22017-06-21 14:44:36 -07005575 if (interp->co_extra_user_count == MAX_CO_EXTRA_USERS - 1) {
Brett Cannon5c4de282016-09-07 11:16:41 -07005576 return -1;
5577 }
Dino Viehlandf3cffd22017-06-21 14:44:36 -07005578 new_index = interp->co_extra_user_count++;
5579 interp->co_extra_freefuncs[new_index] = free;
Brett Cannon5c4de282016-09-07 11:16:41 -07005580 return new_index;
5581}
Łukasz Langaa785c872016-09-09 17:37:37 -07005582
5583static void
5584dtrace_function_entry(PyFrameObject *f)
5585{
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02005586 const char *filename;
5587 const char *funcname;
Łukasz Langaa785c872016-09-09 17:37:37 -07005588 int lineno;
5589
5590 filename = PyUnicode_AsUTF8(f->f_code->co_filename);
5591 funcname = PyUnicode_AsUTF8(f->f_code->co_name);
5592 lineno = PyCode_Addr2Line(f->f_code, f->f_lasti);
5593
5594 PyDTrace_FUNCTION_ENTRY(filename, funcname, lineno);
5595}
5596
5597static void
5598dtrace_function_return(PyFrameObject *f)
5599{
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02005600 const char *filename;
5601 const char *funcname;
Łukasz Langaa785c872016-09-09 17:37:37 -07005602 int lineno;
5603
5604 filename = PyUnicode_AsUTF8(f->f_code->co_filename);
5605 funcname = PyUnicode_AsUTF8(f->f_code->co_name);
5606 lineno = PyCode_Addr2Line(f->f_code, f->f_lasti);
5607
5608 PyDTrace_FUNCTION_RETURN(filename, funcname, lineno);
5609}
5610
5611/* DTrace equivalent of maybe_call_line_trace. */
5612static void
5613maybe_dtrace_line(PyFrameObject *frame,
5614 int *instr_lb, int *instr_ub, int *instr_prev)
5615{
5616 int line = frame->f_lineno;
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02005617 const char *co_filename, *co_name;
Łukasz Langaa785c872016-09-09 17:37:37 -07005618
5619 /* If the last instruction executed isn't in the current
5620 instruction window, reset the window.
5621 */
5622 if (frame->f_lasti < *instr_lb || frame->f_lasti >= *instr_ub) {
5623 PyAddrPair bounds;
5624 line = _PyCode_CheckLineNumber(frame->f_code, frame->f_lasti,
5625 &bounds);
5626 *instr_lb = bounds.ap_lower;
5627 *instr_ub = bounds.ap_upper;
5628 }
5629 /* If the last instruction falls at the start of a line or if
5630 it represents a jump backwards, update the frame's line
5631 number and call the trace function. */
5632 if (frame->f_lasti == *instr_lb || frame->f_lasti < *instr_prev) {
5633 frame->f_lineno = line;
5634 co_filename = PyUnicode_AsUTF8(frame->f_code->co_filename);
5635 if (!co_filename)
5636 co_filename = "?";
5637 co_name = PyUnicode_AsUTF8(frame->f_code->co_name);
5638 if (!co_name)
5639 co_name = "?";
5640 PyDTrace_LINE(co_filename, co_name, line);
5641 }
5642 *instr_prev = frame->f_lasti;
5643}