Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fixup 'LOAD_METHOD' specialization stats so that they display properly. #93812

Merged
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 14 additions & 17 deletions Python/specialize.c
Original file line number Diff line number Diff line change
Expand Up @@ -358,16 +358,13 @@ miss_counter_start(void) {
#define SPEC_FAIL_ATTR_NON_STRING_OR_SPLIT 18
#define SPEC_FAIL_ATTR_MODULE_ATTR_NOT_FOUND 19

/* Methods */

#define SPEC_FAIL_LOAD_METHOD_METHOD 20
#define SPEC_FAIL_LOAD_METHOD_IS_ATTR 21
#define SPEC_FAIL_LOAD_METHOD_BUILTIN_CLASS_METHOD 22
#define SPEC_FAIL_LOAD_METHOD_CLASS_METHOD_OBJ 23
#define SPEC_FAIL_LOAD_METHOD_OBJECT_SLOT 24
#define SPEC_FAIL_LOAD_METHOD_HAS_MANAGED_DICT 25
#define SPEC_FAIL_LOAD_METHOD_INSTANCE_ATTRIBUTE 26
#define SPEC_FAIL_LOAD_METHOD_METACLASS_ATTRIBUTE 27
#define SPEC_FAIL_ATTR_SHADOWED 21
#define SPEC_FAIL_ATTR_BUILTIN_CLASS_METHOD 22
#define SPEC_FAIL_ATTR_CLASS_METHOD_OBJ 23
#define SPEC_FAIL_ATTR_OBJECT_SLOT 24
#define SPEC_FAIL_ATTR_HAS_MANAGED_DICT 25
#define SPEC_FAIL_ATTR_INSTANCE_ATTRIBUTE 26
#define SPEC_FAIL_ATTR_METACLASS_ATTRIBUTE 27

/* Binary subscr and store subscr */

Expand Down Expand Up @@ -863,7 +860,7 @@ load_attr_fail_kind(DescriptorClassification kind)
case PROPERTY:
return SPEC_FAIL_ATTR_PROPERTY;
case OBJECT_SLOT:
return SPEC_FAIL_LOAD_METHOD_OBJECT_SLOT;
return SPEC_FAIL_ATTR_OBJECT_SLOT;
case OTHER_SLOT:
return SPEC_FAIL_ATTR_NON_OBJECT_SLOT;
case DUNDER_CLASS:
Expand All @@ -873,15 +870,15 @@ load_attr_fail_kind(DescriptorClassification kind)
case GETSET_OVERRIDDEN:
return SPEC_FAIL_OVERRIDDEN;
case BUILTIN_CLASSMETHOD:
return SPEC_FAIL_LOAD_METHOD_BUILTIN_CLASS_METHOD;
return SPEC_FAIL_ATTR_BUILTIN_CLASS_METHOD;
case PYTHON_CLASSMETHOD:
return SPEC_FAIL_LOAD_METHOD_CLASS_METHOD_OBJ;
return SPEC_FAIL_ATTR_CLASS_METHOD_OBJ;
case NON_OVERRIDING:
return SPEC_FAIL_ATTR_NON_OVERRIDING_DESCRIPTOR;
case NON_DESCRIPTOR:
return SPEC_FAIL_ATTR_NOT_DESCRIPTOR;
case ABSENT:
return SPEC_FAIL_LOAD_METHOD_INSTANCE_ATTRIBUTE;
return SPEC_FAIL_ATTR_INSTANCE_ATTRIBUTE;
}
Py_UNREACHABLE();
}
Expand All @@ -905,7 +902,7 @@ specialize_class_load_attr(PyObject *owner, _Py_CODEUNIT *instr,
#ifdef Py_STATS
case ABSENT:
if (_PyType_Lookup(Py_TYPE(owner), name) != NULL) {
SPECIALIZATION_FAIL(LOAD_ATTR, SPEC_FAIL_LOAD_METHOD_METACLASS_ATTRIBUTE);
SPECIALIZATION_FAIL(LOAD_ATTR, SPEC_FAIL_ATTR_METACLASS_ATTRIBUTE);
}
else {
SPECIALIZATION_FAIL(LOAD_ATTR, SPEC_FAIL_EXPECTED_ERROR);
Expand Down Expand Up @@ -975,7 +972,7 @@ PyObject *descr, DescriptorClassification kind)
if (dictkind == MANAGED_VALUES || dictkind == OFFSET_DICT) {
Py_ssize_t index = _PyDictKeys_StringLookup(keys, name);
if (index != DKIX_EMPTY) {
SPECIALIZATION_FAIL(LOAD_ATTR, SPEC_FAIL_LOAD_METHOD_IS_ATTR);
SPECIALIZATION_FAIL(LOAD_ATTR, SPEC_FAIL_ATTR_SHADOWED);
goto fail;
}
uint32_t keys_version = _PyDictKeys_GetVersionForCurrentState(keys);
Expand All @@ -993,7 +990,7 @@ PyObject *descr, DescriptorClassification kind)
_Py_SET_OPCODE(*instr, LOAD_ATTR_METHOD_WITH_VALUES);
break;
case MANAGED_DICT:
SPECIALIZATION_FAIL(LOAD_ATTR, SPEC_FAIL_LOAD_METHOD_HAS_MANAGED_DICT);
SPECIALIZATION_FAIL(LOAD_ATTR, SPEC_FAIL_ATTR_HAS_MANAGED_DICT);
goto fail;
case OFFSET_DICT:
assert(owner_cls->tp_dictoffset > 0 && owner_cls->tp_dictoffset <= INT16_MAX);
Expand Down