Skip to content

Commit d4363d2

Browse files
authored
bpo-45813: Drop redundant assertion from frame.clear() (GH-29990)
* bpo-45813: Drop redundant assertion from frame.clear() * Move assertion to frame_dealloc()
1 parent 69806b9 commit d4363d2

File tree

2 files changed

+15
-3
lines changed

2 files changed

+15
-3
lines changed

Lib/test/test_coroutines.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2191,13 +2191,22 @@ async def run_gen():
21912191
return 'end'
21922192
self.assertEqual(run_async(run_gen()), ([], 'end'))
21932193

2194-
def test_bpo_45813(self):
2194+
def test_bpo_45813_1(self):
21952195
'This would crash the interpreter in 3.11a2'
21962196
async def f():
21972197
pass
2198-
frame = f().cr_frame
2198+
with self.assertWarns(RuntimeWarning):
2199+
frame = f().cr_frame
21992200
frame.clear()
22002201

2202+
def test_bpo_45813_2(self):
2203+
'This would crash the interpreter in 3.11a2'
2204+
async def f():
2205+
pass
2206+
gen = f()
2207+
with self.assertWarns(RuntimeWarning):
2208+
gen.cr_frame.clear()
2209+
22012210

22022211
class CoroAsyncIOCompatTest(unittest.TestCase):
22032212

Objects/frameobject.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -613,6 +613,10 @@ static PyGetSetDef frame_getsetlist[] = {
613613
static void
614614
frame_dealloc(PyFrameObject *f)
615615
{
616+
/* It is the responsibility of the owning generator/coroutine
617+
* to have cleared the generator pointer */
618+
assert(f->f_frame->generator == NULL);
619+
616620
if (_PyObject_GC_IS_TRACKED(f)) {
617621
_PyObject_GC_UNTRACK(f);
618622
}
@@ -686,7 +690,6 @@ frame_clear(PyFrameObject *f, PyObject *Py_UNUSED(ignored))
686690
}
687691
if (f->f_frame->generator) {
688692
_PyGen_Finalize(f->f_frame->generator);
689-
assert(f->f_frame->generator == NULL);
690693
}
691694
(void)frame_tp_clear(f);
692695
Py_RETURN_NONE;

0 commit comments

Comments
 (0)