[pypy-commit] cffi default: Add more tests for struct returns.
arigo
noreply at buildbot.pypy.org
Fri Jun 29 10:58:48 CEST 2012
Author: Armin Rigo <arigo at 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())
More information about the pypy-commit
mailing list