Beispiel #1
0
 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='&')
Beispiel #2
0
 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
Beispiel #3
0
 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)
Beispiel #4
0
 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
Beispiel #5
0
 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 '}'
Beispiel #6
0
 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 '}'
Beispiel #7
0
 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 "}"
Beispiel #8
0
 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)
Beispiel #9
0
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
Beispiel #10
0
 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)
Beispiel #11
0
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
Beispiel #12
0
 def getptrname(self):
     if barebonearray(self.getTYPE()):
         return self.name
     return ContainerNode.getptrname(self)
Beispiel #13
0
 def getptrname(self):
     if barebonearray(self.getTYPE()):
         return self.name
     return ContainerNode.getptrname(self)