]> granicus.if.org Git - python/commitdiff
asyncio.tasks: Make sure CoroWrapper.send proxies one argument correctly
authorYury Selivanov <yselivanov@sprymix.com>
Tue, 15 Apr 2014 16:01:16 +0000 (12:01 -0400)
committerYury Selivanov <yselivanov@sprymix.com>
Tue, 15 Apr 2014 16:01:16 +0000 (12:01 -0400)
Issue #21209.

Lib/asyncio/tasks.py
Lib/test/test_asyncio/test_tasks.py

index 0366da35fee140314ff1ec757d4fd7beac1d43b6..0785e1071839f9a6fd7b5528541a76909622401f 100644 (file)
@@ -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):
index 45de8acc1a3bd90816fb3112ae30fd8584ae2092..2b90a108f7252fc6566e01256555220dc77c7064 100644 (file)
@@ -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: