Skip to content

Commit 8f7c4f1

Browse files
[3.13] GH-100964: Fix reference cycle in exhausted generator frames (G… (#142904)
* [3.13] GH-100964: Fix reference cycle in exhausted generator frames (GH-141112) (cherry picked from commit 92243dc) Co-authored-by: Savannah Ostrowski <[email protected]>
1 parent db552dd commit 8f7c4f1

File tree

3 files changed

+14
-1
lines changed

3 files changed

+14
-1
lines changed

Lib/test/test_generators.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,18 @@ def g3(): return (yield from f())
112112
gen.send(2)
113113
self.assertEqual(cm.exception.value, 2)
114114

115+
def test_exhausted_generator_frame_cycle(self):
116+
def g():
117+
yield
118+
119+
generator = g()
120+
frame = generator.gi_frame
121+
self.assertIsNone(frame.f_back)
122+
next(generator)
123+
self.assertIsNone(frame.f_back)
124+
next(generator, None)
125+
self.assertIsNone(frame.f_back)
126+
115127

116128
class GeneratorTest(unittest.TestCase):
117129

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix reference cycle in exhausted generator frames. Patch by Savannah Ostrowski.

Python/ceval.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1696,10 +1696,10 @@ clear_gen_frame(PyThreadState *tstate, _PyInterpreterFrame * frame)
16961696
gen->gi_exc_state.previous_item = NULL;
16971697
tstate->c_recursion_remaining--;
16981698
assert(frame->frame_obj == NULL || frame->frame_obj->f_frame == frame);
1699+
frame->previous = NULL;
16991700
_PyFrame_ClearExceptCode(frame);
17001701
_PyErr_ClearExcState(&gen->gi_exc_state);
17011702
tstate->c_recursion_remaining++;
1702-
frame->previous = NULL;
17031703
}
17041704

17051705
void

0 commit comments

Comments
 (0)