blob: 380212a71aaf75205adbec8b61ed49afc4172437 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum3f5da241990-12-20 15:06:42 +00002/* Execute compiled code */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003
Guido van Rossum681d79a1995-07-18 14:51:37 +00004/* XXX TO DO:
Guido van Rossum681d79a1995-07-18 14:51:37 +00005 XXX speed up searching for keywords by using a dictionary
Guido van Rossum681d79a1995-07-18 14:51:37 +00006 XXX document it!
7 */
8
Thomas Wouters477c8d52006-05-27 19:21:47 +00009/* enable more aggressive intra-module optimizations, where available */
10#define PY_LOCAL_AGGRESSIVE
11
Guido van Rossumb209a111997-04-29 18:18:01 +000012#include "Python.h"
Victor Stinner4d231bc2019-11-14 13:36:21 +010013#include "pycore_call.h"
Victor Stinner09532fe2019-05-10 23:39:09 +020014#include "pycore_ceval.h"
Inada Naoki91234a12019-06-03 21:30:58 +090015#include "pycore_code.h"
Victor Stinner111e4ee2020-03-09 21:24:14 +010016#include "pycore_initconfig.h"
Victor Stinnerbcda8f12018-11-21 22:27:47 +010017#include "pycore_object.h"
Victor Stinner438a12d2019-05-24 17:01:38 +020018#include "pycore_pyerrors.h"
19#include "pycore_pylifecycle.h"
Victor Stinner621cebe2018-11-12 16:53:38 +010020#include "pycore_pystate.h"
Victor Stinnerec13b932018-11-25 23:56:17 +010021#include "pycore_tupleobject.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000022
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000023#include "code.h"
Benjamin Peterson025e9eb2015-05-05 20:16:41 -040024#include "dictobject.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000025#include "frameobject.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000026#include "opcode.h"
Łukasz Langaa785c872016-09-09 17:37:37 -070027#include "pydtrace.h"
Benjamin Peterson025e9eb2015-05-05 20:16:41 -040028#include "setobject.h"
Tim Peters6d6c1a32001-08-02 04:15:00 +000029#include "structmember.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000030
Guido van Rossumc6004111993-11-05 10:22:19 +000031#include <ctype.h>
32
Guido van Rossum408027e1996-12-30 16:17:54 +000033#ifdef Py_DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000034/* For debugging the interpreter: */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000035#define LLTRACE 1 /* Low-level trace feature */
36#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000037#endif
38
Victor Stinner5c75f372019-04-17 23:02:26 +020039#if !defined(Py_BUILD_CORE)
40# error "ceval.c must be build with Py_BUILD_CORE define for best performance"
41#endif
42
Hai Shi46874c22020-01-30 17:20:25 -060043_Py_IDENTIFIER(__name__);
Guido van Rossum5b722181993-03-30 17:46:03 +000044
Guido van Rossum374a9221991-04-04 10:40:29 +000045/* Forward declarations */
Victor Stinner09532fe2019-05-10 23:39:09 +020046Py_LOCAL_INLINE(PyObject *) call_function(
47 PyThreadState *tstate, PyObject ***pp_stack,
48 Py_ssize_t oparg, PyObject *kwnames);
49static PyObject * do_call_core(
50 PyThreadState *tstate, PyObject *func,
51 PyObject *callargs, PyObject *kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +000052
Guido van Rossum0a066c01992-03-27 17:29:15 +000053#ifdef LLTRACE
Guido van Rossumc2e20742006-02-27 22:32:47 +000054static int lltrace;
Victor Stinner438a12d2019-05-24 17:01:38 +020055static int prtrace(PyThreadState *, PyObject *, const char *);
Guido van Rossum0a066c01992-03-27 17:29:15 +000056#endif
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +010057static int call_trace(Py_tracefunc, PyObject *,
58 PyThreadState *, PyFrameObject *,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000059 int, PyObject *);
Amaury Forgeot d'Arcf05149a2007-11-13 01:05:30 +000060static int call_trace_protected(Py_tracefunc, PyObject *,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +010061 PyThreadState *, PyFrameObject *,
62 int, PyObject *);
63static void call_exc_trace(Py_tracefunc, PyObject *,
64 PyThreadState *, PyFrameObject *);
Tim Peters8a5c3c72004-04-05 19:36:21 +000065static int maybe_call_line_trace(Py_tracefunc, PyObject *,
Eric Snow2ebc5ce2017-09-07 23:51:28 -060066 PyThreadState *, PyFrameObject *,
67 int *, int *, int *);
Łukasz Langaa785c872016-09-09 17:37:37 -070068static void maybe_dtrace_line(PyFrameObject *, int *, int *, int *);
69static void dtrace_function_entry(PyFrameObject *);
70static void dtrace_function_return(PyFrameObject *);
Michael W. Hudsondd32a912002-08-15 14:59:02 +000071
Victor Stinner438a12d2019-05-24 17:01:38 +020072static PyObject * import_name(PyThreadState *, PyFrameObject *,
73 PyObject *, PyObject *, PyObject *);
74static PyObject * import_from(PyThreadState *, PyObject *, PyObject *);
75static int import_all_from(PyThreadState *, PyObject *, PyObject *);
76static void format_exc_check_arg(PyThreadState *, PyObject *, const char *, PyObject *);
77static void format_exc_unbound(PyThreadState *tstate, PyCodeObject *co, int oparg);
78static PyObject * unicode_concatenate(PyThreadState *, PyObject *, PyObject *,
Serhiy Storchakaab874002016-09-11 13:48:15 +030079 PyFrameObject *, const _Py_CODEUNIT *);
Victor Stinner438a12d2019-05-24 17:01:38 +020080static PyObject * special_lookup(PyThreadState *, PyObject *, _Py_Identifier *);
81static int check_args_iterable(PyThreadState *, PyObject *func, PyObject *vararg);
82static void format_kwargs_error(PyThreadState *, PyObject *func, PyObject *kwargs);
Mark Shannonfee55262019-11-21 09:11:43 +000083static void format_awaitable_error(PyThreadState *, PyTypeObject *, int, int);
Guido van Rossum374a9221991-04-04 10:40:29 +000084
Paul Prescode68140d2000-08-30 20:25:01 +000085#define NAME_ERROR_MSG \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000086 "name '%.200s' is not defined"
Paul Prescode68140d2000-08-30 20:25:01 +000087#define UNBOUNDLOCAL_ERROR_MSG \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000088 "local variable '%.200s' referenced before assignment"
Jeremy Hyltonc76770c2001-04-13 16:51:46 +000089#define UNBOUNDFREE_ERROR_MSG \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000090 "free variable '%.200s' referenced before assignment" \
91 " in enclosing scope"
Guido van Rossum374a9221991-04-04 10:40:29 +000092
Guido van Rossum950361c1997-01-24 13:49:28 +000093/* Dynamic execution profile */
94#ifdef DYNAMIC_EXECUTION_PROFILE
95#ifdef DXPAIRS
96static long dxpairs[257][256];
97#define dxp dxpairs[256]
98#else
99static long dxp[256];
100#endif
101#endif
102
Inada Naoki91234a12019-06-03 21:30:58 +0900103/* per opcode cache */
Inada Naokieddef862019-06-04 07:38:10 +0900104#ifdef Py_DEBUG
105// --with-pydebug is used to find memory leak. opcache makes it harder.
106// So we disable opcache when Py_DEBUG is defined.
107// See bpo-37146
108#define OPCACHE_MIN_RUNS 0 /* disable opcache */
109#else
Inada Naoki91234a12019-06-03 21:30:58 +0900110#define OPCACHE_MIN_RUNS 1024 /* create opcache when code executed this time */
Inada Naokieddef862019-06-04 07:38:10 +0900111#endif
Inada Naoki91234a12019-06-03 21:30:58 +0900112#define OPCACHE_STATS 0 /* Enable stats */
113
114#if OPCACHE_STATS
115static size_t opcache_code_objects = 0;
116static size_t opcache_code_objects_extra_mem = 0;
117
118static size_t opcache_global_opts = 0;
119static size_t opcache_global_hits = 0;
120static size_t opcache_global_misses = 0;
121#endif
122
Victor Stinnere225beb2019-06-03 18:14:24 +0200123#define GIL_REQUEST _Py_atomic_load_relaxed(&ceval->gil_drop_request)
Inada Naoki91234a12019-06-03 21:30:58 +0900124
Jeffrey Yasskin39370832010-05-03 19:29:34 +0000125/* This can set eval_breaker to 0 even though gil_drop_request became
126 1. We believe this is all right because the eval loop will release
127 the GIL eventually anyway. */
Victor Stinnere225beb2019-06-03 18:14:24 +0200128#define COMPUTE_EVAL_BREAKER(ceval) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000129 _Py_atomic_store_relaxed( \
Victor Stinnere225beb2019-06-03 18:14:24 +0200130 &(ceval)->eval_breaker, \
131 GIL_REQUEST | \
132 _Py_atomic_load_relaxed(&(ceval)->signals_pending) | \
133 _Py_atomic_load_relaxed(&(ceval)->pending.calls_to_do) | \
134 (ceval)->pending.async_exc)
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000135
Victor Stinnere225beb2019-06-03 18:14:24 +0200136#define SET_GIL_DROP_REQUEST(ceval) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000137 do { \
Victor Stinnere225beb2019-06-03 18:14:24 +0200138 _Py_atomic_store_relaxed(&(ceval)->gil_drop_request, 1); \
139 _Py_atomic_store_relaxed(&(ceval)->eval_breaker, 1); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000140 } while (0)
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000141
Victor Stinnere225beb2019-06-03 18:14:24 +0200142#define RESET_GIL_DROP_REQUEST(ceval) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000143 do { \
Victor Stinnere225beb2019-06-03 18:14:24 +0200144 _Py_atomic_store_relaxed(&(ceval)->gil_drop_request, 0); \
145 COMPUTE_EVAL_BREAKER(ceval); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000146 } while (0)
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000147
Jeffrey Yasskin39370832010-05-03 19:29:34 +0000148/* Pending calls are only modified under pending_lock */
Victor Stinnere225beb2019-06-03 18:14:24 +0200149#define SIGNAL_PENDING_CALLS(ceval) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000150 do { \
Victor Stinnere225beb2019-06-03 18:14:24 +0200151 _Py_atomic_store_relaxed(&(ceval)->pending.calls_to_do, 1); \
152 _Py_atomic_store_relaxed(&(ceval)->eval_breaker, 1); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000153 } while (0)
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000154
Victor Stinnere225beb2019-06-03 18:14:24 +0200155#define UNSIGNAL_PENDING_CALLS(ceval) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000156 do { \
Victor Stinnere225beb2019-06-03 18:14:24 +0200157 _Py_atomic_store_relaxed(&(ceval)->pending.calls_to_do, 0); \
158 COMPUTE_EVAL_BREAKER(ceval); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000159 } while (0)
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000160
Victor Stinnere225beb2019-06-03 18:14:24 +0200161#define SIGNAL_PENDING_SIGNALS(ceval) \
Eric Snowfdf282d2019-01-11 14:26:55 -0700162 do { \
Victor Stinnere225beb2019-06-03 18:14:24 +0200163 _Py_atomic_store_relaxed(&(ceval)->signals_pending, 1); \
164 _Py_atomic_store_relaxed(&(ceval)->eval_breaker, 1); \
Eric Snowfdf282d2019-01-11 14:26:55 -0700165 } while (0)
166
Victor Stinnere225beb2019-06-03 18:14:24 +0200167#define UNSIGNAL_PENDING_SIGNALS(ceval) \
Eric Snowfdf282d2019-01-11 14:26:55 -0700168 do { \
Victor Stinnere225beb2019-06-03 18:14:24 +0200169 _Py_atomic_store_relaxed(&(ceval)->signals_pending, 0); \
170 COMPUTE_EVAL_BREAKER(ceval); \
Eric Snowfdf282d2019-01-11 14:26:55 -0700171 } while (0)
172
Victor Stinnere225beb2019-06-03 18:14:24 +0200173#define SIGNAL_ASYNC_EXC(ceval) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000174 do { \
Victor Stinnere225beb2019-06-03 18:14:24 +0200175 (ceval)->pending.async_exc = 1; \
176 _Py_atomic_store_relaxed(&(ceval)->eval_breaker, 1); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000177 } while (0)
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000178
Victor Stinnere225beb2019-06-03 18:14:24 +0200179#define UNSIGNAL_ASYNC_EXC(ceval) \
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600180 do { \
Victor Stinnere225beb2019-06-03 18:14:24 +0200181 (ceval)->pending.async_exc = 0; \
182 COMPUTE_EVAL_BREAKER(ceval); \
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600183 } while (0)
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000184
185
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000186#ifdef HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000187#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +0000188#endif
Guido van Rossum49b56061998-10-01 20:42:43 +0000189#include "pythread.h"
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000190#include "ceval_gil.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000191
Victor Stinnereb4e2ae2020-03-08 11:57:45 +0100192static void
193ensure_tstate_not_null(const char *func, PyThreadState *tstate)
194{
195 if (tstate == NULL) {
196 _Py_FatalErrorFunc(func, "current thread state is NULL");
197 }
198}
199
200
Tim Peters7f468f22004-10-11 02:40:51 +0000201int
Victor Stinner175a7042020-03-10 00:37:48 +0100202_PyEval_ThreadsInitialized(_PyRuntimeState *runtime)
203{
204 return gil_created(&runtime->ceval.gil);
205}
206
207int
Tim Peters7f468f22004-10-11 02:40:51 +0000208PyEval_ThreadsInitialized(void)
209{
Victor Stinner01b1cc12019-11-20 02:27:56 +0100210 _PyRuntimeState *runtime = &_PyRuntime;
Victor Stinner175a7042020-03-10 00:37:48 +0100211 return _PyEval_ThreadsInitialized(runtime);
Tim Peters7f468f22004-10-11 02:40:51 +0000212}
213
Victor Stinner111e4ee2020-03-09 21:24:14 +0100214PyStatus
215_PyEval_InitThreads(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000216{
Victor Stinner111e4ee2020-03-09 21:24:14 +0100217 if (tstate == NULL) {
218 return _PyStatus_ERR("tstate is NULL");
219 }
220
221 struct _ceval_runtime_state *ceval = &tstate->interp->runtime->ceval;
Victor Stinnere225beb2019-06-03 18:14:24 +0200222 struct _gil_runtime_state *gil = &ceval->gil;
Victor Stinner09532fe2019-05-10 23:39:09 +0200223 if (gil_created(gil)) {
Victor Stinner111e4ee2020-03-09 21:24:14 +0100224 return _PyStatus_OK();
Victor Stinnera7126792019-03-19 14:19:38 +0100225 }
226
Inada Naoki001fee12019-02-20 10:00:09 +0900227 PyThread_init_thread();
Victor Stinner09532fe2019-05-10 23:39:09 +0200228 create_gil(gil);
Victor Stinner85f5a692020-03-09 22:12:04 +0100229
230 take_gil(tstate);
Eric Snow8479a342019-03-08 23:44:33 -0700231
Victor Stinnere225beb2019-06-03 18:14:24 +0200232 struct _pending_calls *pending = &ceval->pending;
233 pending->lock = PyThread_allocate_lock();
234 if (pending->lock == NULL) {
Victor Stinner111e4ee2020-03-09 21:24:14 +0100235 return _PyStatus_NO_MEMORY();
236 }
Victor Stinner85f5a692020-03-09 22:12:04 +0100237
Victor Stinner111e4ee2020-03-09 21:24:14 +0100238 return _PyStatus_OK();
239}
240
241void
242PyEval_InitThreads(void)
243{
Victor Stinnerb4698ec2020-03-10 01:28:54 +0100244 /* Do nothing: kept for backward compatibility */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000245}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000246
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000247void
Victor Stinnere225beb2019-06-03 18:14:24 +0200248_PyEval_FiniThreads(struct _ceval_runtime_state *ceval)
Antoine Pitrou1df15362010-09-13 14:16:46 +0000249{
Victor Stinnere225beb2019-06-03 18:14:24 +0200250 struct _gil_runtime_state *gil = &ceval->gil;
Victor Stinner09532fe2019-05-10 23:39:09 +0200251 if (!gil_created(gil)) {
Antoine Pitrou1df15362010-09-13 14:16:46 +0000252 return;
Victor Stinnera7126792019-03-19 14:19:38 +0100253 }
254
Victor Stinner09532fe2019-05-10 23:39:09 +0200255 destroy_gil(gil);
256 assert(!gil_created(gil));
Victor Stinner99fcc612019-04-29 13:04:07 +0200257
Victor Stinnere225beb2019-06-03 18:14:24 +0200258 struct _pending_calls *pending = &ceval->pending;
259 if (pending->lock != NULL) {
260 PyThread_free_lock(pending->lock);
261 pending->lock = NULL;
262 }
Antoine Pitrou1df15362010-09-13 14:16:46 +0000263}
264
265void
Inada Naoki91234a12019-06-03 21:30:58 +0900266_PyEval_Fini(void)
267{
268#if OPCACHE_STATS
269 fprintf(stderr, "-- Opcode cache number of objects = %zd\n",
270 opcache_code_objects);
271
272 fprintf(stderr, "-- Opcode cache total extra mem = %zd\n",
273 opcache_code_objects_extra_mem);
274
275 fprintf(stderr, "\n");
276
277 fprintf(stderr, "-- Opcode cache LOAD_GLOBAL hits = %zd (%d%%)\n",
278 opcache_global_hits,
279 (int) (100.0 * opcache_global_hits /
280 (opcache_global_hits + opcache_global_misses)));
281
282 fprintf(stderr, "-- Opcode cache LOAD_GLOBAL misses = %zd (%d%%)\n",
283 opcache_global_misses,
284 (int) (100.0 * opcache_global_misses /
285 (opcache_global_hits + opcache_global_misses)));
286
287 fprintf(stderr, "-- Opcode cache LOAD_GLOBAL opts = %zd\n",
288 opcache_global_opts);
289
290 fprintf(stderr, "\n");
291#endif
292}
293
294void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000295PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000296{
Victor Stinner09532fe2019-05-10 23:39:09 +0200297 _PyRuntimeState *runtime = &_PyRuntime;
Victor Stinner09532fe2019-05-10 23:39:09 +0200298 PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime);
Victor Stinnereb4e2ae2020-03-08 11:57:45 +0100299 ensure_tstate_not_null(__func__, tstate);
300
Victor Stinner85f5a692020-03-09 22:12:04 +0100301 take_gil(tstate);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000302}
303
304void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000305PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000306{
Victor Stinner09532fe2019-05-10 23:39:09 +0200307 _PyRuntimeState *runtime = &_PyRuntime;
Victor Stinnere225beb2019-06-03 18:14:24 +0200308 PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000309 /* This function must succeed when the current thread state is NULL.
Victor Stinner50b48572018-11-01 01:51:40 +0100310 We therefore avoid PyThreadState_Get() which dumps a fatal error
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000311 in debug mode.
312 */
Victor Stinnere225beb2019-06-03 18:14:24 +0200313 drop_gil(&runtime->ceval, tstate);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000314}
315
316void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000317PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000318{
Victor Stinnereb4e2ae2020-03-08 11:57:45 +0100319 ensure_tstate_not_null(__func__, tstate);
320
Victor Stinner85f5a692020-03-09 22:12:04 +0100321 take_gil(tstate);
Victor Stinnere225beb2019-06-03 18:14:24 +0200322
Victor Stinner85f5a692020-03-09 22:12:04 +0100323 struct _gilstate_runtime_state *gilstate = &tstate->interp->runtime->gilstate;
324 if (_PyThreadState_Swap(gilstate, tstate) != NULL) {
Victor Stinner9e5d30c2020-03-07 00:54:20 +0100325 Py_FatalError("non-NULL old thread state");
Victor Stinner09532fe2019-05-10 23:39:09 +0200326 }
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000327}
328
329void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000330PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000331{
Victor Stinner17c68b82020-01-30 12:20:48 +0100332 assert(tstate != NULL);
Victor Stinner09532fe2019-05-10 23:39:09 +0200333
Victor Stinner01b1cc12019-11-20 02:27:56 +0100334 _PyRuntimeState *runtime = tstate->interp->runtime;
Victor Stinner09532fe2019-05-10 23:39:09 +0200335 PyThreadState *new_tstate = _PyThreadState_Swap(&runtime->gilstate, NULL);
336 if (new_tstate != tstate) {
Victor Stinner9e5d30c2020-03-07 00:54:20 +0100337 Py_FatalError("wrong thread state");
Victor Stinner09532fe2019-05-10 23:39:09 +0200338 }
Victor Stinnere225beb2019-06-03 18:14:24 +0200339 drop_gil(&runtime->ceval, tstate);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000340}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000341
Antoine Pitrouf7ecfac2017-05-28 11:35:14 +0200342/* This function is called from PyOS_AfterFork_Child to destroy all threads
343 * which are not running in the child process, and clear internal locks
344 * which might be held by those threads.
345 */
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000346
347void
Victor Stinnerd5d9e812019-05-13 12:35:37 +0200348_PyEval_ReInitThreads(_PyRuntimeState *runtime)
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000349{
Victor Stinnere225beb2019-06-03 18:14:24 +0200350 struct _ceval_runtime_state *ceval = &runtime->ceval;
351 if (!gil_created(&ceval->gil)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000352 return;
Victor Stinner09532fe2019-05-10 23:39:09 +0200353 }
Victor Stinnere225beb2019-06-03 18:14:24 +0200354 recreate_gil(&ceval->gil);
Victor Stinnereb4e2ae2020-03-08 11:57:45 +0100355 PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime);
356 ensure_tstate_not_null(__func__, tstate);
Victor Stinner85f5a692020-03-09 22:12:04 +0100357
358 take_gil(tstate);
Eric Snow8479a342019-03-08 23:44:33 -0700359
Victor Stinnere225beb2019-06-03 18:14:24 +0200360 struct _pending_calls *pending = &ceval->pending;
Victor Stinner09532fe2019-05-10 23:39:09 +0200361 pending->lock = PyThread_allocate_lock();
362 if (pending->lock == NULL) {
Eric Snow8479a342019-03-08 23:44:33 -0700363 Py_FatalError("Can't initialize threads for pending calls");
364 }
Jesse Nollera8513972008-07-17 16:49:17 +0000365
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200366 /* Destroy all threads except the current one */
Victor Stinnereb4e2ae2020-03-08 11:57:45 +0100367 _PyThreadState_DeleteExcept(runtime, tstate);
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000368}
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000369
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000370/* This function is used to signal that async exceptions are waiting to be
Zackery Spytzeef05962018-09-29 10:07:11 -0600371 raised. */
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000372
373void
Victor Stinnere225beb2019-06-03 18:14:24 +0200374_PyEval_SignalAsyncExc(struct _ceval_runtime_state *ceval)
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000375{
Victor Stinnere225beb2019-06-03 18:14:24 +0200376 SIGNAL_ASYNC_EXC(ceval);
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000377}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000378
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000379PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000380PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000381{
Victor Stinner09532fe2019-05-10 23:39:09 +0200382 _PyRuntimeState *runtime = &_PyRuntime;
Victor Stinnere225beb2019-06-03 18:14:24 +0200383 struct _ceval_runtime_state *ceval = &runtime->ceval;
Victor Stinner09532fe2019-05-10 23:39:09 +0200384 PyThreadState *tstate = _PyThreadState_Swap(&runtime->gilstate, NULL);
385 if (tstate == NULL) {
Victor Stinner9e5d30c2020-03-07 00:54:20 +0100386 Py_FatalError("NULL tstate");
Victor Stinner09532fe2019-05-10 23:39:09 +0200387 }
Victor Stinnere225beb2019-06-03 18:14:24 +0200388 assert(gil_created(&ceval->gil));
389 drop_gil(ceval, tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000390 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000391}
392
393void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000394PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000395{
Victor Stinnereb4e2ae2020-03-08 11:57:45 +0100396 ensure_tstate_not_null(__func__, tstate);
397
Victor Stinner85f5a692020-03-09 22:12:04 +0100398 take_gil(tstate);
Victor Stinner17c68b82020-01-30 12:20:48 +0100399
Victor Stinner85f5a692020-03-09 22:12:04 +0100400 struct _gilstate_runtime_state *gilstate = &tstate->interp->runtime->gilstate;
401 _PyThreadState_Swap(gilstate, tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000402}
403
404
Guido van Rossuma9672091994-09-14 13:31:22 +0000405/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
406 signal handlers or Mac I/O completion routines) can schedule calls
407 to a function to be called synchronously.
408 The synchronous function is called with one void* argument.
409 It should return 0 for success or -1 for failure -- failure should
410 be accompanied by an exception.
411
412 If registry succeeds, the registry function returns 0; if it fails
413 (e.g. due to too many pending calls) it returns -1 (without setting
414 an exception condition).
415
416 Note that because registry may occur from within signal handlers,
417 or other asynchronous events, calling malloc() is unsafe!
418
Guido van Rossuma9672091994-09-14 13:31:22 +0000419 Any thread can schedule pending calls, but only the main thread
420 will execute them.
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000421 There is no facility to schedule calls to a particular thread, but
422 that should be easy to change, should that ever be required. In
423 that case, the static variables here should go into the python
424 threadstate.
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000425*/
Guido van Rossuma9672091994-09-14 13:31:22 +0000426
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200427void
Victor Stinnere225beb2019-06-03 18:14:24 +0200428_PyEval_SignalReceived(struct _ceval_runtime_state *ceval)
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200429{
430 /* bpo-30703: Function called when the C signal handler of Python gets a
431 signal. We cannot queue a callback using Py_AddPendingCall() since
432 that function is not async-signal-safe. */
Victor Stinnere225beb2019-06-03 18:14:24 +0200433 SIGNAL_PENDING_SIGNALS(ceval);
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200434}
435
Eric Snow5be45a62019-03-08 22:47:07 -0700436/* Push one item onto the queue while holding the lock. */
437static int
Victor Stinnere225beb2019-06-03 18:14:24 +0200438_push_pending_call(struct _pending_calls *pending,
Eric Snow842a2f02019-03-15 15:47:51 -0600439 int (*func)(void *), void *arg)
Eric Snow5be45a62019-03-08 22:47:07 -0700440{
Eric Snow842a2f02019-03-15 15:47:51 -0600441 int i = pending->last;
Eric Snow5be45a62019-03-08 22:47:07 -0700442 int j = (i + 1) % NPENDINGCALLS;
Eric Snow842a2f02019-03-15 15:47:51 -0600443 if (j == pending->first) {
Eric Snow5be45a62019-03-08 22:47:07 -0700444 return -1; /* Queue full */
445 }
Eric Snow842a2f02019-03-15 15:47:51 -0600446 pending->calls[i].func = func;
447 pending->calls[i].arg = arg;
448 pending->last = j;
Eric Snow5be45a62019-03-08 22:47:07 -0700449 return 0;
450}
451
452/* Pop one item off the queue while holding the lock. */
453static void
Victor Stinnere225beb2019-06-03 18:14:24 +0200454_pop_pending_call(struct _pending_calls *pending,
Eric Snow842a2f02019-03-15 15:47:51 -0600455 int (**func)(void *), void **arg)
Eric Snow5be45a62019-03-08 22:47:07 -0700456{
Eric Snow842a2f02019-03-15 15:47:51 -0600457 int i = pending->first;
458 if (i == pending->last) {
Eric Snow5be45a62019-03-08 22:47:07 -0700459 return; /* Queue empty */
460 }
461
Eric Snow842a2f02019-03-15 15:47:51 -0600462 *func = pending->calls[i].func;
463 *arg = pending->calls[i].arg;
464 pending->first = (i + 1) % NPENDINGCALLS;
Eric Snow5be45a62019-03-08 22:47:07 -0700465}
466
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200467/* This implementation is thread-safe. It allows
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000468 scheduling to be made from any thread, and even from an executing
469 callback.
470 */
471
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000472int
Victor Stinner438a12d2019-05-24 17:01:38 +0200473_PyEval_AddPendingCall(PyThreadState *tstate,
Victor Stinnere225beb2019-06-03 18:14:24 +0200474 struct _ceval_runtime_state *ceval,
Victor Stinner09532fe2019-05-10 23:39:09 +0200475 int (*func)(void *), void *arg)
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000476{
Victor Stinnere225beb2019-06-03 18:14:24 +0200477 struct _pending_calls *pending = &ceval->pending;
Eric Snow842a2f02019-03-15 15:47:51 -0600478
479 PyThread_acquire_lock(pending->lock, WAIT_LOCK);
480 if (pending->finishing) {
481 PyThread_release_lock(pending->lock);
482
483 PyObject *exc, *val, *tb;
Victor Stinner438a12d2019-05-24 17:01:38 +0200484 _PyErr_Fetch(tstate, &exc, &val, &tb);
485 _PyErr_SetString(tstate, PyExc_SystemError,
Eric Snow842a2f02019-03-15 15:47:51 -0600486 "Py_AddPendingCall: cannot add pending calls "
487 "(Python shutting down)");
Victor Stinner438a12d2019-05-24 17:01:38 +0200488 _PyErr_Print(tstate);
489 _PyErr_Restore(tstate, exc, val, tb);
Eric Snow842a2f02019-03-15 15:47:51 -0600490 return -1;
491 }
Victor Stinnere225beb2019-06-03 18:14:24 +0200492 int result = _push_pending_call(pending, func, arg);
Eric Snow842a2f02019-03-15 15:47:51 -0600493 PyThread_release_lock(pending->lock);
Eric Snow5be45a62019-03-08 22:47:07 -0700494
Victor Stinnere225beb2019-06-03 18:14:24 +0200495 /* signal main loop */
496 SIGNAL_PENDING_CALLS(ceval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000497 return result;
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000498}
499
Victor Stinner09532fe2019-05-10 23:39:09 +0200500int
501Py_AddPendingCall(int (*func)(void *), void *arg)
502{
Victor Stinner438a12d2019-05-24 17:01:38 +0200503 _PyRuntimeState *runtime = &_PyRuntime;
504 PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime);
Victor Stinnere225beb2019-06-03 18:14:24 +0200505 return _PyEval_AddPendingCall(tstate, &runtime->ceval, func, arg);
Victor Stinner09532fe2019-05-10 23:39:09 +0200506}
507
Eric Snowfdf282d2019-01-11 14:26:55 -0700508static int
Victor Stinner09532fe2019-05-10 23:39:09 +0200509handle_signals(_PyRuntimeState *runtime)
Eric Snowfdf282d2019-01-11 14:26:55 -0700510{
Victor Stinner3225b9f2020-03-09 20:56:57 +0100511 /* Only handle signals on main thread */
Victor Stinner09532fe2019-05-10 23:39:09 +0200512 if (PyThread_get_thread_ident() != runtime->main_thread) {
Eric Snowfdf282d2019-01-11 14:26:55 -0700513 return 0;
514 }
Eric Snow64d6cc82019-02-23 15:40:43 -0700515 /*
516 * Ensure that the thread isn't currently running some other
517 * interpreter.
518 */
Victor Stinner09532fe2019-05-10 23:39:09 +0200519 PyInterpreterState *interp = _PyRuntimeState_GetThreadState(runtime)->interp;
520 if (interp != runtime->interpreters.main) {
Eric Snow64d6cc82019-02-23 15:40:43 -0700521 return 0;
522 }
Eric Snowfdf282d2019-01-11 14:26:55 -0700523
Victor Stinnere225beb2019-06-03 18:14:24 +0200524 struct _ceval_runtime_state *ceval = &runtime->ceval;
525 UNSIGNAL_PENDING_SIGNALS(ceval);
Eric Snow64d6cc82019-02-23 15:40:43 -0700526 if (_PyErr_CheckSignals() < 0) {
Victor Stinnere225beb2019-06-03 18:14:24 +0200527 SIGNAL_PENDING_SIGNALS(ceval); /* We're not done yet */
Eric Snowfdf282d2019-01-11 14:26:55 -0700528 return -1;
529 }
530 return 0;
531}
532
533static int
Victor Stinnere225beb2019-06-03 18:14:24 +0200534make_pending_calls(_PyRuntimeState *runtime)
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000535{
Eric Snow6a150bc2019-06-01 15:39:46 -0600536 static int busy = 0;
Eric Snowb75b1a352019-04-12 10:20:10 -0600537
Victor Stinnere225beb2019-06-03 18:14:24 +0200538 /* only service pending calls on main thread */
539 if (PyThread_get_thread_ident() != runtime->main_thread) {
540 return 0;
541 }
542
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000543 /* don't perform recursive pending calls */
Eric Snowfdf282d2019-01-11 14:26:55 -0700544 if (busy) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000545 return 0;
Eric Snowfdf282d2019-01-11 14:26:55 -0700546 }
Charles-François Natalif23339a2011-07-23 18:15:43 +0200547 busy = 1;
Victor Stinnere225beb2019-06-03 18:14:24 +0200548 struct _ceval_runtime_state *ceval = &runtime->ceval;
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200549 /* unsignal before starting to call callbacks, so that any callback
550 added in-between re-signals */
Victor Stinnere225beb2019-06-03 18:14:24 +0200551 UNSIGNAL_PENDING_CALLS(ceval);
Eric Snowfdf282d2019-01-11 14:26:55 -0700552 int res = 0;
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200553
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000554 /* perform a bounded number of calls, in case of recursion */
Victor Stinnere225beb2019-06-03 18:14:24 +0200555 struct _pending_calls *pending = &ceval->pending;
Eric Snowfdf282d2019-01-11 14:26:55 -0700556 for (int i=0; i<NPENDINGCALLS; i++) {
Eric Snow5be45a62019-03-08 22:47:07 -0700557 int (*func)(void *) = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000558 void *arg = NULL;
559
560 /* pop one item off the queue while holding the lock */
Eric Snow842a2f02019-03-15 15:47:51 -0600561 PyThread_acquire_lock(pending->lock, WAIT_LOCK);
Victor Stinnere225beb2019-06-03 18:14:24 +0200562 _pop_pending_call(pending, &func, &arg);
Eric Snow842a2f02019-03-15 15:47:51 -0600563 PyThread_release_lock(pending->lock);
Eric Snow5be45a62019-03-08 22:47:07 -0700564
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100565 /* having released the lock, perform the callback */
Eric Snow5be45a62019-03-08 22:47:07 -0700566 if (func == NULL) {
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100567 break;
Eric Snow5be45a62019-03-08 22:47:07 -0700568 }
Eric Snowfdf282d2019-01-11 14:26:55 -0700569 res = func(arg);
570 if (res) {
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200571 goto error;
572 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000573 }
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200574
Charles-François Natalif23339a2011-07-23 18:15:43 +0200575 busy = 0;
Eric Snowfdf282d2019-01-11 14:26:55 -0700576 return res;
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200577
578error:
579 busy = 0;
Victor Stinnere225beb2019-06-03 18:14:24 +0200580 SIGNAL_PENDING_CALLS(ceval);
Eric Snowfdf282d2019-01-11 14:26:55 -0700581 return res;
582}
583
Eric Snow842a2f02019-03-15 15:47:51 -0600584void
Victor Stinner2b1df452020-01-13 18:46:59 +0100585_Py_FinishPendingCalls(PyThreadState *tstate)
Eric Snow842a2f02019-03-15 15:47:51 -0600586{
Eric Snow842a2f02019-03-15 15:47:51 -0600587 assert(PyGILState_Check());
588
Victor Stinner2b1df452020-01-13 18:46:59 +0100589 _PyRuntimeState *runtime = tstate->interp->runtime;
Victor Stinnere225beb2019-06-03 18:14:24 +0200590 struct _pending_calls *pending = &runtime->ceval.pending;
Victor Stinner09532fe2019-05-10 23:39:09 +0200591
Eric Snow842a2f02019-03-15 15:47:51 -0600592 PyThread_acquire_lock(pending->lock, WAIT_LOCK);
593 pending->finishing = 1;
594 PyThread_release_lock(pending->lock);
595
596 if (!_Py_atomic_load_relaxed(&(pending->calls_to_do))) {
597 return;
598 }
599
Victor Stinnere225beb2019-06-03 18:14:24 +0200600 if (make_pending_calls(runtime) < 0) {
601 PyObject *exc, *val, *tb;
602 _PyErr_Fetch(tstate, &exc, &val, &tb);
603 PyErr_BadInternalCall();
604 _PyErr_ChainExceptions(exc, val, tb);
605 _PyErr_Print(tstate);
Eric Snow842a2f02019-03-15 15:47:51 -0600606 }
607}
608
Eric Snowfdf282d2019-01-11 14:26:55 -0700609/* Py_MakePendingCalls() is a simple wrapper for the sake
610 of backward-compatibility. */
611int
612Py_MakePendingCalls(void)
613{
614 assert(PyGILState_Check());
615
616 /* Python signal handler doesn't really queue a callback: it only signals
617 that a signal was received, see _PyEval_SignalReceived(). */
Victor Stinner09532fe2019-05-10 23:39:09 +0200618 _PyRuntimeState *runtime = &_PyRuntime;
619 int res = handle_signals(runtime);
Eric Snowfdf282d2019-01-11 14:26:55 -0700620 if (res != 0) {
621 return res;
622 }
623
Victor Stinnere225beb2019-06-03 18:14:24 +0200624 res = make_pending_calls(runtime);
Eric Snowb75b1a352019-04-12 10:20:10 -0600625 if (res != 0) {
626 return res;
627 }
628
629 return 0;
Benjamin Petersone5bf3832009-01-17 23:43:58 +0000630}
631
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000632/* The interpreter's recursion limit */
633
Hye-Shik Changb6fa2812005-04-04 15:49:02 +0000634#ifndef Py_DEFAULT_RECURSION_LIMIT
635#define Py_DEFAULT_RECURSION_LIMIT 1000
636#endif
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600637
Eric Snow05351c12017-09-05 21:43:08 -0700638int _Py_CheckRecursionLimit = Py_DEFAULT_RECURSION_LIMIT;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000639
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600640void
Victor Stinnere225beb2019-06-03 18:14:24 +0200641_PyEval_Initialize(struct _ceval_runtime_state *state)
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600642{
Victor Stinnere225beb2019-06-03 18:14:24 +0200643 state->recursion_limit = Py_DEFAULT_RECURSION_LIMIT;
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600644 _Py_CheckRecursionLimit = Py_DEFAULT_RECURSION_LIMIT;
Victor Stinnere225beb2019-06-03 18:14:24 +0200645 _gil_initialize(&state->gil);
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600646}
647
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000648int
649Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000650{
Victor Stinner01b1cc12019-11-20 02:27:56 +0100651 struct _ceval_runtime_state *ceval = &_PyRuntime.ceval;
652 return ceval->recursion_limit;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000653}
654
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000655void
656Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000657{
Victor Stinnere225beb2019-06-03 18:14:24 +0200658 struct _ceval_runtime_state *ceval = &_PyRuntime.ceval;
659 ceval->recursion_limit = new_limit;
660 _Py_CheckRecursionLimit = ceval->recursion_limit;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000661}
662
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100663/* The function _Py_EnterRecursiveCall() only calls _Py_CheckRecursiveCall()
Armin Rigo2b3eb402003-10-28 12:05:48 +0000664 if the recursion_depth reaches _Py_CheckRecursionLimit.
665 If USE_STACKCHECK, the macro decrements _Py_CheckRecursionLimit
666 to guarantee that _Py_CheckRecursiveCall() is regularly called.
667 Without USE_STACKCHECK, there is no need for this. */
668int
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100669_Py_CheckRecursiveCall(PyThreadState *tstate, const char *where)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000670{
Victor Stinner01b1cc12019-11-20 02:27:56 +0100671 _PyRuntimeState *runtime = tstate->interp->runtime;
Victor Stinner09532fe2019-05-10 23:39:09 +0200672 int recursion_limit = runtime->ceval.recursion_limit;
Armin Rigo2b3eb402003-10-28 12:05:48 +0000673
674#ifdef USE_STACKCHECK
pdox18967932017-10-25 23:03:01 -0700675 tstate->stackcheck_counter = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000676 if (PyOS_CheckStack()) {
677 --tstate->recursion_depth;
Victor Stinner438a12d2019-05-24 17:01:38 +0200678 _PyErr_SetString(tstate, PyExc_MemoryError, "Stack overflow");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000679 return -1;
680 }
pdox18967932017-10-25 23:03:01 -0700681 /* Needed for ABI backwards-compatibility (see bpo-31857) */
Eric Snow05351c12017-09-05 21:43:08 -0700682 _Py_CheckRecursionLimit = recursion_limit;
pdox18967932017-10-25 23:03:01 -0700683#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000684 if (tstate->recursion_critical)
685 /* Somebody asked that we don't check for recursion. */
686 return 0;
687 if (tstate->overflowed) {
688 if (tstate->recursion_depth > recursion_limit + 50) {
689 /* Overflowing while handling an overflow. Give up. */
690 Py_FatalError("Cannot recover from stack overflow.");
691 }
692 return 0;
693 }
694 if (tstate->recursion_depth > recursion_limit) {
695 --tstate->recursion_depth;
696 tstate->overflowed = 1;
Victor Stinner438a12d2019-05-24 17:01:38 +0200697 _PyErr_Format(tstate, PyExc_RecursionError,
698 "maximum recursion depth exceeded%s",
699 where);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000700 return -1;
701 }
702 return 0;
Armin Rigo2b3eb402003-10-28 12:05:48 +0000703}
704
Victor Stinner09532fe2019-05-10 23:39:09 +0200705static int do_raise(PyThreadState *tstate, PyObject *exc, PyObject *cause);
Victor Stinner438a12d2019-05-24 17:01:38 +0200706static int unpack_iterable(PyThreadState *, PyObject *, int, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000707
Victor Stinnere225beb2019-06-03 18:14:24 +0200708#define _Py_TracingPossible(ceval) ((ceval)->tracing_possible)
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000709
Guido van Rossum374a9221991-04-04 10:40:29 +0000710
Guido van Rossumb209a111997-04-29 18:18:01 +0000711PyObject *
Martin v. Löwis4d0d4712010-12-03 20:14:31 +0000712PyEval_EvalCode(PyObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000713{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000714 return PyEval_EvalCodeEx(co,
715 globals, locals,
716 (PyObject **)NULL, 0,
717 (PyObject **)NULL, 0,
718 (PyObject **)NULL, 0,
719 NULL, NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000720}
721
722
723/* Interpreter main loop */
724
Martin v. Löwis8d97e332004-06-27 15:43:12 +0000725PyObject *
Victor Stinnerb9e68122019-11-14 12:20:46 +0100726PyEval_EvalFrame(PyFrameObject *f)
727{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000728 /* This is for backward compatibility with extension modules that
729 used this API; core interpreter code should call
730 PyEval_EvalFrameEx() */
Victor Stinnerb9e68122019-11-14 12:20:46 +0100731 PyThreadState *tstate = _PyThreadState_GET();
732 return _PyEval_EvalFrame(tstate, f, 0);
Phillip J. Eby0d6615f2005-08-02 00:46:46 +0000733}
734
735PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000736PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
Guido van Rossum374a9221991-04-04 10:40:29 +0000737{
Victor Stinnerb9e68122019-11-14 12:20:46 +0100738 PyThreadState *tstate = _PyThreadState_GET();
739 return _PyEval_EvalFrame(tstate, f, throwflag);
Brett Cannon3cebf932016-09-05 15:33:46 -0700740}
741
Victor Stinnerc6944e72016-11-11 02:13:35 +0100742PyObject* _Py_HOT_FUNCTION
Brett Cannon3cebf932016-09-05 15:33:46 -0700743_PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag)
744{
Guido van Rossum950361c1997-01-24 13:49:28 +0000745#ifdef DXPAIRS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000746 int lastopcode = 0;
Guido van Rossum950361c1997-01-24 13:49:28 +0000747#endif
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200748 PyObject **stack_pointer; /* Next free slot in value stack */
Serhiy Storchakaab874002016-09-11 13:48:15 +0300749 const _Py_CODEUNIT *next_instr;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200750 int opcode; /* Current opcode */
751 int oparg; /* Current opcode argument, if any */
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200752 PyObject **fastlocals, **freevars;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000753 PyObject *retval = NULL; /* Return value */
Victor Stinner09532fe2019-05-10 23:39:09 +0200754 _PyRuntimeState * const runtime = &_PyRuntime;
Victor Stinnere225beb2019-06-03 18:14:24 +0200755 struct _ceval_runtime_state * const ceval = &runtime->ceval;
756 _Py_atomic_int * const eval_breaker = &ceval->eval_breaker;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000757 PyCodeObject *co;
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000758
Victor Stinnereb4e2ae2020-03-08 11:57:45 +0100759 PyThreadState * const tstate = _PyRuntimeState_GetThreadState(runtime);
760 ensure_tstate_not_null(__func__, tstate);
Victor Stinnereb4e2ae2020-03-08 11:57:45 +0100761
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
Denis Chernikovbaf29b22020-02-21 12:17:50 +0300929#define PREDICT_ID(op) PRED_##op
930
Antoine Pitrou042b1282010-08-13 21:15:58 +0000931#if defined(DYNAMIC_EXECUTION_PROFILE) || USE_COMPUTED_GOTOS
Denis Chernikovbaf29b22020-02-21 12:17:50 +0300932#define PREDICT(op) if (0) goto PREDICT_ID(op)
Raymond Hettingera7216982004-02-08 19:59:27 +0000933#else
Serhiy Storchakab0f80b02016-05-24 09:15:14 +0300934#define PREDICT(op) \
Denis Chernikovbaf29b22020-02-21 12:17:50 +0300935 do { \
Serhiy Storchakaab874002016-09-11 13:48:15 +0300936 _Py_CODEUNIT word = *next_instr; \
937 opcode = _Py_OPCODE(word); \
Denis Chernikovbaf29b22020-02-21 12:17:50 +0300938 if (opcode == op) { \
Serhiy Storchakaab874002016-09-11 13:48:15 +0300939 oparg = _Py_OPARG(word); \
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +0300940 next_instr++; \
Denis Chernikovbaf29b22020-02-21 12:17:50 +0300941 goto PREDICT_ID(op); \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +0300942 } \
943 } while(0)
Antoine Pitroub52ec782009-01-25 16:34:23 +0000944#endif
Denis Chernikovbaf29b22020-02-21 12:17:50 +0300945#define PREDICTED(op) PREDICT_ID(op):
Antoine Pitroub52ec782009-01-25 16:34:23 +0000946
Raymond Hettingerf606f872003-03-16 03:11:04 +0000947
Guido van Rossum374a9221991-04-04 10:40:29 +0000948/* Stack manipulation macros */
949
Martin v. Löwis18e16552006-02-15 17:27:45 +0000950/* The stack can grow at most MAXINT deep, as co_nlocals and
951 co_stacksize are ints. */
Stefan Krahb7e10102010-06-23 18:42:39 +0000952#define STACK_LEVEL() ((int)(stack_pointer - f->f_valuestack))
953#define EMPTY() (STACK_LEVEL() == 0)
954#define TOP() (stack_pointer[-1])
955#define SECOND() (stack_pointer[-2])
956#define THIRD() (stack_pointer[-3])
957#define FOURTH() (stack_pointer[-4])
958#define PEEK(n) (stack_pointer[-(n)])
959#define SET_TOP(v) (stack_pointer[-1] = (v))
960#define SET_SECOND(v) (stack_pointer[-2] = (v))
961#define SET_THIRD(v) (stack_pointer[-3] = (v))
962#define SET_FOURTH(v) (stack_pointer[-4] = (v))
963#define SET_VALUE(n, v) (stack_pointer[-(n)] = (v))
964#define BASIC_STACKADJ(n) (stack_pointer += n)
965#define BASIC_PUSH(v) (*stack_pointer++ = (v))
966#define BASIC_POP() (*--stack_pointer)
Guido van Rossum374a9221991-04-04 10:40:29 +0000967
Guido van Rossum96a42c81992-01-12 02:29:51 +0000968#ifdef LLTRACE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000969#define PUSH(v) { (void)(BASIC_PUSH(v), \
Victor Stinner438a12d2019-05-24 17:01:38 +0200970 lltrace && prtrace(tstate, TOP(), "push")); \
Stefan Krahb7e10102010-06-23 18:42:39 +0000971 assert(STACK_LEVEL() <= co->co_stacksize); }
Victor Stinner438a12d2019-05-24 17:01:38 +0200972#define POP() ((void)(lltrace && prtrace(tstate, TOP(), "pop")), \
Stefan Krahb7e10102010-06-23 18:42:39 +0000973 BASIC_POP())
costypetrisor8ed317f2018-07-31 20:55:14 +0000974#define STACK_GROW(n) do { \
975 assert(n >= 0); \
976 (void)(BASIC_STACKADJ(n), \
Victor Stinner438a12d2019-05-24 17:01:38 +0200977 lltrace && prtrace(tstate, TOP(), "stackadj")); \
costypetrisor8ed317f2018-07-31 20:55:14 +0000978 assert(STACK_LEVEL() <= co->co_stacksize); \
979 } while (0)
980#define STACK_SHRINK(n) do { \
981 assert(n >= 0); \
Victor Stinner438a12d2019-05-24 17:01:38 +0200982 (void)(lltrace && prtrace(tstate, TOP(), "stackadj")); \
costypetrisor8ed317f2018-07-31 20:55:14 +0000983 (void)(BASIC_STACKADJ(-n)); \
984 assert(STACK_LEVEL() <= co->co_stacksize); \
985 } while (0)
Christian Heimes0449f632007-12-15 01:27:15 +0000986#define EXT_POP(STACK_POINTER) ((void)(lltrace && \
Victor Stinner438a12d2019-05-24 17:01:38 +0200987 prtrace(tstate, (STACK_POINTER)[-1], "ext_pop")), \
Stefan Krahb7e10102010-06-23 18:42:39 +0000988 *--(STACK_POINTER))
Guido van Rossum374a9221991-04-04 10:40:29 +0000989#else
Stefan Krahb7e10102010-06-23 18:42:39 +0000990#define PUSH(v) BASIC_PUSH(v)
991#define POP() BASIC_POP()
costypetrisor8ed317f2018-07-31 20:55:14 +0000992#define STACK_GROW(n) BASIC_STACKADJ(n)
993#define STACK_SHRINK(n) BASIC_STACKADJ(-n)
Guido van Rossumc2e20742006-02-27 22:32:47 +0000994#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
Guido van Rossum374a9221991-04-04 10:40:29 +0000995#endif
996
Guido van Rossum681d79a1995-07-18 14:51:37 +0000997/* Local variable macros */
998
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000999#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumcfbf1a32002-03-28 20:17:52 +00001000
1001/* The SETLOCAL() macro must not DECREF the local variable in-place and
1002 then store the new value; it must copy the old value to a temporary
1003 value, then store the new value, and then DECREF the temporary value.
1004 This is because it is possible that during the DECREF the frame is
1005 accessed by other code (e.g. a __del__ method or gc.collect()) and the
1006 variable would be pointing to already-freed memory. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001007#define SETLOCAL(i, value) do { PyObject *tmp = GETLOCAL(i); \
Stefan Krahb7e10102010-06-23 18:42:39 +00001008 GETLOCAL(i) = value; \
1009 Py_XDECREF(tmp); } while (0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00001010
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001011
1012#define UNWIND_BLOCK(b) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001013 while (STACK_LEVEL() > (b)->b_level) { \
1014 PyObject *v = POP(); \
1015 Py_XDECREF(v); \
1016 }
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001017
1018#define UNWIND_EXCEPT_HANDLER(b) \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001019 do { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001020 PyObject *type, *value, *traceback; \
Mark Shannonae3087c2017-10-22 22:41:51 +01001021 _PyErr_StackItem *exc_info; \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001022 assert(STACK_LEVEL() >= (b)->b_level + 3); \
1023 while (STACK_LEVEL() > (b)->b_level + 3) { \
1024 value = POP(); \
1025 Py_XDECREF(value); \
1026 } \
Mark Shannonae3087c2017-10-22 22:41:51 +01001027 exc_info = tstate->exc_info; \
1028 type = exc_info->exc_type; \
1029 value = exc_info->exc_value; \
1030 traceback = exc_info->exc_traceback; \
1031 exc_info->exc_type = POP(); \
1032 exc_info->exc_value = POP(); \
1033 exc_info->exc_traceback = POP(); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001034 Py_XDECREF(type); \
1035 Py_XDECREF(value); \
1036 Py_XDECREF(traceback); \
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001037 } while(0)
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001038
Inada Naoki91234a12019-06-03 21:30:58 +09001039 /* macros for opcode cache */
1040#define OPCACHE_CHECK() \
1041 do { \
1042 co_opcache = NULL; \
1043 if (co->co_opcache != NULL) { \
1044 unsigned char co_opt_offset = \
1045 co->co_opcache_map[next_instr - first_instr]; \
1046 if (co_opt_offset > 0) { \
1047 assert(co_opt_offset <= co->co_opcache_size); \
1048 co_opcache = &co->co_opcache[co_opt_offset - 1]; \
1049 assert(co_opcache != NULL); \
Inada Naoki91234a12019-06-03 21:30:58 +09001050 } \
1051 } \
1052 } while (0)
1053
1054#if OPCACHE_STATS
1055
1056#define OPCACHE_STAT_GLOBAL_HIT() \
1057 do { \
1058 if (co->co_opcache != NULL) opcache_global_hits++; \
1059 } while (0)
1060
1061#define OPCACHE_STAT_GLOBAL_MISS() \
1062 do { \
1063 if (co->co_opcache != NULL) opcache_global_misses++; \
1064 } while (0)
1065
1066#define OPCACHE_STAT_GLOBAL_OPT() \
1067 do { \
1068 if (co->co_opcache != NULL) opcache_global_opts++; \
1069 } while (0)
1070
1071#else /* OPCACHE_STATS */
1072
1073#define OPCACHE_STAT_GLOBAL_HIT()
1074#define OPCACHE_STAT_GLOBAL_MISS()
1075#define OPCACHE_STAT_GLOBAL_OPT()
1076
1077#endif
1078
Guido van Rossuma027efa1997-05-05 20:56:21 +00001079/* Start of code */
1080
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001081 /* push frame */
Victor Stinnerbe434dc2019-11-05 00:51:22 +01001082 if (_Py_EnterRecursiveCall(tstate, "")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001083 return NULL;
Victor Stinnerbe434dc2019-11-05 00:51:22 +01001084 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001085
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001086 tstate->frame = f;
Tim Peters5ca576e2001-06-18 22:08:13 +00001087
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001088 if (tstate->use_tracing) {
1089 if (tstate->c_tracefunc != NULL) {
1090 /* tstate->c_tracefunc, if defined, is a
1091 function that will be called on *every* entry
1092 to a code block. Its return value, if not
1093 None, is a function that will be called at
1094 the start of each executed line of code.
1095 (Actually, the function must return itself
1096 in order to continue tracing.) The trace
1097 functions are called with three arguments:
1098 a pointer to the current frame, a string
1099 indicating why the function is called, and
1100 an argument which depends on the situation.
1101 The global trace function is also called
1102 whenever an exception is detected. */
1103 if (call_trace_protected(tstate->c_tracefunc,
1104 tstate->c_traceobj,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01001105 tstate, f, PyTrace_CALL, Py_None)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001106 /* Trace function raised an error */
1107 goto exit_eval_frame;
1108 }
1109 }
1110 if (tstate->c_profilefunc != NULL) {
1111 /* Similar for c_profilefunc, except it needn't
1112 return itself and isn't called for "line" events */
1113 if (call_trace_protected(tstate->c_profilefunc,
1114 tstate->c_profileobj,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01001115 tstate, f, PyTrace_CALL, Py_None)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001116 /* Profile function raised an error */
1117 goto exit_eval_frame;
1118 }
1119 }
1120 }
Neil Schemenauer6c0f2002001-09-04 19:03:35 +00001121
Łukasz Langaa785c872016-09-09 17:37:37 -07001122 if (PyDTrace_FUNCTION_ENTRY_ENABLED())
1123 dtrace_function_entry(f);
1124
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001125 co = f->f_code;
1126 names = co->co_names;
1127 consts = co->co_consts;
1128 fastlocals = f->f_localsplus;
1129 freevars = f->f_localsplus + co->co_nlocals;
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03001130 assert(PyBytes_Check(co->co_code));
1131 assert(PyBytes_GET_SIZE(co->co_code) <= INT_MAX);
Serhiy Storchakaab874002016-09-11 13:48:15 +03001132 assert(PyBytes_GET_SIZE(co->co_code) % sizeof(_Py_CODEUNIT) == 0);
1133 assert(_Py_IS_ALIGNED(PyBytes_AS_STRING(co->co_code), sizeof(_Py_CODEUNIT)));
1134 first_instr = (_Py_CODEUNIT *) PyBytes_AS_STRING(co->co_code);
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001135 /*
1136 f->f_lasti refers to the index of the last instruction,
1137 unless it's -1 in which case next_instr should be first_instr.
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001138
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001139 YIELD_FROM sets f_lasti to itself, in order to repeatedly yield
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05001140 multiple values.
Thomas Wouters902d6eb2007-01-09 23:18:33 +00001141
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001142 When the PREDICT() macros are enabled, some opcode pairs follow in
1143 direct succession without updating f->f_lasti. A successful
1144 prediction effectively links the two codes together as if they
1145 were a single new opcode; accordingly,f->f_lasti will point to
1146 the first code in the pair (for instance, GET_ITER followed by
1147 FOR_ITER is effectively a single opcode and f->f_lasti will point
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001148 to the beginning of the combined pair.)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001149 */
Serhiy Storchakaab874002016-09-11 13:48:15 +03001150 assert(f->f_lasti >= -1);
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001151 next_instr = first_instr;
1152 if (f->f_lasti >= 0) {
Serhiy Storchakaab874002016-09-11 13:48:15 +03001153 assert(f->f_lasti % sizeof(_Py_CODEUNIT) == 0);
1154 next_instr += f->f_lasti / sizeof(_Py_CODEUNIT) + 1;
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001155 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001156 stack_pointer = f->f_stacktop;
1157 assert(stack_pointer != NULL);
1158 f->f_stacktop = NULL; /* remains NULL unless yield suspends frame */
Antoine Pitrou58720d62013-08-05 23:26:40 +02001159 f->f_executing = 1;
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001160
Inada Naoki91234a12019-06-03 21:30:58 +09001161 if (co->co_opcache_flag < OPCACHE_MIN_RUNS) {
1162 co->co_opcache_flag++;
1163 if (co->co_opcache_flag == OPCACHE_MIN_RUNS) {
1164 if (_PyCode_InitOpcache(co) < 0) {
1165 return NULL;
1166 }
1167#if OPCACHE_STATS
1168 opcache_code_objects_extra_mem +=
1169 PyBytes_Size(co->co_code) / sizeof(_Py_CODEUNIT) +
1170 sizeof(_PyOpcache) * co->co_opcache_size;
1171 opcache_code_objects++;
1172#endif
1173 }
1174 }
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001175
Tim Peters5ca576e2001-06-18 22:08:13 +00001176#ifdef LLTRACE
Victor Stinner3c1e4812012-03-26 22:10:51 +02001177 lltrace = _PyDict_GetItemId(f->f_globals, &PyId___ltrace__) != NULL;
Tim Peters5ca576e2001-06-18 22:08:13 +00001178#endif
Guido van Rossumac7be682001-01-17 15:42:30 +00001179
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001180 if (throwflag) /* support for generator.throw() */
1181 goto error;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001182
Victor Stinnerace47d72013-07-18 01:41:08 +02001183#ifdef Py_DEBUG
1184 /* PyEval_EvalFrameEx() must not be called with an exception set,
Victor Stinnera8cb5152017-01-18 14:12:51 +01001185 because it can clear it (directly or indirectly) and so the
Martin Panter9955a372015-10-07 10:26:23 +00001186 caller loses its exception */
Victor Stinner438a12d2019-05-24 17:01:38 +02001187 assert(!_PyErr_Occurred(tstate));
Victor Stinnerace47d72013-07-18 01:41:08 +02001188#endif
1189
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001190main_loop:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001191 for (;;) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001192 assert(stack_pointer >= f->f_valuestack); /* else underflow */
1193 assert(STACK_LEVEL() <= co->co_stacksize); /* else overflow */
Victor Stinner438a12d2019-05-24 17:01:38 +02001194 assert(!_PyErr_Occurred(tstate));
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001195
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001196 /* Do periodic things. Doing this every time through
1197 the loop would add too much overhead, so we do it
1198 only every Nth instruction. We also do it if
1199 ``pendingcalls_to_do'' is set, i.e. when an asynchronous
1200 event needs attention (e.g. a signal handler or
1201 async I/O handler); see Py_AddPendingCall() and
1202 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +00001203
Eric Snow7bda9de2019-03-08 17:25:54 -07001204 if (_Py_atomic_load_relaxed(eval_breaker)) {
Serhiy Storchaka3f4d90d2018-07-09 15:40:14 +03001205 opcode = _Py_OPCODE(*next_instr);
1206 if (opcode == SETUP_FINALLY ||
1207 opcode == SETUP_WITH ||
1208 opcode == BEFORE_ASYNC_WITH ||
1209 opcode == YIELD_FROM) {
1210 /* Few cases where we skip running signal handlers and other
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07001211 pending calls:
Serhiy Storchaka3f4d90d2018-07-09 15:40:14 +03001212 - If we're about to enter the 'with:'. It will prevent
1213 emitting a resource warning in the common idiom
1214 'with open(path) as file:'.
1215 - If we're about to enter the 'async with:'.
1216 - If we're about to enter the 'try:' of a try/finally (not
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07001217 *very* useful, but might help in some cases and it's
1218 traditional)
1219 - If we're resuming a chain of nested 'yield from' or
1220 'await' calls, then each frame is parked with YIELD_FROM
1221 as its next opcode. If the user hit control-C we want to
1222 wait until we've reached the innermost frame before
1223 running the signal handler and raising KeyboardInterrupt
1224 (see bpo-30039).
1225 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001226 goto fast_next_opcode;
1227 }
Eric Snowfdf282d2019-01-11 14:26:55 -07001228
Victor Stinnere225beb2019-06-03 18:14:24 +02001229 if (_Py_atomic_load_relaxed(&ceval->signals_pending)) {
Victor Stinner09532fe2019-05-10 23:39:09 +02001230 if (handle_signals(runtime) != 0) {
Eric Snowfdf282d2019-01-11 14:26:55 -07001231 goto error;
1232 }
1233 }
Victor Stinnere225beb2019-06-03 18:14:24 +02001234 if (_Py_atomic_load_relaxed(&ceval->pending.calls_to_do)) {
1235 if (make_pending_calls(runtime) != 0) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001236 goto error;
Eric Snowfdf282d2019-01-11 14:26:55 -07001237 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001238 }
Eric Snowfdf282d2019-01-11 14:26:55 -07001239
Victor Stinnere225beb2019-06-03 18:14:24 +02001240 if (_Py_atomic_load_relaxed(&ceval->gil_drop_request)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001241 /* Give another thread a chance */
Victor Stinner09532fe2019-05-10 23:39:09 +02001242 if (_PyThreadState_Swap(&runtime->gilstate, NULL) != tstate) {
Victor Stinner9e5d30c2020-03-07 00:54:20 +01001243 Py_FatalError("tstate mix-up");
Victor Stinner09532fe2019-05-10 23:39:09 +02001244 }
Victor Stinnere225beb2019-06-03 18:14:24 +02001245 drop_gil(ceval, tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001246
1247 /* Other threads may run now */
1248
Victor Stinner85f5a692020-03-09 22:12:04 +01001249 take_gil(tstate);
Victor Stinnereb4e2ae2020-03-08 11:57:45 +01001250
Victor Stinner09532fe2019-05-10 23:39:09 +02001251 if (_PyThreadState_Swap(&runtime->gilstate, tstate) != NULL) {
Victor Stinner9e5d30c2020-03-07 00:54:20 +01001252 Py_FatalError("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 }
Petr Viktorinffd97532020-02-11 17:46:57 +01001881 res = PyObject_CallOneArg(hook, value);
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);
Mark Shannone7c9f4a2020-01-13 12:51:26 +00001914 assert(EMPTY());
1915 goto exiting;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04001916 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001917
Benjamin Petersonddd19492018-09-16 22:38:02 -07001918 case TARGET(GET_AITER): {
Yury Selivanov6ef05902015-05-28 11:21:31 -04001919 unaryfunc getter = NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04001920 PyObject *iter = NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04001921 PyObject *obj = TOP();
1922 PyTypeObject *type = Py_TYPE(obj);
1923
Yury Selivanova6f6edb2016-06-09 15:08:31 -04001924 if (type->tp_as_async != NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04001925 getter = type->tp_as_async->am_aiter;
Yury Selivanova6f6edb2016-06-09 15:08:31 -04001926 }
Yury Selivanov75445082015-05-11 22:57:16 -04001927
1928 if (getter != NULL) {
1929 iter = (*getter)(obj);
1930 Py_DECREF(obj);
1931 if (iter == NULL) {
1932 SET_TOP(NULL);
1933 goto error;
1934 }
1935 }
1936 else {
1937 SET_TOP(NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02001938 _PyErr_Format(tstate, PyExc_TypeError,
1939 "'async for' requires an object with "
1940 "__aiter__ method, got %.100s",
1941 type->tp_name);
Yury Selivanov75445082015-05-11 22:57:16 -04001942 Py_DECREF(obj);
1943 goto error;
1944 }
1945
Yury Selivanovfaa135a2017-10-06 02:08:57 -04001946 if (Py_TYPE(iter)->tp_as_async == NULL ||
1947 Py_TYPE(iter)->tp_as_async->am_anext == NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04001948
Yury Selivanov398ff912017-03-02 22:20:00 -05001949 SET_TOP(NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02001950 _PyErr_Format(tstate, PyExc_TypeError,
1951 "'async for' received an object from __aiter__ "
1952 "that does not implement __anext__: %.100s",
1953 Py_TYPE(iter)->tp_name);
Yury Selivanov75445082015-05-11 22:57:16 -04001954 Py_DECREF(iter);
1955 goto error;
Yury Selivanova6f6edb2016-06-09 15:08:31 -04001956 }
1957
Yury Selivanovfaa135a2017-10-06 02:08:57 -04001958 SET_TOP(iter);
Yury Selivanov75445082015-05-11 22:57:16 -04001959 DISPATCH();
1960 }
1961
Benjamin Petersonddd19492018-09-16 22:38:02 -07001962 case TARGET(GET_ANEXT): {
Yury Selivanov6ef05902015-05-28 11:21:31 -04001963 unaryfunc getter = NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04001964 PyObject *next_iter = NULL;
1965 PyObject *awaitable = NULL;
1966 PyObject *aiter = TOP();
1967 PyTypeObject *type = Py_TYPE(aiter);
1968
Yury Selivanoveb636452016-09-08 22:01:51 -07001969 if (PyAsyncGen_CheckExact(aiter)) {
1970 awaitable = type->tp_as_async->am_anext(aiter);
1971 if (awaitable == NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04001972 goto error;
1973 }
Yury Selivanoveb636452016-09-08 22:01:51 -07001974 } else {
1975 if (type->tp_as_async != NULL){
1976 getter = type->tp_as_async->am_anext;
1977 }
Yury Selivanov75445082015-05-11 22:57:16 -04001978
Yury Selivanoveb636452016-09-08 22:01:51 -07001979 if (getter != NULL) {
1980 next_iter = (*getter)(aiter);
1981 if (next_iter == NULL) {
1982 goto error;
1983 }
1984 }
1985 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02001986 _PyErr_Format(tstate, PyExc_TypeError,
1987 "'async for' requires an iterator with "
1988 "__anext__ method, got %.100s",
1989 type->tp_name);
Yury Selivanoveb636452016-09-08 22:01:51 -07001990 goto error;
1991 }
Yury Selivanov75445082015-05-11 22:57:16 -04001992
Yury Selivanoveb636452016-09-08 22:01:51 -07001993 awaitable = _PyCoro_GetAwaitableIter(next_iter);
1994 if (awaitable == NULL) {
Yury Selivanov398ff912017-03-02 22:20:00 -05001995 _PyErr_FormatFromCause(
Yury Selivanoveb636452016-09-08 22:01:51 -07001996 PyExc_TypeError,
1997 "'async for' received an invalid object "
1998 "from __anext__: %.100s",
1999 Py_TYPE(next_iter)->tp_name);
2000
2001 Py_DECREF(next_iter);
2002 goto error;
2003 } else {
2004 Py_DECREF(next_iter);
2005 }
2006 }
Yury Selivanov75445082015-05-11 22:57:16 -04002007
2008 PUSH(awaitable);
Serhiy Storchakada9c5132016-06-27 18:58:57 +03002009 PREDICT(LOAD_CONST);
Yury Selivanov75445082015-05-11 22:57:16 -04002010 DISPATCH();
2011 }
2012
Benjamin Petersonddd19492018-09-16 22:38:02 -07002013 case TARGET(GET_AWAITABLE): {
2014 PREDICTED(GET_AWAITABLE);
Yury Selivanov75445082015-05-11 22:57:16 -04002015 PyObject *iterable = TOP();
Yury Selivanov5376ba92015-06-22 12:19:30 -04002016 PyObject *iter = _PyCoro_GetAwaitableIter(iterable);
Yury Selivanov75445082015-05-11 22:57:16 -04002017
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03002018 if (iter == NULL) {
Mark Shannonfee55262019-11-21 09:11:43 +00002019 int opcode_at_minus_3 = 0;
2020 if ((next_instr - first_instr) > 2) {
2021 opcode_at_minus_3 = _Py_OPCODE(next_instr[-3]);
2022 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002023 format_awaitable_error(tstate, Py_TYPE(iterable),
Mark Shannonfee55262019-11-21 09:11:43 +00002024 opcode_at_minus_3,
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03002025 _Py_OPCODE(next_instr[-2]));
2026 }
2027
Yury Selivanov75445082015-05-11 22:57:16 -04002028 Py_DECREF(iterable);
2029
Yury Selivanovc724bae2016-03-02 11:30:46 -05002030 if (iter != NULL && PyCoro_CheckExact(iter)) {
2031 PyObject *yf = _PyGen_yf((PyGenObject*)iter);
2032 if (yf != NULL) {
2033 /* `iter` is a coroutine object that is being
2034 awaited, `yf` is a pointer to the current awaitable
2035 being awaited on. */
2036 Py_DECREF(yf);
2037 Py_CLEAR(iter);
Victor Stinner438a12d2019-05-24 17:01:38 +02002038 _PyErr_SetString(tstate, PyExc_RuntimeError,
2039 "coroutine is being awaited already");
Yury Selivanovc724bae2016-03-02 11:30:46 -05002040 /* The code below jumps to `error` if `iter` is NULL. */
2041 }
2042 }
2043
Yury Selivanov75445082015-05-11 22:57:16 -04002044 SET_TOP(iter); /* Even if it's NULL */
2045
2046 if (iter == NULL) {
2047 goto error;
2048 }
2049
Serhiy Storchakada9c5132016-06-27 18:58:57 +03002050 PREDICT(LOAD_CONST);
Yury Selivanov75445082015-05-11 22:57:16 -04002051 DISPATCH();
2052 }
2053
Benjamin Petersonddd19492018-09-16 22:38:02 -07002054 case TARGET(YIELD_FROM): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002055 PyObject *v = POP();
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07002056 PyObject *receiver = TOP();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002057 int err;
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07002058 if (PyGen_CheckExact(receiver) || PyCoro_CheckExact(receiver)) {
2059 retval = _PyGen_Send((PyGenObject *)receiver, v);
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05002060 } else {
Benjamin Peterson302e7902012-03-20 23:17:04 -04002061 _Py_IDENTIFIER(send);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002062 if (v == Py_None)
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07002063 retval = Py_TYPE(receiver)->tp_iternext(receiver);
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05002064 else
Jeroen Demeyer59ad1102019-07-11 10:59:05 +02002065 retval = _PyObject_CallMethodIdOneArg(receiver, &PyId_send, v);
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05002066 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002067 Py_DECREF(v);
2068 if (retval == NULL) {
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05002069 PyObject *val;
Guido van Rossum8820c232013-11-21 11:30:06 -08002070 if (tstate->c_tracefunc != NULL
Victor Stinner438a12d2019-05-24 17:01:38 +02002071 && _PyErr_ExceptionMatches(tstate, PyExc_StopIteration))
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01002072 call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj, tstate, f);
Nick Coghlanc40bc092012-06-17 15:15:49 +10002073 err = _PyGen_FetchStopIterationValue(&val);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002074 if (err < 0)
2075 goto error;
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07002076 Py_DECREF(receiver);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002077 SET_TOP(val);
2078 DISPATCH();
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002079 }
Martin Panter95f53c12016-07-18 08:23:26 +00002080 /* receiver remains on stack, retval is value to be yielded */
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002081 f->f_stacktop = stack_pointer;
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05002082 /* and repeat... */
Victor Stinnerf7d199f2016-11-24 22:33:01 +01002083 assert(f->f_lasti >= (int)sizeof(_Py_CODEUNIT));
Serhiy Storchakaab874002016-09-11 13:48:15 +03002084 f->f_lasti -= sizeof(_Py_CODEUNIT);
Mark Shannone7c9f4a2020-01-13 12:51:26 +00002085 goto exiting;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002086 }
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002087
Benjamin Petersonddd19492018-09-16 22:38:02 -07002088 case TARGET(YIELD_VALUE): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002089 retval = POP();
Yury Selivanoveb636452016-09-08 22:01:51 -07002090
2091 if (co->co_flags & CO_ASYNC_GENERATOR) {
2092 PyObject *w = _PyAsyncGenValueWrapperNew(retval);
2093 Py_DECREF(retval);
2094 if (w == NULL) {
2095 retval = NULL;
2096 goto error;
2097 }
2098 retval = w;
2099 }
2100
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002101 f->f_stacktop = stack_pointer;
Mark Shannone7c9f4a2020-01-13 12:51:26 +00002102 goto exiting;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002103 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002104
Benjamin Petersonddd19492018-09-16 22:38:02 -07002105 case TARGET(POP_EXCEPT): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002106 PyObject *type, *value, *traceback;
2107 _PyErr_StackItem *exc_info;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002108 PyTryBlock *b = PyFrame_BlockPop(f);
2109 if (b->b_type != EXCEPT_HANDLER) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002110 _PyErr_SetString(tstate, PyExc_SystemError,
2111 "popped block is not an except handler");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002112 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002113 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002114 assert(STACK_LEVEL() >= (b)->b_level + 3 &&
2115 STACK_LEVEL() <= (b)->b_level + 4);
2116 exc_info = tstate->exc_info;
2117 type = exc_info->exc_type;
2118 value = exc_info->exc_value;
2119 traceback = exc_info->exc_traceback;
2120 exc_info->exc_type = POP();
2121 exc_info->exc_value = POP();
2122 exc_info->exc_traceback = POP();
2123 Py_XDECREF(type);
2124 Py_XDECREF(value);
2125 Py_XDECREF(traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002126 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002127 }
Benjamin Petersoneec3d712008-06-11 15:59:43 +00002128
Benjamin Petersonddd19492018-09-16 22:38:02 -07002129 case TARGET(POP_BLOCK): {
2130 PREDICTED(POP_BLOCK);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002131 PyFrame_BlockPop(f);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002132 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002133 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002134
Mark Shannonfee55262019-11-21 09:11:43 +00002135 case TARGET(RERAISE): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002136 PyObject *exc = POP();
Mark Shannonfee55262019-11-21 09:11:43 +00002137 PyObject *val = POP();
2138 PyObject *tb = POP();
2139 assert(PyExceptionClass_Check(exc));
Victor Stinner61f4db82020-01-28 03:37:45 +01002140 _PyErr_Restore(tstate, exc, val, tb);
Mark Shannonfee55262019-11-21 09:11:43 +00002141 goto exception_unwind;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002142 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002143
Benjamin Petersonddd19492018-09-16 22:38:02 -07002144 case TARGET(END_ASYNC_FOR): {
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002145 PyObject *exc = POP();
2146 assert(PyExceptionClass_Check(exc));
2147 if (PyErr_GivenExceptionMatches(exc, PyExc_StopAsyncIteration)) {
2148 PyTryBlock *b = PyFrame_BlockPop(f);
2149 assert(b->b_type == EXCEPT_HANDLER);
2150 Py_DECREF(exc);
2151 UNWIND_EXCEPT_HANDLER(b);
2152 Py_DECREF(POP());
2153 JUMPBY(oparg);
2154 FAST_DISPATCH();
2155 }
2156 else {
2157 PyObject *val = POP();
2158 PyObject *tb = POP();
Victor Stinner438a12d2019-05-24 17:01:38 +02002159 _PyErr_Restore(tstate, exc, val, tb);
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002160 goto exception_unwind;
2161 }
2162 }
2163
Zackery Spytzce6a0702019-08-25 03:44:09 -06002164 case TARGET(LOAD_ASSERTION_ERROR): {
2165 PyObject *value = PyExc_AssertionError;
2166 Py_INCREF(value);
2167 PUSH(value);
2168 FAST_DISPATCH();
2169 }
2170
Benjamin Petersonddd19492018-09-16 22:38:02 -07002171 case TARGET(LOAD_BUILD_CLASS): {
Victor Stinner3c1e4812012-03-26 22:10:51 +02002172 _Py_IDENTIFIER(__build_class__);
Victor Stinnerb0b22422012-04-19 00:57:45 +02002173
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002174 PyObject *bc;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002175 if (PyDict_CheckExact(f->f_builtins)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002176 bc = _PyDict_GetItemIdWithError(f->f_builtins, &PyId___build_class__);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002177 if (bc == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002178 if (!_PyErr_Occurred(tstate)) {
2179 _PyErr_SetString(tstate, PyExc_NameError,
2180 "__build_class__ not found");
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002181 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002182 goto error;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002183 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002184 Py_INCREF(bc);
Victor Stinnerb0b22422012-04-19 00:57:45 +02002185 }
2186 else {
2187 PyObject *build_class_str = _PyUnicode_FromId(&PyId___build_class__);
2188 if (build_class_str == NULL)
Serhiy Storchaka70b72f02016-11-08 23:12:46 +02002189 goto error;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002190 bc = PyObject_GetItem(f->f_builtins, build_class_str);
2191 if (bc == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002192 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError))
2193 _PyErr_SetString(tstate, PyExc_NameError,
2194 "__build_class__ not found");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002195 goto error;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002196 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002197 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002198 PUSH(bc);
Benjamin Peterson00f86f22012-10-10 14:10:33 -04002199 DISPATCH();
Victor Stinner3c1e4812012-03-26 22:10:51 +02002200 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002201
Benjamin Petersonddd19492018-09-16 22:38:02 -07002202 case TARGET(STORE_NAME): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002203 PyObject *name = GETITEM(names, oparg);
2204 PyObject *v = POP();
2205 PyObject *ns = f->f_locals;
2206 int err;
2207 if (ns == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002208 _PyErr_Format(tstate, PyExc_SystemError,
2209 "no locals found when storing %R", name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002210 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002211 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002212 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002213 if (PyDict_CheckExact(ns))
2214 err = PyDict_SetItem(ns, name, v);
2215 else
2216 err = PyObject_SetItem(ns, name, v);
2217 Py_DECREF(v);
2218 if (err != 0)
2219 goto error;
2220 DISPATCH();
2221 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002222
Benjamin Petersonddd19492018-09-16 22:38:02 -07002223 case TARGET(DELETE_NAME): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002224 PyObject *name = GETITEM(names, oparg);
2225 PyObject *ns = f->f_locals;
2226 int err;
2227 if (ns == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002228 _PyErr_Format(tstate, PyExc_SystemError,
2229 "no locals when deleting %R", name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002230 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002231 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002232 err = PyObject_DelItem(ns, name);
2233 if (err != 0) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002234 format_exc_check_arg(tstate, PyExc_NameError,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002235 NAME_ERROR_MSG,
2236 name);
2237 goto error;
2238 }
2239 DISPATCH();
2240 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00002241
Benjamin Petersonddd19492018-09-16 22:38:02 -07002242 case TARGET(UNPACK_SEQUENCE): {
2243 PREDICTED(UNPACK_SEQUENCE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002244 PyObject *seq = POP(), *item, **items;
2245 if (PyTuple_CheckExact(seq) &&
2246 PyTuple_GET_SIZE(seq) == oparg) {
2247 items = ((PyTupleObject *)seq)->ob_item;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002248 while (oparg--) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002249 item = items[oparg];
2250 Py_INCREF(item);
2251 PUSH(item);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002252 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002253 } else if (PyList_CheckExact(seq) &&
2254 PyList_GET_SIZE(seq) == oparg) {
2255 items = ((PyListObject *)seq)->ob_item;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002256 while (oparg--) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002257 item = items[oparg];
2258 Py_INCREF(item);
2259 PUSH(item);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002260 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002261 } else if (unpack_iterable(tstate, seq, oparg, -1,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002262 stack_pointer + oparg)) {
costypetrisor8ed317f2018-07-31 20:55:14 +00002263 STACK_GROW(oparg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002264 } else {
2265 /* unpack_iterable() raised an exception */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002266 Py_DECREF(seq);
2267 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002268 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002269 Py_DECREF(seq);
Benjamin Peterson00f86f22012-10-10 14:10:33 -04002270 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002271 }
Guido van Rossum0368b722007-05-11 16:50:42 +00002272
Benjamin Petersonddd19492018-09-16 22:38:02 -07002273 case TARGET(UNPACK_EX): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002274 int totalargs = 1 + (oparg & 0xFF) + (oparg >> 8);
2275 PyObject *seq = POP();
2276
Victor Stinner438a12d2019-05-24 17:01:38 +02002277 if (unpack_iterable(tstate, seq, oparg & 0xFF, oparg >> 8,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002278 stack_pointer + totalargs)) {
2279 stack_pointer += totalargs;
2280 } else {
2281 Py_DECREF(seq);
2282 goto error;
2283 }
2284 Py_DECREF(seq);
2285 DISPATCH();
2286 }
2287
Benjamin Petersonddd19492018-09-16 22:38:02 -07002288 case TARGET(STORE_ATTR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002289 PyObject *name = GETITEM(names, oparg);
2290 PyObject *owner = TOP();
2291 PyObject *v = SECOND();
2292 int err;
costypetrisor8ed317f2018-07-31 20:55:14 +00002293 STACK_SHRINK(2);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002294 err = PyObject_SetAttr(owner, name, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002295 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002296 Py_DECREF(owner);
2297 if (err != 0)
2298 goto error;
2299 DISPATCH();
2300 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002301
Benjamin Petersonddd19492018-09-16 22:38:02 -07002302 case TARGET(DELETE_ATTR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002303 PyObject *name = GETITEM(names, oparg);
2304 PyObject *owner = POP();
2305 int err;
2306 err = PyObject_SetAttr(owner, name, (PyObject *)NULL);
2307 Py_DECREF(owner);
2308 if (err != 0)
2309 goto error;
2310 DISPATCH();
2311 }
2312
Benjamin Petersonddd19492018-09-16 22:38:02 -07002313 case TARGET(STORE_GLOBAL): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002314 PyObject *name = GETITEM(names, oparg);
2315 PyObject *v = POP();
2316 int err;
2317 err = PyDict_SetItem(f->f_globals, name, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002318 Py_DECREF(v);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002319 if (err != 0)
2320 goto error;
2321 DISPATCH();
2322 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002323
Benjamin Petersonddd19492018-09-16 22:38:02 -07002324 case TARGET(DELETE_GLOBAL): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002325 PyObject *name = GETITEM(names, oparg);
2326 int err;
2327 err = PyDict_DelItem(f->f_globals, name);
2328 if (err != 0) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002329 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
2330 format_exc_check_arg(tstate, PyExc_NameError,
2331 NAME_ERROR_MSG, name);
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002332 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002333 goto error;
Benjamin Peterson00f86f22012-10-10 14:10:33 -04002334 }
2335 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002336 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002337
Benjamin Petersonddd19492018-09-16 22:38:02 -07002338 case TARGET(LOAD_NAME): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002339 PyObject *name = GETITEM(names, oparg);
2340 PyObject *locals = f->f_locals;
2341 PyObject *v;
2342 if (locals == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002343 _PyErr_Format(tstate, PyExc_SystemError,
2344 "no locals when loading %R", name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002345 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002346 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002347 if (PyDict_CheckExact(locals)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002348 v = PyDict_GetItemWithError(locals, name);
2349 if (v != NULL) {
2350 Py_INCREF(v);
2351 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002352 else if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002353 goto error;
2354 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002355 }
2356 else {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002357 v = PyObject_GetItem(locals, name);
Victor Stinnere20310f2015-11-05 13:56:58 +01002358 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002359 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError))
Benjamin Peterson92722792012-12-15 12:51:05 -05002360 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02002361 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002362 }
2363 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002364 if (v == NULL) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002365 v = PyDict_GetItemWithError(f->f_globals, name);
2366 if (v != NULL) {
2367 Py_INCREF(v);
2368 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002369 else if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002370 goto error;
2371 }
2372 else {
Victor Stinnerb0b22422012-04-19 00:57:45 +02002373 if (PyDict_CheckExact(f->f_builtins)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002374 v = PyDict_GetItemWithError(f->f_builtins, name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002375 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002376 if (!_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002377 format_exc_check_arg(
Victor Stinner438a12d2019-05-24 17:01:38 +02002378 tstate, PyExc_NameError,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002379 NAME_ERROR_MSG, name);
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002380 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002381 goto error;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002382 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002383 Py_INCREF(v);
Victor Stinnerb0b22422012-04-19 00:57:45 +02002384 }
2385 else {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002386 v = PyObject_GetItem(f->f_builtins, name);
2387 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002388 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Victor Stinnerb0b22422012-04-19 00:57:45 +02002389 format_exc_check_arg(
Victor Stinner438a12d2019-05-24 17:01:38 +02002390 tstate, PyExc_NameError,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002391 NAME_ERROR_MSG, name);
Victor Stinner438a12d2019-05-24 17:01:38 +02002392 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002393 goto error;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002394 }
Benjamin Peterson20f9c3c2010-07-20 22:39:34 +00002395 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002396 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002397 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002398 PUSH(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002399 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002400 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002401
Benjamin Petersonddd19492018-09-16 22:38:02 -07002402 case TARGET(LOAD_GLOBAL): {
Inada Naoki91234a12019-06-03 21:30:58 +09002403 PyObject *name;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002404 PyObject *v;
Victor Stinnerb0b22422012-04-19 00:57:45 +02002405 if (PyDict_CheckExact(f->f_globals)
Victor Stinnerb4efc962015-11-20 09:24:02 +01002406 && PyDict_CheckExact(f->f_builtins))
2407 {
Inada Naoki91234a12019-06-03 21:30:58 +09002408 OPCACHE_CHECK();
2409 if (co_opcache != NULL && co_opcache->optimized > 0) {
2410 _PyOpcache_LoadGlobal *lg = &co_opcache->u.lg;
2411
2412 if (lg->globals_ver ==
2413 ((PyDictObject *)f->f_globals)->ma_version_tag
2414 && lg->builtins_ver ==
2415 ((PyDictObject *)f->f_builtins)->ma_version_tag)
2416 {
2417 PyObject *ptr = lg->ptr;
2418 OPCACHE_STAT_GLOBAL_HIT();
2419 assert(ptr != NULL);
2420 Py_INCREF(ptr);
2421 PUSH(ptr);
2422 DISPATCH();
2423 }
2424 }
2425
2426 name = GETITEM(names, oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002427 v = _PyDict_LoadGlobal((PyDictObject *)f->f_globals,
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002428 (PyDictObject *)f->f_builtins,
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002429 name);
2430 if (v == NULL) {
Victor Stinnerb4efc962015-11-20 09:24:02 +01002431 if (!_PyErr_OCCURRED()) {
2432 /* _PyDict_LoadGlobal() returns NULL without raising
2433 * an exception if the key doesn't exist */
Victor Stinner438a12d2019-05-24 17:01:38 +02002434 format_exc_check_arg(tstate, PyExc_NameError,
Ezio Melotti04a29552013-03-03 15:12:44 +02002435 NAME_ERROR_MSG, name);
Victor Stinnerb4efc962015-11-20 09:24:02 +01002436 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002437 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002438 }
Inada Naoki91234a12019-06-03 21:30:58 +09002439
2440 if (co_opcache != NULL) {
2441 _PyOpcache_LoadGlobal *lg = &co_opcache->u.lg;
2442
2443 if (co_opcache->optimized == 0) {
2444 /* Wasn't optimized before. */
2445 OPCACHE_STAT_GLOBAL_OPT();
2446 } else {
2447 OPCACHE_STAT_GLOBAL_MISS();
2448 }
2449
2450 co_opcache->optimized = 1;
2451 lg->globals_ver =
2452 ((PyDictObject *)f->f_globals)->ma_version_tag;
2453 lg->builtins_ver =
2454 ((PyDictObject *)f->f_builtins)->ma_version_tag;
2455 lg->ptr = v; /* borrowed */
2456 }
2457
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002458 Py_INCREF(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002459 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002460 else {
2461 /* Slow-path if globals or builtins is not a dict */
Victor Stinnerb4efc962015-11-20 09:24:02 +01002462
2463 /* namespace 1: globals */
Inada Naoki91234a12019-06-03 21:30:58 +09002464 name = GETITEM(names, oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002465 v = PyObject_GetItem(f->f_globals, name);
2466 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002467 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Victor Stinner60a1d3c2015-11-05 13:55:20 +01002468 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02002469 }
2470 _PyErr_Clear(tstate);
Victor Stinner60a1d3c2015-11-05 13:55:20 +01002471
Victor Stinnerb4efc962015-11-20 09:24:02 +01002472 /* namespace 2: builtins */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002473 v = PyObject_GetItem(f->f_builtins, name);
2474 if (v == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002475 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002476 format_exc_check_arg(
Victor Stinner438a12d2019-05-24 17:01:38 +02002477 tstate, PyExc_NameError,
Ezio Melotti04a29552013-03-03 15:12:44 +02002478 NAME_ERROR_MSG, name);
Victor Stinner438a12d2019-05-24 17:01:38 +02002479 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002480 goto error;
Benjamin Peterson7d95e402012-04-23 11:24:50 -04002481 }
2482 }
2483 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002484 PUSH(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002485 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002486 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002487
Benjamin Petersonddd19492018-09-16 22:38:02 -07002488 case TARGET(DELETE_FAST): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002489 PyObject *v = GETLOCAL(oparg);
2490 if (v != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002491 SETLOCAL(oparg, NULL);
2492 DISPATCH();
2493 }
2494 format_exc_check_arg(
Victor Stinner438a12d2019-05-24 17:01:38 +02002495 tstate, PyExc_UnboundLocalError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002496 UNBOUNDLOCAL_ERROR_MSG,
2497 PyTuple_GetItem(co->co_varnames, oparg)
2498 );
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002499 goto error;
2500 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002501
Benjamin Petersonddd19492018-09-16 22:38:02 -07002502 case TARGET(DELETE_DEREF): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002503 PyObject *cell = freevars[oparg];
Raymond Hettingerc32f9db2016-11-12 04:10:35 -05002504 PyObject *oldobj = PyCell_GET(cell);
2505 if (oldobj != NULL) {
2506 PyCell_SET(cell, NULL);
2507 Py_DECREF(oldobj);
Benjamin Peterson00ebe2c2010-09-10 22:02:31 +00002508 DISPATCH();
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00002509 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002510 format_exc_unbound(tstate, co, oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002511 goto error;
2512 }
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00002513
Benjamin Petersonddd19492018-09-16 22:38:02 -07002514 case TARGET(LOAD_CLOSURE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002515 PyObject *cell = freevars[oparg];
2516 Py_INCREF(cell);
2517 PUSH(cell);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002518 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002519 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002520
Benjamin Petersonddd19492018-09-16 22:38:02 -07002521 case TARGET(LOAD_CLASSDEREF): {
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002522 PyObject *name, *value, *locals = f->f_locals;
Victor Stinnerd3dfd0e2013-05-16 23:48:01 +02002523 Py_ssize_t idx;
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002524 assert(locals);
2525 assert(oparg >= PyTuple_GET_SIZE(co->co_cellvars));
2526 idx = oparg - PyTuple_GET_SIZE(co->co_cellvars);
2527 assert(idx >= 0 && idx < PyTuple_GET_SIZE(co->co_freevars));
2528 name = PyTuple_GET_ITEM(co->co_freevars, idx);
2529 if (PyDict_CheckExact(locals)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002530 value = PyDict_GetItemWithError(locals, name);
2531 if (value != NULL) {
2532 Py_INCREF(value);
2533 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002534 else if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002535 goto error;
2536 }
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002537 }
2538 else {
2539 value = PyObject_GetItem(locals, name);
Victor Stinnere20310f2015-11-05 13:56:58 +01002540 if (value == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002541 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002542 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02002543 }
2544 _PyErr_Clear(tstate);
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002545 }
2546 }
2547 if (!value) {
2548 PyObject *cell = freevars[oparg];
2549 value = PyCell_GET(cell);
2550 if (value == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002551 format_exc_unbound(tstate, co, oparg);
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002552 goto error;
2553 }
2554 Py_INCREF(value);
2555 }
2556 PUSH(value);
2557 DISPATCH();
2558 }
2559
Benjamin Petersonddd19492018-09-16 22:38:02 -07002560 case TARGET(LOAD_DEREF): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002561 PyObject *cell = freevars[oparg];
2562 PyObject *value = PyCell_GET(cell);
2563 if (value == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002564 format_exc_unbound(tstate, co, oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002565 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002566 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002567 Py_INCREF(value);
2568 PUSH(value);
2569 DISPATCH();
2570 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002571
Benjamin Petersonddd19492018-09-16 22:38:02 -07002572 case TARGET(STORE_DEREF): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002573 PyObject *v = POP();
2574 PyObject *cell = freevars[oparg];
Raymond Hettingerb2b15432016-11-11 04:32:11 -08002575 PyObject *oldobj = PyCell_GET(cell);
2576 PyCell_SET(cell, v);
2577 Py_XDECREF(oldobj);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002578 DISPATCH();
2579 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002580
Benjamin Petersonddd19492018-09-16 22:38:02 -07002581 case TARGET(BUILD_STRING): {
Serhiy Storchakaea525a22016-09-06 22:07:53 +03002582 PyObject *str;
2583 PyObject *empty = PyUnicode_New(0, 0);
2584 if (empty == NULL) {
2585 goto error;
2586 }
2587 str = _PyUnicode_JoinArray(empty, stack_pointer - oparg, oparg);
2588 Py_DECREF(empty);
2589 if (str == NULL)
2590 goto error;
2591 while (--oparg >= 0) {
2592 PyObject *item = POP();
2593 Py_DECREF(item);
2594 }
2595 PUSH(str);
2596 DISPATCH();
2597 }
2598
Benjamin Petersonddd19492018-09-16 22:38:02 -07002599 case TARGET(BUILD_TUPLE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002600 PyObject *tup = PyTuple_New(oparg);
2601 if (tup == NULL)
2602 goto error;
2603 while (--oparg >= 0) {
2604 PyObject *item = POP();
2605 PyTuple_SET_ITEM(tup, oparg, item);
2606 }
2607 PUSH(tup);
2608 DISPATCH();
2609 }
2610
Benjamin Petersonddd19492018-09-16 22:38:02 -07002611 case TARGET(BUILD_LIST): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002612 PyObject *list = PyList_New(oparg);
2613 if (list == NULL)
2614 goto error;
2615 while (--oparg >= 0) {
2616 PyObject *item = POP();
2617 PyList_SET_ITEM(list, oparg, item);
2618 }
2619 PUSH(list);
2620 DISPATCH();
2621 }
2622
Mark Shannon13bc1392020-01-23 09:25:17 +00002623 case TARGET(LIST_TO_TUPLE): {
2624 PyObject *list = POP();
2625 PyObject *tuple = PyList_AsTuple(list);
2626 Py_DECREF(list);
2627 if (tuple == NULL) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002628 goto error;
Mark Shannon13bc1392020-01-23 09:25:17 +00002629 }
2630 PUSH(tuple);
2631 DISPATCH();
2632 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002633
Mark Shannon13bc1392020-01-23 09:25:17 +00002634 case TARGET(LIST_EXTEND): {
2635 PyObject *iterable = POP();
2636 PyObject *list = PEEK(oparg);
2637 PyObject *none_val = _PyList_Extend((PyListObject *)list, iterable);
2638 if (none_val == NULL) {
2639 if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError) &&
Victor Stinnera102ed72020-02-07 02:24:48 +01002640 (Py_TYPE(iterable)->tp_iter == NULL && !PySequence_Check(iterable)))
Mark Shannon13bc1392020-01-23 09:25:17 +00002641 {
Victor Stinner61f4db82020-01-28 03:37:45 +01002642 _PyErr_Clear(tstate);
Mark Shannon13bc1392020-01-23 09:25:17 +00002643 _PyErr_Format(tstate, PyExc_TypeError,
2644 "Value after * must be an iterable, not %.200s",
2645 Py_TYPE(iterable)->tp_name);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002646 }
Mark Shannon13bc1392020-01-23 09:25:17 +00002647 Py_DECREF(iterable);
2648 goto error;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002649 }
Mark Shannon13bc1392020-01-23 09:25:17 +00002650 Py_DECREF(none_val);
2651 Py_DECREF(iterable);
2652 DISPATCH();
2653 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002654
Mark Shannon13bc1392020-01-23 09:25:17 +00002655 case TARGET(SET_UPDATE): {
2656 PyObject *iterable = POP();
2657 PyObject *set = PEEK(oparg);
2658 int err = _PySet_Update(set, iterable);
2659 Py_DECREF(iterable);
2660 if (err < 0) {
2661 goto error;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002662 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002663 DISPATCH();
2664 }
2665
Benjamin Petersonddd19492018-09-16 22:38:02 -07002666 case TARGET(BUILD_SET): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002667 PyObject *set = PySet_New(NULL);
2668 int err = 0;
Raymond Hettinger4c483ad2016-09-08 14:45:40 -07002669 int i;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002670 if (set == NULL)
2671 goto error;
Raymond Hettinger4c483ad2016-09-08 14:45:40 -07002672 for (i = oparg; i > 0; i--) {
2673 PyObject *item = PEEK(i);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002674 if (err == 0)
2675 err = PySet_Add(set, item);
2676 Py_DECREF(item);
2677 }
costypetrisor8ed317f2018-07-31 20:55:14 +00002678 STACK_SHRINK(oparg);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002679 if (err != 0) {
2680 Py_DECREF(set);
2681 goto error;
2682 }
2683 PUSH(set);
2684 DISPATCH();
2685 }
2686
Benjamin Petersonddd19492018-09-16 22:38:02 -07002687 case TARGET(BUILD_MAP): {
Victor Stinner74319ae2016-08-25 00:04:09 +02002688 Py_ssize_t i;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002689 PyObject *map = _PyDict_NewPresized((Py_ssize_t)oparg);
2690 if (map == NULL)
2691 goto error;
Benjamin Petersond5d77aa2015-07-05 10:37:25 -05002692 for (i = oparg; i > 0; i--) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002693 int err;
Benjamin Petersond5d77aa2015-07-05 10:37:25 -05002694 PyObject *key = PEEK(2*i);
2695 PyObject *value = PEEK(2*i - 1);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002696 err = PyDict_SetItem(map, key, value);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002697 if (err != 0) {
2698 Py_DECREF(map);
2699 goto error;
2700 }
2701 }
Benjamin Petersond5d77aa2015-07-05 10:37:25 -05002702
2703 while (oparg--) {
2704 Py_DECREF(POP());
2705 Py_DECREF(POP());
2706 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002707 PUSH(map);
2708 DISPATCH();
2709 }
2710
Benjamin Petersonddd19492018-09-16 22:38:02 -07002711 case TARGET(SETUP_ANNOTATIONS): {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002712 _Py_IDENTIFIER(__annotations__);
2713 int err;
2714 PyObject *ann_dict;
2715 if (f->f_locals == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002716 _PyErr_Format(tstate, PyExc_SystemError,
2717 "no locals found when setting up annotations");
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002718 goto error;
2719 }
2720 /* check if __annotations__ in locals()... */
2721 if (PyDict_CheckExact(f->f_locals)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002722 ann_dict = _PyDict_GetItemIdWithError(f->f_locals,
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002723 &PyId___annotations__);
2724 if (ann_dict == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002725 if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02002726 goto error;
2727 }
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002728 /* ...if not, create a new one */
2729 ann_dict = PyDict_New();
2730 if (ann_dict == NULL) {
2731 goto error;
2732 }
2733 err = _PyDict_SetItemId(f->f_locals,
2734 &PyId___annotations__, ann_dict);
2735 Py_DECREF(ann_dict);
2736 if (err != 0) {
2737 goto error;
2738 }
2739 }
2740 }
2741 else {
2742 /* do the same if locals() is not a dict */
2743 PyObject *ann_str = _PyUnicode_FromId(&PyId___annotations__);
2744 if (ann_str == NULL) {
Serhiy Storchaka4678b2f2016-11-08 23:13:36 +02002745 goto error;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002746 }
2747 ann_dict = PyObject_GetItem(f->f_locals, ann_str);
2748 if (ann_dict == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002749 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002750 goto error;
2751 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002752 _PyErr_Clear(tstate);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002753 ann_dict = PyDict_New();
2754 if (ann_dict == NULL) {
2755 goto error;
2756 }
2757 err = PyObject_SetItem(f->f_locals, ann_str, ann_dict);
2758 Py_DECREF(ann_dict);
2759 if (err != 0) {
2760 goto error;
2761 }
2762 }
2763 else {
2764 Py_DECREF(ann_dict);
2765 }
2766 }
2767 DISPATCH();
2768 }
2769
Benjamin Petersonddd19492018-09-16 22:38:02 -07002770 case TARGET(BUILD_CONST_KEY_MAP): {
Victor Stinner74319ae2016-08-25 00:04:09 +02002771 Py_ssize_t i;
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03002772 PyObject *map;
2773 PyObject *keys = TOP();
2774 if (!PyTuple_CheckExact(keys) ||
2775 PyTuple_GET_SIZE(keys) != (Py_ssize_t)oparg) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002776 _PyErr_SetString(tstate, PyExc_SystemError,
2777 "bad BUILD_CONST_KEY_MAP keys argument");
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03002778 goto error;
2779 }
2780 map = _PyDict_NewPresized((Py_ssize_t)oparg);
2781 if (map == NULL) {
2782 goto error;
2783 }
2784 for (i = oparg; i > 0; i--) {
2785 int err;
2786 PyObject *key = PyTuple_GET_ITEM(keys, oparg - i);
2787 PyObject *value = PEEK(i + 1);
2788 err = PyDict_SetItem(map, key, value);
2789 if (err != 0) {
2790 Py_DECREF(map);
2791 goto error;
2792 }
2793 }
2794
2795 Py_DECREF(POP());
2796 while (oparg--) {
2797 Py_DECREF(POP());
2798 }
2799 PUSH(map);
2800 DISPATCH();
2801 }
2802
Mark Shannon8a4cd702020-01-27 09:57:45 +00002803 case TARGET(DICT_UPDATE): {
2804 PyObject *update = POP();
2805 PyObject *dict = PEEK(oparg);
2806 if (PyDict_Update(dict, update) < 0) {
2807 if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) {
2808 _PyErr_Format(tstate, PyExc_TypeError,
2809 "'%.200s' object is not a mapping",
Victor Stinnera102ed72020-02-07 02:24:48 +01002810 Py_TYPE(update)->tp_name);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002811 }
Mark Shannon8a4cd702020-01-27 09:57:45 +00002812 Py_DECREF(update);
2813 goto error;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002814 }
Mark Shannon8a4cd702020-01-27 09:57:45 +00002815 Py_DECREF(update);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002816 DISPATCH();
2817 }
2818
Mark Shannon8a4cd702020-01-27 09:57:45 +00002819 case TARGET(DICT_MERGE): {
2820 PyObject *update = POP();
2821 PyObject *dict = PEEK(oparg);
2822
2823 if (_PyDict_MergeEx(dict, update, 2) < 0) {
2824 format_kwargs_error(tstate, PEEK(2 + oparg), update);
2825 Py_DECREF(update);
Serhiy Storchakae036ef82016-10-02 11:06:43 +03002826 goto error;
Serhiy Storchakae036ef82016-10-02 11:06:43 +03002827 }
Mark Shannon8a4cd702020-01-27 09:57:45 +00002828 Py_DECREF(update);
Brandt Bucherf185a732019-09-28 17:12:49 -07002829 PREDICT(CALL_FUNCTION_EX);
Serhiy Storchakae036ef82016-10-02 11:06:43 +03002830 DISPATCH();
2831 }
2832
Benjamin Petersonddd19492018-09-16 22:38:02 -07002833 case TARGET(MAP_ADD): {
Jörn Heisslerc8a35412019-06-22 16:40:55 +02002834 PyObject *value = TOP();
2835 PyObject *key = SECOND();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002836 PyObject *map;
2837 int err;
costypetrisor8ed317f2018-07-31 20:55:14 +00002838 STACK_SHRINK(2);
Raymond Hettinger41862222016-10-15 19:03:06 -07002839 map = PEEK(oparg); /* dict */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002840 assert(PyDict_CheckExact(map));
Martin Panter95f53c12016-07-18 08:23:26 +00002841 err = PyDict_SetItem(map, key, value); /* map[key] = value */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002842 Py_DECREF(value);
2843 Py_DECREF(key);
2844 if (err != 0)
2845 goto error;
2846 PREDICT(JUMP_ABSOLUTE);
2847 DISPATCH();
2848 }
2849
Benjamin Petersonddd19492018-09-16 22:38:02 -07002850 case TARGET(LOAD_ATTR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002851 PyObject *name = GETITEM(names, oparg);
2852 PyObject *owner = TOP();
2853 PyObject *res = PyObject_GetAttr(owner, name);
2854 Py_DECREF(owner);
2855 SET_TOP(res);
2856 if (res == NULL)
2857 goto error;
2858 DISPATCH();
2859 }
2860
Benjamin Petersonddd19492018-09-16 22:38:02 -07002861 case TARGET(COMPARE_OP): {
Mark Shannon9af0e472020-01-14 10:12:45 +00002862 assert(oparg <= Py_GE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002863 PyObject *right = POP();
2864 PyObject *left = TOP();
Mark Shannon9af0e472020-01-14 10:12:45 +00002865 PyObject *res = PyObject_RichCompare(left, right, oparg);
2866 SET_TOP(res);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002867 Py_DECREF(left);
2868 Py_DECREF(right);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002869 if (res == NULL)
2870 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002871 PREDICT(POP_JUMP_IF_FALSE);
2872 PREDICT(POP_JUMP_IF_TRUE);
2873 DISPATCH();
Victor Stinner3c1e4812012-03-26 22:10:51 +02002874 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002875
Mark Shannon9af0e472020-01-14 10:12:45 +00002876 case TARGET(IS_OP): {
2877 PyObject *right = POP();
2878 PyObject *left = TOP();
2879 int res = (left == right)^oparg;
2880 PyObject *b = res ? Py_True : Py_False;
2881 Py_INCREF(b);
2882 SET_TOP(b);
2883 Py_DECREF(left);
2884 Py_DECREF(right);
2885 PREDICT(POP_JUMP_IF_FALSE);
2886 PREDICT(POP_JUMP_IF_TRUE);
2887 FAST_DISPATCH();
2888 }
2889
2890 case TARGET(CONTAINS_OP): {
2891 PyObject *right = POP();
2892 PyObject *left = POP();
2893 int res = PySequence_Contains(right, left);
2894 Py_DECREF(left);
2895 Py_DECREF(right);
2896 if (res < 0) {
2897 goto error;
2898 }
2899 PyObject *b = (res^oparg) ? Py_True : Py_False;
2900 Py_INCREF(b);
2901 PUSH(b);
2902 PREDICT(POP_JUMP_IF_FALSE);
2903 PREDICT(POP_JUMP_IF_TRUE);
2904 FAST_DISPATCH();
2905 }
2906
2907#define CANNOT_CATCH_MSG "catching classes that do not inherit from "\
2908 "BaseException is not allowed"
2909
2910 case TARGET(JUMP_IF_NOT_EXC_MATCH): {
2911 PyObject *right = POP();
2912 PyObject *left = POP();
2913 if (PyTuple_Check(right)) {
2914 Py_ssize_t i, length;
2915 length = PyTuple_GET_SIZE(right);
2916 for (i = 0; i < length; i++) {
2917 PyObject *exc = PyTuple_GET_ITEM(right, i);
2918 if (!PyExceptionClass_Check(exc)) {
2919 _PyErr_SetString(tstate, PyExc_TypeError,
2920 CANNOT_CATCH_MSG);
2921 Py_DECREF(left);
2922 Py_DECREF(right);
2923 goto error;
2924 }
2925 }
2926 }
2927 else {
2928 if (!PyExceptionClass_Check(right)) {
2929 _PyErr_SetString(tstate, PyExc_TypeError,
2930 CANNOT_CATCH_MSG);
2931 Py_DECREF(left);
2932 Py_DECREF(right);
2933 goto error;
2934 }
2935 }
2936 int res = PyErr_GivenExceptionMatches(left, right);
2937 Py_DECREF(left);
2938 Py_DECREF(right);
2939 if (res > 0) {
2940 /* Exception matches -- Do nothing */;
2941 }
2942 else if (res == 0) {
2943 JUMPTO(oparg);
2944 }
2945 else {
2946 goto error;
2947 }
2948 DISPATCH();
2949 }
2950
Benjamin Petersonddd19492018-09-16 22:38:02 -07002951 case TARGET(IMPORT_NAME): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002952 PyObject *name = GETITEM(names, oparg);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03002953 PyObject *fromlist = POP();
2954 PyObject *level = TOP();
2955 PyObject *res;
Victor Stinner438a12d2019-05-24 17:01:38 +02002956 res = import_name(tstate, f, name, fromlist, level);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03002957 Py_DECREF(level);
2958 Py_DECREF(fromlist);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002959 SET_TOP(res);
2960 if (res == NULL)
2961 goto error;
2962 DISPATCH();
2963 }
2964
Benjamin Petersonddd19492018-09-16 22:38:02 -07002965 case TARGET(IMPORT_STAR): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002966 PyObject *from = POP(), *locals;
2967 int err;
Matthias Bussonnier160edb42017-02-25 21:58:05 -08002968 if (PyFrame_FastToLocalsWithError(f) < 0) {
2969 Py_DECREF(from);
Victor Stinner41bb43a2013-10-29 01:19:37 +01002970 goto error;
Matthias Bussonnier160edb42017-02-25 21:58:05 -08002971 }
Victor Stinner41bb43a2013-10-29 01:19:37 +01002972
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002973 locals = f->f_locals;
2974 if (locals == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02002975 _PyErr_SetString(tstate, PyExc_SystemError,
2976 "no locals found during 'import *'");
Matthias Bussonnier160edb42017-02-25 21:58:05 -08002977 Py_DECREF(from);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002978 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002979 }
Victor Stinner438a12d2019-05-24 17:01:38 +02002980 err = import_all_from(tstate, locals, from);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002981 PyFrame_LocalsToFast(f, 0);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002982 Py_DECREF(from);
2983 if (err != 0)
2984 goto error;
2985 DISPATCH();
2986 }
Guido van Rossum25831651993-05-19 14:50:45 +00002987
Benjamin Petersonddd19492018-09-16 22:38:02 -07002988 case TARGET(IMPORT_FROM): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002989 PyObject *name = GETITEM(names, oparg);
2990 PyObject *from = TOP();
2991 PyObject *res;
Victor Stinner438a12d2019-05-24 17:01:38 +02002992 res = import_from(tstate, from, name);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04002993 PUSH(res);
2994 if (res == NULL)
2995 goto error;
2996 DISPATCH();
2997 }
Thomas Wouters52152252000-08-17 22:55:00 +00002998
Benjamin Petersonddd19492018-09-16 22:38:02 -07002999 case TARGET(JUMP_FORWARD): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003000 JUMPBY(oparg);
3001 FAST_DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003002 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003003
Benjamin Petersonddd19492018-09-16 22:38:02 -07003004 case TARGET(POP_JUMP_IF_FALSE): {
3005 PREDICTED(POP_JUMP_IF_FALSE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003006 PyObject *cond = POP();
3007 int err;
3008 if (cond == Py_True) {
3009 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003010 FAST_DISPATCH();
3011 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003012 if (cond == Py_False) {
3013 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003014 JUMPTO(oparg);
3015 FAST_DISPATCH();
3016 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003017 err = PyObject_IsTrue(cond);
3018 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003019 if (err > 0)
Adrian Wielgosik50c28502017-06-23 13:35:41 -07003020 ;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003021 else if (err == 0)
3022 JUMPTO(oparg);
3023 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003024 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003025 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003026 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003027
Benjamin Petersonddd19492018-09-16 22:38:02 -07003028 case TARGET(POP_JUMP_IF_TRUE): {
3029 PREDICTED(POP_JUMP_IF_TRUE);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003030 PyObject *cond = POP();
3031 int err;
3032 if (cond == Py_False) {
3033 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003034 FAST_DISPATCH();
3035 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003036 if (cond == Py_True) {
3037 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003038 JUMPTO(oparg);
3039 FAST_DISPATCH();
3040 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003041 err = PyObject_IsTrue(cond);
3042 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003043 if (err > 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003044 JUMPTO(oparg);
3045 }
3046 else if (err == 0)
3047 ;
3048 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003049 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003050 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003051 }
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00003052
Benjamin Petersonddd19492018-09-16 22:38:02 -07003053 case TARGET(JUMP_IF_FALSE_OR_POP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003054 PyObject *cond = TOP();
3055 int err;
3056 if (cond == Py_True) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003057 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003058 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003059 FAST_DISPATCH();
3060 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003061 if (cond == Py_False) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003062 JUMPTO(oparg);
3063 FAST_DISPATCH();
3064 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003065 err = PyObject_IsTrue(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003066 if (err > 0) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003067 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003068 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003069 }
3070 else if (err == 0)
3071 JUMPTO(oparg);
3072 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003073 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003074 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003075 }
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00003076
Benjamin Petersonddd19492018-09-16 22:38:02 -07003077 case TARGET(JUMP_IF_TRUE_OR_POP): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003078 PyObject *cond = TOP();
3079 int err;
3080 if (cond == Py_False) {
costypetrisor8ed317f2018-07-31 20:55:14 +00003081 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003082 Py_DECREF(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003083 FAST_DISPATCH();
3084 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003085 if (cond == Py_True) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003086 JUMPTO(oparg);
3087 FAST_DISPATCH();
3088 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003089 err = PyObject_IsTrue(cond);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003090 if (err > 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003091 JUMPTO(oparg);
3092 }
3093 else if (err == 0) {
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 }
3097 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003098 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003099 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003100 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003101
Benjamin Petersonddd19492018-09-16 22:38:02 -07003102 case TARGET(JUMP_ABSOLUTE): {
3103 PREDICTED(JUMP_ABSOLUTE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003104 JUMPTO(oparg);
Guido van Rossum58da9312007-11-10 23:39:45 +00003105#if FAST_LOOPS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003106 /* Enabling this path speeds-up all while and for-loops by bypassing
3107 the per-loop checks for signals. By default, this should be turned-off
3108 because it prevents detection of a control-break in tight loops like
3109 "while 1: pass". Compile with this option turned-on when you need
3110 the speed-up and do not need break checking inside tight loops (ones
3111 that contain only instructions ending with FAST_DISPATCH).
3112 */
3113 FAST_DISPATCH();
Guido van Rossum58da9312007-11-10 23:39:45 +00003114#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003115 DISPATCH();
Guido van Rossum58da9312007-11-10 23:39:45 +00003116#endif
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003117 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003118
Benjamin Petersonddd19492018-09-16 22:38:02 -07003119 case TARGET(GET_ITER): {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003120 /* before: [obj]; after [getiter(obj)] */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003121 PyObject *iterable = TOP();
Yury Selivanov5376ba92015-06-22 12:19:30 -04003122 PyObject *iter = PyObject_GetIter(iterable);
3123 Py_DECREF(iterable);
3124 SET_TOP(iter);
3125 if (iter == NULL)
3126 goto error;
3127 PREDICT(FOR_ITER);
Serhiy Storchakada9c5132016-06-27 18:58:57 +03003128 PREDICT(CALL_FUNCTION);
Yury Selivanov5376ba92015-06-22 12:19:30 -04003129 DISPATCH();
3130 }
3131
Benjamin Petersonddd19492018-09-16 22:38:02 -07003132 case TARGET(GET_YIELD_FROM_ITER): {
Yury Selivanov5376ba92015-06-22 12:19:30 -04003133 /* before: [obj]; after [getiter(obj)] */
3134 PyObject *iterable = TOP();
Yury Selivanov75445082015-05-11 22:57:16 -04003135 PyObject *iter;
Yury Selivanov5376ba92015-06-22 12:19:30 -04003136 if (PyCoro_CheckExact(iterable)) {
3137 /* `iterable` is a coroutine */
3138 if (!(co->co_flags & (CO_COROUTINE | CO_ITERABLE_COROUTINE))) {
3139 /* and it is used in a 'yield from' expression of a
3140 regular generator. */
3141 Py_DECREF(iterable);
3142 SET_TOP(NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02003143 _PyErr_SetString(tstate, PyExc_TypeError,
3144 "cannot 'yield from' a coroutine object "
3145 "in a non-coroutine generator");
Yury Selivanov5376ba92015-06-22 12:19:30 -04003146 goto error;
3147 }
3148 }
3149 else if (!PyGen_CheckExact(iterable)) {
Yury Selivanov75445082015-05-11 22:57:16 -04003150 /* `iterable` is not a generator. */
3151 iter = PyObject_GetIter(iterable);
3152 Py_DECREF(iterable);
3153 SET_TOP(iter);
3154 if (iter == NULL)
3155 goto error;
3156 }
Serhiy Storchakada9c5132016-06-27 18:58:57 +03003157 PREDICT(LOAD_CONST);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003158 DISPATCH();
3159 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003160
Benjamin Petersonddd19492018-09-16 22:38:02 -07003161 case TARGET(FOR_ITER): {
3162 PREDICTED(FOR_ITER);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003163 /* before: [iter]; after: [iter, iter()] *or* [] */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003164 PyObject *iter = TOP();
Victor Stinnera102ed72020-02-07 02:24:48 +01003165 PyObject *next = (*Py_TYPE(iter)->tp_iternext)(iter);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003166 if (next != NULL) {
3167 PUSH(next);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003168 PREDICT(STORE_FAST);
3169 PREDICT(UNPACK_SEQUENCE);
3170 DISPATCH();
3171 }
Victor Stinner438a12d2019-05-24 17:01:38 +02003172 if (_PyErr_Occurred(tstate)) {
3173 if (!_PyErr_ExceptionMatches(tstate, PyExc_StopIteration)) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003174 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02003175 }
3176 else if (tstate->c_tracefunc != NULL) {
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003177 call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj, tstate, f);
Victor Stinner438a12d2019-05-24 17:01:38 +02003178 }
3179 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003180 }
3181 /* iterator ended normally */
costypetrisor8ed317f2018-07-31 20:55:14 +00003182 STACK_SHRINK(1);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003183 Py_DECREF(iter);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003184 JUMPBY(oparg);
Serhiy Storchakada9c5132016-06-27 18:58:57 +03003185 PREDICT(POP_BLOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003186 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003187 }
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003188
Benjamin Petersonddd19492018-09-16 22:38:02 -07003189 case TARGET(SETUP_FINALLY): {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003190 PyFrame_BlockSetup(f, SETUP_FINALLY, INSTR_OFFSET() + oparg,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003191 STACK_LEVEL());
3192 DISPATCH();
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003193 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003194
Benjamin Petersonddd19492018-09-16 22:38:02 -07003195 case TARGET(BEFORE_ASYNC_WITH): {
Yury Selivanov75445082015-05-11 22:57:16 -04003196 _Py_IDENTIFIER(__aenter__);
Géry Ogam1d1b97a2020-01-14 12:58:29 +01003197 _Py_IDENTIFIER(__aexit__);
Yury Selivanov75445082015-05-11 22:57:16 -04003198 PyObject *mgr = TOP();
Géry Ogam1d1b97a2020-01-14 12:58:29 +01003199 PyObject *enter = special_lookup(tstate, mgr, &PyId___aenter__);
Yury Selivanov75445082015-05-11 22:57:16 -04003200 PyObject *res;
Géry Ogam1d1b97a2020-01-14 12:58:29 +01003201 if (enter == NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04003202 goto error;
Géry Ogam1d1b97a2020-01-14 12:58:29 +01003203 }
3204 PyObject *exit = special_lookup(tstate, mgr, &PyId___aexit__);
3205 if (exit == NULL) {
3206 Py_DECREF(enter);
3207 goto error;
3208 }
Yury Selivanov75445082015-05-11 22:57:16 -04003209 SET_TOP(exit);
Yury Selivanov75445082015-05-11 22:57:16 -04003210 Py_DECREF(mgr);
Victor Stinnerf17c3de2016-12-06 18:46:19 +01003211 res = _PyObject_CallNoArg(enter);
Yury Selivanov75445082015-05-11 22:57:16 -04003212 Py_DECREF(enter);
3213 if (res == NULL)
3214 goto error;
3215 PUSH(res);
Serhiy Storchakada9c5132016-06-27 18:58:57 +03003216 PREDICT(GET_AWAITABLE);
Yury Selivanov75445082015-05-11 22:57:16 -04003217 DISPATCH();
3218 }
3219
Benjamin Petersonddd19492018-09-16 22:38:02 -07003220 case TARGET(SETUP_ASYNC_WITH): {
Yury Selivanov75445082015-05-11 22:57:16 -04003221 PyObject *res = POP();
3222 /* Setup the finally block before pushing the result
3223 of __aenter__ on the stack. */
3224 PyFrame_BlockSetup(f, SETUP_FINALLY, INSTR_OFFSET() + oparg,
3225 STACK_LEVEL());
3226 PUSH(res);
3227 DISPATCH();
3228 }
3229
Benjamin Petersonddd19492018-09-16 22:38:02 -07003230 case TARGET(SETUP_WITH): {
Benjamin Petersonce798522012-01-22 11:24:29 -05003231 _Py_IDENTIFIER(__enter__);
Géry Ogam1d1b97a2020-01-14 12:58:29 +01003232 _Py_IDENTIFIER(__exit__);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003233 PyObject *mgr = TOP();
Victor Stinner438a12d2019-05-24 17:01:38 +02003234 PyObject *enter = special_lookup(tstate, mgr, &PyId___enter__);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003235 PyObject *res;
Victor Stinner438a12d2019-05-24 17:01:38 +02003236 if (enter == NULL) {
Raymond Hettingera3fec152016-11-21 17:24:23 -08003237 goto error;
Victor Stinner438a12d2019-05-24 17:01:38 +02003238 }
3239 PyObject *exit = special_lookup(tstate, mgr, &PyId___exit__);
Raymond Hettinger64e2f9a2016-11-22 11:50:40 -08003240 if (exit == NULL) {
3241 Py_DECREF(enter);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003242 goto error;
Raymond Hettinger64e2f9a2016-11-22 11:50:40 -08003243 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003244 SET_TOP(exit);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003245 Py_DECREF(mgr);
Victor Stinnerf17c3de2016-12-06 18:46:19 +01003246 res = _PyObject_CallNoArg(enter);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003247 Py_DECREF(enter);
3248 if (res == NULL)
3249 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003250 /* Setup the finally block before pushing the result
3251 of __enter__ on the stack. */
3252 PyFrame_BlockSetup(f, SETUP_FINALLY, INSTR_OFFSET() + oparg,
3253 STACK_LEVEL());
Benjamin Peterson876b2f22009-06-28 03:18:59 +00003254
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003255 PUSH(res);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003256 DISPATCH();
3257 }
Benjamin Peterson876b2f22009-06-28 03:18:59 +00003258
Mark Shannonfee55262019-11-21 09:11:43 +00003259 case TARGET(WITH_EXCEPT_START): {
3260 /* At the top of the stack are 7 values:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003261 - (TOP, SECOND, THIRD) = exc_info()
Mark Shannonfee55262019-11-21 09:11:43 +00003262 - (FOURTH, FIFTH, SIXTH) = previous exception for EXCEPT_HANDLER
3263 - SEVENTH: the context.__exit__ bound method
3264 We call SEVENTH(TOP, SECOND, THIRD).
3265 Then we push again the TOP exception and the __exit__
3266 return value.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003267 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003268 PyObject *exit_func;
Victor Stinner842cfff2016-12-01 14:45:31 +01003269 PyObject *exc, *val, *tb, *res;
3270
Victor Stinner842cfff2016-12-01 14:45:31 +01003271 exc = TOP();
Mark Shannonfee55262019-11-21 09:11:43 +00003272 val = SECOND();
3273 tb = THIRD();
3274 assert(exc != Py_None);
3275 assert(!PyLong_Check(exc));
3276 exit_func = PEEK(7);
Jeroen Demeyer469d1a72019-07-03 12:52:21 +02003277 PyObject *stack[4] = {NULL, exc, val, tb};
Petr Viktorinffd97532020-02-11 17:46:57 +01003278 res = PyObject_Vectorcall(exit_func, stack + 1,
Jeroen Demeyer469d1a72019-07-03 12:52:21 +02003279 3 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003280 if (res == NULL)
3281 goto error;
Amaury Forgeot d'Arc10b24e82008-12-10 23:49:33 +00003282
Yury Selivanov75445082015-05-11 22:57:16 -04003283 PUSH(res);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003284 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003285 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00003286
Benjamin Petersonddd19492018-09-16 22:38:02 -07003287 case TARGET(LOAD_METHOD): {
Andreyb021ba52019-04-29 14:33:26 +10003288 /* Designed to work in tandem with CALL_METHOD. */
Yury Selivanovf2392132016-12-13 19:03:51 -05003289 PyObject *name = GETITEM(names, oparg);
3290 PyObject *obj = TOP();
3291 PyObject *meth = NULL;
3292
3293 int meth_found = _PyObject_GetMethod(obj, name, &meth);
3294
Yury Selivanovf2392132016-12-13 19:03:51 -05003295 if (meth == NULL) {
3296 /* Most likely attribute wasn't found. */
Yury Selivanovf2392132016-12-13 19:03:51 -05003297 goto error;
3298 }
3299
3300 if (meth_found) {
INADA Naoki015bce62017-01-16 17:23:30 +09003301 /* We can bypass temporary bound method object.
3302 meth is unbound method and obj is self.
Victor Stinnera8cb5152017-01-18 14:12:51 +01003303
INADA Naoki015bce62017-01-16 17:23:30 +09003304 meth | self | arg1 | ... | argN
3305 */
3306 SET_TOP(meth);
3307 PUSH(obj); // self
Yury Selivanovf2392132016-12-13 19:03:51 -05003308 }
3309 else {
INADA Naoki015bce62017-01-16 17:23:30 +09003310 /* meth is not an unbound method (but a regular attr, or
3311 something was returned by a descriptor protocol). Set
3312 the second element of the stack to NULL, to signal
Yury Selivanovf2392132016-12-13 19:03:51 -05003313 CALL_METHOD that it's not a method call.
INADA Naoki015bce62017-01-16 17:23:30 +09003314
3315 NULL | meth | arg1 | ... | argN
Yury Selivanovf2392132016-12-13 19:03:51 -05003316 */
INADA Naoki015bce62017-01-16 17:23:30 +09003317 SET_TOP(NULL);
Yury Selivanovf2392132016-12-13 19:03:51 -05003318 Py_DECREF(obj);
INADA Naoki015bce62017-01-16 17:23:30 +09003319 PUSH(meth);
Yury Selivanovf2392132016-12-13 19:03:51 -05003320 }
3321 DISPATCH();
3322 }
3323
Benjamin Petersonddd19492018-09-16 22:38:02 -07003324 case TARGET(CALL_METHOD): {
Yury Selivanovf2392132016-12-13 19:03:51 -05003325 /* Designed to work in tamdem with LOAD_METHOD. */
INADA Naoki015bce62017-01-16 17:23:30 +09003326 PyObject **sp, *res, *meth;
Yury Selivanovf2392132016-12-13 19:03:51 -05003327
3328 sp = stack_pointer;
3329
INADA Naoki015bce62017-01-16 17:23:30 +09003330 meth = PEEK(oparg + 2);
3331 if (meth == NULL) {
3332 /* `meth` is NULL when LOAD_METHOD thinks that it's not
3333 a method call.
Yury Selivanovf2392132016-12-13 19:03:51 -05003334
3335 Stack layout:
3336
INADA Naoki015bce62017-01-16 17:23:30 +09003337 ... | NULL | callable | arg1 | ... | argN
3338 ^- TOP()
3339 ^- (-oparg)
3340 ^- (-oparg-1)
3341 ^- (-oparg-2)
Yury Selivanovf2392132016-12-13 19:03:51 -05003342
Ville Skyttä49b27342017-08-03 09:00:59 +03003343 `callable` will be POPed by call_function.
INADA Naoki015bce62017-01-16 17:23:30 +09003344 NULL will will be POPed manually later.
Yury Selivanovf2392132016-12-13 19:03:51 -05003345 */
Victor Stinner09532fe2019-05-10 23:39:09 +02003346 res = call_function(tstate, &sp, oparg, NULL);
Yury Selivanovf2392132016-12-13 19:03:51 -05003347 stack_pointer = sp;
INADA Naoki015bce62017-01-16 17:23:30 +09003348 (void)POP(); /* POP the NULL. */
Yury Selivanovf2392132016-12-13 19:03:51 -05003349 }
3350 else {
3351 /* This is a method call. Stack layout:
3352
INADA Naoki015bce62017-01-16 17:23:30 +09003353 ... | method | self | arg1 | ... | argN
Yury Selivanovf2392132016-12-13 19:03:51 -05003354 ^- TOP()
3355 ^- (-oparg)
INADA Naoki015bce62017-01-16 17:23:30 +09003356 ^- (-oparg-1)
3357 ^- (-oparg-2)
Yury Selivanovf2392132016-12-13 19:03:51 -05003358
INADA Naoki015bce62017-01-16 17:23:30 +09003359 `self` and `method` will be POPed by call_function.
Yury Selivanovf2392132016-12-13 19:03:51 -05003360 We'll be passing `oparg + 1` to call_function, to
INADA Naoki015bce62017-01-16 17:23:30 +09003361 make it accept the `self` as a first argument.
Yury Selivanovf2392132016-12-13 19:03:51 -05003362 */
Victor Stinner09532fe2019-05-10 23:39:09 +02003363 res = call_function(tstate, &sp, oparg + 1, NULL);
Yury Selivanovf2392132016-12-13 19:03:51 -05003364 stack_pointer = sp;
3365 }
3366
3367 PUSH(res);
3368 if (res == NULL)
3369 goto error;
3370 DISPATCH();
3371 }
3372
Benjamin Petersonddd19492018-09-16 22:38:02 -07003373 case TARGET(CALL_FUNCTION): {
3374 PREDICTED(CALL_FUNCTION);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003375 PyObject **sp, *res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003376 sp = stack_pointer;
Victor Stinner09532fe2019-05-10 23:39:09 +02003377 res = call_function(tstate, &sp, oparg, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003378 stack_pointer = sp;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003379 PUSH(res);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003380 if (res == NULL) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003381 goto error;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003382 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003383 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003384 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003385
Benjamin Petersonddd19492018-09-16 22:38:02 -07003386 case TARGET(CALL_FUNCTION_KW): {
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003387 PyObject **sp, *res, *names;
3388
3389 names = POP();
Jeroen Demeyer05677862019-08-16 12:41:27 +02003390 assert(PyTuple_Check(names));
3391 assert(PyTuple_GET_SIZE(names) <= oparg);
3392 /* We assume without checking that names contains only strings */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003393 sp = stack_pointer;
Victor Stinner09532fe2019-05-10 23:39:09 +02003394 res = call_function(tstate, &sp, oparg, names);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003395 stack_pointer = sp;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003396 PUSH(res);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003397 Py_DECREF(names);
3398
3399 if (res == NULL) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003400 goto error;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003401 }
3402 DISPATCH();
3403 }
3404
Benjamin Petersonddd19492018-09-16 22:38:02 -07003405 case TARGET(CALL_FUNCTION_EX): {
Brandt Bucherf185a732019-09-28 17:12:49 -07003406 PREDICTED(CALL_FUNCTION_EX);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003407 PyObject *func, *callargs, *kwargs = NULL, *result;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003408 if (oparg & 0x01) {
3409 kwargs = POP();
Serhiy Storchakab7281052016-09-12 00:52:40 +03003410 if (!PyDict_CheckExact(kwargs)) {
3411 PyObject *d = PyDict_New();
3412 if (d == NULL)
3413 goto error;
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02003414 if (_PyDict_MergeEx(d, kwargs, 2) < 0) {
Serhiy Storchakab7281052016-09-12 00:52:40 +03003415 Py_DECREF(d);
Victor Stinner438a12d2019-05-24 17:01:38 +02003416 format_kwargs_error(tstate, SECOND(), kwargs);
Victor Stinnereece2222016-09-12 11:16:37 +02003417 Py_DECREF(kwargs);
Serhiy Storchakab7281052016-09-12 00:52:40 +03003418 goto error;
3419 }
3420 Py_DECREF(kwargs);
3421 kwargs = d;
3422 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003423 assert(PyDict_CheckExact(kwargs));
3424 }
3425 callargs = POP();
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003426 func = TOP();
Serhiy Storchaka63dc5482016-09-22 19:41:20 +03003427 if (!PyTuple_CheckExact(callargs)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003428 if (check_args_iterable(tstate, func, callargs) < 0) {
Victor Stinnereece2222016-09-12 11:16:37 +02003429 Py_DECREF(callargs);
Serhiy Storchakab7281052016-09-12 00:52:40 +03003430 goto error;
3431 }
3432 Py_SETREF(callargs, PySequence_Tuple(callargs));
3433 if (callargs == NULL) {
3434 goto error;
3435 }
3436 }
Serhiy Storchaka63dc5482016-09-22 19:41:20 +03003437 assert(PyTuple_CheckExact(callargs));
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003438
Victor Stinner09532fe2019-05-10 23:39:09 +02003439 result = do_call_core(tstate, func, callargs, kwargs);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003440 Py_DECREF(func);
3441 Py_DECREF(callargs);
3442 Py_XDECREF(kwargs);
3443
3444 SET_TOP(result);
3445 if (result == NULL) {
3446 goto error;
3447 }
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003448 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003449 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003450
Benjamin Petersonddd19492018-09-16 22:38:02 -07003451 case TARGET(MAKE_FUNCTION): {
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003452 PyObject *qualname = POP();
3453 PyObject *codeobj = POP();
3454 PyFunctionObject *func = (PyFunctionObject *)
3455 PyFunction_NewWithQualName(codeobj, f->f_globals, qualname);
Guido van Rossum4f72a782006-10-27 23:31:49 +00003456
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003457 Py_DECREF(codeobj);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003458 Py_DECREF(qualname);
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003459 if (func == NULL) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003460 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003461 }
Neal Norwitzc1505362006-12-28 06:47:50 +00003462
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003463 if (oparg & 0x08) {
3464 assert(PyTuple_CheckExact(TOP()));
3465 func ->func_closure = POP();
3466 }
3467 if (oparg & 0x04) {
3468 assert(PyDict_CheckExact(TOP()));
3469 func->func_annotations = POP();
3470 }
3471 if (oparg & 0x02) {
3472 assert(PyDict_CheckExact(TOP()));
3473 func->func_kwdefaults = POP();
3474 }
3475 if (oparg & 0x01) {
3476 assert(PyTuple_CheckExact(TOP()));
3477 func->func_defaults = POP();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003478 }
Neal Norwitzc1505362006-12-28 06:47:50 +00003479
Serhiy Storchaka64204de2016-06-12 17:36:24 +03003480 PUSH((PyObject *)func);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003481 DISPATCH();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003482 }
Guido van Rossum8861b741996-07-30 16:49:37 +00003483
Benjamin Petersonddd19492018-09-16 22:38:02 -07003484 case TARGET(BUILD_SLICE): {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003485 PyObject *start, *stop, *step, *slice;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003486 if (oparg == 3)
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003487 step = POP();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003488 else
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003489 step = NULL;
3490 stop = POP();
3491 start = TOP();
3492 slice = PySlice_New(start, stop, step);
3493 Py_DECREF(start);
3494 Py_DECREF(stop);
3495 Py_XDECREF(step);
3496 SET_TOP(slice);
3497 if (slice == NULL)
3498 goto error;
3499 DISPATCH();
3500 }
Guido van Rossum8861b741996-07-30 16:49:37 +00003501
Benjamin Petersonddd19492018-09-16 22:38:02 -07003502 case TARGET(FORMAT_VALUE): {
Eric V. Smitha78c7952015-11-03 12:45:05 -05003503 /* Handles f-string value formatting. */
3504 PyObject *result;
3505 PyObject *fmt_spec;
3506 PyObject *value;
3507 PyObject *(*conv_fn)(PyObject *);
3508 int which_conversion = oparg & FVC_MASK;
3509 int have_fmt_spec = (oparg & FVS_MASK) == FVS_HAVE_SPEC;
3510
3511 fmt_spec = have_fmt_spec ? POP() : NULL;
Eric V. Smith135d5f42016-02-05 18:23:08 -05003512 value = POP();
Eric V. Smitha78c7952015-11-03 12:45:05 -05003513
3514 /* See if any conversion is specified. */
3515 switch (which_conversion) {
Eric V. Smith9a4135e2019-05-08 16:28:48 -04003516 case FVC_NONE: conv_fn = NULL; break;
Eric V. Smitha78c7952015-11-03 12:45:05 -05003517 case FVC_STR: conv_fn = PyObject_Str; break;
3518 case FVC_REPR: conv_fn = PyObject_Repr; break;
3519 case FVC_ASCII: conv_fn = PyObject_ASCII; break;
Eric V. Smith9a4135e2019-05-08 16:28:48 -04003520 default:
Victor Stinner438a12d2019-05-24 17:01:38 +02003521 _PyErr_Format(tstate, PyExc_SystemError,
3522 "unexpected conversion flag %d",
3523 which_conversion);
Eric V. Smith9a4135e2019-05-08 16:28:48 -04003524 goto error;
Eric V. Smitha78c7952015-11-03 12:45:05 -05003525 }
3526
3527 /* If there's a conversion function, call it and replace
3528 value with that result. Otherwise, just use value,
3529 without conversion. */
Eric V. Smitheb588a12016-02-05 18:26:20 -05003530 if (conv_fn != NULL) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05003531 result = conv_fn(value);
3532 Py_DECREF(value);
Eric V. Smitheb588a12016-02-05 18:26:20 -05003533 if (result == NULL) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05003534 Py_XDECREF(fmt_spec);
3535 goto error;
3536 }
3537 value = result;
3538 }
3539
3540 /* If value is a unicode object, and there's no fmt_spec,
3541 then we know the result of format(value) is value
3542 itself. In that case, skip calling format(). I plan to
3543 move this optimization in to PyObject_Format()
3544 itself. */
3545 if (PyUnicode_CheckExact(value) && fmt_spec == NULL) {
3546 /* Do nothing, just transfer ownership to result. */
3547 result = value;
3548 } else {
3549 /* Actually call format(). */
3550 result = PyObject_Format(value, fmt_spec);
3551 Py_DECREF(value);
3552 Py_XDECREF(fmt_spec);
Eric V. Smitheb588a12016-02-05 18:26:20 -05003553 if (result == NULL) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05003554 goto error;
Eric V. Smitheb588a12016-02-05 18:26:20 -05003555 }
Eric V. Smitha78c7952015-11-03 12:45:05 -05003556 }
3557
Eric V. Smith135d5f42016-02-05 18:23:08 -05003558 PUSH(result);
Eric V. Smitha78c7952015-11-03 12:45:05 -05003559 DISPATCH();
3560 }
3561
Benjamin Petersonddd19492018-09-16 22:38:02 -07003562 case TARGET(EXTENDED_ARG): {
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03003563 int oldoparg = oparg;
3564 NEXTOPARG();
3565 oparg |= oldoparg << 8;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003566 goto dispatch_opcode;
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003567 }
Guido van Rossum8861b741996-07-30 16:49:37 +00003568
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003569
Antoine Pitrou042b1282010-08-13 21:15:58 +00003570#if USE_COMPUTED_GOTOS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003571 _unknown_opcode:
Antoine Pitroub52ec782009-01-25 16:34:23 +00003572#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003573 default:
3574 fprintf(stderr,
3575 "XXX lineno: %d, opcode: %d\n",
3576 PyFrame_GetLineNumber(f),
3577 opcode);
Victor Stinner438a12d2019-05-24 17:01:38 +02003578 _PyErr_SetString(tstate, PyExc_SystemError, "unknown opcode");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003579 goto error;
Guido van Rossum04691fc1992-08-12 15:35:34 +00003580
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003581 } /* switch */
Guido van Rossum374a9221991-04-04 10:40:29 +00003582
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003583 /* This should never be reached. Every opcode should end with DISPATCH()
3584 or goto error. */
Barry Warsawb2e57942017-09-14 18:13:16 -07003585 Py_UNREACHABLE();
Guido van Rossumac7be682001-01-17 15:42:30 +00003586
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003587error:
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003588 /* Double-check exception status. */
Victor Stinner365b6932013-07-12 00:11:58 +02003589#ifdef NDEBUG
Victor Stinner438a12d2019-05-24 17:01:38 +02003590 if (!_PyErr_Occurred(tstate)) {
3591 _PyErr_SetString(tstate, PyExc_SystemError,
3592 "error return without exception set");
3593 }
Victor Stinner365b6932013-07-12 00:11:58 +02003594#else
Victor Stinner438a12d2019-05-24 17:01:38 +02003595 assert(_PyErr_Occurred(tstate));
Victor Stinner365b6932013-07-12 00:11:58 +02003596#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00003597
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003598 /* Log traceback info. */
3599 PyTraceBack_Here(f);
Guido van Rossumac7be682001-01-17 15:42:30 +00003600
Benjamin Peterson51f46162013-01-23 08:38:47 -05003601 if (tstate->c_tracefunc != NULL)
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003602 call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj,
3603 tstate, f);
Guido van Rossumac7be682001-01-17 15:42:30 +00003604
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003605exception_unwind:
3606 /* Unwind stacks if an exception occurred */
3607 while (f->f_iblock > 0) {
3608 /* Pop the current block. */
3609 PyTryBlock *b = &f->f_blockstack[--f->f_iblock];
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003610
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003611 if (b->b_type == EXCEPT_HANDLER) {
3612 UNWIND_EXCEPT_HANDLER(b);
3613 continue;
3614 }
3615 UNWIND_BLOCK(b);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003616 if (b->b_type == SETUP_FINALLY) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003617 PyObject *exc, *val, *tb;
3618 int handler = b->b_handler;
Mark Shannonae3087c2017-10-22 22:41:51 +01003619 _PyErr_StackItem *exc_info = tstate->exc_info;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003620 /* Beware, this invalidates all b->b_* fields */
3621 PyFrame_BlockSetup(f, EXCEPT_HANDLER, -1, STACK_LEVEL());
Mark Shannonae3087c2017-10-22 22:41:51 +01003622 PUSH(exc_info->exc_traceback);
3623 PUSH(exc_info->exc_value);
3624 if (exc_info->exc_type != NULL) {
3625 PUSH(exc_info->exc_type);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003626 }
3627 else {
3628 Py_INCREF(Py_None);
3629 PUSH(Py_None);
3630 }
Victor Stinner438a12d2019-05-24 17:01:38 +02003631 _PyErr_Fetch(tstate, &exc, &val, &tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003632 /* Make the raw exception data
3633 available to the handler,
3634 so a program can emulate the
3635 Python main loop. */
Victor Stinner438a12d2019-05-24 17:01:38 +02003636 _PyErr_NormalizeException(tstate, &exc, &val, &tb);
Victor Stinner7eab0d02013-07-15 21:16:27 +02003637 if (tb != NULL)
3638 PyException_SetTraceback(val, tb);
3639 else
3640 PyException_SetTraceback(val, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003641 Py_INCREF(exc);
Mark Shannonae3087c2017-10-22 22:41:51 +01003642 exc_info->exc_type = exc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003643 Py_INCREF(val);
Mark Shannonae3087c2017-10-22 22:41:51 +01003644 exc_info->exc_value = val;
3645 exc_info->exc_traceback = tb;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003646 if (tb == NULL)
3647 tb = Py_None;
3648 Py_INCREF(tb);
3649 PUSH(tb);
3650 PUSH(val);
3651 PUSH(exc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003652 JUMPTO(handler);
Pablo Galindo4c53e632020-01-10 09:24:22 +00003653 if (_Py_TracingPossible(ceval)) {
3654 int needs_new_execution_window = (f->f_lasti < instr_lb || f->f_lasti >= instr_ub);
3655 int needs_line_update = (f->f_lasti == instr_lb || f->f_lasti < instr_prev);
3656 /* Make sure that we trace line after exception if we are in a new execution
3657 * window or we don't need a line update and we are not in the first instruction
3658 * of the line. */
3659 if (needs_new_execution_window || (!needs_line_update && instr_lb > 0)) {
3660 instr_prev = INT_MAX;
3661 }
Mark Shannonfee55262019-11-21 09:11:43 +00003662 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003663 /* Resume normal execution */
3664 goto main_loop;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003665 }
3666 } /* unwind stack */
Guido van Rossum374a9221991-04-04 10:40:29 +00003667
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003668 /* End the loop as we still have an error */
3669 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003670 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00003671
Pablo Galindof00828a2019-05-09 16:52:02 +01003672 assert(retval == NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02003673 assert(_PyErr_Occurred(tstate));
Pablo Galindof00828a2019-05-09 16:52:02 +01003674
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003675 /* Pop remaining stack entries. */
3676 while (!EMPTY()) {
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04003677 PyObject *o = POP();
3678 Py_XDECREF(o);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003679 }
Guido van Rossum35974fb2001-12-06 21:28:18 +00003680
Mark Shannone7c9f4a2020-01-13 12:51:26 +00003681exiting:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003682 if (tstate->use_tracing) {
Benjamin Peterson51f46162013-01-23 08:38:47 -05003683 if (tstate->c_tracefunc) {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003684 if (call_trace_protected(tstate->c_tracefunc, tstate->c_traceobj,
3685 tstate, f, PyTrace_RETURN, retval)) {
3686 Py_CLEAR(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003687 }
3688 }
3689 if (tstate->c_profilefunc) {
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003690 if (call_trace_protected(tstate->c_profilefunc, tstate->c_profileobj,
3691 tstate, f, PyTrace_RETURN, retval)) {
Serhiy Storchaka505ff752014-02-09 13:33:53 +02003692 Py_CLEAR(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003693 }
3694 }
3695 }
Guido van Rossuma4240131997-01-21 21:18:36 +00003696
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003697 /* pop frame */
Thomas Woutersce272b62007-09-19 21:19:28 +00003698exit_eval_frame:
Łukasz Langaa785c872016-09-09 17:37:37 -07003699 if (PyDTrace_FUNCTION_RETURN_ENABLED())
3700 dtrace_function_return(f);
Victor Stinnerbe434dc2019-11-05 00:51:22 +01003701 _Py_LeaveRecursiveCall(tstate);
Antoine Pitrou58720d62013-08-05 23:26:40 +02003702 f->f_executing = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003703 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00003704
Victor Stinner17269092019-11-05 01:22:12 +01003705 return _Py_CheckFunctionResult(tstate, NULL, retval, "PyEval_EvalFrameEx");
Guido van Rossum374a9221991-04-04 10:40:29 +00003706}
3707
Benjamin Petersonb204a422011-06-05 22:04:07 -05003708static void
Victor Stinner438a12d2019-05-24 17:01:38 +02003709format_missing(PyThreadState *tstate, const char *kind,
3710 PyCodeObject *co, PyObject *names)
Benjamin Petersone109c702011-06-24 09:37:26 -05003711{
3712 int err;
3713 Py_ssize_t len = PyList_GET_SIZE(names);
3714 PyObject *name_str, *comma, *tail, *tmp;
3715
3716 assert(PyList_CheckExact(names));
3717 assert(len >= 1);
3718 /* Deal with the joys of natural language. */
3719 switch (len) {
3720 case 1:
3721 name_str = PyList_GET_ITEM(names, 0);
3722 Py_INCREF(name_str);
3723 break;
3724 case 2:
3725 name_str = PyUnicode_FromFormat("%U and %U",
3726 PyList_GET_ITEM(names, len - 2),
3727 PyList_GET_ITEM(names, len - 1));
3728 break;
3729 default:
3730 tail = PyUnicode_FromFormat(", %U, and %U",
3731 PyList_GET_ITEM(names, len - 2),
3732 PyList_GET_ITEM(names, len - 1));
Benjamin Petersond1ab6082012-06-01 11:18:22 -07003733 if (tail == NULL)
3734 return;
Benjamin Petersone109c702011-06-24 09:37:26 -05003735 /* Chop off the last two objects in the list. This shouldn't actually
3736 fail, but we can't be too careful. */
3737 err = PyList_SetSlice(names, len - 2, len, NULL);
3738 if (err == -1) {
3739 Py_DECREF(tail);
3740 return;
3741 }
3742 /* Stitch everything up into a nice comma-separated list. */
3743 comma = PyUnicode_FromString(", ");
3744 if (comma == NULL) {
3745 Py_DECREF(tail);
3746 return;
3747 }
3748 tmp = PyUnicode_Join(comma, names);
3749 Py_DECREF(comma);
3750 if (tmp == NULL) {
3751 Py_DECREF(tail);
3752 return;
3753 }
3754 name_str = PyUnicode_Concat(tmp, tail);
3755 Py_DECREF(tmp);
3756 Py_DECREF(tail);
3757 break;
3758 }
3759 if (name_str == NULL)
3760 return;
Victor Stinner438a12d2019-05-24 17:01:38 +02003761 _PyErr_Format(tstate, PyExc_TypeError,
3762 "%U() missing %i required %s argument%s: %U",
3763 co->co_name,
3764 len,
3765 kind,
3766 len == 1 ? "" : "s",
3767 name_str);
Benjamin Petersone109c702011-06-24 09:37:26 -05003768 Py_DECREF(name_str);
3769}
3770
3771static void
Victor Stinner438a12d2019-05-24 17:01:38 +02003772missing_arguments(PyThreadState *tstate, PyCodeObject *co,
3773 Py_ssize_t missing, Py_ssize_t defcount,
Benjamin Petersone109c702011-06-24 09:37:26 -05003774 PyObject **fastlocals)
3775{
Victor Stinner74319ae2016-08-25 00:04:09 +02003776 Py_ssize_t i, j = 0;
3777 Py_ssize_t start, end;
3778 int positional = (defcount != -1);
Benjamin Petersone109c702011-06-24 09:37:26 -05003779 const char *kind = positional ? "positional" : "keyword-only";
3780 PyObject *missing_names;
3781
3782 /* Compute the names of the arguments that are missing. */
3783 missing_names = PyList_New(missing);
3784 if (missing_names == NULL)
3785 return;
3786 if (positional) {
3787 start = 0;
Pablo Galindocd74e662019-06-01 18:08:04 +01003788 end = co->co_argcount - defcount;
Benjamin Petersone109c702011-06-24 09:37:26 -05003789 }
3790 else {
Pablo Galindocd74e662019-06-01 18:08:04 +01003791 start = co->co_argcount;
Benjamin Petersone109c702011-06-24 09:37:26 -05003792 end = start + co->co_kwonlyargcount;
3793 }
3794 for (i = start; i < end; i++) {
3795 if (GETLOCAL(i) == NULL) {
3796 PyObject *raw = PyTuple_GET_ITEM(co->co_varnames, i);
3797 PyObject *name = PyObject_Repr(raw);
3798 if (name == NULL) {
3799 Py_DECREF(missing_names);
3800 return;
3801 }
3802 PyList_SET_ITEM(missing_names, j++, name);
3803 }
3804 }
3805 assert(j == missing);
Victor Stinner438a12d2019-05-24 17:01:38 +02003806 format_missing(tstate, kind, co, missing_names);
Benjamin Petersone109c702011-06-24 09:37:26 -05003807 Py_DECREF(missing_names);
3808}
3809
3810static void
Victor Stinner438a12d2019-05-24 17:01:38 +02003811too_many_positional(PyThreadState *tstate, PyCodeObject *co,
3812 Py_ssize_t given, Py_ssize_t defcount,
Victor Stinner74319ae2016-08-25 00:04:09 +02003813 PyObject **fastlocals)
Benjamin Petersonb204a422011-06-05 22:04:07 -05003814{
3815 int plural;
Victor Stinner74319ae2016-08-25 00:04:09 +02003816 Py_ssize_t kwonly_given = 0;
3817 Py_ssize_t i;
Benjamin Petersonb204a422011-06-05 22:04:07 -05003818 PyObject *sig, *kwonly_sig;
Victor Stinner74319ae2016-08-25 00:04:09 +02003819 Py_ssize_t co_argcount = co->co_argcount;
Benjamin Petersonb204a422011-06-05 22:04:07 -05003820
Benjamin Petersone109c702011-06-24 09:37:26 -05003821 assert((co->co_flags & CO_VARARGS) == 0);
3822 /* Count missing keyword-only args. */
Pablo Galindocd74e662019-06-01 18:08:04 +01003823 for (i = co_argcount; i < co_argcount + co->co_kwonlyargcount; i++) {
Victor Stinner74319ae2016-08-25 00:04:09 +02003824 if (GETLOCAL(i) != NULL) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05003825 kwonly_given++;
Victor Stinner74319ae2016-08-25 00:04:09 +02003826 }
3827 }
Benjamin Petersone109c702011-06-24 09:37:26 -05003828 if (defcount) {
Pablo Galindocd74e662019-06-01 18:08:04 +01003829 Py_ssize_t atleast = co_argcount - defcount;
Benjamin Petersonb204a422011-06-05 22:04:07 -05003830 plural = 1;
Pablo Galindocd74e662019-06-01 18:08:04 +01003831 sig = PyUnicode_FromFormat("from %zd to %zd", atleast, co_argcount);
Benjamin Petersonb204a422011-06-05 22:04:07 -05003832 }
3833 else {
Pablo Galindocd74e662019-06-01 18:08:04 +01003834 plural = (co_argcount != 1);
3835 sig = PyUnicode_FromFormat("%zd", co_argcount);
Benjamin Petersonb204a422011-06-05 22:04:07 -05003836 }
3837 if (sig == NULL)
3838 return;
3839 if (kwonly_given) {
Victor Stinner74319ae2016-08-25 00:04:09 +02003840 const char *format = " positional argument%s (and %zd keyword-only argument%s)";
3841 kwonly_sig = PyUnicode_FromFormat(format,
3842 given != 1 ? "s" : "",
3843 kwonly_given,
3844 kwonly_given != 1 ? "s" : "");
Benjamin Petersonb204a422011-06-05 22:04:07 -05003845 if (kwonly_sig == NULL) {
3846 Py_DECREF(sig);
3847 return;
3848 }
3849 }
3850 else {
3851 /* This will not fail. */
3852 kwonly_sig = PyUnicode_FromString("");
Benjamin Petersone109c702011-06-24 09:37:26 -05003853 assert(kwonly_sig != NULL);
Benjamin Petersonb204a422011-06-05 22:04:07 -05003854 }
Victor Stinner438a12d2019-05-24 17:01:38 +02003855 _PyErr_Format(tstate, PyExc_TypeError,
3856 "%U() takes %U positional argument%s but %zd%U %s given",
3857 co->co_name,
3858 sig,
3859 plural ? "s" : "",
3860 given,
3861 kwonly_sig,
3862 given == 1 && !kwonly_given ? "was" : "were");
Benjamin Petersonb204a422011-06-05 22:04:07 -05003863 Py_DECREF(sig);
3864 Py_DECREF(kwonly_sig);
3865}
3866
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01003867static int
Victor Stinner438a12d2019-05-24 17:01:38 +02003868positional_only_passed_as_keyword(PyThreadState *tstate, PyCodeObject *co,
3869 Py_ssize_t kwcount, PyObject* const* kwnames)
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01003870{
3871 int posonly_conflicts = 0;
3872 PyObject* posonly_names = PyList_New(0);
3873
3874 for(int k=0; k < co->co_posonlyargcount; k++){
3875 PyObject* posonly_name = PyTuple_GET_ITEM(co->co_varnames, k);
3876
3877 for (int k2=0; k2<kwcount; k2++){
3878 /* Compare the pointers first and fallback to PyObject_RichCompareBool*/
3879 PyObject* kwname = kwnames[k2];
3880 if (kwname == posonly_name){
3881 if(PyList_Append(posonly_names, kwname) != 0) {
3882 goto fail;
3883 }
3884 posonly_conflicts++;
3885 continue;
3886 }
3887
3888 int cmp = PyObject_RichCompareBool(posonly_name, kwname, Py_EQ);
3889
3890 if ( cmp > 0) {
3891 if(PyList_Append(posonly_names, kwname) != 0) {
3892 goto fail;
3893 }
3894 posonly_conflicts++;
3895 } else if (cmp < 0) {
3896 goto fail;
3897 }
3898
3899 }
3900 }
3901 if (posonly_conflicts) {
3902 PyObject* comma = PyUnicode_FromString(", ");
3903 if (comma == NULL) {
3904 goto fail;
3905 }
3906 PyObject* error_names = PyUnicode_Join(comma, posonly_names);
3907 Py_DECREF(comma);
3908 if (error_names == NULL) {
3909 goto fail;
3910 }
Victor Stinner438a12d2019-05-24 17:01:38 +02003911 _PyErr_Format(tstate, PyExc_TypeError,
3912 "%U() got some positional-only arguments passed"
3913 " as keyword arguments: '%U'",
3914 co->co_name, error_names);
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01003915 Py_DECREF(error_names);
3916 goto fail;
3917 }
3918
3919 Py_DECREF(posonly_names);
3920 return 0;
3921
3922fail:
3923 Py_XDECREF(posonly_names);
3924 return 1;
3925
3926}
3927
Guido van Rossumc2e20742006-02-27 22:32:47 +00003928/* This is gonna seem *real weird*, but if you put some other code between
Marcel Plch3a9ccee2018-04-06 23:22:04 +02003929 PyEval_EvalFrame() and _PyEval_EvalFrameDefault() you will need to adjust
Guido van Rossumc2e20742006-02-27 22:32:47 +00003930 the test in the if statements in Misc/gdbinit (pystack and pystackv). */
Skip Montanaro786ea6b2004-03-01 15:44:05 +00003931
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01003932PyObject *
Victor Stinnerb5e170f2019-11-16 01:03:22 +01003933_PyEval_EvalCode(PyThreadState *tstate,
3934 PyObject *_co, PyObject *globals, PyObject *locals,
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02003935 PyObject *const *args, Py_ssize_t argcount,
3936 PyObject *const *kwnames, PyObject *const *kwargs,
Serhiy Storchakab7281052016-09-12 00:52:40 +03003937 Py_ssize_t kwcount, int kwstep,
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02003938 PyObject *const *defs, Py_ssize_t defcount,
Victor Stinner74319ae2016-08-25 00:04:09 +02003939 PyObject *kwdefs, PyObject *closure,
Victor Stinner40ee3012014-06-16 15:59:28 +02003940 PyObject *name, PyObject *qualname)
Tim Peters5ca576e2001-06-18 22:08:13 +00003941{
Victor Stinnerb5e170f2019-11-16 01:03:22 +01003942 assert(tstate != NULL);
3943
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00003944 PyCodeObject* co = (PyCodeObject*)_co;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02003945 PyFrameObject *f;
3946 PyObject *retval = NULL;
3947 PyObject **fastlocals, **freevars;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003948 PyObject *x, *u;
Pablo Galindocd74e662019-06-01 18:08:04 +01003949 const Py_ssize_t total_args = co->co_argcount + co->co_kwonlyargcount;
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01003950 Py_ssize_t i, j, n;
Victor Stinnerc7020012016-08-16 23:40:29 +02003951 PyObject *kwdict;
Tim Peters5ca576e2001-06-18 22:08:13 +00003952
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003953 if (globals == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02003954 _PyErr_SetString(tstate, PyExc_SystemError,
3955 "PyEval_EvalCodeEx: NULL globals");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003956 return NULL;
3957 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003958
Victor Stinnerc7020012016-08-16 23:40:29 +02003959 /* Create the frame */
INADA Naoki5a625d02016-12-24 20:19:08 +09003960 f = _PyFrame_New_NoTrack(tstate, co, globals, locals);
Victor Stinnerc7020012016-08-16 23:40:29 +02003961 if (f == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003962 return NULL;
Victor Stinnerc7020012016-08-16 23:40:29 +02003963 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003964 fastlocals = f->f_localsplus;
3965 freevars = f->f_localsplus + co->co_nlocals;
Tim Peters5ca576e2001-06-18 22:08:13 +00003966
Victor Stinnerc7020012016-08-16 23:40:29 +02003967 /* Create a dictionary for keyword parameters (**kwags) */
Benjamin Petersonb204a422011-06-05 22:04:07 -05003968 if (co->co_flags & CO_VARKEYWORDS) {
3969 kwdict = PyDict_New();
3970 if (kwdict == NULL)
3971 goto fail;
3972 i = total_args;
Victor Stinnerc7020012016-08-16 23:40:29 +02003973 if (co->co_flags & CO_VARARGS) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05003974 i++;
Victor Stinnerc7020012016-08-16 23:40:29 +02003975 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05003976 SETLOCAL(i, kwdict);
3977 }
Victor Stinnerc7020012016-08-16 23:40:29 +02003978 else {
3979 kwdict = NULL;
3980 }
3981
Pablo Galindocd74e662019-06-01 18:08:04 +01003982 /* Copy all positional arguments into local variables */
3983 if (argcount > co->co_argcount) {
3984 n = co->co_argcount;
Victor Stinnerc7020012016-08-16 23:40:29 +02003985 }
3986 else {
3987 n = argcount;
3988 }
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01003989 for (j = 0; j < n; j++) {
3990 x = args[j];
3991 Py_INCREF(x);
3992 SETLOCAL(j, x);
3993 }
3994
Victor Stinnerc7020012016-08-16 23:40:29 +02003995 /* Pack other positional arguments into the *args argument */
Benjamin Petersonb204a422011-06-05 22:04:07 -05003996 if (co->co_flags & CO_VARARGS) {
Sergey Fedoseev234531b2019-02-25 21:59:12 +05003997 u = _PyTuple_FromArray(args + n, argcount - n);
Victor Stinnerc7020012016-08-16 23:40:29 +02003998 if (u == NULL) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05003999 goto fail;
Victor Stinnerc7020012016-08-16 23:40:29 +02004000 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004001 SETLOCAL(total_args, u);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004002 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004003
Serhiy Storchakab7281052016-09-12 00:52:40 +03004004 /* Handle keyword arguments passed as two strided arrays */
4005 kwcount *= kwstep;
4006 for (i = 0; i < kwcount; i += kwstep) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004007 PyObject **co_varnames;
Serhiy Storchakab7281052016-09-12 00:52:40 +03004008 PyObject *keyword = kwnames[i];
4009 PyObject *value = kwargs[i];
Victor Stinner17061a92016-08-16 23:39:42 +02004010 Py_ssize_t j;
Victor Stinnerc7020012016-08-16 23:40:29 +02004011
Benjamin Petersonb204a422011-06-05 22:04:07 -05004012 if (keyword == NULL || !PyUnicode_Check(keyword)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004013 _PyErr_Format(tstate, PyExc_TypeError,
4014 "%U() keywords must be strings",
4015 co->co_name);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004016 goto fail;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004017 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004018
Benjamin Petersonb204a422011-06-05 22:04:07 -05004019 /* Speed hack: do raw pointer compares. As names are
4020 normally interned this should almost always hit. */
4021 co_varnames = ((PyTupleObject *)(co->co_varnames))->ob_item;
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004022 for (j = co->co_posonlyargcount; j < total_args; j++) {
Victor Stinner6fea7f72016-08-22 23:17:30 +02004023 PyObject *name = co_varnames[j];
4024 if (name == keyword) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004025 goto kw_found;
Victor Stinner6fea7f72016-08-22 23:17:30 +02004026 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004027 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004028
Benjamin Petersonb204a422011-06-05 22:04:07 -05004029 /* Slow fallback, just in case */
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004030 for (j = co->co_posonlyargcount; j < total_args; j++) {
Victor Stinner6fea7f72016-08-22 23:17:30 +02004031 PyObject *name = co_varnames[j];
4032 int cmp = PyObject_RichCompareBool( keyword, name, Py_EQ);
4033 if (cmp > 0) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004034 goto kw_found;
Victor Stinner6fea7f72016-08-22 23:17:30 +02004035 }
4036 else if (cmp < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004037 goto fail;
Victor Stinner6fea7f72016-08-22 23:17:30 +02004038 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004039 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004040
Victor Stinner231d1f32017-01-11 02:12:06 +01004041 assert(j >= total_args);
4042 if (kwdict == NULL) {
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004043
Victor Stinner438a12d2019-05-24 17:01:38 +02004044 if (co->co_posonlyargcount
4045 && positional_only_passed_as_keyword(tstate, co,
4046 kwcount, kwnames))
4047 {
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004048 goto fail;
4049 }
4050
Victor Stinner438a12d2019-05-24 17:01:38 +02004051 _PyErr_Format(tstate, PyExc_TypeError,
4052 "%U() got an unexpected keyword argument '%S'",
4053 co->co_name, keyword);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004054 goto fail;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004055 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004056
Christian Heimes0bd447f2013-07-20 14:48:10 +02004057 if (PyDict_SetItem(kwdict, keyword, value) == -1) {
4058 goto fail;
4059 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004060 continue;
Victor Stinnerc7020012016-08-16 23:40:29 +02004061
Benjamin Petersonb204a422011-06-05 22:04:07 -05004062 kw_found:
4063 if (GETLOCAL(j) != NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004064 _PyErr_Format(tstate, PyExc_TypeError,
4065 "%U() got multiple values for argument '%S'",
4066 co->co_name, keyword);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004067 goto fail;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004068 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004069 Py_INCREF(value);
4070 SETLOCAL(j, value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004071 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004072
4073 /* Check the number of positional arguments */
Pablo Galindocd74e662019-06-01 18:08:04 +01004074 if ((argcount > co->co_argcount) && !(co->co_flags & CO_VARARGS)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004075 too_many_positional(tstate, co, argcount, defcount, fastlocals);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004076 goto fail;
4077 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004078
4079 /* Add missing positional arguments (copy default values from defs) */
Pablo Galindocd74e662019-06-01 18:08:04 +01004080 if (argcount < co->co_argcount) {
4081 Py_ssize_t m = co->co_argcount - defcount;
Victor Stinner17061a92016-08-16 23:39:42 +02004082 Py_ssize_t missing = 0;
4083 for (i = argcount; i < m; i++) {
4084 if (GETLOCAL(i) == NULL) {
Benjamin Petersone109c702011-06-24 09:37:26 -05004085 missing++;
Victor Stinner17061a92016-08-16 23:39:42 +02004086 }
4087 }
Benjamin Petersone109c702011-06-24 09:37:26 -05004088 if (missing) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004089 missing_arguments(tstate, co, missing, defcount, fastlocals);
Benjamin Petersone109c702011-06-24 09:37:26 -05004090 goto fail;
Benjamin Petersonb204a422011-06-05 22:04:07 -05004091 }
4092 if (n > m)
4093 i = n - m;
4094 else
4095 i = 0;
4096 for (; i < defcount; i++) {
4097 if (GETLOCAL(m+i) == NULL) {
4098 PyObject *def = defs[i];
4099 Py_INCREF(def);
4100 SETLOCAL(m+i, def);
4101 }
4102 }
4103 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004104
4105 /* Add missing keyword arguments (copy default values from kwdefs) */
Benjamin Petersonb204a422011-06-05 22:04:07 -05004106 if (co->co_kwonlyargcount > 0) {
Victor Stinner17061a92016-08-16 23:39:42 +02004107 Py_ssize_t missing = 0;
Pablo Galindocd74e662019-06-01 18:08:04 +01004108 for (i = co->co_argcount; i < total_args; i++) {
Benjamin Petersonb204a422011-06-05 22:04:07 -05004109 PyObject *name;
4110 if (GETLOCAL(i) != NULL)
4111 continue;
4112 name = PyTuple_GET_ITEM(co->co_varnames, i);
4113 if (kwdefs != NULL) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02004114 PyObject *def = PyDict_GetItemWithError(kwdefs, name);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004115 if (def) {
4116 Py_INCREF(def);
4117 SETLOCAL(i, def);
4118 continue;
4119 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004120 else if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02004121 goto fail;
4122 }
Benjamin Petersonb204a422011-06-05 22:04:07 -05004123 }
Benjamin Petersone109c702011-06-24 09:37:26 -05004124 missing++;
4125 }
4126 if (missing) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004127 missing_arguments(tstate, co, missing, -1, fastlocals);
Benjamin Petersonb204a422011-06-05 22:04:07 -05004128 goto fail;
4129 }
4130 }
4131
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004132 /* Allocate and initialize storage for cell vars, and copy free
Benjamin Peterson90037602011-06-25 22:54:45 -05004133 vars into frame. */
4134 for (i = 0; i < PyTuple_GET_SIZE(co->co_cellvars); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004135 PyObject *c;
Serhiy Storchaka5bb8b912016-12-16 19:19:02 +02004136 Py_ssize_t arg;
Benjamin Peterson90037602011-06-25 22:54:45 -05004137 /* Possibly account for the cell variable being an argument. */
4138 if (co->co_cell2arg != NULL &&
Guido van Rossum6832c812013-05-10 08:47:42 -07004139 (arg = co->co_cell2arg[i]) != CO_CELL_NOT_AN_ARG) {
Benjamin Peterson90037602011-06-25 22:54:45 -05004140 c = PyCell_New(GETLOCAL(arg));
Benjamin Peterson159ae412013-05-12 18:16:06 -05004141 /* Clear the local copy. */
4142 SETLOCAL(arg, NULL);
Guido van Rossum6832c812013-05-10 08:47:42 -07004143 }
4144 else {
Benjamin Peterson90037602011-06-25 22:54:45 -05004145 c = PyCell_New(NULL);
Guido van Rossum6832c812013-05-10 08:47:42 -07004146 }
Benjamin Peterson159ae412013-05-12 18:16:06 -05004147 if (c == NULL)
4148 goto fail;
Benjamin Peterson90037602011-06-25 22:54:45 -05004149 SETLOCAL(co->co_nlocals + i, c);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004150 }
Victor Stinnerc7020012016-08-16 23:40:29 +02004151
4152 /* Copy closure variables to free variables */
Benjamin Peterson90037602011-06-25 22:54:45 -05004153 for (i = 0; i < PyTuple_GET_SIZE(co->co_freevars); ++i) {
4154 PyObject *o = PyTuple_GET_ITEM(closure, i);
4155 Py_INCREF(o);
4156 freevars[PyTuple_GET_SIZE(co->co_cellvars) + i] = o;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004157 }
Tim Peters5ca576e2001-06-18 22:08:13 +00004158
Yury Selivanoveb636452016-09-08 22:01:51 -07004159 /* Handle generator/coroutine/asynchronous generator */
4160 if (co->co_flags & (CO_GENERATOR | CO_COROUTINE | CO_ASYNC_GENERATOR)) {
Yury Selivanov75445082015-05-11 22:57:16 -04004161 PyObject *gen;
Yury Selivanov5376ba92015-06-22 12:19:30 -04004162 int is_coro = co->co_flags & CO_COROUTINE;
Yury Selivanov94c22632015-06-04 10:16:51 -04004163
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004164 /* Don't need to keep the reference to f_back, it will be set
4165 * when the generator is resumed. */
Serhiy Storchaka505ff752014-02-09 13:33:53 +02004166 Py_CLEAR(f->f_back);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00004167
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004168 /* Create a new generator that owns the ready to run frame
4169 * and return that as the value. */
Yury Selivanov5376ba92015-06-22 12:19:30 -04004170 if (is_coro) {
4171 gen = PyCoro_New(f, name, qualname);
Yury Selivanoveb636452016-09-08 22:01:51 -07004172 } else if (co->co_flags & CO_ASYNC_GENERATOR) {
4173 gen = PyAsyncGen_New(f, name, qualname);
Yury Selivanov5376ba92015-06-22 12:19:30 -04004174 } else {
4175 gen = PyGen_NewWithQualName(f, name, qualname);
4176 }
INADA Naoki6a3cedf2016-12-26 18:01:46 +09004177 if (gen == NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04004178 return NULL;
INADA Naoki6a3cedf2016-12-26 18:01:46 +09004179 }
INADA Naoki9c157762016-12-26 18:52:46 +09004180
INADA Naoki6a3cedf2016-12-26 18:01:46 +09004181 _PyObject_GC_TRACK(f);
Yury Selivanov75445082015-05-11 22:57:16 -04004182
Yury Selivanov75445082015-05-11 22:57:16 -04004183 return gen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004184 }
Tim Peters5ca576e2001-06-18 22:08:13 +00004185
Victor Stinnerb9e68122019-11-14 12:20:46 +01004186 retval = _PyEval_EvalFrame(tstate, f, 0);
Tim Peters5ca576e2001-06-18 22:08:13 +00004187
Thomas Woutersce272b62007-09-19 21:19:28 +00004188fail: /* Jump here from prelude on failure */
Tim Peters5ca576e2001-06-18 22:08:13 +00004189
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004190 /* decref'ing the frame can cause __del__ methods to get invoked,
4191 which can call back into Python. While we're done with the
4192 current Python frame (f), the associated C stack is still in use,
4193 so recursion_depth must be boosted for the duration.
4194 */
INADA Naoki5a625d02016-12-24 20:19:08 +09004195 if (Py_REFCNT(f) > 1) {
4196 Py_DECREF(f);
4197 _PyObject_GC_TRACK(f);
4198 }
4199 else {
4200 ++tstate->recursion_depth;
4201 Py_DECREF(f);
4202 --tstate->recursion_depth;
4203 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004204 return retval;
Tim Peters5ca576e2001-06-18 22:08:13 +00004205}
4206
Victor Stinnerb5e170f2019-11-16 01:03:22 +01004207
4208PyObject *
4209_PyEval_EvalCodeWithName(PyObject *_co, PyObject *globals, PyObject *locals,
4210 PyObject *const *args, Py_ssize_t argcount,
4211 PyObject *const *kwnames, PyObject *const *kwargs,
4212 Py_ssize_t kwcount, int kwstep,
4213 PyObject *const *defs, Py_ssize_t defcount,
4214 PyObject *kwdefs, PyObject *closure,
4215 PyObject *name, PyObject *qualname)
4216{
4217 PyThreadState *tstate = _PyThreadState_GET();
4218 return _PyEval_EvalCode(tstate, _co, globals, locals,
4219 args, argcount,
4220 kwnames, kwargs,
4221 kwcount, kwstep,
4222 defs, defcount,
4223 kwdefs, closure,
4224 name, qualname);
4225}
4226
Victor Stinner40ee3012014-06-16 15:59:28 +02004227PyObject *
4228PyEval_EvalCodeEx(PyObject *_co, PyObject *globals, PyObject *locals,
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02004229 PyObject *const *args, int argcount,
4230 PyObject *const *kws, int kwcount,
4231 PyObject *const *defs, int defcount,
4232 PyObject *kwdefs, PyObject *closure)
Victor Stinner40ee3012014-06-16 15:59:28 +02004233{
4234 return _PyEval_EvalCodeWithName(_co, globals, locals,
Victor Stinner9be7e7b2016-08-19 16:11:43 +02004235 args, argcount,
Zackery Spytzc6ea8972017-07-31 08:24:37 -06004236 kws, kws != NULL ? kws + 1 : NULL,
4237 kwcount, 2,
Victor Stinner9be7e7b2016-08-19 16:11:43 +02004238 defs, defcount,
4239 kwdefs, closure,
Victor Stinner40ee3012014-06-16 15:59:28 +02004240 NULL, NULL);
4241}
Tim Peters5ca576e2001-06-18 22:08:13 +00004242
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004243static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02004244special_lookup(PyThreadState *tstate, PyObject *o, _Py_Identifier *id)
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004245{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004246 PyObject *res;
Benjamin Petersonce798522012-01-22 11:24:29 -05004247 res = _PyObject_LookupSpecial(o, id);
Victor Stinner438a12d2019-05-24 17:01:38 +02004248 if (res == NULL && !_PyErr_Occurred(tstate)) {
4249 _PyErr_SetObject(tstate, PyExc_AttributeError, id->object);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004250 return NULL;
4251 }
4252 return res;
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004253}
4254
4255
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00004256/* Logic for the raise statement (too complicated for inlining).
4257 This *consumes* a reference count to each of its arguments. */
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004258static int
Victor Stinner09532fe2019-05-10 23:39:09 +02004259do_raise(PyThreadState *tstate, PyObject *exc, PyObject *cause)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00004260{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004261 PyObject *type = NULL, *value = NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00004262
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004263 if (exc == NULL) {
4264 /* Reraise */
Mark Shannonae3087c2017-10-22 22:41:51 +01004265 _PyErr_StackItem *exc_info = _PyErr_GetTopmostException(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004266 PyObject *tb;
Mark Shannonae3087c2017-10-22 22:41:51 +01004267 type = exc_info->exc_type;
4268 value = exc_info->exc_value;
4269 tb = exc_info->exc_traceback;
Victor Stinnereec93312016-08-18 18:13:10 +02004270 if (type == Py_None || type == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004271 _PyErr_SetString(tstate, PyExc_RuntimeError,
4272 "No active exception to reraise");
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004273 return 0;
4274 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004275 Py_XINCREF(type);
4276 Py_XINCREF(value);
4277 Py_XINCREF(tb);
Victor Stinner438a12d2019-05-24 17:01:38 +02004278 _PyErr_Restore(tstate, type, value, tb);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004279 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004280 }
Guido van Rossumac7be682001-01-17 15:42:30 +00004281
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004282 /* We support the following forms of raise:
4283 raise
Collin Winter828f04a2007-08-31 00:04:24 +00004284 raise <instance>
4285 raise <type> */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00004286
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004287 if (PyExceptionClass_Check(exc)) {
4288 type = exc;
Victor Stinnera5ed5f02016-12-06 18:45:50 +01004289 value = _PyObject_CallNoArg(exc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004290 if (value == NULL)
4291 goto raise_error;
Benjamin Peterson5afa03a2011-07-15 14:09:26 -05004292 if (!PyExceptionInstance_Check(value)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004293 _PyErr_Format(tstate, PyExc_TypeError,
4294 "calling %R should have returned an instance of "
4295 "BaseException, not %R",
4296 type, Py_TYPE(value));
4297 goto raise_error;
Benjamin Peterson5afa03a2011-07-15 14:09:26 -05004298 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004299 }
4300 else if (PyExceptionInstance_Check(exc)) {
4301 value = exc;
4302 type = PyExceptionInstance_Class(exc);
4303 Py_INCREF(type);
4304 }
4305 else {
4306 /* Not something you can raise. You get an exception
4307 anyway, just not what you specified :-) */
4308 Py_DECREF(exc);
Victor Stinner438a12d2019-05-24 17:01:38 +02004309 _PyErr_SetString(tstate, PyExc_TypeError,
4310 "exceptions must derive from BaseException");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004311 goto raise_error;
4312 }
Collin Winter828f04a2007-08-31 00:04:24 +00004313
Serhiy Storchakac0191582016-09-27 11:37:10 +03004314 assert(type != NULL);
4315 assert(value != NULL);
4316
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004317 if (cause) {
4318 PyObject *fixed_cause;
4319 if (PyExceptionClass_Check(cause)) {
Victor Stinnera5ed5f02016-12-06 18:45:50 +01004320 fixed_cause = _PyObject_CallNoArg(cause);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004321 if (fixed_cause == NULL)
4322 goto raise_error;
Benjamin Petersond5a1c442012-05-14 22:09:31 -07004323 Py_DECREF(cause);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004324 }
Benjamin Petersond5a1c442012-05-14 22:09:31 -07004325 else if (PyExceptionInstance_Check(cause)) {
4326 fixed_cause = cause;
4327 }
4328 else if (cause == Py_None) {
4329 Py_DECREF(cause);
4330 fixed_cause = NULL;
4331 }
4332 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02004333 _PyErr_SetString(tstate, PyExc_TypeError,
4334 "exception causes must derive from "
4335 "BaseException");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004336 goto raise_error;
4337 }
Benjamin Petersond5a1c442012-05-14 22:09:31 -07004338 PyException_SetCause(value, fixed_cause);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004339 }
Collin Winter828f04a2007-08-31 00:04:24 +00004340
Victor Stinner438a12d2019-05-24 17:01:38 +02004341 _PyErr_SetObject(tstate, type, value);
Victor Stinner61f4db82020-01-28 03:37:45 +01004342 /* _PyErr_SetObject incref's its arguments */
Serhiy Storchakac0191582016-09-27 11:37:10 +03004343 Py_DECREF(value);
4344 Py_DECREF(type);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004345 return 0;
Collin Winter828f04a2007-08-31 00:04:24 +00004346
4347raise_error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004348 Py_XDECREF(value);
4349 Py_XDECREF(type);
4350 Py_XDECREF(cause);
Benjamin Peterson31a58ff2012-10-12 11:34:51 -04004351 return 0;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00004352}
4353
Tim Petersd6d010b2001-06-21 02:49:55 +00004354/* Iterate v argcnt times and store the results on the stack (via decreasing
Guido van Rossum0368b722007-05-11 16:50:42 +00004355 sp). Return 1 for success, 0 if error.
Antoine Pitrou9a2310d2008-07-25 22:39:39 +00004356
Guido van Rossum0368b722007-05-11 16:50:42 +00004357 If argcntafter == -1, do a simple unpack. If it is >= 0, do an unpack
4358 with a variable target.
4359*/
Tim Petersd6d010b2001-06-21 02:49:55 +00004360
Barry Warsawe42b18f1997-08-25 22:13:04 +00004361static int
Victor Stinner438a12d2019-05-24 17:01:38 +02004362unpack_iterable(PyThreadState *tstate, PyObject *v,
4363 int argcnt, int argcntafter, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00004364{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004365 int i = 0, j = 0;
4366 Py_ssize_t ll = 0;
4367 PyObject *it; /* iter(v) */
4368 PyObject *w;
4369 PyObject *l = NULL; /* variable list */
Guido van Rossumac7be682001-01-17 15:42:30 +00004370
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004371 assert(v != NULL);
Tim Petersd6d010b2001-06-21 02:49:55 +00004372
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004373 it = PyObject_GetIter(v);
Serhiy Storchaka13a6c092017-12-26 12:30:41 +02004374 if (it == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004375 if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError) &&
Victor Stinnera102ed72020-02-07 02:24:48 +01004376 Py_TYPE(v)->tp_iter == NULL && !PySequence_Check(v))
Serhiy Storchaka13a6c092017-12-26 12:30:41 +02004377 {
Victor Stinner438a12d2019-05-24 17:01:38 +02004378 _PyErr_Format(tstate, PyExc_TypeError,
4379 "cannot unpack non-iterable %.200s object",
Victor Stinnera102ed72020-02-07 02:24:48 +01004380 Py_TYPE(v)->tp_name);
Serhiy Storchaka13a6c092017-12-26 12:30:41 +02004381 }
4382 return 0;
4383 }
Tim Petersd6d010b2001-06-21 02:49:55 +00004384
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004385 for (; i < argcnt; i++) {
4386 w = PyIter_Next(it);
4387 if (w == NULL) {
4388 /* Iterator done, via error or exhaustion. */
Victor Stinner438a12d2019-05-24 17:01:38 +02004389 if (!_PyErr_Occurred(tstate)) {
R David Murray4171bbe2015-04-15 17:08:45 -04004390 if (argcntafter == -1) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004391 _PyErr_Format(tstate, PyExc_ValueError,
4392 "not enough values to unpack "
4393 "(expected %d, got %d)",
4394 argcnt, i);
R David Murray4171bbe2015-04-15 17:08:45 -04004395 }
4396 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02004397 _PyErr_Format(tstate, PyExc_ValueError,
4398 "not enough values to unpack "
4399 "(expected at least %d, got %d)",
4400 argcnt + argcntafter, i);
R David Murray4171bbe2015-04-15 17:08:45 -04004401 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004402 }
4403 goto Error;
4404 }
4405 *--sp = w;
4406 }
Tim Petersd6d010b2001-06-21 02:49:55 +00004407
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004408 if (argcntafter == -1) {
4409 /* We better have exhausted the iterator now. */
4410 w = PyIter_Next(it);
4411 if (w == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004412 if (_PyErr_Occurred(tstate))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004413 goto Error;
4414 Py_DECREF(it);
4415 return 1;
4416 }
4417 Py_DECREF(w);
Victor Stinner438a12d2019-05-24 17:01:38 +02004418 _PyErr_Format(tstate, PyExc_ValueError,
4419 "too many values to unpack (expected %d)",
4420 argcnt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004421 goto Error;
4422 }
Guido van Rossum0368b722007-05-11 16:50:42 +00004423
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004424 l = PySequence_List(it);
4425 if (l == NULL)
4426 goto Error;
4427 *--sp = l;
4428 i++;
Guido van Rossum0368b722007-05-11 16:50:42 +00004429
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004430 ll = PyList_GET_SIZE(l);
4431 if (ll < argcntafter) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004432 _PyErr_Format(tstate, PyExc_ValueError,
R David Murray4171bbe2015-04-15 17:08:45 -04004433 "not enough values to unpack (expected at least %d, got %zd)",
4434 argcnt + argcntafter, argcnt + ll);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004435 goto Error;
4436 }
Guido van Rossum0368b722007-05-11 16:50:42 +00004437
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004438 /* Pop the "after-variable" args off the list. */
4439 for (j = argcntafter; j > 0; j--, i++) {
4440 *--sp = PyList_GET_ITEM(l, ll - j);
4441 }
4442 /* Resize the list. */
Victor Stinner60ac6ed2020-02-07 23:18:08 +01004443 Py_SET_SIZE(l, ll - argcntafter);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004444 Py_DECREF(it);
4445 return 1;
Guido van Rossum0368b722007-05-11 16:50:42 +00004446
Tim Petersd6d010b2001-06-21 02:49:55 +00004447Error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004448 for (; i > 0; i--, sp++)
4449 Py_DECREF(*sp);
4450 Py_XDECREF(it);
4451 return 0;
Barry Warsawe42b18f1997-08-25 22:13:04 +00004452}
4453
4454
Guido van Rossum96a42c81992-01-12 02:29:51 +00004455#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00004456static int
Victor Stinner438a12d2019-05-24 17:01:38 +02004457prtrace(PyThreadState *tstate, PyObject *v, const char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004458{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004459 printf("%s ", str);
Victor Stinner438a12d2019-05-24 17:01:38 +02004460 if (PyObject_Print(v, stdout, 0) != 0) {
4461 /* Don't know what else to do */
4462 _PyErr_Clear(tstate);
4463 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004464 printf("\n");
4465 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004466}
Guido van Rossum3f5da241990-12-20 15:06:42 +00004467#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004468
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00004469static void
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004470call_exc_trace(Py_tracefunc func, PyObject *self,
4471 PyThreadState *tstate, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00004472{
Victor Stinneraaa8ed82013-07-10 13:57:55 +02004473 PyObject *type, *value, *traceback, *orig_traceback, *arg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004474 int err;
Victor Stinner438a12d2019-05-24 17:01:38 +02004475 _PyErr_Fetch(tstate, &type, &value, &orig_traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004476 if (value == NULL) {
4477 value = Py_None;
4478 Py_INCREF(value);
4479 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004480 _PyErr_NormalizeException(tstate, &type, &value, &orig_traceback);
Antoine Pitrou89335212013-11-23 14:05:23 +01004481 traceback = (orig_traceback != NULL) ? orig_traceback : Py_None;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004482 arg = PyTuple_Pack(3, type, value, traceback);
4483 if (arg == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004484 _PyErr_Restore(tstate, type, value, orig_traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004485 return;
4486 }
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004487 err = call_trace(func, self, tstate, f, PyTrace_EXCEPTION, arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004488 Py_DECREF(arg);
Victor Stinner438a12d2019-05-24 17:01:38 +02004489 if (err == 0) {
4490 _PyErr_Restore(tstate, type, value, orig_traceback);
4491 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004492 else {
4493 Py_XDECREF(type);
4494 Py_XDECREF(value);
Victor Stinneraaa8ed82013-07-10 13:57:55 +02004495 Py_XDECREF(orig_traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004496 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00004497}
4498
Amaury Forgeot d'Arcf05149a2007-11-13 01:05:30 +00004499static int
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004500call_trace_protected(Py_tracefunc func, PyObject *obj,
4501 PyThreadState *tstate, PyFrameObject *frame,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004502 int what, PyObject *arg)
Fred Drake4ec5d562001-10-04 19:26:43 +00004503{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004504 PyObject *type, *value, *traceback;
4505 int err;
Victor Stinner438a12d2019-05-24 17:01:38 +02004506 _PyErr_Fetch(tstate, &type, &value, &traceback);
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004507 err = call_trace(func, obj, tstate, frame, what, arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004508 if (err == 0)
4509 {
Victor Stinner438a12d2019-05-24 17:01:38 +02004510 _PyErr_Restore(tstate, type, value, traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004511 return 0;
4512 }
4513 else {
4514 Py_XDECREF(type);
4515 Py_XDECREF(value);
4516 Py_XDECREF(traceback);
4517 return -1;
4518 }
Fred Drake4ec5d562001-10-04 19:26:43 +00004519}
4520
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00004521static int
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004522call_trace(Py_tracefunc func, PyObject *obj,
4523 PyThreadState *tstate, PyFrameObject *frame,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004524 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00004525{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004526 int result;
4527 if (tstate->tracing)
4528 return 0;
4529 tstate->tracing++;
4530 tstate->use_tracing = 0;
4531 result = func(obj, frame, what, arg);
4532 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
4533 || (tstate->c_profilefunc != NULL));
4534 tstate->tracing--;
4535 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00004536}
4537
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00004538PyObject *
4539_PyEval_CallTracing(PyObject *func, PyObject *args)
4540{
Victor Stinner50b48572018-11-01 01:51:40 +01004541 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004542 int save_tracing = tstate->tracing;
4543 int save_use_tracing = tstate->use_tracing;
4544 PyObject *result;
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00004545
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004546 tstate->tracing = 0;
4547 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
4548 || (tstate->c_profilefunc != NULL));
4549 result = PyObject_Call(func, args, NULL);
4550 tstate->tracing = save_tracing;
4551 tstate->use_tracing = save_use_tracing;
4552 return result;
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00004553}
4554
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00004555/* See Objects/lnotab_notes.txt for a description of how tracing works. */
Michael W. Hudson006c7522002-11-08 13:08:46 +00004556static int
Tim Peters8a5c3c72004-04-05 19:36:21 +00004557maybe_call_line_trace(Py_tracefunc func, PyObject *obj,
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004558 PyThreadState *tstate, PyFrameObject *frame,
4559 int *instr_lb, int *instr_ub, int *instr_prev)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004560{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004561 int result = 0;
4562 int line = frame->f_lineno;
Michael W. Hudson006c7522002-11-08 13:08:46 +00004563
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004564 /* If the last instruction executed isn't in the current
4565 instruction window, reset the window.
4566 */
4567 if (frame->f_lasti < *instr_lb || frame->f_lasti >= *instr_ub) {
4568 PyAddrPair bounds;
4569 line = _PyCode_CheckLineNumber(frame->f_code, frame->f_lasti,
4570 &bounds);
4571 *instr_lb = bounds.ap_lower;
4572 *instr_ub = bounds.ap_upper;
4573 }
Nick Coghlan5a851672017-09-08 10:14:16 +10004574 /* If the last instruction falls at the start of a line or if it
4575 represents a jump backwards, update the frame's line number and
4576 then call the trace function if we're tracing source lines.
4577 */
4578 if ((frame->f_lasti == *instr_lb || frame->f_lasti < *instr_prev)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004579 frame->f_lineno = line;
Nick Coghlan5a851672017-09-08 10:14:16 +10004580 if (frame->f_trace_lines) {
4581 result = call_trace(func, obj, tstate, frame, PyTrace_LINE, Py_None);
4582 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004583 }
George King20faa682017-10-18 17:44:22 -07004584 /* Always emit an opcode event if we're tracing all opcodes. */
4585 if (frame->f_trace_opcodes) {
4586 result = call_trace(func, obj, tstate, frame, PyTrace_OPCODE, Py_None);
4587 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004588 *instr_prev = frame->f_lasti;
4589 return result;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004590}
4591
Fred Drake5755ce62001-06-27 19:19:46 +00004592void
4593PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00004594{
Steve Dowerb82e17e2019-05-23 08:45:22 -07004595 if (PySys_Audit("sys.setprofile", NULL) < 0) {
4596 return;
4597 }
4598
Victor Stinner50b48572018-11-01 01:51:40 +01004599 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004600 PyObject *temp = tstate->c_profileobj;
4601 Py_XINCREF(arg);
4602 tstate->c_profilefunc = NULL;
4603 tstate->c_profileobj = NULL;
4604 /* Must make sure that tracing is not ignored if 'temp' is freed */
4605 tstate->use_tracing = tstate->c_tracefunc != NULL;
4606 Py_XDECREF(temp);
4607 tstate->c_profilefunc = func;
4608 tstate->c_profileobj = arg;
4609 /* Flag that tracing or profiling is turned on */
4610 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
Fred Drake5755ce62001-06-27 19:19:46 +00004611}
4612
4613void
4614PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
4615{
Steve Dowerb82e17e2019-05-23 08:45:22 -07004616 if (PySys_Audit("sys.settrace", NULL) < 0) {
4617 return;
4618 }
4619
Victor Stinner09532fe2019-05-10 23:39:09 +02004620 _PyRuntimeState *runtime = &_PyRuntime;
4621 PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004622 PyObject *temp = tstate->c_traceobj;
Victor Stinner09532fe2019-05-10 23:39:09 +02004623 runtime->ceval.tracing_possible += (func != NULL) - (tstate->c_tracefunc != NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004624 Py_XINCREF(arg);
4625 tstate->c_tracefunc = NULL;
4626 tstate->c_traceobj = NULL;
4627 /* Must make sure that profiling is not ignored if 'temp' is freed */
4628 tstate->use_tracing = tstate->c_profilefunc != NULL;
4629 Py_XDECREF(temp);
4630 tstate->c_tracefunc = func;
4631 tstate->c_traceobj = arg;
4632 /* Flag that tracing or profiling is turned on */
4633 tstate->use_tracing = ((func != NULL)
4634 || (tstate->c_profilefunc != NULL));
Fred Draked0838392001-06-16 21:02:31 +00004635}
4636
Yury Selivanov75445082015-05-11 22:57:16 -04004637void
Victor Stinner838f2642019-06-13 22:41:23 +02004638_PyEval_SetCoroutineOriginTrackingDepth(PyThreadState *tstate, int new_depth)
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08004639{
4640 assert(new_depth >= 0);
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08004641 tstate->coroutine_origin_tracking_depth = new_depth;
4642}
4643
4644int
4645_PyEval_GetCoroutineOriginTrackingDepth(void)
4646{
Victor Stinner50b48572018-11-01 01:51:40 +01004647 PyThreadState *tstate = _PyThreadState_GET();
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08004648 return tstate->coroutine_origin_tracking_depth;
4649}
4650
4651void
Yury Selivanoveb636452016-09-08 22:01:51 -07004652_PyEval_SetAsyncGenFirstiter(PyObject *firstiter)
4653{
Victor Stinner50b48572018-11-01 01:51:40 +01004654 PyThreadState *tstate = _PyThreadState_GET();
Steve Dowerb82e17e2019-05-23 08:45:22 -07004655
4656 if (PySys_Audit("sys.set_asyncgen_hook_firstiter", NULL) < 0) {
4657 return;
4658 }
4659
Yury Selivanoveb636452016-09-08 22:01:51 -07004660 Py_XINCREF(firstiter);
4661 Py_XSETREF(tstate->async_gen_firstiter, firstiter);
4662}
4663
4664PyObject *
4665_PyEval_GetAsyncGenFirstiter(void)
4666{
Victor Stinner50b48572018-11-01 01:51:40 +01004667 PyThreadState *tstate = _PyThreadState_GET();
Yury Selivanoveb636452016-09-08 22:01:51 -07004668 return tstate->async_gen_firstiter;
4669}
4670
4671void
4672_PyEval_SetAsyncGenFinalizer(PyObject *finalizer)
4673{
Victor Stinner50b48572018-11-01 01:51:40 +01004674 PyThreadState *tstate = _PyThreadState_GET();
Steve Dowerb82e17e2019-05-23 08:45:22 -07004675
4676 if (PySys_Audit("sys.set_asyncgen_hook_finalizer", NULL) < 0) {
4677 return;
4678 }
4679
Yury Selivanoveb636452016-09-08 22:01:51 -07004680 Py_XINCREF(finalizer);
4681 Py_XSETREF(tstate->async_gen_finalizer, finalizer);
4682}
4683
4684PyObject *
4685_PyEval_GetAsyncGenFinalizer(void)
4686{
Victor Stinner50b48572018-11-01 01:51:40 +01004687 PyThreadState *tstate = _PyThreadState_GET();
Yury Selivanoveb636452016-09-08 22:01:51 -07004688 return tstate->async_gen_finalizer;
4689}
4690
Victor Stinner438a12d2019-05-24 17:01:38 +02004691static PyFrameObject *
4692_PyEval_GetFrame(PyThreadState *tstate)
4693{
Victor Stinner01b1cc12019-11-20 02:27:56 +01004694 _PyRuntimeState *runtime = tstate->interp->runtime;
4695 return runtime->gilstate.getframe(tstate);
Victor Stinner438a12d2019-05-24 17:01:38 +02004696}
4697
4698PyFrameObject *
4699PyEval_GetFrame(void)
4700{
4701 PyThreadState *tstate = _PyThreadState_GET();
4702 return _PyEval_GetFrame(tstate);
4703}
4704
Guido van Rossumb209a111997-04-29 18:18:01 +00004705PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004706PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00004707{
Victor Stinner438a12d2019-05-24 17:01:38 +02004708 PyThreadState *tstate = _PyThreadState_GET();
4709 PyFrameObject *current_frame = _PyEval_GetFrame(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004710 if (current_frame == NULL)
Victor Stinner438a12d2019-05-24 17:01:38 +02004711 return tstate->interp->builtins;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004712 else
4713 return current_frame->f_builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00004714}
4715
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02004716/* Convenience function to get a builtin from its name */
4717PyObject *
4718_PyEval_GetBuiltinId(_Py_Identifier *name)
4719{
Victor Stinner438a12d2019-05-24 17:01:38 +02004720 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02004721 PyObject *attr = _PyDict_GetItemIdWithError(PyEval_GetBuiltins(), name);
4722 if (attr) {
4723 Py_INCREF(attr);
4724 }
Victor Stinner438a12d2019-05-24 17:01:38 +02004725 else if (!_PyErr_Occurred(tstate)) {
4726 _PyErr_SetObject(tstate, PyExc_AttributeError, _PyUnicode_FromId(name));
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02004727 }
4728 return attr;
4729}
4730
Guido van Rossumb209a111997-04-29 18:18:01 +00004731PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004732PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00004733{
Victor Stinner438a12d2019-05-24 17:01:38 +02004734 PyThreadState *tstate = _PyThreadState_GET();
4735 PyFrameObject *current_frame = _PyEval_GetFrame(tstate);
Victor Stinner41bb43a2013-10-29 01:19:37 +01004736 if (current_frame == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02004737 _PyErr_SetString(tstate, PyExc_SystemError, "frame does not exist");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004738 return NULL;
Victor Stinner41bb43a2013-10-29 01:19:37 +01004739 }
4740
Victor Stinner438a12d2019-05-24 17:01:38 +02004741 if (PyFrame_FastToLocalsWithError(current_frame) < 0) {
Victor Stinner41bb43a2013-10-29 01:19:37 +01004742 return NULL;
Victor Stinner438a12d2019-05-24 17:01:38 +02004743 }
Victor Stinner41bb43a2013-10-29 01:19:37 +01004744
4745 assert(current_frame->f_locals != NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004746 return current_frame->f_locals;
Guido van Rossum5b722181993-03-30 17:46:03 +00004747}
4748
Guido van Rossumb209a111997-04-29 18:18:01 +00004749PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004750PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00004751{
Victor Stinner438a12d2019-05-24 17:01:38 +02004752 PyThreadState *tstate = _PyThreadState_GET();
4753 PyFrameObject *current_frame = _PyEval_GetFrame(tstate);
4754 if (current_frame == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004755 return NULL;
Victor Stinner438a12d2019-05-24 17:01:38 +02004756 }
Victor Stinner41bb43a2013-10-29 01:19:37 +01004757
4758 assert(current_frame->f_globals != NULL);
4759 return current_frame->f_globals;
Guido van Rossum3f5da241990-12-20 15:06:42 +00004760}
4761
Guido van Rossum6135a871995-01-09 17:53:26 +00004762int
Tim Peters5ba58662001-07-16 02:29:45 +00004763PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
Jeremy Hylton061d1062001-03-22 02:32:48 +00004764{
Victor Stinner438a12d2019-05-24 17:01:38 +02004765 PyThreadState *tstate = _PyThreadState_GET();
4766 PyFrameObject *current_frame = _PyEval_GetFrame(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004767 int result = cf->cf_flags != 0;
Tim Peters5ba58662001-07-16 02:29:45 +00004768
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004769 if (current_frame != NULL) {
4770 const int codeflags = current_frame->f_code->co_flags;
4771 const int compilerflags = codeflags & PyCF_MASK;
4772 if (compilerflags) {
4773 result = 1;
4774 cf->cf_flags |= compilerflags;
4775 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00004776#if 0 /* future keyword */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004777 if (codeflags & CO_GENERATOR_ALLOWED) {
4778 result = 1;
4779 cf->cf_flags |= CO_GENERATOR_ALLOWED;
4780 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00004781#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004782 }
4783 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00004784}
4785
Guido van Rossum3f5da241990-12-20 15:06:42 +00004786
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00004787const char *
Tim Peters6d6c1a32001-08-02 04:15:00 +00004788PyEval_GetFuncName(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00004789{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004790 if (PyMethod_Check(func))
4791 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
4792 else if (PyFunction_Check(func))
Serhiy Storchaka06515832016-11-20 09:13:07 +02004793 return PyUnicode_AsUTF8(((PyFunctionObject*)func)->func_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004794 else if (PyCFunction_Check(func))
4795 return ((PyCFunctionObject*)func)->m_ml->ml_name;
4796 else
Victor Stinnera102ed72020-02-07 02:24:48 +01004797 return Py_TYPE(func)->tp_name;
Jeremy Hylton512a2372001-04-11 13:52:29 +00004798}
4799
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00004800const char *
Tim Peters6d6c1a32001-08-02 04:15:00 +00004801PyEval_GetFuncDesc(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00004802{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004803 if (PyMethod_Check(func))
4804 return "()";
4805 else if (PyFunction_Check(func))
4806 return "()";
4807 else if (PyCFunction_Check(func))
4808 return "()";
4809 else
4810 return " object";
Jeremy Hylton512a2372001-04-11 13:52:29 +00004811}
4812
Armin Rigo1c2d7e52005-09-20 18:34:01 +00004813#define C_TRACE(x, call) \
Nicholas Bastind858a772004-06-25 23:31:06 +00004814if (tstate->use_tracing && tstate->c_profilefunc) { \
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004815 if (call_trace(tstate->c_profilefunc, tstate->c_profileobj, \
4816 tstate, tstate->frame, \
4817 PyTrace_C_CALL, func)) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004818 x = NULL; \
4819 } \
4820 else { \
4821 x = call; \
4822 if (tstate->c_profilefunc != NULL) { \
4823 if (x == NULL) { \
4824 call_trace_protected(tstate->c_profilefunc, \
4825 tstate->c_profileobj, \
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004826 tstate, tstate->frame, \
4827 PyTrace_C_EXCEPTION, func); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004828 /* XXX should pass (type, value, tb) */ \
4829 } else { \
4830 if (call_trace(tstate->c_profilefunc, \
4831 tstate->c_profileobj, \
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004832 tstate, tstate->frame, \
4833 PyTrace_C_RETURN, func)) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004834 Py_DECREF(x); \
4835 x = NULL; \
4836 } \
4837 } \
4838 } \
4839 } \
Nicholas Bastind858a772004-06-25 23:31:06 +00004840} else { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004841 x = call; \
4842 }
Nicholas Bastinc69ebe82004-03-24 21:57:10 +00004843
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02004844
4845static PyObject *
4846trace_call_function(PyThreadState *tstate,
4847 PyObject *func,
4848 PyObject **args, Py_ssize_t nargs,
4849 PyObject *kwnames)
4850{
4851 PyObject *x;
4852 if (PyCFunction_Check(func)) {
Petr Viktorinffd97532020-02-11 17:46:57 +01004853 C_TRACE(x, PyObject_Vectorcall(func, args, nargs, kwnames));
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02004854 return x;
4855 }
Andy Lesterdffe4c02020-03-04 07:15:20 -06004856 else if (Py_IS_TYPE(func, &PyMethodDescr_Type) && nargs > 0) {
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02004857 /* We need to create a temporary bound method as argument
4858 for profiling.
4859
4860 If nargs == 0, then this cannot work because we have no
4861 "self". In any case, the call itself would raise
4862 TypeError (foo needs an argument), so we just skip
4863 profiling. */
4864 PyObject *self = args[0];
4865 func = Py_TYPE(func)->tp_descr_get(func, self, (PyObject*)Py_TYPE(self));
4866 if (func == NULL) {
4867 return NULL;
4868 }
Petr Viktorinffd97532020-02-11 17:46:57 +01004869 C_TRACE(x, PyObject_Vectorcall(func,
Jeroen Demeyer0d722f32019-07-05 14:48:24 +02004870 args+1, nargs-1,
4871 kwnames));
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02004872 Py_DECREF(func);
4873 return x;
4874 }
Petr Viktorinffd97532020-02-11 17:46:57 +01004875 return PyObject_Vectorcall(func, args, nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames);
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02004876}
4877
Victor Stinner415c5102017-01-11 00:54:57 +01004878/* Issue #29227: Inline call_function() into _PyEval_EvalFrameDefault()
4879 to reduce the stack consumption. */
4880Py_LOCAL_INLINE(PyObject *) _Py_HOT_FUNCTION
Victor Stinner09532fe2019-05-10 23:39:09 +02004881call_function(PyThreadState *tstate, PyObject ***pp_stack, Py_ssize_t oparg, PyObject *kwnames)
Jeremy Hyltone8c04322002-08-16 17:47:26 +00004882{
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004883 PyObject **pfunc = (*pp_stack) - oparg - 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004884 PyObject *func = *pfunc;
4885 PyObject *x, *w;
Victor Stinnerd8735722016-09-09 12:36:44 -07004886 Py_ssize_t nkwargs = (kwnames == NULL) ? 0 : PyTuple_GET_SIZE(kwnames);
4887 Py_ssize_t nargs = oparg - nkwargs;
INADA Naoki5566bbb2017-02-03 07:43:03 +09004888 PyObject **stack = (*pp_stack) - nargs - nkwargs;
Jeremy Hyltone8c04322002-08-16 17:47:26 +00004889
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02004890 if (tstate->use_tracing) {
4891 x = trace_call_function(tstate, func, stack, nargs, kwnames);
INADA Naoki5566bbb2017-02-03 07:43:03 +09004892 }
Victor Stinner4a7cc882015-03-06 23:35:27 +01004893 else {
Petr Viktorinffd97532020-02-11 17:46:57 +01004894 x = PyObject_Vectorcall(func, stack, nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004895 }
Tim Peters8a5c3c72004-04-05 19:36:21 +00004896
Victor Stinner438a12d2019-05-24 17:01:38 +02004897 assert((x != NULL) ^ (_PyErr_Occurred(tstate) != NULL));
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004898
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01004899 /* Clear the stack of the function object. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004900 while ((*pp_stack) > pfunc) {
4901 w = EXT_POP(*pp_stack);
4902 Py_DECREF(w);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004903 }
Victor Stinnerace47d72013-07-18 01:41:08 +02004904
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004905 return x;
Jeremy Hyltone8c04322002-08-16 17:47:26 +00004906}
4907
Jeremy Hylton52820442001-01-03 23:52:36 +00004908static PyObject *
Victor Stinner09532fe2019-05-10 23:39:09 +02004909do_call_core(PyThreadState *tstate, PyObject *func, PyObject *callargs, PyObject *kwdict)
Jeremy Hylton52820442001-01-03 23:52:36 +00004910{
jdemeyere89de732018-09-19 12:06:20 +02004911 PyObject *result;
4912
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004913 if (PyCFunction_Check(func)) {
Jeroen Demeyer7a6873c2019-09-11 13:01:01 +02004914 C_TRACE(result, PyObject_Call(func, callargs, kwdict));
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004915 return result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004916 }
Andy Lesterdffe4c02020-03-04 07:15:20 -06004917 else if (Py_IS_TYPE(func, &PyMethodDescr_Type)) {
jdemeyere89de732018-09-19 12:06:20 +02004918 Py_ssize_t nargs = PyTuple_GET_SIZE(callargs);
4919 if (nargs > 0 && tstate->use_tracing) {
4920 /* We need to create a temporary bound method as argument
4921 for profiling.
4922
4923 If nargs == 0, then this cannot work because we have no
4924 "self". In any case, the call itself would raise
4925 TypeError (foo needs an argument), so we just skip
4926 profiling. */
4927 PyObject *self = PyTuple_GET_ITEM(callargs, 0);
4928 func = Py_TYPE(func)->tp_descr_get(func, self, (PyObject*)Py_TYPE(self));
4929 if (func == NULL) {
4930 return NULL;
4931 }
4932
Victor Stinner4d231bc2019-11-14 13:36:21 +01004933 C_TRACE(result, _PyObject_FastCallDictTstate(
4934 tstate, func,
4935 &_PyTuple_ITEMS(callargs)[1],
4936 nargs - 1,
4937 kwdict));
jdemeyere89de732018-09-19 12:06:20 +02004938 Py_DECREF(func);
4939 return result;
4940 }
Victor Stinner74319ae2016-08-25 00:04:09 +02004941 }
jdemeyere89de732018-09-19 12:06:20 +02004942 return PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00004943}
4944
Serhiy Storchaka483405b2015-02-17 10:14:30 +02004945/* Extract a slice index from a PyLong or an object with the
Guido van Rossum38fff8c2006-03-07 18:50:55 +00004946 nb_index slot defined, and store in *pi.
4947 Silently reduce values larger than PY_SSIZE_T_MAX to PY_SSIZE_T_MAX,
Xiang Zhang2ddf5a12017-05-10 18:19:41 +08004948 and silently boost values less than PY_SSIZE_T_MIN to PY_SSIZE_T_MIN.
Martin v. Löwisdde99d22006-02-17 15:57:41 +00004949 Return 0 on error, 1 on success.
Tim Peterscb479e72001-12-16 19:11:44 +00004950*/
Guido van Rossum20c6add2000-05-08 14:06:50 +00004951int
Martin v. Löwis18e16552006-02-15 17:27:45 +00004952_PyEval_SliceIndex(PyObject *v, Py_ssize_t *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004953{
Victor Stinner438a12d2019-05-24 17:01:38 +02004954 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03004955 if (v != Py_None) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004956 Py_ssize_t x;
4957 if (PyIndex_Check(v)) {
4958 x = PyNumber_AsSsize_t(v, NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02004959 if (x == -1 && _PyErr_Occurred(tstate))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004960 return 0;
4961 }
4962 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02004963 _PyErr_SetString(tstate, PyExc_TypeError,
4964 "slice indices must be integers or "
4965 "None or have an __index__ method");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004966 return 0;
4967 }
4968 *pi = x;
4969 }
4970 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004971}
4972
Serhiy Storchaka80ec8362017-03-19 19:37:40 +02004973int
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03004974_PyEval_SliceIndexNotNone(PyObject *v, Py_ssize_t *pi)
Serhiy Storchaka80ec8362017-03-19 19:37:40 +02004975{
Victor Stinner438a12d2019-05-24 17:01:38 +02004976 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03004977 Py_ssize_t x;
4978 if (PyIndex_Check(v)) {
4979 x = PyNumber_AsSsize_t(v, NULL);
Victor Stinner438a12d2019-05-24 17:01:38 +02004980 if (x == -1 && _PyErr_Occurred(tstate))
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03004981 return 0;
4982 }
4983 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02004984 _PyErr_SetString(tstate, PyExc_TypeError,
4985 "slice indices must be integers or "
4986 "have an __index__ method");
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03004987 return 0;
4988 }
4989 *pi = x;
4990 return 1;
Serhiy Storchaka80ec8362017-03-19 19:37:40 +02004991}
4992
Thomas Wouters52152252000-08-17 22:55:00 +00004993static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02004994import_name(PyThreadState *tstate, PyFrameObject *f,
4995 PyObject *name, PyObject *fromlist, PyObject *level)
Serhiy Storchaka133138a2016-08-02 22:51:21 +03004996{
4997 _Py_IDENTIFIER(__import__);
Victor Stinnerdf142fd2016-08-20 00:44:42 +02004998 PyObject *import_func, *res;
4999 PyObject* stack[5];
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005000
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02005001 import_func = _PyDict_GetItemIdWithError(f->f_builtins, &PyId___import__);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005002 if (import_func == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005003 if (!_PyErr_Occurred(tstate)) {
5004 _PyErr_SetString(tstate, PyExc_ImportError, "__import__ not found");
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02005005 }
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005006 return NULL;
5007 }
5008
5009 /* Fast path for not overloaded __import__. */
Victor Stinner438a12d2019-05-24 17:01:38 +02005010 if (import_func == tstate->interp->import_func) {
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005011 int ilevel = _PyLong_AsInt(level);
Victor Stinner438a12d2019-05-24 17:01:38 +02005012 if (ilevel == -1 && _PyErr_Occurred(tstate)) {
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005013 return NULL;
5014 }
5015 res = PyImport_ImportModuleLevelObject(
5016 name,
5017 f->f_globals,
5018 f->f_locals == NULL ? Py_None : f->f_locals,
5019 fromlist,
5020 ilevel);
5021 return res;
5022 }
5023
5024 Py_INCREF(import_func);
Victor Stinnerdf142fd2016-08-20 00:44:42 +02005025
5026 stack[0] = name;
5027 stack[1] = f->f_globals;
5028 stack[2] = f->f_locals == NULL ? Py_None : f->f_locals;
5029 stack[3] = fromlist;
5030 stack[4] = level;
Victor Stinner559bb6a2016-08-22 22:48:54 +02005031 res = _PyObject_FastCall(import_func, stack, 5);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03005032 Py_DECREF(import_func);
5033 return res;
5034}
5035
5036static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02005037import_from(PyThreadState *tstate, PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00005038{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005039 PyObject *x;
Xiang Zhang4830f582017-03-21 11:13:42 +08005040 PyObject *fullmodname, *pkgname, *pkgpath, *pkgname_or_unknown, *errmsg;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00005041
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005042 if (_PyObject_LookupAttr(v, name, &x) != 0) {
Antoine Pitrou0373a102014-10-13 20:19:45 +02005043 return x;
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005044 }
Antoine Pitrou0373a102014-10-13 20:19:45 +02005045 /* Issue #17636: in case this failed because of a circular relative
5046 import, try to fallback on reading the module directly from
5047 sys.modules. */
Antoine Pitrou0373a102014-10-13 20:19:45 +02005048 pkgname = _PyObject_GetAttrId(v, &PyId___name__);
Brett Cannon3008bc02015-08-11 18:01:31 -07005049 if (pkgname == NULL) {
5050 goto error;
5051 }
Oren Milman6db70332017-09-19 14:23:01 +03005052 if (!PyUnicode_Check(pkgname)) {
5053 Py_CLEAR(pkgname);
5054 goto error;
5055 }
Antoine Pitrou0373a102014-10-13 20:19:45 +02005056 fullmodname = PyUnicode_FromFormat("%U.%U", pkgname, name);
Brett Cannon3008bc02015-08-11 18:01:31 -07005057 if (fullmodname == NULL) {
Xiang Zhang4830f582017-03-21 11:13:42 +08005058 Py_DECREF(pkgname);
Antoine Pitrou0373a102014-10-13 20:19:45 +02005059 return NULL;
Brett Cannon3008bc02015-08-11 18:01:31 -07005060 }
Eric Snow3f9eee62017-09-15 16:35:20 -06005061 x = PyImport_GetModule(fullmodname);
Antoine Pitrou0373a102014-10-13 20:19:45 +02005062 Py_DECREF(fullmodname);
Victor Stinner438a12d2019-05-24 17:01:38 +02005063 if (x == NULL && !_PyErr_Occurred(tstate)) {
Brett Cannon3008bc02015-08-11 18:01:31 -07005064 goto error;
5065 }
Matthias Bussonnier1bc15642017-02-22 07:06:50 -08005066 Py_DECREF(pkgname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005067 return x;
Brett Cannon3008bc02015-08-11 18:01:31 -07005068 error:
Matthias Bussonnierbc4bed42017-02-14 16:05:25 -08005069 pkgpath = PyModule_GetFilenameObject(v);
Matthias Bussonnier1bc15642017-02-22 07:06:50 -08005070 if (pkgname == NULL) {
5071 pkgname_or_unknown = PyUnicode_FromString("<unknown module name>");
5072 if (pkgname_or_unknown == NULL) {
5073 Py_XDECREF(pkgpath);
5074 return NULL;
5075 }
5076 } else {
5077 pkgname_or_unknown = pkgname;
5078 }
Matthias Bussonnierbc4bed42017-02-14 16:05:25 -08005079
5080 if (pkgpath == NULL || !PyUnicode_Check(pkgpath)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005081 _PyErr_Clear(tstate);
Xiang Zhang4830f582017-03-21 11:13:42 +08005082 errmsg = PyUnicode_FromFormat(
5083 "cannot import name %R from %R (unknown location)",
5084 name, pkgname_or_unknown
5085 );
Stefan Krah027b09c2019-03-25 21:50:58 +01005086 /* NULL checks for errmsg and pkgname done by PyErr_SetImportError. */
Xiang Zhang4830f582017-03-21 11:13:42 +08005087 PyErr_SetImportError(errmsg, pkgname, NULL);
5088 }
5089 else {
Anthony Sottile65366bc2019-09-09 08:17:50 -07005090 _Py_IDENTIFIER(__spec__);
5091 PyObject *spec = _PyObject_GetAttrId(v, &PyId___spec__);
Anthony Sottile65366bc2019-09-09 08:17:50 -07005092 const char *fmt =
5093 _PyModuleSpec_IsInitializing(spec) ?
5094 "cannot import name %R from partially initialized module %R "
5095 "(most likely due to a circular import) (%S)" :
5096 "cannot import name %R from %R (%S)";
5097 Py_XDECREF(spec);
5098
5099 errmsg = PyUnicode_FromFormat(fmt, name, pkgname_or_unknown, pkgpath);
Stefan Krah027b09c2019-03-25 21:50:58 +01005100 /* NULL checks for errmsg and pkgname done by PyErr_SetImportError. */
Xiang Zhang4830f582017-03-21 11:13:42 +08005101 PyErr_SetImportError(errmsg, pkgname, pkgpath);
Matthias Bussonnierbc4bed42017-02-14 16:05:25 -08005102 }
5103
Xiang Zhang4830f582017-03-21 11:13:42 +08005104 Py_XDECREF(errmsg);
Matthias Bussonnier1bc15642017-02-22 07:06:50 -08005105 Py_XDECREF(pkgname_or_unknown);
5106 Py_XDECREF(pkgpath);
Brett Cannon3008bc02015-08-11 18:01:31 -07005107 return NULL;
Thomas Wouters52152252000-08-17 22:55:00 +00005108}
Guido van Rossumac7be682001-01-17 15:42:30 +00005109
Thomas Wouters52152252000-08-17 22:55:00 +00005110static int
Victor Stinner438a12d2019-05-24 17:01:38 +02005111import_all_from(PyThreadState *tstate, PyObject *locals, PyObject *v)
Thomas Wouters52152252000-08-17 22:55:00 +00005112{
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02005113 _Py_IDENTIFIER(__all__);
5114 _Py_IDENTIFIER(__dict__);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005115 PyObject *all, *dict, *name, *value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005116 int skip_leading_underscores = 0;
5117 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00005118
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005119 if (_PyObject_LookupAttrId(v, &PyId___all__, &all) < 0) {
5120 return -1; /* Unexpected error */
5121 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005122 if (all == NULL) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005123 if (_PyObject_LookupAttrId(v, &PyId___dict__, &dict) < 0) {
5124 return -1;
5125 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005126 if (dict == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005127 _PyErr_SetString(tstate, PyExc_ImportError,
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005128 "from-import-* object has no __dict__ and no __all__");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005129 return -1;
5130 }
5131 all = PyMapping_Keys(dict);
5132 Py_DECREF(dict);
5133 if (all == NULL)
5134 return -1;
5135 skip_leading_underscores = 1;
5136 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00005137
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005138 for (pos = 0, err = 0; ; pos++) {
5139 name = PySequence_GetItem(all, pos);
5140 if (name == NULL) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005141 if (!_PyErr_ExceptionMatches(tstate, PyExc_IndexError)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005142 err = -1;
Victor Stinner438a12d2019-05-24 17:01:38 +02005143 }
5144 else {
5145 _PyErr_Clear(tstate);
5146 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005147 break;
5148 }
Xiang Zhangd8b291a2018-03-24 18:39:36 +08005149 if (!PyUnicode_Check(name)) {
5150 PyObject *modname = _PyObject_GetAttrId(v, &PyId___name__);
5151 if (modname == NULL) {
5152 Py_DECREF(name);
5153 err = -1;
5154 break;
5155 }
5156 if (!PyUnicode_Check(modname)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005157 _PyErr_Format(tstate, PyExc_TypeError,
5158 "module __name__ must be a string, not %.100s",
5159 Py_TYPE(modname)->tp_name);
Xiang Zhangd8b291a2018-03-24 18:39:36 +08005160 }
5161 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02005162 _PyErr_Format(tstate, PyExc_TypeError,
5163 "%s in %U.%s must be str, not %.100s",
5164 skip_leading_underscores ? "Key" : "Item",
5165 modname,
5166 skip_leading_underscores ? "__dict__" : "__all__",
5167 Py_TYPE(name)->tp_name);
Xiang Zhangd8b291a2018-03-24 18:39:36 +08005168 }
5169 Py_DECREF(modname);
5170 Py_DECREF(name);
5171 err = -1;
5172 break;
5173 }
5174 if (skip_leading_underscores) {
Serhiy Storchakae3b2b4b2017-09-08 09:58:51 +03005175 if (PyUnicode_READY(name) == -1) {
5176 Py_DECREF(name);
5177 err = -1;
5178 break;
5179 }
5180 if (PyUnicode_READ_CHAR(name, 0) == '_') {
5181 Py_DECREF(name);
5182 continue;
5183 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005184 }
5185 value = PyObject_GetAttr(v, name);
5186 if (value == NULL)
5187 err = -1;
5188 else if (PyDict_CheckExact(locals))
5189 err = PyDict_SetItem(locals, name, value);
5190 else
5191 err = PyObject_SetItem(locals, name, value);
5192 Py_DECREF(name);
5193 Py_XDECREF(value);
5194 if (err != 0)
5195 break;
5196 }
5197 Py_DECREF(all);
5198 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00005199}
5200
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005201static int
Victor Stinner438a12d2019-05-24 17:01:38 +02005202check_args_iterable(PyThreadState *tstate, PyObject *func, PyObject *args)
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005203{
Victor Stinnera102ed72020-02-07 02:24:48 +01005204 if (Py_TYPE(args)->tp_iter == NULL && !PySequence_Check(args)) {
Jeroen Demeyerbf17d412019-11-05 16:48:04 +01005205 /* check_args_iterable() may be called with a live exception:
5206 * clear it to prevent calling _PyObject_FunctionStr() with an
5207 * exception set. */
Victor Stinner61f4db82020-01-28 03:37:45 +01005208 _PyErr_Clear(tstate);
Jeroen Demeyerbf17d412019-11-05 16:48:04 +01005209 PyObject *funcstr = _PyObject_FunctionStr(func);
5210 if (funcstr != NULL) {
5211 _PyErr_Format(tstate, PyExc_TypeError,
5212 "%U argument after * must be an iterable, not %.200s",
5213 funcstr, Py_TYPE(args)->tp_name);
5214 Py_DECREF(funcstr);
5215 }
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005216 return -1;
5217 }
5218 return 0;
5219}
5220
5221static void
Victor Stinner438a12d2019-05-24 17:01:38 +02005222format_kwargs_error(PyThreadState *tstate, PyObject *func, PyObject *kwargs)
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005223{
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005224 /* _PyDict_MergeEx raises attribute
5225 * error (percolated from an attempt
5226 * to get 'keys' attribute) instead of
5227 * a type error if its second argument
5228 * is not a mapping.
5229 */
Victor Stinner438a12d2019-05-24 17:01:38 +02005230 if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) {
Victor Stinner61f4db82020-01-28 03:37:45 +01005231 _PyErr_Clear(tstate);
Jeroen Demeyerbf17d412019-11-05 16:48:04 +01005232 PyObject *funcstr = _PyObject_FunctionStr(func);
5233 if (funcstr != NULL) {
5234 _PyErr_Format(
5235 tstate, PyExc_TypeError,
5236 "%U argument after ** must be a mapping, not %.200s",
5237 funcstr, Py_TYPE(kwargs)->tp_name);
5238 Py_DECREF(funcstr);
5239 }
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005240 }
Victor Stinner438a12d2019-05-24 17:01:38 +02005241 else if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005242 PyObject *exc, *val, *tb;
Victor Stinner438a12d2019-05-24 17:01:38 +02005243 _PyErr_Fetch(tstate, &exc, &val, &tb);
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005244 if (val && PyTuple_Check(val) && PyTuple_GET_SIZE(val) == 1) {
Victor Stinner61f4db82020-01-28 03:37:45 +01005245 _PyErr_Clear(tstate);
Jeroen Demeyerbf17d412019-11-05 16:48:04 +01005246 PyObject *funcstr = _PyObject_FunctionStr(func);
5247 if (funcstr != NULL) {
5248 PyObject *key = PyTuple_GET_ITEM(val, 0);
5249 _PyErr_Format(
5250 tstate, PyExc_TypeError,
5251 "%U got multiple values for keyword argument '%S'",
5252 funcstr, key);
5253 Py_DECREF(funcstr);
5254 }
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005255 Py_XDECREF(exc);
5256 Py_XDECREF(val);
5257 Py_XDECREF(tb);
5258 }
5259 else {
Victor Stinner438a12d2019-05-24 17:01:38 +02005260 _PyErr_Restore(tstate, exc, val, tb);
Serhiy Storchakaf1ec3ce2019-01-12 10:12:24 +02005261 }
5262 }
Serhiy Storchaka25e4f772017-08-03 11:37:15 +03005263}
5264
Guido van Rossumac7be682001-01-17 15:42:30 +00005265static void
Victor Stinner438a12d2019-05-24 17:01:38 +02005266format_exc_check_arg(PyThreadState *tstate, PyObject *exc,
5267 const char *format_str, PyObject *obj)
Paul Prescode68140d2000-08-30 20:25:01 +00005268{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005269 const char *obj_str;
Paul Prescode68140d2000-08-30 20:25:01 +00005270
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005271 if (!obj)
5272 return;
Paul Prescode68140d2000-08-30 20:25:01 +00005273
Serhiy Storchaka06515832016-11-20 09:13:07 +02005274 obj_str = PyUnicode_AsUTF8(obj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005275 if (!obj_str)
5276 return;
Paul Prescode68140d2000-08-30 20:25:01 +00005277
Victor Stinner438a12d2019-05-24 17:01:38 +02005278 _PyErr_Format(tstate, exc, format_str, obj_str);
Paul Prescode68140d2000-08-30 20:25:01 +00005279}
Guido van Rossum950361c1997-01-24 13:49:28 +00005280
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005281static void
Victor Stinner438a12d2019-05-24 17:01:38 +02005282format_exc_unbound(PyThreadState *tstate, PyCodeObject *co, int oparg)
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005283{
5284 PyObject *name;
5285 /* Don't stomp existing exception */
Victor Stinner438a12d2019-05-24 17:01:38 +02005286 if (_PyErr_Occurred(tstate))
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005287 return;
5288 if (oparg < PyTuple_GET_SIZE(co->co_cellvars)) {
5289 name = PyTuple_GET_ITEM(co->co_cellvars,
5290 oparg);
Victor Stinner438a12d2019-05-24 17:01:38 +02005291 format_exc_check_arg(tstate,
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005292 PyExc_UnboundLocalError,
5293 UNBOUNDLOCAL_ERROR_MSG,
5294 name);
5295 } else {
5296 name = PyTuple_GET_ITEM(co->co_freevars, oparg -
5297 PyTuple_GET_SIZE(co->co_cellvars));
Victor Stinner438a12d2019-05-24 17:01:38 +02005298 format_exc_check_arg(tstate, PyExc_NameError,
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00005299 UNBOUNDFREE_ERROR_MSG, name);
5300 }
5301}
5302
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03005303static void
Mark Shannonfee55262019-11-21 09:11:43 +00005304format_awaitable_error(PyThreadState *tstate, PyTypeObject *type, int prevprevopcode, int prevopcode)
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03005305{
5306 if (type->tp_as_async == NULL || type->tp_as_async->am_await == NULL) {
5307 if (prevopcode == BEFORE_ASYNC_WITH) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005308 _PyErr_Format(tstate, PyExc_TypeError,
5309 "'async with' received an object from __aenter__ "
5310 "that does not implement __await__: %.100s",
5311 type->tp_name);
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03005312 }
Mark Shannonfee55262019-11-21 09:11:43 +00005313 else if (prevopcode == WITH_EXCEPT_START || (prevopcode == CALL_FUNCTION && prevprevopcode == DUP_TOP)) {
Victor Stinner438a12d2019-05-24 17:01:38 +02005314 _PyErr_Format(tstate, PyExc_TypeError,
5315 "'async with' received an object from __aexit__ "
5316 "that does not implement __await__: %.100s",
5317 type->tp_name);
Serhiy Storchakaa68f2f02018-04-03 01:41:38 +03005318 }
5319 }
5320}
5321
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005322static PyObject *
Victor Stinner438a12d2019-05-24 17:01:38 +02005323unicode_concatenate(PyThreadState *tstate, PyObject *v, PyObject *w,
Serhiy Storchakaab874002016-09-11 13:48:15 +03005324 PyFrameObject *f, const _Py_CODEUNIT *next_instr)
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005325{
5326 PyObject *res;
5327 if (Py_REFCNT(v) == 2) {
5328 /* In the common case, there are 2 references to the value
5329 * stored in 'variable' when the += is performed: one on the
5330 * value stack (in 'v') and one still stored in the
5331 * 'variable'. We try to delete the variable now to reduce
5332 * the refcnt to 1.
5333 */
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03005334 int opcode, oparg;
5335 NEXTOPARG();
5336 switch (opcode) {
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005337 case STORE_FAST:
5338 {
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005339 PyObject **fastlocals = f->f_localsplus;
5340 if (GETLOCAL(oparg) == v)
5341 SETLOCAL(oparg, NULL);
5342 break;
5343 }
5344 case STORE_DEREF:
5345 {
5346 PyObject **freevars = (f->f_localsplus +
5347 f->f_code->co_nlocals);
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03005348 PyObject *c = freevars[oparg];
Raymond Hettingerc32f9db2016-11-12 04:10:35 -05005349 if (PyCell_GET(c) == v) {
5350 PyCell_SET(c, NULL);
5351 Py_DECREF(v);
5352 }
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005353 break;
5354 }
5355 case STORE_NAME:
5356 {
5357 PyObject *names = f->f_code->co_names;
Serhiy Storchakaf60bf5f2016-05-25 20:02:01 +03005358 PyObject *name = GETITEM(names, oparg);
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005359 PyObject *locals = f->f_locals;
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02005360 if (locals && PyDict_CheckExact(locals)) {
5361 PyObject *w = PyDict_GetItemWithError(locals, name);
5362 if ((w == v && PyDict_DelItem(locals, name) != 0) ||
Victor Stinner438a12d2019-05-24 17:01:38 +02005363 (w == NULL && _PyErr_Occurred(tstate)))
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02005364 {
5365 Py_DECREF(v);
5366 return NULL;
Victor Stinnerd2a915d2011-10-02 20:34:20 +02005367 }
5368 }
5369 break;
5370 }
5371 }
5372 }
5373 res = v;
5374 PyUnicode_Append(&res, w);
5375 return res;
5376}
5377
Guido van Rossum950361c1997-01-24 13:49:28 +00005378#ifdef DYNAMIC_EXECUTION_PROFILE
5379
Skip Montanarof118cb12001-10-15 20:51:38 +00005380static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005381getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00005382{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005383 int i;
5384 PyObject *l = PyList_New(256);
5385 if (l == NULL) return NULL;
5386 for (i = 0; i < 256; i++) {
5387 PyObject *x = PyLong_FromLong(a[i]);
5388 if (x == NULL) {
5389 Py_DECREF(l);
5390 return NULL;
5391 }
Zackery Spytz99d56b52018-12-08 07:16:55 -07005392 PyList_SET_ITEM(l, i, x);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005393 }
5394 for (i = 0; i < 256; i++)
5395 a[i] = 0;
5396 return l;
Guido van Rossum950361c1997-01-24 13:49:28 +00005397}
5398
5399PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005400_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00005401{
5402#ifndef DXPAIRS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005403 return getarray(dxp);
Guido van Rossum950361c1997-01-24 13:49:28 +00005404#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005405 int i;
5406 PyObject *l = PyList_New(257);
5407 if (l == NULL) return NULL;
5408 for (i = 0; i < 257; i++) {
5409 PyObject *x = getarray(dxpairs[i]);
5410 if (x == NULL) {
5411 Py_DECREF(l);
5412 return NULL;
5413 }
Zackery Spytz99d56b52018-12-08 07:16:55 -07005414 PyList_SET_ITEM(l, i, x);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005415 }
5416 return l;
Guido van Rossum950361c1997-01-24 13:49:28 +00005417#endif
5418}
5419
5420#endif
Brett Cannon5c4de282016-09-07 11:16:41 -07005421
5422Py_ssize_t
5423_PyEval_RequestCodeExtraIndex(freefunc free)
5424{
Victor Stinnercaba55b2018-08-03 15:33:52 +02005425 PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE();
Brett Cannon5c4de282016-09-07 11:16:41 -07005426 Py_ssize_t new_index;
5427
Dino Viehlandf3cffd22017-06-21 14:44:36 -07005428 if (interp->co_extra_user_count == MAX_CO_EXTRA_USERS - 1) {
Brett Cannon5c4de282016-09-07 11:16:41 -07005429 return -1;
5430 }
Dino Viehlandf3cffd22017-06-21 14:44:36 -07005431 new_index = interp->co_extra_user_count++;
5432 interp->co_extra_freefuncs[new_index] = free;
Brett Cannon5c4de282016-09-07 11:16:41 -07005433 return new_index;
5434}
Łukasz Langaa785c872016-09-09 17:37:37 -07005435
5436static void
5437dtrace_function_entry(PyFrameObject *f)
5438{
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02005439 const char *filename;
5440 const char *funcname;
Łukasz Langaa785c872016-09-09 17:37:37 -07005441 int lineno;
5442
5443 filename = PyUnicode_AsUTF8(f->f_code->co_filename);
5444 funcname = PyUnicode_AsUTF8(f->f_code->co_name);
5445 lineno = PyCode_Addr2Line(f->f_code, f->f_lasti);
5446
Andy Lestere6be9b52020-02-11 20:28:35 -06005447 PyDTrace_FUNCTION_ENTRY(filename, funcname, lineno);
Łukasz Langaa785c872016-09-09 17:37:37 -07005448}
5449
5450static void
5451dtrace_function_return(PyFrameObject *f)
5452{
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02005453 const char *filename;
5454 const char *funcname;
Łukasz Langaa785c872016-09-09 17:37:37 -07005455 int lineno;
5456
5457 filename = PyUnicode_AsUTF8(f->f_code->co_filename);
5458 funcname = PyUnicode_AsUTF8(f->f_code->co_name);
5459 lineno = PyCode_Addr2Line(f->f_code, f->f_lasti);
5460
Andy Lestere6be9b52020-02-11 20:28:35 -06005461 PyDTrace_FUNCTION_RETURN(filename, funcname, lineno);
Łukasz Langaa785c872016-09-09 17:37:37 -07005462}
5463
5464/* DTrace equivalent of maybe_call_line_trace. */
5465static void
5466maybe_dtrace_line(PyFrameObject *frame,
5467 int *instr_lb, int *instr_ub, int *instr_prev)
5468{
5469 int line = frame->f_lineno;
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02005470 const char *co_filename, *co_name;
Łukasz Langaa785c872016-09-09 17:37:37 -07005471
5472 /* If the last instruction executed isn't in the current
5473 instruction window, reset the window.
5474 */
5475 if (frame->f_lasti < *instr_lb || frame->f_lasti >= *instr_ub) {
5476 PyAddrPair bounds;
5477 line = _PyCode_CheckLineNumber(frame->f_code, frame->f_lasti,
5478 &bounds);
5479 *instr_lb = bounds.ap_lower;
5480 *instr_ub = bounds.ap_upper;
5481 }
5482 /* If the last instruction falls at the start of a line or if
5483 it represents a jump backwards, update the frame's line
5484 number and call the trace function. */
5485 if (frame->f_lasti == *instr_lb || frame->f_lasti < *instr_prev) {
5486 frame->f_lineno = line;
5487 co_filename = PyUnicode_AsUTF8(frame->f_code->co_filename);
5488 if (!co_filename)
5489 co_filename = "?";
5490 co_name = PyUnicode_AsUTF8(frame->f_code->co_name);
5491 if (!co_name)
5492 co_name = "?";
Andy Lestere6be9b52020-02-11 20:28:35 -06005493 PyDTrace_LINE(co_filename, co_name, line);
Łukasz Langaa785c872016-09-09 17:37:37 -07005494 }
5495 *instr_prev = frame->f_lasti;
5496}
Victor Stinnerf4b1e3d2019-11-04 19:48:34 +01005497
5498
5499/* Implement Py_EnterRecursiveCall() and Py_LeaveRecursiveCall() as functions
5500 for the limited API. */
5501
5502#undef Py_EnterRecursiveCall
5503
5504int Py_EnterRecursiveCall(const char *where)
5505{
Victor Stinnerbe434dc2019-11-05 00:51:22 +01005506 return _Py_EnterRecursiveCall_inline(where);
Victor Stinnerf4b1e3d2019-11-04 19:48:34 +01005507}
5508
5509#undef Py_LeaveRecursiveCall
5510
5511void Py_LeaveRecursiveCall(void)
5512{
Victor Stinnerbe434dc2019-11-05 00:51:22 +01005513 _Py_LeaveRecursiveCall_inline();
Victor Stinnerf4b1e3d2019-11-04 19:48:34 +01005514}