1 /* Execute compiled code */
2
3 /* XXX TO DO:
4 XXX speed up searching for keywords by using a dictionary
5 XXX document it!
6 */
7
8 /* enable more aggressive intra-module optimizations, where available */
9 /* affects both release and debug builds - see bpo-43271 */
10 #define PY_LOCAL_AGGRESSIVE
11
12 #include "Python.h"
13 #include "pycore_abstract.h" // _PyIndex_Check()
14 #include "pycore_call.h" // _PyObject_FastCallDictTstate()
15 #include "pycore_ceval.h" // _PyEval_SignalAsyncExc()
16 #include "pycore_code.h" // _PyCode_InitOpcache()
17 #include "pycore_initconfig.h" // _PyStatus_OK()
18 #include "pycore_object.h" // _PyObject_GC_TRACK()
19 #include "pycore_pyerrors.h" // _PyErr_Fetch()
20 #include "pycore_pylifecycle.h" // _PyErr_Print()
21 #include "pycore_pymem.h" // _PyMem_IsPtrFreed()
22 #include "pycore_pystate.h" // _PyInterpreterState_GET()
23 #include "pycore_sysmodule.h" // _PySys_Audit()
24 #include "pycore_tuple.h" // _PyTuple_ITEMS()
25
26 #include "code.h"
27 #include "dictobject.h"
28 #include "frameobject.h"
29 #include "opcode.h"
30 #include "pydtrace.h"
31 #include "setobject.h"
32 #include "structmember.h" // struct PyMemberDef, T_OFFSET_EX
33
34 #include <ctype.h>
35
36 typedef struct {
37 PyCodeObject *code; // The code object for the bounds. May be NULL.
38 PyCodeAddressRange bounds; // Only valid if code != NULL.
39 CFrame cframe;
40 } PyTraceInfo;
41
42
43 #ifdef Py_DEBUG
44 /* For debugging the interpreter: */
45 #define LLTRACE 1 /* Low-level trace feature */
46 #define CHECKEXC 1 /* Double-check exception checking */
47 #endif
48
49 #if !defined(Py_BUILD_CORE)
50 # error "ceval.c must be build with Py_BUILD_CORE define for best performance"
51 #endif
52
53 _Py_IDENTIFIER(__name__);
54
55 /* Forward declarations */
56 Py_LOCAL_INLINE(PyObject *) call_function(
57 PyThreadState *tstate, PyTraceInfo *, PyObject ***pp_stack,
58 Py_ssize_t oparg, PyObject *kwnames);
59 static PyObject * do_call_core(
60 PyThreadState *tstate, PyTraceInfo *, PyObject *func,
61 PyObject *callargs, PyObject *kwdict);
62
63 #ifdef LLTRACE
64 static int lltrace;
65 static int prtrace(PyThreadState *, PyObject *, const char *);
66 #endif
67 static int call_trace(Py_tracefunc, PyObject *,
68 PyThreadState *, PyFrameObject *,
69 PyTraceInfo *,
70 int, PyObject *);
71 static int call_trace_protected(Py_tracefunc, PyObject *,
72 PyThreadState *, PyFrameObject *,
73 PyTraceInfo *,
74 int, PyObject *);
75 static void call_exc_trace(Py_tracefunc, PyObject *,
76 PyThreadState *, PyFrameObject *,
77 PyTraceInfo *trace_info);
78 static int maybe_call_line_trace(Py_tracefunc, PyObject *,
79 PyThreadState *, PyFrameObject *,
80 PyTraceInfo *, int);
81 static void maybe_dtrace_line(PyFrameObject *, PyTraceInfo *, int);
82 static void dtrace_function_entry(PyFrameObject *);
83 static void dtrace_function_return(PyFrameObject *);
84
85 static PyObject * import_name(PyThreadState *, PyFrameObject *,
86 PyObject *, PyObject *, PyObject *);
87 static PyObject * import_from(PyThreadState *, PyObject *, PyObject *);
88 static int import_all_from(PyThreadState *, PyObject *, PyObject *);
89 static void format_exc_check_arg(PyThreadState *, PyObject *, const char *, PyObject *);
90 static void format_exc_unbound(PyThreadState *tstate, PyCodeObject *co, int oparg);
91 static PyObject * unicode_concatenate(PyThreadState *, PyObject *, PyObject *,
92 PyFrameObject *, const _Py_CODEUNIT *);
93 static PyObject * special_lookup(PyThreadState *, PyObject *, _Py_Identifier *);
94 static int check_args_iterable(PyThreadState *, PyObject *func, PyObject *vararg);
95 static void format_kwargs_error(PyThreadState *, PyObject *func, PyObject *kwargs);
96 static void format_awaitable_error(PyThreadState *, PyTypeObject *, int, int);
97
98 #define NAME_ERROR_MSG \
99 "name '%.200s' is not defined"
100 #define UNBOUNDLOCAL_ERROR_MSG \
101 "local variable '%.200s' referenced before assignment"
102 #define UNBOUNDFREE_ERROR_MSG \
103 "free variable '%.200s' referenced before assignment" \
104 " in enclosing scope"
105
106 /* Dynamic execution profile */
107 #ifdef DYNAMIC_EXECUTION_PROFILE
108 #ifdef DXPAIRS
109 static long dxpairs[257][256];
110 #define dxp dxpairs[256]
111 #else
112 static long dxp[256];
113 #endif
114 #endif
115
116 /* per opcode cache */
117 static int opcache_min_runs = 1024; /* create opcache when code executed this many times */
118 #define OPCODE_CACHE_MAX_TRIES 20
119 #define OPCACHE_STATS 0 /* Enable stats */
120
121 // This function allows to deactivate the opcode cache. As different cache mechanisms may hold
122 // references, this can mess with the reference leak detector functionality so the cache needs
123 // to be deactivated in such scenarios to avoid false positives. See bpo-3714 for more information.
124 void
_PyEval_DeactivateOpCache(void)125 _PyEval_DeactivateOpCache(void)
126 {
127 opcache_min_runs = 0;
128 }
129
130 #if OPCACHE_STATS
131 static size_t opcache_code_objects = 0;
132 static size_t opcache_code_objects_extra_mem = 0;
133
134 static size_t opcache_global_opts = 0;
135 static size_t opcache_global_hits = 0;
136 static size_t opcache_global_misses = 0;
137
138 static size_t opcache_attr_opts = 0;
139 static size_t opcache_attr_hits = 0;
140 static size_t opcache_attr_misses = 0;
141 static size_t opcache_attr_deopts = 0;
142 static size_t opcache_attr_total = 0;
143 #endif
144
145
146 #ifndef NDEBUG
147 /* Ensure that tstate is valid: sanity check for PyEval_AcquireThread() and
148 PyEval_RestoreThread(). Detect if tstate memory was freed. It can happen
149 when a thread continues to run after Python finalization, especially
150 daemon threads. */
151 static int
is_tstate_valid(PyThreadState * tstate)152 is_tstate_valid(PyThreadState *tstate)
153 {
154 assert(!_PyMem_IsPtrFreed(tstate));
155 assert(!_PyMem_IsPtrFreed(tstate->interp));
156 return 1;
157 }
158 #endif
159
160
161 /* This can set eval_breaker to 0 even though gil_drop_request became
162 1. We believe this is all right because the eval loop will release
163 the GIL eventually anyway. */
164 static inline void
COMPUTE_EVAL_BREAKER(PyInterpreterState * interp,struct _ceval_runtime_state * ceval,struct _ceval_state * ceval2)165 COMPUTE_EVAL_BREAKER(PyInterpreterState *interp,
166 struct _ceval_runtime_state *ceval,
167 struct _ceval_state *ceval2)
168 {
169 _Py_atomic_store_relaxed(&ceval2->eval_breaker,
170 _Py_atomic_load_relaxed(&ceval2->gil_drop_request)
171 | (_Py_atomic_load_relaxed(&ceval->signals_pending)
172 && _Py_ThreadCanHandleSignals(interp))
173 | (_Py_atomic_load_relaxed(&ceval2->pending.calls_to_do)
174 && _Py_ThreadCanHandlePendingCalls())
175 | ceval2->pending.async_exc);
176 }
177
178
179 static inline void
SET_GIL_DROP_REQUEST(PyInterpreterState * interp)180 SET_GIL_DROP_REQUEST(PyInterpreterState *interp)
181 {
182 struct _ceval_state *ceval2 = &interp->ceval;
183 _Py_atomic_store_relaxed(&ceval2->gil_drop_request, 1);
184 _Py_atomic_store_relaxed(&ceval2->eval_breaker, 1);
185 }
186
187
188 static inline void
RESET_GIL_DROP_REQUEST(PyInterpreterState * interp)189 RESET_GIL_DROP_REQUEST(PyInterpreterState *interp)
190 {
191 struct _ceval_runtime_state *ceval = &interp->runtime->ceval;
192 struct _ceval_state *ceval2 = &interp->ceval;
193 _Py_atomic_store_relaxed(&ceval2->gil_drop_request, 0);
194 COMPUTE_EVAL_BREAKER(interp, ceval, ceval2);
195 }
196
197
198 static inline void
SIGNAL_PENDING_CALLS(PyInterpreterState * interp)199 SIGNAL_PENDING_CALLS(PyInterpreterState *interp)
200 {
201 struct _ceval_runtime_state *ceval = &interp->runtime->ceval;
202 struct _ceval_state *ceval2 = &interp->ceval;
203 _Py_atomic_store_relaxed(&ceval2->pending.calls_to_do, 1);
204 COMPUTE_EVAL_BREAKER(interp, ceval, ceval2);
205 }
206
207
208 static inline void
UNSIGNAL_PENDING_CALLS(PyInterpreterState * interp)209 UNSIGNAL_PENDING_CALLS(PyInterpreterState *interp)
210 {
211 struct _ceval_runtime_state *ceval = &interp->runtime->ceval;
212 struct _ceval_state *ceval2 = &interp->ceval;
213 _Py_atomic_store_relaxed(&ceval2->pending.calls_to_do, 0);
214 COMPUTE_EVAL_BREAKER(interp, ceval, ceval2);
215 }
216
217
218 static inline void
SIGNAL_PENDING_SIGNALS(PyInterpreterState * interp,int force)219 SIGNAL_PENDING_SIGNALS(PyInterpreterState *interp, int force)
220 {
221 struct _ceval_runtime_state *ceval = &interp->runtime->ceval;
222 struct _ceval_state *ceval2 = &interp->ceval;
223 _Py_atomic_store_relaxed(&ceval->signals_pending, 1);
224 if (force) {
225 _Py_atomic_store_relaxed(&ceval2->eval_breaker, 1);
226 }
227 else {
228 /* eval_breaker is not set to 1 if thread_can_handle_signals() is false */
229 COMPUTE_EVAL_BREAKER(interp, ceval, ceval2);
230 }
231 }
232
233
234 static inline void
UNSIGNAL_PENDING_SIGNALS(PyInterpreterState * interp)235 UNSIGNAL_PENDING_SIGNALS(PyInterpreterState *interp)
236 {
237 struct _ceval_runtime_state *ceval = &interp->runtime->ceval;
238 struct _ceval_state *ceval2 = &interp->ceval;
239 _Py_atomic_store_relaxed(&ceval->signals_pending, 0);
240 COMPUTE_EVAL_BREAKER(interp, ceval, ceval2);
241 }
242
243
244 static inline void
SIGNAL_ASYNC_EXC(PyInterpreterState * interp)245 SIGNAL_ASYNC_EXC(PyInterpreterState *interp)
246 {
247 struct _ceval_state *ceval2 = &interp->ceval;
248 ceval2->pending.async_exc = 1;
249 _Py_atomic_store_relaxed(&ceval2->eval_breaker, 1);
250 }
251
252
253 static inline void
UNSIGNAL_ASYNC_EXC(PyInterpreterState * interp)254 UNSIGNAL_ASYNC_EXC(PyInterpreterState *interp)
255 {
256 struct _ceval_runtime_state *ceval = &interp->runtime->ceval;
257 struct _ceval_state *ceval2 = &interp->ceval;
258 ceval2->pending.async_exc = 0;
259 COMPUTE_EVAL_BREAKER(interp, ceval, ceval2);
260 }
261
262
263 #ifdef HAVE_ERRNO_H
264 #include <errno.h>
265 #endif
266 #include "ceval_gil.h"
267
268 void _Py_NO_RETURN
_Py_FatalError_TstateNULL(const char * func)269 _Py_FatalError_TstateNULL(const char *func)
270 {
271 _Py_FatalErrorFunc(func,
272 "the function must be called with the GIL held, "
273 "but the GIL is released "
274 "(the current Python thread state is NULL)");
275 }
276
277 #ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
278 int
_PyEval_ThreadsInitialized(PyInterpreterState * interp)279 _PyEval_ThreadsInitialized(PyInterpreterState *interp)
280 {
281 return gil_created(&interp->ceval.gil);
282 }
283
284 int
PyEval_ThreadsInitialized(void)285 PyEval_ThreadsInitialized(void)
286 {
287 // Fatal error if there is no current interpreter
288 PyInterpreterState *interp = PyInterpreterState_Get();
289 return _PyEval_ThreadsInitialized(interp);
290 }
291 #else
292 int
_PyEval_ThreadsInitialized(_PyRuntimeState * runtime)293 _PyEval_ThreadsInitialized(_PyRuntimeState *runtime)
294 {
295 return gil_created(&runtime->ceval.gil);
296 }
297
298 int
PyEval_ThreadsInitialized(void)299 PyEval_ThreadsInitialized(void)
300 {
301 _PyRuntimeState *runtime = &_PyRuntime;
302 return _PyEval_ThreadsInitialized(runtime);
303 }
304 #endif
305
306 PyStatus
_PyEval_InitGIL(PyThreadState * tstate)307 _PyEval_InitGIL(PyThreadState *tstate)
308 {
309 #ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
310 if (!_Py_IsMainInterpreter(tstate->interp)) {
311 /* Currently, the GIL is shared by all interpreters,
312 and only the main interpreter is responsible to create
313 and destroy it. */
314 return _PyStatus_OK();
315 }
316 #endif
317
318 #ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
319 struct _gil_runtime_state *gil = &tstate->interp->ceval.gil;
320 #else
321 struct _gil_runtime_state *gil = &tstate->interp->runtime->ceval.gil;
322 #endif
323 assert(!gil_created(gil));
324
325 PyThread_init_thread();
326 create_gil(gil);
327
328 take_gil(tstate);
329
330 assert(gil_created(gil));
331 return _PyStatus_OK();
332 }
333
334 void
_PyEval_FiniGIL(PyInterpreterState * interp)335 _PyEval_FiniGIL(PyInterpreterState *interp)
336 {
337 #ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
338 if (!_Py_IsMainInterpreter(interp)) {
339 /* Currently, the GIL is shared by all interpreters,
340 and only the main interpreter is responsible to create
341 and destroy it. */
342 return;
343 }
344 #endif
345
346 #ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
347 struct _gil_runtime_state *gil = &interp->ceval.gil;
348 #else
349 struct _gil_runtime_state *gil = &interp->runtime->ceval.gil;
350 #endif
351 if (!gil_created(gil)) {
352 /* First Py_InitializeFromConfig() call: the GIL doesn't exist
353 yet: do nothing. */
354 return;
355 }
356
357 destroy_gil(gil);
358 assert(!gil_created(gil));
359 }
360
361 void
PyEval_InitThreads(void)362 PyEval_InitThreads(void)
363 {
364 /* Do nothing: kept for backward compatibility */
365 }
366
367 void
_PyEval_Fini(void)368 _PyEval_Fini(void)
369 {
370 #if OPCACHE_STATS
371 fprintf(stderr, "-- Opcode cache number of objects = %zd\n",
372 opcache_code_objects);
373
374 fprintf(stderr, "-- Opcode cache total extra mem = %zd\n",
375 opcache_code_objects_extra_mem);
376
377 fprintf(stderr, "\n");
378
379 fprintf(stderr, "-- Opcode cache LOAD_GLOBAL hits = %zd (%d%%)\n",
380 opcache_global_hits,
381 (int) (100.0 * opcache_global_hits /
382 (opcache_global_hits + opcache_global_misses)));
383
384 fprintf(stderr, "-- Opcode cache LOAD_GLOBAL misses = %zd (%d%%)\n",
385 opcache_global_misses,
386 (int) (100.0 * opcache_global_misses /
387 (opcache_global_hits + opcache_global_misses)));
388
389 fprintf(stderr, "-- Opcode cache LOAD_GLOBAL opts = %zd\n",
390 opcache_global_opts);
391
392 fprintf(stderr, "\n");
393
394 fprintf(stderr, "-- Opcode cache LOAD_ATTR hits = %zd (%d%%)\n",
395 opcache_attr_hits,
396 (int) (100.0 * opcache_attr_hits /
397 opcache_attr_total));
398
399 fprintf(stderr, "-- Opcode cache LOAD_ATTR misses = %zd (%d%%)\n",
400 opcache_attr_misses,
401 (int) (100.0 * opcache_attr_misses /
402 opcache_attr_total));
403
404 fprintf(stderr, "-- Opcode cache LOAD_ATTR opts = %zd\n",
405 opcache_attr_opts);
406
407 fprintf(stderr, "-- Opcode cache LOAD_ATTR deopts = %zd\n",
408 opcache_attr_deopts);
409
410 fprintf(stderr, "-- Opcode cache LOAD_ATTR total = %zd\n",
411 opcache_attr_total);
412 #endif
413 }
414
415 void
PyEval_AcquireLock(void)416 PyEval_AcquireLock(void)
417 {
418 _PyRuntimeState *runtime = &_PyRuntime;
419 PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime);
420 _Py_EnsureTstateNotNULL(tstate);
421
422 take_gil(tstate);
423 }
424
425 void
PyEval_ReleaseLock(void)426 PyEval_ReleaseLock(void)
427 {
428 _PyRuntimeState *runtime = &_PyRuntime;
429 PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime);
430 /* This function must succeed when the current thread state is NULL.
431 We therefore avoid PyThreadState_Get() which dumps a fatal error
432 in debug mode. */
433 struct _ceval_runtime_state *ceval = &runtime->ceval;
434 struct _ceval_state *ceval2 = &tstate->interp->ceval;
435 drop_gil(ceval, ceval2, tstate);
436 }
437
438 void
_PyEval_ReleaseLock(PyThreadState * tstate)439 _PyEval_ReleaseLock(PyThreadState *tstate)
440 {
441 struct _ceval_runtime_state *ceval = &tstate->interp->runtime->ceval;
442 struct _ceval_state *ceval2 = &tstate->interp->ceval;
443 drop_gil(ceval, ceval2, tstate);
444 }
445
446 void
PyEval_AcquireThread(PyThreadState * tstate)447 PyEval_AcquireThread(PyThreadState *tstate)
448 {
449 _Py_EnsureTstateNotNULL(tstate);
450
451 take_gil(tstate);
452
453 struct _gilstate_runtime_state *gilstate = &tstate->interp->runtime->gilstate;
454 #ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
455 (void)_PyThreadState_Swap(gilstate, tstate);
456 #else
457 if (_PyThreadState_Swap(gilstate, tstate) != NULL) {
458 Py_FatalError("non-NULL old thread state");
459 }
460 #endif
461 }
462
463 void
PyEval_ReleaseThread(PyThreadState * tstate)464 PyEval_ReleaseThread(PyThreadState *tstate)
465 {
466 assert(is_tstate_valid(tstate));
467
468 _PyRuntimeState *runtime = tstate->interp->runtime;
469 PyThreadState *new_tstate = _PyThreadState_Swap(&runtime->gilstate, NULL);
470 if (new_tstate != tstate) {
471 Py_FatalError("wrong thread state");
472 }
473 struct _ceval_runtime_state *ceval = &runtime->ceval;
474 struct _ceval_state *ceval2 = &tstate->interp->ceval;
475 drop_gil(ceval, ceval2, tstate);
476 }
477
478 #ifdef HAVE_FORK
479 /* This function is called from PyOS_AfterFork_Child to destroy all threads
480 which are not running in the child process, and clear internal locks
481 which might be held by those threads. */
482 PyStatus
_PyEval_ReInitThreads(PyThreadState * tstate)483 _PyEval_ReInitThreads(PyThreadState *tstate)
484 {
485 _PyRuntimeState *runtime = tstate->interp->runtime;
486
487 #ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
488 struct _gil_runtime_state *gil = &tstate->interp->ceval.gil;
489 #else
490 struct _gil_runtime_state *gil = &runtime->ceval.gil;
491 #endif
492 if (!gil_created(gil)) {
493 return _PyStatus_OK();
494 }
495 recreate_gil(gil);
496
497 take_gil(tstate);
498
499 struct _pending_calls *pending = &tstate->interp->ceval.pending;
500 if (_PyThread_at_fork_reinit(&pending->lock) < 0) {
501 return _PyStatus_ERR("Can't reinitialize pending calls lock");
502 }
503
504 /* Destroy all threads except the current one */
505 _PyThreadState_DeleteExcept(runtime, tstate);
506 return _PyStatus_OK();
507 }
508 #endif
509
510 /* This function is used to signal that async exceptions are waiting to be
511 raised. */
512
513 void
_PyEval_SignalAsyncExc(PyInterpreterState * interp)514 _PyEval_SignalAsyncExc(PyInterpreterState *interp)
515 {
516 SIGNAL_ASYNC_EXC(interp);
517 }
518
519 PyThreadState *
PyEval_SaveThread(void)520 PyEval_SaveThread(void)
521 {
522 _PyRuntimeState *runtime = &_PyRuntime;
523 #ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
524 PyThreadState *old_tstate = _PyThreadState_GET();
525 PyThreadState *tstate = _PyThreadState_Swap(&runtime->gilstate, old_tstate);
526 #else
527 PyThreadState *tstate = _PyThreadState_Swap(&runtime->gilstate, NULL);
528 #endif
529 _Py_EnsureTstateNotNULL(tstate);
530
531 struct _ceval_runtime_state *ceval = &runtime->ceval;
532 struct _ceval_state *ceval2 = &tstate->interp->ceval;
533 #ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
534 assert(gil_created(&ceval2->gil));
535 #else
536 assert(gil_created(&ceval->gil));
537 #endif
538 drop_gil(ceval, ceval2, tstate);
539 return tstate;
540 }
541
542 void
PyEval_RestoreThread(PyThreadState * tstate)543 PyEval_RestoreThread(PyThreadState *tstate)
544 {
545 _Py_EnsureTstateNotNULL(tstate);
546
547 take_gil(tstate);
548
549 struct _gilstate_runtime_state *gilstate = &tstate->interp->runtime->gilstate;
550 _PyThreadState_Swap(gilstate, tstate);
551 }
552
553
554 /* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
555 signal handlers or Mac I/O completion routines) can schedule calls
556 to a function to be called synchronously.
557 The synchronous function is called with one void* argument.
558 It should return 0 for success or -1 for failure -- failure should
559 be accompanied by an exception.
560
561 If registry succeeds, the registry function returns 0; if it fails
562 (e.g. due to too many pending calls) it returns -1 (without setting
563 an exception condition).
564
565 Note that because registry may occur from within signal handlers,
566 or other asynchronous events, calling malloc() is unsafe!
567
568 Any thread can schedule pending calls, but only the main thread
569 will execute them.
570 There is no facility to schedule calls to a particular thread, but
571 that should be easy to change, should that ever be required. In
572 that case, the static variables here should go into the python
573 threadstate.
574 */
575
576 void
_PyEval_SignalReceived(PyInterpreterState * interp)577 _PyEval_SignalReceived(PyInterpreterState *interp)
578 {
579 #ifdef MS_WINDOWS
580 // bpo-42296: On Windows, _PyEval_SignalReceived() is called from a signal
581 // handler which can run in a thread different than the Python thread, in
582 // which case _Py_ThreadCanHandleSignals() is wrong. Ignore
583 // _Py_ThreadCanHandleSignals() and always set eval_breaker to 1.
584 //
585 // The next eval_frame_handle_pending() call will call
586 // _Py_ThreadCanHandleSignals() to recompute eval_breaker.
587 int force = 1;
588 #else
589 int force = 0;
590 #endif
591 /* bpo-30703: Function called when the C signal handler of Python gets a
592 signal. We cannot queue a callback using _PyEval_AddPendingCall() since
593 that function is not async-signal-safe. */
594 SIGNAL_PENDING_SIGNALS(interp, force);
595 }
596
597 /* Push one item onto the queue while holding the lock. */
598 static int
_push_pending_call(struct _pending_calls * pending,int (* func)(void *),void * arg)599 _push_pending_call(struct _pending_calls *pending,
600 int (*func)(void *), void *arg)
601 {
602 int i = pending->last;
603 int j = (i + 1) % NPENDINGCALLS;
604 if (j == pending->first) {
605 return -1; /* Queue full */
606 }
607 pending->calls[i].func = func;
608 pending->calls[i].arg = arg;
609 pending->last = j;
610 return 0;
611 }
612
613 /* Pop one item off the queue while holding the lock. */
614 static void
_pop_pending_call(struct _pending_calls * pending,int (** func)(void *),void ** arg)615 _pop_pending_call(struct _pending_calls *pending,
616 int (**func)(void *), void **arg)
617 {
618 int i = pending->first;
619 if (i == pending->last) {
620 return; /* Queue empty */
621 }
622
623 *func = pending->calls[i].func;
624 *arg = pending->calls[i].arg;
625 pending->first = (i + 1) % NPENDINGCALLS;
626 }
627
628 /* This implementation is thread-safe. It allows
629 scheduling to be made from any thread, and even from an executing
630 callback.
631 */
632
633 int
_PyEval_AddPendingCall(PyInterpreterState * interp,int (* func)(void *),void * arg)634 _PyEval_AddPendingCall(PyInterpreterState *interp,
635 int (*func)(void *), void *arg)
636 {
637 struct _pending_calls *pending = &interp->ceval.pending;
638
639 /* Ensure that _PyEval_InitPendingCalls() was called
640 and that _PyEval_FiniPendingCalls() is not called yet. */
641 assert(pending->lock != NULL);
642
643 PyThread_acquire_lock(pending->lock, WAIT_LOCK);
644 int result = _push_pending_call(pending, func, arg);
645 PyThread_release_lock(pending->lock);
646
647 /* signal main loop */
648 SIGNAL_PENDING_CALLS(interp);
649 return result;
650 }
651
652 int
Py_AddPendingCall(int (* func)(void *),void * arg)653 Py_AddPendingCall(int (*func)(void *), void *arg)
654 {
655 /* Best-effort to support subinterpreters and calls with the GIL released.
656
657 First attempt _PyThreadState_GET() since it supports subinterpreters.
658
659 If the GIL is released, _PyThreadState_GET() returns NULL . In this
660 case, use PyGILState_GetThisThreadState() which works even if the GIL
661 is released.
662
663 Sadly, PyGILState_GetThisThreadState() doesn't support subinterpreters:
664 see bpo-10915 and bpo-15751.
665
666 Py_AddPendingCall() doesn't require the caller to hold the GIL. */
667 PyThreadState *tstate = _PyThreadState_GET();
668 if (tstate == NULL) {
669 tstate = PyGILState_GetThisThreadState();
670 }
671
672 PyInterpreterState *interp;
673 if (tstate != NULL) {
674 interp = tstate->interp;
675 }
676 else {
677 /* Last resort: use the main interpreter */
678 interp = _PyRuntime.interpreters.main;
679 }
680 return _PyEval_AddPendingCall(interp, func, arg);
681 }
682
683 static int
handle_signals(PyThreadState * tstate)684 handle_signals(PyThreadState *tstate)
685 {
686 assert(is_tstate_valid(tstate));
687 if (!_Py_ThreadCanHandleSignals(tstate->interp)) {
688 return 0;
689 }
690
691 UNSIGNAL_PENDING_SIGNALS(tstate->interp);
692 if (_PyErr_CheckSignalsTstate(tstate) < 0) {
693 /* On failure, re-schedule a call to handle_signals(). */
694 SIGNAL_PENDING_SIGNALS(tstate->interp, 0);
695 return -1;
696 }
697 return 0;
698 }
699
700 static int
make_pending_calls(PyInterpreterState * interp)701 make_pending_calls(PyInterpreterState *interp)
702 {
703 /* only execute pending calls on main thread */
704 if (!_Py_ThreadCanHandlePendingCalls()) {
705 return 0;
706 }
707
708 /* don't perform recursive pending calls */
709 static int busy = 0;
710 if (busy) {
711 return 0;
712 }
713 busy = 1;
714
715 /* unsignal before starting to call callbacks, so that any callback
716 added in-between re-signals */
717 UNSIGNAL_PENDING_CALLS(interp);
718 int res = 0;
719
720 /* perform a bounded number of calls, in case of recursion */
721 struct _pending_calls *pending = &interp->ceval.pending;
722 for (int i=0; i<NPENDINGCALLS; i++) {
723 int (*func)(void *) = NULL;
724 void *arg = NULL;
725
726 /* pop one item off the queue while holding the lock */
727 PyThread_acquire_lock(pending->lock, WAIT_LOCK);
728 _pop_pending_call(pending, &func, &arg);
729 PyThread_release_lock(pending->lock);
730
731 /* having released the lock, perform the callback */
732 if (func == NULL) {
733 break;
734 }
735 res = func(arg);
736 if (res) {
737 goto error;
738 }
739 }
740
741 busy = 0;
742 return res;
743
744 error:
745 busy = 0;
746 SIGNAL_PENDING_CALLS(interp);
747 return res;
748 }
749
750 void
_Py_FinishPendingCalls(PyThreadState * tstate)751 _Py_FinishPendingCalls(PyThreadState *tstate)
752 {
753 assert(PyGILState_Check());
754 assert(is_tstate_valid(tstate));
755
756 struct _pending_calls *pending = &tstate->interp->ceval.pending;
757
758 if (!_Py_atomic_load_relaxed(&(pending->calls_to_do))) {
759 return;
760 }
761
762 if (make_pending_calls(tstate->interp) < 0) {
763 PyObject *exc, *val, *tb;
764 _PyErr_Fetch(tstate, &exc, &val, &tb);
765 PyErr_BadInternalCall();
766 _PyErr_ChainExceptions(exc, val, tb);
767 _PyErr_Print(tstate);
768 }
769 }
770
771 /* Py_MakePendingCalls() is a simple wrapper for the sake
772 of backward-compatibility. */
773 int
Py_MakePendingCalls(void)774 Py_MakePendingCalls(void)
775 {
776 assert(PyGILState_Check());
777
778 PyThreadState *tstate = _PyThreadState_GET();
779 assert(is_tstate_valid(tstate));
780
781 /* Python signal handler doesn't really queue a callback: it only signals
782 that a signal was received, see _PyEval_SignalReceived(). */
783 int res = handle_signals(tstate);
784 if (res != 0) {
785 return res;
786 }
787
788 res = make_pending_calls(tstate->interp);
789 if (res != 0) {
790 return res;
791 }
792
793 return 0;
794 }
795
796 /* The interpreter's recursion limit */
797
798 #ifndef Py_DEFAULT_RECURSION_LIMIT
799 # define Py_DEFAULT_RECURSION_LIMIT 1000
800 #endif
801
802 void
_PyEval_InitRuntimeState(struct _ceval_runtime_state * ceval)803 _PyEval_InitRuntimeState(struct _ceval_runtime_state *ceval)
804 {
805 #ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
806 _gil_initialize(&ceval->gil);
807 #endif
808 }
809
810 int
_PyEval_InitState(struct _ceval_state * ceval)811 _PyEval_InitState(struct _ceval_state *ceval)
812 {
813 ceval->recursion_limit = Py_DEFAULT_RECURSION_LIMIT;
814
815 struct _pending_calls *pending = &ceval->pending;
816 assert(pending->lock == NULL);
817
818 pending->lock = PyThread_allocate_lock();
819 if (pending->lock == NULL) {
820 return -1;
821 }
822
823 #ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
824 _gil_initialize(&ceval->gil);
825 #endif
826
827 return 0;
828 }
829
830 void
_PyEval_FiniState(struct _ceval_state * ceval)831 _PyEval_FiniState(struct _ceval_state *ceval)
832 {
833 struct _pending_calls *pending = &ceval->pending;
834 if (pending->lock != NULL) {
835 PyThread_free_lock(pending->lock);
836 pending->lock = NULL;
837 }
838 }
839
840 int
Py_GetRecursionLimit(void)841 Py_GetRecursionLimit(void)
842 {
843 PyInterpreterState *interp = _PyInterpreterState_GET();
844 return interp->ceval.recursion_limit;
845 }
846
847 void
Py_SetRecursionLimit(int new_limit)848 Py_SetRecursionLimit(int new_limit)
849 {
850 PyThreadState *tstate = _PyThreadState_GET();
851 tstate->interp->ceval.recursion_limit = new_limit;
852 }
853
854 /* The function _Py_EnterRecursiveCall() only calls _Py_CheckRecursiveCall()
855 if the recursion_depth reaches recursion_limit.
856 If USE_STACKCHECK, the macro decrements recursion_limit
857 to guarantee that _Py_CheckRecursiveCall() is regularly called.
858 Without USE_STACKCHECK, there is no need for this. */
859 int
_Py_CheckRecursiveCall(PyThreadState * tstate,const char * where)860 _Py_CheckRecursiveCall(PyThreadState *tstate, const char *where)
861 {
862 int recursion_limit = tstate->interp->ceval.recursion_limit;
863
864 #ifdef USE_STACKCHECK
865 tstate->stackcheck_counter = 0;
866 if (PyOS_CheckStack()) {
867 --tstate->recursion_depth;
868 _PyErr_SetString(tstate, PyExc_MemoryError, "Stack overflow");
869 return -1;
870 }
871 #endif
872 if (tstate->recursion_headroom) {
873 if (tstate->recursion_depth > recursion_limit + 50) {
874 /* Overflowing while handling an overflow. Give up. */
875 Py_FatalError("Cannot recover from stack overflow.");
876 }
877 }
878 else {
879 if (tstate->recursion_depth > recursion_limit) {
880 tstate->recursion_headroom++;
881 _PyErr_Format(tstate, PyExc_RecursionError,
882 "maximum recursion depth exceeded%s",
883 where);
884 tstate->recursion_headroom--;
885 --tstate->recursion_depth;
886 return -1;
887 }
888 }
889 return 0;
890 }
891
892
893 // PEP 634: Structural Pattern Matching
894
895
896 // Return a tuple of values corresponding to keys, with error checks for
897 // duplicate/missing keys.
898 static PyObject*
match_keys(PyThreadState * tstate,PyObject * map,PyObject * keys)899 match_keys(PyThreadState *tstate, PyObject *map, PyObject *keys)
900 {
901 assert(PyTuple_CheckExact(keys));
902 Py_ssize_t nkeys = PyTuple_GET_SIZE(keys);
903 if (!nkeys) {
904 // No keys means no items.
905 return PyTuple_New(0);
906 }
907 PyObject *seen = NULL;
908 PyObject *dummy = NULL;
909 PyObject *values = NULL;
910 // We use the two argument form of map.get(key, default) for two reasons:
911 // - Atomically check for a key and get its value without error handling.
912 // - Don't cause key creation or resizing in dict subclasses like
913 // collections.defaultdict that define __missing__ (or similar).
914 _Py_IDENTIFIER(get);
915 PyObject *get = _PyObject_GetAttrId(map, &PyId_get);
916 if (get == NULL) {
917 goto fail;
918 }
919 seen = PySet_New(NULL);
920 if (seen == NULL) {
921 goto fail;
922 }
923 // dummy = object()
924 dummy = _PyObject_CallNoArg((PyObject *)&PyBaseObject_Type);
925 if (dummy == NULL) {
926 goto fail;
927 }
928 values = PyList_New(0);
929 if (values == NULL) {
930 goto fail;
931 }
932 for (Py_ssize_t i = 0; i < nkeys; i++) {
933 PyObject *key = PyTuple_GET_ITEM(keys, i);
934 if (PySet_Contains(seen, key) || PySet_Add(seen, key)) {
935 if (!_PyErr_Occurred(tstate)) {
936 // Seen it before!
937 _PyErr_Format(tstate, PyExc_ValueError,
938 "mapping pattern checks duplicate key (%R)", key);
939 }
940 goto fail;
941 }
942 PyObject *value = PyObject_CallFunctionObjArgs(get, key, dummy, NULL);
943 if (value == NULL) {
944 goto fail;
945 }
946 if (value == dummy) {
947 // key not in map!
948 Py_DECREF(value);
949 Py_DECREF(values);
950 // Return None:
951 Py_INCREF(Py_None);
952 values = Py_None;
953 goto done;
954 }
955 PyList_Append(values, value);
956 Py_DECREF(value);
957 }
958 Py_SETREF(values, PyList_AsTuple(values));
959 // Success:
960 done:
961 Py_DECREF(get);
962 Py_DECREF(seen);
963 Py_DECREF(dummy);
964 return values;
965 fail:
966 Py_XDECREF(get);
967 Py_XDECREF(seen);
968 Py_XDECREF(dummy);
969 Py_XDECREF(values);
970 return NULL;
971 }
972
973 // Extract a named attribute from the subject, with additional bookkeeping to
974 // raise TypeErrors for repeated lookups. On failure, return NULL (with no
975 // error set). Use _PyErr_Occurred(tstate) to disambiguate.
976 static PyObject*
match_class_attr(PyThreadState * tstate,PyObject * subject,PyObject * type,PyObject * name,PyObject * seen)977 match_class_attr(PyThreadState *tstate, PyObject *subject, PyObject *type,
978 PyObject *name, PyObject *seen)
979 {
980 assert(PyUnicode_CheckExact(name));
981 assert(PySet_CheckExact(seen));
982 if (PySet_Contains(seen, name) || PySet_Add(seen, name)) {
983 if (!_PyErr_Occurred(tstate)) {
984 // Seen it before!
985 _PyErr_Format(tstate, PyExc_TypeError,
986 "%s() got multiple sub-patterns for attribute %R",
987 ((PyTypeObject*)type)->tp_name, name);
988 }
989 return NULL;
990 }
991 PyObject *attr = PyObject_GetAttr(subject, name);
992 if (attr == NULL && _PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) {
993 _PyErr_Clear(tstate);
994 }
995 return attr;
996 }
997
998 // On success (match), return a tuple of extracted attributes. On failure (no
999 // match), return NULL. Use _PyErr_Occurred(tstate) to disambiguate.
1000 static PyObject*
match_class(PyThreadState * tstate,PyObject * subject,PyObject * type,Py_ssize_t nargs,PyObject * kwargs)1001 match_class(PyThreadState *tstate, PyObject *subject, PyObject *type,
1002 Py_ssize_t nargs, PyObject *kwargs)
1003 {
1004 if (!PyType_Check(type)) {
1005 const char *e = "called match pattern must be a type";
1006 _PyErr_Format(tstate, PyExc_TypeError, e);
1007 return NULL;
1008 }
1009 assert(PyTuple_CheckExact(kwargs));
1010 // First, an isinstance check:
1011 if (PyObject_IsInstance(subject, type) <= 0) {
1012 return NULL;
1013 }
1014 // So far so good:
1015 PyObject *seen = PySet_New(NULL);
1016 if (seen == NULL) {
1017 return NULL;
1018 }
1019 PyObject *attrs = PyList_New(0);
1020 if (attrs == NULL) {
1021 Py_DECREF(seen);
1022 return NULL;
1023 }
1024 // NOTE: From this point on, goto fail on failure:
1025 PyObject *match_args = NULL;
1026 // First, the positional subpatterns:
1027 if (nargs) {
1028 int match_self = 0;
1029 match_args = PyObject_GetAttrString(type, "__match_args__");
1030 if (match_args) {
1031 if (!PyTuple_CheckExact(match_args)) {
1032 const char *e = "%s.__match_args__ must be a tuple (got %s)";
1033 _PyErr_Format(tstate, PyExc_TypeError, e,
1034 ((PyTypeObject *)type)->tp_name,
1035 Py_TYPE(match_args)->tp_name);
1036 goto fail;
1037 }
1038 }
1039 else if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) {
1040 _PyErr_Clear(tstate);
1041 // _Py_TPFLAGS_MATCH_SELF is only acknowledged if the type does not
1042 // define __match_args__. This is natural behavior for subclasses:
1043 // it's as if __match_args__ is some "magic" value that is lost as
1044 // soon as they redefine it.
1045 match_args = PyTuple_New(0);
1046 match_self = PyType_HasFeature((PyTypeObject*)type,
1047 _Py_TPFLAGS_MATCH_SELF);
1048 }
1049 else {
1050 goto fail;
1051 }
1052 assert(PyTuple_CheckExact(match_args));
1053 Py_ssize_t allowed = match_self ? 1 : PyTuple_GET_SIZE(match_args);
1054 if (allowed < nargs) {
1055 const char *plural = (allowed == 1) ? "" : "s";
1056 _PyErr_Format(tstate, PyExc_TypeError,
1057 "%s() accepts %d positional sub-pattern%s (%d given)",
1058 ((PyTypeObject*)type)->tp_name,
1059 allowed, plural, nargs);
1060 goto fail;
1061 }
1062 if (match_self) {
1063 // Easy. Copy the subject itself, and move on to kwargs.
1064 PyList_Append(attrs, subject);
1065 }
1066 else {
1067 for (Py_ssize_t i = 0; i < nargs; i++) {
1068 PyObject *name = PyTuple_GET_ITEM(match_args, i);
1069 if (!PyUnicode_CheckExact(name)) {
1070 _PyErr_Format(tstate, PyExc_TypeError,
1071 "__match_args__ elements must be strings "
1072 "(got %s)", Py_TYPE(name)->tp_name);
1073 goto fail;
1074 }
1075 PyObject *attr = match_class_attr(tstate, subject, type, name,
1076 seen);
1077 if (attr == NULL) {
1078 goto fail;
1079 }
1080 PyList_Append(attrs, attr);
1081 Py_DECREF(attr);
1082 }
1083 }
1084 Py_CLEAR(match_args);
1085 }
1086 // Finally, the keyword subpatterns:
1087 for (Py_ssize_t i = 0; i < PyTuple_GET_SIZE(kwargs); i++) {
1088 PyObject *name = PyTuple_GET_ITEM(kwargs, i);
1089 PyObject *attr = match_class_attr(tstate, subject, type, name, seen);
1090 if (attr == NULL) {
1091 goto fail;
1092 }
1093 PyList_Append(attrs, attr);
1094 Py_DECREF(attr);
1095 }
1096 Py_SETREF(attrs, PyList_AsTuple(attrs));
1097 Py_DECREF(seen);
1098 return attrs;
1099 fail:
1100 // We really don't care whether an error was raised or not... that's our
1101 // caller's problem. All we know is that the match failed.
1102 Py_XDECREF(match_args);
1103 Py_DECREF(seen);
1104 Py_DECREF(attrs);
1105 return NULL;
1106 }
1107
1108
1109 static int do_raise(PyThreadState *tstate, PyObject *exc, PyObject *cause);
1110 static int unpack_iterable(PyThreadState *, PyObject *, int, int, PyObject **);
1111
1112
1113 PyObject *
PyEval_EvalCode(PyObject * co,PyObject * globals,PyObject * locals)1114 PyEval_EvalCode(PyObject *co, PyObject *globals, PyObject *locals)
1115 {
1116 PyThreadState *tstate = PyThreadState_GET();
1117 if (locals == NULL) {
1118 locals = globals;
1119 }
1120 PyObject *builtins = _PyEval_BuiltinsFromGlobals(tstate, globals); // borrowed ref
1121 if (builtins == NULL) {
1122 return NULL;
1123 }
1124 PyFrameConstructor desc = {
1125 .fc_globals = globals,
1126 .fc_builtins = builtins,
1127 .fc_name = ((PyCodeObject *)co)->co_name,
1128 .fc_qualname = ((PyCodeObject *)co)->co_name,
1129 .fc_code = co,
1130 .fc_defaults = NULL,
1131 .fc_kwdefaults = NULL,
1132 .fc_closure = NULL
1133 };
1134 return _PyEval_Vector(tstate, &desc, locals, NULL, 0, NULL);
1135 }
1136
1137
1138 /* Interpreter main loop */
1139
1140 PyObject *
PyEval_EvalFrame(PyFrameObject * f)1141 PyEval_EvalFrame(PyFrameObject *f)
1142 {
1143 /* Function kept for backward compatibility */
1144 PyThreadState *tstate = _PyThreadState_GET();
1145 return _PyEval_EvalFrame(tstate, f, 0);
1146 }
1147
1148 PyObject *
PyEval_EvalFrameEx(PyFrameObject * f,int throwflag)1149 PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
1150 {
1151 PyThreadState *tstate = _PyThreadState_GET();
1152 return _PyEval_EvalFrame(tstate, f, throwflag);
1153 }
1154
1155
1156 /* Handle signals, pending calls, GIL drop request
1157 and asynchronous exception */
1158 static int
eval_frame_handle_pending(PyThreadState * tstate)1159 eval_frame_handle_pending(PyThreadState *tstate)
1160 {
1161 _PyRuntimeState * const runtime = &_PyRuntime;
1162 struct _ceval_runtime_state *ceval = &runtime->ceval;
1163
1164 /* Pending signals */
1165 if (_Py_atomic_load_relaxed(&ceval->signals_pending)) {
1166 if (handle_signals(tstate) != 0) {
1167 return -1;
1168 }
1169 }
1170
1171 /* Pending calls */
1172 struct _ceval_state *ceval2 = &tstate->interp->ceval;
1173 if (_Py_atomic_load_relaxed(&ceval2->pending.calls_to_do)) {
1174 if (make_pending_calls(tstate->interp) != 0) {
1175 return -1;
1176 }
1177 }
1178
1179 /* GIL drop request */
1180 if (_Py_atomic_load_relaxed(&ceval2->gil_drop_request)) {
1181 /* Give another thread a chance */
1182 if (_PyThreadState_Swap(&runtime->gilstate, NULL) != tstate) {
1183 Py_FatalError("tstate mix-up");
1184 }
1185 drop_gil(ceval, ceval2, tstate);
1186
1187 /* Other threads may run now */
1188
1189 take_gil(tstate);
1190
1191 #ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
1192 (void)_PyThreadState_Swap(&runtime->gilstate, tstate);
1193 #else
1194 if (_PyThreadState_Swap(&runtime->gilstate, tstate) != NULL) {
1195 Py_FatalError("orphan tstate");
1196 }
1197 #endif
1198 }
1199
1200 /* Check for asynchronous exception. */
1201 if (tstate->async_exc != NULL) {
1202 PyObject *exc = tstate->async_exc;
1203 tstate->async_exc = NULL;
1204 UNSIGNAL_ASYNC_EXC(tstate->interp);
1205 _PyErr_SetNone(tstate, exc);
1206 Py_DECREF(exc);
1207 return -1;
1208 }
1209
1210 #ifdef MS_WINDOWS
1211 // bpo-42296: On Windows, _PyEval_SignalReceived() can be called in a
1212 // different thread than the Python thread, in which case
1213 // _Py_ThreadCanHandleSignals() is wrong. Recompute eval_breaker in the
1214 // current Python thread with the correct _Py_ThreadCanHandleSignals()
1215 // value. It prevents to interrupt the eval loop at every instruction if
1216 // the current Python thread cannot handle signals (if
1217 // _Py_ThreadCanHandleSignals() is false).
1218 COMPUTE_EVAL_BREAKER(tstate->interp, ceval, ceval2);
1219 #endif
1220
1221 return 0;
1222 }
1223
1224
1225 /* Computed GOTOs, or
1226 the-optimization-commonly-but-improperly-known-as-"threaded code"
1227 using gcc's labels-as-values extension
1228 (http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html).
1229
1230 The traditional bytecode evaluation loop uses a "switch" statement, which
1231 decent compilers will optimize as a single indirect branch instruction
1232 combined with a lookup table of jump addresses. However, since the
1233 indirect jump instruction is shared by all opcodes, the CPU will have a
1234 hard time making the right prediction for where to jump next (actually,
1235 it will be always wrong except in the uncommon case of a sequence of
1236 several identical opcodes).
1237
1238 "Threaded code" in contrast, uses an explicit jump table and an explicit
1239 indirect jump instruction at the end of each opcode. Since the jump
1240 instruction is at a different address for each opcode, the CPU will make a
1241 separate prediction for each of these instructions, which is equivalent to
1242 predicting the second opcode of each opcode pair. These predictions have
1243 a much better chance to turn out valid, especially in small bytecode loops.
1244
1245 A mispredicted branch on a modern CPU flushes the whole pipeline and
1246 can cost several CPU cycles (depending on the pipeline depth),
1247 and potentially many more instructions (depending on the pipeline width).
1248 A correctly predicted branch, however, is nearly free.
1249
1250 At the time of this writing, the "threaded code" version is up to 15-20%
1251 faster than the normal "switch" version, depending on the compiler and the
1252 CPU architecture.
1253
1254 We disable the optimization if DYNAMIC_EXECUTION_PROFILE is defined,
1255 because it would render the measurements invalid.
1256
1257
1258 NOTE: care must be taken that the compiler doesn't try to "optimize" the
1259 indirect jumps by sharing them between all opcodes. Such optimizations
1260 can be disabled on gcc by using the -fno-gcse flag (or possibly
1261 -fno-crossjumping).
1262 */
1263
1264 /* Use macros rather than inline functions, to make it as clear as possible
1265 * to the C compiler that the tracing check is a simple test then branch.
1266 * We want to be sure that the compiler knows this before it generates
1267 * the CFG.
1268 */
1269 #ifdef LLTRACE
1270 #define OR_LLTRACE || lltrace
1271 #else
1272 #define OR_LLTRACE
1273 #endif
1274
1275 #ifdef WITH_DTRACE
1276 #define OR_DTRACE_LINE || PyDTrace_LINE_ENABLED()
1277 #else
1278 #define OR_DTRACE_LINE
1279 #endif
1280
1281 #ifdef DYNAMIC_EXECUTION_PROFILE
1282 #undef USE_COMPUTED_GOTOS
1283 #define USE_COMPUTED_GOTOS 0
1284 #endif
1285
1286 #ifdef HAVE_COMPUTED_GOTOS
1287 #ifndef USE_COMPUTED_GOTOS
1288 #define USE_COMPUTED_GOTOS 1
1289 #endif
1290 #else
1291 #if defined(USE_COMPUTED_GOTOS) && USE_COMPUTED_GOTOS
1292 #error "Computed gotos are not supported on this compiler."
1293 #endif
1294 #undef USE_COMPUTED_GOTOS
1295 #define USE_COMPUTED_GOTOS 0
1296 #endif
1297
1298 #if USE_COMPUTED_GOTOS
1299 #define TARGET(op) op: TARGET_##op
1300 #define DISPATCH() \
1301 { \
1302 if (trace_info.cframe.use_tracing OR_DTRACE_LINE OR_LLTRACE) { \
1303 goto tracing_dispatch; \
1304 } \
1305 f->f_lasti = INSTR_OFFSET(); \
1306 NEXTOPARG(); \
1307 goto *opcode_targets[opcode]; \
1308 }
1309 #else
1310 #define TARGET(op) op
1311 #define DISPATCH() goto predispatch;
1312 #endif
1313
1314
1315 #define CHECK_EVAL_BREAKER() \
1316 if (_Py_atomic_load_relaxed(eval_breaker)) { \
1317 continue; \
1318 }
1319
1320
1321 /* Tuple access macros */
1322
1323 #ifndef Py_DEBUG
1324 #define GETITEM(v, i) PyTuple_GET_ITEM((PyTupleObject *)(v), (i))
1325 #else
1326 #define GETITEM(v, i) PyTuple_GetItem((v), (i))
1327 #endif
1328
1329 /* Code access macros */
1330
1331 /* The integer overflow is checked by an assertion below. */
1332 #define INSTR_OFFSET() ((int)(next_instr - first_instr))
1333 #define NEXTOPARG() do { \
1334 _Py_CODEUNIT word = *next_instr; \
1335 opcode = _Py_OPCODE(word); \
1336 oparg = _Py_OPARG(word); \
1337 next_instr++; \
1338 } while (0)
1339 #define JUMPTO(x) (next_instr = first_instr + (x))
1340 #define JUMPBY(x) (next_instr += (x))
1341
1342 /* OpCode prediction macros
1343 Some opcodes tend to come in pairs thus making it possible to
1344 predict the second code when the first is run. For example,
1345 COMPARE_OP is often followed by POP_JUMP_IF_FALSE or POP_JUMP_IF_TRUE.
1346
1347 Verifying the prediction costs a single high-speed test of a register
1348 variable against a constant. If the pairing was good, then the
1349 processor's own internal branch predication has a high likelihood of
1350 success, resulting in a nearly zero-overhead transition to the
1351 next opcode. A successful prediction saves a trip through the eval-loop
1352 including its unpredictable switch-case branch. Combined with the
1353 processor's internal branch prediction, a successful PREDICT has the
1354 effect of making the two opcodes run as if they were a single new opcode
1355 with the bodies combined.
1356
1357 If collecting opcode statistics, your choices are to either keep the
1358 predictions turned-on and interpret the results as if some opcodes
1359 had been combined or turn-off predictions so that the opcode frequency
1360 counter updates for both opcodes.
1361
1362 Opcode prediction is disabled with threaded code, since the latter allows
1363 the CPU to record separate branch prediction information for each
1364 opcode.
1365
1366 */
1367
1368 #define PREDICT_ID(op) PRED_##op
1369
1370 #if defined(DYNAMIC_EXECUTION_PROFILE) || USE_COMPUTED_GOTOS
1371 #define PREDICT(op) if (0) goto PREDICT_ID(op)
1372 #else
1373 #define PREDICT(op) \
1374 do { \
1375 _Py_CODEUNIT word = *next_instr; \
1376 opcode = _Py_OPCODE(word); \
1377 if (opcode == op) { \
1378 oparg = _Py_OPARG(word); \
1379 next_instr++; \
1380 goto PREDICT_ID(op); \
1381 } \
1382 } while(0)
1383 #endif
1384 #define PREDICTED(op) PREDICT_ID(op):
1385
1386
1387 /* Stack manipulation macros */
1388
1389 /* The stack can grow at most MAXINT deep, as co_nlocals and
1390 co_stacksize are ints. */
1391 #define STACK_LEVEL() ((int)(stack_pointer - f->f_valuestack))
1392 #define EMPTY() (STACK_LEVEL() == 0)
1393 #define TOP() (stack_pointer[-1])
1394 #define SECOND() (stack_pointer[-2])
1395 #define THIRD() (stack_pointer[-3])
1396 #define FOURTH() (stack_pointer[-4])
1397 #define PEEK(n) (stack_pointer[-(n)])
1398 #define SET_TOP(v) (stack_pointer[-1] = (v))
1399 #define SET_SECOND(v) (stack_pointer[-2] = (v))
1400 #define SET_THIRD(v) (stack_pointer[-3] = (v))
1401 #define SET_FOURTH(v) (stack_pointer[-4] = (v))
1402 #define BASIC_STACKADJ(n) (stack_pointer += n)
1403 #define BASIC_PUSH(v) (*stack_pointer++ = (v))
1404 #define BASIC_POP() (*--stack_pointer)
1405
1406 #ifdef LLTRACE
1407 #define PUSH(v) { (void)(BASIC_PUSH(v), \
1408 lltrace && prtrace(tstate, TOP(), "push")); \
1409 assert(STACK_LEVEL() <= co->co_stacksize); }
1410 #define POP() ((void)(lltrace && prtrace(tstate, TOP(), "pop")), \
1411 BASIC_POP())
1412 #define STACK_GROW(n) do { \
1413 assert(n >= 0); \
1414 (void)(BASIC_STACKADJ(n), \
1415 lltrace && prtrace(tstate, TOP(), "stackadj")); \
1416 assert(STACK_LEVEL() <= co->co_stacksize); \
1417 } while (0)
1418 #define STACK_SHRINK(n) do { \
1419 assert(n >= 0); \
1420 (void)(lltrace && prtrace(tstate, TOP(), "stackadj")); \
1421 (void)(BASIC_STACKADJ(-n)); \
1422 assert(STACK_LEVEL() <= co->co_stacksize); \
1423 } while (0)
1424 #define EXT_POP(STACK_POINTER) ((void)(lltrace && \
1425 prtrace(tstate, (STACK_POINTER)[-1], "ext_pop")), \
1426 *--(STACK_POINTER))
1427 #else
1428 #define PUSH(v) BASIC_PUSH(v)
1429 #define POP() BASIC_POP()
1430 #define STACK_GROW(n) BASIC_STACKADJ(n)
1431 #define STACK_SHRINK(n) BASIC_STACKADJ(-n)
1432 #define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
1433 #endif
1434
1435 /* Local variable macros */
1436
1437 #define GETLOCAL(i) (fastlocals[i])
1438
1439 /* The SETLOCAL() macro must not DECREF the local variable in-place and
1440 then store the new value; it must copy the old value to a temporary
1441 value, then store the new value, and then DECREF the temporary value.
1442 This is because it is possible that during the DECREF the frame is
1443 accessed by other code (e.g. a __del__ method or gc.collect()) and the
1444 variable would be pointing to already-freed memory. */
1445 #define SETLOCAL(i, value) do { PyObject *tmp = GETLOCAL(i); \
1446 GETLOCAL(i) = value; \
1447 Py_XDECREF(tmp); } while (0)
1448
1449
1450 #define UNWIND_BLOCK(b) \
1451 while (STACK_LEVEL() > (b)->b_level) { \
1452 PyObject *v = POP(); \
1453 Py_XDECREF(v); \
1454 }
1455
1456 #define UNWIND_EXCEPT_HANDLER(b) \
1457 do { \
1458 PyObject *type, *value, *traceback; \
1459 _PyErr_StackItem *exc_info; \
1460 assert(STACK_LEVEL() >= (b)->b_level + 3); \
1461 while (STACK_LEVEL() > (b)->b_level + 3) { \
1462 value = POP(); \
1463 Py_XDECREF(value); \
1464 } \
1465 exc_info = tstate->exc_info; \
1466 type = exc_info->exc_type; \
1467 value = exc_info->exc_value; \
1468 traceback = exc_info->exc_traceback; \
1469 exc_info->exc_type = POP(); \
1470 exc_info->exc_value = POP(); \
1471 exc_info->exc_traceback = POP(); \
1472 Py_XDECREF(type); \
1473 Py_XDECREF(value); \
1474 Py_XDECREF(traceback); \
1475 } while(0)
1476
1477 /* macros for opcode cache */
1478 #define OPCACHE_CHECK() \
1479 do { \
1480 co_opcache = NULL; \
1481 if (co->co_opcache != NULL) { \
1482 unsigned char co_opcache_offset = \
1483 co->co_opcache_map[next_instr - first_instr]; \
1484 if (co_opcache_offset > 0) { \
1485 assert(co_opcache_offset <= co->co_opcache_size); \
1486 co_opcache = &co->co_opcache[co_opcache_offset - 1]; \
1487 assert(co_opcache != NULL); \
1488 } \
1489 } \
1490 } while (0)
1491
1492 #define OPCACHE_DEOPT() \
1493 do { \
1494 if (co_opcache != NULL) { \
1495 co_opcache->optimized = -1; \
1496 unsigned char co_opcache_offset = \
1497 co->co_opcache_map[next_instr - first_instr]; \
1498 assert(co_opcache_offset <= co->co_opcache_size); \
1499 co->co_opcache_map[co_opcache_offset] = 0; \
1500 co_opcache = NULL; \
1501 } \
1502 } while (0)
1503
1504 #define OPCACHE_DEOPT_LOAD_ATTR() \
1505 do { \
1506 if (co_opcache != NULL) { \
1507 OPCACHE_STAT_ATTR_DEOPT(); \
1508 OPCACHE_DEOPT(); \
1509 } \
1510 } while (0)
1511
1512 #define OPCACHE_MAYBE_DEOPT_LOAD_ATTR() \
1513 do { \
1514 if (co_opcache != NULL && --co_opcache->optimized <= 0) { \
1515 OPCACHE_DEOPT_LOAD_ATTR(); \
1516 } \
1517 } while (0)
1518
1519 #if OPCACHE_STATS
1520
1521 #define OPCACHE_STAT_GLOBAL_HIT() \
1522 do { \
1523 if (co->co_opcache != NULL) opcache_global_hits++; \
1524 } while (0)
1525
1526 #define OPCACHE_STAT_GLOBAL_MISS() \
1527 do { \
1528 if (co->co_opcache != NULL) opcache_global_misses++; \
1529 } while (0)
1530
1531 #define OPCACHE_STAT_GLOBAL_OPT() \
1532 do { \
1533 if (co->co_opcache != NULL) opcache_global_opts++; \
1534 } while (0)
1535
1536 #define OPCACHE_STAT_ATTR_HIT() \
1537 do { \
1538 if (co->co_opcache != NULL) opcache_attr_hits++; \
1539 } while (0)
1540
1541 #define OPCACHE_STAT_ATTR_MISS() \
1542 do { \
1543 if (co->co_opcache != NULL) opcache_attr_misses++; \
1544 } while (0)
1545
1546 #define OPCACHE_STAT_ATTR_OPT() \
1547 do { \
1548 if (co->co_opcache!= NULL) opcache_attr_opts++; \
1549 } while (0)
1550
1551 #define OPCACHE_STAT_ATTR_DEOPT() \
1552 do { \
1553 if (co->co_opcache != NULL) opcache_attr_deopts++; \
1554 } while (0)
1555
1556 #define OPCACHE_STAT_ATTR_TOTAL() \
1557 do { \
1558 if (co->co_opcache != NULL) opcache_attr_total++; \
1559 } while (0)
1560
1561 #else /* OPCACHE_STATS */
1562
1563 #define OPCACHE_STAT_GLOBAL_HIT()
1564 #define OPCACHE_STAT_GLOBAL_MISS()
1565 #define OPCACHE_STAT_GLOBAL_OPT()
1566
1567 #define OPCACHE_STAT_ATTR_HIT()
1568 #define OPCACHE_STAT_ATTR_MISS()
1569 #define OPCACHE_STAT_ATTR_OPT()
1570 #define OPCACHE_STAT_ATTR_DEOPT()
1571 #define OPCACHE_STAT_ATTR_TOTAL()
1572
1573 #endif
1574
1575
1576 PyObject* _Py_HOT_FUNCTION
_PyEval_EvalFrameDefault(PyThreadState * tstate,PyFrameObject * f,int throwflag)1577 _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag)
1578 {
1579 _Py_EnsureTstateNotNULL(tstate);
1580
1581 #if USE_COMPUTED_GOTOS
1582 /* Import the static jump table */
1583 #include "opcode_targets.h"
1584 #endif
1585
1586 #ifdef DXPAIRS
1587 int lastopcode = 0;
1588 #endif
1589 PyObject **stack_pointer; /* Next free slot in value stack */
1590 const _Py_CODEUNIT *next_instr;
1591 int opcode; /* Current opcode */
1592 int oparg; /* Current opcode argument, if any */
1593 PyObject **fastlocals, **freevars;
1594 PyObject *retval = NULL; /* Return value */
1595 _Py_atomic_int * const eval_breaker = &tstate->interp->ceval.eval_breaker;
1596 PyCodeObject *co;
1597
1598 const _Py_CODEUNIT *first_instr;
1599 PyObject *names;
1600 PyObject *consts;
1601 _PyOpcache *co_opcache;
1602
1603 #ifdef LLTRACE
1604 _Py_IDENTIFIER(__ltrace__);
1605 #endif
1606
1607 if (_Py_EnterRecursiveCall(tstate, "")) {
1608 return NULL;
1609 }
1610
1611 PyTraceInfo trace_info;
1612 /* Mark trace_info as uninitialized */
1613 trace_info.code = NULL;
1614
1615 /* WARNING: Because the CFrame lives on the C stack,
1616 * but can be accessed from a heap allocated object (tstate)
1617 * strict stack discipline must be maintained.
1618 */
1619 CFrame *prev_cframe = tstate->cframe;
1620 trace_info.cframe.use_tracing = prev_cframe->use_tracing;
1621 trace_info.cframe.previous = prev_cframe;
1622 tstate->cframe = &trace_info.cframe;
1623
1624 /* push frame */
1625 tstate->frame = f;
1626 co = f->f_code;
1627
1628 if (trace_info.cframe.use_tracing) {
1629 if (tstate->c_tracefunc != NULL) {
1630 /* tstate->c_tracefunc, if defined, is a
1631 function that will be called on *every* entry
1632 to a code block. Its return value, if not
1633 None, is a function that will be called at
1634 the start of each executed line of code.
1635 (Actually, the function must return itself
1636 in order to continue tracing.) The trace
1637 functions are called with three arguments:
1638 a pointer to the current frame, a string
1639 indicating why the function is called, and
1640 an argument which depends on the situation.
1641 The global trace function is also called
1642 whenever an exception is detected. */
1643 if (call_trace_protected(tstate->c_tracefunc,
1644 tstate->c_traceobj,
1645 tstate, f, &trace_info,
1646 PyTrace_CALL, Py_None)) {
1647 /* Trace function raised an error */
1648 goto exit_eval_frame;
1649 }
1650 }
1651 if (tstate->c_profilefunc != NULL) {
1652 /* Similar for c_profilefunc, except it needn't
1653 return itself and isn't called for "line" events */
1654 if (call_trace_protected(tstate->c_profilefunc,
1655 tstate->c_profileobj,
1656 tstate, f, &trace_info,
1657 PyTrace_CALL, Py_None)) {
1658 /* Profile function raised an error */
1659 goto exit_eval_frame;
1660 }
1661 }
1662 }
1663
1664 if (PyDTrace_FUNCTION_ENTRY_ENABLED())
1665 dtrace_function_entry(f);
1666
1667 names = co->co_names;
1668 consts = co->co_consts;
1669 fastlocals = f->f_localsplus;
1670 freevars = f->f_localsplus + co->co_nlocals;
1671 assert(PyBytes_Check(co->co_code));
1672 assert(PyBytes_GET_SIZE(co->co_code) <= INT_MAX);
1673 assert(PyBytes_GET_SIZE(co->co_code) % sizeof(_Py_CODEUNIT) == 0);
1674 assert(_Py_IS_ALIGNED(PyBytes_AS_STRING(co->co_code), sizeof(_Py_CODEUNIT)));
1675 first_instr = (_Py_CODEUNIT *) PyBytes_AS_STRING(co->co_code);
1676 /*
1677 f->f_lasti refers to the index of the last instruction,
1678 unless it's -1 in which case next_instr should be first_instr.
1679
1680 YIELD_FROM sets f_lasti to itself, in order to repeatedly yield
1681 multiple values.
1682
1683 When the PREDICT() macros are enabled, some opcode pairs follow in
1684 direct succession without updating f->f_lasti. A successful
1685 prediction effectively links the two codes together as if they
1686 were a single new opcode; accordingly,f->f_lasti will point to
1687 the first code in the pair (for instance, GET_ITER followed by
1688 FOR_ITER is effectively a single opcode and f->f_lasti will point
1689 to the beginning of the combined pair.)
1690 */
1691 assert(f->f_lasti >= -1);
1692 next_instr = first_instr + f->f_lasti + 1;
1693 stack_pointer = f->f_valuestack + f->f_stackdepth;
1694 /* Set f->f_stackdepth to -1.
1695 * Update when returning or calling trace function.
1696 Having f_stackdepth <= 0 ensures that invalid
1697 values are not visible to the cycle GC.
1698 We choose -1 rather than 0 to assist debugging.
1699 */
1700 f->f_stackdepth = -1;
1701 f->f_state = FRAME_EXECUTING;
1702
1703 if (co->co_opcache_flag < opcache_min_runs) {
1704 co->co_opcache_flag++;
1705 if (co->co_opcache_flag == opcache_min_runs) {
1706 if (_PyCode_InitOpcache(co) < 0) {
1707 goto exit_eval_frame;
1708 }
1709 #if OPCACHE_STATS
1710 opcache_code_objects_extra_mem +=
1711 PyBytes_Size(co->co_code) / sizeof(_Py_CODEUNIT) +
1712 sizeof(_PyOpcache) * co->co_opcache_size;
1713 opcache_code_objects++;
1714 #endif
1715 }
1716 }
1717
1718 #ifdef LLTRACE
1719 {
1720 int r = _PyDict_ContainsId(f->f_globals, &PyId___ltrace__);
1721 if (r < 0) {
1722 goto exit_eval_frame;
1723 }
1724 lltrace = r;
1725 }
1726 #endif
1727
1728 if (throwflag) { /* support for generator.throw() */
1729 goto error;
1730 }
1731
1732 #ifdef Py_DEBUG
1733 /* _PyEval_EvalFrameDefault() must not be called with an exception set,
1734 because it can clear it (directly or indirectly) and so the
1735 caller loses its exception */
1736 assert(!_PyErr_Occurred(tstate));
1737 #endif
1738
1739 main_loop:
1740 for (;;) {
1741 assert(stack_pointer >= f->f_valuestack); /* else underflow */
1742 assert(STACK_LEVEL() <= co->co_stacksize); /* else overflow */
1743 assert(!_PyErr_Occurred(tstate));
1744
1745 /* Do periodic things. Doing this every time through
1746 the loop would add too much overhead, so we do it
1747 only every Nth instruction. We also do it if
1748 ``pending.calls_to_do'' is set, i.e. when an asynchronous
1749 event needs attention (e.g. a signal handler or
1750 async I/O handler); see Py_AddPendingCall() and
1751 Py_MakePendingCalls() above. */
1752
1753 if (_Py_atomic_load_relaxed(eval_breaker)) {
1754 opcode = _Py_OPCODE(*next_instr);
1755 if (opcode != SETUP_FINALLY &&
1756 opcode != SETUP_WITH &&
1757 opcode != BEFORE_ASYNC_WITH &&
1758 opcode != YIELD_FROM) {
1759 /* Few cases where we skip running signal handlers and other
1760 pending calls:
1761 - If we're about to enter the 'with:'. It will prevent
1762 emitting a resource warning in the common idiom
1763 'with open(path) as file:'.
1764 - If we're about to enter the 'async with:'.
1765 - If we're about to enter the 'try:' of a try/finally (not
1766 *very* useful, but might help in some cases and it's
1767 traditional)
1768 - If we're resuming a chain of nested 'yield from' or
1769 'await' calls, then each frame is parked with YIELD_FROM
1770 as its next opcode. If the user hit control-C we want to
1771 wait until we've reached the innermost frame before
1772 running the signal handler and raising KeyboardInterrupt
1773 (see bpo-30039).
1774 */
1775 if (eval_frame_handle_pending(tstate) != 0) {
1776 goto error;
1777 }
1778 }
1779 }
1780
1781 tracing_dispatch:
1782 {
1783 int instr_prev = f->f_lasti;
1784 f->f_lasti = INSTR_OFFSET();
1785 NEXTOPARG();
1786
1787 if (PyDTrace_LINE_ENABLED())
1788 maybe_dtrace_line(f, &trace_info, instr_prev);
1789
1790 /* line-by-line tracing support */
1791
1792 if (trace_info.cframe.use_tracing &&
1793 tstate->c_tracefunc != NULL && !tstate->tracing) {
1794 int err;
1795 /* see maybe_call_line_trace()
1796 for expository comments */
1797 f->f_stackdepth = (int)(stack_pointer - f->f_valuestack);
1798
1799 err = maybe_call_line_trace(tstate->c_tracefunc,
1800 tstate->c_traceobj,
1801 tstate, f,
1802 &trace_info, instr_prev);
1803 /* Reload possibly changed frame fields */
1804 JUMPTO(f->f_lasti);
1805 stack_pointer = f->f_valuestack+f->f_stackdepth;
1806 f->f_stackdepth = -1;
1807 if (err) {
1808 /* trace function raised an exception */
1809 goto error;
1810 }
1811 NEXTOPARG();
1812 }
1813 }
1814
1815 #ifdef LLTRACE
1816 /* Instruction tracing */
1817
1818 if (lltrace) {
1819 if (HAS_ARG(opcode)) {
1820 printf("%d: %d, %d\n",
1821 f->f_lasti, opcode, oparg);
1822 }
1823 else {
1824 printf("%d: %d\n",
1825 f->f_lasti, opcode);
1826 }
1827 }
1828 #endif
1829 #if USE_COMPUTED_GOTOS == 0
1830 goto dispatch_opcode;
1831
1832 predispatch:
1833 if (trace_info.cframe.use_tracing OR_DTRACE_LINE OR_LLTRACE) {
1834 goto tracing_dispatch;
1835 }
1836 f->f_lasti = INSTR_OFFSET();
1837 NEXTOPARG();
1838 #endif
1839 dispatch_opcode:
1840 #ifdef DYNAMIC_EXECUTION_PROFILE
1841 #ifdef DXPAIRS
1842 dxpairs[lastopcode][opcode]++;
1843 lastopcode = opcode;
1844 #endif
1845 dxp[opcode]++;
1846 #endif
1847
1848 switch (opcode) {
1849
1850 /* BEWARE!
1851 It is essential that any operation that fails must goto error
1852 and that all operation that succeed call DISPATCH() ! */
1853
1854 case TARGET(NOP): {
1855 DISPATCH();
1856 }
1857
1858 case TARGET(LOAD_FAST): {
1859 PyObject *value = GETLOCAL(oparg);
1860 if (value == NULL) {
1861 format_exc_check_arg(tstate, PyExc_UnboundLocalError,
1862 UNBOUNDLOCAL_ERROR_MSG,
1863 PyTuple_GetItem(co->co_varnames, oparg));
1864 goto error;
1865 }
1866 Py_INCREF(value);
1867 PUSH(value);
1868 DISPATCH();
1869 }
1870
1871 case TARGET(LOAD_CONST): {
1872 PREDICTED(LOAD_CONST);
1873 PyObject *value = GETITEM(consts, oparg);
1874 Py_INCREF(value);
1875 PUSH(value);
1876 DISPATCH();
1877 }
1878
1879 case TARGET(STORE_FAST): {
1880 PREDICTED(STORE_FAST);
1881 PyObject *value = POP();
1882 SETLOCAL(oparg, value);
1883 DISPATCH();
1884 }
1885
1886 case TARGET(POP_TOP): {
1887 PyObject *value = POP();
1888 Py_DECREF(value);
1889 DISPATCH();
1890 }
1891
1892 case TARGET(ROT_TWO): {
1893 PyObject *top = TOP();
1894 PyObject *second = SECOND();
1895 SET_TOP(second);
1896 SET_SECOND(top);
1897 DISPATCH();
1898 }
1899
1900 case TARGET(ROT_THREE): {
1901 PyObject *top = TOP();
1902 PyObject *second = SECOND();
1903 PyObject *third = THIRD();
1904 SET_TOP(second);
1905 SET_SECOND(third);
1906 SET_THIRD(top);
1907 DISPATCH();
1908 }
1909
1910 case TARGET(ROT_FOUR): {
1911 PyObject *top = TOP();
1912 PyObject *second = SECOND();
1913 PyObject *third = THIRD();
1914 PyObject *fourth = FOURTH();
1915 SET_TOP(second);
1916 SET_SECOND(third);
1917 SET_THIRD(fourth);
1918 SET_FOURTH(top);
1919 DISPATCH();
1920 }
1921
1922 case TARGET(DUP_TOP): {
1923 PyObject *top = TOP();
1924 Py_INCREF(top);
1925 PUSH(top);
1926 DISPATCH();
1927 }
1928
1929 case TARGET(DUP_TOP_TWO): {
1930 PyObject *top = TOP();
1931 PyObject *second = SECOND();
1932 Py_INCREF(top);
1933 Py_INCREF(second);
1934 STACK_GROW(2);
1935 SET_TOP(top);
1936 SET_SECOND(second);
1937 DISPATCH();
1938 }
1939
1940 case TARGET(UNARY_POSITIVE): {
1941 PyObject *value = TOP();
1942 PyObject *res = PyNumber_Positive(value);
1943 Py_DECREF(value);
1944 SET_TOP(res);
1945 if (res == NULL)
1946 goto error;
1947 DISPATCH();
1948 }
1949
1950 case TARGET(UNARY_NEGATIVE): {
1951 PyObject *value = TOP();
1952 PyObject *res = PyNumber_Negative(value);
1953 Py_DECREF(value);
1954 SET_TOP(res);
1955 if (res == NULL)
1956 goto error;
1957 DISPATCH();
1958 }
1959
1960 case TARGET(UNARY_NOT): {
1961 PyObject *value = TOP();
1962 int err = PyObject_IsTrue(value);
1963 Py_DECREF(value);
1964 if (err == 0) {
1965 Py_INCREF(Py_True);
1966 SET_TOP(Py_True);
1967 DISPATCH();
1968 }
1969 else if (err > 0) {
1970 Py_INCREF(Py_False);
1971 SET_TOP(Py_False);
1972 DISPATCH();
1973 }
1974 STACK_SHRINK(1);
1975 goto error;
1976 }
1977
1978 case TARGET(UNARY_INVERT): {
1979 PyObject *value = TOP();
1980 PyObject *res = PyNumber_Invert(value);
1981 Py_DECREF(value);
1982 SET_TOP(res);
1983 if (res == NULL)
1984 goto error;
1985 DISPATCH();
1986 }
1987
1988 case TARGET(BINARY_POWER): {
1989 PyObject *exp = POP();
1990 PyObject *base = TOP();
1991 PyObject *res = PyNumber_Power(base, exp, Py_None);
1992 Py_DECREF(base);
1993 Py_DECREF(exp);
1994 SET_TOP(res);
1995 if (res == NULL)
1996 goto error;
1997 DISPATCH();
1998 }
1999
2000 case TARGET(BINARY_MULTIPLY): {
2001 PyObject *right = POP();
2002 PyObject *left = TOP();
2003 PyObject *res = PyNumber_Multiply(left, right);
2004 Py_DECREF(left);
2005 Py_DECREF(right);
2006 SET_TOP(res);
2007 if (res == NULL)
2008 goto error;
2009 DISPATCH();
2010 }
2011
2012 case TARGET(BINARY_MATRIX_MULTIPLY): {
2013 PyObject *right = POP();
2014 PyObject *left = TOP();
2015 PyObject *res = PyNumber_MatrixMultiply(left, right);
2016 Py_DECREF(left);
2017 Py_DECREF(right);
2018 SET_TOP(res);
2019 if (res == NULL)
2020 goto error;
2021 DISPATCH();
2022 }
2023
2024 case TARGET(BINARY_TRUE_DIVIDE): {
2025 PyObject *divisor = POP();
2026 PyObject *dividend = TOP();
2027 PyObject *quotient = PyNumber_TrueDivide(dividend, divisor);
2028 Py_DECREF(dividend);
2029 Py_DECREF(divisor);
2030 SET_TOP(quotient);
2031 if (quotient == NULL)
2032 goto error;
2033 DISPATCH();
2034 }
2035
2036 case TARGET(BINARY_FLOOR_DIVIDE): {
2037 PyObject *divisor = POP();
2038 PyObject *dividend = TOP();
2039 PyObject *quotient = PyNumber_FloorDivide(dividend, divisor);
2040 Py_DECREF(dividend);
2041 Py_DECREF(divisor);
2042 SET_TOP(quotient);
2043 if (quotient == NULL)
2044 goto error;
2045 DISPATCH();
2046 }
2047
2048 case TARGET(BINARY_MODULO): {
2049 PyObject *divisor = POP();
2050 PyObject *dividend = TOP();
2051 PyObject *res;
2052 if (PyUnicode_CheckExact(dividend) && (
2053 !PyUnicode_Check(divisor) || PyUnicode_CheckExact(divisor))) {
2054 // fast path; string formatting, but not if the RHS is a str subclass
2055 // (see issue28598)
2056 res = PyUnicode_Format(dividend, divisor);
2057 } else {
2058 res = PyNumber_Remainder(dividend, divisor);
2059 }
2060 Py_DECREF(divisor);
2061 Py_DECREF(dividend);
2062 SET_TOP(res);
2063 if (res == NULL)
2064 goto error;
2065 DISPATCH();
2066 }
2067
2068 case TARGET(BINARY_ADD): {
2069 PyObject *right = POP();
2070 PyObject *left = TOP();
2071 PyObject *sum;
2072 /* NOTE(vstinner): Please don't try to micro-optimize int+int on
2073 CPython using bytecode, it is simply worthless.
2074 See http://bugs.python.org/issue21955 and
2075 http://bugs.python.org/issue10044 for the discussion. In short,
2076 no patch shown any impact on a realistic benchmark, only a minor
2077 speedup on microbenchmarks. */
2078 if (PyUnicode_CheckExact(left) &&
2079 PyUnicode_CheckExact(right)) {
2080 sum = unicode_concatenate(tstate, left, right, f, next_instr);
2081 /* unicode_concatenate consumed the ref to left */
2082 }
2083 else {
2084 sum = PyNumber_Add(left, right);
2085 Py_DECREF(left);
2086 }
2087 Py_DECREF(right);
2088 SET_TOP(sum);
2089 if (sum == NULL)
2090 goto error;
2091 DISPATCH();
2092 }
2093
2094 case TARGET(BINARY_SUBTRACT): {
2095 PyObject *right = POP();
2096 PyObject *left = TOP();
2097 PyObject *diff = PyNumber_Subtract(left, right);
2098 Py_DECREF(right);
2099 Py_DECREF(left);
2100 SET_TOP(diff);
2101 if (diff == NULL)
2102 goto error;
2103 DISPATCH();
2104 }
2105
2106 case TARGET(BINARY_SUBSCR): {
2107 PyObject *sub = POP();
2108 PyObject *container = TOP();
2109 PyObject *res = PyObject_GetItem(container, sub);
2110 Py_DECREF(container);
2111 Py_DECREF(sub);
2112 SET_TOP(res);
2113 if (res == NULL)
2114 goto error;
2115 DISPATCH();
2116 }
2117
2118 case TARGET(BINARY_LSHIFT): {
2119 PyObject *right = POP();
2120 PyObject *left = TOP();
2121 PyObject *res = PyNumber_Lshift(left, right);
2122 Py_DECREF(left);
2123 Py_DECREF(right);
2124 SET_TOP(res);
2125 if (res == NULL)
2126 goto error;
2127 DISPATCH();
2128 }
2129
2130 case TARGET(BINARY_RSHIFT): {
2131 PyObject *right = POP();
2132 PyObject *left = TOP();
2133 PyObject *res = PyNumber_Rshift(left, right);
2134 Py_DECREF(left);
2135 Py_DECREF(right);
2136 SET_TOP(res);
2137 if (res == NULL)
2138 goto error;
2139 DISPATCH();
2140 }
2141
2142 case TARGET(BINARY_AND): {
2143 PyObject *right = POP();
2144 PyObject *left = TOP();
2145 PyObject *res = PyNumber_And(left, right);
2146 Py_DECREF(left);
2147 Py_DECREF(right);
2148 SET_TOP(res);
2149 if (res == NULL)
2150 goto error;
2151 DISPATCH();
2152 }
2153
2154 case TARGET(BINARY_XOR): {
2155 PyObject *right = POP();
2156 PyObject *left = TOP();
2157 PyObject *res = PyNumber_Xor(left, right);
2158 Py_DECREF(left);
2159 Py_DECREF(right);
2160 SET_TOP(res);
2161 if (res == NULL)
2162 goto error;
2163 DISPATCH();
2164 }
2165
2166 case TARGET(BINARY_OR): {
2167 PyObject *right = POP();
2168 PyObject *left = TOP();
2169 PyObject *res = PyNumber_Or(left, right);
2170 Py_DECREF(left);
2171 Py_DECREF(right);
2172 SET_TOP(res);
2173 if (res == NULL)
2174 goto error;
2175 DISPATCH();
2176 }
2177
2178 case TARGET(LIST_APPEND): {
2179 PyObject *v = POP();
2180 PyObject *list = PEEK(oparg);
2181 int err;
2182 err = PyList_Append(list, v);
2183 Py_DECREF(v);
2184 if (err != 0)
2185 goto error;
2186 PREDICT(JUMP_ABSOLUTE);
2187 DISPATCH();
2188 }
2189
2190 case TARGET(SET_ADD): {
2191 PyObject *v = POP();
2192 PyObject *set = PEEK(oparg);
2193 int err;
2194 err = PySet_Add(set, v);
2195 Py_DECREF(v);
2196 if (err != 0)
2197 goto error;
2198 PREDICT(JUMP_ABSOLUTE);
2199 DISPATCH();
2200 }
2201
2202 case TARGET(INPLACE_POWER): {
2203 PyObject *exp = POP();
2204 PyObject *base = TOP();
2205 PyObject *res = PyNumber_InPlacePower(base, exp, Py_None);
2206 Py_DECREF(base);
2207 Py_DECREF(exp);
2208 SET_TOP(res);
2209 if (res == NULL)
2210 goto error;
2211 DISPATCH();
2212 }
2213
2214 case TARGET(INPLACE_MULTIPLY): {
2215 PyObject *right = POP();
2216 PyObject *left = TOP();
2217 PyObject *res = PyNumber_InPlaceMultiply(left, right);
2218 Py_DECREF(left);
2219 Py_DECREF(right);
2220 SET_TOP(res);
2221 if (res == NULL)
2222 goto error;
2223 DISPATCH();
2224 }
2225
2226 case TARGET(INPLACE_MATRIX_MULTIPLY): {
2227 PyObject *right = POP();
2228 PyObject *left = TOP();
2229 PyObject *res = PyNumber_InPlaceMatrixMultiply(left, right);
2230 Py_DECREF(left);
2231 Py_DECREF(right);
2232 SET_TOP(res);
2233 if (res == NULL)
2234 goto error;
2235 DISPATCH();
2236 }
2237
2238 case TARGET(INPLACE_TRUE_DIVIDE): {
2239 PyObject *divisor = POP();
2240 PyObject *dividend = TOP();
2241 PyObject *quotient = PyNumber_InPlaceTrueDivide(dividend, divisor);
2242 Py_DECREF(dividend);
2243 Py_DECREF(divisor);
2244 SET_TOP(quotient);
2245 if (quotient == NULL)
2246 goto error;
2247 DISPATCH();
2248 }
2249
2250 case TARGET(INPLACE_FLOOR_DIVIDE): {
2251 PyObject *divisor = POP();
2252 PyObject *dividend = TOP();
2253 PyObject *quotient = PyNumber_InPlaceFloorDivide(dividend, divisor);
2254 Py_DECREF(dividend);
2255 Py_DECREF(divisor);
2256 SET_TOP(quotient);
2257 if (quotient == NULL)
2258 goto error;
2259 DISPATCH();
2260 }
2261
2262 case TARGET(INPLACE_MODULO): {
2263 PyObject *right = POP();
2264 PyObject *left = TOP();
2265 PyObject *mod = PyNumber_InPlaceRemainder(left, right);
2266 Py_DECREF(left);
2267 Py_DECREF(right);
2268 SET_TOP(mod);
2269 if (mod == NULL)
2270 goto error;
2271 DISPATCH();
2272 }
2273
2274 case TARGET(INPLACE_ADD): {
2275 PyObject *right = POP();
2276 PyObject *left = TOP();
2277 PyObject *sum;
2278 if (PyUnicode_CheckExact(left) && PyUnicode_CheckExact(right)) {
2279 sum = unicode_concatenate(tstate, left, right, f, next_instr);
2280 /* unicode_concatenate consumed the ref to left */
2281 }
2282 else {
2283 sum = PyNumber_InPlaceAdd(left, right);
2284 Py_DECREF(left);
2285 }
2286 Py_DECREF(right);
2287 SET_TOP(sum);
2288 if (sum == NULL)
2289 goto error;
2290 DISPATCH();
2291 }
2292
2293 case TARGET(INPLACE_SUBTRACT): {
2294 PyObject *right = POP();
2295 PyObject *left = TOP();
2296 PyObject *diff = PyNumber_InPlaceSubtract(left, right);
2297 Py_DECREF(left);
2298 Py_DECREF(right);
2299 SET_TOP(diff);
2300 if (diff == NULL)
2301 goto error;
2302 DISPATCH();
2303 }
2304
2305 case TARGET(INPLACE_LSHIFT): {
2306 PyObject *right = POP();
2307 PyObject *left = TOP();
2308 PyObject *res = PyNumber_InPlaceLshift(left, right);
2309 Py_DECREF(left);
2310 Py_DECREF(right);
2311 SET_TOP(res);
2312 if (res == NULL)
2313 goto error;
2314 DISPATCH();
2315 }
2316
2317 case TARGET(INPLACE_RSHIFT): {
2318 PyObject *right = POP();
2319 PyObject *left = TOP();
2320 PyObject *res = PyNumber_InPlaceRshift(left, right);
2321 Py_DECREF(left);
2322 Py_DECREF(right);
2323 SET_TOP(res);
2324 if (res == NULL)
2325 goto error;
2326 DISPATCH();
2327 }
2328
2329 case TARGET(INPLACE_AND): {
2330 PyObject *right = POP();
2331 PyObject *left = TOP();
2332 PyObject *res = PyNumber_InPlaceAnd(left, right);
2333 Py_DECREF(left);
2334 Py_DECREF(right);
2335 SET_TOP(res);
2336 if (res == NULL)
2337 goto error;
2338 DISPATCH();
2339 }
2340
2341 case TARGET(INPLACE_XOR): {
2342 PyObject *right = POP();
2343 PyObject *left = TOP();
2344 PyObject *res = PyNumber_InPlaceXor(left, right);
2345 Py_DECREF(left);
2346 Py_DECREF(right);
2347 SET_TOP(res);
2348 if (res == NULL)
2349 goto error;
2350 DISPATCH();
2351 }
2352
2353 case TARGET(INPLACE_OR): {
2354 PyObject *right = POP();
2355 PyObject *left = TOP();
2356 PyObject *res = PyNumber_InPlaceOr(left, right);
2357 Py_DECREF(left);
2358 Py_DECREF(right);
2359 SET_TOP(res);
2360 if (res == NULL)
2361 goto error;
2362 DISPATCH();
2363 }
2364
2365 case TARGET(STORE_SUBSCR): {
2366 PyObject *sub = TOP();
2367 PyObject *container = SECOND();
2368 PyObject *v = THIRD();
2369 int err;
2370 STACK_SHRINK(3);
2371 /* container[sub] = v */
2372 err = PyObject_SetItem(container, sub, v);
2373 Py_DECREF(v);
2374 Py_DECREF(container);
2375 Py_DECREF(sub);
2376 if (err != 0)
2377 goto error;
2378 DISPATCH();
2379 }
2380
2381 case TARGET(DELETE_SUBSCR): {
2382 PyObject *sub = TOP();
2383 PyObject *container = SECOND();
2384 int err;
2385 STACK_SHRINK(2);
2386 /* del container[sub] */
2387 err = PyObject_DelItem(container, sub);
2388 Py_DECREF(container);
2389 Py_DECREF(sub);
2390 if (err != 0)
2391 goto error;
2392 DISPATCH();
2393 }
2394
2395 case TARGET(PRINT_EXPR): {
2396 _Py_IDENTIFIER(displayhook);
2397 PyObject *value = POP();
2398 PyObject *hook = _PySys_GetObjectId(&PyId_displayhook);
2399 PyObject *res;
2400 if (hook == NULL) {
2401 _PyErr_SetString(tstate, PyExc_RuntimeError,
2402 "lost sys.displayhook");
2403 Py_DECREF(value);
2404 goto error;
2405 }
2406 res = PyObject_CallOneArg(hook, value);
2407 Py_DECREF(value);
2408 if (res == NULL)
2409 goto error;
2410 Py_DECREF(res);
2411 DISPATCH();
2412 }
2413
2414 case TARGET(RAISE_VARARGS): {
2415 PyObject *cause = NULL, *exc = NULL;
2416 switch (oparg) {
2417 case 2:
2418 cause = POP(); /* cause */
2419 /* fall through */
2420 case 1:
2421 exc = POP(); /* exc */
2422 /* fall through */
2423 case 0:
2424 if (do_raise(tstate, exc, cause)) {
2425 goto exception_unwind;
2426 }
2427 break;
2428 default:
2429 _PyErr_SetString(tstate, PyExc_SystemError,
2430 "bad RAISE_VARARGS oparg");
2431 break;
2432 }
2433 goto error;
2434 }
2435
2436 case TARGET(RETURN_VALUE): {
2437 retval = POP();
2438 assert(f->f_iblock == 0);
2439 assert(EMPTY());
2440 f->f_state = FRAME_RETURNED;
2441 f->f_stackdepth = 0;
2442 goto exiting;
2443 }
2444
2445 case TARGET(GET_AITER): {
2446 unaryfunc getter = NULL;
2447 PyObject *iter = NULL;
2448 PyObject *obj = TOP();
2449 PyTypeObject *type = Py_TYPE(obj);
2450
2451 if (type->tp_as_async != NULL) {
2452 getter = type->tp_as_async->am_aiter;
2453 }
2454
2455 if (getter != NULL) {
2456 iter = (*getter)(obj);
2457 Py_DECREF(obj);
2458 if (iter == NULL) {
2459 SET_TOP(NULL);
2460 goto error;
2461 }
2462 }
2463 else {
2464 SET_TOP(NULL);
2465 _PyErr_Format(tstate, PyExc_TypeError,
2466 "'async for' requires an object with "
2467 "__aiter__ method, got %.100s",
2468 type->tp_name);
2469 Py_DECREF(obj);
2470 goto error;
2471 }
2472
2473 if (Py_TYPE(iter)->tp_as_async == NULL ||
2474 Py_TYPE(iter)->tp_as_async->am_anext == NULL) {
2475
2476 SET_TOP(NULL);
2477 _PyErr_Format(tstate, PyExc_TypeError,
2478 "'async for' received an object from __aiter__ "
2479 "that does not implement __anext__: %.100s",
2480 Py_TYPE(iter)->tp_name);
2481 Py_DECREF(iter);
2482 goto error;
2483 }
2484
2485 SET_TOP(iter);
2486 DISPATCH();
2487 }
2488
2489 case TARGET(GET_ANEXT): {
2490 unaryfunc getter = NULL;
2491 PyObject *next_iter = NULL;
2492 PyObject *awaitable = NULL;
2493 PyObject *aiter = TOP();
2494 PyTypeObject *type = Py_TYPE(aiter);
2495
2496 if (PyAsyncGen_CheckExact(aiter)) {
2497 awaitable = type->tp_as_async->am_anext(aiter);
2498 if (awaitable == NULL) {
2499 goto error;
2500 }
2501 } else {
2502 if (type->tp_as_async != NULL){
2503 getter = type->tp_as_async->am_anext;
2504 }
2505
2506 if (getter != NULL) {
2507 next_iter = (*getter)(aiter);
2508 if (next_iter == NULL) {
2509 goto error;
2510 }
2511 }
2512 else {
2513 _PyErr_Format(tstate, PyExc_TypeError,
2514 "'async for' requires an iterator with "
2515 "__anext__ method, got %.100s",
2516 type->tp_name);
2517 goto error;
2518 }
2519
2520 awaitable = _PyCoro_GetAwaitableIter(next_iter);
2521 if (awaitable == NULL) {
2522 _PyErr_FormatFromCause(
2523 PyExc_TypeError,
2524 "'async for' received an invalid object "
2525 "from __anext__: %.100s",
2526 Py_TYPE(next_iter)->tp_name);
2527
2528 Py_DECREF(next_iter);
2529 goto error;
2530 } else {
2531 Py_DECREF(next_iter);
2532 }
2533 }
2534
2535 PUSH(awaitable);
2536 PREDICT(LOAD_CONST);
2537 DISPATCH();
2538 }
2539
2540 case TARGET(GET_AWAITABLE): {
2541 PREDICTED(GET_AWAITABLE);
2542 PyObject *iterable = TOP();
2543 PyObject *iter = _PyCoro_GetAwaitableIter(iterable);
2544
2545 if (iter == NULL) {
2546 int opcode_at_minus_3 = 0;
2547 if ((next_instr - first_instr) > 2) {
2548 opcode_at_minus_3 = _Py_OPCODE(next_instr[-3]);
2549 }
2550 format_awaitable_error(tstate, Py_TYPE(iterable),
2551 opcode_at_minus_3,
2552 _Py_OPCODE(next_instr[-2]));
2553 }
2554
2555 Py_DECREF(iterable);
2556
2557 if (iter != NULL && PyCoro_CheckExact(iter)) {
2558 PyObject *yf = _PyGen_yf((PyGenObject*)iter);
2559 if (yf != NULL) {
2560 /* `iter` is a coroutine object that is being
2561 awaited, `yf` is a pointer to the current awaitable
2562 being awaited on. */
2563 Py_DECREF(yf);
2564 Py_CLEAR(iter);
2565 _PyErr_SetString(tstate, PyExc_RuntimeError,
2566 "coroutine is being awaited already");
2567 /* The code below jumps to `error` if `iter` is NULL. */
2568 }
2569 }
2570
2571 SET_TOP(iter); /* Even if it's NULL */
2572
2573 if (iter == NULL) {
2574 goto error;
2575 }
2576
2577 PREDICT(LOAD_CONST);
2578 DISPATCH();
2579 }
2580
2581 case TARGET(YIELD_FROM): {
2582 PyObject *v = POP();
2583 PyObject *receiver = TOP();
2584 PySendResult gen_status;
2585 if (tstate->c_tracefunc == NULL) {
2586 gen_status = PyIter_Send(receiver, v, &retval);
2587 } else {
2588 _Py_IDENTIFIER(send);
2589 if (Py_IsNone(v) && PyIter_Check(receiver)) {
2590 retval = Py_TYPE(receiver)->tp_iternext(receiver);
2591 }
2592 else {
2593 retval = _PyObject_CallMethodIdOneArg(receiver, &PyId_send, v);
2594 }
2595 if (retval == NULL) {
2596 if (tstate->c_tracefunc != NULL
2597 && _PyErr_ExceptionMatches(tstate, PyExc_StopIteration))
2598 call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj, tstate, f, &trace_info);
2599 if (_PyGen_FetchStopIterationValue(&retval) == 0) {
2600 gen_status = PYGEN_RETURN;
2601 }
2602 else {
2603 gen_status = PYGEN_ERROR;
2604 }
2605 }
2606 else {
2607 gen_status = PYGEN_NEXT;
2608 }
2609 }
2610 Py_DECREF(v);
2611 if (gen_status == PYGEN_ERROR) {
2612 assert (retval == NULL);
2613 goto error;
2614 }
2615 if (gen_status == PYGEN_RETURN) {
2616 assert (retval != NULL);
2617
2618 Py_DECREF(receiver);
2619 SET_TOP(retval);
2620 retval = NULL;
2621 DISPATCH();
2622 }
2623 assert (gen_status == PYGEN_NEXT);
2624 /* receiver remains on stack, retval is value to be yielded */
2625 /* and repeat... */
2626 assert(f->f_lasti > 0);
2627 f->f_lasti -= 1;
2628 f->f_state = FRAME_SUSPENDED;
2629 f->f_stackdepth = (int)(stack_pointer - f->f_valuestack);
2630 goto exiting;
2631 }
2632
2633 case TARGET(YIELD_VALUE): {
2634 retval = POP();
2635
2636 if (co->co_flags & CO_ASYNC_GENERATOR) {
2637 PyObject *w = _PyAsyncGenValueWrapperNew(retval);
2638 Py_DECREF(retval);
2639 if (w == NULL) {
2640 retval = NULL;
2641 goto error;
2642 }
2643 retval = w;
2644 }
2645 f->f_state = FRAME_SUSPENDED;
2646 f->f_stackdepth = (int)(stack_pointer - f->f_valuestack);
2647 goto exiting;
2648 }
2649
2650 case TARGET(GEN_START): {
2651 PyObject *none = POP();
2652 assert(none == Py_None);
2653 assert(oparg < 3);
2654 Py_DECREF(none);
2655 DISPATCH();
2656 }
2657
2658 case TARGET(POP_EXCEPT): {
2659 PyObject *type, *value, *traceback;
2660 _PyErr_StackItem *exc_info;
2661 PyTryBlock *b = PyFrame_BlockPop(f);
2662 if (b->b_type != EXCEPT_HANDLER) {
2663 _PyErr_SetString(tstate, PyExc_SystemError,
2664 "popped block is not an except handler");
2665 goto error;
2666 }
2667 assert(STACK_LEVEL() >= (b)->b_level + 3 &&
2668 STACK_LEVEL() <= (b)->b_level + 4);
2669 exc_info = tstate->exc_info;
2670 type = exc_info->exc_type;
2671 value = exc_info->exc_value;
2672 traceback = exc_info->exc_traceback;
2673 exc_info->exc_type = POP();
2674 exc_info->exc_value = POP();
2675 exc_info->exc_traceback = POP();
2676 Py_XDECREF(type);
2677 Py_XDECREF(value);
2678 Py_XDECREF(traceback);
2679 DISPATCH();
2680 }
2681
2682 case TARGET(POP_BLOCK): {
2683 PyFrame_BlockPop(f);
2684 DISPATCH();
2685 }
2686
2687 case TARGET(RERAISE): {
2688 assert(f->f_iblock > 0);
2689 if (oparg) {
2690 f->f_lasti = f->f_blockstack[f->f_iblock-1].b_handler;
2691 }
2692 PyObject *exc = POP();
2693 PyObject *val = POP();
2694 PyObject *tb = POP();
2695 assert(PyExceptionClass_Check(exc));
2696 _PyErr_Restore(tstate, exc, val, tb);
2697 goto exception_unwind;
2698 }
2699
2700 case TARGET(END_ASYNC_FOR): {
2701 PyObject *exc = POP();
2702 assert(PyExceptionClass_Check(exc));
2703 if (PyErr_GivenExceptionMatches(exc, PyExc_StopAsyncIteration)) {
2704 PyTryBlock *b = PyFrame_BlockPop(f);
2705 assert(b->b_type == EXCEPT_HANDLER);
2706 Py_DECREF(exc);
2707 UNWIND_EXCEPT_HANDLER(b);
2708 Py_DECREF(POP());
2709 JUMPBY(oparg);
2710 DISPATCH();
2711 }
2712 else {
2713 PyObject *val = POP();
2714 PyObject *tb = POP();
2715 _PyErr_Restore(tstate, exc, val, tb);
2716 goto exception_unwind;
2717 }
2718 }
2719
2720 case TARGET(LOAD_ASSERTION_ERROR): {
2721 PyObject *value = PyExc_AssertionError;
2722 Py_INCREF(value);
2723 PUSH(value);
2724 DISPATCH();
2725 }
2726
2727 case TARGET(LOAD_BUILD_CLASS): {
2728 _Py_IDENTIFIER(__build_class__);
2729
2730 PyObject *bc;
2731 if (PyDict_CheckExact(f->f_builtins)) {
2732 bc = _PyDict_GetItemIdWithError(f->f_builtins, &PyId___build_class__);
2733 if (bc == NULL) {
2734 if (!_PyErr_Occurred(tstate)) {
2735 _PyErr_SetString(tstate, PyExc_NameError,
2736 "__build_class__ not found");
2737 }
2738 goto error;
2739 }
2740 Py_INCREF(bc);
2741 }
2742 else {
2743 PyObject *build_class_str = _PyUnicode_FromId(&PyId___build_class__);
2744 if (build_class_str == NULL)
2745 goto error;
2746 bc = PyObject_GetItem(f->f_builtins, build_class_str);
2747 if (bc == NULL) {
2748 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError))
2749 _PyErr_SetString(tstate, PyExc_NameError,
2750 "__build_class__ not found");
2751 goto error;
2752 }
2753 }
2754 PUSH(bc);
2755 DISPATCH();
2756 }
2757
2758 case TARGET(STORE_NAME): {
2759 PyObject *name = GETITEM(names, oparg);
2760 PyObject *v = POP();
2761 PyObject *ns = f->f_locals;
2762 int err;
2763 if (ns == NULL) {
2764 _PyErr_Format(tstate, PyExc_SystemError,
2765 "no locals found when storing %R", name);
2766 Py_DECREF(v);
2767 goto error;
2768 }
2769 if (PyDict_CheckExact(ns))
2770 err = PyDict_SetItem(ns, name, v);
2771 else
2772 err = PyObject_SetItem(ns, name, v);
2773 Py_DECREF(v);
2774 if (err != 0)
2775 goto error;
2776 DISPATCH();
2777 }
2778
2779 case TARGET(DELETE_NAME): {
2780 PyObject *name = GETITEM(names, oparg);
2781 PyObject *ns = f->f_locals;
2782 int err;
2783 if (ns == NULL) {
2784 _PyErr_Format(tstate, PyExc_SystemError,
2785 "no locals when deleting %R", name);
2786 goto error;
2787 }
2788 err = PyObject_DelItem(ns, name);
2789 if (err != 0) {
2790 format_exc_check_arg(tstate, PyExc_NameError,
2791 NAME_ERROR_MSG,
2792 name);
2793 goto error;
2794 }
2795 DISPATCH();
2796 }
2797
2798 case TARGET(UNPACK_SEQUENCE): {
2799 PREDICTED(UNPACK_SEQUENCE);
2800 PyObject *seq = POP(), *item, **items;
2801 if (PyTuple_CheckExact(seq) &&
2802 PyTuple_GET_SIZE(seq) == oparg) {
2803 items = ((PyTupleObject *)seq)->ob_item;
2804 while (oparg--) {
2805 item = items[oparg];
2806 Py_INCREF(item);
2807 PUSH(item);
2808 }
2809 } else if (PyList_CheckExact(seq) &&
2810 PyList_GET_SIZE(seq) == oparg) {
2811 items = ((PyListObject *)seq)->ob_item;
2812 while (oparg--) {
2813 item = items[oparg];
2814 Py_INCREF(item);
2815 PUSH(item);
2816 }
2817 } else if (unpack_iterable(tstate, seq, oparg, -1,
2818 stack_pointer + oparg)) {
2819 STACK_GROW(oparg);
2820 } else {
2821 /* unpack_iterable() raised an exception */
2822 Py_DECREF(seq);
2823 goto error;
2824 }
2825 Py_DECREF(seq);
2826 DISPATCH();
2827 }
2828
2829 case TARGET(UNPACK_EX): {
2830 int totalargs = 1 + (oparg & 0xFF) + (oparg >> 8);
2831 PyObject *seq = POP();
2832
2833 if (unpack_iterable(tstate, seq, oparg & 0xFF, oparg >> 8,
2834 stack_pointer + totalargs)) {
2835 stack_pointer += totalargs;
2836 } else {
2837 Py_DECREF(seq);
2838 goto error;
2839 }
2840 Py_DECREF(seq);
2841 DISPATCH();
2842 }
2843
2844 case TARGET(STORE_ATTR): {
2845 PyObject *name = GETITEM(names, oparg);
2846 PyObject *owner = TOP();
2847 PyObject *v = SECOND();
2848 int err;
2849 STACK_SHRINK(2);
2850 err = PyObject_SetAttr(owner, name, v);
2851 Py_DECREF(v);
2852 Py_DECREF(owner);
2853 if (err != 0)
2854 goto error;
2855 DISPATCH();
2856 }
2857
2858 case TARGET(DELETE_ATTR): {
2859 PyObject *name = GETITEM(names, oparg);
2860 PyObject *owner = POP();
2861 int err;
2862 err = PyObject_SetAttr(owner, name, (PyObject *)NULL);
2863 Py_DECREF(owner);
2864 if (err != 0)
2865 goto error;
2866 DISPATCH();
2867 }
2868
2869 case TARGET(STORE_GLOBAL): {
2870 PyObject *name = GETITEM(names, oparg);
2871 PyObject *v = POP();
2872 int err;
2873 err = PyDict_SetItem(f->f_globals, name, v);
2874 Py_DECREF(v);
2875 if (err != 0)
2876 goto error;
2877 DISPATCH();
2878 }
2879
2880 case TARGET(DELETE_GLOBAL): {
2881 PyObject *name = GETITEM(names, oparg);
2882 int err;
2883 err = PyDict_DelItem(f->f_globals, name);
2884 if (err != 0) {
2885 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
2886 format_exc_check_arg(tstate, PyExc_NameError,
2887 NAME_ERROR_MSG, name);
2888 }
2889 goto error;
2890 }
2891 DISPATCH();
2892 }
2893
2894 case TARGET(LOAD_NAME): {
2895 PyObject *name = GETITEM(names, oparg);
2896 PyObject *locals = f->f_locals;
2897 PyObject *v;
2898 if (locals == NULL) {
2899 _PyErr_Format(tstate, PyExc_SystemError,
2900 "no locals when loading %R", name);
2901 goto error;
2902 }
2903 if (PyDict_CheckExact(locals)) {
2904 v = PyDict_GetItemWithError(locals, name);
2905 if (v != NULL) {
2906 Py_INCREF(v);
2907 }
2908 else if (_PyErr_Occurred(tstate)) {
2909 goto error;
2910 }
2911 }
2912 else {
2913 v = PyObject_GetItem(locals, name);
2914 if (v == NULL) {
2915 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError))
2916 goto error;
2917 _PyErr_Clear(tstate);
2918 }
2919 }
2920 if (v == NULL) {
2921 v = PyDict_GetItemWithError(f->f_globals, name);
2922 if (v != NULL) {
2923 Py_INCREF(v);
2924 }
2925 else if (_PyErr_Occurred(tstate)) {
2926 goto error;
2927 }
2928 else {
2929 if (PyDict_CheckExact(f->f_builtins)) {
2930 v = PyDict_GetItemWithError(f->f_builtins, name);
2931 if (v == NULL) {
2932 if (!_PyErr_Occurred(tstate)) {
2933 format_exc_check_arg(
2934 tstate, PyExc_NameError,
2935 NAME_ERROR_MSG, name);
2936 }
2937 goto error;
2938 }
2939 Py_INCREF(v);
2940 }
2941 else {
2942 v = PyObject_GetItem(f->f_builtins, name);
2943 if (v == NULL) {
2944 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
2945 format_exc_check_arg(
2946 tstate, PyExc_NameError,
2947 NAME_ERROR_MSG, name);
2948 }
2949 goto error;
2950 }
2951 }
2952 }
2953 }
2954 PUSH(v);
2955 DISPATCH();
2956 }
2957
2958 case TARGET(LOAD_GLOBAL): {
2959 PyObject *name;
2960 PyObject *v;
2961 if (PyDict_CheckExact(f->f_globals)
2962 && PyDict_CheckExact(f->f_builtins))
2963 {
2964 OPCACHE_CHECK();
2965 if (co_opcache != NULL && co_opcache->optimized > 0) {
2966 _PyOpcache_LoadGlobal *lg = &co_opcache->u.lg;
2967
2968 if (lg->globals_ver ==
2969 ((PyDictObject *)f->f_globals)->ma_version_tag
2970 && lg->builtins_ver ==
2971 ((PyDictObject *)f->f_builtins)->ma_version_tag)
2972 {
2973 PyObject *ptr = lg->ptr;
2974 OPCACHE_STAT_GLOBAL_HIT();
2975 assert(ptr != NULL);
2976 Py_INCREF(ptr);
2977 PUSH(ptr);
2978 DISPATCH();
2979 }
2980 }
2981
2982 name = GETITEM(names, oparg);
2983 v = _PyDict_LoadGlobal((PyDictObject *)f->f_globals,
2984 (PyDictObject *)f->f_builtins,
2985 name);
2986 if (v == NULL) {
2987 if (!_PyErr_Occurred(tstate)) {
2988 /* _PyDict_LoadGlobal() returns NULL without raising
2989 * an exception if the key doesn't exist */
2990 format_exc_check_arg(tstate, PyExc_NameError,
2991 NAME_ERROR_MSG, name);
2992 }
2993 goto error;
2994 }
2995
2996 if (co_opcache != NULL) {
2997 _PyOpcache_LoadGlobal *lg = &co_opcache->u.lg;
2998
2999 if (co_opcache->optimized == 0) {
3000 /* Wasn't optimized before. */
3001 OPCACHE_STAT_GLOBAL_OPT();
3002 } else {
3003 OPCACHE_STAT_GLOBAL_MISS();
3004 }
3005
3006 co_opcache->optimized = 1;
3007 lg->globals_ver =
3008 ((PyDictObject *)f->f_globals)->ma_version_tag;
3009 lg->builtins_ver =
3010 ((PyDictObject *)f->f_builtins)->ma_version_tag;
3011 lg->ptr = v; /* borrowed */
3012 }
3013
3014 Py_INCREF(v);
3015 }
3016 else {
3017 /* Slow-path if globals or builtins is not a dict */
3018
3019 /* namespace 1: globals */
3020 name = GETITEM(names, oparg);
3021 v = PyObject_GetItem(f->f_globals, name);
3022 if (v == NULL) {
3023 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
3024 goto error;
3025 }
3026 _PyErr_Clear(tstate);
3027
3028 /* namespace 2: builtins */
3029 v = PyObject_GetItem(f->f_builtins, name);
3030 if (v == NULL) {
3031 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
3032 format_exc_check_arg(
3033 tstate, PyExc_NameError,
3034 NAME_ERROR_MSG, name);
3035 }
3036 goto error;
3037 }
3038 }
3039 }
3040 PUSH(v);
3041 DISPATCH();
3042 }
3043
3044 case TARGET(DELETE_FAST): {
3045 PyObject *v = GETLOCAL(oparg);
3046 if (v != NULL) {
3047 SETLOCAL(oparg, NULL);
3048 DISPATCH();
3049 }
3050 format_exc_check_arg(
3051 tstate, PyExc_UnboundLocalError,
3052 UNBOUNDLOCAL_ERROR_MSG,
3053 PyTuple_GetItem(co->co_varnames, oparg)
3054 );
3055 goto error;
3056 }
3057
3058 case TARGET(DELETE_DEREF): {
3059 PyObject *cell = freevars[oparg];
3060 PyObject *oldobj = PyCell_GET(cell);
3061 if (oldobj != NULL) {
3062 PyCell_SET(cell, NULL);
3063 Py_DECREF(oldobj);
3064 DISPATCH();
3065 }
3066 format_exc_unbound(tstate, co, oparg);
3067 goto error;
3068 }
3069
3070 case TARGET(LOAD_CLOSURE): {
3071 PyObject *cell = freevars[oparg];
3072 Py_INCREF(cell);
3073 PUSH(cell);
3074 DISPATCH();
3075 }
3076
3077 case TARGET(LOAD_CLASSDEREF): {
3078 PyObject *name, *value, *locals = f->f_locals;
3079 Py_ssize_t idx;
3080 assert(locals);
3081 assert(oparg >= PyTuple_GET_SIZE(co->co_cellvars));
3082 idx = oparg - PyTuple_GET_SIZE(co->co_cellvars);
3083 assert(idx >= 0 && idx < PyTuple_GET_SIZE(co->co_freevars));
3084 name = PyTuple_GET_ITEM(co->co_freevars, idx);
3085 if (PyDict_CheckExact(locals)) {
3086 value = PyDict_GetItemWithError(locals, name);
3087 if (value != NULL) {
3088 Py_INCREF(value);
3089 }
3090 else if (_PyErr_Occurred(tstate)) {
3091 goto error;
3092 }
3093 }
3094 else {
3095 value = PyObject_GetItem(locals, name);
3096 if (value == NULL) {
3097 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
3098 goto error;
3099 }
3100 _PyErr_Clear(tstate);
3101 }
3102 }
3103 if (!value) {
3104 PyObject *cell = freevars[oparg];
3105 value = PyCell_GET(cell);
3106 if (value == NULL) {
3107 format_exc_unbound(tstate, co, oparg);
3108 goto error;
3109 }
3110 Py_INCREF(value);
3111 }
3112 PUSH(value);
3113 DISPATCH();
3114 }
3115
3116 case TARGET(LOAD_DEREF): {
3117 PyObject *cell = freevars[oparg];
3118 PyObject *value = PyCell_GET(cell);
3119 if (value == NULL) {
3120 format_exc_unbound(tstate, co, oparg);
3121 goto error;
3122 }
3123 Py_INCREF(value);
3124 PUSH(value);
3125 DISPATCH();
3126 }
3127
3128 case TARGET(STORE_DEREF): {
3129 PyObject *v = POP();
3130 PyObject *cell = freevars[oparg];
3131 PyObject *oldobj = PyCell_GET(cell);
3132 PyCell_SET(cell, v);
3133 Py_XDECREF(oldobj);
3134 DISPATCH();
3135 }
3136
3137 case TARGET(BUILD_STRING): {
3138 PyObject *str;
3139 PyObject *empty = PyUnicode_New(0, 0);
3140 if (empty == NULL) {
3141 goto error;
3142 }
3143 str = _PyUnicode_JoinArray(empty, stack_pointer - oparg, oparg);
3144 Py_DECREF(empty);
3145 if (str == NULL)
3146 goto error;
3147 while (--oparg >= 0) {
3148 PyObject *item = POP();
3149 Py_DECREF(item);
3150 }
3151 PUSH(str);
3152 DISPATCH();
3153 }
3154
3155 case TARGET(BUILD_TUPLE): {
3156 PyObject *tup = PyTuple_New(oparg);
3157 if (tup == NULL)
3158 goto error;
3159 while (--oparg >= 0) {
3160 PyObject *item = POP();
3161 PyTuple_SET_ITEM(tup, oparg, item);
3162 }
3163 PUSH(tup);
3164 DISPATCH();
3165 }
3166
3167 case TARGET(BUILD_LIST): {
3168 PyObject *list = PyList_New(oparg);
3169 if (list == NULL)
3170 goto error;
3171 while (--oparg >= 0) {
3172 PyObject *item = POP();
3173 PyList_SET_ITEM(list, oparg, item);
3174 }
3175 PUSH(list);
3176 DISPATCH();
3177 }
3178
3179 case TARGET(LIST_TO_TUPLE): {
3180 PyObject *list = POP();
3181 PyObject *tuple = PyList_AsTuple(list);
3182 Py_DECREF(list);
3183 if (tuple == NULL) {
3184 goto error;
3185 }
3186 PUSH(tuple);
3187 DISPATCH();
3188 }
3189
3190 case TARGET(LIST_EXTEND): {
3191 PyObject *iterable = POP();
3192 PyObject *list = PEEK(oparg);
3193 PyObject *none_val = _PyList_Extend((PyListObject *)list, iterable);
3194 if (none_val == NULL) {
3195 if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError) &&
3196 (Py_TYPE(iterable)->tp_iter == NULL && !PySequence_Check(iterable)))
3197 {
3198 _PyErr_Clear(tstate);
3199 _PyErr_Format(tstate, PyExc_TypeError,
3200 "Value after * must be an iterable, not %.200s",
3201 Py_TYPE(iterable)->tp_name);
3202 }
3203 Py_DECREF(iterable);
3204 goto error;
3205 }
3206 Py_DECREF(none_val);
3207 Py_DECREF(iterable);
3208 DISPATCH();
3209 }
3210
3211 case TARGET(SET_UPDATE): {
3212 PyObject *iterable = POP();
3213 PyObject *set = PEEK(oparg);
3214 int err = _PySet_Update(set, iterable);
3215 Py_DECREF(iterable);
3216 if (err < 0) {
3217 goto error;
3218 }
3219 DISPATCH();
3220 }
3221
3222 case TARGET(BUILD_SET): {
3223 PyObject *set = PySet_New(NULL);
3224 int err = 0;
3225 int i;
3226 if (set == NULL)
3227 goto error;
3228 for (i = oparg; i > 0; i--) {
3229 PyObject *item = PEEK(i);
3230 if (err == 0)
3231 err = PySet_Add(set, item);
3232 Py_DECREF(item);
3233 }
3234 STACK_SHRINK(oparg);
3235 if (err != 0) {
3236 Py_DECREF(set);
3237 goto error;
3238 }
3239 PUSH(set);
3240 DISPATCH();
3241 }
3242
3243 case TARGET(BUILD_MAP): {
3244 Py_ssize_t i;
3245 PyObject *map = _PyDict_NewPresized((Py_ssize_t)oparg);
3246 if (map == NULL)
3247 goto error;
3248 for (i = oparg; i > 0; i--) {
3249 int err;
3250 PyObject *key = PEEK(2*i);
3251 PyObject *value = PEEK(2*i - 1);
3252 err = PyDict_SetItem(map, key, value);
3253 if (err != 0) {
3254 Py_DECREF(map);
3255 goto error;
3256 }
3257 }
3258
3259 while (oparg--) {
3260 Py_DECREF(POP());
3261 Py_DECREF(POP());
3262 }
3263 PUSH(map);
3264 DISPATCH();
3265 }
3266
3267 case TARGET(SETUP_ANNOTATIONS): {
3268 _Py_IDENTIFIER(__annotations__);
3269 int err;
3270 PyObject *ann_dict;
3271 if (f->f_locals == NULL) {
3272 _PyErr_Format(tstate, PyExc_SystemError,
3273 "no locals found when setting up annotations");
3274 goto error;
3275 }
3276 /* check if __annotations__ in locals()... */
3277 if (PyDict_CheckExact(f->f_locals)) {
3278 ann_dict = _PyDict_GetItemIdWithError(f->f_locals,
3279 &PyId___annotations__);
3280 if (ann_dict == NULL) {
3281 if (_PyErr_Occurred(tstate)) {
3282 goto error;
3283 }
3284 /* ...if not, create a new one */
3285 ann_dict = PyDict_New();
3286 if (ann_dict == NULL) {
3287 goto error;
3288 }
3289 err = _PyDict_SetItemId(f->f_locals,
3290 &PyId___annotations__, ann_dict);
3291 Py_DECREF(ann_dict);
3292 if (err != 0) {
3293 goto error;
3294 }
3295 }
3296 }
3297 else {
3298 /* do the same if locals() is not a dict */
3299 PyObject *ann_str = _PyUnicode_FromId(&PyId___annotations__);
3300 if (ann_str == NULL) {
3301 goto error;
3302 }
3303 ann_dict = PyObject_GetItem(f->f_locals, ann_str);
3304 if (ann_dict == NULL) {
3305 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
3306 goto error;
3307 }
3308 _PyErr_Clear(tstate);
3309 ann_dict = PyDict_New();
3310 if (ann_dict == NULL) {
3311 goto error;
3312 }
3313 err = PyObject_SetItem(f->f_locals, ann_str, ann_dict);
3314 Py_DECREF(ann_dict);
3315 if (err != 0) {
3316 goto error;
3317 }
3318 }
3319 else {
3320 Py_DECREF(ann_dict);
3321 }
3322 }
3323 DISPATCH();
3324 }
3325
3326 case TARGET(BUILD_CONST_KEY_MAP): {
3327 Py_ssize_t i;
3328 PyObject *map;
3329 PyObject *keys = TOP();
3330 if (!PyTuple_CheckExact(keys) ||
3331 PyTuple_GET_SIZE(keys) != (Py_ssize_t)oparg) {
3332 _PyErr_SetString(tstate, PyExc_SystemError,
3333 "bad BUILD_CONST_KEY_MAP keys argument");
3334 goto error;
3335 }
3336 map = _PyDict_NewPresized((Py_ssize_t)oparg);
3337 if (map == NULL) {
3338 goto error;
3339 }
3340 for (i = oparg; i > 0; i--) {
3341 int err;
3342 PyObject *key = PyTuple_GET_ITEM(keys, oparg - i);
3343 PyObject *value = PEEK(i + 1);
3344 err = PyDict_SetItem(map, key, value);
3345 if (err != 0) {
3346 Py_DECREF(map);
3347 goto error;
3348 }
3349 }
3350
3351 Py_DECREF(POP());
3352 while (oparg--) {
3353 Py_DECREF(POP());
3354 }
3355 PUSH(map);
3356 DISPATCH();
3357 }
3358
3359 case TARGET(DICT_UPDATE): {
3360 PyObject *update = POP();
3361 PyObject *dict = PEEK(oparg);
3362 if (PyDict_Update(dict, update) < 0) {
3363 if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) {
3364 _PyErr_Format(tstate, PyExc_TypeError,
3365 "'%.200s' object is not a mapping",
3366 Py_TYPE(update)->tp_name);
3367 }
3368 Py_DECREF(update);
3369 goto error;
3370 }
3371 Py_DECREF(update);
3372 DISPATCH();
3373 }
3374
3375 case TARGET(DICT_MERGE): {
3376 PyObject *update = POP();
3377 PyObject *dict = PEEK(oparg);
3378
3379 if (_PyDict_MergeEx(dict, update, 2) < 0) {
3380 format_kwargs_error(tstate, PEEK(2 + oparg), update);
3381 Py_DECREF(update);
3382 goto error;
3383 }
3384 Py_DECREF(update);
3385 PREDICT(CALL_FUNCTION_EX);
3386 DISPATCH();
3387 }
3388
3389 case TARGET(MAP_ADD): {
3390 PyObject *value = TOP();
3391 PyObject *key = SECOND();
3392 PyObject *map;
3393 int err;
3394 STACK_SHRINK(2);
3395 map = PEEK(oparg); /* dict */
3396 assert(PyDict_CheckExact(map));
3397 err = PyDict_SetItem(map, key, value); /* map[key] = value */
3398 Py_DECREF(value);
3399 Py_DECREF(key);
3400 if (err != 0)
3401 goto error;
3402 PREDICT(JUMP_ABSOLUTE);
3403 DISPATCH();
3404 }
3405
3406 case TARGET(LOAD_ATTR): {
3407 PyObject *name = GETITEM(names, oparg);
3408 PyObject *owner = TOP();
3409
3410 PyTypeObject *type = Py_TYPE(owner);
3411 PyObject *res;
3412 PyObject **dictptr;
3413 PyObject *dict;
3414 _PyOpCodeOpt_LoadAttr *la;
3415
3416 OPCACHE_STAT_ATTR_TOTAL();
3417
3418 OPCACHE_CHECK();
3419 if (co_opcache != NULL && PyType_HasFeature(type, Py_TPFLAGS_VALID_VERSION_TAG))
3420 {
3421 if (co_opcache->optimized > 0) {
3422 // Fast path -- cache hit makes LOAD_ATTR ~30% faster.
3423 la = &co_opcache->u.la;
3424 if (la->type == type && la->tp_version_tag == type->tp_version_tag)
3425 {
3426 // Hint >= 0 is a dict index; hint == -1 is a dict miss.
3427 // Hint < -1 is an inverted slot offset: offset is strictly > 0,
3428 // so ~offset is strictly < -1 (assuming 2's complement).
3429 if (la->hint < -1) {
3430 // Even faster path -- slot hint.
3431 Py_ssize_t offset = ~la->hint;
3432 // fprintf(stderr, "Using hint for offset %zd\n", offset);
3433 char *addr = (char *)owner + offset;
3434 res = *(PyObject **)addr;
3435 if (res != NULL) {
3436 Py_INCREF(res);
3437 SET_TOP(res);
3438 Py_DECREF(owner);
3439 DISPATCH();
3440 }
3441 // Else slot is NULL. Fall through to slow path to raise AttributeError(name).
3442 // Don't DEOPT, since the slot is still there.
3443 } else {
3444 // Fast path for dict.
3445 assert(type->tp_dict != NULL);
3446 assert(type->tp_dictoffset > 0);
3447
3448 dictptr = (PyObject **) ((char *)owner + type->tp_dictoffset);
3449 dict = *dictptr;
3450 if (dict != NULL && PyDict_CheckExact(dict)) {
3451 Py_ssize_t hint = la->hint;
3452 Py_INCREF(dict);
3453 res = NULL;
3454 assert(!_PyErr_Occurred(tstate));
3455 la->hint = _PyDict_GetItemHint((PyDictObject*)dict, name, hint, &res);
3456 if (res != NULL) {
3457 assert(la->hint >= 0);
3458 if (la->hint == hint && hint >= 0) {
3459 // Our hint has helped -- cache hit.
3460 OPCACHE_STAT_ATTR_HIT();
3461 } else {
3462 // The hint we provided didn't work.
3463 // Maybe next time?
3464 OPCACHE_MAYBE_DEOPT_LOAD_ATTR();
3465 }
3466
3467 Py_INCREF(res);
3468 SET_TOP(res);
3469 Py_DECREF(owner);
3470 Py_DECREF(dict);
3471 DISPATCH();
3472 }
3473 else {
3474 _PyErr_Clear(tstate);
3475 // This attribute can be missing sometimes;
3476 // we don't want to optimize this lookup.
3477 OPCACHE_DEOPT_LOAD_ATTR();
3478 Py_DECREF(dict);
3479 }
3480 }
3481 else {
3482 // There is no dict, or __dict__ doesn't satisfy PyDict_CheckExact.
3483 OPCACHE_DEOPT_LOAD_ATTR();
3484 }
3485 }
3486 }
3487 else {
3488 // The type of the object has either been updated,
3489 // or is different. Maybe it will stabilize?
3490 OPCACHE_MAYBE_DEOPT_LOAD_ATTR();
3491 }
3492 OPCACHE_STAT_ATTR_MISS();
3493 }
3494
3495 if (co_opcache != NULL && // co_opcache can be NULL after a DEOPT() call.
3496 type->tp_getattro == PyObject_GenericGetAttr)
3497 {
3498 if (type->tp_dict == NULL) {
3499 if (PyType_Ready(type) < 0) {
3500 Py_DECREF(owner);
3501 SET_TOP(NULL);
3502 goto error;
3503 }
3504 }
3505 PyObject *descr = _PyType_Lookup(type, name);
3506 if (descr != NULL) {
3507 // We found an attribute with a data-like descriptor.
3508 PyTypeObject *dtype = Py_TYPE(descr);
3509 if (dtype == &PyMemberDescr_Type) { // It's a slot
3510 PyMemberDescrObject *member = (PyMemberDescrObject *)descr;
3511 struct PyMemberDef *dmem = member->d_member;
3512 if (dmem->type == T_OBJECT_EX) {
3513 Py_ssize_t offset = dmem->offset;
3514 assert(offset > 0); // 0 would be confused with dict hint == -1 (miss).
3515
3516 if (co_opcache->optimized == 0) {
3517 // First time we optimize this opcode.
3518 OPCACHE_STAT_ATTR_OPT();
3519 co_opcache->optimized = OPCODE_CACHE_MAX_TRIES;
3520 // fprintf(stderr, "Setting hint for %s, offset %zd\n", dmem->name, offset);
3521 }
3522
3523 la = &co_opcache->u.la;
3524 la->type = type;
3525 la->tp_version_tag = type->tp_version_tag;
3526 la->hint = ~offset;
3527
3528 char *addr = (char *)owner + offset;
3529 res = *(PyObject **)addr;
3530 if (res != NULL) {
3531 Py_INCREF(res);
3532 Py_DECREF(owner);
3533 SET_TOP(res);
3534
3535 DISPATCH();
3536 }
3537 // Else slot is NULL. Fall through to slow path to raise AttributeError(name).
3538 }
3539 // Else it's a slot of a different type. We don't handle those.
3540 }
3541 // Else it's some other kind of descriptor that we don't handle.
3542 OPCACHE_DEOPT_LOAD_ATTR();
3543 }
3544 else if (type->tp_dictoffset > 0) {
3545 // We found an instance with a __dict__.
3546 dictptr = (PyObject **) ((char *)owner + type->tp_dictoffset);
3547 dict = *dictptr;
3548
3549 if (dict != NULL && PyDict_CheckExact(dict)) {
3550 Py_INCREF(dict);
3551 res = NULL;
3552 assert(!_PyErr_Occurred(tstate));
3553 Py_ssize_t hint = _PyDict_GetItemHint((PyDictObject*)dict, name, -1, &res);
3554 if (res != NULL) {
3555 Py_INCREF(res);
3556 Py_DECREF(dict);
3557 Py_DECREF(owner);
3558 SET_TOP(res);
3559
3560 if (co_opcache->optimized == 0) {
3561 // First time we optimize this opcode.
3562 OPCACHE_STAT_ATTR_OPT();
3563 co_opcache->optimized = OPCODE_CACHE_MAX_TRIES;
3564 }
3565
3566 la = &co_opcache->u.la;
3567 la->type = type;
3568 la->tp_version_tag = type->tp_version_tag;
3569 assert(hint >= 0);
3570 la->hint = hint;
3571
3572 DISPATCH();
3573 }
3574 else {
3575 _PyErr_Clear(tstate);
3576 }
3577 Py_DECREF(dict);
3578 } else {
3579 // There is no dict, or __dict__ doesn't satisfy PyDict_CheckExact.
3580 OPCACHE_DEOPT_LOAD_ATTR();
3581 }
3582 } else {
3583 // The object's class does not have a tp_dictoffset we can use.
3584 OPCACHE_DEOPT_LOAD_ATTR();
3585 }
3586 } else if (type->tp_getattro != PyObject_GenericGetAttr) {
3587 OPCACHE_DEOPT_LOAD_ATTR();
3588 }
3589 }
3590
3591 // Slow path.
3592 res = PyObject_GetAttr(owner, name);
3593 Py_DECREF(owner);
3594 SET_TOP(res);
3595 if (res == NULL)
3596 goto error;
3597 DISPATCH();
3598 }
3599
3600 case TARGET(COMPARE_OP): {
3601 assert(oparg <= Py_GE);
3602 PyObject *right = POP();
3603 PyObject *left = TOP();
3604 PyObject *res = PyObject_RichCompare(left, right, oparg);
3605 SET_TOP(res);
3606 Py_DECREF(left);
3607 Py_DECREF(right);
3608 if (res == NULL)
3609 goto error;
3610 PREDICT(POP_JUMP_IF_FALSE);
3611 PREDICT(POP_JUMP_IF_TRUE);
3612 DISPATCH();
3613 }
3614
3615 case TARGET(IS_OP): {
3616 PyObject *right = POP();
3617 PyObject *left = TOP();
3618 int res = Py_Is(left, right) ^ oparg;
3619 PyObject *b = res ? Py_True : Py_False;
3620 Py_INCREF(b);
3621 SET_TOP(b);
3622 Py_DECREF(left);
3623 Py_DECREF(right);
3624 PREDICT(POP_JUMP_IF_FALSE);
3625 PREDICT(POP_JUMP_IF_TRUE);
3626 DISPATCH();
3627 }
3628
3629 case TARGET(CONTAINS_OP): {
3630 PyObject *right = POP();
3631 PyObject *left = POP();
3632 int res = PySequence_Contains(right, left);
3633 Py_DECREF(left);
3634 Py_DECREF(right);
3635 if (res < 0) {
3636 goto error;
3637 }
3638 PyObject *b = (res^oparg) ? Py_True : Py_False;
3639 Py_INCREF(b);
3640 PUSH(b);
3641 PREDICT(POP_JUMP_IF_FALSE);
3642 PREDICT(POP_JUMP_IF_TRUE);
3643 DISPATCH();
3644 }
3645
3646 #define CANNOT_CATCH_MSG "catching classes that do not inherit from "\
3647 "BaseException is not allowed"
3648
3649 case TARGET(JUMP_IF_NOT_EXC_MATCH): {
3650 PyObject *right = POP();
3651 PyObject *left = POP();
3652 if (PyTuple_Check(right)) {
3653 Py_ssize_t i, length;
3654 length = PyTuple_GET_SIZE(right);
3655 for (i = 0; i < length; i++) {
3656 PyObject *exc = PyTuple_GET_ITEM(right, i);
3657 if (!PyExceptionClass_Check(exc)) {
3658 _PyErr_SetString(tstate, PyExc_TypeError,
3659 CANNOT_CATCH_MSG);
3660 Py_DECREF(left);
3661 Py_DECREF(right);
3662 goto error;
3663 }
3664 }
3665 }
3666 else {
3667 if (!PyExceptionClass_Check(right)) {
3668 _PyErr_SetString(tstate, PyExc_TypeError,
3669 CANNOT_CATCH_MSG);
3670 Py_DECREF(left);
3671 Py_DECREF(right);
3672 goto error;
3673 }
3674 }
3675 int res = PyErr_GivenExceptionMatches(left, right);
3676 Py_DECREF(left);
3677 Py_DECREF(right);
3678 if (res > 0) {
3679 /* Exception matches -- Do nothing */;
3680 }
3681 else if (res == 0) {
3682 JUMPTO(oparg);
3683 }
3684 else {
3685 goto error;
3686 }
3687 DISPATCH();
3688 }
3689
3690 case TARGET(IMPORT_NAME): {
3691 PyObject *name = GETITEM(names, oparg);
3692 PyObject *fromlist = POP();
3693 PyObject *level = TOP();
3694 PyObject *res;
3695 res = import_name(tstate, f, name, fromlist, level);
3696 Py_DECREF(level);
3697 Py_DECREF(fromlist);
3698 SET_TOP(res);
3699 if (res == NULL)
3700 goto error;
3701 DISPATCH();
3702 }
3703
3704 case TARGET(IMPORT_STAR): {
3705 PyObject *from = POP(), *locals;
3706 int err;
3707 if (PyFrame_FastToLocalsWithError(f) < 0) {
3708 Py_DECREF(from);
3709 goto error;
3710 }
3711
3712 locals = f->f_locals;
3713 if (locals == NULL) {
3714 _PyErr_SetString(tstate, PyExc_SystemError,
3715 "no locals found during 'import *'");
3716 Py_DECREF(from);
3717 goto error;
3718 }
3719 err = import_all_from(tstate, locals, from);
3720 PyFrame_LocalsToFast(f, 0);
3721 Py_DECREF(from);
3722 if (err != 0)
3723 goto error;
3724 DISPATCH();
3725 }
3726
3727 case TARGET(IMPORT_FROM): {
3728 PyObject *name = GETITEM(names, oparg);
3729 PyObject *from = TOP();
3730 PyObject *res;
3731 res = import_from(tstate, from, name);
3732 PUSH(res);
3733 if (res == NULL)
3734 goto error;
3735 DISPATCH();
3736 }
3737
3738 case TARGET(JUMP_FORWARD): {
3739 JUMPBY(oparg);
3740 DISPATCH();
3741 }
3742
3743 case TARGET(POP_JUMP_IF_FALSE): {
3744 PREDICTED(POP_JUMP_IF_FALSE);
3745 PyObject *cond = POP();
3746 int err;
3747 if (Py_IsTrue(cond)) {
3748 Py_DECREF(cond);
3749 DISPATCH();
3750 }
3751 if (Py_IsFalse(cond)) {
3752 Py_DECREF(cond);
3753 JUMPTO(oparg);
3754 CHECK_EVAL_BREAKER();
3755 DISPATCH();
3756 }
3757 err = PyObject_IsTrue(cond);
3758 Py_DECREF(cond);
3759 if (err > 0)
3760 ;
3761 else if (err == 0) {
3762 JUMPTO(oparg);
3763 CHECK_EVAL_BREAKER();
3764 }
3765 else
3766 goto error;
3767 DISPATCH();
3768 }
3769
3770 case TARGET(POP_JUMP_IF_TRUE): {
3771 PREDICTED(POP_JUMP_IF_TRUE);
3772 PyObject *cond = POP();
3773 int err;
3774 if (Py_IsFalse(cond)) {
3775 Py_DECREF(cond);
3776 DISPATCH();
3777 }
3778 if (Py_IsTrue(cond)) {
3779 Py_DECREF(cond);
3780 JUMPTO(oparg);
3781 CHECK_EVAL_BREAKER();
3782 DISPATCH();
3783 }
3784 err = PyObject_IsTrue(cond);
3785 Py_DECREF(cond);
3786 if (err > 0) {
3787 JUMPTO(oparg);
3788 CHECK_EVAL_BREAKER();
3789 }
3790 else if (err == 0)
3791 ;
3792 else
3793 goto error;
3794 DISPATCH();
3795 }
3796
3797 case TARGET(JUMP_IF_FALSE_OR_POP): {
3798 PyObject *cond = TOP();
3799 int err;
3800 if (Py_IsTrue(cond)) {
3801 STACK_SHRINK(1);
3802 Py_DECREF(cond);
3803 DISPATCH();
3804 }
3805 if (Py_IsFalse(cond)) {
3806 JUMPTO(oparg);
3807 DISPATCH();
3808 }
3809 err = PyObject_IsTrue(cond);
3810 if (err > 0) {
3811 STACK_SHRINK(1);
3812 Py_DECREF(cond);
3813 }
3814 else if (err == 0)
3815 JUMPTO(oparg);
3816 else
3817 goto error;
3818 DISPATCH();
3819 }
3820
3821 case TARGET(JUMP_IF_TRUE_OR_POP): {
3822 PyObject *cond = TOP();
3823 int err;
3824 if (Py_IsFalse(cond)) {
3825 STACK_SHRINK(1);
3826 Py_DECREF(cond);
3827 DISPATCH();
3828 }
3829 if (Py_IsTrue(cond)) {
3830 JUMPTO(oparg);
3831 DISPATCH();
3832 }
3833 err = PyObject_IsTrue(cond);
3834 if (err > 0) {
3835 JUMPTO(oparg);
3836 }
3837 else if (err == 0) {
3838 STACK_SHRINK(1);
3839 Py_DECREF(cond);
3840 }
3841 else
3842 goto error;
3843 DISPATCH();
3844 }
3845
3846 case TARGET(JUMP_ABSOLUTE): {
3847 PREDICTED(JUMP_ABSOLUTE);
3848 JUMPTO(oparg);
3849 CHECK_EVAL_BREAKER();
3850 DISPATCH();
3851 }
3852
3853 case TARGET(GET_LEN): {
3854 // PUSH(len(TOS))
3855 Py_ssize_t len_i = PyObject_Length(TOP());
3856 if (len_i < 0) {
3857 goto error;
3858 }
3859 PyObject *len_o = PyLong_FromSsize_t(len_i);
3860 if (len_o == NULL) {
3861 goto error;
3862 }
3863 PUSH(len_o);
3864 DISPATCH();
3865 }
3866
3867 case TARGET(MATCH_CLASS): {
3868 // Pop TOS. On success, set TOS to True and TOS1 to a tuple of
3869 // attributes. On failure, set TOS to False.
3870 PyObject *names = POP();
3871 PyObject *type = TOP();
3872 PyObject *subject = SECOND();
3873 assert(PyTuple_CheckExact(names));
3874 PyObject *attrs = match_class(tstate, subject, type, oparg, names);
3875 Py_DECREF(names);
3876 if (attrs) {
3877 // Success!
3878 assert(PyTuple_CheckExact(attrs));
3879 Py_DECREF(subject);
3880 SET_SECOND(attrs);
3881 }
3882 else if (_PyErr_Occurred(tstate)) {
3883 goto error;
3884 }
3885 Py_DECREF(type);
3886 SET_TOP(PyBool_FromLong(!!attrs));
3887 DISPATCH();
3888 }
3889
3890 case TARGET(MATCH_MAPPING): {
3891 PyObject *subject = TOP();
3892 int match = Py_TYPE(subject)->tp_flags & Py_TPFLAGS_MAPPING;
3893 PyObject *res = match ? Py_True : Py_False;
3894 Py_INCREF(res);
3895 PUSH(res);
3896 DISPATCH();
3897 }
3898
3899 case TARGET(MATCH_SEQUENCE): {
3900 PyObject *subject = TOP();
3901 int match = Py_TYPE(subject)->tp_flags & Py_TPFLAGS_SEQUENCE;
3902 PyObject *res = match ? Py_True : Py_False;
3903 Py_INCREF(res);
3904 PUSH(res);
3905 DISPATCH();
3906 }
3907
3908 case TARGET(MATCH_KEYS): {
3909 // On successful match for all keys, PUSH(values) and PUSH(True).
3910 // Otherwise, PUSH(None) and PUSH(False).
3911 PyObject *keys = TOP();
3912 PyObject *subject = SECOND();
3913 PyObject *values_or_none = match_keys(tstate, subject, keys);
3914 if (values_or_none == NULL) {
3915 goto error;
3916 }
3917 PUSH(values_or_none);
3918 if (Py_IsNone(values_or_none)) {
3919 Py_INCREF(Py_False);
3920 PUSH(Py_False);
3921 DISPATCH();
3922 }
3923 assert(PyTuple_CheckExact(values_or_none));
3924 Py_INCREF(Py_True);
3925 PUSH(Py_True);
3926 DISPATCH();
3927 }
3928
3929 case TARGET(COPY_DICT_WITHOUT_KEYS): {
3930 // rest = dict(TOS1)
3931 // for key in TOS:
3932 // del rest[key]
3933 // SET_TOP(rest)
3934 PyObject *keys = TOP();
3935 PyObject *subject = SECOND();
3936 PyObject *rest = PyDict_New();
3937 if (rest == NULL || PyDict_Update(rest, subject)) {
3938 Py_XDECREF(rest);
3939 goto error;
3940 }
3941 // This may seem a bit inefficient, but keys is rarely big enough to
3942 // actually impact runtime.
3943 assert(PyTuple_CheckExact(keys));
3944 for (Py_ssize_t i = 0; i < PyTuple_GET_SIZE(keys); i++) {
3945 if (PyDict_DelItem(rest, PyTuple_GET_ITEM(keys, i))) {
3946 Py_DECREF(rest);
3947 goto error;
3948 }
3949 }
3950 Py_DECREF(keys);
3951 SET_TOP(rest);
3952 DISPATCH();
3953 }
3954
3955 case TARGET(GET_ITER): {
3956 /* before: [obj]; after [getiter(obj)] */
3957 PyObject *iterable = TOP();
3958 PyObject *iter = PyObject_GetIter(iterable);
3959 Py_DECREF(iterable);
3960 SET_TOP(iter);
3961 if (iter == NULL)
3962 goto error;
3963 PREDICT(FOR_ITER);
3964 PREDICT(CALL_FUNCTION);
3965 DISPATCH();
3966 }
3967
3968 case TARGET(GET_YIELD_FROM_ITER): {
3969 /* before: [obj]; after [getiter(obj)] */
3970 PyObject *iterable = TOP();
3971 PyObject *iter;
3972 if (PyCoro_CheckExact(iterable)) {
3973 /* `iterable` is a coroutine */
3974 if (!(co->co_flags & (CO_COROUTINE | CO_ITERABLE_COROUTINE))) {
3975 /* and it is used in a 'yield from' expression of a
3976 regular generator. */
3977 Py_DECREF(iterable);
3978 SET_TOP(NULL);
3979 _PyErr_SetString(tstate, PyExc_TypeError,
3980 "cannot 'yield from' a coroutine object "
3981 "in a non-coroutine generator");
3982 goto error;
3983 }
3984 }
3985 else if (!PyGen_CheckExact(iterable)) {
3986 /* `iterable` is not a generator. */
3987 iter = PyObject_GetIter(iterable);
3988 Py_DECREF(iterable);
3989 SET_TOP(iter);
3990 if (iter == NULL)
3991 goto error;
3992 }
3993 PREDICT(LOAD_CONST);
3994 DISPATCH();
3995 }
3996
3997 case TARGET(FOR_ITER): {
3998 PREDICTED(FOR_ITER);
3999 /* before: [iter]; after: [iter, iter()] *or* [] */
4000 PyObject *iter = TOP();
4001 PyObject *next = (*Py_TYPE(iter)->tp_iternext)(iter);
4002 if (next != NULL) {
4003 PUSH(next);
4004 PREDICT(STORE_FAST);
4005 PREDICT(UNPACK_SEQUENCE);
4006 DISPATCH();
4007 }
4008 if (_PyErr_Occurred(tstate)) {
4009 if (!_PyErr_ExceptionMatches(tstate, PyExc_StopIteration)) {
4010 goto error;
4011 }
4012 else if (tstate->c_tracefunc != NULL) {
4013 call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj, tstate, f, &trace_info);
4014 }
4015 _PyErr_Clear(tstate);
4016 }
4017 /* iterator ended normally */
4018 STACK_SHRINK(1);
4019 Py_DECREF(iter);
4020 JUMPBY(oparg);
4021 DISPATCH();
4022 }
4023
4024 case TARGET(SETUP_FINALLY): {
4025 PyFrame_BlockSetup(f, SETUP_FINALLY, INSTR_OFFSET() + oparg,
4026 STACK_LEVEL());
4027 DISPATCH();
4028 }
4029
4030 case TARGET(BEFORE_ASYNC_WITH): {
4031 _Py_IDENTIFIER(__aenter__);
4032 _Py_IDENTIFIER(__aexit__);
4033 PyObject *mgr = TOP();
4034 PyObject *enter = special_lookup(tstate, mgr, &PyId___aenter__);
4035 PyObject *res;
4036 if (enter == NULL) {
4037 goto error;
4038 }
4039 PyObject *exit = special_lookup(tstate, mgr, &PyId___aexit__);
4040 if (exit == NULL) {
4041 Py_DECREF(enter);
4042 goto error;
4043 }
4044 SET_TOP(exit);
4045 Py_DECREF(mgr);
4046 res = _PyObject_CallNoArg(enter);
4047 Py_DECREF(enter);
4048 if (res == NULL)
4049 goto error;
4050 PUSH(res);
4051 PREDICT(GET_AWAITABLE);
4052 DISPATCH();
4053 }
4054
4055 case TARGET(SETUP_ASYNC_WITH): {
4056 PyObject *res = POP();
4057 /* Setup the finally block before pushing the result
4058 of __aenter__ on the stack. */
4059 PyFrame_BlockSetup(f, SETUP_FINALLY, INSTR_OFFSET() + oparg,
4060 STACK_LEVEL());
4061 PUSH(res);
4062 DISPATCH();
4063 }
4064
4065 case TARGET(SETUP_WITH): {
4066 _Py_IDENTIFIER(__enter__);
4067 _Py_IDENTIFIER(__exit__);
4068 PyObject *mgr = TOP();
4069 PyObject *enter = special_lookup(tstate, mgr, &PyId___enter__);
4070 PyObject *res;
4071 if (enter == NULL) {
4072 goto error;
4073 }
4074 PyObject *exit = special_lookup(tstate, mgr, &PyId___exit__);
4075 if (exit == NULL) {
4076 Py_DECREF(enter);
4077 goto error;
4078 }
4079 SET_TOP(exit);
4080 Py_DECREF(mgr);
4081 res = _PyObject_CallNoArg(enter);
4082 Py_DECREF(enter);
4083 if (res == NULL)
4084 goto error;
4085 /* Setup the finally block before pushing the result
4086 of __enter__ on the stack. */
4087 PyFrame_BlockSetup(f, SETUP_FINALLY, INSTR_OFFSET() + oparg,
4088 STACK_LEVEL());
4089
4090 PUSH(res);
4091 DISPATCH();
4092 }
4093
4094 case TARGET(WITH_EXCEPT_START): {
4095 /* At the top of the stack are 7 values:
4096 - (TOP, SECOND, THIRD) = exc_info()
4097 - (FOURTH, FIFTH, SIXTH) = previous exception for EXCEPT_HANDLER
4098 - SEVENTH: the context.__exit__ bound method
4099 We call SEVENTH(TOP, SECOND, THIRD).
4100 Then we push again the TOP exception and the __exit__
4101 return value.
4102 */
4103 PyObject *exit_func;
4104 PyObject *exc, *val, *tb, *res;
4105
4106 exc = TOP();
4107 val = SECOND();
4108 tb = THIRD();
4109 assert(!Py_IsNone(exc));
4110 assert(!PyLong_Check(exc));
4111 exit_func = PEEK(7);
4112 PyObject *stack[4] = {NULL, exc, val, tb};
4113 res = PyObject_Vectorcall(exit_func, stack + 1,
4114 3 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL);
4115 if (res == NULL)
4116 goto error;
4117
4118 PUSH(res);
4119 DISPATCH();
4120 }
4121
4122 case TARGET(LOAD_METHOD): {
4123 /* Designed to work in tandem with CALL_METHOD. */
4124 PyObject *name = GETITEM(names, oparg);
4125 PyObject *obj = TOP();
4126 PyObject *meth = NULL;
4127
4128 int meth_found = _PyObject_GetMethod(obj, name, &meth);
4129
4130 if (meth == NULL) {
4131 /* Most likely attribute wasn't found. */
4132 goto error;
4133 }
4134
4135 if (meth_found) {
4136 /* We can bypass temporary bound method object.
4137 meth is unbound method and obj is self.
4138
4139 meth | self | arg1 | ... | argN
4140 */
4141 SET_TOP(meth);
4142 PUSH(obj); // self
4143 }
4144 else {
4145 /* meth is not an unbound method (but a regular attr, or
4146 something was returned by a descriptor protocol). Set
4147 the second element of the stack to NULL, to signal
4148 CALL_METHOD that it's not a method call.
4149
4150 NULL | meth | arg1 | ... | argN
4151 */
4152 SET_TOP(NULL);
4153 Py_DECREF(obj);
4154 PUSH(meth);
4155 }
4156 DISPATCH();
4157 }
4158
4159 case TARGET(CALL_METHOD): {
4160 /* Designed to work in tamdem with LOAD_METHOD. */
4161 PyObject **sp, *res, *meth;
4162
4163 sp = stack_pointer;
4164
4165 meth = PEEK(oparg + 2);
4166 if (meth == NULL) {
4167 /* `meth` is NULL when LOAD_METHOD thinks that it's not
4168 a method call.
4169
4170 Stack layout:
4171
4172 ... | NULL | callable | arg1 | ... | argN
4173 ^- TOP()
4174 ^- (-oparg)
4175 ^- (-oparg-1)
4176 ^- (-oparg-2)
4177
4178 `callable` will be POPed by call_function.
4179 NULL will will be POPed manually later.
4180 */
4181 res = call_function(tstate, &trace_info, &sp, oparg, NULL);
4182 stack_pointer = sp;
4183 (void)POP(); /* POP the NULL. */
4184 }
4185 else {
4186 /* This is a method call. Stack layout:
4187
4188 ... | method | self | arg1 | ... | argN
4189 ^- TOP()
4190 ^- (-oparg)
4191 ^- (-oparg-1)
4192 ^- (-oparg-2)
4193
4194 `self` and `method` will be POPed by call_function.
4195 We'll be passing `oparg + 1` to call_function, to
4196 make it accept the `self` as a first argument.
4197 */
4198 res = call_function(tstate, &trace_info, &sp, oparg + 1, NULL);
4199 stack_pointer = sp;
4200 }
4201
4202 PUSH(res);
4203 if (res == NULL)
4204 goto error;
4205 CHECK_EVAL_BREAKER();
4206 DISPATCH();
4207 }
4208
4209 case TARGET(CALL_FUNCTION): {
4210 PREDICTED(CALL_FUNCTION);
4211 PyObject **sp, *res;
4212 sp = stack_pointer;
4213 res = call_function(tstate, &trace_info, &sp, oparg, NULL);
4214 stack_pointer = sp;
4215 PUSH(res);
4216 if (res == NULL) {
4217 goto error;
4218 }
4219 CHECK_EVAL_BREAKER();
4220 DISPATCH();
4221 }
4222
4223 case TARGET(CALL_FUNCTION_KW): {
4224 PyObject **sp, *res, *names;
4225
4226 names = POP();
4227 assert(PyTuple_Check(names));
4228 assert(PyTuple_GET_SIZE(names) <= oparg);
4229 /* We assume without checking that names contains only strings */
4230 sp = stack_pointer;
4231 res = call_function(tstate, &trace_info, &sp, oparg, names);
4232 stack_pointer = sp;
4233 PUSH(res);
4234 Py_DECREF(names);
4235
4236 if (res == NULL) {
4237 goto error;
4238 }
4239 CHECK_EVAL_BREAKER();
4240 DISPATCH();
4241 }
4242
4243 case TARGET(CALL_FUNCTION_EX): {
4244 PREDICTED(CALL_FUNCTION_EX);
4245 PyObject *func, *callargs, *kwargs = NULL, *result;
4246 if (oparg & 0x01) {
4247 kwargs = POP();
4248 if (!PyDict_CheckExact(kwargs)) {
4249 PyObject *d = PyDict_New();
4250 if (d == NULL)
4251 goto error;
4252 if (_PyDict_MergeEx(d, kwargs, 2) < 0) {
4253 Py_DECREF(d);
4254 format_kwargs_error(tstate, SECOND(), kwargs);
4255 Py_DECREF(kwargs);
4256 goto error;
4257 }
4258 Py_DECREF(kwargs);
4259 kwargs = d;
4260 }
4261 assert(PyDict_CheckExact(kwargs));
4262 }
4263 callargs = POP();
4264 func = TOP();
4265 if (!PyTuple_CheckExact(callargs)) {
4266 if (check_args_iterable(tstate, func, callargs) < 0) {
4267 Py_DECREF(callargs);
4268 goto error;
4269 }
4270 Py_SETREF(callargs, PySequence_Tuple(callargs));
4271 if (callargs == NULL) {
4272 goto error;
4273 }
4274 }
4275 assert(PyTuple_CheckExact(callargs));
4276
4277 result = do_call_core(tstate, &trace_info, func, callargs, kwargs);
4278 Py_DECREF(func);
4279 Py_DECREF(callargs);
4280 Py_XDECREF(kwargs);
4281
4282 SET_TOP(result);
4283 if (result == NULL) {
4284 goto error;
4285 }
4286 CHECK_EVAL_BREAKER();
4287 DISPATCH();
4288 }
4289
4290 case TARGET(MAKE_FUNCTION): {
4291 PyObject *qualname = POP();
4292 PyObject *codeobj = POP();
4293 PyFunctionObject *func = (PyFunctionObject *)
4294 PyFunction_NewWithQualName(codeobj, f->f_globals, qualname);
4295
4296 Py_DECREF(codeobj);
4297 Py_DECREF(qualname);
4298 if (func == NULL) {
4299 goto error;
4300 }
4301
4302 if (oparg & 0x08) {
4303 assert(PyTuple_CheckExact(TOP()));
4304 func->func_closure = POP();
4305 }
4306 if (oparg & 0x04) {
4307 assert(PyTuple_CheckExact(TOP()));
4308 func->func_annotations = POP();
4309 }
4310 if (oparg & 0x02) {
4311 assert(PyDict_CheckExact(TOP()));
4312 func->func_kwdefaults = POP();
4313 }
4314 if (oparg & 0x01) {
4315 assert(PyTuple_CheckExact(TOP()));
4316 func->func_defaults = POP();
4317 }
4318
4319 PUSH((PyObject *)func);
4320 DISPATCH();
4321 }
4322
4323 case TARGET(BUILD_SLICE): {
4324 PyObject *start, *stop, *step, *slice;
4325 if (oparg == 3)
4326 step = POP();
4327 else
4328 step = NULL;
4329 stop = POP();
4330 start = TOP();
4331 slice = PySlice_New(start, stop, step);
4332 Py_DECREF(start);
4333 Py_DECREF(stop);
4334 Py_XDECREF(step);
4335 SET_TOP(slice);
4336 if (slice == NULL)
4337 goto error;
4338 DISPATCH();
4339 }
4340
4341 case TARGET(FORMAT_VALUE): {
4342 /* Handles f-string value formatting. */
4343 PyObject *result;
4344 PyObject *fmt_spec;
4345 PyObject *value;
4346 PyObject *(*conv_fn)(PyObject *);
4347 int which_conversion = oparg & FVC_MASK;
4348 int have_fmt_spec = (oparg & FVS_MASK) == FVS_HAVE_SPEC;
4349
4350 fmt_spec = have_fmt_spec ? POP() : NULL;
4351 value = POP();
4352
4353 /* See if any conversion is specified. */
4354 switch (which_conversion) {
4355 case FVC_NONE: conv_fn = NULL; break;
4356 case FVC_STR: conv_fn = PyObject_Str; break;
4357 case FVC_REPR: conv_fn = PyObject_Repr; break;
4358 case FVC_ASCII: conv_fn = PyObject_ASCII; break;
4359 default:
4360 _PyErr_Format(tstate, PyExc_SystemError,
4361 "unexpected conversion flag %d",
4362 which_conversion);
4363 goto error;
4364 }
4365
4366 /* If there's a conversion function, call it and replace
4367 value with that result. Otherwise, just use value,
4368 without conversion. */
4369 if (conv_fn != NULL) {
4370 result = conv_fn(value);
4371 Py_DECREF(value);
4372 if (result == NULL) {
4373 Py_XDECREF(fmt_spec);
4374 goto error;
4375 }
4376 value = result;
4377 }
4378
4379 /* If value is a unicode object, and there's no fmt_spec,
4380 then we know the result of format(value) is value
4381 itself. In that case, skip calling format(). I plan to
4382 move this optimization in to PyObject_Format()
4383 itself. */
4384 if (PyUnicode_CheckExact(value) && fmt_spec == NULL) {
4385 /* Do nothing, just transfer ownership to result. */
4386 result = value;
4387 } else {
4388 /* Actually call format(). */
4389 result = PyObject_Format(value, fmt_spec);
4390 Py_DECREF(value);
4391 Py_XDECREF(fmt_spec);
4392 if (result == NULL) {
4393 goto error;
4394 }
4395 }
4396
4397 PUSH(result);
4398 DISPATCH();
4399 }
4400
4401 case TARGET(ROT_N): {
4402 PyObject *top = TOP();
4403 memmove(&PEEK(oparg - 1), &PEEK(oparg),
4404 sizeof(PyObject*) * (oparg - 1));
4405 PEEK(oparg) = top;
4406 DISPATCH();
4407 }
4408
4409 case TARGET(EXTENDED_ARG): {
4410 int oldoparg = oparg;
4411 NEXTOPARG();
4412 oparg |= oldoparg << 8;
4413 goto dispatch_opcode;
4414 }
4415
4416
4417 #if USE_COMPUTED_GOTOS
4418 _unknown_opcode:
4419 #endif
4420 default:
4421 fprintf(stderr,
4422 "XXX lineno: %d, opcode: %d\n",
4423 PyFrame_GetLineNumber(f),
4424 opcode);
4425 _PyErr_SetString(tstate, PyExc_SystemError, "unknown opcode");
4426 goto error;
4427
4428 } /* switch */
4429
4430 /* This should never be reached. Every opcode should end with DISPATCH()
4431 or goto error. */
4432 Py_UNREACHABLE();
4433
4434 error:
4435 /* Double-check exception status. */
4436 #ifdef NDEBUG
4437 if (!_PyErr_Occurred(tstate)) {
4438 _PyErr_SetString(tstate, PyExc_SystemError,
4439 "error return without exception set");
4440 }
4441 #else
4442 assert(_PyErr_Occurred(tstate));
4443 #endif
4444
4445 /* Log traceback info. */
4446 PyTraceBack_Here(f);
4447
4448 if (tstate->c_tracefunc != NULL) {
4449 /* Make sure state is set to FRAME_EXECUTING for tracing */
4450 assert(f->f_state == FRAME_EXECUTING);
4451 f->f_state = FRAME_UNWINDING;
4452 call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj,
4453 tstate, f, &trace_info);
4454 }
4455 exception_unwind:
4456 f->f_state = FRAME_UNWINDING;
4457 /* Unwind stacks if an exception occurred */
4458 while (f->f_iblock > 0) {
4459 /* Pop the current block. */
4460 PyTryBlock *b = &f->f_blockstack[--f->f_iblock];
4461
4462 if (b->b_type == EXCEPT_HANDLER) {
4463 UNWIND_EXCEPT_HANDLER(b);
4464 continue;
4465 }
4466 UNWIND_BLOCK(b);
4467 if (b->b_type == SETUP_FINALLY) {
4468 PyObject *exc, *val, *tb;
4469 int handler = b->b_handler;
4470 _PyErr_StackItem *exc_info = tstate->exc_info;
4471 /* Beware, this invalidates all b->b_* fields */
4472 PyFrame_BlockSetup(f, EXCEPT_HANDLER, f->f_lasti, STACK_LEVEL());
4473 PUSH(exc_info->exc_traceback);
4474 PUSH(exc_info->exc_value);
4475 if (exc_info->exc_type != NULL) {
4476 PUSH(exc_info->exc_type);
4477 }
4478 else {
4479 Py_INCREF(Py_None);
4480 PUSH(Py_None);
4481 }
4482 _PyErr_Fetch(tstate, &exc, &val, &tb);
4483 /* Make the raw exception data
4484 available to the handler,
4485 so a program can emulate the
4486 Python main loop. */
4487 _PyErr_NormalizeException(tstate, &exc, &val, &tb);
4488 if (tb != NULL)
4489 PyException_SetTraceback(val, tb);
4490 else
4491 PyException_SetTraceback(val, Py_None);
4492 Py_INCREF(exc);
4493 exc_info->exc_type = exc;
4494 Py_INCREF(val);
4495 exc_info->exc_value = val;
4496 exc_info->exc_traceback = tb;
4497 if (tb == NULL)
4498 tb = Py_None;
4499 Py_INCREF(tb);
4500 PUSH(tb);
4501 PUSH(val);
4502 PUSH(exc);
4503 JUMPTO(handler);
4504 /* Resume normal execution */
4505 f->f_state = FRAME_EXECUTING;
4506 goto main_loop;
4507 }
4508 } /* unwind stack */
4509
4510 /* End the loop as we still have an error */
4511 break;
4512 } /* main loop */
4513
4514 assert(retval == NULL);
4515 assert(_PyErr_Occurred(tstate));
4516
4517 /* Pop remaining stack entries. */
4518 while (!EMPTY()) {
4519 PyObject *o = POP();
4520 Py_XDECREF(o);
4521 }
4522 f->f_stackdepth = 0;
4523 f->f_state = FRAME_RAISED;
4524 exiting:
4525 if (trace_info.cframe.use_tracing) {
4526 if (tstate->c_tracefunc) {
4527 if (call_trace_protected(tstate->c_tracefunc, tstate->c_traceobj,
4528 tstate, f, &trace_info, PyTrace_RETURN, retval)) {
4529 Py_CLEAR(retval);
4530 }
4531 }
4532 if (tstate->c_profilefunc) {
4533 if (call_trace_protected(tstate->c_profilefunc, tstate->c_profileobj,
4534 tstate, f, &trace_info, PyTrace_RETURN, retval)) {
4535 Py_CLEAR(retval);
4536 }
4537 }
4538 }
4539
4540 /* pop frame */
4541 exit_eval_frame:
4542 /* Restore previous cframe */
4543 tstate->cframe = trace_info.cframe.previous;
4544 tstate->cframe->use_tracing = trace_info.cframe.use_tracing;
4545
4546 if (PyDTrace_FUNCTION_RETURN_ENABLED())
4547 dtrace_function_return(f);
4548 _Py_LeaveRecursiveCall(tstate);
4549 tstate->frame = f->f_back;
4550
4551 return _Py_CheckFunctionResult(tstate, NULL, retval, __func__);
4552 }
4553
4554 static void
format_missing(PyThreadState * tstate,const char * kind,PyCodeObject * co,PyObject * names,PyObject * qualname)4555 format_missing(PyThreadState *tstate, const char *kind,
4556 PyCodeObject *co, PyObject *names, PyObject *qualname)
4557 {
4558 int err;
4559 Py_ssize_t len = PyList_GET_SIZE(names);
4560 PyObject *name_str, *comma, *tail, *tmp;
4561
4562 assert(PyList_CheckExact(names));
4563 assert(len >= 1);
4564 /* Deal with the joys of natural language. */
4565 switch (len) {
4566 case 1:
4567 name_str = PyList_GET_ITEM(names, 0);
4568 Py_INCREF(name_str);
4569 break;
4570 case 2:
4571 name_str = PyUnicode_FromFormat("%U and %U",
4572 PyList_GET_ITEM(names, len - 2),
4573 PyList_GET_ITEM(names, len - 1));
4574 break;
4575 default:
4576 tail = PyUnicode_FromFormat(", %U, and %U",
4577 PyList_GET_ITEM(names, len - 2),
4578 PyList_GET_ITEM(names, len - 1));
4579 if (tail == NULL)
4580 return;
4581 /* Chop off the last two objects in the list. This shouldn't actually
4582 fail, but we can't be too careful. */
4583 err = PyList_SetSlice(names, len - 2, len, NULL);
4584 if (err == -1) {
4585 Py_DECREF(tail);
4586 return;
4587 }
4588 /* Stitch everything up into a nice comma-separated list. */
4589 comma = PyUnicode_FromString(", ");
4590 if (comma == NULL) {
4591 Py_DECREF(tail);
4592 return;
4593 }
4594 tmp = PyUnicode_Join(comma, names);
4595 Py_DECREF(comma);
4596 if (tmp == NULL) {
4597 Py_DECREF(tail);
4598 return;
4599 }
4600 name_str = PyUnicode_Concat(tmp, tail);
4601 Py_DECREF(tmp);
4602 Py_DECREF(tail);
4603 break;
4604 }
4605 if (name_str == NULL)
4606 return;
4607 _PyErr_Format(tstate, PyExc_TypeError,
4608 "%U() missing %i required %s argument%s: %U",
4609 qualname,
4610 len,
4611 kind,
4612 len == 1 ? "" : "s",
4613 name_str);
4614 Py_DECREF(name_str);
4615 }
4616
4617 static void
missing_arguments(PyThreadState * tstate,PyCodeObject * co,Py_ssize_t missing,Py_ssize_t defcount,PyObject ** fastlocals,PyObject * qualname)4618 missing_arguments(PyThreadState *tstate, PyCodeObject *co,
4619 Py_ssize_t missing, Py_ssize_t defcount,
4620 PyObject **fastlocals, PyObject *qualname)
4621 {
4622 Py_ssize_t i, j = 0;
4623 Py_ssize_t start, end;
4624 int positional = (defcount != -1);
4625 const char *kind = positional ? "positional" : "keyword-only";
4626 PyObject *missing_names;
4627
4628 /* Compute the names of the arguments that are missing. */
4629 missing_names = PyList_New(missing);
4630 if (missing_names == NULL)
4631 return;
4632 if (positional) {
4633 start = 0;
4634 end = co->co_argcount - defcount;
4635 }
4636 else {
4637 start = co->co_argcount;
4638 end = start + co->co_kwonlyargcount;
4639 }
4640 for (i = start; i < end; i++) {
4641 if (GETLOCAL(i) == NULL) {
4642 PyObject *raw = PyTuple_GET_ITEM(co->co_varnames, i);
4643 PyObject *name = PyObject_Repr(raw);
4644 if (name == NULL) {
4645 Py_DECREF(missing_names);
4646 return;
4647 }
4648 PyList_SET_ITEM(missing_names, j++, name);
4649 }
4650 }
4651 assert(j == missing);
4652 format_missing(tstate, kind, co, missing_names, qualname);
4653 Py_DECREF(missing_names);
4654 }
4655
4656 static void
too_many_positional(PyThreadState * tstate,PyCodeObject * co,Py_ssize_t given,PyObject * defaults,PyObject ** fastlocals,PyObject * qualname)4657 too_many_positional(PyThreadState *tstate, PyCodeObject *co,
4658 Py_ssize_t given, PyObject *defaults,
4659 PyObject **fastlocals, PyObject *qualname)
4660 {
4661 int plural;
4662 Py_ssize_t kwonly_given = 0;
4663 Py_ssize_t i;
4664 PyObject *sig, *kwonly_sig;
4665 Py_ssize_t co_argcount = co->co_argcount;
4666
4667 assert((co->co_flags & CO_VARARGS) == 0);
4668 /* Count missing keyword-only args. */
4669 for (i = co_argcount; i < co_argcount + co->co_kwonlyargcount; i++) {
4670 if (GETLOCAL(i) != NULL) {
4671 kwonly_given++;
4672 }
4673 }
4674 Py_ssize_t defcount = defaults == NULL ? 0 : PyTuple_GET_SIZE(defaults);
4675 if (defcount) {
4676 Py_ssize_t atleast = co_argcount - defcount;
4677 plural = 1;
4678 sig = PyUnicode_FromFormat("from %zd to %zd", atleast, co_argcount);
4679 }
4680 else {
4681 plural = (co_argcount != 1);
4682 sig = PyUnicode_FromFormat("%zd", co_argcount);
4683 }
4684 if (sig == NULL)
4685 return;
4686 if (kwonly_given) {
4687 const char *format = " positional argument%s (and %zd keyword-only argument%s)";
4688 kwonly_sig = PyUnicode_FromFormat(format,
4689 given != 1 ? "s" : "",
4690 kwonly_given,
4691 kwonly_given != 1 ? "s" : "");
4692 if (kwonly_sig == NULL) {
4693 Py_DECREF(sig);
4694 return;
4695 }
4696 }
4697 else {
4698 /* This will not fail. */
4699 kwonly_sig = PyUnicode_FromString("");
4700 assert(kwonly_sig != NULL);
4701 }
4702 _PyErr_Format(tstate, PyExc_TypeError,
4703 "%U() takes %U positional argument%s but %zd%U %s given",
4704 qualname,
4705 sig,
4706 plural ? "s" : "",
4707 given,
4708 kwonly_sig,
4709 given == 1 && !kwonly_given ? "was" : "were");
4710 Py_DECREF(sig);
4711 Py_DECREF(kwonly_sig);
4712 }
4713
4714 static int
positional_only_passed_as_keyword(PyThreadState * tstate,PyCodeObject * co,Py_ssize_t kwcount,PyObject * kwnames,PyObject * qualname)4715 positional_only_passed_as_keyword(PyThreadState *tstate, PyCodeObject *co,
4716 Py_ssize_t kwcount, PyObject* kwnames,
4717 PyObject *qualname)
4718 {
4719 int posonly_conflicts = 0;
4720 PyObject* posonly_names = PyList_New(0);
4721
4722 for(int k=0; k < co->co_posonlyargcount; k++){
4723 PyObject* posonly_name = PyTuple_GET_ITEM(co->co_varnames, k);
4724
4725 for (int k2=0; k2<kwcount; k2++){
4726 /* Compare the pointers first and fallback to PyObject_RichCompareBool*/
4727 PyObject* kwname = PyTuple_GET_ITEM(kwnames, k2);
4728 if (kwname == posonly_name){
4729 if(PyList_Append(posonly_names, kwname) != 0) {
4730 goto fail;
4731 }
4732 posonly_conflicts++;
4733 continue;
4734 }
4735
4736 int cmp = PyObject_RichCompareBool(posonly_name, kwname, Py_EQ);
4737
4738 if ( cmp > 0) {
4739 if(PyList_Append(posonly_names, kwname) != 0) {
4740 goto fail;
4741 }
4742 posonly_conflicts++;
4743 } else if (cmp < 0) {
4744 goto fail;
4745 }
4746
4747 }
4748 }
4749 if (posonly_conflicts) {
4750 PyObject* comma = PyUnicode_FromString(", ");
4751 if (comma == NULL) {
4752 goto fail;
4753 }
4754 PyObject* error_names = PyUnicode_Join(comma, posonly_names);
4755 Py_DECREF(comma);
4756 if (error_names == NULL) {
4757 goto fail;
4758 }
4759 _PyErr_Format(tstate, PyExc_TypeError,
4760 "%U() got some positional-only arguments passed"
4761 " as keyword arguments: '%U'",
4762 qualname, error_names);
4763 Py_DECREF(error_names);
4764 goto fail;
4765 }
4766
4767 Py_DECREF(posonly_names);
4768 return 0;
4769
4770 fail:
4771 Py_XDECREF(posonly_names);
4772 return 1;
4773
4774 }
4775
4776
4777 PyFrameObject *
_PyEval_MakeFrameVector(PyThreadState * tstate,PyFrameConstructor * con,PyObject * locals,PyObject * const * args,Py_ssize_t argcount,PyObject * kwnames)4778 _PyEval_MakeFrameVector(PyThreadState *tstate,
4779 PyFrameConstructor *con, PyObject *locals,
4780 PyObject *const *args, Py_ssize_t argcount,
4781 PyObject *kwnames)
4782 {
4783 assert(is_tstate_valid(tstate));
4784
4785 PyCodeObject *co = (PyCodeObject*)con->fc_code;
4786 assert(con->fc_defaults == NULL || PyTuple_CheckExact(con->fc_defaults));
4787 const Py_ssize_t total_args = co->co_argcount + co->co_kwonlyargcount;
4788
4789 /* Create the frame */
4790 PyFrameObject *f = _PyFrame_New_NoTrack(tstate, con, locals);
4791 if (f == NULL) {
4792 return NULL;
4793 }
4794 PyObject **fastlocals = f->f_localsplus;
4795 PyObject **freevars = f->f_localsplus + co->co_nlocals;
4796
4797 /* Create a dictionary for keyword parameters (**kwags) */
4798 PyObject *kwdict;
4799 Py_ssize_t i;
4800 if (co->co_flags & CO_VARKEYWORDS) {
4801 kwdict = PyDict_New();
4802 if (kwdict == NULL)
4803 goto fail;
4804 i = total_args;
4805 if (co->co_flags & CO_VARARGS) {
4806 i++;
4807 }
4808 SETLOCAL(i, kwdict);
4809 }
4810 else {
4811 kwdict = NULL;
4812 }
4813
4814 /* Copy all positional arguments into local variables */
4815 Py_ssize_t j, n;
4816 if (argcount > co->co_argcount) {
4817 n = co->co_argcount;
4818 }
4819 else {
4820 n = argcount;
4821 }
4822 for (j = 0; j < n; j++) {
4823 PyObject *x = args[j];
4824 Py_INCREF(x);
4825 SETLOCAL(j, x);
4826 }
4827
4828 /* Pack other positional arguments into the *args argument */
4829 if (co->co_flags & CO_VARARGS) {
4830 PyObject *u = _PyTuple_FromArray(args + n, argcount - n);
4831 if (u == NULL) {
4832 goto fail;
4833 }
4834 SETLOCAL(total_args, u);
4835 }
4836
4837 /* Handle keyword arguments */
4838 if (kwnames != NULL) {
4839 Py_ssize_t kwcount = PyTuple_GET_SIZE(kwnames);
4840 for (i = 0; i < kwcount; i++) {
4841 PyObject **co_varnames;
4842 PyObject *keyword = PyTuple_GET_ITEM(kwnames, i);
4843 PyObject *value = args[i+argcount];
4844 Py_ssize_t j;
4845
4846 if (keyword == NULL || !PyUnicode_Check(keyword)) {
4847 _PyErr_Format(tstate, PyExc_TypeError,
4848 "%U() keywords must be strings",
4849 con->fc_qualname);
4850 goto fail;
4851 }
4852
4853 /* Speed hack: do raw pointer compares. As names are
4854 normally interned this should almost always hit. */
4855 co_varnames = ((PyTupleObject *)(co->co_varnames))->ob_item;
4856 for (j = co->co_posonlyargcount; j < total_args; j++) {
4857 PyObject *varname = co_varnames[j];
4858 if (varname == keyword) {
4859 goto kw_found;
4860 }
4861 }
4862
4863 /* Slow fallback, just in case */
4864 for (j = co->co_posonlyargcount; j < total_args; j++) {
4865 PyObject *varname = co_varnames[j];
4866 int cmp = PyObject_RichCompareBool( keyword, varname, Py_EQ);
4867 if (cmp > 0) {
4868 goto kw_found;
4869 }
4870 else if (cmp < 0) {
4871 goto fail;
4872 }
4873 }
4874
4875 assert(j >= total_args);
4876 if (kwdict == NULL) {
4877
4878 if (co->co_posonlyargcount
4879 && positional_only_passed_as_keyword(tstate, co,
4880 kwcount, kwnames,
4881 con->fc_qualname))
4882 {
4883 goto fail;
4884 }
4885
4886 _PyErr_Format(tstate, PyExc_TypeError,
4887 "%U() got an unexpected keyword argument '%S'",
4888 con->fc_qualname, keyword);
4889 goto fail;
4890 }
4891
4892 if (PyDict_SetItem(kwdict, keyword, value) == -1) {
4893 goto fail;
4894 }
4895 continue;
4896
4897 kw_found:
4898 if (GETLOCAL(j) != NULL) {
4899 _PyErr_Format(tstate, PyExc_TypeError,
4900 "%U() got multiple values for argument '%S'",
4901 con->fc_qualname, keyword);
4902 goto fail;
4903 }
4904 Py_INCREF(value);
4905 SETLOCAL(j, value);
4906 }
4907 }
4908
4909 /* Check the number of positional arguments */
4910 if ((argcount > co->co_argcount) && !(co->co_flags & CO_VARARGS)) {
4911 too_many_positional(tstate, co, argcount, con->fc_defaults, fastlocals,
4912 con->fc_qualname);
4913 goto fail;
4914 }
4915
4916 /* Add missing positional arguments (copy default values from defs) */
4917 if (argcount < co->co_argcount) {
4918 Py_ssize_t defcount = con->fc_defaults == NULL ? 0 : PyTuple_GET_SIZE(con->fc_defaults);
4919 Py_ssize_t m = co->co_argcount - defcount;
4920 Py_ssize_t missing = 0;
4921 for (i = argcount; i < m; i++) {
4922 if (GETLOCAL(i) == NULL) {
4923 missing++;
4924 }
4925 }
4926 if (missing) {
4927 missing_arguments(tstate, co, missing, defcount, fastlocals,
4928 con->fc_qualname);
4929 goto fail;
4930 }
4931 if (n > m)
4932 i = n - m;
4933 else
4934 i = 0;
4935 if (defcount) {
4936 PyObject **defs = &PyTuple_GET_ITEM(con->fc_defaults, 0);
4937 for (; i < defcount; i++) {
4938 if (GETLOCAL(m+i) == NULL) {
4939 PyObject *def = defs[i];
4940 Py_INCREF(def);
4941 SETLOCAL(m+i, def);
4942 }
4943 }
4944 }
4945 }
4946
4947 /* Add missing keyword arguments (copy default values from kwdefs) */
4948 if (co->co_kwonlyargcount > 0) {
4949 Py_ssize_t missing = 0;
4950 for (i = co->co_argcount; i < total_args; i++) {
4951 if (GETLOCAL(i) != NULL)
4952 continue;
4953 PyObject *varname = PyTuple_GET_ITEM(co->co_varnames, i);
4954 if (con->fc_kwdefaults != NULL) {
4955 PyObject *def = PyDict_GetItemWithError(con->fc_kwdefaults, varname);
4956 if (def) {
4957 Py_INCREF(def);
4958 SETLOCAL(i, def);
4959 continue;
4960 }
4961 else if (_PyErr_Occurred(tstate)) {
4962 goto fail;
4963 }
4964 }
4965 missing++;
4966 }
4967 if (missing) {
4968 missing_arguments(tstate, co, missing, -1, fastlocals,
4969 con->fc_qualname);
4970 goto fail;
4971 }
4972 }
4973
4974 /* Allocate and initialize storage for cell vars, and copy free
4975 vars into frame. */
4976 for (i = 0; i < PyTuple_GET_SIZE(co->co_cellvars); ++i) {
4977 PyObject *c;
4978 Py_ssize_t arg;
4979 /* Possibly account for the cell variable being an argument. */
4980 if (co->co_cell2arg != NULL &&
4981 (arg = co->co_cell2arg[i]) != CO_CELL_NOT_AN_ARG) {
4982 c = PyCell_New(GETLOCAL(arg));
4983 /* Clear the local copy. */
4984 SETLOCAL(arg, NULL);
4985 }
4986 else {
4987 c = PyCell_New(NULL);
4988 }
4989 if (c == NULL)
4990 goto fail;
4991 SETLOCAL(co->co_nlocals + i, c);
4992 }
4993
4994 /* Copy closure variables to free variables */
4995 for (i = 0; i < PyTuple_GET_SIZE(co->co_freevars); ++i) {
4996 PyObject *o = PyTuple_GET_ITEM(con->fc_closure, i);
4997 Py_INCREF(o);
4998 freevars[PyTuple_GET_SIZE(co->co_cellvars) + i] = o;
4999 }
5000
5001 return f;
5002
5003 fail: /* Jump here from prelude on failure */
5004
5005 /* decref'ing the frame can cause __del__ methods to get invoked,
5006 which can call back into Python. While we're done with the
5007 current Python frame (f), the associated C stack is still in use,
5008 so recursion_depth must be boosted for the duration.
5009 */
5010 if (Py_REFCNT(f) > 1) {
5011 Py_DECREF(f);
5012 _PyObject_GC_TRACK(f);
5013 }
5014 else {
5015 ++tstate->recursion_depth;
5016 Py_DECREF(f);
5017 --tstate->recursion_depth;
5018 }
5019 return NULL;
5020 }
5021
5022 static PyObject *
make_coro(PyFrameConstructor * con,PyFrameObject * f)5023 make_coro(PyFrameConstructor *con, PyFrameObject *f)
5024 {
5025 assert (((PyCodeObject *)con->fc_code)->co_flags & (CO_GENERATOR | CO_COROUTINE | CO_ASYNC_GENERATOR));
5026 PyObject *gen;
5027 int is_coro = ((PyCodeObject *)con->fc_code)->co_flags & CO_COROUTINE;
5028
5029 /* Don't need to keep the reference to f_back, it will be set
5030 * when the generator is resumed. */
5031 Py_CLEAR(f->f_back);
5032
5033 /* Create a new generator that owns the ready to run frame
5034 * and return that as the value. */
5035 if (is_coro) {
5036 gen = PyCoro_New(f, con->fc_name, con->fc_qualname);
5037 } else if (((PyCodeObject *)con->fc_code)->co_flags & CO_ASYNC_GENERATOR) {
5038 gen = PyAsyncGen_New(f, con->fc_name, con->fc_qualname);
5039 } else {
5040 gen = PyGen_NewWithQualName(f, con->fc_name, con->fc_qualname);
5041 }
5042 if (gen == NULL) {
5043 return NULL;
5044 }
5045
5046 _PyObject_GC_TRACK(f);
5047
5048 return gen;
5049 }
5050
5051 PyObject *
_PyEval_Vector(PyThreadState * tstate,PyFrameConstructor * con,PyObject * locals,PyObject * const * args,size_t argcount,PyObject * kwnames)5052 _PyEval_Vector(PyThreadState *tstate, PyFrameConstructor *con,
5053 PyObject *locals,
5054 PyObject* const* args, size_t argcount,
5055 PyObject *kwnames)
5056 {
5057 PyFrameObject *f = _PyEval_MakeFrameVector(
5058 tstate, con, locals, args, argcount, kwnames);
5059 if (f == NULL) {
5060 return NULL;
5061 }
5062 if (((PyCodeObject *)con->fc_code)->co_flags & (CO_GENERATOR | CO_COROUTINE | CO_ASYNC_GENERATOR)) {
5063 return make_coro(con, f);
5064 }
5065 PyObject *retval = _PyEval_EvalFrame(tstate, f, 0);
5066
5067 /* decref'ing the frame can cause __del__ methods to get invoked,
5068 which can call back into Python. While we're done with the
5069 current Python frame (f), the associated C stack is still in use,
5070 so recursion_depth must be boosted for the duration.
5071 */
5072 if (Py_REFCNT(f) > 1) {
5073 Py_DECREF(f);
5074 _PyObject_GC_TRACK(f);
5075 }
5076 else {
5077 ++tstate->recursion_depth;
5078 Py_DECREF(f);
5079 --tstate->recursion_depth;
5080 }
5081 return retval;
5082 }
5083
5084 /* Legacy API */
5085 PyObject *
PyEval_EvalCodeEx(PyObject * _co,PyObject * globals,PyObject * locals,PyObject * const * args,int argcount,PyObject * const * kws,int kwcount,PyObject * const * defs,int defcount,PyObject * kwdefs,PyObject * closure)5086 PyEval_EvalCodeEx(PyObject *_co, PyObject *globals, PyObject *locals,
5087 PyObject *const *args, int argcount,
5088 PyObject *const *kws, int kwcount,
5089 PyObject *const *defs, int defcount,
5090 PyObject *kwdefs, PyObject *closure)
5091 {
5092 PyThreadState *tstate = _PyThreadState_GET();
5093 PyObject *res = NULL;
5094 PyObject *defaults = _PyTuple_FromArray(defs, defcount);
5095 if (defaults == NULL) {
5096 return NULL;
5097 }
5098 PyObject *builtins = _PyEval_BuiltinsFromGlobals(tstate, globals); // borrowed ref
5099 if (builtins == NULL) {
5100 Py_DECREF(defaults);
5101 return NULL;
5102 }
5103 if (locals == NULL) {
5104 locals = globals;
5105 }
5106 PyObject *kwnames = NULL;
5107 PyObject *const *allargs;
5108 PyObject **newargs = NULL;
5109 if (kwcount == 0) {
5110 allargs = args;
5111 }
5112 else {
5113 kwnames = PyTuple_New(kwcount);
5114 if (kwnames == NULL) {
5115 goto fail;
5116 }
5117 newargs = PyMem_Malloc(sizeof(PyObject *)*(kwcount+argcount));
5118 if (newargs == NULL) {
5119 goto fail;
5120 }
5121 for (int i = 0; i < argcount; i++) {
5122 newargs[i] = args[i];
5123 }
5124 for (int i = 0; i < kwcount; i++) {
5125 Py_INCREF(kws[2*i]);
5126 PyTuple_SET_ITEM(kwnames, i, kws[2*i]);
5127 newargs[argcount+i] = kws[2*i+1];
5128 }
5129 allargs = newargs;
5130 }
5131 for (int i = 0; i < kwcount; i++) {
5132 Py_INCREF(kws[2*i]);
5133 PyTuple_SET_ITEM(kwnames, i, kws[2*i]);
5134 }
5135 PyFrameConstructor constr = {
5136 .fc_globals = globals,
5137 .fc_builtins = builtins,
5138 .fc_name = ((PyCodeObject *)_co)->co_name,
5139 .fc_qualname = ((PyCodeObject *)_co)->co_name,
5140 .fc_code = _co,
5141 .fc_defaults = defaults,
5142 .fc_kwdefaults = kwdefs,
5143 .fc_closure = closure
5144 };
5145 res = _PyEval_Vector(tstate, &constr, locals,
5146 allargs, argcount,
5147 kwnames);
5148 fail:
5149 Py_XDECREF(kwnames);
5150 PyMem_Free(newargs);
5151 Py_DECREF(defaults);
5152 return res;
5153 }
5154
5155
5156 static PyObject *
special_lookup(PyThreadState * tstate,PyObject * o,_Py_Identifier * id)5157 special_lookup(PyThreadState *tstate, PyObject *o, _Py_Identifier *id)
5158 {
5159 PyObject *res;
5160 res = _PyObject_LookupSpecial(o, id);
5161 if (res == NULL && !_PyErr_Occurred(tstate)) {
5162 _PyErr_SetObject(tstate, PyExc_AttributeError, _PyUnicode_FromId(id));
5163 return NULL;
5164 }
5165 return res;
5166 }
5167
5168
5169 /* Logic for the raise statement (too complicated for inlining).
5170 This *consumes* a reference count to each of its arguments. */
5171 static int
do_raise(PyThreadState * tstate,PyObject * exc,PyObject * cause)5172 do_raise(PyThreadState *tstate, PyObject *exc, PyObject *cause)
5173 {
5174 PyObject *type = NULL, *value = NULL;
5175
5176 if (exc == NULL) {
5177 /* Reraise */
5178 _PyErr_StackItem *exc_info = _PyErr_GetTopmostException(tstate);
5179 PyObject *tb;
5180 type = exc_info->exc_type;
5181 value = exc_info->exc_value;
5182 tb = exc_info->exc_traceback;
5183 if (Py_IsNone(type) || type == NULL) {
5184 _PyErr_SetString(tstate, PyExc_RuntimeError,
5185 "No active exception to reraise");
5186 return 0;
5187 }
5188 Py_XINCREF(type);
5189 Py_XINCREF(value);
5190 Py_XINCREF(tb);
5191 _PyErr_Restore(tstate, type, value, tb);
5192 return 1;
5193 }
5194
5195 /* We support the following forms of raise:
5196 raise
5197 raise <instance>
5198 raise <type> */
5199
5200 if (PyExceptionClass_Check(exc)) {
5201 type = exc;
5202 value = _PyObject_CallNoArg(exc);
5203 if (value == NULL)
5204 goto raise_error;
5205 if (!PyExceptionInstance_Check(value)) {
5206 _PyErr_Format(tstate, PyExc_TypeError,
5207 "calling %R should have returned an instance of "
5208 "BaseException, not %R",
5209 type, Py_TYPE(value));
5210 goto raise_error;
5211 }
5212 }
5213 else if (PyExceptionInstance_Check(exc)) {
5214 value = exc;
5215 type = PyExceptionInstance_Class(exc);
5216 Py_INCREF(type);
5217 }
5218 else {
5219 /* Not something you can raise. You get an exception
5220 anyway, just not what you specified :-) */
5221 Py_DECREF(exc);
5222 _PyErr_SetString(tstate, PyExc_TypeError,
5223 "exceptions must derive from BaseException");
5224 goto raise_error;
5225 }
5226
5227 assert(type != NULL);
5228 assert(value != NULL);
5229
5230 if (cause) {
5231 PyObject *fixed_cause;
5232 if (PyExceptionClass_Check(cause)) {
5233 fixed_cause = _PyObject_CallNoArg(cause);
5234 if (fixed_cause == NULL)
5235 goto raise_error;
5236 Py_DECREF(cause);
5237 }
5238 else if (PyExceptionInstance_Check(cause)) {
5239 fixed_cause = cause;
5240 }
5241 else if (Py_IsNone(cause)) {
5242 Py_DECREF(cause);
5243 fixed_cause = NULL;
5244 }
5245 else {
5246 _PyErr_SetString(tstate, PyExc_TypeError,
5247 "exception causes must derive from "
5248 "BaseException");
5249 goto raise_error;
5250 }
5251 PyException_SetCause(value, fixed_cause);
5252 }
5253
5254 _PyErr_SetObject(tstate, type, value);
5255 /* _PyErr_SetObject incref's its arguments */
5256 Py_DECREF(value);
5257 Py_DECREF(type);
5258 return 0;
5259
5260 raise_error:
5261 Py_XDECREF(value);
5262 Py_XDECREF(type);
5263 Py_XDECREF(cause);
5264 return 0;
5265 }
5266
5267 /* Iterate v argcnt times and store the results on the stack (via decreasing
5268 sp). Return 1 for success, 0 if error.
5269
5270 If argcntafter == -1, do a simple unpack. If it is >= 0, do an unpack
5271 with a variable target.
5272 */
5273
5274 static int
unpack_iterable(PyThreadState * tstate,PyObject * v,int argcnt,int argcntafter,PyObject ** sp)5275 unpack_iterable(PyThreadState *tstate, PyObject *v,
5276 int argcnt, int argcntafter, PyObject **sp)
5277 {
5278 int i = 0, j = 0;
5279 Py_ssize_t ll = 0;
5280 PyObject *it; /* iter(v) */
5281 PyObject *w;
5282 PyObject *l = NULL; /* variable list */
5283
5284 assert(v != NULL);
5285
5286 it = PyObject_GetIter(v);
5287 if (it == NULL) {
5288 if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError) &&
5289 Py_TYPE(v)->tp_iter == NULL && !PySequence_Check(v))
5290 {
5291 _PyErr_Format(tstate, PyExc_TypeError,
5292 "cannot unpack non-iterable %.200s object",
5293 Py_TYPE(v)->tp_name);
5294 }
5295 return 0;
5296 }
5297
5298 for (; i < argcnt; i++) {
5299 w = PyIter_Next(it);
5300 if (w == NULL) {
5301 /* Iterator done, via error or exhaustion. */
5302 if (!_PyErr_Occurred(tstate)) {
5303 if (argcntafter == -1) {
5304 _PyErr_Format(tstate, PyExc_ValueError,
5305 "not enough values to unpack "
5306 "(expected %d, got %d)",
5307 argcnt, i);
5308 }
5309 else {
5310 _PyErr_Format(tstate, PyExc_ValueError,
5311 "not enough values to unpack "
5312 "(expected at least %d, got %d)",
5313 argcnt + argcntafter, i);
5314 }
5315 }
5316 goto Error;
5317 }
5318 *--sp = w;
5319 }
5320
5321 if (argcntafter == -1) {
5322 /* We better have exhausted the iterator now. */
5323 w = PyIter_Next(it);
5324 if (w == NULL) {
5325 if (_PyErr_Occurred(tstate))
5326 goto Error;
5327 Py_DECREF(it);
5328 return 1;
5329 }
5330 Py_DECREF(w);
5331 _PyErr_Format(tstate, PyExc_ValueError,
5332 "too many values to unpack (expected %d)",
5333 argcnt);
5334 goto Error;
5335 }
5336
5337 l = PySequence_List(it);
5338 if (l == NULL)
5339 goto Error;
5340 *--sp = l;
5341 i++;
5342
5343 ll = PyList_GET_SIZE(l);
5344 if (ll < argcntafter) {
5345 _PyErr_Format(tstate, PyExc_ValueError,
5346 "not enough values to unpack (expected at least %d, got %zd)",
5347 argcnt + argcntafter, argcnt + ll);
5348 goto Error;
5349 }
5350
5351 /* Pop the "after-variable" args off the list. */
5352 for (j = argcntafter; j > 0; j--, i++) {
5353 *--sp = PyList_GET_ITEM(l, ll - j);
5354 }
5355 /* Resize the list. */
5356 Py_SET_SIZE(l, ll - argcntafter);
5357 Py_DECREF(it);
5358 return 1;
5359
5360 Error:
5361 for (; i > 0; i--, sp++)
5362 Py_DECREF(*sp);
5363 Py_XDECREF(it);
5364 return 0;
5365 }
5366
5367 #ifdef LLTRACE
5368 static int
prtrace(PyThreadState * tstate,PyObject * v,const char * str)5369 prtrace(PyThreadState *tstate, PyObject *v, const char *str)
5370 {
5371 printf("%s ", str);
5372 PyObject *type, *value, *traceback;
5373 PyErr_Fetch(&type, &value, &traceback);
5374 if (PyObject_Print(v, stdout, 0) != 0) {
5375 /* Don't know what else to do */
5376 _PyErr_Clear(tstate);
5377 }
5378 printf("\n");
5379 PyErr_Restore(type, value, traceback);
5380 return 1;
5381 }
5382 #endif
5383
5384 static void
call_exc_trace(Py_tracefunc func,PyObject * self,PyThreadState * tstate,PyFrameObject * f,PyTraceInfo * trace_info)5385 call_exc_trace(Py_tracefunc func, PyObject *self,
5386 PyThreadState *tstate,
5387 PyFrameObject *f,
5388 PyTraceInfo *trace_info)
5389 {
5390 PyObject *type, *value, *traceback, *orig_traceback, *arg;
5391 int err;
5392 _PyErr_Fetch(tstate, &type, &value, &orig_traceback);
5393 if (value == NULL) {
5394 value = Py_None;
5395 Py_INCREF(value);
5396 }
5397 _PyErr_NormalizeException(tstate, &type, &value, &orig_traceback);
5398 traceback = (orig_traceback != NULL) ? orig_traceback : Py_None;
5399 arg = PyTuple_Pack(3, type, value, traceback);
5400 if (arg == NULL) {
5401 _PyErr_Restore(tstate, type, value, orig_traceback);
5402 return;
5403 }
5404 err = call_trace(func, self, tstate, f, trace_info, PyTrace_EXCEPTION, arg);
5405 Py_DECREF(arg);
5406 if (err == 0) {
5407 _PyErr_Restore(tstate, type, value, orig_traceback);
5408 }
5409 else {
5410 Py_XDECREF(type);
5411 Py_XDECREF(value);
5412 Py_XDECREF(orig_traceback);
5413 }
5414 }
5415
5416 static int
call_trace_protected(Py_tracefunc func,PyObject * obj,PyThreadState * tstate,PyFrameObject * frame,PyTraceInfo * trace_info,int what,PyObject * arg)5417 call_trace_protected(Py_tracefunc func, PyObject *obj,
5418 PyThreadState *tstate, PyFrameObject *frame,
5419 PyTraceInfo *trace_info,
5420 int what, PyObject *arg)
5421 {
5422 PyObject *type, *value, *traceback;
5423 int err;
5424 _PyErr_Fetch(tstate, &type, &value, &traceback);
5425 err = call_trace(func, obj, tstate, frame, trace_info, what, arg);
5426 if (err == 0)
5427 {
5428 _PyErr_Restore(tstate, type, value, traceback);
5429 return 0;
5430 }
5431 else {
5432 Py_XDECREF(type);
5433 Py_XDECREF(value);
5434 Py_XDECREF(traceback);
5435 return -1;
5436 }
5437 }
5438
5439 static void
initialize_trace_info(PyTraceInfo * trace_info,PyFrameObject * frame)5440 initialize_trace_info(PyTraceInfo *trace_info, PyFrameObject *frame)
5441 {
5442 if (trace_info->code != frame->f_code) {
5443 trace_info->code = frame->f_code;
5444 _PyCode_InitAddressRange(frame->f_code, &trace_info->bounds);
5445 }
5446 }
5447
5448 static int
call_trace(Py_tracefunc func,PyObject * obj,PyThreadState * tstate,PyFrameObject * frame,PyTraceInfo * trace_info,int what,PyObject * arg)5449 call_trace(Py_tracefunc func, PyObject *obj,
5450 PyThreadState *tstate, PyFrameObject *frame,
5451 PyTraceInfo *trace_info,
5452 int what, PyObject *arg)
5453 {
5454 int result;
5455 if (tstate->tracing)
5456 return 0;
5457 tstate->tracing++;
5458 tstate->cframe->use_tracing = 0;
5459 if (frame->f_lasti < 0) {
5460 frame->f_lineno = frame->f_code->co_firstlineno;
5461 }
5462 else {
5463 initialize_trace_info(trace_info, frame);
5464 frame->f_lineno = _PyCode_CheckLineNumber(frame->f_lasti*sizeof(_Py_CODEUNIT), &trace_info->bounds);
5465 }
5466 result = func(obj, frame, what, arg);
5467 frame->f_lineno = 0;
5468 tstate->cframe->use_tracing = ((tstate->c_tracefunc != NULL)
5469 || (tstate->c_profilefunc != NULL));
5470 tstate->tracing--;
5471 return result;
5472 }
5473
5474 PyObject *
_PyEval_CallTracing(PyObject * func,PyObject * args)5475 _PyEval_CallTracing(PyObject *func, PyObject *args)
5476 {
5477 PyThreadState *tstate = _PyThreadState_GET();
5478 int save_tracing = tstate->tracing;
5479 int save_use_tracing = tstate->cframe->use_tracing;
5480 PyObject *result;
5481
5482 tstate->tracing = 0;
5483 tstate->cframe->use_tracing = ((tstate->c_tracefunc != NULL)
5484 || (tstate->c_profilefunc != NULL));
5485 result = PyObject_Call(func, args, NULL);
5486 tstate->tracing = save_tracing;
5487 tstate->cframe->use_tracing = save_use_tracing;
5488 return result;
5489 }
5490
5491 /* See Objects/lnotab_notes.txt for a description of how tracing works. */
5492 static int
maybe_call_line_trace(Py_tracefunc func,PyObject * obj,PyThreadState * tstate,PyFrameObject * frame,PyTraceInfo * trace_info,int instr_prev)5493 maybe_call_line_trace(Py_tracefunc func, PyObject *obj,
5494 PyThreadState *tstate, PyFrameObject *frame,
5495 PyTraceInfo *trace_info, int instr_prev)
5496 {
5497 int result = 0;
5498
5499 /* If the last instruction falls at the start of a line or if it
5500 represents a jump backwards, update the frame's line number and
5501 then call the trace function if we're tracing source lines.
5502 */
5503 initialize_trace_info(trace_info, frame);
5504 int lastline = _PyCode_CheckLineNumber(instr_prev*sizeof(_Py_CODEUNIT), &trace_info->bounds);
5505 int line = _PyCode_CheckLineNumber(frame->f_lasti*sizeof(_Py_CODEUNIT), &trace_info->bounds);
5506 if (line != -1 && frame->f_trace_lines) {
5507 /* Trace backward edges or if line number has changed */
5508 if (frame->f_lasti < instr_prev || line != lastline) {
5509 result = call_trace(func, obj, tstate, frame, trace_info, PyTrace_LINE, Py_None);
5510 }
5511 }
5512 /* Always emit an opcode event if we're tracing all opcodes. */
5513 if (frame->f_trace_opcodes) {
5514 result = call_trace(func, obj, tstate, frame, trace_info, PyTrace_OPCODE, Py_None);
5515 }
5516 return result;
5517 }
5518
5519 int
_PyEval_SetProfile(PyThreadState * tstate,Py_tracefunc func,PyObject * arg)5520 _PyEval_SetProfile(PyThreadState *tstate, Py_tracefunc func, PyObject *arg)
5521 {
5522 assert(is_tstate_valid(tstate));
5523 /* The caller must hold the GIL */
5524 assert(PyGILState_Check());
5525
5526 /* Call _PySys_Audit() in the context of the current thread state,
5527 even if tstate is not the current thread state. */
5528 PyThreadState *current_tstate = _PyThreadState_GET();
5529 if (_PySys_Audit(current_tstate, "sys.setprofile", NULL) < 0) {
5530 return -1;
5531 }
5532
5533 PyObject *profileobj = tstate->c_profileobj;
5534
5535 tstate->c_profilefunc = NULL;
5536 tstate->c_profileobj = NULL;
5537 /* Must make sure that tracing is not ignored if 'profileobj' is freed */
5538 tstate->cframe->use_tracing = tstate->c_tracefunc != NULL;
5539 Py_XDECREF(profileobj);
5540
5541 Py_XINCREF(arg);
5542 tstate->c_profileobj = arg;
5543 tstate->c_profilefunc = func;
5544
5545 /* Flag that tracing or profiling is turned on */
5546 tstate->cframe->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
5547 return 0;
5548 }
5549
5550 void
PyEval_SetProfile(Py_tracefunc func,PyObject * arg)5551 PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
5552 {
5553 PyThreadState *tstate = _PyThreadState_GET();
5554 if (_PyEval_SetProfile(tstate, func, arg) < 0) {
5555 /* Log _PySys_Audit() error */
5556 _PyErr_WriteUnraisableMsg("in PyEval_SetProfile", NULL);
5557 }
5558 }
5559
5560 int
_PyEval_SetTrace(PyThreadState * tstate,Py_tracefunc func,PyObject * arg)5561 _PyEval_SetTrace(PyThreadState *tstate, Py_tracefunc func, PyObject *arg)
5562 {
5563 assert(is_tstate_valid(tstate));
5564 /* The caller must hold the GIL */
5565 assert(PyGILState_Check());
5566
5567 /* Call _PySys_Audit() in the context of the current thread state,
5568 even if tstate is not the current thread state. */
5569 PyThreadState *current_tstate = _PyThreadState_GET();
5570 if (_PySys_Audit(current_tstate, "sys.settrace", NULL) < 0) {
5571 return -1;
5572 }
5573
5574 PyObject *traceobj = tstate->c_traceobj;
5575
5576 tstate->c_tracefunc = NULL;
5577 tstate->c_traceobj = NULL;
5578 /* Must make sure that profiling is not ignored if 'traceobj' is freed */
5579 tstate->cframe->use_tracing = (tstate->c_profilefunc != NULL);
5580 Py_XDECREF(traceobj);
5581
5582 Py_XINCREF(arg);
5583 tstate->c_traceobj = arg;
5584 tstate->c_tracefunc = func;
5585
5586 /* Flag that tracing or profiling is turned on */
5587 tstate->cframe->use_tracing = ((func != NULL)
5588 || (tstate->c_profilefunc != NULL));
5589
5590 return 0;
5591 }
5592
5593 void
PyEval_SetTrace(Py_tracefunc func,PyObject * arg)5594 PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
5595 {
5596 PyThreadState *tstate = _PyThreadState_GET();
5597 if (_PyEval_SetTrace(tstate, func, arg) < 0) {
5598 /* Log _PySys_Audit() error */
5599 _PyErr_WriteUnraisableMsg("in PyEval_SetTrace", NULL);
5600 }
5601 }
5602
5603
5604 void
_PyEval_SetCoroutineOriginTrackingDepth(PyThreadState * tstate,int new_depth)5605 _PyEval_SetCoroutineOriginTrackingDepth(PyThreadState *tstate, int new_depth)
5606 {
5607 assert(new_depth >= 0);
5608 tstate->coroutine_origin_tracking_depth = new_depth;
5609 }
5610
5611 int
_PyEval_GetCoroutineOriginTrackingDepth(void)5612 _PyEval_GetCoroutineOriginTrackingDepth(void)
5613 {
5614 PyThreadState *tstate = _PyThreadState_GET();
5615 return tstate->coroutine_origin_tracking_depth;
5616 }
5617
5618 int
_PyEval_SetAsyncGenFirstiter(PyObject * firstiter)5619 _PyEval_SetAsyncGenFirstiter(PyObject *firstiter)
5620 {
5621 PyThreadState *tstate = _PyThreadState_GET();
5622
5623 if (_PySys_Audit(tstate, "sys.set_asyncgen_hook_firstiter", NULL) < 0) {
5624 return -1;
5625 }
5626
5627 Py_XINCREF(firstiter);
5628 Py_XSETREF(tstate->async_gen_firstiter, firstiter);
5629 return 0;
5630 }
5631
5632 PyObject *
_PyEval_GetAsyncGenFirstiter(void)5633 _PyEval_GetAsyncGenFirstiter(void)
5634 {
5635 PyThreadState *tstate = _PyThreadState_GET();
5636 return tstate->async_gen_firstiter;
5637 }
5638
5639 int
_PyEval_SetAsyncGenFinalizer(PyObject * finalizer)5640 _PyEval_SetAsyncGenFinalizer(PyObject *finalizer)
5641 {
5642 PyThreadState *tstate = _PyThreadState_GET();
5643
5644 if (_PySys_Audit(tstate, "sys.set_asyncgen_hook_finalizer", NULL) < 0) {
5645 return -1;
5646 }
5647
5648 Py_XINCREF(finalizer);
5649 Py_XSETREF(tstate->async_gen_finalizer, finalizer);
5650 return 0;
5651 }
5652
5653 PyObject *
_PyEval_GetAsyncGenFinalizer(void)5654 _PyEval_GetAsyncGenFinalizer(void)
5655 {
5656 PyThreadState *tstate = _PyThreadState_GET();
5657 return tstate->async_gen_finalizer;
5658 }
5659
5660 PyFrameObject *
PyEval_GetFrame(void)5661 PyEval_GetFrame(void)
5662 {
5663 PyThreadState *tstate = _PyThreadState_GET();
5664 return tstate->frame;
5665 }
5666
5667 PyObject *
_PyEval_GetBuiltins(PyThreadState * tstate)5668 _PyEval_GetBuiltins(PyThreadState *tstate)
5669 {
5670 PyFrameObject *frame = tstate->frame;
5671 if (frame != NULL) {
5672 return frame->f_builtins;
5673 }
5674 return tstate->interp->builtins;
5675 }
5676
5677 PyObject *
PyEval_GetBuiltins(void)5678 PyEval_GetBuiltins(void)
5679 {
5680 PyThreadState *tstate = _PyThreadState_GET();
5681 return _PyEval_GetBuiltins(tstate);
5682 }
5683
5684 /* Convenience function to get a builtin from its name */
5685 PyObject *
_PyEval_GetBuiltinId(_Py_Identifier * name)5686 _PyEval_GetBuiltinId(_Py_Identifier *name)
5687 {
5688 PyThreadState *tstate = _PyThreadState_GET();
5689 PyObject *attr = _PyDict_GetItemIdWithError(PyEval_GetBuiltins(), name);
5690 if (attr) {
5691 Py_INCREF(attr);
5692 }
5693 else if (!_PyErr_Occurred(tstate)) {
5694 _PyErr_SetObject(tstate, PyExc_AttributeError, _PyUnicode_FromId(name));
5695 }
5696 return attr;
5697 }
5698
5699 PyObject *
PyEval_GetLocals(void)5700 PyEval_GetLocals(void)
5701 {
5702 PyThreadState *tstate = _PyThreadState_GET();
5703 PyFrameObject *current_frame = tstate->frame;
5704 if (current_frame == NULL) {
5705 _PyErr_SetString(tstate, PyExc_SystemError, "frame does not exist");
5706 return NULL;
5707 }
5708
5709 if (PyFrame_FastToLocalsWithError(current_frame) < 0) {
5710 return NULL;
5711 }
5712
5713 assert(current_frame->f_locals != NULL);
5714 return current_frame->f_locals;
5715 }
5716
5717 PyObject *
PyEval_GetGlobals(void)5718 PyEval_GetGlobals(void)
5719 {
5720 PyThreadState *tstate = _PyThreadState_GET();
5721 PyFrameObject *current_frame = tstate->frame;
5722 if (current_frame == NULL) {
5723 return NULL;
5724 }
5725
5726 assert(current_frame->f_globals != NULL);
5727 return current_frame->f_globals;
5728 }
5729
5730 int
PyEval_MergeCompilerFlags(PyCompilerFlags * cf)5731 PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
5732 {
5733 PyThreadState *tstate = _PyThreadState_GET();
5734 PyFrameObject *current_frame = tstate->frame;
5735 int result = cf->cf_flags != 0;
5736
5737 if (current_frame != NULL) {
5738 const int codeflags = current_frame->f_code->co_flags;
5739 const int compilerflags = codeflags & PyCF_MASK;
5740 if (compilerflags) {
5741 result = 1;
5742 cf->cf_flags |= compilerflags;
5743 }
5744 #if 0 /* future keyword */
5745 if (codeflags & CO_GENERATOR_ALLOWED) {
5746 result = 1;
5747 cf->cf_flags |= CO_GENERATOR_ALLOWED;
5748 }
5749 #endif
5750 }
5751 return result;
5752 }
5753
5754
5755 const char *
PyEval_GetFuncName(PyObject * func)5756 PyEval_GetFuncName(PyObject *func)
5757 {
5758 if (PyMethod_Check(func))
5759 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
5760 else if (PyFunction_Check(func))
5761 return PyUnicode_AsUTF8(((PyFunctionObject*)func)->func_name);
5762 else if (PyCFunction_Check(func))
5763 return ((PyCFunctionObject*)func)->m_ml->ml_name;
5764 else
5765 return Py_TYPE(func)->tp_name;
5766 }
5767
5768 const char *
PyEval_GetFuncDesc(PyObject * func)5769 PyEval_GetFuncDesc(PyObject *func)
5770 {
5771 if (PyMethod_Check(func))
5772 return "()";
5773 else if (PyFunction_Check(func))
5774 return "()";
5775 else if (PyCFunction_Check(func))
5776 return "()";
5777 else
5778 return " object";
5779 }
5780
5781 #define C_TRACE(x, call) \
5782 if (trace_info->cframe.use_tracing && tstate->c_profilefunc) { \
5783 if (call_trace(tstate->c_profilefunc, tstate->c_profileobj, \
5784 tstate, tstate->frame, trace_info, \
5785 PyTrace_C_CALL, func)) { \
5786 x = NULL; \
5787 } \
5788 else { \
5789 x = call; \
5790 if (tstate->c_profilefunc != NULL) { \
5791 if (x == NULL) { \
5792 call_trace_protected(tstate->c_profilefunc, \
5793 tstate->c_profileobj, \
5794 tstate, tstate->frame, trace_info, \
5795 PyTrace_C_EXCEPTION, func); \
5796 /* XXX should pass (type, value, tb) */ \
5797 } else { \
5798 if (call_trace(tstate->c_profilefunc, \
5799 tstate->c_profileobj, \
5800 tstate, tstate->frame, trace_info, \
5801 PyTrace_C_RETURN, func)) { \
5802 Py_DECREF(x); \
5803 x = NULL; \
5804 } \
5805 } \
5806 } \
5807 } \
5808 } else { \
5809 x = call; \
5810 }
5811
5812
5813 static PyObject *
trace_call_function(PyThreadState * tstate,PyTraceInfo * trace_info,PyObject * func,PyObject ** args,Py_ssize_t nargs,PyObject * kwnames)5814 trace_call_function(PyThreadState *tstate,
5815 PyTraceInfo *trace_info,
5816 PyObject *func,
5817 PyObject **args, Py_ssize_t nargs,
5818 PyObject *kwnames)
5819 {
5820 PyObject *x;
5821 if (PyCFunction_CheckExact(func) || PyCMethod_CheckExact(func)) {
5822 C_TRACE(x, PyObject_Vectorcall(func, args, nargs, kwnames));
5823 return x;
5824 }
5825 else if (Py_IS_TYPE(func, &PyMethodDescr_Type) && nargs > 0) {
5826 /* We need to create a temporary bound method as argument
5827 for profiling.
5828
5829 If nargs == 0, then this cannot work because we have no
5830 "self". In any case, the call itself would raise
5831 TypeError (foo needs an argument), so we just skip
5832 profiling. */
5833 PyObject *self = args[0];
5834 func = Py_TYPE(func)->tp_descr_get(func, self, (PyObject*)Py_TYPE(self));
5835 if (func == NULL) {
5836 return NULL;
5837 }
5838 C_TRACE(x, PyObject_Vectorcall(func,
5839 args+1, nargs-1,
5840 kwnames));
5841 Py_DECREF(func);
5842 return x;
5843 }
5844 return PyObject_Vectorcall(func, args, nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames);
5845 }
5846
5847 /* Issue #29227: Inline call_function() into _PyEval_EvalFrameDefault()
5848 to reduce the stack consumption. */
Py_LOCAL_INLINE(PyObject *)5849 Py_LOCAL_INLINE(PyObject *) _Py_HOT_FUNCTION
5850 call_function(PyThreadState *tstate,
5851 PyTraceInfo *trace_info,
5852 PyObject ***pp_stack,
5853 Py_ssize_t oparg,
5854 PyObject *kwnames)
5855 {
5856 PyObject **pfunc = (*pp_stack) - oparg - 1;
5857 PyObject *func = *pfunc;
5858 PyObject *x, *w;
5859 Py_ssize_t nkwargs = (kwnames == NULL) ? 0 : PyTuple_GET_SIZE(kwnames);
5860 Py_ssize_t nargs = oparg - nkwargs;
5861 PyObject **stack = (*pp_stack) - nargs - nkwargs;
5862
5863 if (trace_info->cframe.use_tracing) {
5864 x = trace_call_function(tstate, trace_info, func, stack, nargs, kwnames);
5865 }
5866 else {
5867 x = PyObject_Vectorcall(func, stack, nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames);
5868 }
5869
5870 assert((x != NULL) ^ (_PyErr_Occurred(tstate) != NULL));
5871
5872 /* Clear the stack of the function object. */
5873 while ((*pp_stack) > pfunc) {
5874 w = EXT_POP(*pp_stack);
5875 Py_DECREF(w);
5876 }
5877
5878 return x;
5879 }
5880
5881 static PyObject *
do_call_core(PyThreadState * tstate,PyTraceInfo * trace_info,PyObject * func,PyObject * callargs,PyObject * kwdict)5882 do_call_core(PyThreadState *tstate,
5883 PyTraceInfo *trace_info,
5884 PyObject *func,
5885 PyObject *callargs,
5886 PyObject *kwdict)
5887 {
5888 PyObject *result;
5889
5890 if (PyCFunction_CheckExact(func) || PyCMethod_CheckExact(func)) {
5891 C_TRACE(result, PyObject_Call(func, callargs, kwdict));
5892 return result;
5893 }
5894 else if (Py_IS_TYPE(func, &PyMethodDescr_Type)) {
5895 Py_ssize_t nargs = PyTuple_GET_SIZE(callargs);
5896 if (nargs > 0 && trace_info->cframe.use_tracing) {
5897 /* We need to create a temporary bound method as argument
5898 for profiling.
5899
5900 If nargs == 0, then this cannot work because we have no
5901 "self". In any case, the call itself would raise
5902 TypeError (foo needs an argument), so we just skip
5903 profiling. */
5904 PyObject *self = PyTuple_GET_ITEM(callargs, 0);
5905 func = Py_TYPE(func)->tp_descr_get(func, self, (PyObject*)Py_TYPE(self));
5906 if (func == NULL) {
5907 return NULL;
5908 }
5909
5910 C_TRACE(result, _PyObject_FastCallDictTstate(
5911 tstate, func,
5912 &_PyTuple_ITEMS(callargs)[1],
5913 nargs - 1,
5914 kwdict));
5915 Py_DECREF(func);
5916 return result;
5917 }
5918 }
5919 return PyObject_Call(func, callargs, kwdict);
5920 }
5921
5922 /* Extract a slice index from a PyLong or an object with the
5923 nb_index slot defined, and store in *pi.
5924 Silently reduce values larger than PY_SSIZE_T_MAX to PY_SSIZE_T_MAX,
5925 and silently boost values less than PY_SSIZE_T_MIN to PY_SSIZE_T_MIN.
5926 Return 0 on error, 1 on success.
5927 */
5928 int
_PyEval_SliceIndex(PyObject * v,Py_ssize_t * pi)5929 _PyEval_SliceIndex(PyObject *v, Py_ssize_t *pi)
5930 {
5931 PyThreadState *tstate = _PyThreadState_GET();
5932 if (!Py_IsNone(v)) {
5933 Py_ssize_t x;
5934 if (_PyIndex_Check(v)) {
5935 x = PyNumber_AsSsize_t(v, NULL);
5936 if (x == -1 && _PyErr_Occurred(tstate))
5937 return 0;
5938 }
5939 else {
5940 _PyErr_SetString(tstate, PyExc_TypeError,
5941 "slice indices must be integers or "
5942 "None or have an __index__ method");
5943 return 0;
5944 }
5945 *pi = x;
5946 }
5947 return 1;
5948 }
5949
5950 int
_PyEval_SliceIndexNotNone(PyObject * v,Py_ssize_t * pi)5951 _PyEval_SliceIndexNotNone(PyObject *v, Py_ssize_t *pi)
5952 {
5953 PyThreadState *tstate = _PyThreadState_GET();
5954 Py_ssize_t x;
5955 if (_PyIndex_Check(v)) {
5956 x = PyNumber_AsSsize_t(v, NULL);
5957 if (x == -1 && _PyErr_Occurred(tstate))
5958 return 0;
5959 }
5960 else {
5961 _PyErr_SetString(tstate, PyExc_TypeError,
5962 "slice indices must be integers or "
5963 "have an __index__ method");
5964 return 0;
5965 }
5966 *pi = x;
5967 return 1;
5968 }
5969
5970 static PyObject *
import_name(PyThreadState * tstate,PyFrameObject * f,PyObject * name,PyObject * fromlist,PyObject * level)5971 import_name(PyThreadState *tstate, PyFrameObject *f,
5972 PyObject *name, PyObject *fromlist, PyObject *level)
5973 {
5974 _Py_IDENTIFIER(__import__);
5975 PyObject *import_func, *res;
5976 PyObject* stack[5];
5977
5978 import_func = _PyDict_GetItemIdWithError(f->f_builtins, &PyId___import__);
5979 if (import_func == NULL) {
5980 if (!_PyErr_Occurred(tstate)) {
5981 _PyErr_SetString(tstate, PyExc_ImportError, "__import__ not found");
5982 }
5983 return NULL;
5984 }
5985
5986 /* Fast path for not overloaded __import__. */
5987 if (import_func == tstate->interp->import_func) {
5988 int ilevel = _PyLong_AsInt(level);
5989 if (ilevel == -1 && _PyErr_Occurred(tstate)) {
5990 return NULL;
5991 }
5992 res = PyImport_ImportModuleLevelObject(
5993 name,
5994 f->f_globals,
5995 f->f_locals == NULL ? Py_None : f->f_locals,
5996 fromlist,
5997 ilevel);
5998 return res;
5999 }
6000
6001 Py_INCREF(import_func);
6002
6003 stack[0] = name;
6004 stack[1] = f->f_globals;
6005 stack[2] = f->f_locals == NULL ? Py_None : f->f_locals;
6006 stack[3] = fromlist;
6007 stack[4] = level;
6008 res = _PyObject_FastCall(import_func, stack, 5);
6009 Py_DECREF(import_func);
6010 return res;
6011 }
6012
6013 static PyObject *
import_from(PyThreadState * tstate,PyObject * v,PyObject * name)6014 import_from(PyThreadState *tstate, PyObject *v, PyObject *name)
6015 {
6016 PyObject *x;
6017 PyObject *fullmodname, *pkgname, *pkgpath, *pkgname_or_unknown, *errmsg;
6018
6019 if (_PyObject_LookupAttr(v, name, &x) != 0) {
6020 return x;
6021 }
6022 /* Issue #17636: in case this failed because of a circular relative
6023 import, try to fallback on reading the module directly from
6024 sys.modules. */
6025 pkgname = _PyObject_GetAttrId(v, &PyId___name__);
6026 if (pkgname == NULL) {
6027 goto error;
6028 }
6029 if (!PyUnicode_Check(pkgname)) {
6030 Py_CLEAR(pkgname);
6031 goto error;
6032 }
6033 fullmodname = PyUnicode_FromFormat("%U.%U", pkgname, name);
6034 if (fullmodname == NULL) {
6035 Py_DECREF(pkgname);
6036 return NULL;
6037 }
6038 x = PyImport_GetModule(fullmodname);
6039 Py_DECREF(fullmodname);
6040 if (x == NULL && !_PyErr_Occurred(tstate)) {
6041 goto error;
6042 }
6043 Py_DECREF(pkgname);
6044 return x;
6045 error:
6046 pkgpath = PyModule_GetFilenameObject(v);
6047 if (pkgname == NULL) {
6048 pkgname_or_unknown = PyUnicode_FromString("<unknown module name>");
6049 if (pkgname_or_unknown == NULL) {
6050 Py_XDECREF(pkgpath);
6051 return NULL;
6052 }
6053 } else {
6054 pkgname_or_unknown = pkgname;
6055 }
6056
6057 if (pkgpath == NULL || !PyUnicode_Check(pkgpath)) {
6058 _PyErr_Clear(tstate);
6059 errmsg = PyUnicode_FromFormat(
6060 "cannot import name %R from %R (unknown location)",
6061 name, pkgname_or_unknown
6062 );
6063 /* NULL checks for errmsg and pkgname done by PyErr_SetImportError. */
6064 PyErr_SetImportError(errmsg, pkgname, NULL);
6065 }
6066 else {
6067 _Py_IDENTIFIER(__spec__);
6068 PyObject *spec = _PyObject_GetAttrId(v, &PyId___spec__);
6069 const char *fmt =
6070 _PyModuleSpec_IsInitializing(spec) ?
6071 "cannot import name %R from partially initialized module %R "
6072 "(most likely due to a circular import) (%S)" :
6073 "cannot import name %R from %R (%S)";
6074 Py_XDECREF(spec);
6075
6076 errmsg = PyUnicode_FromFormat(fmt, name, pkgname_or_unknown, pkgpath);
6077 /* NULL checks for errmsg and pkgname done by PyErr_SetImportError. */
6078 PyErr_SetImportError(errmsg, pkgname, pkgpath);
6079 }
6080
6081 Py_XDECREF(errmsg);
6082 Py_XDECREF(pkgname_or_unknown);
6083 Py_XDECREF(pkgpath);
6084 return NULL;
6085 }
6086
6087 static int
import_all_from(PyThreadState * tstate,PyObject * locals,PyObject * v)6088 import_all_from(PyThreadState *tstate, PyObject *locals, PyObject *v)
6089 {
6090 _Py_IDENTIFIER(__all__);
6091 _Py_IDENTIFIER(__dict__);
6092 PyObject *all, *dict, *name, *value;
6093 int skip_leading_underscores = 0;
6094 int pos, err;
6095
6096 if (_PyObject_LookupAttrId(v, &PyId___all__, &all) < 0) {
6097 return -1; /* Unexpected error */
6098 }
6099 if (all == NULL) {
6100 if (_PyObject_LookupAttrId(v, &PyId___dict__, &dict) < 0) {
6101 return -1;
6102 }
6103 if (dict == NULL) {
6104 _PyErr_SetString(tstate, PyExc_ImportError,
6105 "from-import-* object has no __dict__ and no __all__");
6106 return -1;
6107 }
6108 all = PyMapping_Keys(dict);
6109 Py_DECREF(dict);
6110 if (all == NULL)
6111 return -1;
6112 skip_leading_underscores = 1;
6113 }
6114
6115 for (pos = 0, err = 0; ; pos++) {
6116 name = PySequence_GetItem(all, pos);
6117 if (name == NULL) {
6118 if (!_PyErr_ExceptionMatches(tstate, PyExc_IndexError)) {
6119 err = -1;
6120 }
6121 else {
6122 _PyErr_Clear(tstate);
6123 }
6124 break;
6125 }
6126 if (!PyUnicode_Check(name)) {
6127 PyObject *modname = _PyObject_GetAttrId(v, &PyId___name__);
6128 if (modname == NULL) {
6129 Py_DECREF(name);
6130 err = -1;
6131 break;
6132 }
6133 if (!PyUnicode_Check(modname)) {
6134 _PyErr_Format(tstate, PyExc_TypeError,
6135 "module __name__ must be a string, not %.100s",
6136 Py_TYPE(modname)->tp_name);
6137 }
6138 else {
6139 _PyErr_Format(tstate, PyExc_TypeError,
6140 "%s in %U.%s must be str, not %.100s",
6141 skip_leading_underscores ? "Key" : "Item",
6142 modname,
6143 skip_leading_underscores ? "__dict__" : "__all__",
6144 Py_TYPE(name)->tp_name);
6145 }
6146 Py_DECREF(modname);
6147 Py_DECREF(name);
6148 err = -1;
6149 break;
6150 }
6151 if (skip_leading_underscores) {
6152 if (PyUnicode_READY(name) == -1) {
6153 Py_DECREF(name);
6154 err = -1;
6155 break;
6156 }
6157 if (PyUnicode_READ_CHAR(name, 0) == '_') {
6158 Py_DECREF(name);
6159 continue;
6160 }
6161 }
6162 value = PyObject_GetAttr(v, name);
6163 if (value == NULL)
6164 err = -1;
6165 else if (PyDict_CheckExact(locals))
6166 err = PyDict_SetItem(locals, name, value);
6167 else
6168 err = PyObject_SetItem(locals, name, value);
6169 Py_DECREF(name);
6170 Py_XDECREF(value);
6171 if (err != 0)
6172 break;
6173 }
6174 Py_DECREF(all);
6175 return err;
6176 }
6177
6178 static int
check_args_iterable(PyThreadState * tstate,PyObject * func,PyObject * args)6179 check_args_iterable(PyThreadState *tstate, PyObject *func, PyObject *args)
6180 {
6181 if (Py_TYPE(args)->tp_iter == NULL && !PySequence_Check(args)) {
6182 /* check_args_iterable() may be called with a live exception:
6183 * clear it to prevent calling _PyObject_FunctionStr() with an
6184 * exception set. */
6185 _PyErr_Clear(tstate);
6186 PyObject *funcstr = _PyObject_FunctionStr(func);
6187 if (funcstr != NULL) {
6188 _PyErr_Format(tstate, PyExc_TypeError,
6189 "%U argument after * must be an iterable, not %.200s",
6190 funcstr, Py_TYPE(args)->tp_name);
6191 Py_DECREF(funcstr);
6192 }
6193 return -1;
6194 }
6195 return 0;
6196 }
6197
6198 static void
format_kwargs_error(PyThreadState * tstate,PyObject * func,PyObject * kwargs)6199 format_kwargs_error(PyThreadState *tstate, PyObject *func, PyObject *kwargs)
6200 {
6201 /* _PyDict_MergeEx raises attribute
6202 * error (percolated from an attempt
6203 * to get 'keys' attribute) instead of
6204 * a type error if its second argument
6205 * is not a mapping.
6206 */
6207 if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) {
6208 _PyErr_Clear(tstate);
6209 PyObject *funcstr = _PyObject_FunctionStr(func);
6210 if (funcstr != NULL) {
6211 _PyErr_Format(
6212 tstate, PyExc_TypeError,
6213 "%U argument after ** must be a mapping, not %.200s",
6214 funcstr, Py_TYPE(kwargs)->tp_name);
6215 Py_DECREF(funcstr);
6216 }
6217 }
6218 else if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
6219 PyObject *exc, *val, *tb;
6220 _PyErr_Fetch(tstate, &exc, &val, &tb);
6221 if (val && PyTuple_Check(val) && PyTuple_GET_SIZE(val) == 1) {
6222 _PyErr_Clear(tstate);
6223 PyObject *funcstr = _PyObject_FunctionStr(func);
6224 if (funcstr != NULL) {
6225 PyObject *key = PyTuple_GET_ITEM(val, 0);
6226 _PyErr_Format(
6227 tstate, PyExc_TypeError,
6228 "%U got multiple values for keyword argument '%S'",
6229 funcstr, key);
6230 Py_DECREF(funcstr);
6231 }
6232 Py_XDECREF(exc);
6233 Py_XDECREF(val);
6234 Py_XDECREF(tb);
6235 }
6236 else {
6237 _PyErr_Restore(tstate, exc, val, tb);
6238 }
6239 }
6240 }
6241
6242 static void
format_exc_check_arg(PyThreadState * tstate,PyObject * exc,const char * format_str,PyObject * obj)6243 format_exc_check_arg(PyThreadState *tstate, PyObject *exc,
6244 const char *format_str, PyObject *obj)
6245 {
6246 const char *obj_str;
6247
6248 if (!obj)
6249 return;
6250
6251 obj_str = PyUnicode_AsUTF8(obj);
6252 if (!obj_str)
6253 return;
6254
6255 _PyErr_Format(tstate, exc, format_str, obj_str);
6256
6257 if (exc == PyExc_NameError) {
6258 // Include the name in the NameError exceptions to offer suggestions later.
6259 _Py_IDENTIFIER(name);
6260 PyObject *type, *value, *traceback;
6261 PyErr_Fetch(&type, &value, &traceback);
6262 PyErr_NormalizeException(&type, &value, &traceback);
6263 if (PyErr_GivenExceptionMatches(value, PyExc_NameError)) {
6264 // We do not care if this fails because we are going to restore the
6265 // NameError anyway.
6266 (void)_PyObject_SetAttrId(value, &PyId_name, obj);
6267 }
6268 PyErr_Restore(type, value, traceback);
6269 }
6270 }
6271
6272 static void
format_exc_unbound(PyThreadState * tstate,PyCodeObject * co,int oparg)6273 format_exc_unbound(PyThreadState *tstate, PyCodeObject *co, int oparg)
6274 {
6275 PyObject *name;
6276 /* Don't stomp existing exception */
6277 if (_PyErr_Occurred(tstate))
6278 return;
6279 if (oparg < PyTuple_GET_SIZE(co->co_cellvars)) {
6280 name = PyTuple_GET_ITEM(co->co_cellvars,
6281 oparg);
6282 format_exc_check_arg(tstate,
6283 PyExc_UnboundLocalError,
6284 UNBOUNDLOCAL_ERROR_MSG,
6285 name);
6286 } else {
6287 name = PyTuple_GET_ITEM(co->co_freevars, oparg -
6288 PyTuple_GET_SIZE(co->co_cellvars));
6289 format_exc_check_arg(tstate, PyExc_NameError,
6290 UNBOUNDFREE_ERROR_MSG, name);
6291 }
6292 }
6293
6294 static void
format_awaitable_error(PyThreadState * tstate,PyTypeObject * type,int prevprevopcode,int prevopcode)6295 format_awaitable_error(PyThreadState *tstate, PyTypeObject *type, int prevprevopcode, int prevopcode)
6296 {
6297 if (type->tp_as_async == NULL || type->tp_as_async->am_await == NULL) {
6298 if (prevopcode == BEFORE_ASYNC_WITH) {
6299 _PyErr_Format(tstate, PyExc_TypeError,
6300 "'async with' received an object from __aenter__ "
6301 "that does not implement __await__: %.100s",
6302 type->tp_name);
6303 }
6304 else if (prevopcode == WITH_EXCEPT_START || (prevopcode == CALL_FUNCTION && prevprevopcode == DUP_TOP)) {
6305 _PyErr_Format(tstate, PyExc_TypeError,
6306 "'async with' received an object from __aexit__ "
6307 "that does not implement __await__: %.100s",
6308 type->tp_name);
6309 }
6310 }
6311 }
6312
6313 static PyObject *
unicode_concatenate(PyThreadState * tstate,PyObject * v,PyObject * w,PyFrameObject * f,const _Py_CODEUNIT * next_instr)6314 unicode_concatenate(PyThreadState *tstate, PyObject *v, PyObject *w,
6315 PyFrameObject *f, const _Py_CODEUNIT *next_instr)
6316 {
6317 PyObject *res;
6318 if (Py_REFCNT(v) == 2) {
6319 /* In the common case, there are 2 references to the value
6320 * stored in 'variable' when the += is performed: one on the
6321 * value stack (in 'v') and one still stored in the
6322 * 'variable'. We try to delete the variable now to reduce
6323 * the refcnt to 1.
6324 */
6325 int opcode, oparg;
6326 NEXTOPARG();
6327 switch (opcode) {
6328 case STORE_FAST:
6329 {
6330 PyObject **fastlocals = f->f_localsplus;
6331 if (GETLOCAL(oparg) == v)
6332 SETLOCAL(oparg, NULL);
6333 break;
6334 }
6335 case STORE_DEREF:
6336 {
6337 PyObject **freevars = (f->f_localsplus +
6338 f->f_code->co_nlocals);
6339 PyObject *c = freevars[oparg];
6340 if (PyCell_GET(c) == v) {
6341 PyCell_SET(c, NULL);
6342 Py_DECREF(v);
6343 }
6344 break;
6345 }
6346 case STORE_NAME:
6347 {
6348 PyObject *names = f->f_code->co_names;
6349 PyObject *name = GETITEM(names, oparg);
6350 PyObject *locals = f->f_locals;
6351 if (locals && PyDict_CheckExact(locals)) {
6352 PyObject *w = PyDict_GetItemWithError(locals, name);
6353 if ((w == v && PyDict_DelItem(locals, name) != 0) ||
6354 (w == NULL && _PyErr_Occurred(tstate)))
6355 {
6356 Py_DECREF(v);
6357 return NULL;
6358 }
6359 }
6360 break;
6361 }
6362 }
6363 }
6364 res = v;
6365 PyUnicode_Append(&res, w);
6366 return res;
6367 }
6368
6369 #ifdef DYNAMIC_EXECUTION_PROFILE
6370
6371 static PyObject *
getarray(long a[256])6372 getarray(long a[256])
6373 {
6374 int i;
6375 PyObject *l = PyList_New(256);
6376 if (l == NULL) return NULL;
6377 for (i = 0; i < 256; i++) {
6378 PyObject *x = PyLong_FromLong(a[i]);
6379 if (x == NULL) {
6380 Py_DECREF(l);
6381 return NULL;
6382 }
6383 PyList_SET_ITEM(l, i, x);
6384 }
6385 for (i = 0; i < 256; i++)
6386 a[i] = 0;
6387 return l;
6388 }
6389
6390 PyObject *
_Py_GetDXProfile(PyObject * self,PyObject * args)6391 _Py_GetDXProfile(PyObject *self, PyObject *args)
6392 {
6393 #ifndef DXPAIRS
6394 return getarray(dxp);
6395 #else
6396 int i;
6397 PyObject *l = PyList_New(257);
6398 if (l == NULL) return NULL;
6399 for (i = 0; i < 257; i++) {
6400 PyObject *x = getarray(dxpairs[i]);
6401 if (x == NULL) {
6402 Py_DECREF(l);
6403 return NULL;
6404 }
6405 PyList_SET_ITEM(l, i, x);
6406 }
6407 return l;
6408 #endif
6409 }
6410
6411 #endif
6412
6413 Py_ssize_t
_PyEval_RequestCodeExtraIndex(freefunc free)6414 _PyEval_RequestCodeExtraIndex(freefunc free)
6415 {
6416 PyInterpreterState *interp = _PyInterpreterState_GET();
6417 Py_ssize_t new_index;
6418
6419 if (interp->co_extra_user_count == MAX_CO_EXTRA_USERS - 1) {
6420 return -1;
6421 }
6422 new_index = interp->co_extra_user_count++;
6423 interp->co_extra_freefuncs[new_index] = free;
6424 return new_index;
6425 }
6426
6427 static void
dtrace_function_entry(PyFrameObject * f)6428 dtrace_function_entry(PyFrameObject *f)
6429 {
6430 const char *filename;
6431 const char *funcname;
6432 int lineno;
6433
6434 PyCodeObject *code = f->f_code;
6435 filename = PyUnicode_AsUTF8(code->co_filename);
6436 funcname = PyUnicode_AsUTF8(code->co_name);
6437 lineno = PyFrame_GetLineNumber(f);
6438
6439 PyDTrace_FUNCTION_ENTRY(filename, funcname, lineno);
6440 }
6441
6442 static void
dtrace_function_return(PyFrameObject * f)6443 dtrace_function_return(PyFrameObject *f)
6444 {
6445 const char *filename;
6446 const char *funcname;
6447 int lineno;
6448
6449 PyCodeObject *code = f->f_code;
6450 filename = PyUnicode_AsUTF8(code->co_filename);
6451 funcname = PyUnicode_AsUTF8(code->co_name);
6452 lineno = PyFrame_GetLineNumber(f);
6453
6454 PyDTrace_FUNCTION_RETURN(filename, funcname, lineno);
6455 }
6456
6457 /* DTrace equivalent of maybe_call_line_trace. */
6458 static void
maybe_dtrace_line(PyFrameObject * frame,PyTraceInfo * trace_info,int instr_prev)6459 maybe_dtrace_line(PyFrameObject *frame,
6460 PyTraceInfo *trace_info, int instr_prev)
6461 {
6462 const char *co_filename, *co_name;
6463
6464 /* If the last instruction executed isn't in the current
6465 instruction window, reset the window.
6466 */
6467 initialize_trace_info(trace_info, frame);
6468 int line = _PyCode_CheckLineNumber(frame->f_lasti*sizeof(_Py_CODEUNIT), &trace_info->bounds);
6469 /* If the last instruction falls at the start of a line or if
6470 it represents a jump backwards, update the frame's line
6471 number and call the trace function. */
6472 if (line != frame->f_lineno || frame->f_lasti < instr_prev) {
6473 if (line != -1) {
6474 frame->f_lineno = line;
6475 co_filename = PyUnicode_AsUTF8(frame->f_code->co_filename);
6476 if (!co_filename)
6477 co_filename = "?";
6478 co_name = PyUnicode_AsUTF8(frame->f_code->co_name);
6479 if (!co_name)
6480 co_name = "?";
6481 PyDTrace_LINE(co_filename, co_name, line);
6482 }
6483 }
6484 }
6485
6486
6487 /* Implement Py_EnterRecursiveCall() and Py_LeaveRecursiveCall() as functions
6488 for the limited API. */
6489
6490 #undef Py_EnterRecursiveCall
6491
Py_EnterRecursiveCall(const char * where)6492 int Py_EnterRecursiveCall(const char *where)
6493 {
6494 return _Py_EnterRecursiveCall_inline(where);
6495 }
6496
6497 #undef Py_LeaveRecursiveCall
6498
Py_LeaveRecursiveCall(void)6499 void Py_LeaveRecursiveCall(void)
6500 {
6501 _Py_LeaveRecursiveCall_inline();
6502 }
6503