Author: Armin Rigo <ar...@tunes.org> Branch: Changeset: r45124:acf5e10f9d3c Date: 2011-06-25 19:19 +0200 http://bitbucket.org/pypy/pypy/changeset/acf5e10f9d3c/
Log: merge heads diff --git a/pypy/module/_ffi/interp_ffi.py b/pypy/module/_ffi/interp_ffi.py --- a/pypy/module/_ffi/interp_ffi.py +++ b/pypy/module/_ffi/interp_ffi.py @@ -217,7 +217,7 @@ if meth: return space.call_function(meth, w_arg, w_argtype) else: - return w_arg + raise OperationError(space.w_TypeError, space.wrap('not an ffi pointer type')) @jit.dont_look_inside def arg_longlong(self, space, argchain, kind, w_arg): diff --git a/pypy/module/_ffi/test/test__ffi.py b/pypy/module/_ffi/test/test__ffi.py --- a/pypy/module/_ffi/test/test__ffi.py +++ b/pypy/module/_ffi/test/test__ffi.py @@ -139,32 +139,13 @@ assert get_dummy() == 42 set_dummy(0) - def test_pointer_args(self): + def test_convert_pointer_args(self): """ extern int dummy; // defined in test_void_result DLLEXPORT int* get_dummy_ptr() { return &dummy; } DLLEXPORT void set_val_to_ptr(int* ptr, int val) { *ptr = val; } """ from _ffi import CDLL, types - libfoo = CDLL(self.libfoo_name) - get_dummy = libfoo.getfunc('get_dummy', [], types.sint) - get_dummy_ptr = libfoo.getfunc('get_dummy_ptr', [], types.void_p) - set_val_to_ptr = libfoo.getfunc('set_val_to_ptr', - [types.void_p, types.sint], - types.void) - assert get_dummy() == 0 - ptr = get_dummy_ptr() - set_val_to_ptr(ptr, 123) - assert get_dummy() == 123 - set_val_to_ptr(ptr, 0) - - def test_convert_pointer_args(self): - """ - extern int dummy; // defined in test_void_result - DLLEXPORT int* get_dummy_ptr(); // defined in test_pointer_args - DLLEXPORT void set_val_to_ptr(int* ptr, int val); // ditto - """ - from _ffi import CDLL, types class MyPointerWrapper(object): def __init__(self, value): @@ -213,11 +194,19 @@ libfoo = CDLL(self.libfoo_name) intptr = types.Pointer(types.sint) + + class MyPointerWrapper(object): + def __init__(self, value): + self.value = value + def _as_ffi_pointer_(self, ffitype): + assert ffitype is intptr + return self.value + get_dummy = libfoo.getfunc('get_dummy', [], types.sint) get_dummy_ptr = libfoo.getfunc('get_dummy_ptr', [], intptr) set_val_to_ptr = libfoo.getfunc('set_val_to_ptr', [intptr, types.sint], types.void) assert get_dummy() == 0 - ptr = get_dummy_ptr() + ptr = MyPointerWrapper(get_dummy_ptr()) set_val_to_ptr(ptr, 123) assert get_dummy() == 123 set_val_to_ptr(ptr, 0) @@ -230,8 +219,16 @@ import sys from _ffi import CDLL, types libfoo = CDLL(self.libfoo_name) + + class MyPointerWrapper(object): + def __init__(self, value): + self.value = value + def _as_ffi_pointer_(self, ffitype): + assert ffitype is types.void_p + return self.value + is_null_ptr = libfoo.getfunc('is_null_ptr', [types.void_p], types.ulong) - assert not is_null_ptr(sys.maxint+1) + assert not is_null_ptr(MyPointerWrapper(sys.maxint+1)) def test_unsigned_long_args(self): """ _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit