Author: Armin Rigo <ar...@tunes.org> Branch: ffi-backend Changeset: r56574:affcac045afa Date: 2012-08-04 18:49 +0200 http://bitbucket.org/pypy/pypy/changeset/affcac045afa/
Log: Update from cffi and add the same special case. diff --git a/pypy/module/_cffi_backend/ctypeptr.py b/pypy/module/_cffi_backend/ctypeptr.py --- a/pypy/module/_cffi_backend/ctypeptr.py +++ b/pypy/module/_cffi_backend/ctypeptr.py @@ -272,7 +272,17 @@ return True else: set_mustfree_flag(cdata, False) - self.convert_from_object(cdata, w_ob) + try: + self.convert_from_object(cdata, w_ob) + except OperationError: + if (self.is_struct_ptr and isinstance(ob, cdataobj.W_CData) + and ob.ctype is self.ctitem): + # special case to make the life of verifier.py easier: + # if the formal argument type is 'struct foo *' but + # we pass a 'struct foo', then get a pointer to it + rffi.cast(rffi.CCHARPP, cdata)[0] = ob._cdata + else: + raise return False def getcfield(self, attr): diff --git a/pypy/module/_cffi_backend/test/_backend_test_c.py b/pypy/module/_cffi_backend/test/_backend_test_c.py --- a/pypy/module/_cffi_backend/test/_backend_test_c.py +++ b/pypy/module/_cffi_backend/test/_backend_test_c.py @@ -791,6 +791,22 @@ res = f(x[0]) assert res == -4042 + ord('A') +def test_call_function_20(): + BChar = new_primitive_type("char") + BShort = new_primitive_type("short") + BStruct = new_struct_type("foo") + BStructPtr = new_pointer_type(BStruct) + complete_struct_or_union(BStruct, [('a1', BChar, -1), + ('a2', BShort, -1)]) + BFunc18 = new_function_type((BStructPtr,), BShort, False) + f = cast(BFunc18, _testfunc(20)) + x = newp(BStructPtr, {'a1': 'A', 'a2': -4042}) + # test the exception that allows us to pass a 'struct foo' where the + # function really expects a 'struct foo *'. + res = f(x[0]) + assert res == -4042 + ord('A') + assert res == f(x) + def test_call_function_9(): BInt = new_primitive_type("int") BFunc9 = new_function_type((BInt,), BInt, True) # vararg diff --git a/pypy/module/_cffi_backend/test/_test_lib.c b/pypy/module/_cffi_backend/test/_test_lib.c --- a/pypy/module/_cffi_backend/test/_test_lib.c +++ b/pypy/module/_cffi_backend/test/_test_lib.c @@ -135,6 +135,11 @@ return x; } +static short _testfunc20(struct _testfunc7_s *ptr) +{ + return ptr->a1 + ptr->a2; +} + void *gettestfunc(int num) { void *f; @@ -159,6 +164,7 @@ case 17: f = &_testfunc17; break; case 18: f = &_testfunc18; break; case 19: f = &_testfunc19; break; + case 20: f = &_testfunc20; break; default: return NULL; } _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit