Skip to content

Commit ab3f7ba

Browse files
committed
gh-155181: Untrack frozensets created from set literals when possible
1 parent 8440a6a commit ab3f7ba

3 files changed

Lines changed: 15 additions & 0 deletions

File tree

Lib/test/test_set.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -762,6 +762,17 @@ def test_constructor_identity(self):
762762
t = self.thetype(s)
763763
self.assertEqual(id(s), id(t))
764764

765+
def test_gc_tracking(self):
766+
# gh-140232: frozensets whose elements can never be tracked by the
767+
# GC are not tracked, including the compiled frozenset({...}) form
768+
s = {1, 2}
769+
self.assertFalse(gc.is_tracked(frozenset(s)))
770+
self.assertFalse(gc.is_tracked(frozenset({1, 2})))
771+
self.assertFalse(gc.is_tracked(frozenset({x for x in range(2)})))
772+
class C:
773+
pass
774+
self.assertTrue(gc.is_tracked(frozenset({C()})))
775+
765776
def test_hash(self):
766777
self.assertEqual(hash(self.thetype('abcdeb')),
767778
hash(self.thetype('ebecda')))
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
:class:`frozenset` objects created from a set literal or a set comprehension
2+
are now untracked by the garbage collector when none of their elements can
3+
be tracked.

Objects/setobject.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1574,6 +1574,7 @@ _PySet_Freeze(PyObject *set)
15741574
assert(PySet_CheckExact(set));
15751575
assert(_PyObject_IsUniquelyReferenced(set));
15761576
set->ob_type = &PyFrozenSet_Type;
1577+
_PyFrozenSet_MaybeUntrack(set);
15771578
return Py_NewRef(set);
15781579
}
15791580

0 commit comments

Comments
 (0)