def gettypedefnode(self, T, varlength=1): if varlength <= 1: varlength = 1 # it's C after all 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 gettypedefnode(self, T, varlength=1): if varlength <= 1: varlength = 1 # it's C after all 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 name_signed(value, db): if isinstance(value, Symbolic): if isinstance(value, FieldOffset): structnode = db.gettypedefnode(value.TYPE) 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 'ROUND_UP_FOR_ALLOCATION(%s, %s)' % ( name_signed(value.basesize, db), name_signed(value.minsize, db)) 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 '(%s+%dL)' % (name, value.rest) elif isinstance(value, AddressAsInt): return '((long)%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 '(-%dL-1L)' % sys.maxint else: return '%dL' % value
def initializationexpr(self, decoration=''): T = self.getTYPE() defnode = self.db.gettypedefnode(T) 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] lines = generic_initializationexpr( self.db, value, '%s.items[%d]' % (self.name, 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() defnode = self.db.gettypedefnode(T) 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] lines = generic_initializationexpr(self.db, value, '%s.items[%d]' % (self.name, j), '%s%d' % (decoration, j)) for line in lines: yield '\t' + line if not barebone: yield '} }' else: yield '}'
def name_signed(value, db): if isinstance(value, Symbolic): if isinstance(value, FieldOffset): structnode = db.gettypedefnode(value.TYPE) 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 'ROUND_UP_FOR_ALLOCATION(%s, %s)' % (name_signed( value.basesize, db), name_signed(value.minsize, db)) 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 '(%s+%dL)' % (name, value.rest) elif isinstance(value, AddressAsInt): return '((long)%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 '(-%dL-1L)' % sys.maxint else: return '%dL' % value
def initializationexpr(self, decoration=""): T = self.getTYPE() defnode = self.db.gettypedefnode(T) 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] lines = generic_initializationexpr( self.db, value, "%s.items[%d]" % (self.name, j), "%s%d" % (decoration, j) ) for line in lines: yield "\t" + line if not barebone: yield "} }" else: yield "}"
def initializationexpr(self, decoration=''): defnode = self.db.gettypedefnode(self.T) yield '{' if needs_gcheader(self.T): for i, thing in enumerate(self.db.gcpolicy.array_gcheader_initdata(self)): lines = generic_initializationexpr(self.db, thing, 'gcheader%d'%i, '%sgcheader%d' % (decoration, i)) for line in lines: yield line if self.T._hints.get('nolength', False): length = '' else: length = '%d, ' % len(self.obj.items) if self.T.OF is Void or len(self.obj.items) == 0: yield '\t%s' % length.rstrip(', ') yield '}' elif self.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) yield '\t%s%s' % (length, c_char_array_constant(s)) yield '}' else: barebone = barebonearray(self.T) if not barebone: yield '\t%s{' % length for j in range(len(self.obj.items)): value = self.obj.items[j] lines = generic_initializationexpr(self.db, value, '%s.items[%d]' % (self.name, j), '%s%d' % (decoration, j)) for line in lines: yield '\t' + line if not barebone: yield '} }' else: yield '}'
def initializationexpr(self, decoration=""): defnode = self.db.gettypedefnode(self.T) yield "{" if needs_gcheader(self.T): for i, thing in enumerate(self.db.gcpolicy.array_gcheader_initdata(self)): lines = generic_initializationexpr(self.db, thing, "gcheader%d" % i, "%sgcheader%d" % (decoration, i)) for line in lines: yield line if self.T._hints.get("nolength", False): length = "" else: length = "%d, " % len(self.obj.items) if self.T.OF is Void or len(self.obj.items) == 0: yield "\t%s" % length.rstrip(", ") yield "}" elif self.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) yield "\t%s%s" % (length, c_char_array_constant(s)) yield "}" else: barebone = barebonearray(self.T) if not barebone: yield "\t%s{" % length for j in range(len(self.obj.items)): value = self.obj.items[j] lines = generic_initializationexpr( self.db, value, "%s.items[%d]" % (self.name, j), "%s%d" % (decoration, j) ) for line in lines: yield "\t" + line if not barebone: yield "} }" else: yield "}"
def __init__(self, db, T, obj): ContainerNode.__init__(self, db, T, obj) if barebonearray(T): self.ptrname = self.name
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 getptrname(self): if barebonearray(self.getTYPE()): return self.name return ContainerNode.getptrname(self)