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)
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)
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
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))
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))
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)