[pypy-svn] r53597 - in pypy/dist/pypy/module/gc: . test

arigo at codespeak.net arigo at codespeak.net
Tue Apr 8 22:48:42 CEST 2008


Author: arigo
Date: Tue Apr  8 22:48:41 2008
New Revision: 53597

Modified:
   pypy/dist/pypy/module/gc/__init__.py
   pypy/dist/pypy/module/gc/app_gc.py
   pypy/dist/pypy/module/gc/interp_gc.py
   pypy/dist/pypy/module/gc/test/test_gc.py
Log:
App-level interface to {disable,enable}_finalizers().


Modified: pypy/dist/pypy/module/gc/__init__.py
==============================================================================
--- pypy/dist/pypy/module/gc/__init__.py	(original)
+++ pypy/dist/pypy/module/gc/__init__.py	Tue Apr  8 22:48:41 2008
@@ -8,5 +8,7 @@
     }
     interpleveldefs = {
         'collect': 'interp_gc.collect',
+        'enable_finalizers': 'interp_gc.enable_finalizers',
+        'disable_finalizers': 'interp_gc.disable_finalizers',
         'estimate_heap_size': 'interp_gc.estimate_heap_size',
     }

Modified: pypy/dist/pypy/module/gc/app_gc.py
==============================================================================
--- pypy/dist/pypy/module/gc/app_gc.py	(original)
+++ pypy/dist/pypy/module/gc/app_gc.py	Tue Apr  8 22:48:41 2008
@@ -1,6 +1,6 @@
 
 def isenabled():
-    "Not implemented."
+    return True
 
 def enable():
     "Not implemented."

Modified: pypy/dist/pypy/module/gc/interp_gc.py
==============================================================================
--- pypy/dist/pypy/module/gc/interp_gc.py	(original)
+++ pypy/dist/pypy/module/gc/interp_gc.py	Tue Apr  8 22:48:41 2008
@@ -1,14 +1,36 @@
 from pypy.interpreter.gateway import ObjSpace
 from pypy.interpreter.error import OperationError
-from pypy.rlib import rgc # Force registration of gc.collect
-import gc
+from pypy.rlib import rgc
 
 def collect(space):
     "Run a full collection."
-    gc.collect()
+    rgc.collect()
     
 collect.unwrap_spec = [ObjSpace]
 
+class State: 
+    def __init__(self, space):
+        self.finalizers_lock_count = 0
+def getstate(space):
+    return space.fromcache(State)
+
+def enable_finalizers(space):
+    state = getstate(space)
+    if state.finalizers_lock_count == 0:
+        raise OperationError(space.w_ValueError,
+                             space.wrap("finalizers are already enabled"))
+    state.finalizers_lock_count -= 1
+    rgc.enable_finalizers()
+enable_finalizers.unwrap_spec = [ObjSpace]
+
+def disable_finalizers(space):
+    state = getstate(space)
+    rgc.disable_finalizers()
+    state.finalizers_lock_count += 1
+disable_finalizers.unwrap_spec = [ObjSpace]
+
+# ____________________________________________________________
+
 import sys
 platform = sys.platform
 

Modified: pypy/dist/pypy/module/gc/test/test_gc.py
==============================================================================
--- pypy/dist/pypy/module/gc/test/test_gc.py	(original)
+++ pypy/dist/pypy/module/gc/test/test_gc.py	Tue Apr  8 22:48:41 2008
@@ -3,6 +3,20 @@
         import gc
         gc.collect() # mostly a "does not crash" kind of test
 
+    def test_disable_finalizers(self):
+        # on top of PyPy we can't easily test this, except by using
+        # obsure hacks, so for now we'll live with a "does not crash"
+        # kind of test
+        import gc
+        gc.disable_finalizers()
+        gc.enable_finalizers()
+        # we can test that nesting appears to work
+        gc.disable_finalizers()
+        gc.disable_finalizers()
+        gc.enable_finalizers()
+        gc.enable_finalizers()
+        raises(ValueError, gc.enable_finalizers)
+
     def test_estimate_heap_size(self):
         import sys, gc
         if sys.platform == "linux2":



More information about the Pypy-commit mailing list