def OP_GETSUBSTRUCT(self, op): RESULT = self.lltypemap(op.result).TO if (isinstance(RESULT, FixedSizeArray) or (isinstance(RESULT, Array) and barebonearray(RESULT))): return self.OP_GETFIELD(op, ampersand='') else: return self.OP_GETFIELD(op, ampersand='&')
def gettypedefnode(self, T, varlength=None): if varlength is None: key = T else: key = T, varlength try: node = self.structdefnodes[key] except KeyError: if isinstance(T, Struct): if isinstance(T, FixedSizeArray): node = FixedSizeArrayDefNode(self, T) else: node = StructDefNode(self, T, varlength) elif isinstance(T, Array): if barebonearray(T): node = BareBoneArrayDefNode(self, T, varlength) else: node = ArrayDefNode(self, T, varlength) elif isinstance(T, OpaqueType) and T.hints.get("render_structure", False): node = ExtTypeOpaqueDefNode(self, T) elif T == WeakRef: REALT = self.gcpolicy.get_real_weakref_type() node = self.gettypedefnode(REALT) else: raise NoCorrespondingNode("don't know about %r" % (T,)) self.structdefnodes[key] = node self.pendingsetupnodes.append(node) return node
def OP_GETSUBSTRUCT(self, op): RESULT = self.lltypemap(op.result).TO if (isinstance(RESULT, FixedSizeArray) or (isinstance(RESULT, Array) and barebonearray(RESULT))): return self.OP_GETFIELD(op, ampersand='', accessing_mem=False) else: return self.OP_GETFIELD(op, ampersand='&', accessing_mem=False)
def gettypedefnode(self, T, varlength=None): if varlength is None: key = T else: key = T, varlength try: node = self.structdefnodes[key] except KeyError: if isinstance(T, Struct): if isinstance(T, FixedSizeArray): node = FixedSizeArrayDefNode(self, T) else: node = StructDefNode(self, T, varlength) elif isinstance(T, Array): if barebonearray(T): node = BareBoneArrayDefNode(self, T, varlength) else: node = ArrayDefNode(self, T, varlength) elif isinstance(T, OpaqueType) and T.hints.get( "render_structure", False): node = ExtTypeOpaqueDefNode(self, T) elif T == WeakRef: REALT = self.gcpolicy.get_real_weakref_type() node = self.gettypedefnode(REALT) else: raise NoCorrespondingNode("don't know about %r" % (T, )) self.structdefnodes[key] = node self.pendingsetupnodes.append(node) return node
def initializationexpr(self, decoration=''): T = self.getTYPE() yield '{' if needs_gcheader(self.db.gctransformer, T): lines = generic_initializationexpr(self.db, self.gc_init, 'gcheader', '%sgcheader' % (decoration, )) for line in lines: yield line if T._hints.get('nolength', False): length = '' else: length = '%d, ' % len(self.obj.items) if T.OF is Void or len(self.obj.items) == 0: yield '\t%s' % length.rstrip(', ') yield '}' elif T.OF == Char: if len(self.obj.items) and self.obj.items[0] is None: s = ''.join( [self.obj.getitem(i) for i in range(len(self.obj.items))]) else: s = ''.join(self.obj.items) array_constant = c_char_array_constant(s) if array_constant.startswith('{') and barebonearray(T): assert array_constant.endswith('}') array_constant = array_constant[1:-1].strip() yield '\t%s%s' % (length, array_constant) yield '}' else: barebone = barebonearray(T) if not barebone: yield '\t%s{' % length for j in range(len(self.obj.items)): value = self.obj.items[j] basename = self.name if basename.endswith('.b'): basename = basename[:-2] + '.a' lines = generic_initializationexpr( self.db, value, '%s.items[%d]' % (basename, j), '%s%d' % (decoration, j)) for line in lines: yield '\t' + line if not barebone: yield '} }' else: yield '}'
def initializationexpr(self, decoration=''): T = self.getTYPE() yield '{' if needs_gcheader(T): gc_init = self.db.gcpolicy.array_gcheader_initdata(self) lines = generic_initializationexpr(self.db, gc_init, 'gcheader', '%sgcheader' % (decoration, )) for line in lines: yield line if T._hints.get('nolength', False): length = '' else: length = '%d, ' % len(self.obj.items) if T.OF is Void or len(self.obj.items) == 0: yield '\t%s' % length.rstrip(', ') yield '}' elif T.OF == Char: if len(self.obj.items) and self.obj.items[0] is None: s = ''.join( [self.obj.getitem(i) for i in range(len(self.obj.items))]) else: s = ''.join(self.obj.items) array_constant = c_char_array_constant(s) if array_constant.startswith('{') and barebonearray(T): assert array_constant.endswith('}') array_constant = array_constant[1:-1].strip() yield '\t%s%s' % (length, array_constant) yield '}' else: barebone = barebonearray(T) if not barebone: yield '\t%s{' % length for j in range(len(self.obj.items)): value = self.obj.items[j] basename = self.name if basename.endswith('.b'): basename = basename[:-2] + '.a' lines = generic_initializationexpr( self.db, value, '%s.items[%d]' % (basename, j), '%s%d' % (decoration, j)) for line in lines: yield '\t' + line if not barebone: yield '} }' else: yield '}'
def initializationexpr(self, decoration=""): T = self.getTYPE() yield "{" if needs_gcheader(T): gc_init = self.db.gcpolicy.array_gcheader_initdata(self) lines = generic_initializationexpr(self.db, gc_init, "gcheader", "%sgcheader" % (decoration,)) for line in lines: yield line if T._hints.get("nolength", False): length = "" else: length = "%d, " % len(self.obj.items) if T.OF is Void or len(self.obj.items) == 0: yield "\t%s" % length.rstrip(", ") yield "}" elif T.OF == Char: if len(self.obj.items) and self.obj.items[0] is None: s = "".join([self.obj.getitem(i) for i in range(len(self.obj.items))]) else: s = "".join(self.obj.items) array_constant = c_char_array_constant(s) if array_constant.startswith("{") and barebonearray(T): assert array_constant.endswith("}") array_constant = array_constant[1:-1].strip() yield "\t%s%s" % (length, array_constant) yield "}" else: barebone = barebonearray(T) if not barebone: yield "\t%s{" % length for j in range(len(self.obj.items)): value = self.obj.items[j] basename = self.name if basename.endswith(".b"): basename = basename[:-2] + ".a" lines = generic_initializationexpr( self.db, value, "%s.items[%d]" % (basename, j), "%s%d" % (decoration, j) ) for line in lines: yield "\t" + line if not barebone: yield "} }" else: yield "}"
def OP_DIRECT_ARRAYITEMS(self, op): ARRAY = self.lltypemap(op.args[0]).TO items = self.expr(op.args[0]) if not isinstance(ARRAY, FixedSizeArray) and not barebonearray(ARRAY): items += '->items' return '%s = %s;' % (self.expr(op.result), items)
def name_signed(value, db): if isinstance(value, Symbolic): if isinstance(value, FieldOffset): structnode = db.gettypedefnode(value.TYPE) if isinstance(value.TYPE, FixedSizeArray): assert value.fldname.startswith('item') repeat = value.fldname[4:] size = 'sizeof(%s)' % (cdecl(db.gettype(value.TYPE.OF), ''),) return '(%s * %s)' % (size, repeat) return 'offsetof(%s, %s)' % ( cdecl(db.gettype(value.TYPE), ''), structnode.c_struct_field_name(value.fldname)) elif isinstance(value, ItemOffset): if value.TYPE != Void and value.repeat != 0: size = 'sizeof(%s)' % (cdecl(db.gettype(value.TYPE), ''),) if value.repeat != 1: size = '(%s * %s)' % (size, value.repeat) return size else: return '0' elif isinstance(value, ArrayItemsOffset): if (isinstance(value.TYPE, FixedSizeArray) or barebonearray(value.TYPE)): return '0' elif value.TYPE.OF != Void: return 'offsetof(%s, items)' % ( cdecl(db.gettype(value.TYPE), '')) else: return 'sizeof(%s)' % (cdecl(db.gettype(value.TYPE), ''),) elif isinstance(value, ArrayLengthOffset): return 'offsetof(%s, length)' % ( cdecl(db.gettype(value.TYPE), '')) elif isinstance(value, CompositeOffset): names = [name_signed(item, db) for item in value.offsets] return '(%s)' % (' + '.join(names),) elif type(value) == AddressOffset: return '0' elif type(value) == GCHeaderOffset: return '0' elif type(value) == RoundedUpForAllocation: return ('(((%(x)s>=%(minsize)s?%(x)s:%(minsize)s) + %(align_m1)s)' ' & ~%(align_m1)s)') % { 'x': name_signed(value.basesize, db), 'minsize': name_signed(value.minsize, db), 'align_m1': MEMORY_ALIGNMENT-1 } elif isinstance(value, CDefinedIntSymbolic): return str(value.expr) elif isinstance(value, ComputedIntSymbolic): value = value.compute_fn() elif isinstance(value, llgroup.CombinedSymbolic): name = name_small_integer(value.lowpart, db) assert (value.rest & value.MASK) == 0 return lll('(%s+%dL)') % (name, value.rest) elif isinstance(value, AddressAsInt): return '((Signed)%s)' % name_address(value.adr, db) else: raise Exception("unimplemented symbolic %r" % value) if value is None: assert not db.completed return None if value == -sys.maxint-1: # blame C return lll('(-%dL-1L)') % sys.maxint else: return lll('%dL') % value
def OP_DIRECT_ARRAYITEMS(self, op): ARRAY = self.lltypemap(op.args[0]).TO items = self.expr(op.args[0]) if not isinstance(ARRAY, FixedSizeArray) and not barebonearray(ARRAY): items += '->items' return '%s = %s;' % (self.expr(op.result), items)
def name_signed(value, db): if isinstance(value, Symbolic): if isinstance(value, FieldOffset): structnode = db.gettypedefnode(value.TYPE) if isinstance(value.TYPE, FixedSizeArray): assert value.fldname.startswith('item') repeat = value.fldname[4:] size = 'sizeof(%s)' % (cdecl(db.gettype(value.TYPE.OF), ''), ) return '(%s * %s)' % (size, repeat) return 'offsetof(%s, %s)' % (cdecl(db.gettype( value.TYPE), ''), structnode.c_struct_field_name( value.fldname)) elif isinstance(value, ItemOffset): if value.TYPE != Void and value.repeat != 0: size = 'sizeof(%s)' % (cdecl(db.gettype(value.TYPE), ''), ) if value.repeat != 1: size = '(%s * %s)' % (size, value.repeat) return size else: return '0' elif isinstance(value, ArrayItemsOffset): if (isinstance(value.TYPE, FixedSizeArray) or barebonearray(value.TYPE)): return '0' elif value.TYPE.OF != Void: return 'offsetof(%s, items)' % (cdecl(db.gettype(value.TYPE), '')) else: return 'sizeof(%s)' % (cdecl(db.gettype(value.TYPE), ''), ) elif isinstance(value, ArrayLengthOffset): return 'offsetof(%s, length)' % (cdecl(db.gettype(value.TYPE), '')) elif isinstance(value, CompositeOffset): names = [name_signed(item, db) for item in value.offsets] return '(%s)' % (' + '.join(names), ) elif type(value) == AddressOffset: return '0' elif type(value) == GCHeaderOffset: return '0' elif type(value) == RoundedUpForAllocation: return ('(((%(x)s>=%(minsize)s?%(x)s:%(minsize)s) + %(align_m1)s)' ' & ~%(align_m1)s)') % { 'x': name_signed(value.basesize, db), 'minsize': name_signed(value.minsize, db), 'align_m1': MEMORY_ALIGNMENT - 1 } elif isinstance(value, CDefinedIntSymbolic): return str(value.expr) elif isinstance(value, ComputedIntSymbolic): value = value.compute_fn() elif isinstance(value, llgroup.CombinedSymbolic): name = name_small_integer(value.lowpart, db) assert (value.rest & value.MASK) == 0 return lll('(%s+%dL)') % (name, value.rest) elif isinstance(value, AddressAsInt): return '((Signed)%s)' % name_address(value.adr, db) else: raise Exception("unimplemented symbolic %r" % value) if value is None or isinstance(value, _uninitialized): assert not db.completed return None if value == -sys.maxint - 1: # blame C return lll('(-%dL-1L)') % sys.maxint else: return lll('%dL') % value
def getptrname(self): if barebonearray(self.getTYPE()): return self.name return ContainerNode.getptrname(self)
def getptrname(self): if barebonearray(self.getTYPE()): return self.name return ContainerNode.getptrname(self)