[pypy-commit] cffi default: Test and implementation (again) for verify().

arigo noreply at buildbot.pypy.org
Fri Jun 29 10:50:04 CEST 2012


Author: Armin Rigo <arigo at tunes.org>
Branch: 
Changeset: r564:a506f1856eb6
Date: 2012-06-29 10:49 +0200
http://bitbucket.org/cffi/cffi/changeset/a506f1856eb6/

Log:	Test and implementation (again) for verify().

diff --git a/c/_cffi_backend.c b/c/_cffi_backend.c
--- a/c/_cffi_backend.c
+++ b/c/_cffi_backend.c
@@ -3694,6 +3694,7 @@
     _cffi_from_c_char,
     convert_to_object,
     convert_from_object,
+    convert_struct_to_owning_object,
 };
 
 /************************************************************/
diff --git a/cffi/verifier.py b/cffi/verifier.py
--- a/cffi/verifier.py
+++ b/cffi/verifier.py
@@ -184,6 +184,9 @@
         elif isinstance(tp, model.ArrayType):
             return '_cffi_from_c_deref((char *)%s, _cffi_type(%d))' % (
                 var, self.gettypenum(tp))
+        elif isinstance(tp, model.StructType):
+            return '_cffi_from_c_struct((char *)&%s, _cffi_type(%d))' % (
+                var, self.gettypenum(tp))
         else:
             raise NotImplementedError(tp)
 
@@ -614,7 +617,9 @@
     ((PyObject *(*)(char *, CTypeDescrObject *))_cffi_exports[16])
 #define _cffi_to_c                                                       \
     ((int(*)(char *, CTypeDescrObject *, PyObject *))_cffi_exports[17])
-#define _CFFI_NUM_EXPORTS 18
+#define _cffi_from_c_struct                                              \
+    ((PyObject *(*)(char *, CTypeDescrObject *))_cffi_exports[18])
+#define _CFFI_NUM_EXPORTS 19
 
 #if SIZEOF_LONG < SIZEOF_LONG_LONG
 #  define _cffi_to_c_long_long PyLong_AsLongLong
diff --git a/testing/test_verify.py b/testing/test_verify.py
--- a/testing/test_verify.py
+++ b/testing/test_verify.py
@@ -576,3 +576,23 @@
     """)
     msg = 'cannot pass as a argument a struct that was completed with verify()'
     assert msg in str(e.value)
+
+def test_func_returns_struct():
+    ffi = FFI()
+    ffi.cdef("""
+        struct foo_s { int aa, bb; };
+        struct foo_s foo(int a, int b);
+    """)
+    lib = ffi.verify("""
+        struct foo_s { int aa, bb; };
+        struct foo_s foo(int a, int b) {
+            struct foo_s r;
+            r.aa = a*a;
+            r.bb = b*b;
+            return r;
+        }
+    """)
+    s = lib.foo(6, 7)
+    assert repr(s) == "<cdata 'struct foo_s' owning 8 bytes>"
+    assert s.aa == 36
+    assert s.bb == 49


More information about the pypy-commit mailing list