[pypy-svn] r50690 - pypy/dist/pypy/lib/_ctypes
fijal at codespeak.net
fijal at codespeak.net
Wed Jan 16 22:25:02 CET 2008
Author: fijal
Date: Wed Jan 16 22:25:00 2008
New Revision: 50690
Modified:
pypy/dist/pypy/lib/_ctypes/primitive.py
Log:
Replicate the bogus logic from the CPython ctypes.
Modified: pypy/dist/pypy/lib/_ctypes/primitive.py
==============================================================================
--- pypy/dist/pypy/lib/_ctypes/primitive.py (original)
+++ pypy/dist/pypy/lib/_ctypes/primitive.py Wed Jan 16 22:25:00 2008
@@ -43,7 +43,7 @@
result._ffiletter = tp
result._ffiarray = ffiarray
if tp == 'z':
- # c_char_p special cases
+ # c_char_p
from _ctypes import Array, _Pointer
def _getvalue(self):
@@ -52,6 +52,7 @@
return None
else:
return _rawffi.charp2string(addr)
+
def _setvalue(self, value):
if isinstance(value, str):
array = _rawffi.Array('c')(len(value)+1, value)
@@ -62,16 +63,40 @@
self._buffer[0] = value
result.value = property(_getvalue, _setvalue)
+ elif tp == 'P':
+ # c_void_p
+
+ def _getvalue(self):
+ addr = self._buffer[0]
+ if addr == 0:
+ return None
+ return addr
+
+ def _setvalue(self, value):
+ if isinstance(value, str):
+ array = _rawffi.Array('c')(len(value)+1, value)
+ value = array.buffer
+ # XXX free 'array' later
+ elif value is None:
+ value = 0
+ self._buffer[0] = value
+ result.value = property(_getvalue, _setvalue)
+
+ if tp == 'z' or tp == 'P':
+ from _ctypes import Array, _Pointer
+ # c_char_p and c_void_p
def from_param(self, value):
if value is None:
return None
if isinstance(value, basestring):
return self(value)
- if isinstance(value, self):
+ if isinstance(value, _SimpleCData) and \
+ type(value)._type_ in 'zP':
return value
if isinstance(value, (Array, _Pointer)):
- from ctypes import c_char
- if type(value)._type_ == c_char:
+ from ctypes import c_char, c_byte
+ if type(value)._type_ == c_char or \
+ type(value)._type_ == c_byte:
return value
return SimpleType.from_param(self, value)
result.from_param = classmethod(from_param)
More information about the Pypy-commit
mailing list