Author: Armin Rigo <ar...@tunes.org> Branch: Changeset: r400:08e97a7d719f Date: 2012-06-17 11:57 +0200 http://bitbucket.org/cffi/cffi/changeset/08e97a7d719f/
Log: Test and fix. diff --git a/cffi/cparser.py b/cffi/cparser.py --- a/cffi/cparser.py +++ b/cffi/cparser.py @@ -86,7 +86,6 @@ if (isinstance(decl.type.type, pycparser.c_ast.IdentifierType) and decl.type.type.names == ['__dotdotdot__']): realtype = model.unknown_type(decl.name) - self._declare('anonymous ' + decl.name, realtype) else: realtype = self._get_type(decl.type, name=decl.name) self._declare('typedef ' + decl.name, realtype) diff --git a/cffi/model.py b/cffi/model.py --- a/cffi/model.py +++ b/cffi/model.py @@ -268,7 +268,6 @@ def unknown_type(name): - tp = StructType('$%s' % name, [], [], []) - tp.partial = True + tp = StructType('$%s' % name, None, None, None) tp.forcename = name return tp diff --git a/testing/test_verify.py b/testing/test_verify.py --- a/testing/test_verify.py +++ b/testing/test_verify.py @@ -455,7 +455,11 @@ def test_unknown_type(): ffi = FFI() - ffi.cdef("typedef ... token_t; int foo(token_t *);") + ffi.cdef(""" + typedef ... token_t; + int foo(token_t *); + #define TOKEN_SIZE ... + """) lib = ffi.verify(""" typedef float token_t; static int foo(token_t *tk) { @@ -464,8 +468,19 @@ *tk += 1.601; return (int)*tk; } + #define TOKEN_SIZE sizeof(token_t) """) - tk = ffi.new("token_t") # zero-initialized + # we cannot let ffi.new("token_t") work, because we don't know ahead of + # time if it's ok to ask 'sizeof(token_t)' in the C code or not. + # See test_unknown_type_2. Workaround. + tkmem = ffi.new("char[]", lib.TOKEN_SIZE) # zero-initialized + tk = ffi.cast("token_t *", tkmem) results = [lib.foo(tk) for i in range(6)] assert results == [1, 3, 4, 6, 8, 9] assert lib.foo(None) == -42 + +def test_unknown_type_2(): + ffi = FFI() + ffi.cdef("typedef ... token_t;") + lib = ffi.verify("typedef struct token_s token_t;") + # assert did not crash, even though 'sizeof(token_t)' is not valid in C. _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit