Author: Manuel Jacob <[email protected]>
Branch: py3.6
Changeset: r91918:a52d37ceba11
Date: 2017-07-18 19:35 +0200
http://bitbucket.org/pypy/pypy/changeset/a52d37ceba11/
Log: Add first test for aclose() on async generator and make it pass.
diff --git a/pypy/interpreter/generator.py b/pypy/interpreter/generator.py
--- a/pypy/interpreter/generator.py
+++ b/pypy/interpreter/generator.py
@@ -602,7 +602,7 @@
return AsyncGenAThrow(self, w_type, w_val, w_tb)
def descr_aclose(self):
- XXX
+ return AsyncGenAThrow(self, None, None, None)
class AsyncGenValueWrapper(W_Root):
@@ -709,14 +709,30 @@
try:
if throwing:
- w_value = self.async_gen.throw(self.w_exc_type,
- self.w_exc_value,
- self.w_exc_tb)
+ if self.w_exc_type is None:
+ w_value = self.async_gen.throw(space.w_GeneratorExit,
+ None, None)
+ if w_value is not None:
+ XXX
+ else:
+ w_value = self.async_gen.throw(self.w_exc_type,
+ self.w_exc_value,
+ self.w_exc_tb)
else:
w_value = self.async_gen.send_ex(w_arg_or_err)
return self.unwrap_value(w_value)
except OperationError as e:
- self.state = self.ST_CLOSED
+ if e.match(space, space.w_StopAsyncIteration):
+ self.state = self.ST_CLOSED
+ if self.w_exc_type is None:
+ # When aclose() is called we don't want to propagate
+ # StopAsyncIteration; just raise StopIteration, signalling
+ # that 'aclose()' is done.
+ raise OperationError(space.w_StopIteration, space.w_None)
+ if e.match(space, space.w_GeneratorExit):
+ self.state = self.ST_CLOSED
+ # Ignore this error.
+ raise OperationError(space.w_StopIteration, space.w_None)
raise
def descr_throw(self, w_type, w_val=None, w_tb=None):
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
@@ -448,3 +448,25 @@
except StopIteration:
assert values == [42]
"""
+
+ def test_async_aclose(self): """
+ raises_generator_exit = False
+ async def ag():
+ nonlocal raises_generator_exit
+ try:
+ yield
+ except GeneratorExit:
+ raises_generator_exit = True
+ raise
+
+ async def run():
+ a = ag()
+ async for i in a:
+ break
+ await a.aclose()
+ try:
+ run().send(None)
+ except StopIteration:
+ pass
+ assert raises_generator_exit
+ """
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit