Skip to content

Commit 8883db0

Browse files
committed
Revert "[3.12] pythongh-118272: Clear generator frame's locals when the generator is closed (python#118451)"
This reverts commit 238efbe.
1 parent f8dd4c3 commit 8883db0

File tree

4 files changed

+5
-37
lines changed

4 files changed

+5
-37
lines changed

Include/internal/pycore_frame.h

-3
Original file line numberDiff line numberDiff line change
@@ -213,9 +213,6 @@ _PyFrame_GetFrameObject(_PyInterpreterFrame *frame)
213213
return _PyFrame_MakeAndSetFrameObject(frame);
214214
}
215215

216-
void
217-
_PyFrame_ClearLocals(_PyInterpreterFrame *frame);
218-
219216
/* Clears all references in the frame.
220217
* If take is non-zero, then the _PyInterpreterFrame frame
221218
* may be transferred to the frame object it references

Lib/test/test_generators.py

-20
Original file line numberDiff line numberDiff line change
@@ -450,26 +450,6 @@ def g():
450450
self.assertIsInstance(cm.exception.value, StopIteration)
451451
self.assertEqual(cm.exception.value.value, 2)
452452

453-
def test_close_releases_frame_locals(self):
454-
# See gh-118272
455-
456-
class Foo:
457-
pass
458-
459-
f = Foo()
460-
f_wr = weakref.ref(f)
461-
462-
def genfn():
463-
a = f
464-
yield
465-
466-
g = genfn()
467-
next(g)
468-
del f
469-
g.close()
470-
support.gc_collect()
471-
self.assertIsNone(f_wr())
472-
473453

474454
class GeneratorThrowTest(unittest.TestCase):
475455

Objects/genobject.c

-1
Original file line numberDiff line numberDiff line change
@@ -403,7 +403,6 @@ gen_close(PyGenObject *gen, PyObject *args)
403403
* StopIteration. */
404404
if (exception_handler_depth == 1) {
405405
gen->gi_frame_state = FRAME_COMPLETED;
406-
_PyFrame_ClearLocals((_PyInterpreterFrame *)gen->gi_iframe);
407406
Py_RETURN_NONE;
408407
}
409408
}

Python/frame.c

+5-13
Original file line numberDiff line numberDiff line change
@@ -115,18 +115,6 @@ take_ownership(PyFrameObject *f, _PyInterpreterFrame *frame)
115115
}
116116
}
117117

118-
void
119-
_PyFrame_ClearLocals(_PyInterpreterFrame *frame)
120-
{
121-
assert(frame->stacktop >= 0);
122-
int stacktop = frame->stacktop;
123-
frame->stacktop = 0;
124-
for (int i = 0; i < stacktop; i++) {
125-
Py_XDECREF(frame->localsplus[i]);
126-
}
127-
Py_CLEAR(frame->f_locals);
128-
}
129-
130118
void
131119
_PyFrame_ClearExceptCode(_PyInterpreterFrame *frame)
132120
{
@@ -147,8 +135,12 @@ _PyFrame_ClearExceptCode(_PyInterpreterFrame *frame)
147135
}
148136
Py_DECREF(f);
149137
}
150-
_PyFrame_ClearLocals(frame);
138+
assert(frame->stacktop >= 0);
139+
for (int i = 0; i < frame->stacktop; i++) {
140+
Py_XDECREF(frame->localsplus[i]);
141+
}
151142
Py_XDECREF(frame->frame_obj);
143+
Py_XDECREF(frame->f_locals);
152144
Py_DECREF(frame->f_funcobj);
153145
}
154146

0 commit comments

Comments
 (0)