Example #1
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
        eci = config_result.CConfig._compilation_info_
        padding_drop = PaddingDrop(name, allfields, padfields, eci)
        hints = {
            'align': info['align'],
            'size': info['size'],
            'fieldoffsets': tuple(fieldoffsets),
            'padding': padfields,
            'get_padding_drop': padding_drop,
            'eci': eci
        }
        if name.startswith('struct '):
            name = name[7:]
        else:
            hints['typedef'] = True
        kwds = {'hints': hints}
        return rffi.CStruct(name, *fields, **kwds)
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 is_array_nolength(fieldtype):
                    pass       # ignore size and sign
                elif (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
        eci = config_result.CConfig._compilation_info_
        padding_drop = PaddingDrop(name, allfields, padfields, eci)
        hints = {'align': info['align'],
                 'size': info['size'],
                 'fieldoffsets': tuple(fieldoffsets),
                 'padding': padfields,
                 'get_padding_drop': padding_drop,
                 'eci': eci}
        if name.startswith('struct '):
            name = name[7:]
        else:
            hints['typedef'] = True
        kwds = {'hints': hints, 'adtmeths': self.adtmeths}
        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 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 #5
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 #6
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 #7
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 is_array_nolength(fieldtype):
                    pass  # ignore size and sign
                elif (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
        eci = config_result.CConfig._compilation_info_
        padding_drop = PaddingDrop(name, allfields, padfields, eci)
        hints = {
            "align": info["align"],
            "size": info["size"],
            "fieldoffsets": tuple(fieldoffsets),
            "padding": padfields,
            "get_padding_drop": padding_drop,
            "eci": eci,
        }
        if name.startswith("struct "):
            name = name[7:]
        else:
            hints["typedef"] = True
        kwds = {"hints": hints, "adtmeths": self.adtmeths}
        return rffi.CStruct(name, *fields, **kwds)