Author: Armin Rigo <ar...@tunes.org> Branch: thread-safe Changeset: r1401:d13bbbfc83fc Date: 2013-11-09 14:01 +0100 http://bitbucket.org/cffi/cffi/changeset/d13bbbfc83fc/
Log: hg merge default diff --git a/cffi/api.py b/cffi/api.py --- a/cffi/api.py +++ b/cffi/api.py @@ -117,18 +117,23 @@ def _typeof(self, cdecl, consider_function_as_funcptr=False): # string -> ctype object try: - btype, cfaf = self._parsed_types[cdecl] - if consider_function_as_funcptr and not cfaf: - raise KeyError + btype, really_a_function_type = self._parsed_types[cdecl] except KeyError: key = cdecl if not isinstance(cdecl, str): # unicode, on Python 2 cdecl = cdecl.encode('ascii') - cfaf = consider_function_as_funcptr - type = self._parser.parse_type(cdecl, - consider_function_as_funcptr=cfaf) + type = self._parser.parse_type(cdecl) + if hasattr(type, 'as_function_pointer'): + really_a_function_type = True + type = type.as_function_pointer() + else: + really_a_function_type = False btype = self._get_cached_btype(type) - self._parsed_types[key] = btype, cfaf + self._parsed_types[key] = btype, really_a_function_type + # + if really_a_function_type and not consider_function_as_funcptr: + raise CDefError("the type %r is a function type, not a " + "pointer-to-function type" % (cdecl,)) return btype def typeof(self, cdecl): diff --git a/cffi/cparser.py b/cffi/cparser.py --- a/cffi/cparser.py +++ b/cffi/cparser.py @@ -222,14 +222,13 @@ else: self._declare('variable ' + decl.name, tp) - def parse_type(self, cdecl, consider_function_as_funcptr=False): + def parse_type(self, cdecl): ast, macros = self._parse('void __dummy(\n%s\n);' % cdecl) assert not macros 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) + return self._get_type(exprnode.type) def _declare(self, name, obj): if name in self._declarations: @@ -249,28 +248,17 @@ return model.ConstPointerType(type) return model.PointerType(type) - def _get_type(self, typenode, convert_array_to_pointer=False, - name=None, partial_length_ok=False, - consider_function_as_funcptr=False): + def _get_type(self, typenode, name=None, partial_length_ok=False): # first, dereference typedefs, if we have it already parsed, we're good if (isinstance(typenode, pycparser.c_ast.TypeDecl) and isinstance(typenode.type, pycparser.c_ast.IdentifierType) and len(typenode.type.names) == 1 and ('typedef ' + typenode.type.names[0]) in self._declarations): type = self._declarations['typedef ' + typenode.type.names[0]] - if isinstance(type, model.ArrayType): - if convert_array_to_pointer: - return type.item - else: - if (consider_function_as_funcptr and - isinstance(type, model.RawFunctionType)): - return type.as_function_pointer() return type # if isinstance(typenode, pycparser.c_ast.ArrayDecl): # array type - if convert_array_to_pointer: - return self._get_type_pointer(self._get_type(typenode.type)) if typenode.dim is None: length = None else: @@ -331,10 +319,7 @@ # if isinstance(typenode, pycparser.c_ast.FuncDecl): # a function type - result = self._parse_function_type(typenode, name) - if consider_function_as_funcptr: - result = result.as_function_pointer() - return result + return self._parse_function_type(typenode, name) # # nested anonymous structs or unions end up here if isinstance(typenode, pycparser.c_ast.Struct): @@ -365,13 +350,19 @@ isinstance(params[0].type.type, pycparser.c_ast.IdentifierType) and list(params[0].type.type.names) == ['void']): del params[0] - args = [self._get_type(argdeclnode.type, - convert_array_to_pointer=True, - consider_function_as_funcptr=True) + args = [self._as_func_arg(self._get_type(argdeclnode.type)) for argdeclnode in params] result = self._get_type(typenode.type) return model.RawFunctionType(tuple(args), result, ellipsis) + def _as_func_arg(self, type): + if isinstance(type, model.ArrayType): + return model.PointerType(type.item) + elif isinstance(type, model.RawFunctionType): + return type.as_function_pointer() + else: + return type + def _is_constant_globalvar(self, typenode): if isinstance(typenode, pycparser.c_ast.PtrDecl): return 'const' in typenode.quals _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit