Author: Armin Rigo <ar...@tunes.org> Branch: Changeset: r1105:758d9da5cebb Date: 2012-12-29 15:53 +0100 http://bitbucket.org/cffi/cffi/changeset/758d9da5cebb/
Log: Fix issue #44: ffi.new/cast("undefined") raises confusing exception. diff --git a/cffi/cparser.py b/cffi/cparser.py --- a/cffi/cparser.py +++ b/cffi/cparser.py @@ -188,10 +188,12 @@ self._declare('variable ' + decl.name, tp) def parse_type(self, cdecl, consider_function_as_funcptr=False): - ast, macros = self._parse('void __dummy(%s);' % cdecl) + ast, macros = self._parse('void __dummy(\n%s\n);' % cdecl) assert not macros - typenode = ast.ext[-1].type.args.params[0].type - return self._get_type(typenode, + exprnode = ast.ext[-1].type.args.params[0] + if isinstance(exprnode, pycparser.c_ast.ID): + raise api.CDefError("unknown identifier '%s'" % (exprnode.name,)) + return self._get_type(exprnode.type, consider_function_as_funcptr=consider_function_as_funcptr) def _declare(self, name, obj): diff --git a/testing/backend_tests.py b/testing/backend_tests.py --- a/testing/backend_tests.py +++ b/testing/backend_tests.py @@ -1488,7 +1488,7 @@ ffi1 = FFI(backend=backend) ffi2 = FFI(backend=backend) ffi1.cdef("typedef signed char schar_t;") - py.test.raises((AttributeError, TypeError), ffi2.cast, "schar_t", 142) + py.test.raises(CDefError, ffi2.cast, "schar_t", 142) def test_include_typedef(self): backend = self.Backend() diff --git a/testing/test_parsing.py b/testing/test_parsing.py --- a/testing/test_parsing.py +++ b/testing/test_parsing.py @@ -199,3 +199,12 @@ assert str(e.value) == ( "enum foo_e: the '{}' declaration should appear on the " "first time the enum is mentioned, not later") + +def test_unknown_name(): + ffi = FFI() + e = py.test.raises(CDefError, ffi.cast, "foobarbazunknown", 0) + assert str(e.value) == "unknown identifier 'foobarbazunknown'" + e = py.test.raises(CDefError, ffi.cast, "foobarbazunknown*", 0) + assert str(e.value).startswith('cannot parse "foobarbazunknown*"') + e = py.test.raises(CDefError, ffi.cast, "int(*)(foobarbazunknown)", 0) + assert str(e.value).startswith('cannot parse "int(*)(foobarbazunknown)"') _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit