mirror of
https://github.com/python/cpython.git
synced 2026-05-05 01:51:01 +00:00
* Records the same objects for each member of family before execution * Records derived values when recording the trace * This makes sure that specialization, or deoptimization, does not cause invalid values to be recorded
266 lines
13 KiB
C
Generated
266 lines
13 KiB
C
Generated
// This file is generated by Tools/cases_generator/record_function_generator.py
|
|
// from:
|
|
// Python/bytecodes.c
|
|
// Do not edit!
|
|
|
|
#ifdef TIER_ONE
|
|
#error "This file is for Tier 2 only"
|
|
#endif
|
|
void _PyOpcode_RecordFunction_TOS(_PyInterpreterFrame *frame, _PyStackRef *stack_pointer, int oparg, PyObject **recorded_value) {
|
|
_PyStackRef tos;
|
|
tos = stack_pointer[-1];
|
|
*recorded_value = (PyObject *)PyStackRef_AsPyObjectBorrow(tos);
|
|
Py_INCREF(*recorded_value);
|
|
}
|
|
|
|
void _PyOpcode_RecordFunction_TOS_TYPE(_PyInterpreterFrame *frame, _PyStackRef *stack_pointer, int oparg, PyObject **recorded_value) {
|
|
_PyStackRef tos;
|
|
tos = stack_pointer[-1];
|
|
*recorded_value = (PyObject *)Py_TYPE(PyStackRef_AsPyObjectBorrow(tos));
|
|
Py_INCREF(*recorded_value);
|
|
}
|
|
|
|
void _PyOpcode_RecordFunction_NOS(_PyInterpreterFrame *frame, _PyStackRef *stack_pointer, int oparg, PyObject **recorded_value) {
|
|
_PyStackRef nos;
|
|
nos = stack_pointer[-2];
|
|
*recorded_value = (PyObject *)PyStackRef_AsPyObjectBorrow(nos);
|
|
Py_INCREF(*recorded_value);
|
|
}
|
|
|
|
void _PyOpcode_RecordFunction_NOS_TYPE(_PyInterpreterFrame *frame, _PyStackRef *stack_pointer, int oparg, PyObject **recorded_value) {
|
|
_PyStackRef nos;
|
|
nos = stack_pointer[-2];
|
|
*recorded_value = (PyObject *)Py_TYPE(PyStackRef_AsPyObjectBorrow(nos));
|
|
Py_INCREF(*recorded_value);
|
|
}
|
|
|
|
void _PyOpcode_RecordFunction_NOS_GEN_FUNC(_PyInterpreterFrame *frame, _PyStackRef *stack_pointer, int oparg, PyObject **recorded_value) {
|
|
_PyStackRef nos;
|
|
nos = stack_pointer[-2];
|
|
PyObject *obj = PyStackRef_AsPyObjectBorrow(nos);
|
|
if (PyGen_Check(obj)) {
|
|
PyGenObject *gen = (PyGenObject *)obj;
|
|
_PyStackRef func = gen->gi_iframe.f_funcobj;
|
|
if (!PyStackRef_IsNull(func)) {
|
|
*recorded_value = (PyObject *)PyStackRef_AsPyObjectBorrow(func);
|
|
Py_INCREF(*recorded_value);
|
|
}
|
|
}
|
|
}
|
|
|
|
void _PyOpcode_RecordFunction_3OS_GEN_FUNC(_PyInterpreterFrame *frame, _PyStackRef *stack_pointer, int oparg, PyObject **recorded_value) {
|
|
_PyStackRef gen;
|
|
gen = stack_pointer[-3];
|
|
PyObject *obj = PyStackRef_AsPyObjectBorrow(gen);
|
|
if (PyGen_Check(obj)) {
|
|
PyGenObject *gen_obj = (PyGenObject *)obj;
|
|
_PyStackRef func = gen_obj->gi_iframe.f_funcobj;
|
|
if (!PyStackRef_IsNull(func)) {
|
|
*recorded_value = (PyObject *)PyStackRef_AsPyObjectBorrow(func);
|
|
Py_INCREF(*recorded_value);
|
|
}
|
|
}
|
|
}
|
|
|
|
void _PyOpcode_RecordFunction_4OS(_PyInterpreterFrame *frame, _PyStackRef *stack_pointer, int oparg, PyObject **recorded_value) {
|
|
_PyStackRef value;
|
|
value = stack_pointer[-4];
|
|
*recorded_value = (PyObject *)PyStackRef_AsPyObjectBorrow(value);
|
|
Py_INCREF(*recorded_value);
|
|
}
|
|
|
|
void _PyOpcode_RecordFunction_CALLABLE(_PyInterpreterFrame *frame, _PyStackRef *stack_pointer, int oparg, PyObject **recorded_value) {
|
|
_PyStackRef func;
|
|
func = stack_pointer[-2 - oparg];
|
|
*recorded_value = (PyObject *)PyStackRef_AsPyObjectBorrow(func);
|
|
Py_INCREF(*recorded_value);
|
|
}
|
|
|
|
void _PyOpcode_RecordFunction_CALLABLE_KW(_PyInterpreterFrame *frame, _PyStackRef *stack_pointer, int oparg, PyObject **recorded_value) {
|
|
_PyStackRef func;
|
|
func = stack_pointer[-3 - oparg];
|
|
*recorded_value = (PyObject *)PyStackRef_AsPyObjectBorrow(func);
|
|
Py_INCREF(*recorded_value);
|
|
}
|
|
|
|
void _PyOpcode_RecordFunction_BOUND_METHOD(_PyInterpreterFrame *frame, _PyStackRef *stack_pointer, int oparg, PyObject **recorded_value) {
|
|
_PyStackRef callable;
|
|
callable = stack_pointer[-2 - oparg];
|
|
PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
|
|
if (Py_TYPE(callable_o) == &PyMethod_Type) {
|
|
*recorded_value = (PyObject *)callable_o;
|
|
Py_INCREF(*recorded_value);
|
|
}
|
|
}
|
|
|
|
void _PyOpcode_RecordFunction_CODE(_PyInterpreterFrame *frame, _PyStackRef *stack_pointer, int oparg, PyObject **recorded_value) {
|
|
*recorded_value = (PyObject *)NULL;
|
|
Py_INCREF(*recorded_value);
|
|
}
|
|
|
|
#define _RECORD_TOS_TYPE_INDEX 1
|
|
#define _RECORD_NOS_INDEX 2
|
|
#define _RECORD_3OS_GEN_FUNC_INDEX 3
|
|
#define _RECORD_NOS_GEN_FUNC_INDEX 4
|
|
#define _RECORD_CALLABLE_INDEX 5
|
|
#define _RECORD_CALLABLE_KW_INDEX 6
|
|
#define _RECORD_4OS_INDEX 7
|
|
|
|
const _PyOpcodeRecordEntry _PyOpcode_RecordEntries[256] = {
|
|
[TO_BOOL_BOOL] = {1, {_RECORD_TOS_TYPE_INDEX}},
|
|
[TO_BOOL_NONE] = {1, {_RECORD_TOS_TYPE_INDEX}},
|
|
[LOAD_SUPER_ATTR_ATTR] = {1, {_RECORD_NOS_INDEX}},
|
|
[TO_BOOL] = {1, {_RECORD_TOS_TYPE_INDEX}},
|
|
[TO_BOOL_INT] = {1, {_RECORD_TOS_TYPE_INDEX}},
|
|
[TO_BOOL_LIST] = {1, {_RECORD_TOS_TYPE_INDEX}},
|
|
[TO_BOOL_STR] = {1, {_RECORD_TOS_TYPE_INDEX}},
|
|
[TO_BOOL_ALWAYS_TRUE] = {1, {_RECORD_TOS_TYPE_INDEX}},
|
|
[BINARY_OP_MULTIPLY_INT] = {2, {_RECORD_NOS_INDEX, _RECORD_TOS_TYPE_INDEX}},
|
|
[BINARY_OP_ADD_INT] = {2, {_RECORD_NOS_INDEX, _RECORD_TOS_TYPE_INDEX}},
|
|
[BINARY_OP_SUBTRACT_INT] = {2, {_RECORD_NOS_INDEX, _RECORD_TOS_TYPE_INDEX}},
|
|
[BINARY_OP_MULTIPLY_FLOAT] = {2, {_RECORD_NOS_INDEX, _RECORD_TOS_TYPE_INDEX}},
|
|
[BINARY_OP_ADD_FLOAT] = {2, {_RECORD_NOS_INDEX, _RECORD_TOS_TYPE_INDEX}},
|
|
[BINARY_OP_SUBTRACT_FLOAT] = {2, {_RECORD_NOS_INDEX, _RECORD_TOS_TYPE_INDEX}},
|
|
[BINARY_OP_ADD_UNICODE] = {2, {_RECORD_NOS_INDEX, _RECORD_TOS_TYPE_INDEX}},
|
|
[BINARY_OP_EXTEND] = {2, {_RECORD_NOS_INDEX, _RECORD_TOS_TYPE_INDEX}},
|
|
[BINARY_OP_INPLACE_ADD_UNICODE] = {2, {_RECORD_NOS_INDEX, _RECORD_TOS_TYPE_INDEX}},
|
|
[BINARY_OP_SUBSCR_LIST_INT] = {2, {_RECORD_NOS_INDEX, _RECORD_TOS_TYPE_INDEX}},
|
|
[BINARY_OP_SUBSCR_LIST_SLICE] = {2, {_RECORD_NOS_INDEX, _RECORD_TOS_TYPE_INDEX}},
|
|
[BINARY_OP_SUBSCR_STR_INT] = {2, {_RECORD_NOS_INDEX, _RECORD_TOS_TYPE_INDEX}},
|
|
[BINARY_OP_SUBSCR_USTR_INT] = {2, {_RECORD_NOS_INDEX, _RECORD_TOS_TYPE_INDEX}},
|
|
[BINARY_OP_SUBSCR_TUPLE_INT] = {2, {_RECORD_NOS_INDEX, _RECORD_TOS_TYPE_INDEX}},
|
|
[BINARY_OP_SUBSCR_DICT] = {2, {_RECORD_NOS_INDEX, _RECORD_TOS_TYPE_INDEX}},
|
|
[BINARY_OP_SUBSCR_GETITEM] = {2, {_RECORD_NOS_INDEX, _RECORD_TOS_TYPE_INDEX}},
|
|
[SEND] = {1, {_RECORD_3OS_GEN_FUNC_INDEX}},
|
|
[SEND_GEN] = {1, {_RECORD_3OS_GEN_FUNC_INDEX}},
|
|
[STORE_ATTR] = {1, {_RECORD_TOS_TYPE_INDEX}},
|
|
[LOAD_SUPER_ATTR] = {1, {_RECORD_NOS_INDEX}},
|
|
[LOAD_SUPER_ATTR_METHOD] = {1, {_RECORD_NOS_INDEX}},
|
|
[LOAD_ATTR] = {1, {_RECORD_TOS_TYPE_INDEX}},
|
|
[LOAD_ATTR_INSTANCE_VALUE] = {1, {_RECORD_TOS_TYPE_INDEX}},
|
|
[LOAD_ATTR_MODULE] = {1, {_RECORD_TOS_TYPE_INDEX}},
|
|
[LOAD_ATTR_WITH_HINT] = {1, {_RECORD_TOS_TYPE_INDEX}},
|
|
[LOAD_ATTR_SLOT] = {1, {_RECORD_TOS_TYPE_INDEX}},
|
|
[LOAD_ATTR_CLASS] = {1, {_RECORD_TOS_TYPE_INDEX}},
|
|
[LOAD_ATTR_CLASS_WITH_METACLASS_CHECK] = {1, {_RECORD_TOS_TYPE_INDEX}},
|
|
[LOAD_ATTR_PROPERTY] = {1, {_RECORD_TOS_TYPE_INDEX}},
|
|
[LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN] = {1, {_RECORD_TOS_TYPE_INDEX}},
|
|
[STORE_ATTR_INSTANCE_VALUE] = {1, {_RECORD_TOS_TYPE_INDEX}},
|
|
[STORE_ATTR_WITH_HINT] = {1, {_RECORD_TOS_TYPE_INDEX}},
|
|
[STORE_ATTR_SLOT] = {1, {_RECORD_TOS_TYPE_INDEX}},
|
|
[GET_ITER] = {1, {_RECORD_TOS_TYPE_INDEX}},
|
|
[GET_ITER_SELF] = {1, {_RECORD_TOS_TYPE_INDEX}},
|
|
[GET_ITER_VIRTUAL] = {1, {_RECORD_TOS_TYPE_INDEX}},
|
|
[FOR_ITER] = {1, {_RECORD_NOS_GEN_FUNC_INDEX}},
|
|
[FOR_ITER_VIRTUAL] = {1, {_RECORD_NOS_GEN_FUNC_INDEX}},
|
|
[FOR_ITER_LIST] = {1, {_RECORD_NOS_GEN_FUNC_INDEX}},
|
|
[FOR_ITER_TUPLE] = {1, {_RECORD_NOS_GEN_FUNC_INDEX}},
|
|
[FOR_ITER_RANGE] = {1, {_RECORD_NOS_GEN_FUNC_INDEX}},
|
|
[FOR_ITER_GEN] = {1, {_RECORD_NOS_GEN_FUNC_INDEX}},
|
|
[LOAD_SPECIAL] = {1, {_RECORD_TOS_TYPE_INDEX}},
|
|
[LOAD_ATTR_METHOD_WITH_VALUES] = {1, {_RECORD_TOS_TYPE_INDEX}},
|
|
[LOAD_ATTR_METHOD_NO_DICT] = {1, {_RECORD_TOS_TYPE_INDEX}},
|
|
[LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES] = {1, {_RECORD_TOS_TYPE_INDEX}},
|
|
[LOAD_ATTR_NONDESCRIPTOR_NO_DICT] = {1, {_RECORD_TOS_TYPE_INDEX}},
|
|
[LOAD_ATTR_METHOD_LAZY_DICT] = {1, {_RECORD_TOS_TYPE_INDEX}},
|
|
[CALL] = {1, {_RECORD_CALLABLE_INDEX}},
|
|
[CALL_PY_GENERAL] = {1, {_RECORD_CALLABLE_INDEX}},
|
|
[CALL_BOUND_METHOD_GENERAL] = {1, {_RECORD_CALLABLE_INDEX}},
|
|
[CALL_NON_PY_GENERAL] = {1, {_RECORD_CALLABLE_INDEX}},
|
|
[CALL_BOUND_METHOD_EXACT_ARGS] = {1, {_RECORD_CALLABLE_INDEX}},
|
|
[CALL_PY_EXACT_ARGS] = {1, {_RECORD_CALLABLE_INDEX}},
|
|
[CALL_TYPE_1] = {1, {_RECORD_CALLABLE_INDEX}},
|
|
[CALL_STR_1] = {1, {_RECORD_CALLABLE_INDEX}},
|
|
[CALL_TUPLE_1] = {1, {_RECORD_CALLABLE_INDEX}},
|
|
[CALL_ALLOC_AND_ENTER_INIT] = {1, {_RECORD_CALLABLE_INDEX}},
|
|
[CALL_BUILTIN_CLASS] = {1, {_RECORD_CALLABLE_INDEX}},
|
|
[CALL_BUILTIN_O] = {1, {_RECORD_CALLABLE_INDEX}},
|
|
[CALL_BUILTIN_FAST] = {1, {_RECORD_CALLABLE_INDEX}},
|
|
[CALL_BUILTIN_FAST_WITH_KEYWORDS] = {1, {_RECORD_CALLABLE_INDEX}},
|
|
[CALL_LEN] = {1, {_RECORD_CALLABLE_INDEX}},
|
|
[CALL_ISINSTANCE] = {1, {_RECORD_CALLABLE_INDEX}},
|
|
[CALL_LIST_APPEND] = {1, {_RECORD_CALLABLE_INDEX}},
|
|
[CALL_METHOD_DESCRIPTOR_O] = {1, {_RECORD_CALLABLE_INDEX}},
|
|
[CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = {1, {_RECORD_CALLABLE_INDEX}},
|
|
[CALL_METHOD_DESCRIPTOR_NOARGS] = {1, {_RECORD_CALLABLE_INDEX}},
|
|
[CALL_METHOD_DESCRIPTOR_FAST] = {1, {_RECORD_CALLABLE_INDEX}},
|
|
[CALL_KW_PY] = {1, {_RECORD_CALLABLE_KW_INDEX}},
|
|
[CALL_KW_BOUND_METHOD] = {1, {_RECORD_CALLABLE_KW_INDEX}},
|
|
[CALL_KW] = {1, {_RECORD_CALLABLE_KW_INDEX}},
|
|
[CALL_KW_NON_PY] = {1, {_RECORD_CALLABLE_KW_INDEX}},
|
|
[CALL_FUNCTION_EX] = {1, {_RECORD_4OS_INDEX}},
|
|
[CALL_EX_PY] = {1, {_RECORD_4OS_INDEX}},
|
|
[CALL_EX_NON_PY_GENERAL] = {1, {_RECORD_4OS_INDEX}},
|
|
[BINARY_OP] = {2, {_RECORD_NOS_INDEX, _RECORD_TOS_TYPE_INDEX}},
|
|
};
|
|
|
|
const _PyOpcodeRecordSlotMap _PyOpcode_RecordSlotMaps[256] = {
|
|
[TO_BOOL_ALWAYS_TRUE] = {1, 0, {0}},
|
|
[BINARY_OP_SUBSCR_GETITEM] = {1, 0, {0}},
|
|
[SEND_GEN] = {1, 0, {0}},
|
|
[LOAD_SUPER_ATTR_METHOD] = {1, 0, {0}},
|
|
[LOAD_ATTR_INSTANCE_VALUE] = {1, 0, {0}},
|
|
[LOAD_ATTR_WITH_HINT] = {1, 0, {0}},
|
|
[LOAD_ATTR_SLOT] = {1, 0, {0}},
|
|
[LOAD_ATTR_CLASS_WITH_METACLASS_CHECK] = {1, 0, {0}},
|
|
[LOAD_ATTR_PROPERTY] = {1, 0, {0}},
|
|
[LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN] = {1, 0, {0}},
|
|
[STORE_ATTR_INSTANCE_VALUE] = {1, 0, {0}},
|
|
[STORE_ATTR_WITH_HINT] = {1, 0, {0}},
|
|
[STORE_ATTR_SLOT] = {1, 0, {0}},
|
|
[GET_ITER] = {1, 0, {0}},
|
|
[GET_ITER_SELF] = {1, 0, {0}},
|
|
[GET_ITER_VIRTUAL] = {1, 0, {0}},
|
|
[FOR_ITER_GEN] = {1, 0, {0}},
|
|
[LOAD_SPECIAL] = {1, 0, {0}},
|
|
[LOAD_ATTR_METHOD_WITH_VALUES] = {1, 0, {0}},
|
|
[LOAD_ATTR_METHOD_NO_DICT] = {1, 0, {0}},
|
|
[LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES] = {1, 0, {0}},
|
|
[LOAD_ATTR_NONDESCRIPTOR_NO_DICT] = {1, 0, {0}},
|
|
[LOAD_ATTR_METHOD_LAZY_DICT] = {1, 0, {0}},
|
|
[CALL_PY_GENERAL] = {1, 0, {0}},
|
|
[CALL_BOUND_METHOD_GENERAL] = {1, 1, {0}},
|
|
[CALL_NON_PY_GENERAL] = {1, 0, {0}},
|
|
[CALL_BOUND_METHOD_EXACT_ARGS] = {1, 1, {0}},
|
|
[CALL_PY_EXACT_ARGS] = {1, 0, {0}},
|
|
[CALL_ALLOC_AND_ENTER_INIT] = {1, 0, {0}},
|
|
[CALL_BUILTIN_CLASS] = {1, 0, {0}},
|
|
[CALL_BUILTIN_O] = {1, 0, {0}},
|
|
[CALL_BUILTIN_FAST] = {1, 0, {0}},
|
|
[CALL_BUILTIN_FAST_WITH_KEYWORDS] = {1, 0, {0}},
|
|
[CALL_METHOD_DESCRIPTOR_O] = {1, 0, {0}},
|
|
[CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = {1, 0, {0}},
|
|
[CALL_METHOD_DESCRIPTOR_NOARGS] = {1, 0, {0}},
|
|
[CALL_KW_PY] = {1, 0, {0}},
|
|
[CALL_KW_BOUND_METHOD] = {1, 0, {0}},
|
|
[CALL_EX_PY] = {1, 0, {0}},
|
|
[BINARY_OP] = {2, 2, {1, 0}},
|
|
};
|
|
|
|
const _Py_RecordFuncPtr _PyOpcode_RecordFunctions[8] = {
|
|
[0] = NULL,
|
|
[_RECORD_TOS_TYPE_INDEX] = _PyOpcode_RecordFunction_TOS_TYPE,
|
|
[_RECORD_NOS_INDEX] = _PyOpcode_RecordFunction_NOS,
|
|
[_RECORD_3OS_GEN_FUNC_INDEX] = _PyOpcode_RecordFunction_3OS_GEN_FUNC,
|
|
[_RECORD_NOS_GEN_FUNC_INDEX] = _PyOpcode_RecordFunction_NOS_GEN_FUNC,
|
|
[_RECORD_CALLABLE_INDEX] = _PyOpcode_RecordFunction_CALLABLE,
|
|
[_RECORD_CALLABLE_KW_INDEX] = _PyOpcode_RecordFunction_CALLABLE_KW,
|
|
[_RECORD_4OS_INDEX] = _PyOpcode_RecordFunction_4OS,
|
|
};
|
|
|
|
PyObject *
|
|
_PyOpcode_RecordTransformValue(int uop, PyObject *value)
|
|
{
|
|
switch (uop) {
|
|
case _RECORD_TOS_TYPE:
|
|
case _RECORD_NOS_TYPE:
|
|
return record_trace_transform_to_type(value);
|
|
case _RECORD_NOS_GEN_FUNC:
|
|
case _RECORD_3OS_GEN_FUNC:
|
|
return record_trace_transform_gen_func(value);
|
|
case _RECORD_BOUND_METHOD:
|
|
return record_trace_transform_bound_method(value);
|
|
default:
|
|
return value;
|
|
}
|
|
}
|