[pypy-commit] pypy py3.6: Relax and implement the latest test

arigo pypy.commits at gmail.com
Sun Jul 16 10:23:30 EDT 2017


Author: Armin Rigo <arigo at tunes.org>
Branch: py3.6
Changeset: r91908:4146af845534
Date: 2017-07-16 16:22 +0200
http://bitbucket.org/pypy/pypy/changeset/4146af845534/

Log:	Relax and implement the latest test

diff --git a/pypy/interpreter/generator.py b/pypy/interpreter/generator.py
--- a/pypy/interpreter/generator.py
+++ b/pypy/interpreter/generator.py
@@ -611,7 +611,11 @@
 
 
 class AsyncGenABase(W_Root):
-    state = 0
+    ST_INIT = 0
+    ST_ITER = 1
+    ST_CLOSED = 2
+
+    state = ST_INIT
 
     def __init__(self, async_gen):
         self.space = async_gen.space
@@ -628,13 +632,13 @@
 
     def descr_throw(self, w_type, w_val=None, w_tb=None):
         space = self.space
-        if self.state == 2:
+        if self.state == self.ST_CLOSED:
             raise OperationError(space.w_StopIteration, space.w_None)
         try:
             w_value = self.async_gen.throw(w_type, w_val, w_tb)
             return self.unwrap_value(w_value)
         except OperationError as e:
-            self.state = 2
+            self.state = self.ST_CLOSED
             raise
 
     def descr_close(self):
@@ -655,7 +659,7 @@
 
     def do_send(self, w_arg_or_err):
         space = self.space
-        if self.state == 2:
+        if self.state == self.ST_CLOSED:
             raise OperationError(space.w_StopIteration, space.w_None)
 
         # We think that the code should look like this:
@@ -667,16 +671,16 @@
 
         # But instead, CPython's logic is this, which we think is
         # giving nonsense results for 'g.asend(42).send(43)':
-        if self.state == 0:
+        if self.state == self.ST_INIT:
             if space.is_w(w_arg_or_err, space.w_None):
                 w_arg_or_err = self.w_value_to_send
-            self.state = 1
+            self.state = self.ST_ITER
 
         try:
             w_value = self.async_gen.send_ex(w_arg_or_err)
             return self.unwrap_value(w_value)
         except OperationError as e:
-            self.state = 2
+            self.state = self.ST_CLOSED
             raise
 
 
@@ -691,17 +695,32 @@
     def do_send(self, w_arg_or_err):
         # XXX FAR MORE COMPLICATED IN CPYTHON
         space = self.space
-        if self.state == 2:
+        if self.state == self.ST_CLOSED:
             raise OperationError(space.w_StopIteration, space.w_None)
 
-        if self.state == 0:
+        if self.state == self.ST_INIT:
             if not space.is_w(w_arg_or_err, space.w_None):
                 raise OperationError(space.w_RuntimeError, space.newtext(
                     "can't send non-None value to a just-started coroutine"))
-            self.state = 1
-            w_value = self.async_gen.throw(self.w_exc_type,
-                                           self.w_exc_value,
-                                           self.w_exc_tb)
+            self.state = self.ST_ITER
+            throwing = True
         else:
-            w_value = self.async_gen.send_ex(w_arg_or_err)
-        return self.unwrap_value(w_value)
+            throwing = False
+
+        try:
+            if throwing:
+                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
+            raise
+
+    def descr_throw(self, w_type, w_val=None, w_tb=None):
+        if self.state == self.ST_INIT:
+            raise OperationError(self.space.w_RuntimeError,
+                self.space.newtext("can't do async_generator.athrow().throw()"))
+        return AsyncGenABase.descr_throw(self, w_type, w_val, w_tb)
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
@@ -418,7 +418,6 @@
         async def ag():
             yield 42
 
-        ex = raises(RuntimeError, ag().athrow(ValueError).throw, LookupError)
-        expected = ("can't send non-None value to a just-started coroutine", )
-        assert ex.value.args == expected
+        raises(RuntimeError, ag().athrow(ValueError).throw, LookupError)
+        # CPython's message makes little sense; PyPy's message is different
     """


More information about the pypy-commit mailing list