[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