]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-145376: Fix GC tracking in `structseq.__replace__` (#145820)
authorPieter Eendebak <pieter.eendebak@gmail.com>
Fri, 13 Mar 2026 15:42:19 +0000 (16:42 +0100)
committerGitHub <noreply@github.com>
Fri, 13 Mar 2026 15:42:19 +0000 (15:42 +0000)
Lib/test/test_structseq.py
Misc/NEWS.d/next/Core_and_Builtins/2026-03-11-21-27-28.gh-issue-145376.LfDvyw.rst [new file with mode: 0644]
Objects/structseq.c

index 9622151143cd78da2c154cfff952c4652de3edaf..74506fc54de50e722d085fa6d5f7ac70de426f19 100644 (file)
@@ -1,4 +1,5 @@
 import copy
+import gc
 import os
 import pickle
 import re
@@ -355,6 +356,14 @@ class StructSeqTest(unittest.TestCase):
             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 (file)
index 0000000..476be20
--- /dev/null
@@ -0,0 +1 @@
+Fix GC tracking in ``structseq.__replace__()``.
index b8bb041f0cff218123a33c9572c8dc23c4109022..8fa9cbba3bcce3b5b31a0da396d1f395555d7698 100644 (file)
@@ -445,6 +445,7 @@ structseq_replace(PyObject *op, PyObject *args, PyObject *kwargs)
         }
     }
 
+    _PyObject_GC_TRACK(result);
     return (PyObject *)result;
 
 error: