[pypy-svn] r67014 - in pypy/trunk/pypy: interpreter module/_weakref/test

benjamin at codespeak.net benjamin at codespeak.net
Thu Aug 20 11:15:29 CEST 2009


Author: benjamin
Date: Thu Aug 20 11:15:28 2009
New Revision: 67014

Modified:
   pypy/trunk/pypy/interpreter/generator.py
   pypy/trunk/pypy/module/_weakref/test/test_weakref.py
Log:
the applevel __del__ must always be called for weakrefs to be cleared

Modified: pypy/trunk/pypy/interpreter/generator.py
==============================================================================
--- pypy/trunk/pypy/interpreter/generator.py	(original)
+++ pypy/trunk/pypy/interpreter/generator.py	Thu Aug 20 11:15:28 2009
@@ -123,11 +123,12 @@
         applevel __del__, which is called at a safe point after the
         interp-level __del__ enqueued the object for destruction
         """
-        self.descr_close()
-
-    def __del__(self):
+        # Only bother raising an exception if the frame is still not
+        # finished and finally or except blocks are present.
         if not self.frame.frame_finished_execution:
             for block in self.frame.blockstack:
                 if not isinstance(block, LoopBlock):
-                    self._enqueue_for_destruction(self.space)
-                    break
+                    self.descr_close()
+
+    def __del__(self):
+        self._enqueue_for_destruction(self.space)

Modified: pypy/trunk/pypy/module/_weakref/test/test_weakref.py
==============================================================================
--- pypy/trunk/pypy/module/_weakref/test/test_weakref.py	(original)
+++ pypy/trunk/pypy/module/_weakref/test/test_weakref.py	Thu Aug 20 11:15:28 2009
@@ -231,6 +231,12 @@
         del g
         gc.collect()
         assert w() is None
+        g = f(10)
+        w = _weakref.ref(g)
+        assert list(g) == range(10)
+        del g
+        gc.collect()
+        assert w() is None
 
     def test_weakref_subclass_with_del(self):
         import _weakref, gc



More information about the Pypy-commit mailing list