return 'end'
self.assertEqual(run_async(run_gen()), ([], 'end'))
+ def test_bpo_45813(self):
+ 'This would crash the interpreter in 3.11a2'
+ async def f():
+ pass
+ frame = f().cr_frame
+ frame.clear()
+
class CoroAsyncIOCompatTest(unittest.TestCase):
--- /dev/null
+Fix crash when calling coro.cr_frame.clear() after coroutine has been freed.
InterpreterFrame *frame = gen->gi_xframe;
if (frame != NULL) {
gen->gi_xframe = NULL;
+ frame->generator = NULL;
frame->previous = NULL;
_PyFrame_Clear(frame, 1);
}
int
_PyFrame_Clear(InterpreterFrame * frame, int take)
{
+ /* It is the responsibility of the owning generator/coroutine
+ * to have cleared the generator pointer */
+ assert(frame->generator == NULL);
if (frame->frame_obj) {
PyFrameObject *f = frame->frame_obj;
frame->frame_obj = NULL;