[pypy-commit] cffi cpy-extension: - One more step in the test.

arigo noreply at buildbot.pypy.org
Thu Jun 14 11:06:22 CEST 2012


Author: Armin Rigo <arigo at tunes.org>
Branch: cpy-extension
Changeset: r322:33174f82d210
Date: 2012-06-14 11:06 +0200
http://bitbucket.org/cffi/cffi/changeset/33174f82d210/

Log:	- One more step in the test.
	- Add some more tests.

diff --git a/cffi/cparser.py b/cffi/cparser.py
--- a/cffi/cparser.py
+++ b/cffi/cparser.py
@@ -3,6 +3,7 @@
 import pycparser, weakref, re
 
 _r_partial_enum = re.compile(r"\.\.\.\s*\}")
+_r_enum_dotdotdot = re.compile(r"__dotdotdot\d+__$")
 _parser_cache = None
 
 def _get_parser():
@@ -303,16 +304,22 @@
         if key in self._declarations:
             return self._declarations[key]
         if decls is not None:
-            enumerators = tuple([enum.name for enum in decls.enumerators])
+            enumerators = [enum.name for enum in decls.enumerators]
+            partial = False
+            if enumerators and _r_enum_dotdotdot.match(enumerators[-1]):
+                enumerators.pop()
+                partial = True
+            enumerators = tuple(enumerators)
             enumvalues = []
             nextenumvalue = 0
-            for enum in decls.enumerators:
+            for enum in decls.enumerators[:len(enumerators)]:
                 if enum.value is not None:
                     nextenumvalue = self._parse_constant(enum.value)
                 enumvalues.append(nextenumvalue)
                 nextenumvalue += 1
             enumvalues = tuple(enumvalues) 
             tp = model.EnumType(name, enumerators, enumvalues)
+            tp.partial = partial
             self._declare(key, tp)
         else:   # opaque enum
             enumerators = ()
diff --git a/cffi/model.py b/cffi/model.py
--- a/cffi/model.py
+++ b/cffi/model.py
@@ -228,6 +228,7 @@
 
 class EnumType(BaseType):
     _attrs_ = ('name',)
+    partial = False
 
     def __init__(self, name, enumerators, enumvalues):
         self.name = name
@@ -237,6 +238,12 @@
     def get_c_name(self, replace_with=''):
         return 'enum %s%s' % (self.name, replace_with)
 
+    def check_not_partial(self):
+        if self.partial:
+            from . import ffiplatform
+            raise ffiplatform.VerificationMissing(self.get_c_name())
+
     def new_backend_type(self, ffi):
+        self.check_not_partial()
         return ffi._backend.new_enum_type(self.name, self.enumerators,
                                           self.enumvalues)
diff --git a/testing/test_verify.py b/testing/test_verify.py
--- a/testing/test_verify.py
+++ b/testing/test_verify.py
@@ -138,6 +138,16 @@
                 py.test.raises(VerificationError, ffi.verify,
                                "typedef %s foo_t;" % real)
 
+def test_missing_typedef():
+    py.test.skip("in-progress")
+    ffi = FFI()
+    ffi.cdef("typedef ... foo_t; int bar(foo_t *);")
+    py.test.raises(VerificationMissing, ffi.new, "foo_t")
+    lib = ffi.verify("typedef struct foo_s { int x; } foo_t;\n"
+                     "int bar(foo_t *f) { return 42; }\n")
+    f = ffi.new("foo_t")
+    assert lib.bar(f) == 42
+
 
 def test_ffi_full_struct():
     ffi = FFI()
@@ -275,5 +285,22 @@
 def test_nonfull_enum():
     ffi = FFI()
     ffi.cdef("enum ee { EE1, EE2, EE3, ... \n \t };")
+    py.test.raises(VerificationMissing, ffi.cast, 'enum ee', 'EE2')
     py.test.skip("in-progress")
-    py.test.raises(VerificationMissing, ffi.cast, 'enum ee', 'EE2')
+    ffi.verify("enum ee { EE1=10, EE2, EE3=-10, EE4 };")
+    assert int(ffi.cast('enum ee', 'EE2')) == 11
+    assert int(ffi.cast('enum ee', 'EE3')) == -10
+    py.test.raises(AttributeError, ffi.cast, 'enum ee', '__dotdotdot0__')
+
+def test_full_enum():
+    py.test.skip("in-progress")
+    ffi = FFI()
+    ffi.cdef("enum ee { EE1, EE2, EE3 };")
+    ffi.verify("enum ee { EE1, EE2, EE3 };")
+    for real in [
+        "enum ee { EE1, EE2 };"
+        "enum ee { EE1, EE3, EE2 };"
+        ]:
+        py.test.raises(VerificationError, ffi.verify, real)
+    # extra items cannot be seen and have no bad consequence anyway
+    ffi.verify("enum ee { EE1, EE2, EE3, EE4 };")


More information about the pypy-commit mailing list