Skip to content

Commit 324d624

Browse files
committed
items values as well
1 parent a9007d7 commit 324d624

2 files changed

Lines changed: 50 additions & 0 deletions

File tree

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import gc
2+
import sys
3+
import sysconfig
4+
5+
from multidict import MultiDict
6+
7+
# sys.getrefcount is not meaningful under the free-threaded build:
8+
# refcounts are biased per-thread and types may be immortalized, so
9+
# the simple baseline/after comparison below does not apply.
10+
FREETHREADED = bool(sysconfig.get_config_var("Py_GIL_DISABLED"))
11+
12+
13+
if __name__ == "__main__":
14+
if FREETHREADED:
15+
raise SystemExit(0)
16+
17+
md = MultiDict([("a", "1"), ("b", "2")])
18+
19+
# items() / values() iterators each have their own PyType_Spec
20+
# sharing multidict_iter_dealloc; test them independently so a
21+
# regression in just one spec's slot table is still caught.
22+
for view_name in ("items", "values"):
23+
get_view = getattr(md, view_name)
24+
iter_type = type(iter(get_view()))
25+
gc.collect()
26+
baseline = sys.getrefcount(iter_type)
27+
for _ in range(1000):
28+
_it = iter(get_view())
29+
list(_it)
30+
del _it
31+
gc.collect()
32+
after = sys.getrefcount(iter_type)
33+
assert after == baseline, (
34+
f"{view_name} iterator type leaked: {after - baseline}"
35+
)
36+
37+
# items() / values() views each have their own PyType_Spec
38+
# sharing multidict_view_dealloc; same rationale as above.
39+
for view_name in ("items", "values"):
40+
get_view = getattr(md, view_name)
41+
view_type = type(get_view())
42+
gc.collect()
43+
baseline = sys.getrefcount(view_type)
44+
for _ in range(1000):
45+
_v = get_view()
46+
del _v
47+
gc.collect()
48+
after = sys.getrefcount(view_type)
49+
assert after == baseline, f"{view_name} view type leaked: {after - baseline}"

tests/test_leaks.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
"multidict_extend_tuple.py",
1717
"multidict_update_multidict.py",
1818
"multidict_type_leak.py",
19+
"multidict_type_leak_items_values.py",
1920
"multidict_pop.py",
2021
),
2122
)

0 commit comments

Comments
 (0)