diff options
author | Andrew Svetlov <andrew.svetlov@gmail.com> | 2021-12-08 16:05:00 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-12-08 16:05:00 (GMT) |
commit | d4363d214097b3fca8b7910c2e0e91c8b0873fb2 (patch) | |
tree | aff0f7c8b09418b5c4451be8a58c6073d5ac13df | |
parent | 69806b9516dbe092381f3ef884c7c64bb9b8414a (diff) | |
download | cpython-d4363d214097b3fca8b7910c2e0e91c8b0873fb2.zip cpython-d4363d214097b3fca8b7910c2e0e91c8b0873fb2.tar.gz cpython-d4363d214097b3fca8b7910c2e0e91c8b0873fb2.tar.bz2 |
bpo-45813: Drop redundant assertion from frame.clear() (GH-29990)
* bpo-45813: Drop redundant assertion from frame.clear()
* Move assertion to frame_dealloc()
-rw-r--r-- | Lib/test/test_coroutines.py | 13 | ||||
-rw-r--r-- | Objects/frameobject.c | 5 |
2 files changed, 15 insertions, 3 deletions
diff --git a/Lib/test/test_coroutines.py b/Lib/test/test_coroutines.py index fc8b8bc..3081853 100644 --- a/Lib/test/test_coroutines.py +++ b/Lib/test/test_coroutines.py @@ -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): diff --git a/Objects/frameobject.c b/Objects/frameobject.c index 926a32a..2197e07 100644 --- a/Objects/frameobject.c +++ b/Objects/frameobject.c @@ -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; |