https://github.com/python/cpython/commit/4facd7d119a63bcd598260e06977d6b792592b88
commit: 4facd7d119a63bcd598260e06977d6b792592b88
branch: 3.12
author: Miss Islington (bot) <[email protected]>
committer: kumaraditya303 <[email protected]>
date: 2025-01-13T18:45:20+05:30
summary:

[3.12] gh-128078: Clear exception in `anext` before calling 
`_PyGen_SetStopIterationValue` (GH-128780) (#128784)

gh-128078: Clear exception in `anext` before calling 
`_PyGen_SetStopIterationValue` (GH-128780)
(cherry picked from commit 76ffaef729c91bb79da6df2ade48f3ec51118300)

Co-authored-by: Bénédikt Tran <[email protected]>
Co-authored-by: Kumar Aditya <[email protected]>

files:
A 
Misc/NEWS.d/next/Core_and_Builtins/2025-01-13-12-48-30.gh-issue-128078.qOsl9B.rst
M Lib/test/test_asyncgen.py
M Objects/genobject.c
M Objects/iterobject.c

diff --git a/Lib/test/test_asyncgen.py b/Lib/test/test_asyncgen.py
index 9e199806da6b15..7c868f367b3e8c 100644
--- a/Lib/test/test_asyncgen.py
+++ b/Lib/test/test_asyncgen.py
@@ -1100,6 +1100,23 @@ async def run():
 
         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:
diff --git 
a/Misc/NEWS.d/next/Core_and_Builtins/2025-01-13-12-48-30.gh-issue-128078.qOsl9B.rst
 
b/Misc/NEWS.d/next/Core_and_Builtins/2025-01-13-12-48-30.gh-issue-128078.qOsl9B.rst
new file mode 100644
index 00000000000000..498864a0aa3145
--- /dev/null
+++ 
b/Misc/NEWS.d/next/Core_and_Builtins/2025-01-13-12-48-30.gh-issue-128078.qOsl9B.rst
@@ -0,0 +1,2 @@
+Fix a :exc:`SystemError` when using :func:`anext` with a default tuple
+value. Patch by Bénédikt Tran.
diff --git a/Objects/genobject.c b/Objects/genobject.c
index 474abe1094be72..d56a9ad5d73ef5 100644
--- a/Objects/genobject.c
+++ b/Objects/genobject.c
@@ -618,6 +618,7 @@ gen_iternext(PyGenObject *gen)
 int
 _PyGen_SetStopIterationValue(PyObject *value)
 {
+    assert(!PyErr_Occurred());
     PyObject *e;
 
     if (value == NULL ||
diff --git a/Objects/iterobject.c b/Objects/iterobject.c
index 7cb17a6ca4ab56..66e4490766abbd 100644
--- a/Objects/iterobject.c
+++ b/Objects/iterobject.c
@@ -382,6 +382,7 @@ anextawaitable_iternext(anextawaitableobject *obj)
         return result;
     }
     if (PyErr_ExceptionMatches(PyExc_StopAsyncIteration)) {
+        PyErr_Clear();
         _PyGen_SetStopIterationValue(obj->default_value);
     }
     return NULL;
@@ -405,6 +406,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;

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]

Reply via email to