mirror of
https://github.com/python/cpython.git
synced 2025-12-31 04:23:37 +00:00
[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 76ffaef729)
Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com>
Co-authored-by: Kumar Aditya <kumaraditya@python.org>
This commit is contained in:
parent
8448552579
commit
4facd7d119
4 changed files with 22 additions and 0 deletions
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -0,0 +1,2 @@
|
|||
Fix a :exc:`SystemError` when using :func:`anext` with a default tuple
|
||||
value. Patch by Bénédikt Tran.
|
||||
|
|
@ -618,6 +618,7 @@ gen_iternext(PyGenObject *gen)
|
|||
int
|
||||
_PyGen_SetStopIterationValue(PyObject *value)
|
||||
{
|
||||
assert(!PyErr_Occurred());
|
||||
PyObject *e;
|
||||
|
||||
if (value == NULL ||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue