mirror of
https://github.com/python/cpython.git
synced 2025-08-09 19:38:42 +00:00
[3.12] GH-117894: prevent aclose()/athrow() being re-used after StopIteration (GH-117851) (GH-118226)
(cherry picked from commit 7d369d471c
)
This commit is contained in:
parent
33d1cfffe1
commit
fc1732ce3f
3 changed files with 70 additions and 2 deletions
|
@ -395,7 +395,11 @@ class AsyncGenTest(unittest.TestCase):
|
|||
yield 123
|
||||
|
||||
with self.assertWarns(DeprecationWarning):
|
||||
gen().athrow(GeneratorExit, GeneratorExit(), None)
|
||||
x = gen().athrow(GeneratorExit, GeneratorExit(), None)
|
||||
with self.assertRaises(GeneratorExit):
|
||||
x.send(None)
|
||||
del x
|
||||
gc_collect()
|
||||
|
||||
def test_async_gen_api_01(self):
|
||||
async def gen():
|
||||
|
@ -1653,6 +1657,62 @@ class AsyncGenAsyncioTest(unittest.TestCase):
|
|||
|
||||
self.loop.run_until_complete(run())
|
||||
|
||||
def test_async_gen_throw_same_aclose_coro_twice(self):
|
||||
async def async_iterate():
|
||||
yield 1
|
||||
yield 2
|
||||
|
||||
it = async_iterate()
|
||||
nxt = it.aclose()
|
||||
with self.assertRaises(StopIteration):
|
||||
nxt.throw(GeneratorExit)
|
||||
|
||||
with self.assertRaisesRegex(
|
||||
RuntimeError,
|
||||
r"cannot reuse already awaited aclose\(\)/athrow\(\)"
|
||||
):
|
||||
nxt.throw(GeneratorExit)
|
||||
|
||||
def test_async_gen_throw_custom_same_aclose_coro_twice(self):
|
||||
async def async_iterate():
|
||||
yield 1
|
||||
yield 2
|
||||
|
||||
it = async_iterate()
|
||||
|
||||
class MyException(Exception):
|
||||
pass
|
||||
|
||||
nxt = it.aclose()
|
||||
with self.assertRaises(MyException):
|
||||
nxt.throw(MyException)
|
||||
|
||||
with self.assertRaisesRegex(
|
||||
RuntimeError,
|
||||
r"cannot reuse already awaited aclose\(\)/athrow\(\)"
|
||||
):
|
||||
nxt.throw(MyException)
|
||||
|
||||
def test_async_gen_throw_custom_same_athrow_coro_twice(self):
|
||||
async def async_iterate():
|
||||
yield 1
|
||||
yield 2
|
||||
|
||||
it = async_iterate()
|
||||
|
||||
class MyException(Exception):
|
||||
pass
|
||||
|
||||
nxt = it.athrow(MyException)
|
||||
with self.assertRaises(MyException):
|
||||
nxt.throw(MyException)
|
||||
|
||||
with self.assertRaisesRegex(
|
||||
RuntimeError,
|
||||
r"cannot reuse already awaited aclose\(\)/athrow\(\)"
|
||||
):
|
||||
nxt.throw(MyException)
|
||||
|
||||
def test_async_gen_aclose_twice_with_different_coros(self):
|
||||
# Regression test for https://bugs.python.org/issue39606
|
||||
async def async_iterate():
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue