[pypy-commit] pypy py3.6: (vxgmichel, rmariano, arigo)

arigo pypy.commits at gmail.com
Sun Jul 16 06:13:07 EDT 2017


Author: Armin Rigo <arigo at tunes.org>
Branch: py3.6
Changeset: r91885:8a655968dc6f
Date: 2017-07-16 12:12 +0200
http://bitbucket.org/pypy/pypy/changeset/8a655968dc6f/

Log:	(vxgmichel, rmariano, arigo)

	Start on async generators that contain "await"

diff --git a/pypy/interpreter/generator.py b/pypy/interpreter/generator.py
--- a/pypy/interpreter/generator.py
+++ b/pypy/interpreter/generator.py
@@ -186,6 +186,8 @@
         try:
             if isinstance(w_yf, GeneratorOrCoroutine):
                 w_retval = w_yf.send_ex(w_inputvalue_or_err)
+            elif isinstance(w_yf, AsyncGenASend):
+                w_retval = w_yf.send_ex(w_inputvalue_or_err)
             elif space.is_w(w_inputvalue_or_err, space.w_None):
                 w_retval = space.next(w_yf)
             else:
@@ -617,7 +619,20 @@
 
     def descr__next__(self):
         space = self.async_gen.space
-        w_value = self.async_gen.send_ex(space.w_None)
+        return self.send_ex(space.w_None)
+
+    def descr_send(self, w_arg):
+        XXX
+
+    def descr_throw(self, w_type, w_val=None, w_tb=None):
+        XXX
+
+    def descr_close(self):
+        XXX
+
+    def send_ex(self, w_arg_or_err):
+        space = self.async_gen.space
+        w_value = self.async_gen.send_ex(w_arg_or_err)
         if isinstance(w_value, AsyncGenValueWrapper):
             raise OperationError(space.w_StopIteration, w_value.w_value)
         else:
diff --git a/pypy/interpreter/test/test_coroutine.py b/pypy/interpreter/test/test_coroutine.py
--- a/pypy/interpreter/test/test_coroutine.py
+++ b/pypy/interpreter/test/test_coroutine.py
@@ -244,3 +244,35 @@
             pass
         assert result == [5]
         """
+
+    def test_async_yield_with_await(self): """
+        class Done(Exception): pass
+
+        class X:
+            def __await__(self):
+                i1 = yield 40
+                assert i1 == 82
+                i2 = yield 41
+                assert i2 == 93
+
+        async def mygen():
+            yield 5
+            await X()
+            yield 6
+
+        result = []
+        async def foo():
+            async for i in mygen():
+                result.append(i)
+            raise Done
+
+        co = foo()
+        x = co.send(None)
+        assert x == 40
+        assert result == [5]
+        x = co.send(82)
+        assert x == 41
+        assert result == [5]
+        raises(Done, co.send, 93)
+        assert result == [5, 6]
+        """
diff --git a/pypy/interpreter/typedef.py b/pypy/interpreter/typedef.py
--- a/pypy/interpreter/typedef.py
+++ b/pypy/interpreter/typedef.py
@@ -901,7 +901,18 @@
     __await__    = interp2app(AsyncGenASend.descr__iter__),
     __iter__     = interp2app(AsyncGenASend.descr__iter__),
     __next__     = interp2app(AsyncGenASend.descr__next__),
+    close        = interp2app(AsyncGenASend.descr_close),
+    send         = interp2app(AsyncGenASend.descr_send),
+    throw        = interp2app(AsyncGenASend.descr_throw),
 )
+#AsyncGenAThrow.typedef = TypeDef("async_generator_athrow",
+#    __await__    = interp2app(AsyncGenAThrow.descr__iter__),
+#    __iter__     = interp2app(AsyncGenAThrow.descr__iter__),
+#    __next__     = interp2app(AsyncGenAThrow.descr__next__),
+#    close        = interp2app(AsyncGenAThrow.descr_close),
+#    send         = interp2app(AsyncGenAThrow.descr_send),
+#    throw        = interp2app(AsyncGenAThrow.descr_throw),
+#)
 
 Cell.typedef = TypeDef("cell",
     __total_ordering__ = 'auto',


More information about the pypy-commit mailing list