◐ Shell
clean mode source ↗

Add GC infrastructure: object tracking, tp_clear, and helper methods by youknowone · Pull Request #6994 · RustPython/RustPython

coderabbitai[bot]

Object tracking (CPython _PyObject_GC_TRACK/UNTRACK equivalent):
- PyRef::new_ref() now calls gc_state().track_object() for traceable objects
- track_object() sets GcBits::TRACKED flag via set_gc_tracked()
- Static types call clear_gc_tracked() since they are immortal
- is_gc_tracked() now checks the TRACKED bit flag

tp_clear infrastructure for breaking reference cycles:
- Add clear_for_gc_collect_callbacks() to WeakRefList (CPython: handle_weakrefs)
- Add try_call_finalizer() for GC to call __del__ (CPython: PyObject_CallFinalizerFromDealloc)
- Add gc_clear_raw()/gc_clear() for tp_clear (CPython: subtype_clear)
- Add gc_get_referent_ptrs() for raw pointer traversal
- Add gc_has_clear() to check clear capability

GC state improvements:
- maybe_collect() now checks gen0 threshold (CPython: _PyObject_GC_Alloc)
- collect()/collect_force() reset gen0 count

WeakRefList::clear() cleanup:
- Drop lock before invoking callbacks to avoid deadlock

coderabbitai[bot]

This was referenced

Mar 3, 2026