예제 #1
0
파일: database.py 프로젝트: purepython/pypy
 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
예제 #2
0
 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
예제 #3
0
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
예제 #4
0
파일: node.py 프로젝트: njues/Sypy
 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 '}'
예제 #5
0
파일: node.py 프로젝트: ieure/pypy
 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 '}'
예제 #6
0
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
예제 #7
0
 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 "}"
예제 #8
0
파일: node.py 프로젝트: e2pluginss/plexnet
 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 '}'
예제 #9
0
 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 "}"
예제 #10
0
파일: node.py 프로젝트: chyyuu/pygirl
 def __init__(self, db, T, obj):
     ContainerNode.__init__(self, db, T, obj)
     if barebonearray(T):
         self.ptrname = self.name
예제 #11
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)
예제 #12
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)
예제 #13
0
파일: node.py 프로젝트: njues/Sypy
 def getptrname(self):
     if barebonearray(self.getTYPE()):
         return self.name
     return ContainerNode.getptrname(self)
예제 #14
0
파일: node.py 프로젝트: enyst/plexnet
 def __init__(self, db, T, obj):
     ContainerNode.__init__(self, db, T, obj)
     if barebonearray(T):
         self.ptrname = self.name
예제 #15
0
 def getptrname(self):
     if barebonearray(self.getTYPE()):
         return self.name
     return ContainerNode.getptrname(self)