Skip to content

Commit a60b843

Browse files
committed
Improve stats for LOAD_METHOD.
1 parent 0ef0853 commit a60b843

File tree

1 file changed

+15
-3
lines changed

1 file changed

+15
-3
lines changed

Python/specialize.c

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -496,6 +496,10 @@ initial_counter_value(void) {
496496
#define SPEC_FAIL_BUILTIN_CLASS_METHOD 17
497497
#define SPEC_FAIL_CLASS_METHOD_OBJ 18
498498
#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
499503

500504
/* Binary subscr */
501505

@@ -954,7 +958,7 @@ load_method_fail_kind(DescriptorClassification kind)
954958
case NON_DESCRIPTOR:
955959
return SPEC_FAIL_NOT_DESCRIPTOR;
956960
case ABSENT:
957-
return SPEC_FAIL_EXPECTED_ERROR;
961+
return SPEC_FAIL_INSTANCE_ATTRIBUTE;
958962
}
959963
Py_UNREACHABLE();
960964
}
@@ -975,6 +979,14 @@ specialize_class_load_method(PyObject *owner, _Py_CODEUNIT *instr, PyObject *nam
975979
cache2->obj = descr;
976980
*instr = _Py_MAKECODEUNIT(LOAD_METHOD_CLASS, _Py_OPARG(*instr));
977981
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;
978990
default:
979991
SPECIALIZATION_FAIL(LOAD_METHOD, load_method_fail_kind(kind));
980992
return -1;
@@ -1024,7 +1036,7 @@ _Py_Specialize_LoadMethod(PyObject *owner, _Py_CODEUNIT *instr, PyObject *name,
10241036
if (owner_cls->tp_flags & Py_TPFLAGS_MANAGED_DICT) {
10251037
PyObject **owner_dictptr = _PyObject_ManagedDictPointer(owner);
10261038
if (*owner_dictptr) {
1027-
SPECIALIZATION_FAIL(LOAD_METHOD, SPEC_FAIL_IS_ATTR);
1039+
SPECIALIZATION_FAIL(LOAD_METHOD, SPEC_FAIL_HAS_MANAGED_DICT);
10281040
goto fail;
10291041
}
10301042
PyDictKeysObject *keys = ((PyHeapTypeObject *)owner_cls)->ht_cached_keys;
@@ -1046,7 +1058,7 @@ _Py_Specialize_LoadMethod(PyObject *owner, _Py_CODEUNIT *instr, PyObject *name,
10461058
*instr = _Py_MAKECODEUNIT(LOAD_METHOD_NO_DICT, _Py_OPARG(*instr));
10471059
}
10481060
else {
1049-
SPECIALIZATION_FAIL(LOAD_METHOD, SPEC_FAIL_IS_ATTR);
1061+
SPECIALIZATION_FAIL(LOAD_METHOD, SPEC_FAIL_HAS_DICT);
10501062
goto fail;
10511063
}
10521064
}

0 commit comments

Comments
 (0)