gh-131670: Fix crash in `anext()` when `__anext__` is sync and raises (GH-131682)
(cherry picked from commit
929afd1d6ee4fb89ac818037effe6577947103de)
Co-authored-by: sobolevn <mail@sobolevn.me>
Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com>
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:
--- /dev/null
+Fix :func:`anext` failing on sync :meth:`~object.__anext__` raising an exception.
}
awaitable = (*t->tp_as_async->am_anext)(aiterator);
+ if (awaitable == NULL) {
+ return NULL;
+ }
if (default_value == NULL) {
return awaitable;
}