Author: Antonio Cuni <[email protected]>
Branch: jitypes2
Changeset: r44620:af450a431526
Date: 2011-06-01 14:15 +0200
http://bitbucket.org/pypy/pypy/changeset/af450a431526/
Log: fix the failing test, by checking that we can actually cast the
pointer also for primitive types (and switch to the slow path in
case we cannot)
diff --git a/lib_pypy/_ctypes/function.py b/lib_pypy/_ctypes/function.py
--- a/lib_pypy/_ctypes/function.py
+++ b/lib_pypy/_ctypes/function.py
@@ -680,7 +680,7 @@
funcptr = self._getfuncptr(argtypes, restype, thisarg)
try:
result = self._call_funcptr(funcptr, *args)
- except TypeError: # XXX, should be FFITypeError
+ except (TypeError, ArgumentError): # XXX, should be FFITypeError
assert self._slowpath_allowed
return CFuncPtr.__call__(self, *args)
return result
diff --git a/lib_pypy/_ctypes/pointer.py b/lib_pypy/_ctypes/pointer.py
--- a/lib_pypy/_ctypes/pointer.py
+++ b/lib_pypy/_ctypes/pointer.py
@@ -117,13 +117,16 @@
contents = property(getcontents, setcontents)
def _as_ffi_pointer_(self, ffitype):
- my_ffitype = type(self).get_ffi_argtype()
- # for now, we always allow types.pointer, else a lot of tests
- # break. We need to rethink how pointers are represented, though
- if my_ffitype.deref_pointer() != ffitype.deref_pointer() and \
- ffitype is not _ffi.types.void_p:
- raise ArgumentError, "expected %s instance, got %s" % (type(self),
ffitype)
- return self._get_buffer_value()
+ return as_ffi_pointer(self, ffitype)
+
+def as_ffi_pointer(value, ffitype):
+ my_ffitype = type(value).get_ffi_argtype()
+ # for now, we always allow types.pointer, else a lot of tests
+ # break. We need to rethink how pointers are represented, though
+ if my_ffitype.deref_pointer() != ffitype.deref_pointer() and \
+ ffitype is not _ffi.types.void_p:
+ raise ArgumentError, "expected %s instance, got %s" % (type(value),
ffitype)
+ return value._get_buffer_value()
def _cast_addr(obj, _, tp):
if not (isinstance(tp, _CDataMeta) and tp._is_pointer_like()):
diff --git a/lib_pypy/_ctypes/primitive.py b/lib_pypy/_ctypes/primitive.py
--- a/lib_pypy/_ctypes/primitive.py
+++ b/lib_pypy/_ctypes/primitive.py
@@ -9,7 +9,7 @@
CArgObject
from _ctypes.builtin import ConvMode
from _ctypes.array import Array
-from _ctypes.pointer import _Pointer
+from _ctypes.pointer import _Pointer, as_ffi_pointer
class NULL(object):
pass
@@ -255,7 +255,7 @@
# make pointer-types compatible with the _ffi fast path
if result._is_pointer_like():
def _as_ffi_pointer_(self, ffitype):
- return self._get_buffer_value()
+ return as_ffi_pointer(self, ffitype)
result._as_ffi_pointer_ = _as_ffi_pointer_
return result
diff --git a/pypy/module/test_lib_pypy/ctypes_tests/test_functions.py
b/pypy/module/test_lib_pypy/ctypes_tests/test_functions.py
--- a/pypy/module/test_lib_pypy/ctypes_tests/test_functions.py
+++ b/pypy/module/test_lib_pypy/ctypes_tests/test_functions.py
@@ -219,7 +219,6 @@
assert not result.contents == 99
def test_convert_pointers(self):
- py.test.skip("segfault")
f = dll.deref_LP_c_char_p
f.restype = c_char
f.argtypes = [POINTER(c_char_p)]
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit