[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