@@ -496,6 +496,10 @@ initial_counter_value(void) {
496
496
#define SPEC_FAIL_BUILTIN_CLASS_METHOD 17
497
497
#define SPEC_FAIL_CLASS_METHOD_OBJ 18
498
498
#define SPEC_FAIL_OBJECT_SLOT 19
499
+ #define SPEC_FAIL_HAS_DICT 20
500
+ #define SPEC_FAIL_HAS_MANAGED_DICT 21
501
+ #define SPEC_FAIL_INSTANCE_ATTRIBUTE 22
502
+ #define SPEC_FAIL_METACLASS_ATTRIBUTE 23
499
503
500
504
/* Binary subscr */
501
505
@@ -954,7 +958,7 @@ load_method_fail_kind(DescriptorClassification kind)
954
958
case NON_DESCRIPTOR :
955
959
return SPEC_FAIL_NOT_DESCRIPTOR ;
956
960
case ABSENT :
957
- return SPEC_FAIL_EXPECTED_ERROR ;
961
+ return SPEC_FAIL_INSTANCE_ATTRIBUTE ;
958
962
}
959
963
Py_UNREACHABLE ();
960
964
}
@@ -975,6 +979,14 @@ specialize_class_load_method(PyObject *owner, _Py_CODEUNIT *instr, PyObject *nam
975
979
cache2 -> obj = descr ;
976
980
* instr = _Py_MAKECODEUNIT (LOAD_METHOD_CLASS , _Py_OPARG (* instr ));
977
981
return 0 ;
982
+ case ABSENT :
983
+ if (_PyType_Lookup (Py_TYPE (owner ), name ) != NULL ) {
984
+ SPECIALIZATION_FAIL (LOAD_METHOD , SPEC_FAIL_METACLASS_ATTRIBUTE );
985
+ }
986
+ else {
987
+ SPECIALIZATION_FAIL (LOAD_METHOD , SPEC_FAIL_EXPECTED_ERROR );
988
+ }
989
+ return -1 ;
978
990
default :
979
991
SPECIALIZATION_FAIL (LOAD_METHOD , load_method_fail_kind (kind ));
980
992
return -1 ;
@@ -1024,7 +1036,7 @@ _Py_Specialize_LoadMethod(PyObject *owner, _Py_CODEUNIT *instr, PyObject *name,
1024
1036
if (owner_cls -> tp_flags & Py_TPFLAGS_MANAGED_DICT ) {
1025
1037
PyObject * * owner_dictptr = _PyObject_ManagedDictPointer (owner );
1026
1038
if (* owner_dictptr ) {
1027
- SPECIALIZATION_FAIL (LOAD_METHOD , SPEC_FAIL_IS_ATTR );
1039
+ SPECIALIZATION_FAIL (LOAD_METHOD , SPEC_FAIL_HAS_MANAGED_DICT );
1028
1040
goto fail ;
1029
1041
}
1030
1042
PyDictKeysObject * keys = ((PyHeapTypeObject * )owner_cls )-> ht_cached_keys ;
@@ -1046,7 +1058,7 @@ _Py_Specialize_LoadMethod(PyObject *owner, _Py_CODEUNIT *instr, PyObject *name,
1046
1058
* instr = _Py_MAKECODEUNIT (LOAD_METHOD_NO_DICT , _Py_OPARG (* instr ));
1047
1059
}
1048
1060
else {
1049
- SPECIALIZATION_FAIL (LOAD_METHOD , SPEC_FAIL_IS_ATTR );
1061
+ SPECIALIZATION_FAIL (LOAD_METHOD , SPEC_FAIL_HAS_DICT );
1050
1062
goto fail ;
1051
1063
}
1052
1064
}
0 commit comments