[3.12] gh-131670: Fix crash in anext() when __anext__ is sync and raises (GH-131682) (#131687)

gh-131670: Fix crash in `anext()` when `__anext__` is sync and raises (GH-131682)
(cherry picked from commit 929afd1d6e)

Co-authored-by: sobolevn <mail@sobolevn.me>
Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com>
This commit is contained in:
Miss Islington (bot) 2025-03-24 20:18:29 +01:00 committed by GitHub
parent 8159805b87
commit 76e911a040
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 24 additions and 0 deletions

View file

@ -1117,6 +1117,26 @@ class AsyncGenAsyncioTest(unittest.TestCase):
self.loop.run_until_complete(run())
def test_sync_anext_raises_exception(self):
# See: https://github.com/python/cpython/issues/131670
msg = 'custom'
for exc_type in [
StopAsyncIteration,
StopIteration,
ValueError,
Exception,
]:
exc = exc_type(msg)
with self.subTest(exc=exc):
class A:
def __anext__(self):
raise exc
with self.assertRaisesRegex(exc_type, msg):
anext(A())
with self.assertRaisesRegex(exc_type, msg):
anext(A(), 1)
def test_async_gen_asyncio_anext_stopiteration(self):
async def foo():
try:

View file

@ -0,0 +1 @@
Fix :func:`anext` failing on sync :meth:`~object.__anext__` raising an exception.

View file

@ -1685,6 +1685,9 @@ builtin_anext_impl(PyObject *module, PyObject *aiterator,
}
awaitable = (*t->tp_as_async->am_anext)(aiterator);
if (awaitable == NULL) {
return NULL;
}
if (default_value == NULL) {
return awaitable;
}