summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYury Selivanov <yselivanov@gmail.com>2017-03-12 21:03:46 (GMT)
committerGitHub <noreply@github.com>2017-03-12 21:03:46 (GMT)
commit216803d8e10615c769571fbfbd1f341557f25a14 (patch)
treed4f31dc6996a9110835bc6602c3c2c37d14605ce
parenta16894ebf8823f0e09036aacde9288c00e8d9058 (diff)
downloadcpython-216803d8e10615c769571fbfbd1f341557f25a14.zip
cpython-216803d8e10615c769571fbfbd1f341557f25a14.tar.gz
cpython-216803d8e10615c769571fbfbd1f341557f25a14.tar.bz2
Fix wrapping into StopIteration of return values in generators and coroutines (#644) (#648)
-rw-r--r--Lib/test/test_coroutines.py15
-rw-r--r--Misc/NEWS2
-rw-r--r--Objects/genobject.c3
3 files changed, 18 insertions, 2 deletions
diff --git a/Lib/test/test_coroutines.py b/Lib/test/test_coroutines.py
index 4a327b5..6d63cdb 100644
--- a/Lib/test/test_coroutines.py
+++ b/Lib/test/test_coroutines.py
@@ -975,6 +975,21 @@ class CoroutineTest(unittest.TestCase):
"coroutine is being awaited already"):
waiter(coro).send(None)
+ def test_await_16(self):
+ # See https://bugs.python.org/issue29600 for details.
+
+ async def f():
+ return ValueError()
+
+ async def g():
+ try:
+ raise KeyError
+ except:
+ return await f()
+
+ _, result = run_async(g())
+ self.assertIsNone(result.__context__)
+
def test_with_1(self):
class Manager:
def __init__(self, name):
diff --git a/Misc/NEWS b/Misc/NEWS
index 98b47bd..e56c091 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,8 @@ Release date: XXXX-XX-XX
Core and Builtins
-----------------
+- bpo-29600: Fix wrapping coroutine return values in StopIteration.
+
- Issue #29537: Restore runtime compatibility with bytecode files generated by
CPython 3.5.0 to 3.5.2, and adjust the eval loop to avoid the problems that
could be caused by the malformed variant of the BUILD_MAP_UNPACK_WITH_CALL
diff --git a/Objects/genobject.c b/Objects/genobject.c
index d403598..0de5408 100644
--- a/Objects/genobject.c
+++ b/Objects/genobject.c
@@ -466,8 +466,7 @@ _PyGen_SetStopIterationValue(PyObject *value)
PyObject *e;
if (value == NULL ||
- (!PyTuple_Check(value) &&
- !PyObject_TypeCheck(value, (PyTypeObject *) PyExc_StopIteration)))
+ (!PyTuple_Check(value) && !PyExceptionInstance_Check(value)))
{
/* Delay exception instantiation if we can */
PyErr_SetObject(PyExc_StopIteration, value);