gh-128078: Clear exception in anext before calling _PyGen_SetStopIterationValue (#128780)

Co-authored-by: Kumar Aditya <kumaraditya@python.org>
This commit is contained in:
Bénédikt Tran 2025-01-13 13:55:09 +01:00 committed by GitHub
parent 517dc65ffc
commit 76ffaef729
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 22 additions and 0 deletions

View file

@ -1152,6 +1152,23 @@ class AsyncGenAsyncioTest(unittest.TestCase):
self.loop.run_until_complete(run())
def test_async_gen_asyncio_anext_tuple_no_exceptions(self):
# StopAsyncIteration exceptions should be cleared.
# See: https://github.com/python/cpython/issues/128078.
async def foo():
if False:
yield (1, 2)
async def run():
it = foo().__aiter__()
with self.assertRaises(StopAsyncIteration):
await it.__anext__()
res = await anext(it, ('a', 'b'))
self.assertEqual(res, ('a', 'b'))
self.loop.run_until_complete(run())
def test_async_gen_asyncio_anext_stopiteration(self):
async def foo():
try:

View file

@ -0,0 +1,2 @@
Fix a :exc:`SystemError` when using :func:`anext` with a default tuple
value. Patch by Bénédikt Tran.

View file

@ -633,6 +633,7 @@ gen_iternext(PyObject *self)
int
_PyGen_SetStopIterationValue(PyObject *value)
{
assert(!PyErr_Occurred());
PyObject *e;
if (value == NULL ||

View file

@ -384,6 +384,7 @@ anextawaitable_iternext(anextawaitableobject *obj)
return result;
}
if (PyErr_ExceptionMatches(PyExc_StopAsyncIteration)) {
PyErr_Clear();
_PyGen_SetStopIterationValue(obj->default_value);
}
return NULL;
@ -407,6 +408,7 @@ anextawaitable_proxy(anextawaitableobject *obj, char *meth, PyObject *arg) {
* exception we replace it with a `StopIteration(default)`, as if
* it was the return value of `__anext__()` coroutine.
*/
PyErr_Clear();
_PyGen_SetStopIterationValue(obj->default_value);
}
return NULL;