[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