summaryrefslogtreecommitdiff
path: root/Objects/genobject.c
diff options
context:
space:
mode:
authorYury Selivanov <yury@magic.io>2016-11-16 18:16:17 -0500
committerYury Selivanov <yury@magic.io>2016-11-16 18:16:17 -0500
commit41782e497092a27efbae20208ce7d48c657e74cb (patch)
tree7d3bc6cb6c1e1fc083e024204bc7ab2112bf8e8c /Objects/genobject.c
parenta83a6a3275f7dc748db3a237bbf4b05fcf76a85f (diff)
downloadcpython-git-41782e497092a27efbae20208ce7d48c657e74cb.tar.gz
Issue #28721: Fix asynchronous generators aclose() and athrow()
Diffstat (limited to 'Objects/genobject.c')
-rw-r--r--Objects/genobject.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/Objects/genobject.c b/Objects/genobject.c
index ddf72ccf69..558f809b02 100644
--- a/Objects/genobject.c
+++ b/Objects/genobject.c
@@ -1931,9 +1931,17 @@ yield_close:
return NULL;
check_error:
- if (PyErr_ExceptionMatches(PyExc_StopAsyncIteration)
- || PyErr_ExceptionMatches(PyExc_GeneratorExit)
- ) {
+ if (PyErr_ExceptionMatches(PyExc_StopAsyncIteration)) {
+ o->agt_state = AWAITABLE_STATE_CLOSED;
+ if (o->agt_args == NULL) {
+ /* when aclose() is called we don't want to propagate
+ StopAsyncIteration; just raise StopIteration, signalling
+ that 'aclose()' is done. */
+ PyErr_Clear();
+ PyErr_SetNone(PyExc_StopIteration);
+ }
+ }
+ else if (PyErr_ExceptionMatches(PyExc_GeneratorExit)) {
o->agt_state = AWAITABLE_STATE_CLOSED;
PyErr_Clear(); /* ignore these errors */
PyErr_SetNone(PyExc_StopIteration);