[pypy-commit] pypy py3.5-corowrapper: Another test and fix
arigo
pypy.commits at gmail.com
Sun Sep 18 17:10:43 EDT 2016
Author: Armin Rigo <arigo at tunes.org>
Branch: py3.5-corowrapper
Changeset: r87213:14723a241c8a
Date: 2016-09-18 23:09 +0200
http://bitbucket.org/pypy/pypy/changeset/14723a241c8a/
Log: Another test and fix
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,7 @@
try:
self.next_yield_from(frame, w_yf, w_arg_or_err)
except OperationError as operr:
- ec = space.getexecutioncontext()
- return frame.handle_operation_error(ec, operr)
+ return frame.handle_generator_error(operr)
# Normal case: the call above raises Yield.
# We reach this point if the iterable is exhausted.
last_instr = jit.promote(frame.last_instr)
@@ -173,8 +172,7 @@
return r_uint(last_instr + 1)
if isinstance(w_arg_or_err, SApplicationException):
- ec = space.getexecutioncontext()
- return frame.handle_operation_error(ec, w_arg_or_err.operr)
+ return frame.handle_generator_error(w_arg_or_err.operr)
last_instr = jit.promote(frame.last_instr)
if last_instr == -1:
diff --git a/pypy/interpreter/pyopcode.py b/pypy/interpreter/pyopcode.py
--- a/pypy/interpreter/pyopcode.py
+++ b/pypy/interpreter/pyopcode.py
@@ -101,6 +101,12 @@
operr = OperationError(w_type, w_value)
return self.handle_operation_error(ec, operr)
+ def handle_generator_error(self, operr):
+ # for generator.py
+ ec = self.space.getexecutioncontext()
+ operr.record_context(self.space, self)
+ return self.handle_operation_error(ec, operr)
+
def handle_operation_error(self, ec, operr, attach_tb=True):
if attach_tb:
if 1:
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
@@ -694,6 +694,24 @@
2,
]
+ def test_exception_context(self): """
+ import operator
+ def f():
+ try:
+ raise ValueError
+ except ValueError:
+ yield from map(operator.truediv, [2, 3], [4, 0])
+ gen = f()
+ assert next(gen) == 0.5
+ try:
+ next(gen)
+ except ZeroDivisionError as e:
+ assert e.__context__ is not None
+ assert isinstance(e.__context__, ValueError)
+ else:
+ assert False, "should have raised"
+ """
+
class AppTestGeneratorStop:
More information about the pypy-commit
mailing list