[pypy-svn] r61467 - in pypy/trunk/pypy/interpreter: . test

arigo at codespeak.net arigo at codespeak.net
Fri Jan 30 19:20:44 CET 2009


Author: arigo
Date: Fri Jan 30 19:20:44 2009
New Revision: 61467

Modified:
   pypy/trunk/pypy/interpreter/generator.py
   pypy/trunk/pypy/interpreter/test/test_generator.py
   pypy/trunk/pypy/interpreter/typedef.py
Log:
Make sure gi_frame returns None when the generator is finished.  Bit of
a hack (ideally the internal self.frame should be set to None) but it
can be done with minimal changes to the rest of the logic.


Modified: pypy/trunk/pypy/interpreter/generator.py
==============================================================================
--- pypy/trunk/pypy/interpreter/generator.py	(original)
+++ pypy/trunk/pypy/interpreter/generator.py	Fri Jan 30 19:20:44 2009
@@ -111,6 +111,12 @@
             msg = "generator ignored GeneratorExit"
             raise OperationError(space.w_RuntimeError, space.wrap(msg))
 
+    def descr_gi_frame(space, self):
+        if not self.frame.frame_finished_execution:
+            return self.frame
+        else:
+            return space.w_None
+
     def descr__del__(self):        
         """
         applevel __del__, which is called at a safe point after the

Modified: pypy/trunk/pypy/interpreter/test/test_generator.py
==============================================================================
--- pypy/trunk/pypy/interpreter/test/test_generator.py	(original)
+++ pypy/trunk/pypy/interpreter/test/test_generator.py	Fri Jan 30 19:20:44 2009
@@ -120,6 +120,14 @@
         g = f()
         raises(TypeError, g.throw, NameError("Error"), None, "not tb object")
 
+    def test_throw_finishes_generator(self):
+        def f():
+            yield 1
+        g = f()
+        assert g.gi_frame is not None
+        raises(ValueError, g.throw, ValueError)
+        assert g.gi_frame is None
+
     def test_close(self):
         def f():
             yield 1

Modified: pypy/trunk/pypy/interpreter/typedef.py
==============================================================================
--- pypy/trunk/pypy/interpreter/typedef.py	(original)
+++ pypy/trunk/pypy/interpreter/typedef.py	Fri Jan 30 19:20:44 2009
@@ -866,7 +866,7 @@
     __del__    = interp2app(GeneratorIterator.descr__del__,
                             descrmismatch='__del__'),
     gi_running = interp_attrproperty('running', cls=GeneratorIterator),
-    gi_frame   = interp_attrproperty('frame', cls=GeneratorIterator),
+    gi_frame   = GetSetProperty(GeneratorIterator.descr_gi_frame),
     __weakref__ = make_weakref_descr(GeneratorIterator),
 )
 GeneratorIterator.typedef.acceptable_as_base_class = False



More information about the Pypy-commit mailing list