[pypy-commit] cffi linux-only: Verifying the typedefs, precisely enough to be able to

arigo noreply at buildbot.pypy.org
Tue Jun 12 10:09:51 CEST 2012


Author: Armin Rigo <arigo at tunes.org>
Branch: linux-only
Changeset: r281:64647cdf3f43
Date: 2012-06-12 10:09 +0200
http://bitbucket.org/cffi/cffi/changeset/64647cdf3f43/

Log:	Verifying the typedefs, precisely enough to be able to distinguish
	between "typedef int x" and "typedef long x" even if the sizes of
	"int" and "long" are the same.

diff --git a/c/_ffi_backend.c b/c/_ffi_backend.c
--- a/c/_ffi_backend.c
+++ b/c/_ffi_backend.c
@@ -1988,7 +1988,7 @@
         { "ptrdiff_t",     sizeof(ptrdiff_t) },
         { "size_t",        sizeof(size_t) | UNSIGNED },
         { "ssize_t",       sizeof(ssize_t) },
-        { "wchar_t",       sizeof(wchar_t) | UNSIGNED },
+        /*{ "wchar_t",       sizeof(wchar_t) | UNSIGNED },*/
         { NULL }
     };
 #undef UNSIGNED
diff --git a/cffi/backend_ctypes.py b/cffi/backend_ctypes.py
--- a/cffi/backend_ctypes.py
+++ b/cffi/backend_ctypes.py
@@ -208,8 +208,8 @@
             if size == ctypes.sizeof(ctypes.c_size_t):
                 result['size_t'] = size | UNSIGNED
                 result['ssize_t'] = size
-            if size == ctypes.sizeof(ctypes.c_wchar):
-                result['wchar_t'] = size | UNSIGNED
+            #if size == ctypes.sizeof(ctypes.c_wchar):
+            #    result['wchar_t'] = size | UNSIGNED
         return result
 
     def load_library(self, path):
diff --git a/cffi/model.py b/cffi/model.py
--- a/cffi/model.py
+++ b/cffi/model.py
@@ -26,9 +26,10 @@
         except KeyError:
             return self.new_backend_type(ffi, *args)
 
-    def verifier_declare(self, verifier, kind, name):
-        # nothing to see here
-        pass
+    def verifier_declare_typedef(self, verifier, name):
+        verifier.write('{ %s = (%s**)0; }' % (
+            self.get_c_name('** result'), name))
+
 
 class VoidType(BaseType):
     _attrs_ = ()
@@ -78,10 +79,9 @@
     def new_backend_type(self, ffi, result, *args):
         return ffi._backend.new_function_type(args, result, self.ellipsis)
 
-    def verifier_declare(self, verifier, kind, name):
-        if kind == 'function':
-            verifier.write('  { %s = %s; }\n' % (
-                self.get_c_name('result'), name))
+    def verifier_declare_function(self, verifier, name):
+        verifier.write('{ %s = %s; }' % (
+            self.get_c_name('result'), name))
 
 
 class PointerType(BaseType):
@@ -169,9 +169,7 @@
         self.check_not_partial()
         return ffi._backend.new_struct_type(self.name)
 
-    def verifier_declare(self, verifier, kind, name):
-        if kind != 'struct':
-            return
+    def verifier_declare_struct(self, verifier, name):
         if self.fldnames is None:
             assert not self.partial
             return
diff --git a/cffi/verifier.py b/cffi/verifier.py
--- a/cffi/verifier.py
+++ b/cffi/verifier.py
@@ -21,12 +21,14 @@
             f.write('#include <stdio.h>\n')
             f.write('#include <stdint.h>\n')
             f.write('#include <stddef.h>\n')
+            f.write('#include <unistd.h>\n')
             f.write(preamble + "\n\n")
             f.write('int main() {\n')
             self.f = f
             for name, tp in ffi._parser._declarations.iteritems():
                 kind, realname = name.split(' ', 1)
-                tp.verifier_declare(self, kind, realname)
+                method = getattr(tp, 'verifier_declare_' + kind)
+                method(self, realname)
             del self.f
             f.write('  return 0;\n')
             f.write('}\n')
diff --git a/testing/test_verify.py b/testing/test_verify.py
--- a/testing/test_verify.py
+++ b/testing/test_verify.py
@@ -24,6 +24,19 @@
     ffi.verify("#include <string.h>")
 
 
+def test_verify_typedefs():
+    types = ['signed char', 'unsigned char', 'int', 'long']
+    for cdefed in types:
+        for real in types:
+            ffi = FFI()
+            ffi.cdef("typedef %s foo_t;" % cdefed)
+            if cdefed == real:
+                ffi.verify("typedef %s foo_t;" % real)
+            else:
+                py.test.raises(VerificationError, ffi.verify,
+                               "typedef %s foo_t;" % real)
+
+
 def test_ffi_nonfull_struct():
     py.test.skip("XXX")
     ffi = FFI()


More information about the pypy-commit mailing list