@@ -503,6 +503,10 @@ initial_counter_value(void) {
503
503
#define SPEC_FAIL_BUILTIN_CLASS_METHOD 17
504
504
#define SPEC_FAIL_CLASS_METHOD_OBJ 18
505
505
#define SPEC_FAIL_OBJECT_SLOT 19
506
+ #define SPEC_FAIL_HAS_DICT 20
507
+ #define SPEC_FAIL_HAS_MANAGED_DICT 21
508
+ #define SPEC_FAIL_INSTANCE_ATTRIBUTE 22
509
+ #define SPEC_FAIL_METACLASS_ATTRIBUTE 23
506
510
507
511
/* Binary subscr */
508
512
@@ -973,7 +977,7 @@ load_method_fail_kind(DescriptorClassification kind)
973
977
case NON_DESCRIPTOR :
974
978
return SPEC_FAIL_NOT_DESCRIPTOR ;
975
979
case ABSENT :
976
- return SPEC_FAIL_EXPECTED_ERROR ;
980
+ return SPEC_FAIL_INSTANCE_ATTRIBUTE ;
977
981
}
978
982
Py_UNREACHABLE ();
979
983
}
@@ -994,6 +998,16 @@ specialize_class_load_method(PyObject *owner, _Py_CODEUNIT *instr, PyObject *nam
994
998
cache2 -> obj = descr ;
995
999
* instr = _Py_MAKECODEUNIT (LOAD_METHOD_CLASS , _Py_OPARG (* instr ));
996
1000
return 0 ;
1001
+ #ifdef Py_STATS
1002
+ case ABSENT :
1003
+ if (_PyType_Lookup (Py_TYPE (owner ), name ) != NULL ) {
1004
+ SPECIALIZATION_FAIL (LOAD_METHOD , SPEC_FAIL_METACLASS_ATTRIBUTE );
1005
+ }
1006
+ else {
1007
+ SPECIALIZATION_FAIL (LOAD_METHOD , SPEC_FAIL_EXPECTED_ERROR );
1008
+ }
1009
+ return -1 ;
1010
+ #endif
997
1011
default :
998
1012
SPECIALIZATION_FAIL (LOAD_METHOD , load_method_fail_kind (kind ));
999
1013
return -1 ;
@@ -1043,7 +1057,7 @@ _Py_Specialize_LoadMethod(PyObject *owner, _Py_CODEUNIT *instr, PyObject *name,
1043
1057
if (owner_cls -> tp_flags & Py_TPFLAGS_MANAGED_DICT ) {
1044
1058
PyObject * * owner_dictptr = _PyObject_ManagedDictPointer (owner );
1045
1059
if (* owner_dictptr ) {
1046
- SPECIALIZATION_FAIL (LOAD_METHOD , SPEC_FAIL_IS_ATTR );
1060
+ SPECIALIZATION_FAIL (LOAD_METHOD , SPEC_FAIL_HAS_MANAGED_DICT );
1047
1061
goto fail ;
1048
1062
}
1049
1063
PyDictKeysObject * keys = ((PyHeapTypeObject * )owner_cls )-> ht_cached_keys ;
@@ -1065,7 +1079,7 @@ _Py_Specialize_LoadMethod(PyObject *owner, _Py_CODEUNIT *instr, PyObject *name,
1065
1079
* instr = _Py_MAKECODEUNIT (LOAD_METHOD_NO_DICT , _Py_OPARG (* instr ));
1066
1080
}
1067
1081
else {
1068
- SPECIALIZATION_FAIL (LOAD_METHOD , SPEC_FAIL_IS_ATTR );
1082
+ SPECIALIZATION_FAIL (LOAD_METHOD , SPEC_FAIL_HAS_DICT );
1069
1083
goto fail ;
1070
1084
}
1071
1085
}
0 commit comments