]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-45813: Drop redundant assertion from frame.clear() (GH-29990)
authorAndrew Svetlov <andrew.svetlov@gmail.com>
Wed, 8 Dec 2021 16:05:00 +0000 (18:05 +0200)
committerGitHub <noreply@github.com>
Wed, 8 Dec 2021 16:05:00 +0000 (16:05 +0000)
* bpo-45813: Drop redundant assertion from frame.clear()

* Move assertion to frame_dealloc()

Lib/test/test_coroutines.py
Objects/frameobject.c

index fc8b8bc9541eba145377f7963f8d39e6d5f48055..3081853303b37afb83e10ee8a1329d2ad39cf93e 100644 (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):
 
index 926a32a5100bdd8b47566dfdd06de82f73f006de..2197e07bc06108f46a7c16a2e5ee4187bedc0ee4 100644 (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;