Author: Armin Rigo <ar...@tunes.org> Branch: Changeset: r566:c2e7a851edcb Date: 2012-06-29 10:58 +0200 http://bitbucket.org/cffi/cffi/changeset/c2e7a851edcb/
Log: Add more tests for struct returns. diff --git a/c/_cffi_backend.c b/c/_cffi_backend.c --- a/c/_cffi_backend.c +++ b/c/_cffi_backend.c @@ -3523,6 +3523,33 @@ return result; } +struct _testfunc11_s { int a1, a2; }; +static struct _testfunc11_s _testfunc11(int n) +{ + struct _testfunc11_s result; + result.a1 = n; + result.a2 = n * n; + return result; +} + +struct _testfunc12_s { double a1; }; +static struct _testfunc12_s _testfunc12(int n) +{ + struct _testfunc12_s result; + result.a1 = n; + return result; +} + +struct _testfunc13_s { int a1, a2, a3; }; +static struct _testfunc13_s _testfunc13(int n) +{ + struct _testfunc13_s result; + result.a1 = n; + result.a2 = n * n; + result.a3 = n * n * n; + return result; +} + static PyObject *b__testfunc(PyObject *self, PyObject *args) { /* for testing only */ @@ -3542,6 +3569,9 @@ case 8: f = stderr; break; case 9: f = &_testfunc9; break; case 10: f = &_testfunc10; break; + case 11: f = &_testfunc11; break; + case 12: f = &_testfunc12; break; + case 13: f = &_testfunc13; break; default: PyErr_SetNone(PyExc_ValueError); return NULL; diff --git a/c/test_c.py b/c/test_c.py --- a/c/test_c.py +++ b/c/test_c.py @@ -1171,6 +1171,7 @@ def test_struct_return_in_func(): BChar = new_primitive_type("char") BShort = new_primitive_type("short") + BDouble = new_primitive_type("double") BInt = new_primitive_type("int") BStruct = new_struct_type("foo_s") complete_struct_or_union(BStruct, [('a1', BChar, -1), @@ -1181,6 +1182,37 @@ assert repr(s) == "<cdata 'struct foo_s' owning 4 bytes>" assert s.a1 == chr(40) assert s.a2 == 40 * 40 + # + BStruct11 = new_struct_type("test11") + complete_struct_or_union(BStruct11, [('a1', BInt, -1), + ('a2', BInt, -1)]) + BFunc11 = new_function_type((BInt,), BStruct11) + f = cast(BFunc11, _testfunc(11)) + s = f(40) + assert repr(s) == "<cdata 'struct test11' owning 8 bytes>" + assert s.a1 == 40 + assert s.a2 == 40 * 40 + # + BStruct12 = new_struct_type("test12") + complete_struct_or_union(BStruct12, [('a1', BDouble, -1), + ]) + BFunc12 = new_function_type((BInt,), BStruct12) + f = cast(BFunc12, _testfunc(12)) + s = f(40) + assert repr(s) == "<cdata 'struct test12' owning 8 bytes>" + assert s.a1 == 40.0 + # + BStruct13 = new_struct_type("test13") + complete_struct_or_union(BStruct13, [('a1', BInt, -1), + ('a2', BInt, -1), + ('a3', BInt, -1)]) + BFunc13 = new_function_type((BInt,), BStruct13) + f = cast(BFunc13, _testfunc(13)) + s = f(40) + assert repr(s) == "<cdata 'struct test13' owning 12 bytes>" + assert s.a1 == 40 + assert s.a2 == 40 * 40 + assert s.a3 == 40 * 40 * 40 def test_cast_with_functionptr(): BFunc = new_function_type((), new_void_type()) _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit