Skip to content

Commit f41581d

Browse files
committed
gh-141510: Update specializer to support frozendict
1 parent dd64e42 commit f41581d

File tree

8 files changed

+70
-27
lines changed

8 files changed

+70
-27
lines changed

Include/internal/pycore_interp_structs.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -496,7 +496,7 @@ struct _py_func_state {
496496

497497
/* For now we hard-code this to a value for which we are confident
498498
all the static builtin types will fit (for all builds). */
499-
#define _Py_MAX_MANAGED_STATIC_BUILTIN_TYPES 200
499+
#define _Py_MAX_MANAGED_STATIC_BUILTIN_TYPES 201
500500
#define _Py_MAX_MANAGED_STATIC_EXT_TYPES 10
501501
#define _Py_MAX_MANAGED_STATIC_TYPES \
502502
(_Py_MAX_MANAGED_STATIC_BUILTIN_TYPES + _Py_MAX_MANAGED_STATIC_EXT_TYPES)

Lib/test/test_opcache.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1548,6 +1548,27 @@ def contains_op_dict():
15481548
self.assert_specialized(contains_op_dict, "CONTAINS_OP_DICT")
15491549
self.assert_no_opcode(contains_op_dict, "CONTAINS_OP")
15501550

1551+
def contains_op_frozen_dict():
1552+
for _ in range(_testinternalcapi.SPECIALIZATION_THRESHOLD):
1553+
a, b = 1, frozendict({1: 2, 2: 5})
1554+
self.assertTrue(a in b)
1555+
self.assertFalse(3 in b)
1556+
1557+
contains_op_frozen_dict()
1558+
self.assert_specialized(contains_op_frozen_dict, "CONTAINS_OP_DICT")
1559+
self.assert_no_opcode(contains_op_frozen_dict, "CONTAINS_OP")
1560+
1561+
def contains_op_frozen_dict_subclass():
1562+
class MyFrozenDict(frozendict):
1563+
pass
1564+
for _ in range(_testinternalcapi.SPECIALIZATION_THRESHOLD):
1565+
a, b = 1, MyFrozenDict({1: 2, 2: 5})
1566+
self.assertTrue(a in b)
1567+
self.assertFalse(3 in b)
1568+
1569+
contains_op_frozen_dict_subclass()
1570+
self.assert_no_opcode(contains_op_frozen_dict_subclass, "CONTAINS_OP_DICT")
1571+
15511572
def contains_op_set():
15521573
for _ in range(_testinternalcapi.SPECIALIZATION_THRESHOLD):
15531574
a, b = 1, {1, 2}
@@ -1808,6 +1829,27 @@ def binary_subscr_dict():
18081829
self.assert_specialized(binary_subscr_dict, "BINARY_OP_SUBSCR_DICT")
18091830
self.assert_no_opcode(binary_subscr_dict, "BINARY_OP")
18101831

1832+
def binary_subscr_frozen_dict():
1833+
for _ in range(_testinternalcapi.SPECIALIZATION_THRESHOLD):
1834+
a = frozendict({1: 2, 2: 3})
1835+
self.assertEqual(a[1], 2)
1836+
self.assertEqual(a[2], 3)
1837+
1838+
binary_subscr_frozen_dict()
1839+
self.assert_specialized(binary_subscr_frozen_dict, "BINARY_OP_SUBSCR_DICT")
1840+
self.assert_no_opcode(binary_subscr_frozen_dict, "BINARY_OP")
1841+
1842+
def binary_subscr_frozen_dict_subclass():
1843+
class MyFrozenDict(frozendict):
1844+
pass
1845+
for _ in range(_testinternalcapi.SPECIALIZATION_THRESHOLD):
1846+
a = MyFrozenDict({1: 2, 2: 3})
1847+
self.assertEqual(a[1], 2)
1848+
self.assertEqual(a[2], 3)
1849+
1850+
binary_subscr_frozen_dict_subclass()
1851+
self.assert_no_opcode(binary_subscr_frozen_dict_subclass, "BINARY_OP_SUBSCR_DICT")
1852+
18111853
def binary_subscr_str_int():
18121854
for _ in range(_testinternalcapi.SPECIALIZATION_THRESHOLD):
18131855
a = "foobar"
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Update specializer to support frozendict. Patch by Donghee Na.

Modules/_testinternalcapi/test_cases.c.h

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Python/bytecodes.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1058,12 +1058,12 @@ dummy_func(
10581058

10591059
op(_GUARD_NOS_DICT, (nos, unused -- nos, unused)) {
10601060
PyObject *o = PyStackRef_AsPyObjectBorrow(nos);
1061-
EXIT_IF(!PyDict_CheckExact(o));
1061+
EXIT_IF(!PyAnyDict_CheckExact(o));
10621062
}
10631063

10641064
op(_GUARD_TOS_DICT, (tos -- tos)) {
10651065
PyObject *o = PyStackRef_AsPyObjectBorrow(tos);
1066-
EXIT_IF(!PyDict_CheckExact(o));
1066+
EXIT_IF(!PyAnyDict_CheckExact(o));
10671067
}
10681068

10691069
macro(BINARY_OP_SUBSCR_DICT) =
@@ -1073,7 +1073,7 @@ dummy_func(
10731073
PyObject *sub = PyStackRef_AsPyObjectBorrow(sub_st);
10741074
PyObject *dict = PyStackRef_AsPyObjectBorrow(dict_st);
10751075

1076-
assert(PyDict_CheckExact(dict));
1076+
assert(PyAnyDict_CheckExact(dict));
10771077
STAT_INC(BINARY_OP, hit);
10781078
PyObject *res_o;
10791079
int rc = PyDict_GetItemRef(dict, sub, &res_o);
@@ -2940,7 +2940,7 @@ dummy_func(
29402940
PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
29412941
PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
29422942

2943-
assert(PyDict_CheckExact(right_o));
2943+
assert(PyAnyDict_CheckExact(right_o));
29442944
STAT_INC(CONTAINS_OP, hit);
29452945
int res = PyDict_Contains(right_o, left_o);
29462946
if (res < 0) {

Python/executor_cases.c.h

Lines changed: 10 additions & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Python/generated_cases.c.h

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Python/specialize.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2287,7 +2287,7 @@ _Py_Specialize_BinaryOp(_PyStackRef lhs_st, _PyStackRef rhs_st, _Py_CODEUNIT *in
22872287
}
22882288
}
22892289
}
2290-
if (PyDict_CheckExact(lhs)) {
2290+
if (PyAnyDict_CheckExact(lhs)) {
22912291
specialize(instr, BINARY_OP_SUBSCR_DICT);
22922292
return;
22932293
}
@@ -2767,7 +2767,7 @@ _Py_Specialize_ContainsOp(_PyStackRef value_st, _Py_CODEUNIT *instr)
27672767

27682768
assert(ENABLE_SPECIALIZATION);
27692769
assert(_PyOpcode_Caches[CONTAINS_OP] == INLINE_CACHE_ENTRIES_COMPARE_OP);
2770-
if (PyDict_CheckExact(value)) {
2770+
if (PyAnyDict_CheckExact(value)) {
27712771
specialize(instr, CONTAINS_OP_DICT);
27722772
return;
27732773
}

0 commit comments

Comments
 (0)