diff options
author | Yury Selivanov <yselivanov@sprymix.com> | 2014-04-15 16:01:16 (GMT) |
---|---|---|
committer | Yury Selivanov <yselivanov@sprymix.com> | 2014-04-15 16:01:16 (GMT) |
commit | 09cc169a03f865d7ff68e49be01ea9d3588c96de (patch) | |
tree | ff148433e460c3de22ad863ae54afd434fab1cfe /Lib | |
parent | 809f90f36905e7623eb98bf216c078a90a4090bd (diff) | |
download | cpython-09cc169a03f865d7ff68e49be01ea9d3588c96de.zip cpython-09cc169a03f865d7ff68e49be01ea9d3588c96de.tar.gz cpython-09cc169a03f865d7ff68e49be01ea9d3588c96de.tar.bz2 |
asyncio.tasks: Make sure CoroWrapper.send proxies one argument correctly
Issue #21209.
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/asyncio/tasks.py | 2 | ||||
-rw-r--r-- | Lib/test/test_asyncio/test_tasks.py | 18 |
2 files changed, 20 insertions, 0 deletions
diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py index 0366da3..0785e10 100644 --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -53,6 +53,8 @@ class CoroWrapper: # We use `*value` because of a bug in CPythons prior # to 3.4.1. See issue #21209 and test_yield_from_corowrapper # for details. This workaround should be removed in 3.5.0. + if len(value) == 1: + value = value[0] return self.gen.send(value) def throw(self, exc): diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py index 45de8ac..2b90a10 100644 --- a/Lib/test/test_asyncio/test_tasks.py +++ b/Lib/test/test_asyncio/test_tasks.py @@ -1410,6 +1410,24 @@ class TaskTests(unittest.TestCase): finally: asyncio.tasks._DEBUG = old_debug + def test_yield_from_corowrapper_send(self): + def foo(): + a = yield + return a + + def call(arg): + cw = asyncio.tasks.CoroWrapper(foo(), foo) + cw.send(None) + try: + cw.send(arg) + except StopIteration as ex: + return ex.args[0] + else: + raise AssertionError('StopIteration was expected') + + self.assertEqual(call((1, 2)), (1, 2)) + self.assertEqual(call('spam'), 'spam') + class GatherTestsBase: |