Author: Armin Rigo <[email protected]>
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
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit