Author: Amaury Forgeot d'Arc <[email protected]>
Branch: py3.3
Changeset: r74207:82ec5124510e
Date: 2014-10-25 14:40 +0200
http://bitbucket.org/pypy/pypy/changeset/82ec5124510e/

Log:    yield from: Fix last test failure.

diff --git a/pypy/interpreter/generator.py b/pypy/interpreter/generator.py
--- a/pypy/interpreter/generator.py
+++ b/pypy/interpreter/generator.py
@@ -164,8 +164,16 @@
                 return space.call_function(w_throw, w_type, w_val, w_tb)
             except OperationError as operr:
                 self.running = False
-                # XXX Should pop subiterator from stack?
-                return self.send_ex(space.w_None, operr)
+                # Pop subiterator from stack.
+                w_subiter = self.frame.popvalue()
+                assert space.is_w(w_subiter, w_yf)
+                # Termination repetition of YIELD_FROM
+                self.frame.last_instr += 1
+                if operr.match(space, space.w_StopIteration):
+                    w_val = operr.get_w_value(space)
+                    return self.send_ex(w_val)
+                else:
+                    return self.send_ex(space.w_None, operr)
             finally:
                 self.running = False
 
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
@@ -597,3 +597,34 @@
             "Finishing g1",
         ]
 
+    def test_catching_exception_from_subgen_and_returning(self):
+        """
+        Test catching an exception thrown into a
+        subgenerator and returning a value
+        """
+        trace = []
+        d = dict(trace=trace)
+        exec('''if 1:
+        def inner():
+            try:
+                yield 1
+            except ValueError:
+                trace.append("inner caught ValueError")
+            return 2
+
+        def outer():
+            v = yield from inner()
+            trace.append("inner returned %r to outer" % v)
+            yield v
+        ''', d)
+        inner, outer = d['inner'], d['outer']
+        g = outer()
+        trace.append(next(g))
+        trace.append(g.throw(ValueError))
+        assert trace == [
+            1,
+            "inner caught ValueError",
+            "inner returned 2 to outer",
+            2,
+        ]
+
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to