Skip to content

Commit 714d1ce

Browse files
authored
gc module internal structure and API (#6910)
* gc module internal structure and API Add gc_state module with GcState, GcGeneration, GcDebugFlags, GcStats. Replace gc module stubs with working API backed by gc_state. Add gc_callbacks and gc_garbage to Context. Add is_gc_tracked, gc_finalized, gc_get_referents to PyObject. Collection is stubbed (returns 0) — actual algorithm to follow. * fix dict/weakref/generators * unmark test_asyncio * apply review
1 parent 988b8b8 commit 714d1ce

File tree

15 files changed

+738
-51
lines changed

15 files changed

+738
-51
lines changed

.cspell.dict/cpython.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ repr
147147
resinfo
148148
Rshift
149149
SA_ONSTACK
150+
saveall
150151
scls
151152
setdict
152153
setfunc
@@ -178,6 +179,7 @@ Typeparam
178179
typeparams
179180
typeslots
180181
unaryop
182+
uncollectable
181183
Unhandle
182184
unparse
183185
unparser

Lib/test/_test_multiprocessing.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4057,8 +4057,6 @@ def test_heap(self):
40574057
self.assertEqual(len(heap._allocated_blocks), 0, heap._allocated_blocks)
40584058
self.assertEqual(len(heap._len_to_seq), 0)
40594059

4060-
# TODO: RUSTPYTHON - gc.enable() not implemented
4061-
@unittest.expectedFailure
40624060
def test_free_from_gc(self):
40634061
# Check that freeing of blocks by the garbage collector doesn't deadlock
40644062
# (issue #12352).

Lib/test/test_asyncio/test_futures.py

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -678,8 +678,6 @@ def __del__(self):
678678
fut = self._new_future(loop=self.loop)
679679
fut.set_result(Evil())
680680

681-
# TODO: RUSTPYTHON - gc.get_referrers not implemented
682-
@unittest.expectedFailure
683681
def test_future_cancelled_result_refcycles(self):
684682
f = self._new_future(loop=self.loop)
685683
f.cancel()
@@ -691,8 +689,6 @@ def test_future_cancelled_result_refcycles(self):
691689
self.assertIsNotNone(exc)
692690
self.assertListEqual(gc.get_referrers(exc), [])
693691

694-
# TODO: RUSTPYTHON - gc.get_referrers not implemented
695-
@unittest.expectedFailure
696692
def test_future_cancelled_exception_refcycles(self):
697693
f = self._new_future(loop=self.loop)
698694
f.cancel()
@@ -720,8 +716,6 @@ def test_future_del_segfault(self):
720716
with self.assertRaises(AttributeError):
721717
del fut._log_traceback
722718

723-
# TODO: RUSTPYTHON - gc.get_referents not implemented
724-
@unittest.expectedFailure
725719
def test_future_iter_get_referents_segfault(self):
726720
# See https://github.com/python/cpython/issues/122695
727721
import _asyncio

Lib/test/test_dict.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -369,8 +369,6 @@ def test_copy_fuzz(self):
369369
self.assertNotEqual(d, d2)
370370
self.assertEqual(len(d2), len(d) + 1)
371371

372-
# TODO: RUSTPYTHON
373-
@unittest.expectedFailure
374372
def test_copy_maintains_tracking(self):
375373
class A:
376374
pass

Lib/test/test_generators.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,6 @@ def f():
176176
g.send(0)
177177
self.assertEqual(next(g), 1)
178178

179-
@unittest.expectedFailure # TODO: RUSTPYTHON; NotImplementedError
180179
def test_handle_frame_object_in_creation(self):
181180

182181
#Attempt to expose partially constructed frames

Lib/test/test_subprocess.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2445,7 +2445,6 @@ def raise_it():
24452445
stdin=subprocess.PIPE, stdout=subprocess.PIPE,
24462446
stderr=subprocess.PIPE, preexec_fn=raise_it)
24472447

2448-
@unittest.expectedFailure # TODO: RUSTPYTHON
24492448
def test_preexec_gc_module_failure(self):
24502449
# This tests the code that disables garbage collection if the child
24512450
# process will execute any Python.

Lib/test/test_weakref.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -846,11 +846,9 @@ def cb(self, ignore):
846846
gc.collect()
847847
self.assertEqual(alist, [])
848848

849-
@unittest.expectedFailure # TODO: RUSTPYTHON
850849
def test_gc_during_ref_creation(self):
851850
self.check_gc_during_creation(weakref.ref)
852851

853-
@unittest.expectedFailure # TODO: RUSTPYTHON
854852
def test_gc_during_proxy_creation(self):
855853
self.check_gc_during_creation(weakref.proxy)
856854

@@ -1365,11 +1363,9 @@ def check_len_race(self, dict_type, cons):
13651363
self.assertGreaterEqual(n2, 0)
13661364
self.assertLessEqual(n2, n1)
13671365

1368-
@unittest.expectedFailure # TODO: RUSTPYTHON
13691366
def test_weak_keyed_len_race(self):
13701367
self.check_len_race(weakref.WeakKeyDictionary, lambda k: (k, 1))
13711368

1372-
@unittest.expectedFailure # TODO: RUSTPYTHON
13731369
def test_weak_valued_len_race(self):
13741370
self.check_len_race(weakref.WeakValueDictionary, lambda k: (1, k))
13751371

Lib/test/test_weakset.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -425,8 +425,6 @@ def test_len_cycles(self):
425425
self.assertIn(n1, (0, 1))
426426
self.assertEqual(n2, 0)
427427

428-
# TODO: RUSTPYTHON
429-
@unittest.expectedFailure
430428
def test_len_race(self):
431429
# Extended sanity checks for len() in the face of cyclic collection
432430
self.addCleanup(gc.set_threshold, *gc.get_threshold())

Lib/test/test_zoneinfo/test_zoneinfo.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1937,8 +1937,6 @@ def test_cache_location(self):
19371937
self.assertFalse(hasattr(c_zoneinfo.ZoneInfo, "_weak_cache"))
19381938
self.assertTrue(hasattr(py_zoneinfo.ZoneInfo, "_weak_cache"))
19391939

1940-
# TODO: RUSTPYTHON
1941-
@unittest.expectedFailure
19421940
def test_gc_tracked(self):
19431941
import gc
19441942

0 commit comments

Comments
 (0)