mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 23:21:29 +00:00 
			
		
		
		
	GH-100288: Remove LOAD_ATTR_METHOD_WITH_DICT instruction. (GH-100753)
This commit is contained in:
		
							parent
							
								
									105e37395d
								
							
						
					
					
						commit
						f20c553a45
					
				
					 8 changed files with 40 additions and 95 deletions
				
			
		
							
								
								
									
										20
									
								
								Include/internal/pycore_opcode.h
									
										
									
										generated
									
									
									
								
							
							
						
						
									
										20
									
								
								Include/internal/pycore_opcode.h
									
										
									
										generated
									
									
									
								
							| 
						 | 
					@ -153,7 +153,6 @@ const uint8_t _PyOpcode_Deopt[256] = {
 | 
				
			||||||
    [LOAD_ATTR_INSTANCE_VALUE] = LOAD_ATTR,
 | 
					    [LOAD_ATTR_INSTANCE_VALUE] = LOAD_ATTR,
 | 
				
			||||||
    [LOAD_ATTR_METHOD_LAZY_DICT] = LOAD_ATTR,
 | 
					    [LOAD_ATTR_METHOD_LAZY_DICT] = LOAD_ATTR,
 | 
				
			||||||
    [LOAD_ATTR_METHOD_NO_DICT] = LOAD_ATTR,
 | 
					    [LOAD_ATTR_METHOD_NO_DICT] = LOAD_ATTR,
 | 
				
			||||||
    [LOAD_ATTR_METHOD_WITH_DICT] = LOAD_ATTR,
 | 
					 | 
				
			||||||
    [LOAD_ATTR_METHOD_WITH_VALUES] = LOAD_ATTR,
 | 
					    [LOAD_ATTR_METHOD_WITH_VALUES] = LOAD_ATTR,
 | 
				
			||||||
    [LOAD_ATTR_MODULE] = LOAD_ATTR,
 | 
					    [LOAD_ATTR_MODULE] = LOAD_ATTR,
 | 
				
			||||||
    [LOAD_ATTR_PROPERTY] = LOAD_ATTR,
 | 
					    [LOAD_ATTR_PROPERTY] = LOAD_ATTR,
 | 
				
			||||||
| 
						 | 
					@ -313,12 +312,12 @@ static const char *const _PyOpcode_OpName[263] = {
 | 
				
			||||||
    [LOAD_ATTR_WITH_HINT] = "LOAD_ATTR_WITH_HINT",
 | 
					    [LOAD_ATTR_WITH_HINT] = "LOAD_ATTR_WITH_HINT",
 | 
				
			||||||
    [LOAD_ATTR_METHOD_LAZY_DICT] = "LOAD_ATTR_METHOD_LAZY_DICT",
 | 
					    [LOAD_ATTR_METHOD_LAZY_DICT] = "LOAD_ATTR_METHOD_LAZY_DICT",
 | 
				
			||||||
    [LOAD_ATTR_METHOD_NO_DICT] = "LOAD_ATTR_METHOD_NO_DICT",
 | 
					    [LOAD_ATTR_METHOD_NO_DICT] = "LOAD_ATTR_METHOD_NO_DICT",
 | 
				
			||||||
    [LOAD_ATTR_METHOD_WITH_DICT] = "LOAD_ATTR_METHOD_WITH_DICT",
 | 
					    [LOAD_ATTR_METHOD_WITH_VALUES] = "LOAD_ATTR_METHOD_WITH_VALUES",
 | 
				
			||||||
    [LIST_TO_TUPLE] = "LIST_TO_TUPLE",
 | 
					    [LIST_TO_TUPLE] = "LIST_TO_TUPLE",
 | 
				
			||||||
    [RETURN_VALUE] = "RETURN_VALUE",
 | 
					    [RETURN_VALUE] = "RETURN_VALUE",
 | 
				
			||||||
    [IMPORT_STAR] = "IMPORT_STAR",
 | 
					    [IMPORT_STAR] = "IMPORT_STAR",
 | 
				
			||||||
    [SETUP_ANNOTATIONS] = "SETUP_ANNOTATIONS",
 | 
					    [SETUP_ANNOTATIONS] = "SETUP_ANNOTATIONS",
 | 
				
			||||||
    [LOAD_ATTR_METHOD_WITH_VALUES] = "LOAD_ATTR_METHOD_WITH_VALUES",
 | 
					    [LOAD_CONST__LOAD_FAST] = "LOAD_CONST__LOAD_FAST",
 | 
				
			||||||
    [ASYNC_GEN_WRAP] = "ASYNC_GEN_WRAP",
 | 
					    [ASYNC_GEN_WRAP] = "ASYNC_GEN_WRAP",
 | 
				
			||||||
    [PREP_RERAISE_STAR] = "PREP_RERAISE_STAR",
 | 
					    [PREP_RERAISE_STAR] = "PREP_RERAISE_STAR",
 | 
				
			||||||
    [POP_EXCEPT] = "POP_EXCEPT",
 | 
					    [POP_EXCEPT] = "POP_EXCEPT",
 | 
				
			||||||
| 
						 | 
					@ -345,7 +344,7 @@ static const char *const _PyOpcode_OpName[263] = {
 | 
				
			||||||
    [JUMP_FORWARD] = "JUMP_FORWARD",
 | 
					    [JUMP_FORWARD] = "JUMP_FORWARD",
 | 
				
			||||||
    [JUMP_IF_FALSE_OR_POP] = "JUMP_IF_FALSE_OR_POP",
 | 
					    [JUMP_IF_FALSE_OR_POP] = "JUMP_IF_FALSE_OR_POP",
 | 
				
			||||||
    [JUMP_IF_TRUE_OR_POP] = "JUMP_IF_TRUE_OR_POP",
 | 
					    [JUMP_IF_TRUE_OR_POP] = "JUMP_IF_TRUE_OR_POP",
 | 
				
			||||||
    [LOAD_CONST__LOAD_FAST] = "LOAD_CONST__LOAD_FAST",
 | 
					    [LOAD_FAST__LOAD_CONST] = "LOAD_FAST__LOAD_CONST",
 | 
				
			||||||
    [POP_JUMP_IF_FALSE] = "POP_JUMP_IF_FALSE",
 | 
					    [POP_JUMP_IF_FALSE] = "POP_JUMP_IF_FALSE",
 | 
				
			||||||
    [POP_JUMP_IF_TRUE] = "POP_JUMP_IF_TRUE",
 | 
					    [POP_JUMP_IF_TRUE] = "POP_JUMP_IF_TRUE",
 | 
				
			||||||
    [LOAD_GLOBAL] = "LOAD_GLOBAL",
 | 
					    [LOAD_GLOBAL] = "LOAD_GLOBAL",
 | 
				
			||||||
| 
						 | 
					@ -353,7 +352,7 @@ static const char *const _PyOpcode_OpName[263] = {
 | 
				
			||||||
    [CONTAINS_OP] = "CONTAINS_OP",
 | 
					    [CONTAINS_OP] = "CONTAINS_OP",
 | 
				
			||||||
    [RERAISE] = "RERAISE",
 | 
					    [RERAISE] = "RERAISE",
 | 
				
			||||||
    [COPY] = "COPY",
 | 
					    [COPY] = "COPY",
 | 
				
			||||||
    [LOAD_FAST__LOAD_CONST] = "LOAD_FAST__LOAD_CONST",
 | 
					    [LOAD_FAST__LOAD_FAST] = "LOAD_FAST__LOAD_FAST",
 | 
				
			||||||
    [BINARY_OP] = "BINARY_OP",
 | 
					    [BINARY_OP] = "BINARY_OP",
 | 
				
			||||||
    [SEND] = "SEND",
 | 
					    [SEND] = "SEND",
 | 
				
			||||||
    [LOAD_FAST] = "LOAD_FAST",
 | 
					    [LOAD_FAST] = "LOAD_FAST",
 | 
				
			||||||
| 
						 | 
					@ -373,9 +372,9 @@ static const char *const _PyOpcode_OpName[263] = {
 | 
				
			||||||
    [STORE_DEREF] = "STORE_DEREF",
 | 
					    [STORE_DEREF] = "STORE_DEREF",
 | 
				
			||||||
    [DELETE_DEREF] = "DELETE_DEREF",
 | 
					    [DELETE_DEREF] = "DELETE_DEREF",
 | 
				
			||||||
    [JUMP_BACKWARD] = "JUMP_BACKWARD",
 | 
					    [JUMP_BACKWARD] = "JUMP_BACKWARD",
 | 
				
			||||||
    [LOAD_FAST__LOAD_FAST] = "LOAD_FAST__LOAD_FAST",
 | 
					 | 
				
			||||||
    [CALL_FUNCTION_EX] = "CALL_FUNCTION_EX",
 | 
					 | 
				
			||||||
    [LOAD_GLOBAL_BUILTIN] = "LOAD_GLOBAL_BUILTIN",
 | 
					    [LOAD_GLOBAL_BUILTIN] = "LOAD_GLOBAL_BUILTIN",
 | 
				
			||||||
 | 
					    [CALL_FUNCTION_EX] = "CALL_FUNCTION_EX",
 | 
				
			||||||
 | 
					    [LOAD_GLOBAL_MODULE] = "LOAD_GLOBAL_MODULE",
 | 
				
			||||||
    [EXTENDED_ARG] = "EXTENDED_ARG",
 | 
					    [EXTENDED_ARG] = "EXTENDED_ARG",
 | 
				
			||||||
    [LIST_APPEND] = "LIST_APPEND",
 | 
					    [LIST_APPEND] = "LIST_APPEND",
 | 
				
			||||||
    [SET_ADD] = "SET_ADD",
 | 
					    [SET_ADD] = "SET_ADD",
 | 
				
			||||||
| 
						 | 
					@ -385,24 +384,24 @@ static const char *const _PyOpcode_OpName[263] = {
 | 
				
			||||||
    [YIELD_VALUE] = "YIELD_VALUE",
 | 
					    [YIELD_VALUE] = "YIELD_VALUE",
 | 
				
			||||||
    [RESUME] = "RESUME",
 | 
					    [RESUME] = "RESUME",
 | 
				
			||||||
    [MATCH_CLASS] = "MATCH_CLASS",
 | 
					    [MATCH_CLASS] = "MATCH_CLASS",
 | 
				
			||||||
    [LOAD_GLOBAL_MODULE] = "LOAD_GLOBAL_MODULE",
 | 
					 | 
				
			||||||
    [STORE_ATTR_INSTANCE_VALUE] = "STORE_ATTR_INSTANCE_VALUE",
 | 
					    [STORE_ATTR_INSTANCE_VALUE] = "STORE_ATTR_INSTANCE_VALUE",
 | 
				
			||||||
 | 
					    [STORE_ATTR_SLOT] = "STORE_ATTR_SLOT",
 | 
				
			||||||
    [FORMAT_VALUE] = "FORMAT_VALUE",
 | 
					    [FORMAT_VALUE] = "FORMAT_VALUE",
 | 
				
			||||||
    [BUILD_CONST_KEY_MAP] = "BUILD_CONST_KEY_MAP",
 | 
					    [BUILD_CONST_KEY_MAP] = "BUILD_CONST_KEY_MAP",
 | 
				
			||||||
    [BUILD_STRING] = "BUILD_STRING",
 | 
					    [BUILD_STRING] = "BUILD_STRING",
 | 
				
			||||||
    [STORE_ATTR_SLOT] = "STORE_ATTR_SLOT",
 | 
					 | 
				
			||||||
    [STORE_ATTR_WITH_HINT] = "STORE_ATTR_WITH_HINT",
 | 
					    [STORE_ATTR_WITH_HINT] = "STORE_ATTR_WITH_HINT",
 | 
				
			||||||
    [STORE_FAST__LOAD_FAST] = "STORE_FAST__LOAD_FAST",
 | 
					    [STORE_FAST__LOAD_FAST] = "STORE_FAST__LOAD_FAST",
 | 
				
			||||||
    [STORE_FAST__STORE_FAST] = "STORE_FAST__STORE_FAST",
 | 
					    [STORE_FAST__STORE_FAST] = "STORE_FAST__STORE_FAST",
 | 
				
			||||||
 | 
					    [STORE_SUBSCR_DICT] = "STORE_SUBSCR_DICT",
 | 
				
			||||||
    [LIST_EXTEND] = "LIST_EXTEND",
 | 
					    [LIST_EXTEND] = "LIST_EXTEND",
 | 
				
			||||||
    [SET_UPDATE] = "SET_UPDATE",
 | 
					    [SET_UPDATE] = "SET_UPDATE",
 | 
				
			||||||
    [DICT_MERGE] = "DICT_MERGE",
 | 
					    [DICT_MERGE] = "DICT_MERGE",
 | 
				
			||||||
    [DICT_UPDATE] = "DICT_UPDATE",
 | 
					    [DICT_UPDATE] = "DICT_UPDATE",
 | 
				
			||||||
    [STORE_SUBSCR_DICT] = "STORE_SUBSCR_DICT",
 | 
					 | 
				
			||||||
    [STORE_SUBSCR_LIST_INT] = "STORE_SUBSCR_LIST_INT",
 | 
					    [STORE_SUBSCR_LIST_INT] = "STORE_SUBSCR_LIST_INT",
 | 
				
			||||||
    [UNPACK_SEQUENCE_LIST] = "UNPACK_SEQUENCE_LIST",
 | 
					    [UNPACK_SEQUENCE_LIST] = "UNPACK_SEQUENCE_LIST",
 | 
				
			||||||
    [UNPACK_SEQUENCE_TUPLE] = "UNPACK_SEQUENCE_TUPLE",
 | 
					    [UNPACK_SEQUENCE_TUPLE] = "UNPACK_SEQUENCE_TUPLE",
 | 
				
			||||||
    [UNPACK_SEQUENCE_TWO_TUPLE] = "UNPACK_SEQUENCE_TWO_TUPLE",
 | 
					    [UNPACK_SEQUENCE_TWO_TUPLE] = "UNPACK_SEQUENCE_TWO_TUPLE",
 | 
				
			||||||
 | 
					    [170] = "<170>",
 | 
				
			||||||
    [CALL] = "CALL",
 | 
					    [CALL] = "CALL",
 | 
				
			||||||
    [KW_NAMES] = "KW_NAMES",
 | 
					    [KW_NAMES] = "KW_NAMES",
 | 
				
			||||||
    [173] = "<173>",
 | 
					    [173] = "<173>",
 | 
				
			||||||
| 
						 | 
					@ -499,6 +498,7 @@ static const char *const _PyOpcode_OpName[263] = {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define EXTRA_CASES \
 | 
					#define EXTRA_CASES \
 | 
				
			||||||
 | 
					    case 170: \
 | 
				
			||||||
    case 173: \
 | 
					    case 173: \
 | 
				
			||||||
    case 174: \
 | 
					    case 174: \
 | 
				
			||||||
    case 175: \
 | 
					    case 175: \
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										33
									
								
								Include/opcode.h
									
										
									
										generated
									
									
									
								
							
							
						
						
									
										33
									
								
								Include/opcode.h
									
										
									
										generated
									
									
									
								
							| 
						 | 
					@ -174,23 +174,22 @@ extern "C" {
 | 
				
			||||||
#define LOAD_ATTR_WITH_HINT                     78
 | 
					#define LOAD_ATTR_WITH_HINT                     78
 | 
				
			||||||
#define LOAD_ATTR_METHOD_LAZY_DICT              79
 | 
					#define LOAD_ATTR_METHOD_LAZY_DICT              79
 | 
				
			||||||
#define LOAD_ATTR_METHOD_NO_DICT                80
 | 
					#define LOAD_ATTR_METHOD_NO_DICT                80
 | 
				
			||||||
#define LOAD_ATTR_METHOD_WITH_DICT              81
 | 
					#define LOAD_ATTR_METHOD_WITH_VALUES            81
 | 
				
			||||||
#define LOAD_ATTR_METHOD_WITH_VALUES            86
 | 
					#define LOAD_CONST__LOAD_FAST                   86
 | 
				
			||||||
#define LOAD_CONST__LOAD_FAST                  113
 | 
					#define LOAD_FAST__LOAD_CONST                  113
 | 
				
			||||||
#define LOAD_FAST__LOAD_CONST                  121
 | 
					#define LOAD_FAST__LOAD_FAST                   121
 | 
				
			||||||
#define LOAD_FAST__LOAD_FAST                   141
 | 
					#define LOAD_GLOBAL_BUILTIN                    141
 | 
				
			||||||
#define LOAD_GLOBAL_BUILTIN                    143
 | 
					#define LOAD_GLOBAL_MODULE                     143
 | 
				
			||||||
#define LOAD_GLOBAL_MODULE                     153
 | 
					#define STORE_ATTR_INSTANCE_VALUE              153
 | 
				
			||||||
#define STORE_ATTR_INSTANCE_VALUE              154
 | 
					#define STORE_ATTR_SLOT                        154
 | 
				
			||||||
#define STORE_ATTR_SLOT                        158
 | 
					#define STORE_ATTR_WITH_HINT                   158
 | 
				
			||||||
#define STORE_ATTR_WITH_HINT                   159
 | 
					#define STORE_FAST__LOAD_FAST                  159
 | 
				
			||||||
#define STORE_FAST__LOAD_FAST                  160
 | 
					#define STORE_FAST__STORE_FAST                 160
 | 
				
			||||||
#define STORE_FAST__STORE_FAST                 161
 | 
					#define STORE_SUBSCR_DICT                      161
 | 
				
			||||||
#define STORE_SUBSCR_DICT                      166
 | 
					#define STORE_SUBSCR_LIST_INT                  166
 | 
				
			||||||
#define STORE_SUBSCR_LIST_INT                  167
 | 
					#define UNPACK_SEQUENCE_LIST                   167
 | 
				
			||||||
#define UNPACK_SEQUENCE_LIST                   168
 | 
					#define UNPACK_SEQUENCE_TUPLE                  168
 | 
				
			||||||
#define UNPACK_SEQUENCE_TUPLE                  169
 | 
					#define UNPACK_SEQUENCE_TWO_TUPLE              169
 | 
				
			||||||
#define UNPACK_SEQUENCE_TWO_TUPLE              170
 | 
					 | 
				
			||||||
#define DO_TRACING                             255
 | 
					#define DO_TRACING                             255
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define HAS_ARG(op) ((((op) >= HAVE_ARGUMENT) && (!IS_PSEUDO_OPCODE(op)))\
 | 
					#define HAS_ARG(op) ((((op) >= HAVE_ARGUMENT) && (!IS_PSEUDO_OPCODE(op)))\
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -336,7 +336,6 @@ def pseudo_op(name, op, real_ops):
 | 
				
			||||||
        # These will always push [unbound method, self] onto the stack.
 | 
					        # These will always push [unbound method, self] onto the stack.
 | 
				
			||||||
        "LOAD_ATTR_METHOD_LAZY_DICT",
 | 
					        "LOAD_ATTR_METHOD_LAZY_DICT",
 | 
				
			||||||
        "LOAD_ATTR_METHOD_NO_DICT",
 | 
					        "LOAD_ATTR_METHOD_NO_DICT",
 | 
				
			||||||
        "LOAD_ATTR_METHOD_WITH_DICT",
 | 
					 | 
				
			||||||
        "LOAD_ATTR_METHOD_WITH_VALUES",
 | 
					        "LOAD_ATTR_METHOD_WITH_VALUES",
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    "LOAD_CONST": [
 | 
					    "LOAD_CONST": [
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,2 @@
 | 
				
			||||||
 | 
					Remove the LOAD_ATTR_METHOD_WITH_DICT specialized instruction. Stats show it
 | 
				
			||||||
 | 
					is not useful.
 | 
				
			||||||
| 
						 | 
					@ -2605,33 +2605,6 @@ dummy_func(
 | 
				
			||||||
            JUMPBY(INLINE_CACHE_ENTRIES_LOAD_ATTR);
 | 
					            JUMPBY(INLINE_CACHE_ENTRIES_LOAD_ATTR);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // error: LOAD_ATTR has irregular stack effect
 | 
					 | 
				
			||||||
        inst(LOAD_ATTR_METHOD_WITH_DICT) {
 | 
					 | 
				
			||||||
            /* Can be either a managed dict, or a tp_dictoffset offset.*/
 | 
					 | 
				
			||||||
            assert(cframe.use_tracing == 0);
 | 
					 | 
				
			||||||
            PyObject *self = TOP();
 | 
					 | 
				
			||||||
            PyTypeObject *self_cls = Py_TYPE(self);
 | 
					 | 
				
			||||||
            _PyLoadMethodCache *cache = (_PyLoadMethodCache *)next_instr;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            DEOPT_IF(self_cls->tp_version_tag != read_u32(cache->type_version),
 | 
					 | 
				
			||||||
                     LOAD_ATTR);
 | 
					 | 
				
			||||||
            /* Treat index as a signed 16 bit value */
 | 
					 | 
				
			||||||
            Py_ssize_t dictoffset = self_cls->tp_dictoffset;
 | 
					 | 
				
			||||||
            assert(dictoffset > 0);
 | 
					 | 
				
			||||||
            PyDictObject **dictptr = (PyDictObject**)(((char *)self)+dictoffset);
 | 
					 | 
				
			||||||
            PyDictObject *dict = *dictptr;
 | 
					 | 
				
			||||||
            DEOPT_IF(dict == NULL, LOAD_ATTR);
 | 
					 | 
				
			||||||
            DEOPT_IF(dict->ma_keys->dk_version != read_u32(cache->keys_version),
 | 
					 | 
				
			||||||
                     LOAD_ATTR);
 | 
					 | 
				
			||||||
            STAT_INC(LOAD_ATTR, hit);
 | 
					 | 
				
			||||||
            PyObject *res = read_obj(cache->descr);
 | 
					 | 
				
			||||||
            assert(res != NULL);
 | 
					 | 
				
			||||||
            assert(_PyType_HasFeature(Py_TYPE(res), Py_TPFLAGS_METHOD_DESCRIPTOR));
 | 
					 | 
				
			||||||
            SET_TOP(Py_NewRef(res));
 | 
					 | 
				
			||||||
            PUSH(self);
 | 
					 | 
				
			||||||
            JUMPBY(INLINE_CACHE_ENTRIES_LOAD_ATTR);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        // error: LOAD_ATTR has irregular stack effect
 | 
					        // error: LOAD_ATTR has irregular stack effect
 | 
				
			||||||
        inst(LOAD_ATTR_METHOD_NO_DICT) {
 | 
					        inst(LOAD_ATTR_METHOD_NO_DICT) {
 | 
				
			||||||
            assert(cframe.use_tracing == 0);
 | 
					            assert(cframe.use_tracing == 0);
 | 
				
			||||||
| 
						 | 
					@ -3517,7 +3490,7 @@ family(load_attr) = {
 | 
				
			||||||
    LOAD_ATTR, LOAD_ATTR_CLASS,
 | 
					    LOAD_ATTR, LOAD_ATTR_CLASS,
 | 
				
			||||||
    LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN, LOAD_ATTR_INSTANCE_VALUE, LOAD_ATTR_MODULE,
 | 
					    LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN, LOAD_ATTR_INSTANCE_VALUE, LOAD_ATTR_MODULE,
 | 
				
			||||||
    LOAD_ATTR_PROPERTY, LOAD_ATTR_SLOT, LOAD_ATTR_WITH_HINT,
 | 
					    LOAD_ATTR_PROPERTY, LOAD_ATTR_SLOT, LOAD_ATTR_WITH_HINT,
 | 
				
			||||||
    LOAD_ATTR_METHOD_LAZY_DICT, LOAD_ATTR_METHOD_NO_DICT, LOAD_ATTR_METHOD_WITH_DICT,
 | 
					    LOAD_ATTR_METHOD_LAZY_DICT, LOAD_ATTR_METHOD_NO_DICT,
 | 
				
			||||||
    LOAD_ATTR_METHOD_WITH_VALUES };
 | 
					    LOAD_ATTR_METHOD_WITH_VALUES };
 | 
				
			||||||
family(load_global) = {
 | 
					family(load_global) = {
 | 
				
			||||||
    LOAD_GLOBAL, LOAD_GLOBAL_BUILTIN,
 | 
					    LOAD_GLOBAL, LOAD_GLOBAL_BUILTIN,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										27
									
								
								Python/generated_cases.c.h
									
										
									
										generated
									
									
									
								
							
							
						
						
									
										27
									
								
								Python/generated_cases.c.h
									
										
									
										generated
									
									
									
								
							| 
						 | 
					@ -2960,33 +2960,6 @@
 | 
				
			||||||
            DISPATCH();
 | 
					            DISPATCH();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        TARGET(LOAD_ATTR_METHOD_WITH_DICT) {
 | 
					 | 
				
			||||||
            /* Can be either a managed dict, or a tp_dictoffset offset.*/
 | 
					 | 
				
			||||||
            assert(cframe.use_tracing == 0);
 | 
					 | 
				
			||||||
            PyObject *self = TOP();
 | 
					 | 
				
			||||||
            PyTypeObject *self_cls = Py_TYPE(self);
 | 
					 | 
				
			||||||
            _PyLoadMethodCache *cache = (_PyLoadMethodCache *)next_instr;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            DEOPT_IF(self_cls->tp_version_tag != read_u32(cache->type_version),
 | 
					 | 
				
			||||||
                     LOAD_ATTR);
 | 
					 | 
				
			||||||
            /* Treat index as a signed 16 bit value */
 | 
					 | 
				
			||||||
            Py_ssize_t dictoffset = self_cls->tp_dictoffset;
 | 
					 | 
				
			||||||
            assert(dictoffset > 0);
 | 
					 | 
				
			||||||
            PyDictObject **dictptr = (PyDictObject**)(((char *)self)+dictoffset);
 | 
					 | 
				
			||||||
            PyDictObject *dict = *dictptr;
 | 
					 | 
				
			||||||
            DEOPT_IF(dict == NULL, LOAD_ATTR);
 | 
					 | 
				
			||||||
            DEOPT_IF(dict->ma_keys->dk_version != read_u32(cache->keys_version),
 | 
					 | 
				
			||||||
                     LOAD_ATTR);
 | 
					 | 
				
			||||||
            STAT_INC(LOAD_ATTR, hit);
 | 
					 | 
				
			||||||
            PyObject *res = read_obj(cache->descr);
 | 
					 | 
				
			||||||
            assert(res != NULL);
 | 
					 | 
				
			||||||
            assert(_PyType_HasFeature(Py_TYPE(res), Py_TPFLAGS_METHOD_DESCRIPTOR));
 | 
					 | 
				
			||||||
            SET_TOP(Py_NewRef(res));
 | 
					 | 
				
			||||||
            PUSH(self);
 | 
					 | 
				
			||||||
            JUMPBY(INLINE_CACHE_ENTRIES_LOAD_ATTR);
 | 
					 | 
				
			||||||
            DISPATCH();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        TARGET(LOAD_ATTR_METHOD_NO_DICT) {
 | 
					        TARGET(LOAD_ATTR_METHOD_NO_DICT) {
 | 
				
			||||||
            assert(cframe.use_tracing == 0);
 | 
					            assert(cframe.use_tracing == 0);
 | 
				
			||||||
            PyObject *self = TOP();
 | 
					            PyObject *self = TOP();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										18
									
								
								Python/opcode_targets.h
									
										
									
										generated
									
									
									
								
							
							
						
						
									
										18
									
								
								Python/opcode_targets.h
									
										
									
										generated
									
									
									
								
							| 
						 | 
					@ -80,12 +80,12 @@ static void *opcode_targets[256] = {
 | 
				
			||||||
    &&TARGET_LOAD_ATTR_WITH_HINT,
 | 
					    &&TARGET_LOAD_ATTR_WITH_HINT,
 | 
				
			||||||
    &&TARGET_LOAD_ATTR_METHOD_LAZY_DICT,
 | 
					    &&TARGET_LOAD_ATTR_METHOD_LAZY_DICT,
 | 
				
			||||||
    &&TARGET_LOAD_ATTR_METHOD_NO_DICT,
 | 
					    &&TARGET_LOAD_ATTR_METHOD_NO_DICT,
 | 
				
			||||||
    &&TARGET_LOAD_ATTR_METHOD_WITH_DICT,
 | 
					    &&TARGET_LOAD_ATTR_METHOD_WITH_VALUES,
 | 
				
			||||||
    &&TARGET_LIST_TO_TUPLE,
 | 
					    &&TARGET_LIST_TO_TUPLE,
 | 
				
			||||||
    &&TARGET_RETURN_VALUE,
 | 
					    &&TARGET_RETURN_VALUE,
 | 
				
			||||||
    &&TARGET_IMPORT_STAR,
 | 
					    &&TARGET_IMPORT_STAR,
 | 
				
			||||||
    &&TARGET_SETUP_ANNOTATIONS,
 | 
					    &&TARGET_SETUP_ANNOTATIONS,
 | 
				
			||||||
    &&TARGET_LOAD_ATTR_METHOD_WITH_VALUES,
 | 
					    &&TARGET_LOAD_CONST__LOAD_FAST,
 | 
				
			||||||
    &&TARGET_ASYNC_GEN_WRAP,
 | 
					    &&TARGET_ASYNC_GEN_WRAP,
 | 
				
			||||||
    &&TARGET_PREP_RERAISE_STAR,
 | 
					    &&TARGET_PREP_RERAISE_STAR,
 | 
				
			||||||
    &&TARGET_POP_EXCEPT,
 | 
					    &&TARGET_POP_EXCEPT,
 | 
				
			||||||
| 
						 | 
					@ -112,7 +112,7 @@ static void *opcode_targets[256] = {
 | 
				
			||||||
    &&TARGET_JUMP_FORWARD,
 | 
					    &&TARGET_JUMP_FORWARD,
 | 
				
			||||||
    &&TARGET_JUMP_IF_FALSE_OR_POP,
 | 
					    &&TARGET_JUMP_IF_FALSE_OR_POP,
 | 
				
			||||||
    &&TARGET_JUMP_IF_TRUE_OR_POP,
 | 
					    &&TARGET_JUMP_IF_TRUE_OR_POP,
 | 
				
			||||||
    &&TARGET_LOAD_CONST__LOAD_FAST,
 | 
					    &&TARGET_LOAD_FAST__LOAD_CONST,
 | 
				
			||||||
    &&TARGET_POP_JUMP_IF_FALSE,
 | 
					    &&TARGET_POP_JUMP_IF_FALSE,
 | 
				
			||||||
    &&TARGET_POP_JUMP_IF_TRUE,
 | 
					    &&TARGET_POP_JUMP_IF_TRUE,
 | 
				
			||||||
    &&TARGET_LOAD_GLOBAL,
 | 
					    &&TARGET_LOAD_GLOBAL,
 | 
				
			||||||
| 
						 | 
					@ -120,7 +120,7 @@ static void *opcode_targets[256] = {
 | 
				
			||||||
    &&TARGET_CONTAINS_OP,
 | 
					    &&TARGET_CONTAINS_OP,
 | 
				
			||||||
    &&TARGET_RERAISE,
 | 
					    &&TARGET_RERAISE,
 | 
				
			||||||
    &&TARGET_COPY,
 | 
					    &&TARGET_COPY,
 | 
				
			||||||
    &&TARGET_LOAD_FAST__LOAD_CONST,
 | 
					    &&TARGET_LOAD_FAST__LOAD_FAST,
 | 
				
			||||||
    &&TARGET_BINARY_OP,
 | 
					    &&TARGET_BINARY_OP,
 | 
				
			||||||
    &&TARGET_SEND,
 | 
					    &&TARGET_SEND,
 | 
				
			||||||
    &&TARGET_LOAD_FAST,
 | 
					    &&TARGET_LOAD_FAST,
 | 
				
			||||||
| 
						 | 
					@ -140,9 +140,9 @@ static void *opcode_targets[256] = {
 | 
				
			||||||
    &&TARGET_STORE_DEREF,
 | 
					    &&TARGET_STORE_DEREF,
 | 
				
			||||||
    &&TARGET_DELETE_DEREF,
 | 
					    &&TARGET_DELETE_DEREF,
 | 
				
			||||||
    &&TARGET_JUMP_BACKWARD,
 | 
					    &&TARGET_JUMP_BACKWARD,
 | 
				
			||||||
    &&TARGET_LOAD_FAST__LOAD_FAST,
 | 
					 | 
				
			||||||
    &&TARGET_CALL_FUNCTION_EX,
 | 
					 | 
				
			||||||
    &&TARGET_LOAD_GLOBAL_BUILTIN,
 | 
					    &&TARGET_LOAD_GLOBAL_BUILTIN,
 | 
				
			||||||
 | 
					    &&TARGET_CALL_FUNCTION_EX,
 | 
				
			||||||
 | 
					    &&TARGET_LOAD_GLOBAL_MODULE,
 | 
				
			||||||
    &&TARGET_EXTENDED_ARG,
 | 
					    &&TARGET_EXTENDED_ARG,
 | 
				
			||||||
    &&TARGET_LIST_APPEND,
 | 
					    &&TARGET_LIST_APPEND,
 | 
				
			||||||
    &&TARGET_SET_ADD,
 | 
					    &&TARGET_SET_ADD,
 | 
				
			||||||
| 
						 | 
					@ -152,24 +152,24 @@ static void *opcode_targets[256] = {
 | 
				
			||||||
    &&TARGET_YIELD_VALUE,
 | 
					    &&TARGET_YIELD_VALUE,
 | 
				
			||||||
    &&TARGET_RESUME,
 | 
					    &&TARGET_RESUME,
 | 
				
			||||||
    &&TARGET_MATCH_CLASS,
 | 
					    &&TARGET_MATCH_CLASS,
 | 
				
			||||||
    &&TARGET_LOAD_GLOBAL_MODULE,
 | 
					 | 
				
			||||||
    &&TARGET_STORE_ATTR_INSTANCE_VALUE,
 | 
					    &&TARGET_STORE_ATTR_INSTANCE_VALUE,
 | 
				
			||||||
 | 
					    &&TARGET_STORE_ATTR_SLOT,
 | 
				
			||||||
    &&TARGET_FORMAT_VALUE,
 | 
					    &&TARGET_FORMAT_VALUE,
 | 
				
			||||||
    &&TARGET_BUILD_CONST_KEY_MAP,
 | 
					    &&TARGET_BUILD_CONST_KEY_MAP,
 | 
				
			||||||
    &&TARGET_BUILD_STRING,
 | 
					    &&TARGET_BUILD_STRING,
 | 
				
			||||||
    &&TARGET_STORE_ATTR_SLOT,
 | 
					 | 
				
			||||||
    &&TARGET_STORE_ATTR_WITH_HINT,
 | 
					    &&TARGET_STORE_ATTR_WITH_HINT,
 | 
				
			||||||
    &&TARGET_STORE_FAST__LOAD_FAST,
 | 
					    &&TARGET_STORE_FAST__LOAD_FAST,
 | 
				
			||||||
    &&TARGET_STORE_FAST__STORE_FAST,
 | 
					    &&TARGET_STORE_FAST__STORE_FAST,
 | 
				
			||||||
 | 
					    &&TARGET_STORE_SUBSCR_DICT,
 | 
				
			||||||
    &&TARGET_LIST_EXTEND,
 | 
					    &&TARGET_LIST_EXTEND,
 | 
				
			||||||
    &&TARGET_SET_UPDATE,
 | 
					    &&TARGET_SET_UPDATE,
 | 
				
			||||||
    &&TARGET_DICT_MERGE,
 | 
					    &&TARGET_DICT_MERGE,
 | 
				
			||||||
    &&TARGET_DICT_UPDATE,
 | 
					    &&TARGET_DICT_UPDATE,
 | 
				
			||||||
    &&TARGET_STORE_SUBSCR_DICT,
 | 
					 | 
				
			||||||
    &&TARGET_STORE_SUBSCR_LIST_INT,
 | 
					    &&TARGET_STORE_SUBSCR_LIST_INT,
 | 
				
			||||||
    &&TARGET_UNPACK_SEQUENCE_LIST,
 | 
					    &&TARGET_UNPACK_SEQUENCE_LIST,
 | 
				
			||||||
    &&TARGET_UNPACK_SEQUENCE_TUPLE,
 | 
					    &&TARGET_UNPACK_SEQUENCE_TUPLE,
 | 
				
			||||||
    &&TARGET_UNPACK_SEQUENCE_TWO_TUPLE,
 | 
					    &&TARGET_UNPACK_SEQUENCE_TWO_TUPLE,
 | 
				
			||||||
 | 
					    &&_unknown_opcode,
 | 
				
			||||||
    &&TARGET_CALL,
 | 
					    &&TARGET_CALL,
 | 
				
			||||||
    &&TARGET_KW_NAMES,
 | 
					    &&TARGET_KW_NAMES,
 | 
				
			||||||
    &&_unknown_opcode,
 | 
					    &&_unknown_opcode,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1091,9 +1091,8 @@ PyObject *descr, DescriptorClassification kind)
 | 
				
			||||||
            SPECIALIZATION_FAIL(LOAD_ATTR, SPEC_FAIL_ATTR_HAS_MANAGED_DICT);
 | 
					            SPECIALIZATION_FAIL(LOAD_ATTR, SPEC_FAIL_ATTR_HAS_MANAGED_DICT);
 | 
				
			||||||
            goto fail;
 | 
					            goto fail;
 | 
				
			||||||
        case OFFSET_DICT:
 | 
					        case OFFSET_DICT:
 | 
				
			||||||
            assert(owner_cls->tp_dictoffset > 0 && owner_cls->tp_dictoffset <= INT16_MAX);
 | 
					            SPECIALIZATION_FAIL(LOAD_ATTR, SPEC_FAIL_ATTR_NOT_MANAGED_DICT);
 | 
				
			||||||
            _py_set_opcode(instr, LOAD_ATTR_METHOD_WITH_DICT);
 | 
					            goto fail;
 | 
				
			||||||
            break;
 | 
					 | 
				
			||||||
        case LAZY_DICT:
 | 
					        case LAZY_DICT:
 | 
				
			||||||
            assert(owner_cls->tp_dictoffset > 0 && owner_cls->tp_dictoffset <= INT16_MAX);
 | 
					            assert(owner_cls->tp_dictoffset > 0 && owner_cls->tp_dictoffset <= INT16_MAX);
 | 
				
			||||||
            _py_set_opcode(instr, LOAD_ATTR_METHOD_LAZY_DICT);
 | 
					            _py_set_opcode(instr, LOAD_ATTR_METHOD_LAZY_DICT);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue