[3.14] gh-139951: Tests on tuple tracking (GH-140575) by efimov-mikhail · Pull Request #140701 · python/cpython
Expand Up
@@ -290,12 +290,18 @@ def test_repr(self):
self.assertEqual(repr(a0), "()")
self.assertEqual(repr(a2), "(0, 1, 2)")
# Checks that t is not tracked without any GC collections. def _not_tracked_instantly(self, t): self.assertFalse(gc.is_tracked(t), t)
# Checks that t is not tracked after GC collection. def _not_tracked(self, t): # Nested tuples can take several collections to untrack gc.collect() gc.collect() self.assertFalse(gc.is_tracked(t), t)
# Checks that t continues to be tracked even after GC collection. def _tracked(self, t): self.assertTrue(gc.is_tracked(t), t) gc.collect() Expand All @@ -307,13 +313,19 @@ def test_track_literals(self): # Test GC-optimization of tuple literals x, y, z = 1.5, "a", []
self._not_tracked(()) self._not_tracked((1,)) self._not_tracked((1, 2)) self._not_tracked((1, 2, "a")) self._not_tracked((1, 2, (None, True, False, ()), int)) self._not_tracked((object(),)) # We check that those objects aren't tracked at all. # It's essential for the GC performance, see gh-139951. self._not_tracked_instantly(()) self._not_tracked_instantly((1,)) self._not_tracked_instantly((1, 2)) self._not_tracked_instantly((1, 2, "a")) self._not_tracked_instantly((1, 2) * 5) self._not_tracked_instantly((12, 10**10, 'a_' * 100)) self._not_tracked_instantly((object(),))
self._not_tracked(((1, x), y, (2, 3))) self._not_tracked((1, 2, (None, True, False, ()), int)) self._not_tracked((object(), ()))
# Tuples with mutable elements are always tracked, even if those # elements are not tracked right now. Expand Down Expand Up @@ -343,6 +355,12 @@ def check_track_dynamic(self, tp, always_track): self._tracked(tp(tuple([obj]) for obj in [x, y, z])) self._tracked(tuple(tp([obj]) for obj in [x, y, z]))
t = tp([1, x, y, z]) self.assertEqual(type(t), tp) self._tracked(t) self.assertEqual(type(t[:]), tuple) self._tracked(t[:])
@support.cpython_only def test_track_dynamic(self): # Test GC-optimization of dynamically constructed tuples. Expand Down
# Checks that t is not tracked without any GC collections. def _not_tracked_instantly(self, t): self.assertFalse(gc.is_tracked(t), t)
# Checks that t is not tracked after GC collection. def _not_tracked(self, t): # Nested tuples can take several collections to untrack gc.collect() gc.collect() self.assertFalse(gc.is_tracked(t), t)
# Checks that t continues to be tracked even after GC collection. def _tracked(self, t): self.assertTrue(gc.is_tracked(t), t) gc.collect() Expand All @@ -307,13 +313,19 @@ def test_track_literals(self): # Test GC-optimization of tuple literals x, y, z = 1.5, "a", []
self._not_tracked(()) self._not_tracked((1,)) self._not_tracked((1, 2)) self._not_tracked((1, 2, "a")) self._not_tracked((1, 2, (None, True, False, ()), int)) self._not_tracked((object(),)) # We check that those objects aren't tracked at all. # It's essential for the GC performance, see gh-139951. self._not_tracked_instantly(()) self._not_tracked_instantly((1,)) self._not_tracked_instantly((1, 2)) self._not_tracked_instantly((1, 2, "a")) self._not_tracked_instantly((1, 2) * 5) self._not_tracked_instantly((12, 10**10, 'a_' * 100)) self._not_tracked_instantly((object(),))
self._not_tracked(((1, x), y, (2, 3))) self._not_tracked((1, 2, (None, True, False, ()), int)) self._not_tracked((object(), ()))
# Tuples with mutable elements are always tracked, even if those # elements are not tracked right now. Expand Down Expand Up @@ -343,6 +355,12 @@ def check_track_dynamic(self, tp, always_track): self._tracked(tp(tuple([obj]) for obj in [x, y, z])) self._tracked(tuple(tp([obj]) for obj in [x, y, z]))
t = tp([1, x, y, z]) self.assertEqual(type(t), tp) self._tracked(t) self.assertEqual(type(t[:]), tuple) self._tracked(t[:])
@support.cpython_only def test_track_dynamic(self): # Test GC-optimization of dynamically constructed tuples. Expand Down