[pypy-commit] pypy py3.5: Test and fix
arigo
pypy.commits at gmail.com
Tue Nov 1 06:17:22 EDT 2016
Author: Armin Rigo <arigo at tunes.org>
Branch: py3.5
Changeset: r88020:88f5561e826f
Date: 2016-11-01 11:16 +0100
http://bitbucket.org/pypy/pypy/changeset/88f5561e826f/
Log: 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
@@ -254,12 +254,10 @@
operr.normalize_exception(space)
# note: w_yielded_from is always None if 'self.running'
- w_yf = self.w_yielded_from
- if (w_yf is not None and
+ if (self.w_yielded_from is not None and
operr.match(space, space.w_GeneratorExit)):
- self.w_yielded_from = None
try:
- gen_close_iter(space, w_yf)
+ self._gen_close_iter(space)
except OperationError as e:
return self.send_error(e)
@@ -270,6 +268,16 @@
operr.set_traceback(tb)
return self.send_error(operr)
+ def _gen_close_iter(self, space):
+ assert not self.running
+ w_yf = self.w_yielded_from
+ self.w_yielded_from = None
+ self.running = True
+ try:
+ gen_close_iter(space, w_yf)
+ finally:
+ self.running = False
+
def descr_close(self):
"""close() -> raise GeneratorExit inside generator/coroutine."""
if self.frame is None:
@@ -279,9 +287,8 @@
# note: w_yielded_from is always None if 'self.running'
w_yf = self.w_yielded_from
if w_yf is not None:
- self.w_yielded_from = None
try:
- gen_close_iter(space, w_yf)
+ self._gen_close_iter(space)
except OperationError as e:
operr = e
try:
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
@@ -417,6 +417,25 @@
assert gen.gi_yieldfrom is None
"""
+ def test_gi_running_in_throw_generatorexit(self): """
+ # We must force gi_running to be True on the outer generators
+ # when running an inner custom close() method.
+ class A:
+ def __iter__(self):
+ return self
+ def __next__(self):
+ return 42
+ def close(self):
+ closed.append(gen.gi_running)
+ def g():
+ yield from A()
+ gen = g()
+ assert next(gen) == 42
+ closed = []
+ raises(GeneratorExit, gen.throw, GeneratorExit)
+ assert closed == [True]
+ """
+
def test_should_not_inline(space):
from pypy.interpreter.generator import should_not_inline
More information about the pypy-commit
mailing list