]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
GH-100964: Fix reference cycle in exhausted generator frames (#141112)
authorSavannah Ostrowski <savannah@python.org>
Wed, 17 Dec 2025 19:21:45 +0000 (11:21 -0800)
committerGitHub <noreply@github.com>
Wed, 17 Dec 2025 19:21:45 +0000 (19:21 +0000)
Lib/test/test_generators.py
Misc/NEWS.d/next/Core_and_Builtins/2025-11-06-05-21-25.gh-issue-100964.TxPf1b.rst [new file with mode: 0644]
Python/ceval.c

index 358bb27b117fbf33fccffe3de2d756954ba11e56..6643c396edf2beec1c8f6eac560c286804351a23 100644 (file)
@@ -134,6 +134,18 @@ class FinalizationTest(unittest.TestCase):
         self.assertEqual(len(resurrected), 1)
         self.assertIsInstance(resurrected[0].gi_code, types.CodeType)
 
+    def test_exhausted_generator_frame_cycle(self):
+        def g():
+            yield
+
+        generator = g()
+        frame = generator.gi_frame
+        self.assertIsNone(frame.f_back)
+        next(generator)
+        self.assertIsNone(frame.f_back)
+        next(generator, None)
+        self.assertIsNone(frame.f_back)
+
 
 class GeneratorTest(unittest.TestCase):
 
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-11-06-05-21-25.gh-issue-100964.TxPf1b.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-11-06-05-21-25.gh-issue-100964.TxPf1b.rst
new file mode 100644 (file)
index 0000000..7c554cf
--- /dev/null
@@ -0,0 +1 @@
+Fix reference cycle in exhausted generator frames. Patch by Savannah Ostrowski.
index 37679d4cd183c71dd11248f7669e0ff58eb8b8a2..90ae0b022e39589faa005d873157c736aba0b8f8 100644 (file)
@@ -2309,9 +2309,9 @@ clear_gen_frame(PyThreadState *tstate, _PyInterpreterFrame * frame)
     tstate->exc_info = gen->gi_exc_state.previous_item;
     gen->gi_exc_state.previous_item = NULL;
     assert(frame->frame_obj == NULL || frame->frame_obj->f_frame == frame);
+    frame->previous = NULL;
     _PyFrame_ClearExceptCode(frame);
     _PyErr_ClearExcState(&gen->gi_exc_state);
-    frame->previous = NULL;
 }
 
 void