From cccd9dd3e476209f698344c93bdddfef3ca9af23 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 16 Mar 2026 10:08:15 +0100 Subject: [PATCH] [3.14] gh-145376: Fix GC tracking in `structseq.__replace__` (GH-145820) (#145922) gh-145376: Fix GC tracking in `structseq.__replace__` (GH-145820) (cherry picked from commit 00a25859a94b6bf34e58a5176e2befab7e273d20) Co-authored-by: Pieter Eendebak --- Lib/test/test_structseq.py | 9 +++++++++ .../2026-03-11-21-27-28.gh-issue-145376.LfDvyw.rst | 1 + Objects/structseq.c | 1 + 3 files changed, 11 insertions(+) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2026-03-11-21-27-28.gh-issue-145376.LfDvyw.rst diff --git a/Lib/test/test_structseq.py b/Lib/test/test_structseq.py index 9622151143c..74506fc54de 100644 --- a/Lib/test/test_structseq.py +++ b/Lib/test/test_structseq.py @@ -1,4 +1,5 @@ import copy +import gc import os import pickle import re @@ -355,6 +356,14 @@ def test_reference_cycle(self): type(t).refcyle = t """)) + def test_replace_gc_tracked(self): + # Verify that __replace__ results are properly GC-tracked + time_struct = time.gmtime(0) + lst = [] + replaced_struct = time_struct.__replace__(tm_year=lst) + lst.append(replaced_struct) + + self.assertTrue(gc.is_tracked(replaced_struct)) if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-03-11-21-27-28.gh-issue-145376.LfDvyw.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-03-11-21-27-28.gh-issue-145376.LfDvyw.rst new file mode 100644 index 00000000000..476be205da8 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2026-03-11-21-27-28.gh-issue-145376.LfDvyw.rst @@ -0,0 +1 @@ +Fix GC tracking in ``structseq.__replace__()``. diff --git a/Objects/structseq.c b/Objects/structseq.c index c05bcde24c4..2dc59b0ff64 100644 --- a/Objects/structseq.c +++ b/Objects/structseq.c @@ -445,6 +445,7 @@ structseq_replace(PyObject *op, PyObject *args, PyObject *kwargs) } } + _PyObject_GC_TRACK(result); return (PyObject *)result; error: