[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