mirror of
https://github.com/python/cpython.git
synced 2025-12-23 09:19:18 +00:00
gh-87729: specialize LOAD_SUPER_ATTR_METHOD (#103809)
This commit is contained in:
parent
cef542ca57
commit
ef25febcf2
14 changed files with 539 additions and 357 deletions
|
|
@ -51,6 +51,15 @@ typedef struct {
|
|||
|
||||
#define INLINE_CACHE_ENTRIES_BINARY_SUBSCR CACHE_ENTRIES(_PyBinarySubscrCache)
|
||||
|
||||
typedef struct {
|
||||
uint16_t counter;
|
||||
uint16_t class_version[2];
|
||||
uint16_t self_type_version[2];
|
||||
uint16_t method[4];
|
||||
} _PySuperAttrCache;
|
||||
|
||||
#define INLINE_CACHE_ENTRIES_LOAD_SUPER_ATTR CACHE_ENTRIES(_PySuperAttrCache)
|
||||
|
||||
typedef struct {
|
||||
uint16_t counter;
|
||||
uint16_t version[2];
|
||||
|
|
@ -217,6 +226,8 @@ extern int _PyLineTable_PreviousAddressRange(PyCodeAddressRange *range);
|
|||
|
||||
/* Specialization functions */
|
||||
|
||||
extern void _Py_Specialize_LoadSuperAttr(PyObject *global_super, PyObject *class, PyObject *self,
|
||||
_Py_CODEUNIT *instr, PyObject *name, int load_method);
|
||||
extern void _Py_Specialize_LoadAttr(PyObject *owner, _Py_CODEUNIT *instr,
|
||||
PyObject *name);
|
||||
extern void _Py_Specialize_StoreAttr(PyObject *owner, _Py_CODEUNIT *instr,
|
||||
|
|
|
|||
25
Include/internal/pycore_opcode.h
generated
25
Include/internal/pycore_opcode.h
generated
|
|
@ -42,6 +42,7 @@ const uint8_t _PyOpcode_Caches[256] = {
|
|||
[LOAD_GLOBAL] = 4,
|
||||
[BINARY_OP] = 1,
|
||||
[SEND] = 1,
|
||||
[LOAD_SUPER_ATTR] = 9,
|
||||
[CALL] = 3,
|
||||
};
|
||||
|
||||
|
|
@ -180,6 +181,7 @@ const uint8_t _PyOpcode_Deopt[256] = {
|
|||
[LOAD_GLOBAL_MODULE] = LOAD_GLOBAL,
|
||||
[LOAD_NAME] = LOAD_NAME,
|
||||
[LOAD_SUPER_ATTR] = LOAD_SUPER_ATTR,
|
||||
[LOAD_SUPER_ATTR_METHOD] = LOAD_SUPER_ATTR,
|
||||
[MAKE_CELL] = MAKE_CELL,
|
||||
[MAKE_FUNCTION] = MAKE_FUNCTION,
|
||||
[MAP_ADD] = MAP_ADD,
|
||||
|
|
@ -304,29 +306,29 @@ static const char *const _PyOpcode_OpName[266] = {
|
|||
[FOR_ITER_TUPLE] = "FOR_ITER_TUPLE",
|
||||
[FOR_ITER_RANGE] = "FOR_ITER_RANGE",
|
||||
[FOR_ITER_GEN] = "FOR_ITER_GEN",
|
||||
[LOAD_SUPER_ATTR_METHOD] = "LOAD_SUPER_ATTR_METHOD",
|
||||
[LOAD_ATTR_CLASS] = "LOAD_ATTR_CLASS",
|
||||
[LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN] = "LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN",
|
||||
[GET_ITER] = "GET_ITER",
|
||||
[GET_YIELD_FROM_ITER] = "GET_YIELD_FROM_ITER",
|
||||
[LOAD_ATTR_INSTANCE_VALUE] = "LOAD_ATTR_INSTANCE_VALUE",
|
||||
[LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN] = "LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN",
|
||||
[LOAD_BUILD_CLASS] = "LOAD_BUILD_CLASS",
|
||||
[LOAD_ATTR_INSTANCE_VALUE] = "LOAD_ATTR_INSTANCE_VALUE",
|
||||
[LOAD_ATTR_MODULE] = "LOAD_ATTR_MODULE",
|
||||
[LOAD_ATTR_PROPERTY] = "LOAD_ATTR_PROPERTY",
|
||||
[LOAD_ASSERTION_ERROR] = "LOAD_ASSERTION_ERROR",
|
||||
[RETURN_GENERATOR] = "RETURN_GENERATOR",
|
||||
[LOAD_ATTR_PROPERTY] = "LOAD_ATTR_PROPERTY",
|
||||
[LOAD_ATTR_SLOT] = "LOAD_ATTR_SLOT",
|
||||
[LOAD_ATTR_WITH_HINT] = "LOAD_ATTR_WITH_HINT",
|
||||
[LOAD_ATTR_METHOD_LAZY_DICT] = "LOAD_ATTR_METHOD_LAZY_DICT",
|
||||
[LOAD_ATTR_METHOD_NO_DICT] = "LOAD_ATTR_METHOD_NO_DICT",
|
||||
[LOAD_ATTR_METHOD_WITH_VALUES] = "LOAD_ATTR_METHOD_WITH_VALUES",
|
||||
[LOAD_CONST__LOAD_FAST] = "LOAD_CONST__LOAD_FAST",
|
||||
[LOAD_FAST__LOAD_CONST] = "LOAD_FAST__LOAD_CONST",
|
||||
[RETURN_VALUE] = "RETURN_VALUE",
|
||||
[LOAD_FAST__LOAD_FAST] = "LOAD_FAST__LOAD_FAST",
|
||||
[LOAD_FAST__LOAD_CONST] = "LOAD_FAST__LOAD_CONST",
|
||||
[SETUP_ANNOTATIONS] = "SETUP_ANNOTATIONS",
|
||||
[LOAD_FAST__LOAD_FAST] = "LOAD_FAST__LOAD_FAST",
|
||||
[LOAD_GLOBAL_BUILTIN] = "LOAD_GLOBAL_BUILTIN",
|
||||
[LOAD_GLOBAL_MODULE] = "LOAD_GLOBAL_MODULE",
|
||||
[STORE_ATTR_INSTANCE_VALUE] = "STORE_ATTR_INSTANCE_VALUE",
|
||||
[POP_EXCEPT] = "POP_EXCEPT",
|
||||
[STORE_NAME] = "STORE_NAME",
|
||||
[DELETE_NAME] = "DELETE_NAME",
|
||||
|
|
@ -349,9 +351,9 @@ static const char *const _PyOpcode_OpName[266] = {
|
|||
[IMPORT_NAME] = "IMPORT_NAME",
|
||||
[IMPORT_FROM] = "IMPORT_FROM",
|
||||
[JUMP_FORWARD] = "JUMP_FORWARD",
|
||||
[STORE_ATTR_INSTANCE_VALUE] = "STORE_ATTR_INSTANCE_VALUE",
|
||||
[STORE_ATTR_SLOT] = "STORE_ATTR_SLOT",
|
||||
[STORE_ATTR_WITH_HINT] = "STORE_ATTR_WITH_HINT",
|
||||
[STORE_FAST__LOAD_FAST] = "STORE_FAST__LOAD_FAST",
|
||||
[POP_JUMP_IF_FALSE] = "POP_JUMP_IF_FALSE",
|
||||
[POP_JUMP_IF_TRUE] = "POP_JUMP_IF_TRUE",
|
||||
[LOAD_GLOBAL] = "LOAD_GLOBAL",
|
||||
|
|
@ -381,7 +383,7 @@ static const char *const _PyOpcode_OpName[266] = {
|
|||
[JUMP_BACKWARD] = "JUMP_BACKWARD",
|
||||
[LOAD_SUPER_ATTR] = "LOAD_SUPER_ATTR",
|
||||
[CALL_FUNCTION_EX] = "CALL_FUNCTION_EX",
|
||||
[STORE_FAST__STORE_FAST] = "STORE_FAST__STORE_FAST",
|
||||
[STORE_FAST__LOAD_FAST] = "STORE_FAST__LOAD_FAST",
|
||||
[EXTENDED_ARG] = "EXTENDED_ARG",
|
||||
[LIST_APPEND] = "LIST_APPEND",
|
||||
[SET_ADD] = "SET_ADD",
|
||||
|
|
@ -391,20 +393,20 @@ static const char *const _PyOpcode_OpName[266] = {
|
|||
[YIELD_VALUE] = "YIELD_VALUE",
|
||||
[RESUME] = "RESUME",
|
||||
[MATCH_CLASS] = "MATCH_CLASS",
|
||||
[STORE_FAST__STORE_FAST] = "STORE_FAST__STORE_FAST",
|
||||
[STORE_SUBSCR_DICT] = "STORE_SUBSCR_DICT",
|
||||
[STORE_SUBSCR_LIST_INT] = "STORE_SUBSCR_LIST_INT",
|
||||
[FORMAT_VALUE] = "FORMAT_VALUE",
|
||||
[BUILD_CONST_KEY_MAP] = "BUILD_CONST_KEY_MAP",
|
||||
[BUILD_STRING] = "BUILD_STRING",
|
||||
[STORE_SUBSCR_LIST_INT] = "STORE_SUBSCR_LIST_INT",
|
||||
[UNPACK_SEQUENCE_LIST] = "UNPACK_SEQUENCE_LIST",
|
||||
[UNPACK_SEQUENCE_TUPLE] = "UNPACK_SEQUENCE_TUPLE",
|
||||
[UNPACK_SEQUENCE_TWO_TUPLE] = "UNPACK_SEQUENCE_TWO_TUPLE",
|
||||
[SEND_GEN] = "SEND_GEN",
|
||||
[LIST_EXTEND] = "LIST_EXTEND",
|
||||
[SET_UPDATE] = "SET_UPDATE",
|
||||
[DICT_MERGE] = "DICT_MERGE",
|
||||
[DICT_UPDATE] = "DICT_UPDATE",
|
||||
[166] = "<166>",
|
||||
[SEND_GEN] = "SEND_GEN",
|
||||
[167] = "<167>",
|
||||
[168] = "<168>",
|
||||
[169] = "<169>",
|
||||
|
|
@ -508,7 +510,6 @@ static const char *const _PyOpcode_OpName[266] = {
|
|||
#endif
|
||||
|
||||
#define EXTRA_CASES \
|
||||
case 166: \
|
||||
case 167: \
|
||||
case 168: \
|
||||
case 169: \
|
||||
|
|
|
|||
|
|
@ -119,6 +119,8 @@ PyObject *_Py_slot_tp_getattr_hook(PyObject *self, PyObject *name);
|
|||
|
||||
PyObject *
|
||||
_PySuper_Lookup(PyTypeObject *su_type, PyObject *su_obj, PyObject *name, int *meth_found);
|
||||
PyObject *
|
||||
_PySuper_LookupDescr(PyTypeObject *su_type, PyObject *su_obj, PyObject *name);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
|||
53
Include/opcode.h
generated
53
Include/opcode.h
generated
|
|
@ -183,32 +183,33 @@ extern "C" {
|
|||
#define FOR_ITER_TUPLE 63
|
||||
#define FOR_ITER_RANGE 64
|
||||
#define FOR_ITER_GEN 65
|
||||
#define LOAD_ATTR_CLASS 66
|
||||
#define LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN 67
|
||||
#define LOAD_ATTR_INSTANCE_VALUE 70
|
||||
#define LOAD_ATTR_MODULE 72
|
||||
#define LOAD_ATTR_PROPERTY 73
|
||||
#define LOAD_ATTR_SLOT 76
|
||||
#define LOAD_ATTR_WITH_HINT 77
|
||||
#define LOAD_ATTR_METHOD_LAZY_DICT 78
|
||||
#define LOAD_ATTR_METHOD_NO_DICT 79
|
||||
#define LOAD_ATTR_METHOD_WITH_VALUES 80
|
||||
#define LOAD_CONST__LOAD_FAST 81
|
||||
#define LOAD_FAST__LOAD_CONST 82
|
||||
#define LOAD_FAST__LOAD_FAST 84
|
||||
#define LOAD_GLOBAL_BUILTIN 86
|
||||
#define LOAD_GLOBAL_MODULE 87
|
||||
#define STORE_ATTR_INSTANCE_VALUE 88
|
||||
#define STORE_ATTR_SLOT 111
|
||||
#define STORE_ATTR_WITH_HINT 112
|
||||
#define STORE_FAST__LOAD_FAST 113
|
||||
#define STORE_FAST__STORE_FAST 143
|
||||
#define STORE_SUBSCR_DICT 153
|
||||
#define STORE_SUBSCR_LIST_INT 154
|
||||
#define UNPACK_SEQUENCE_LIST 158
|
||||
#define UNPACK_SEQUENCE_TUPLE 159
|
||||
#define UNPACK_SEQUENCE_TWO_TUPLE 160
|
||||
#define SEND_GEN 161
|
||||
#define LOAD_SUPER_ATTR_METHOD 66
|
||||
#define LOAD_ATTR_CLASS 67
|
||||
#define LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN 70
|
||||
#define LOAD_ATTR_INSTANCE_VALUE 72
|
||||
#define LOAD_ATTR_MODULE 73
|
||||
#define LOAD_ATTR_PROPERTY 76
|
||||
#define LOAD_ATTR_SLOT 77
|
||||
#define LOAD_ATTR_WITH_HINT 78
|
||||
#define LOAD_ATTR_METHOD_LAZY_DICT 79
|
||||
#define LOAD_ATTR_METHOD_NO_DICT 80
|
||||
#define LOAD_ATTR_METHOD_WITH_VALUES 81
|
||||
#define LOAD_CONST__LOAD_FAST 82
|
||||
#define LOAD_FAST__LOAD_CONST 84
|
||||
#define LOAD_FAST__LOAD_FAST 86
|
||||
#define LOAD_GLOBAL_BUILTIN 87
|
||||
#define LOAD_GLOBAL_MODULE 88
|
||||
#define STORE_ATTR_INSTANCE_VALUE 111
|
||||
#define STORE_ATTR_SLOT 112
|
||||
#define STORE_ATTR_WITH_HINT 113
|
||||
#define STORE_FAST__LOAD_FAST 143
|
||||
#define STORE_FAST__STORE_FAST 153
|
||||
#define STORE_SUBSCR_DICT 154
|
||||
#define STORE_SUBSCR_LIST_INT 158
|
||||
#define UNPACK_SEQUENCE_LIST 159
|
||||
#define UNPACK_SEQUENCE_TUPLE 160
|
||||
#define UNPACK_SEQUENCE_TWO_TUPLE 161
|
||||
#define SEND_GEN 166
|
||||
|
||||
#define HAS_ARG(op) ((((op) >= HAVE_ARGUMENT) && (!IS_PSEUDO_OPCODE(op)))\
|
||||
|| ((op) == JUMP) \
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue