mirror of
https://github.com/python/cpython.git
synced 2025-08-24 10:45:53 +00:00
Issue #23996: Added _PyGen_SetStopIterationValue for safe raising
StopIteration with value. More safely handle non-normalized exceptions in -_PyGen_FetchStopIterationValue.
This commit is contained in:
commit
60e49aa756
7 changed files with 281 additions and 68 deletions
|
@ -450,6 +450,48 @@ class AsyncGenAsyncioTest(unittest.TestCase):
|
|||
|
||||
self.loop.run_until_complete(run())
|
||||
|
||||
def test_async_gen_asyncio_anext_tuple(self):
|
||||
async def foo():
|
||||
try:
|
||||
yield (1,)
|
||||
except ZeroDivisionError:
|
||||
yield (2,)
|
||||
|
||||
async def run():
|
||||
it = foo().__aiter__()
|
||||
|
||||
self.assertEqual(await it.__anext__(), (1,))
|
||||
with self.assertRaises(StopIteration) as cm:
|
||||
it.__anext__().throw(ZeroDivisionError)
|
||||
self.assertEqual(cm.exception.args[0], (2,))
|
||||
with self.assertRaises(StopAsyncIteration):
|
||||
await it.__anext__()
|
||||
|
||||
self.loop.run_until_complete(run())
|
||||
|
||||
def test_async_gen_asyncio_anext_stopiteration(self):
|
||||
async def foo():
|
||||
try:
|
||||
yield StopIteration(1)
|
||||
except ZeroDivisionError:
|
||||
yield StopIteration(3)
|
||||
|
||||
async def run():
|
||||
it = foo().__aiter__()
|
||||
|
||||
v = await it.__anext__()
|
||||
self.assertIsInstance(v, StopIteration)
|
||||
self.assertEqual(v.value, 1)
|
||||
with self.assertRaises(StopIteration) as cm:
|
||||
it.__anext__().throw(ZeroDivisionError)
|
||||
v = cm.exception.args[0]
|
||||
self.assertIsInstance(v, StopIteration)
|
||||
self.assertEqual(v.value, 3)
|
||||
with self.assertRaises(StopAsyncIteration):
|
||||
await it.__anext__()
|
||||
|
||||
self.loop.run_until_complete(run())
|
||||
|
||||
def test_async_gen_asyncio_aclose_06(self):
|
||||
async def foo():
|
||||
try:
|
||||
|
@ -759,6 +801,43 @@ class AsyncGenAsyncioTest(unittest.TestCase):
|
|||
self.loop.run_until_complete(run())
|
||||
self.assertEqual(DONE, 1)
|
||||
|
||||
def test_async_gen_asyncio_athrow_tuple(self):
|
||||
async def gen():
|
||||
try:
|
||||
yield 1
|
||||
except ZeroDivisionError:
|
||||
yield (2,)
|
||||
|
||||
async def run():
|
||||
g = gen()
|
||||
v = await g.asend(None)
|
||||
self.assertEqual(v, 1)
|
||||
v = await g.athrow(ZeroDivisionError)
|
||||
self.assertEqual(v, (2,))
|
||||
with self.assertRaises(StopAsyncIteration):
|
||||
await g.asend(None)
|
||||
|
||||
self.loop.run_until_complete(run())
|
||||
|
||||
def test_async_gen_asyncio_athrow_stopiteration(self):
|
||||
async def gen():
|
||||
try:
|
||||
yield 1
|
||||
except ZeroDivisionError:
|
||||
yield StopIteration(2)
|
||||
|
||||
async def run():
|
||||
g = gen()
|
||||
v = await g.asend(None)
|
||||
self.assertEqual(v, 1)
|
||||
v = await g.athrow(ZeroDivisionError)
|
||||
self.assertIsInstance(v, StopIteration)
|
||||
self.assertEqual(v.value, 2)
|
||||
with self.assertRaises(StopAsyncIteration):
|
||||
await g.asend(None)
|
||||
|
||||
self.loop.run_until_complete(run())
|
||||
|
||||
def test_async_gen_asyncio_shutdown_01(self):
|
||||
finalized = 0
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue