From 1c2b4dfe6708814bc3dca9652ccd33106ded95aa Mon Sep 17 00:00:00 2001 From: adhinaik13 <22je1052@iitism.ac.in> Date: Mon, 26 Oct 2026 19:20:05 +0530 Subject: [PATCH 1/3] gh-160682: Track running function objects in free-threaded GC --- Lib/test/test_free_threading/test_gc.py | 13 +++++++++++++ Python/gc_free_threading.c | 5 +++++ 2 files changed, 18 insertions(+) diff --git a/Lib/test/test_free_threading/test_gc.py b/Lib/test/test_free_threading/test_gc.py index 30282a111345f8..b287b51826999c 100644 --- a/Lib/test/test_free_threading/test_gc.py +++ b/Lib/test/test_free_threading/test_gc.py @@ -97,6 +97,19 @@ def evil(): thread.start() thread.join() + def test_running_method_not_collected(self): + class C: + def m(self): + wr = weakref.ref(C.__dict__["m"]) + del C.m + gc.collect() + return wr() is not None + + def run(self): + return self.m() + + self.assertTrue(C().run()) + def test_merge_brc_queue_of_detached_thread(self): # GH-157838: objects queued for merging by a thread that is detached # (blocked in a lock acquire, sleep, etc.) are merged and freed on its diff --git a/Python/gc_free_threading.c b/Python/gc_free_threading.c index 6db010468456ea..6eaeeea8848cdb 100644 --- a/Python/gc_free_threading.c +++ b/Python/gc_free_threading.c @@ -470,6 +470,7 @@ gc_visit_thread_stacks(PyInterpreterState *interp, struct collection_state *stat continue; } + gc_visit_stackref(f->f_funcobj); gc_visit_stackref(f->f_executable); while (top != f->localsplus) { --top; @@ -866,6 +867,10 @@ gc_visit_thread_stacks_mark_alive(PyInterpreterState *interp, gc_mark_args_t *ar } _PyStackRef *top = f->stackpointer; + if (gc_visit_stackref_mark_alive(args, f->f_funcobj) < 0) { + err = -1; + goto exit; + } if (gc_visit_stackref_mark_alive(args, f->f_executable) < 0) { err = -1; goto exit; From 1a7224175da2656aa7c3f6f966a33824d2eecef8 Mon Sep 17 00:00:00 2001 From: adhinaik13 <22je1052@iitism.ac.in> Date: Mon, 26 Oct 2026 19:31:04 +0530 Subject: [PATCH 2/3] gh-160682: Add NEWS entry --- .../Core_and_Builtins/2026-10-26-12-00-00.gh-issue-160682.rst | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2026-10-26-12-00-00.gh-issue-160682.rst diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-10-26-12-00-00.gh-issue-160682.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-10-26-12-00-00.gh-issue-160682.rst new file mode 100644 index 00000000000000..5c783665e78965 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2026-10-26-12-00-00.gh-issue-160682.rst @@ -0,0 +1,2 @@ +Fix a bug in the :term:`free-threaded build` where garbage collection could +prematurely collect the function object of a running method. From 79b03ded82b96d0a2c11901d2fc82b03ac07179e Mon Sep 17 00:00:00 2001 From: adhinaik13 <22je1052@iitism.ac.in> Date: Mon, 26 Oct 2026 19:34:36 +0530 Subject: [PATCH 3/3] gh-160682: Fix NEWS entry filename --- ...-160682.rst => 2026-10-26-12-00-00.gh-issue-160682.Q7mK2x.rst} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Misc/NEWS.d/next/Core_and_Builtins/{2026-10-26-12-00-00.gh-issue-160682.rst => 2026-10-26-12-00-00.gh-issue-160682.Q7mK2x.rst} (100%) diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-10-26-12-00-00.gh-issue-160682.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-10-26-12-00-00.gh-issue-160682.Q7mK2x.rst similarity index 100% rename from Misc/NEWS.d/next/Core_and_Builtins/2026-10-26-12-00-00.gh-issue-160682.rst rename to Misc/NEWS.d/next/Core_and_Builtins/2026-10-26-12-00-00.gh-issue-160682.Q7mK2x.rst