bpo-45813: Drop redundant assertion from frame.clear() (GH-29990)

* bpo-45813: Drop redundant assertion from frame.clear()

* Move assertion to frame_dealloc()
This commit is contained in:
Andrew Svetlov 2021-12-08 18:05:00 +02:00 committed by GitHub
parent 69806b9516
commit d4363d2140
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 15 additions and 3 deletions

View File

@ -2191,13 +2191,22 @@ class CoroutineTest(unittest.TestCase):
return 'end'
self.assertEqual(run_async(run_gen()), ([], 'end'))
def test_bpo_45813(self):
def test_bpo_45813_1(self):
'This would crash the interpreter in 3.11a2'
async def f():
pass
frame = f().cr_frame
with self.assertWarns(RuntimeWarning):
frame = f().cr_frame
frame.clear()
def test_bpo_45813_2(self):
'This would crash the interpreter in 3.11a2'
async def f():
pass
gen = f()
with self.assertWarns(RuntimeWarning):
gen.cr_frame.clear()
class CoroAsyncIOCompatTest(unittest.TestCase):

View File

@ -613,6 +613,10 @@ static PyGetSetDef frame_getsetlist[] = {
static void
frame_dealloc(PyFrameObject *f)
{
/* It is the responsibility of the owning generator/coroutine
* to have cleared the generator pointer */
assert(f->f_frame->generator == NULL);
if (_PyObject_GC_IS_TRACKED(f)) {
_PyObject_GC_UNTRACK(f);
}
@ -686,7 +690,6 @@ frame_clear(PyFrameObject *f, PyObject *Py_UNUSED(ignored))
}
if (f->f_frame->generator) {
_PyGen_Finalize(f->f_frame->generator);
assert(f->f_frame->generator == NULL);
}
(void)frame_tp_clear(f);
Py_RETURN_NONE;