diff -r 8e6771c3b020 asyncio/tasks.py --- a/asyncio/tasks.py Sat Apr 05 23:21:07 2014 +0200 +++ b/asyncio/tasks.py Mon Apr 14 17:39:26 2014 -0400 @@ -49,7 +49,10 @@ def __next__(self): return next(self.gen) - def send(self, value): + def send(self, *value): + # 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. return self.gen.send(value) def throw(self, exc): diff -r 8e6771c3b020 tests/test_tasks.py --- a/tests/test_tasks.py Sat Apr 05 23:21:07 2014 +0200 +++ b/tests/test_tasks.py Mon Apr 14 17:39:26 2014 -0400 @@ -1386,6 +1386,31 @@ self.assertRaises(ValueError, self.loop.run_until_complete, asyncio.wait([], loop=self.loop)) + def test_yield_from_corowrapper(self): + old_debug = asyncio.tasks._DEBUG + asyncio.tasks._DEBUG = True + try: + @asyncio.coroutine + def t1(): + return (yield from t2()) + + @asyncio.coroutine + def t2(): + f = asyncio.Future(loop=self.loop) + asyncio.Task(t3(f), loop=self.loop) + return (yield from f) + + @asyncio.coroutine + def t3(f): + f.set_result((1, 2, 3)) + + task = asyncio.Task(t1(), loop=self.loop) + val = self.loop.run_until_complete(task) + self.assertEqual(val, (1, 2, 3)) + finally: + asyncio.tasks._DEBUG = old_debug + + class GatherTestsBase: def setUp(self):