Skip to content

Commit 48ec270

Browse files
add tests
1 parent 212bc3c commit 48ec270

3 files changed

Lines changed: 33 additions & 9 deletions

File tree

Lib/test/test_opcache.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2047,5 +2047,34 @@ def load_module_attr_missing():
20472047
sys.modules.pop("test_module_with_getattr", None)
20482048

20492049

2050+
@cpython_only
2051+
@requires_specialization
2052+
def test_load_attr_enum(self):
2053+
import enum
2054+
2055+
class Color(enum.IntEnum):
2056+
RED = 1
2057+
GREEN = 2
2058+
BLUE = 3
2059+
2060+
def load_enum_member():
2061+
for _ in range(_testinternalcapi.SPECIALIZATION_THRESHOLD):
2062+
x = Color.RED
2063+
self.assertEqual(x, 1)
2064+
2065+
load_enum_member()
2066+
self.assert_specialized(load_enum_member,
2067+
"LOAD_ATTR_CLASS_WITH_METACLASS_CHECK")
2068+
2069+
def load_enum_value():
2070+
for _ in range(_testinternalcapi.SPECIALIZATION_THRESHOLD):
2071+
x = Color.RED.value + Color.GREEN.value
2072+
self.assertEqual(x, 3)
2073+
2074+
load_enum_value()
2075+
self.assert_specialized(load_enum_value,
2076+
"LOAD_ATTR_CLASS_WITH_METACLASS_CHECK")
2077+
2078+
20502079
if __name__ == "__main__":
20512080
unittest.main()

Python/specialize.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1203,7 +1203,7 @@ specialize_class_load_attr(PyObject *owner, _Py_CODEUNIT *instr,
12031203
switch (kind) {
12041204
case MUTABLE:
12051205
// special case for enums which has Py_TYPE(descr) == cls
1206-
// so guarding on type_version is sufficient
1206+
// so guarding on type version is sufficient
12071207
if (Py_TYPE(descr) != cls) {
12081208
SPECIALIZATION_FAIL(LOAD_ATTR, SPEC_FAIL_ATTR_MUTABLE_CLASS);
12091209
Py_XDECREF(descr);
@@ -1217,7 +1217,9 @@ specialize_class_load_attr(PyObject *owner, _Py_CODEUNIT *instr,
12171217
_Py_FALLTHROUGH;
12181218
case METHOD:
12191219
case NON_DESCRIPTOR:
1220-
PyUnstable_Object_EnableDeferredRefcount(descr);
1220+
#ifdef Py_GIL_DISABLED
1221+
maybe_enable_deferred_ref_count(descr);
1222+
#endif
12211223
write_u32(cache->type_version, tp_version);
12221224
write_ptr(cache->descr, descr);
12231225
if (metaclass_check) {

Tools/ftscalingbench/ftscalingbench.py

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -308,13 +308,6 @@ def enum_attr():
308308
MyEnum.Y
309309
MyEnum.Z
310310

311-
@register_benchmark
312-
def enum_value():
313-
for _ in range(1000 * WORK_SCALE):
314-
MyEnum.X.value
315-
MyEnum.Y.value
316-
MyEnum.Z.value
317-
318311

319312
def bench_one_thread(func):
320313
t0 = time.perf_counter_ns()

0 commit comments

Comments
 (0)