[pypy-svn] r51598 - in pypy/dist/pypy/module/_rawffi: . test

fijal at codespeak.net fijal at codespeak.net
Mon Feb 18 18:10:57 CET 2008


Author: fijal
Date: Mon Feb 18 18:10:57 2008
New Revision: 51598

Modified:
   pypy/dist/pypy/module/_rawffi/callback.py
   pypy/dist/pypy/module/_rawffi/test/test__rawffi.py
   pypy/dist/pypy/module/_rawffi/test/test_tracker.py
Log:
Tracing for callbacks.


Modified: pypy/dist/pypy/module/_rawffi/callback.py
==============================================================================
--- pypy/dist/pypy/module/_rawffi/callback.py	(original)
+++ pypy/dist/pypy/module/_rawffi/callback.py	Mon Feb 18 18:10:57 2008
@@ -9,6 +9,7 @@
 from pypy.module._rawffi.interp_rawffi import W_DataInstance, _get_type_,\
      wrap_value, unwrap_value, unwrap_truncate_int, letter2tp
 from pypy.rlib.libffi import USERDATA_P, CallbackFuncPtr
+from pypy.module._rawffi.tracker import tracker
 
 def callback(ll_args, ll_res, ll_userdata):
     userdata = rffi.cast(USERDATA_P, ll_userdata)
@@ -52,9 +53,16 @@
         self.ll_callback = CallbackFuncPtr(ffiargs, ffiresult,
                                            callback, number)
         self.ll_buffer = rffi.cast(rffi.VOIDP, self.ll_callback.ll_closure)
-
-    #def free(self):
-    #    del self.global_counter.CallbackPtr_by_number[self.number]
+        if tracker.DO_TRACING:
+            addr = rffi.cast(rffi.INT, self.ll_callback.ll_closure)
+            tracker.trace_allocation(addr, self)
+
+    def free(self):
+        if tracker.DO_TRACING:
+            addr = rffi.cast(rffi.INT, self.ll_callback.ll_closure)
+            tracker.trace_free(addr)
+        del self.global_counter.CallbackPtr_by_number[self.number]
+    free.unwrap_spec = ['self']
 
 def descr_new_callbackptr(space, w_type, w_callable, w_args, w_result):
     return W_CallbackPtr(space, w_callable, w_args, w_result)
@@ -64,4 +72,5 @@
     __new__ = interp2app(descr_new_callbackptr),
     byptr   = interp2app(W_CallbackPtr.byptr),
     buffer  = GetSetProperty(W_CallbackPtr.getbuffer),
+    free    = interp2app(W_CallbackPtr.free),
 )

Modified: pypy/dist/pypy/module/_rawffi/test/test__rawffi.py
==============================================================================
--- pypy/dist/pypy/module/_rawffi/test/test__rawffi.py	(original)
+++ pypy/dist/pypy/module/_rawffi/test/test__rawffi.py	Mon Feb 18 18:10:57 2008
@@ -600,6 +600,3 @@
         a.free()
         raises(_rawffi.SegfaultException, a.__getitem__, 3)
         raises(_rawffi.SegfaultException, a.__setitem__, 3, 3)
-        
-        
-        

Modified: pypy/dist/pypy/module/_rawffi/test/test_tracker.py
==============================================================================
--- pypy/dist/pypy/module/_rawffi/test/test_tracker.py	(original)
+++ pypy/dist/pypy/module/_rawffi/test/test_tracker.py	Mon Feb 18 18:10:57 2008
@@ -24,6 +24,13 @@
         s.free()
         assert _rawffi._num_of_allocated_objects() == 0
 
+    def test_callback(self):
+        import _rawffi
+        c = _rawffi.CallbackPtr(lambda : 3, [], 'i')
+        assert _rawffi._num_of_allocated_objects() == 1
+        c.free()
+        assert _rawffi._num_of_allocated_objects() == 0
+
     def teardown_class(cls):
         Tracker.DO_TRACING = False
 



More information about the Pypy-commit mailing list