]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.13] gh-145376: Fix GC tracking in `structseq.__replace__` (GH-145820) (#145924)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Mon, 16 Mar 2026 09:08:24 +0000 (10:08 +0100)
committerGitHub <noreply@github.com>
Mon, 16 Mar 2026 09:08:24 +0000 (14:38 +0530)
gh-145376: Fix GC tracking in `structseq.__replace__` (GH-145820)
(cherry picked from commit 00a25859a94b6bf34e58a5176e2befab7e273d20)

Co-authored-by: Pieter Eendebak <pieter.eendebak@gmail.com>
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 d0bc0bd7b61520077f68b790c9f0de09c85483c1..1f259ab4572de5522a68c096c4ec1fff34edadd8 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 ee3dbf9d4c047ae5ee7f2ddfe6439f9f32d37cf9..efcadf50078ada7eec078a495949817633c3cebf 100644 (file)
@@ -455,6 +455,7 @@ structseq_replace(PyStructSequence *self, PyObject *args, PyObject *kwargs)
         }
     }
 
+    _PyObject_GC_TRACK(result);
     return (PyObject *)result;
 
 error: