[pypy-commit] cffi default: Explicitly complain if we find 'typedef int... t; ' in a call to verify()

arigo noreply at buildbot.pypy.org
Mon Jun 15 09:03:37 CEST 2015


Author: Armin Rigo <arigo at tunes.org>
Branch: 
Changeset: r2186:17be464b073d
Date: 2015-06-15 09:04 +0200
http://bitbucket.org/cffi/cffi/changeset/17be464b073d/

Log:	Explicitly complain if we find 'typedef int... t;' in a call to
	verify()

diff --git a/cffi/cparser.py b/cffi/cparser.py
--- a/cffi/cparser.py
+++ b/cffi/cparser.py
@@ -102,6 +102,7 @@
         self._packed = False
         self._int_constants = {}
         self._recomplete = []
+        self._uses_new_feature = None
 
     def _parse(self, csource):
         csource, macros = _preprocess(csource)
@@ -648,4 +649,7 @@
         for t in typenames[:-1]:
             if t not in ['int', 'short', 'long', 'signed', 'unsigned', 'char']:
                 raise api.FFIError(':%d: bad usage of "..."' % decl.coord.line)
+        if self._uses_new_feature is None:
+            self._uses_new_feature = "'typedef %s... %s'" % (
+                ' '.join(typenames[:-1]), decl.name)
         return model.UnknownIntegerType(decl.name)
diff --git a/cffi/verifier.py b/cffi/verifier.py
--- a/cffi/verifier.py
+++ b/cffi/verifier.py
@@ -28,6 +28,10 @@
     def __init__(self, ffi, preamble, tmpdir=None, modulename=None,
                  ext_package=None, tag='', force_generic_engine=False,
                  source_extension='.c', flags=None, relative_to=None, **kwds):
+        if ffi._parser._uses_new_feature:
+            raise ffiplatform.VerificationError(
+                "feature not supported with ffi.verify(), but only "
+                "with ffi.set_source(): %s" % (ffi._parser._uses_new_feature,))
         self.ffi = ffi
         self.preamble = preamble
         if not modulename:
diff --git a/testing/cffi0/test_verify.py b/testing/cffi0/test_verify.py
--- a/testing/cffi0/test_verify.py
+++ b/testing/cffi0/test_verify.py
@@ -2235,3 +2235,15 @@
                      "const T myglob = { 0.1, 42 };")
     assert ffi.typeof(lib.myglob) == ffi.typeof("T")
     assert lib.myglob.x == 42
+
+def test_dont_support_int_dotdotdot():
+    ffi = FFI()
+    ffi.cdef("typedef int... t1;")
+    e = py.test.raises(VerificationError, ffi.verify, "")
+    assert str(e.value) == ("feature not supported with ffi.verify(), but only "
+                            "with ffi.set_source(): 'typedef int... t1'")
+    ffi = FFI()
+    ffi.cdef("typedef unsigned long... t1;")
+    e = py.test.raises(VerificationError, ffi.verify, "")
+    assert str(e.value) == ("feature not supported with ffi.verify(), but only "
+                         "with ffi.set_source(): 'typedef unsigned long... t1'")


More information about the pypy-commit mailing list