…lines 1–23 unchanged (23 lines)
24 _PyStackRef nos;
25 nos = stack_pointer[-2];
26 *recorded_value = (PyObject *)PyStackRef_AsPyObjectBorrow(nos);
27 Py_INCREF(*recorded_value);
28}
29
30void _PyOpcode_RecordFunction_NOS_GEN_FUNC(_PyInterpreterFrame *frame, _PyStackRef *stack_pointer, int oparg, PyObject **recorded_value) {
31 _PyStackRef nos;
32 nos = stack_pointer[-2];
33 PyObject *obj = PyStackRef_AsPyObjectBorrow(nos);
34 if (PyGen_Check(obj)) {
35 _PyFrame_SetStackPointer(frame, stack_pointer);
36 PyObject *func = (PyObject *)_PyFrame_GetFunction(&((PyGenObject *)obj)->gi_iframe);
37 stack_pointer = _PyFrame_GetStackPointer(frame);
38 *recorded_value = (PyObject *)func;
39 Py_INCREF(*recorded_value);
40 }
41}
42
43void _PyOpcode_RecordFunction_4OS(_PyInterpreterFrame *frame, _PyStackRef *stack_pointer, int oparg, PyObject **recorded_value) {
44 _PyStackRef value;
45 value = stack_pointer[-4];
46 *recorded_value = (PyObject *)PyStackRef_AsPyObjectBorrow(value);
47 Py_INCREF(*recorded_value);
…lines 48–61 unchanged (14 lines)
62 PyObject *func = ((PyMethodObject *)callable_o)->im_func;
63 *recorded_value = (PyObject *)func;
64 Py_INCREF(*recorded_value);
65 }
66}
67
68void _PyOpcode_RecordFunction_CODE(_PyInterpreterFrame *frame, _PyStackRef *stack_pointer, int oparg, PyObject **recorded_value) {
69 *recorded_value = (PyObject *)NULL;
70 Py_INCREF(*recorded_value);
71}
72
73#define _RECORD_TOS_TYPE_INDEX 1
74#define _RECORD_NOS_INDEX 2
75#define _RECORD_NOS_GEN_FUNC_INDEX 3
76#define _RECORD_CALLABLE_INDEX 4
77#define _RECORD_BOUND_METHOD_INDEX 5
78#define _RECORD_4OS_INDEX 6
79const uint8_t _PyOpcode_RecordFunctionIndices[256] = {
80 [TO_BOOL_ALWAYS_TRUE] = _RECORD_TOS_TYPE_INDEX,
81 [BINARY_OP_SUBSCR_GETITEM] = _RECORD_NOS_INDEX,
82 [SEND_GEN] = _RECORD_NOS_GEN_FUNC_INDEX,
83 [LOAD_ATTR_INSTANCE_VALUE] = _RECORD_TOS_TYPE_INDEX,
84 [LOAD_ATTR_WITH_HINT] = _RECORD_TOS_TYPE_INDEX,
85 [LOAD_ATTR_SLOT] = _RECORD_TOS_TYPE_INDEX,
86 [LOAD_ATTR_CLASS_WITH_METACLASS_CHECK] = _RECORD_TOS_TYPE_INDEX,
87 [LOAD_ATTR_PROPERTY] = _RECORD_TOS_TYPE_INDEX,
88 [STORE_ATTR_WITH_HINT] = _RECORD_TOS_TYPE_INDEX,
89 [STORE_ATTR_SLOT] = _RECORD_TOS_TYPE_INDEX,
90 [FOR_ITER_GEN] = _RECORD_NOS_GEN_FUNC_INDEX,
91 [LOAD_ATTR_METHOD_WITH_VALUES] = _RECORD_TOS_TYPE_INDEX,
92 [LOAD_ATTR_METHOD_NO_DICT] = _RECORD_TOS_TYPE_INDEX,
93 [LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES] = _RECORD_TOS_TYPE_INDEX,
94 [LOAD_ATTR_NONDESCRIPTOR_NO_DICT] = _RECORD_TOS_TYPE_INDEX,
95 [LOAD_ATTR_METHOD_LAZY_DICT] = _RECORD_TOS_TYPE_INDEX,
96 [CALL_PY_GENERAL] = _RECORD_CALLABLE_INDEX,
…lines 97–103 unchanged (7 lines)
104 [CALL_BUILTIN_FAST] = _RECORD_CALLABLE_INDEX,
105 [CALL_BUILTIN_FAST_WITH_KEYWORDS] = _RECORD_CALLABLE_INDEX,
106 [CALL_METHOD_DESCRIPTOR_O] = _RECORD_CALLABLE_INDEX,
107 [CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = _RECORD_CALLABLE_INDEX,
108 [CALL_METHOD_DESCRIPTOR_NOARGS] = _RECORD_CALLABLE_INDEX,
109 [CALL_EX_PY] = _RECORD_4OS_INDEX,
110};
111
112const _Py_RecordFuncPtr _PyOpcode_RecordFunctions[7] = {
113 [0] = NULL,
114 [_RECORD_TOS_TYPE_INDEX] = _PyOpcode_RecordFunction_TOS_TYPE,
115 [_RECORD_NOS_INDEX] = _PyOpcode_RecordFunction_NOS,
116 [_RECORD_NOS_GEN_FUNC_INDEX] = _PyOpcode_RecordFunction_NOS_GEN_FUNC,
117 [_RECORD_CALLABLE_INDEX] = _PyOpcode_RecordFunction_CALLABLE,
118 [_RECORD_BOUND_METHOD_INDEX] = _PyOpcode_RecordFunction_BOUND_METHOD,
119 [_RECORD_4OS_INDEX] = _PyOpcode_RecordFunction_4OS,
120};
121