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