Author: Armin Rigo <[email protected]>
Branch: py3.5
Changeset: r88487:dc9cd14f5cd4
Date: 2016-11-19 22:10 +0100
http://bitbucket.org/pypy/pypy/changeset/dc9cd14f5cd4/
Log: Fix one test case. Because we're closely following CPython, we have
the same bug shown by another (skipped) test.
diff --git a/pypy/interpreter/generator.py b/pypy/interpreter/generator.py
--- a/pypy/interpreter/generator.py
+++ b/pypy/interpreter/generator.py
@@ -105,6 +105,7 @@
current_exc_info = ec.sys_exc_info()
if self.saved_operr is not None:
ec.set_sys_exc_info(self.saved_operr)
+ self.saved_operr = None
self.running = True
try:
w_result = frame.execute_frame(self, w_arg_or_err)
@@ -119,7 +120,11 @@
finally:
frame.f_backref = jit.vref_None
self.running = False
- self.saved_operr = ec.sys_exc_info()
+ # note: this is not perfectly correct: see
+ # test_exc_info_in_generator_4. But it's simpler and
+ # bug-to-bug compatible with CPython 3.5.
+ if frame._any_except_or_finally_handler():
+ self.saved_operr = ec.sys_exc_info()
ec.set_sys_exc_info(current_exc_info)
return w_result
diff --git a/pypy/interpreter/pyopcode.py b/pypy/interpreter/pyopcode.py
--- a/pypy/interpreter/pyopcode.py
+++ b/pypy/interpreter/pyopcode.py
@@ -790,6 +790,16 @@
assert w_unroller is not None
return w_unroller
+ @jit.unroll_safe
+ def _any_except_or_finally_handler(self):
+ block = self.lastblock
+ while block is not None:
+ if isinstance(block, SysExcInfoRestorer):
+ import pdb; pdb.set_trace()
+ return True
+ block = block.previous
+ return False
+
def LOAD_BUILD_CLASS(self, oparg, next_instr):
w_build_class = self.get_builtin().getdictvalue(
self.space, '__build_class__')
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
@@ -497,6 +497,40 @@
assert next(gen) is LookupError
assert next(gen) is ValueError
+ def test_exc_info_in_generator_3(self):
+ import sys
+ def g():
+ yield sys.exc_info()[0]
+ yield sys.exc_info()[0]
+ yield sys.exc_info()[0]
+ gen = g()
+ try:
+ raise IndexError
+ except IndexError:
+ assert next(gen) is IndexError
+ assert next(gen) is None
+ try:
+ raise ValueError
+ except ValueError:
+ assert next(gen) is ValueError
+
+ def test_exc_info_in_generator_4(self):
+ skip("buggy behavior, both in CPython and in PyPy")
+ import sys
+ def g():
+ try:
+ raise ValueError
+ except ValueError:
+ yield 1
+ assert sys.exc_info() == (None, None, None)
+ yield 2
+ gen = g()
+ try:
+ raise IndexError
+ except IndexError:
+ assert next(gen) is 1
+ assert next(gen) is 2
+
def test_should_not_inline(space):
from pypy.interpreter.generator import should_not_inline
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit