Author: Armin Rigo <ar...@tunes.org> Branch: linux-only Changeset: r276:fa4cf4de5635 Date: 2012-06-08 10:50 +0200 http://bitbucket.org/cffi/cffi/changeset/fa4cf4de5635/
Log: Random check-in changing things here and there. diff --git a/cffi/api.py b/cffi/api.py --- a/cffi/api.py +++ b/cffi/api.py @@ -89,7 +89,7 @@ return self._parsed_types[cdecl] except KeyError: type = self._parser.parse_type(cdecl) - btype = type.get_backend_type(self) + btype = self._get_cached_btype(type) self._parsed_types[cdecl] = btype return btype else: @@ -141,7 +141,7 @@ BType = self._new_types[cdecl] except KeyError: type = self._parser.parse_type(cdecl, force_pointer=True) - BType = type.get_backend_type(self) + BType = self._get_cached_btype(type) self._new_types[cdecl] = BType # return self._backend.newp(BType, init) diff --git a/cffi/cparser.py b/cffi/cparser.py --- a/cffi/cparser.py +++ b/cffi/cparser.py @@ -56,8 +56,7 @@ if decl.name: self._declare('variable ' + decl.name, self._get_type(node)) - def parse_type(self, cdecl, force_pointer=False, - convert_array_to_pointer=False): + def parse_type(self, cdecl, force_pointer=False): # XXX: for more efficiency we would need to poke into the # internals of CParser... the following registers the # typedefs, because their presence or absence influences the @@ -70,8 +69,7 @@ csourcelines.append('void __dummy(%s);' % cdecl) ast = _get_parser().parse('\n'.join(csourcelines)) typenode = ast.ext[-1].type.args.params[0].type - return self._get_type(typenode, force_pointer=force_pointer, - convert_array_to_pointer=convert_array_to_pointer) + return self._get_type(typenode, force_pointer=force_pointer) def _declare(self, name, obj): if name in self._declarations: @@ -152,7 +150,7 @@ # raise api.FFIError("bad or unsupported type declaration") - def _parse_function_type(self, typenode, name=None): + def _parse_function_type(self, typenode, funcname=None): params = list(getattr(typenode.args, 'params', [])) ellipsis = ( len(params) > 0 and @@ -171,7 +169,7 @@ convert_array_to_pointer=True) for argdeclnode in params] result = self._get_type(typenode.type) - return model.FunctionType(name, tuple(args), result, ellipsis) + return model.FunctionType(tuple(args), result, ellipsis) def _get_struct_or_union_type(self, kind, type, typenode=None): # First, a level of caching on the exact 'type' node of the AST. diff --git a/cffi/ffiplatform.py b/cffi/ffiplatform.py --- a/cffi/ffiplatform.py +++ b/cffi/ffiplatform.py @@ -1,5 +1,4 @@ -from platformer import udir class VerificationError(Exception): """ An error raised when verification fails diff --git a/cffi/model.py b/cffi/model.py --- a/cffi/model.py +++ b/cffi/model.py @@ -1,5 +1,9 @@ class BaseType(object): + + def __repr__(self): + return '<%s>' % (self.get_c_name(),) + def __eq__(self, other): return (self.__class__ == other.__class__ and self._get_items() == other._get_items()) @@ -22,23 +26,19 @@ except KeyError: return self.new_backend_type(ffi, *args) - def get_backend_type(self, ffi): - return ffi._get_cached_btype(self) - def verifier_declare(self, verifier, f): # nothing to see here pass class VoidType(BaseType): _attrs_ = () - name = 'void' - + + def get_c_name(self, replace_with=''): + return 'void' + replace_with + def new_backend_type(self, ffi): return ffi._backend.new_void_type() - def __repr__(self): - return '<void>' - void_type = VoidType() class PrimitiveType(BaseType): @@ -47,26 +47,26 @@ def __init__(self, name): self.name = name + def get_c_name(self, replace_with=''): + return self.name + replace_with + def new_backend_type(self, ffi): return ffi._backend.new_primitive_type(self.name) - def __repr__(self): - return '<%s>' % (self.name,) - class FunctionType(BaseType): _attrs_ = ('args', 'result', 'ellipsis') - def __init__(self, name, args, result, ellipsis): - self.name = name # can be None in case it's an empty type + def __init__(self, args, result, ellipsis): self.args = args self.result = result self.ellipsis = ellipsis - def __repr__(self): - args = ', '.join([repr(x) for x in self.args]) + def get_c_name(self, replace_with=''): + reprargs = [arg.get_c_name() for arg in self.args] if self.ellipsis: - return '<(%s, ...) -> %r>' % (args, self.result) - return '<(%s) -> %r>' % (args, self.result) + reprargs.append('...') + replace_with = '(*%s)(%s)' % (replace_with, ', '.join(reprargs)) + return self.result.get_c_name(replace_with) def prepare_backend_type(self, ffi): args = [ffi._get_cached_btype(self.result)] @@ -83,9 +83,8 @@ for arg in self.args: args.append(arg.name) args = ', '.join(args) - f.write(' %s(* res%d)(%s) = %s;\n' % (restype, verifier.rescount, - args, self.name)) - verifier.rescount += 1 + f.write(' { %s(* result)(%s) = %s; }\n' % (restype, + args, self.name)) class PointerType(BaseType): _attrs_ = ('totype',) @@ -93,32 +92,34 @@ def __init__(self, totype): self.totype = totype + def get_c_name(self, replace_with=''): + return self.totype.get_c_name('* ' + replace_with) + def prepare_backend_type(self, ffi): return (ffi._get_cached_btype(self.totype),) def new_backend_type(self, ffi, BItem): return ffi._backend.new_pointer_type(BItem) - def __repr__(self): - return '<*%r>' % (self.totype,) - class ArrayType(BaseType): _attrs_ = ('item', 'length') def __init__(self, item, length): - self.item = PointerType(item) # XXX why is this pointer? + self.item = item self.length = length - def __repr__(self): + def get_c_name(self, replace_with=''): if self.length is None: - return '<%r[]>' % (self.item,) - return '<%r[%s]>' % (self.item, self.length) + brackets = '[]' + else: + brackets = '[%d]' % self.length + return self.item.get_c_name(replace_with + brackets) def prepare_backend_type(self, ffi): - return (ffi._get_cached_btype(self.item),) + return (ffi._get_cached_btype(PointerType(self.item)),) - def new_backend_type(self, ffi, BItem): - return ffi._backend.new_array_type(BItem, self.length) + def new_backend_type(self, ffi, BPtrItem): + return ffi._backend.new_array_type(BPtrItem, self.length) class StructOrUnion(BaseType): _attrs_ = ('name',) @@ -129,12 +130,8 @@ self.fldtypes = fldtypes self.fldbitsize = fldbitsize - def __repr__(self): - if self.fldnames is None: - return '<struct %s>' % (self.name,) - fldrepr = ', '.join(['%s: %r' % (name, tp) for name, tp in - zip(self.fldnames, self.fldtypes)]) - return '<struct %s {%s}>' % (self.name, fldrepr) + def get_c_name(self, replace_with=''): + return '%s %s%s' % (self.kind, self.name, replace_with) def prepare_backend_type(self, ffi): BType = self.get_btype(ffi) @@ -150,6 +147,8 @@ return BType class StructType(StructOrUnion): + kind = 'struct' + def get_btype(self, ffi): return ffi._backend.new_struct_type(self.name) @@ -162,6 +161,8 @@ verifier._write_printf(f, 'END struct %s' % self.name) class UnionType(StructOrUnion): + kind = 'union' + def get_btype(self, ffi): return ffi._backend.new_union_type(self.name) @@ -173,6 +174,9 @@ self.enumerators = enumerators self.enumvalues = enumvalues + def get_c_name(self, replace_with=''): + return 'enum %s%s' % (self.name, replace_with) + def new_backend_type(self, ffi): return ffi._backend.new_enum_type(self.name, self.enumerators, self.enumvalues) diff --git a/cffi/verifier.py b/cffi/verifier.py --- a/cffi/verifier.py +++ b/cffi/verifier.py @@ -1,10 +1,7 @@ -from platformer import platform, ExternalCompilationInfo from . import ffiplatform class Verifier(object): - def __init__(self): - self.rescount = 0 def _write_printf(f, what, *args): if not args: diff --git a/testing/test_verify.py b/testing/test_verify.py --- a/testing/test_verify.py +++ b/testing/test_verify.py @@ -1,21 +1,19 @@ - import py -from cffi import FFI -from platformer import CompilationError +from cffi import FFI, VerificationError def test_simple_verify(): ffi = FFI() ffi.cdef("void some_completely_unknown_function();") - py.test.raises(CompilationError, ffi.verify) + py.test.raises(VerificationError, ffi.verify) ffi = FFI() ffi.cdef("double sin(double x);") # omission of math.h - py.test.raises(CompilationError, ffi.verify) + py.test.raises(VerificationError, ffi.verify) assert ffi.verify('#include <math.h>') is None # ffi = FFI() ffi.cdef("float sin(double x);") - py.test.raises(CompilationError, ffi.verify, '#include <math.h>') + py.test.raises(VerificationError, ffi.verify, '#include <math.h>') ffi = FFI() ffi.cdef("double sin(float x);") - py.test.raises(CompilationError, ffi.verify, '#include <math.h>') + py.test.raises(VerificationError, ffi.verify, '#include <math.h>') _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit