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

antocuni at codespeak.net antocuni at codespeak.net
Wed Jan 14 13:48:36 CET 2009


Author: antocuni
Date: Wed Jan 14 13:48:35 2009
New Revision: 60950

Modified:
   pypy/trunk/pypy/interpreter/generator.py
   pypy/trunk/pypy/interpreter/test/test_generator.py
Log:
make sure to close() the generator object when it's finalized. Reviews welcome



Modified: pypy/trunk/pypy/interpreter/generator.py
==============================================================================
--- pypy/trunk/pypy/interpreter/generator.py	(original)
+++ pypy/trunk/pypy/interpreter/generator.py	Wed Jan 14 13:48:35 2009
@@ -110,3 +110,6 @@
         if w_retval is not None:
             msg = "generator ignored GeneratorExit"
             raise OperationError(space.w_RuntimeError, space.wrap(msg))
+
+    def __del__(self):
+        self.descr_close()

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	Wed Jan 14 13:48:35 2009
@@ -156,6 +156,23 @@
         g.next()
         raises(RuntimeError, g.close)
 
+    def test_close_on_collect(self):
+        ## we need to exec it, else it won't run on python2.4
+        exec """
+        def f():
+            try:
+                yield
+            finally:
+                f.x = 42
+        """.strip() in locals(), locals()
+
+        g = f()
+        g.next()
+        del g
+        import gc
+        gc.collect()
+        assert f.x == 42
+
     def test_generator_raises_typeerror(self):
         def f():
             yield 1



More information about the Pypy-commit mailing list