[pypy-svn] r51434 - pypy/dist/pypy/lib/_ctypes

fijal at codespeak.net fijal at codespeak.net
Wed Feb 13 13:39:40 CET 2008


Author: fijal
Date: Wed Feb 13 13:39:39 2008
New Revision: 51434

Modified:
   pypy/dist/pypy/lib/_ctypes/pointer.py
   pypy/dist/pypy/lib/_ctypes/primitive.py
Log:
__del__ for primitive values, pointers keep alive stuff they reference.


Modified: pypy/dist/pypy/lib/_ctypes/pointer.py
==============================================================================
--- pypy/dist/pypy/lib/_ctypes/pointer.py	(original)
+++ pypy/dist/pypy/lib/_ctypes/pointer.py	Wed Feb 13 13:39:39 2008
@@ -55,6 +55,7 @@
         ffiarray = _rawffi.Array('P')
         def __init__(self, value=None):
             self._buffer = ffiarray(1)
+            self._objects = [value] # keepalive value
             if value is not None:
                 self.contents = value
         self._ffiarray = ffiarray

Modified: pypy/dist/pypy/lib/_ctypes/primitive.py
==============================================================================
--- pypy/dist/pypy/lib/_ctypes/primitive.py	(original)
+++ pypy/dist/pypy/lib/_ctypes/primitive.py	Wed Feb 13 13:39:39 2008
@@ -194,8 +194,10 @@
 class _SimpleCData(_CData):
     __metaclass__ = SimpleType
     _type_ = 'i'
+    _needs_free = False
 
     def __init__(self, value=DEFAULT_VALUE):
+        self._needs_free = True
         self._buffer = self._ffiarray(1)
         if value is not DEFAULT_VALUE:
             self.value = value
@@ -216,3 +218,9 @@
 
     def __nonzero__(self):
         return self._buffer[0] not in (0, '\x00')
+
+    def __del__(self):
+        if self._needs_free:
+            self._needs_free = False
+            self._buffer.free()
+            self._buffer = None



More information about the Pypy-commit mailing list