[pypy-commit] pypy py3.3: fix yield from returns

pjenvey noreply at buildbot.pypy.org
Wed Jul 30 02:32:51 CEST 2014


Author: Philip Jenvey <pjenvey at underboss.org>
Branch: py3.3
Changeset: r72613:936bfd7e5628
Date: 2014-07-29 17:30 -0700
http://bitbucket.org/pypy/pypy/changeset/936bfd7e5628/

Log:	fix yield from returns

diff --git a/pypy/interpreter/pyopcode.py b/pypy/interpreter/pyopcode.py
--- a/pypy/interpreter/pyopcode.py
+++ b/pypy/interpreter/pyopcode.py
@@ -1012,13 +1012,14 @@
             else:
                 w_retval = space.call_method(w_gen, "send", w_value)
         except OperationError as e:
-            if not e.match(self.space, self.space.w_StopIteration):
+            if not e.match(space, space.w_StopIteration):
                 raise
             self.popvalue()  # Remove iter from stack
+            e.normalize_exception(space)
             try:
                 w_value = space.getattr(e.get_w_value(space), space.wrap("value"))
             except OperationError as e:
-                if not e.match(self.space, self.space.w_AttributeError):
+                if not e.match(space, space.w_AttributeError):
                     raise
                 w_value = space.w_None
             self.pushvalue(w_value)
diff --git a/pypy/interpreter/test/test_generator.py b/pypy/interpreter/test/test_generator.py
--- a/pypy/interpreter/test/test_generator.py
+++ b/pypy/interpreter/test/test_generator.py
@@ -316,6 +316,24 @@
             assert False, 'Expected StopIteration'
             """
 
+    def test_yield_from_return(self):
+        """
+        def f1():
+            result = yield from f2()
+            return result
+        def f2():
+            yield 1
+            return 2
+        g = f1()
+        assert next(g) == 1
+        try:
+            next(g)
+        except StopIteration as e:
+            assert e.value == 2
+        else:
+            assert False, 'Expected StopIteration'
+            """
+
 
 def test_should_not_inline(space):
     from pypy.interpreter.generator import should_not_inline


More information about the pypy-commit mailing list