[pypy-svn] r79527 - pypy/branch/fast-forward/lib_pypy/_ctypes
afa at codespeak.net
afa at codespeak.net
Thu Nov 25 19:31:51 CET 2010
Author: afa
Date: Thu Nov 25 19:31:49 2010
New Revision: 79527
Modified:
pypy/branch/fast-forward/lib_pypy/_ctypes/array.py
pypy/branch/fast-forward/lib_pypy/_ctypes/basics.py
pypy/branch/fast-forward/lib_pypy/_ctypes/primitive.py
Log:
Correctly retrieve the objects to keep alive when storing a c_char_p in an array.
This is needed by code like:
array = (c_char_p * 5)()
array[0] = 'foo bar'
print array[0]
import gc; gc.collect()
print array[0] # used to print garbage
This fixes all CPython tests in ctypes/test/test_objects.py.
Modified: pypy/branch/fast-forward/lib_pypy/_ctypes/array.py
==============================================================================
--- pypy/branch/fast-forward/lib_pypy/_ctypes/array.py (original)
+++ pypy/branch/fast-forward/lib_pypy/_ctypes/array.py Thu Nov 25 19:31:49 2010
@@ -172,9 +172,10 @@
self._slice_setitem(index, value)
return
index = self._fix_index(index)
- if ensure_objects(value) is not None:
- store_reference(self, index, value._objects)
- arg = self._type_._CData_value(value)
+ cobj = self._type_.from_param(value)
+ if ensure_objects(cobj) is not None:
+ store_reference(self, index, cobj._objects)
+ arg = cobj._get_buffer_value()
if self._type_._fficompositesize is None:
self._buffer[index] = arg
# something more sophisticated, cannot set field directly
@@ -193,7 +194,7 @@
return self._length_
def _get_buffer_for_param(self):
- return CArgObject(self._buffer.byptr())
+ return CArgObject(self, self._buffer.byptr())
def _get_buffer_value(self):
return self._buffer.buffer
Modified: pypy/branch/fast-forward/lib_pypy/_ctypes/basics.py
==============================================================================
--- pypy/branch/fast-forward/lib_pypy/_ctypes/basics.py (original)
+++ pypy/branch/fast-forward/lib_pypy/_ctypes/basics.py Thu Nov 25 19:31:49 2010
@@ -92,13 +92,17 @@
""" simple wrapper around buffer, just for the case of freeing
it afterwards
"""
- def __init__(self, buffer):
+ def __init__(self, obj, buffer):
+ self._obj = obj
self._buffer = buffer
def __del__(self):
self._buffer.free()
self._buffer = None
+ def __repr__(self):
+ return repr(self._obj)
+
class _CData(object):
""" The most basic object for all ctypes types
"""
@@ -128,7 +132,7 @@
return buffer(self._buffer)
def _get_b_base(self):
- return self._objects
+ return self._base
_b_base_ = property(_get_b_base)
_b_needsfree_ = False
Modified: pypy/branch/fast-forward/lib_pypy/_ctypes/primitive.py
==============================================================================
--- pypy/branch/fast-forward/lib_pypy/_ctypes/primitive.py (original)
+++ pypy/branch/fast-forward/lib_pypy/_ctypes/primitive.py Thu Nov 25 19:31:49 2010
@@ -134,8 +134,8 @@
ConvMode.errors)
#self._objects = value
array = _rawffi.Array('c')(len(value)+1, value)
+ self._objects = CArgObject(value, array)
value = array.buffer
- self._objects = {'0': CArgObject(array)}
elif value is None:
value = 0
self._buffer[0] = value
@@ -156,8 +156,8 @@
ConvMode.errors)
#self._objects = value
array = _rawffi.Array('u')(len(value)+1, value)
+ self._objects = CArgObject(value, array)
value = array.buffer
- self._objects = {'0': CArgObject(array)}
elif value is None:
value = 0
self._buffer[0] = value
@@ -175,8 +175,8 @@
def _setvalue(self, value):
if isinstance(value, str):
array = _rawffi.Array('c')(len(value)+1, value)
+ self._objects = CArgObject(value, array)
value = array.buffer
- self._objects = {'0': CArgObject(array)}
elif value is None:
value = 0
self._buffer[0] = value
More information about the Pypy-commit
mailing list