Author: Carl Friedrich Bolz <cfb...@gmx.de> Branch: Changeset: r52671:6159d1be91c9 Date: 2012-02-20 12:18 +0100 http://bitbucket.org/pypy/pypy/changeset/6159d1be91c9/
Log: merge diff --git a/lib_pypy/_ctypes/array.py b/lib_pypy/_ctypes/array.py --- a/lib_pypy/_ctypes/array.py +++ b/lib_pypy/_ctypes/array.py @@ -1,9 +1,9 @@ - +import _ffi import _rawffi from _ctypes.basics import _CData, cdata_from_address, _CDataMeta, sizeof from _ctypes.basics import keepalive_key, store_reference, ensure_objects -from _ctypes.basics import CArgObject +from _ctypes.basics import CArgObject, as_ffi_pointer class ArrayMeta(_CDataMeta): def __new__(self, name, cls, typedict): @@ -211,6 +211,9 @@ def _to_ffi_param(self): return self._get_buffer_value() + def _as_ffi_pointer_(self, ffitype): + return as_ffi_pointer(self, ffitype) + ARRAY_CACHE = {} def create_array_type(base, length): @@ -228,5 +231,6 @@ _type_ = base ) cls = ArrayMeta(name, (Array,), tpdict) + cls._ffiargtype = _ffi.types.Pointer(base.get_ffi_argtype()) ARRAY_CACHE[key] = cls return cls diff --git a/lib_pypy/_ctypes/basics.py b/lib_pypy/_ctypes/basics.py --- a/lib_pypy/_ctypes/basics.py +++ b/lib_pypy/_ctypes/basics.py @@ -230,5 +230,16 @@ } +# called from primitive.py, pointer.py, array.py +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 is not ffitype and ffitype is not _ffi.types.void_p: + raise ArgumentError("expected %s instance, got %s" % (type(value), + ffitype)) + return value._get_buffer_value() + + # used by "byref" from _ctypes.pointer import pointer 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 @@ -3,7 +3,7 @@ import _ffi from _ctypes.basics import _CData, _CDataMeta, cdata_from_address, ArgumentError from _ctypes.basics import keepalive_key, store_reference, ensure_objects -from _ctypes.basics import sizeof, byref +from _ctypes.basics import sizeof, byref, as_ffi_pointer from _ctypes.array import Array, array_get_slice_params, array_slice_getitem,\ array_slice_setitem @@ -119,14 +119,6 @@ def _as_ffi_pointer_(self, ffitype): 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 is not ffitype 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/pypy/module/test_lib_pypy/ctypes_tests/test_fastpath.py b/pypy/module/test_lib_pypy/ctypes_tests/test_fastpath.py --- a/pypy/module/test_lib_pypy/ctypes_tests/test_fastpath.py +++ b/pypy/module/test_lib_pypy/ctypes_tests/test_fastpath.py @@ -97,6 +97,16 @@ tf_b.errcheck = errcheck assert tf_b(-126) == 'hello' + def test_array_to_ptr(self): + ARRAY = c_int * 8 + func = dll._testfunc_ai8 + func.restype = POINTER(c_int) + func.argtypes = [ARRAY] + array = ARRAY(1, 2, 3, 4, 5, 6, 7, 8) + ptr = func(array) + assert ptr[0] == 1 + assert ptr[7] == 8 + class TestFallbackToSlowpath(BaseCTypesTestChecker): diff --git a/pypy/module/test_lib_pypy/ctypes_tests/test_prototypes.py b/pypy/module/test_lib_pypy/ctypes_tests/test_prototypes.py --- a/pypy/module/test_lib_pypy/ctypes_tests/test_prototypes.py +++ b/pypy/module/test_lib_pypy/ctypes_tests/test_prototypes.py @@ -246,6 +246,14 @@ def func(): pass CFUNCTYPE(None, c_int * 3)(func) + def test_array_to_ptr_wrongtype(self): + ARRAY = c_byte * 8 + func = testdll._testfunc_ai8 + func.restype = POINTER(c_int) + func.argtypes = [c_int * 8] + array = ARRAY(1, 2, 3, 4, 5, 6, 7, 8) + py.test.raises(ArgumentError, "func(array)") + ################################################################ if __name__ == '__main__': diff --git a/pypy/tool/release/package.py b/pypy/tool/release/package.py --- a/pypy/tool/release/package.py +++ b/pypy/tool/release/package.py @@ -83,7 +83,7 @@ shutil.copy(str(basedir.join(file)), str(pypydir)) pypydir.ensure('include', dir=True) if sys.platform == 'win32': - shutil.copyfile(str(pypy_c.dirpath().join("libpypy-c.lib"))), + shutil.copyfile(str(pypy_c.dirpath().join("libpypy-c.lib")), str(pypydir.join('include/python27.lib'))) # we want to put there all *.h and *.inl from trunk/include # and from pypy/_interfaces _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit