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

fijal at codespeak.net fijal at codespeak.net
Fri Mar 7 13:07:23 CET 2008


Author: fijal
Date: Fri Mar  7 13:07:23 2008
New Revision: 52246

Modified:
   pypy/dist/pypy/lib/_ctypes/array.py
   pypy/dist/pypy/lib/_ctypes/basics.py
   pypy/dist/pypy/lib/_ctypes/function.py
   pypy/dist/pypy/lib/_ctypes/pointer.py
   pypy/dist/pypy/lib/_ctypes/primitive.py
   pypy/dist/pypy/lib/_ctypes/structure.py
   pypy/dist/pypy/lib/_ctypes/union.py
Log:
use autfree=True feature


Modified: pypy/dist/pypy/lib/_ctypes/array.py
==============================================================================
--- pypy/dist/pypy/lib/_ctypes/array.py	(original)
+++ pypy/dist/pypy/lib/_ctypes/array.py	Fri Mar  7 13:07:23 2008
@@ -1,8 +1,8 @@
 
 import _rawffi
 
-from _ctypes.basics import _CData, cdata_from_address, _CDataMeta, sizeof,\
-     keepalive_key, store_reference, CArgObject
+from _ctypes.basics import _CData, cdata_from_address, _CDataMeta, sizeof
+from _ctypes.basics import keepalive_key, store_reference, CArgObject
 from _ctypes.builtin import _string_at_addr, _wstring_at_addr
 
 def _create_unicode(buffer, maxlength):
@@ -129,11 +129,9 @@
 class Array(_CData):
     __metaclass__ = ArrayMeta
     _ffiargshape = _ffiletter = 'P'
-    _needs_free = False
 
     def __init__(self, *args):
-        self._buffer = self._ffiarray(self._length_)
-        self._needs_free = True
+        self._buffer = self._ffiarray(self._length_, autofree=True)
         self._objects = {}
         for i, arg in enumerate(args):
             self[i] = arg
@@ -187,12 +185,6 @@
     def _get_buffer_value(self):
         return self._buffer.buffer
 
-    def __del__(self):
-        if self._needs_free:
-            self._buffer.free()
-            self._buffer = None
-            self._needs_free = False
-
 ARRAY_CACHE = {}
 
 def create_array_type(base, length):

Modified: pypy/dist/pypy/lib/_ctypes/basics.py
==============================================================================
--- pypy/dist/pypy/lib/_ctypes/basics.py	(original)
+++ pypy/dist/pypy/lib/_ctypes/basics.py	Fri Mar  7 13:07:23 2008
@@ -47,8 +47,8 @@
         # interested only in value anyway
         return cobj._get_buffer_value()
 
-    def _CData_output(self, resbuffer, base=None, index=-1, needs_free=False):
-        assert isinstance(resbuffer, _rawffi.ArrayInstance)
+    def _CData_output(self, resbuffer, base=None, index=-1):
+        #assert isinstance(resbuffer, _rawffi.ArrayInstance)
         """Used when data exits ctypes and goes into user code.
         'resbuffer' is a _rawffi array of length 1 containing the value,
         and this returns a general Python object that corresponds.
@@ -57,11 +57,10 @@
         res.__dict__['_buffer'] = resbuffer
         res.__dict__['_base'] = base
         res.__dict__['_index'] = index
-        res.__dict__['_needs_free'] = needs_free
         return res.__ctypes_from_outparam__()
 
     def _CData_retval(self, resbuffer):
-        return self._CData_output(resbuffer, needs_free=True)
+        return self._CData_output(resbuffer)
 
     def __mul__(self, other):
         from _ctypes.array import create_array_type

Modified: pypy/dist/pypy/lib/_ctypes/function.py
==============================================================================
--- pypy/dist/pypy/lib/_ctypes/function.py	(original)
+++ pypy/dist/pypy/lib/_ctypes/function.py	Fri Mar  7 13:07:23 2008
@@ -83,8 +83,6 @@
         resbuffer = funcptr(*[arg._buffer for obj, arg in args])
         if restype is not None:
             return restype._CData_retval(resbuffer)
-        else:
-            resbuffer.free()
 
     def _getfuncptr(self, argtypes, restype):
         if restype is None:

Modified: pypy/dist/pypy/lib/_ctypes/pointer.py
==============================================================================
--- pypy/dist/pypy/lib/_ctypes/pointer.py	(original)
+++ pypy/dist/pypy/lib/_ctypes/pointer.py	Fri Mar  7 13:07:23 2008
@@ -55,8 +55,7 @@
     def set_type(self, TP):
         ffiarray = _rawffi.Array('P')
         def __init__(self, value=None):
-            self._buffer = ffiarray(1)
-            self._needs_free = True
+            self._buffer = ffiarray(1, autofree=True)
             if value is not None:
                 self.contents = value
         self._ffiarray = ffiarray
@@ -67,7 +66,6 @@
 
 class _Pointer(_CData):
     __metaclass__ = PointerType
-    _needs_free = False
 
     def getcontents(self):
         addr = self._buffer[0]
@@ -106,12 +104,6 @@
     def __nonzero__(self):
         return self._buffer[0] != 0
 
-    def __del__(self):
-        if self._needs_free:
-            self._buffer.free()
-            self._needs_free = False
-            self._buffer = None
-
     contents = property(getcontents, setcontents)
 
 
@@ -121,9 +113,8 @@
                         % (tp,))
     if isinstance(obj, Array):
         ptr = tp.__new__(tp)
-        ptr._buffer = tp._ffiarray(1)
+        ptr._buffer = tp._ffiarray(1, autofree=True)
         ptr._buffer[0] = obj._buffer
-        ptr._needs_free = True
         return ptr
     if isinstance(obj, (int, long)):
         result = tp()
@@ -134,5 +125,4 @@
                         % (type(obj),))
     result = tp()
     result._buffer[0] = obj._buffer[0]
-    result._needs_free = True
     return result

Modified: pypy/dist/pypy/lib/_ctypes/primitive.py
==============================================================================
--- pypy/dist/pypy/lib/_ctypes/primitive.py	(original)
+++ pypy/dist/pypy/lib/_ctypes/primitive.py	Fri Mar  7 13:07:23 2008
@@ -198,11 +198,9 @@
 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)
+        self._buffer = self._ffiarray(1, autofree=True)
         if value is not DEFAULT_VALUE:
             self.value = value
 
@@ -222,9 +220,3 @@
 
     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

Modified: pypy/dist/pypy/lib/_ctypes/structure.py
==============================================================================
--- pypy/dist/pypy/lib/_ctypes/structure.py	(original)
+++ pypy/dist/pypy/lib/_ctypes/structure.py	Fri Mar  7 13:07:23 2008
@@ -110,8 +110,7 @@
         def __init__(self, *args, **kwds):
             if not hasattr(self, '_ffistruct'):
                 raise TypeError("Cannot instantiate structure, has no _fields_")
-            self.__dict__['_buffer'] = self._ffistruct()
-            self.__dict__['_needs_free'] = True
+            self.__dict__['_buffer'] = self._ffistruct(autofree=True)
             self.__dict__['_objects'] = {}
             if len(args) > len(self._names):
                 raise TypeError("too many arguments")
@@ -161,12 +160,10 @@
         res.__dict__['_buffer'] = resbuffer
         res.__dict__['_base'] = None
         res.__dict__['_index'] = -1
-        res.__dict__['_needs_free'] = True
         return res.__ctypes_from_outparam__()
 
 class Structure(_CData):
     __metaclass__ = StructureMeta
-    _needs_free = False
 
     def _subarray(self, fieldtype, name):
         """Return a _rawffi array of length 1 whose address is the same as
@@ -207,9 +204,3 @@
 
     def _get_buffer_value(self):
         return self._buffer.buffer
-
-    def __del__(self):
-        if self._needs_free:
-            self._buffer.free()
-            self.__dict__['_buffer'] = None
-            self.__dict__['_needs_free'] = False

Modified: pypy/dist/pypy/lib/_ctypes/union.py
==============================================================================
--- pypy/dist/pypy/lib/_ctypes/union.py	(original)
+++ pypy/dist/pypy/lib/_ctypes/union.py	Fri Mar  7 13:07:23 2008
@@ -26,8 +26,7 @@
                 raise TypeError("Cannot instantiate union, has no type")
             # malloc size
             size = self.__class__._sizeofinstances()
-            self.__dict__['_buffer'] = _rawffi.Array('c')(size)
-            self.__dict__['_needs_free'] = True
+            self.__dict__['_buffer'] = _rawffi.Array('c')(size, autofree=True)
         res.__init__ = __init__
         return res
 
@@ -66,7 +65,6 @@
 
 class Union(_CData):
     __metaclass__ = UnionMeta
-    _needs_free = False
 
     def __getattr__(self, name):
         try:
@@ -83,9 +81,3 @@
             raise AttributeError(name)
         buf = self._ffiarrays[name].fromaddress(self._buffer.buffer, 1)
         buf[0] = fieldtype._CData_value(value)
-
-    def __del__(self):
-        if self._needs_free:
-            self._buffer.free()
-            self.__dict__['_buffer'] = None
-            self.__dict__['_needs_free'] = False



More information about the Pypy-commit mailing list