Example #1
0
    def __init__(self, database):        
        self.database = database
        self.types = {
            lltype.Char: "i8",
            lltype.Bool: "i1",
            lltype.SingleFloat: "float",
            lltype.Float: "double",
            lltype.UniChar: "i32",
            lltype.Void: "void",
            lltype.UnsignedLongLong: "i64",
            lltype.SignedLongLong: "i64",
            llmemory.Address: "i8*",
            }

        # 32 bit platform
        if sys.maxint == 2**31-1:
            self.types.update({
                lltype.Signed: "i32",
                lltype.Unsigned: "i32" })
            
        # 64 bit platform
        elif sys.maxint == 2**63-1:        
            self.types.update({
                lltype.Signed: "i64",
                lltype.Unsigned: "i64" })            
        else:
            raise Exception("Unsupported platform - unknown word size")

        self.reprs = {
            lltype.SignedLongLong : self.repr_signed,
            lltype.Signed : self.repr_signed,
            lltype.UnsignedLongLong : self.repr_default,
            lltype.Unsigned : self.repr_default,
            lltype.SingleFloat: self.repr_singlefloat,
            lltype.Float : self.repr_float,
            lltype.Char : self.repr_char,
            lltype.UniChar : self.repr_unichar,
            lltype.Bool : self.repr_bool,
            lltype.Void : self.repr_void,
            llmemory.Address : self.repr_address,
            }        

        try:
            import ctypes
        except ImportError:
            pass
        else:
            def update(from_, type):
                if from_ not in self.types:
                    self.types[from_] = type
                if from_ not in self.reprs:
                    self.reprs[from_] = self.repr_default

            for tp in [rffi.SIGNEDCHAR, rffi.UCHAR, rffi.SHORT,
                       rffi.USHORT, rffi.INT, rffi.UINT, rffi.LONG, rffi.ULONG,
                       rffi.LONGLONG, rffi.ULONGLONG]:
                bits = rffi.size_and_sign(tp)[0] * 8
                update(tp, 'i%s' % bits)
Example #2
0
    def build_result(self, info, config_result):
        if self.ifdef is not None:
            if not info['defined']:
                return None
        layout = [None] * info['size']
        for fieldname, fieldtype in self.interesting_fields:
            if isinstance(fieldtype, Struct):
                offset = info['fldofs ' + fieldname]
                size = info['fldsize ' + fieldname]
                c_fieldtype = config_result.get_entry_result(fieldtype)
                layout_addfield(layout, offset, c_fieldtype, fieldname)
            else:
                offset = info['fldofs ' + fieldname]
                size = info['fldsize ' + fieldname]
                sign = info.get('fldunsigned ' + fieldname, False)
                if (size, sign) != rffi.size_and_sign(fieldtype):
                    fieldtype = fixup_ctype(fieldtype, fieldname, (size, sign))
                layout_addfield(layout, offset, fieldtype, fieldname)

        n = 0
        padfields = []
        for i, cell in enumerate(layout):
            if cell is not None:
                continue
            name = '_pad%d' % (n, )
            layout_addfield(layout, i, rffi.UCHAR, name)
            padfields.append('c_' + name)
            n += 1

        # build the lltype Structure
        seen = {}
        fields = []
        fieldoffsets = []
        for offset, cell in enumerate(layout):
            if cell in seen:
                continue
            fields.append((cell.name, cell.ctype))
            fieldoffsets.append(offset)
            seen[cell] = True

        allfields = tuple(['c_' + name for name, _ in fields])
        padfields = tuple(padfields)
        name = self.name
        padding_drop = PaddingDrop(name, allfields, padfields,
                                   config_result.CConfig._compilation_info_)
        hints = {
            'align': info['align'],
            'size': info['size'],
            'fieldoffsets': tuple(fieldoffsets),
            'padding': padfields,
            'get_padding_drop': padding_drop
        }
        if name.startswith('struct '):
            name = name[7:]
        else:
            hints['typedef'] = True
        kwds = {'hints': hints}
        return rffi.CStruct(name, *fields, **kwds)
Example #3
0
 def build_result(self, info, config_result):
     if self.ifdef is not None and not info['defined']:
         return None
     size = info['size']
     sign = info.get('unsigned', False)
     ctype = self.ctype_hint
     if (size, sign) != rffi.size_and_sign(ctype):
         ctype = fixup_ctype(ctype, self.name, (size, sign))
     return ctype
Example #4
0
    def build_result(self, info, config_result):
        if self.ifdef is not None:
            if not info["defined"]:
                return None
        layout = [None] * info["size"]
        for fieldname, fieldtype in self.interesting_fields:
            if isinstance(fieldtype, Struct):
                offset = info["fldofs " + fieldname]
                size = info["fldsize " + fieldname]
                c_fieldtype = config_result.get_entry_result(fieldtype)
                layout_addfield(layout, offset, c_fieldtype, fieldname)
            else:
                offset = info["fldofs " + fieldname]
                size = info["fldsize " + fieldname]
                sign = info.get("fldunsigned " + fieldname, False)
                if (size, sign) != rffi.size_and_sign(fieldtype):
                    fieldtype = fixup_ctype(fieldtype, fieldname, (size, sign))
                layout_addfield(layout, offset, fieldtype, fieldname)

        n = 0
        padfields = []
        for i, cell in enumerate(layout):
            if cell is not None:
                continue
            name = "_pad%d" % (n,)
            layout_addfield(layout, i, rffi.UCHAR, name)
            padfields.append("c_" + name)
            n += 1

        # build the lltype Structure
        seen = {}
        fields = []
        fieldoffsets = []
        for offset, cell in enumerate(layout):
            if cell in seen:
                continue
            fields.append((cell.name, cell.ctype))
            fieldoffsets.append(offset)
            seen[cell] = True

        allfields = tuple(["c_" + name for name, _ in fields])
        padfields = tuple(padfields)
        name = self.name
        padding_drop = PaddingDrop(name, allfields, padfields, config_result.CConfig._compilation_info_)
        hints = {
            "align": info["align"],
            "size": info["size"],
            "fieldoffsets": tuple(fieldoffsets),
            "padding": padfields,
            "get_padding_drop": padding_drop,
        }
        if name.startswith("struct "):
            name = name[7:]
        else:
            hints["typedef"] = True
        kwds = {"hints": hints}
        return rffi.CStruct(name, *fields, **kwds)
Example #5
0
 def build_result(self, info, config_result):
     if self.ifdef is not None and not info['defined']:
         return None
     size = info['size']
     sign = info.get('unsigned', False)
     ctype = self.ctype_hint
     if (size, sign) != rffi.size_and_sign(ctype):
         ctype = fixup_ctype(ctype, self.name, (size, sign))
     return ctype
Example #6
0
    def build_result(self, info, config_result):
        if self.ifdef is not None:
            if not info['defined']:
                return None
        layout = [None] * info['size']
        for fieldname, fieldtype in self.interesting_fields:
            if isinstance(fieldtype, Struct):
                offset = info['fldofs '  + fieldname]
                size   = info['fldsize ' + fieldname]
                c_fieldtype = config_result.get_entry_result(fieldtype)
                layout_addfield(layout, offset, c_fieldtype, fieldname)
            else:
                offset = info['fldofs '  + fieldname]
                size   = info['fldsize ' + fieldname]
                sign   = info.get('fldunsigned ' + fieldname, False)
                if (size, sign) != rffi.size_and_sign(fieldtype):
                    fieldtype = fixup_ctype(fieldtype, fieldname, (size, sign))
                layout_addfield(layout, offset, fieldtype, fieldname)

        n = 0
        padfields = []
        for i, cell in enumerate(layout):
            if cell is not None:
                continue
            name = '_pad%d' % (n,)
            layout_addfield(layout, i, rffi.UCHAR, name)
            padfields.append('c_' + name)
            n += 1

        # build the lltype Structure
        seen = {}
        fields = []
        fieldoffsets = []
        for offset, cell in enumerate(layout):
            if cell in seen:
                continue
            fields.append((cell.name, cell.ctype))
            fieldoffsets.append(offset)
            seen[cell] = True

        allfields = tuple(['c_' + name for name, _ in fields])
        padfields = tuple(padfields)
        name = self.name
        padding_drop = PaddingDrop(name, allfields, padfields,
                                   config_result.CConfig._compilation_info_)
        hints = {'align': info['align'],
                 'size': info['size'],
                 'fieldoffsets': tuple(fieldoffsets),
                 'padding': padfields,
                 'get_padding_drop': padding_drop}
        if name.startswith('struct '):
            name = name[7:]
        else:
            hints['typedef'] = True
        kwds = {'hints': hints}
        return rffi.CStruct(name, *fields, **kwds)
Example #7
0
def fixup_ctype(fieldtype, fieldname, expected_size_and_sign):
    for typeclass in [integer_class, float_class]:
        if fieldtype in typeclass:
            for ctype in typeclass:
                if rffi.size_and_sign(ctype) == expected_size_and_sign:
                    return ctype
    if isinstance(fieldtype, lltype.FixedSizeArray):
        size, _ = expected_size_and_sign
        return lltype.FixedSizeArray(fieldtype.OF, size / _sizeof(fieldtype.OF))
    raise TypeError("conflicting field type %r for %r" % (fieldtype, fieldname))
Example #8
0
def fixup_ctype(fieldtype, fieldname, expected_size_and_sign):
    for typeclass in [integer_class, float_class]:
        if fieldtype in typeclass:
            for ctype in typeclass:
                if rffi.size_and_sign(ctype) == expected_size_and_sign:
                    return ctype
    if isinstance(fieldtype, lltype.FixedSizeArray):
        size, _ = expected_size_and_sign
        return lltype.FixedSizeArray(fieldtype.OF, size/_sizeof(fieldtype.OF))
    raise TypeError("conflict between translating python and compiler field"
                    " type %r for %r" % (fieldtype, fieldname))
Example #9
0
 def get_attrs_for_type(self, type):
     # because we want to bind to external functions that depend
     # on sign/zero extensions, we need to use these attributes in function sigs
     # note that this is not needed for internal functions because they use
     # casts if necessary
     type_attrs = ""
     if not isinstance(type, lltype.Number):
         return type_attrs
     size, sign = rffi.size_and_sign(type)
     if size < 4:
         if not sign:
             type_attrs += "signext"
         else:
             type_attrs += "zeroext"
     return type_attrs
Example #10
0
 def issigned(ct):
     # XXX why does size_and_sign() think lltype.Char, lltype.UniChar are signed??
     if ct in [lltype.Bool, lltype.Char, lltype.UniChar]:
         return False
     from pypy.rpython.lltypesystem.rffi import size_and_sign
     return not size_and_sign(ct)[1]