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