Skip to content

Commit 062460e

Browse files
authored
bpo-46072: Improve LOAD_METHOD stats (GH-31104)
1 parent 4cce135 commit 062460e

File tree

1 file changed

+17
-3
lines changed

1 file changed

+17
-3
lines changed

Python/specialize.c

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -503,6 +503,10 @@ initial_counter_value(void) {
503503
#define SPEC_FAIL_BUILTIN_CLASS_METHOD 17
504504
#define SPEC_FAIL_CLASS_METHOD_OBJ 18
505505
#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
506510

507511
/* Binary subscr */
508512

@@ -973,7 +977,7 @@ load_method_fail_kind(DescriptorClassification kind)
973977
case NON_DESCRIPTOR:
974978
return SPEC_FAIL_NOT_DESCRIPTOR;
975979
case ABSENT:
976-
return SPEC_FAIL_EXPECTED_ERROR;
980+
return SPEC_FAIL_INSTANCE_ATTRIBUTE;
977981
}
978982
Py_UNREACHABLE();
979983
}
@@ -994,6 +998,16 @@ specialize_class_load_method(PyObject *owner, _Py_CODEUNIT *instr, PyObject *nam
994998
cache2->obj = descr;
995999
*instr = _Py_MAKECODEUNIT(LOAD_METHOD_CLASS, _Py_OPARG(*instr));
9961000
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
9971011
default:
9981012
SPECIALIZATION_FAIL(LOAD_METHOD, load_method_fail_kind(kind));
9991013
return -1;
@@ -1043,7 +1057,7 @@ _Py_Specialize_LoadMethod(PyObject *owner, _Py_CODEUNIT *instr, PyObject *name,
10431057
if (owner_cls->tp_flags & Py_TPFLAGS_MANAGED_DICT) {
10441058
PyObject **owner_dictptr = _PyObject_ManagedDictPointer(owner);
10451059
if (*owner_dictptr) {
1046-
SPECIALIZATION_FAIL(LOAD_METHOD, SPEC_FAIL_IS_ATTR);
1060+
SPECIALIZATION_FAIL(LOAD_METHOD, SPEC_FAIL_HAS_MANAGED_DICT);
10471061
goto fail;
10481062
}
10491063
PyDictKeysObject *keys = ((PyHeapTypeObject *)owner_cls)->ht_cached_keys;
@@ -1065,7 +1079,7 @@ _Py_Specialize_LoadMethod(PyObject *owner, _Py_CODEUNIT *instr, PyObject *name,
10651079
*instr = _Py_MAKECODEUNIT(LOAD_METHOD_NO_DICT, _Py_OPARG(*instr));
10661080
}
10671081
else {
1068-
SPECIALIZATION_FAIL(LOAD_METHOD, SPEC_FAIL_IS_ATTR);
1082+
SPECIALIZATION_FAIL(LOAD_METHOD, SPEC_FAIL_HAS_DICT);
10691083
goto fail;
10701084
}
10711085
}

0 commit comments

Comments
 (0)