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 14:12:41 2014 -0400 @@ -12,6 +12,7 @@ import inspect import linecache import os +import platform import sys import traceback import weakref @@ -49,8 +50,15 @@ def __next__(self): return next(self.gen) - def send(self, value): - return self.gen.send(value) + if platform.python_implementation() == 'CPython' \ + and sys.version_info[:3] <= (3, 4, 0): + # CPython prior to 3.4.1 has a bug in 'yield from' statement + # implementation. See issue #21209 for details. + def send(self, *value): + return self.gen.send(value) + else: + def send(self, value): + return self.gen.send(value) def throw(self, exc): return self.gen.throw(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 14:12:41 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):