Пример #1
0
def get_array_descr(gccache, ARRAY_OR_STRUCT):
    cache = gccache._cache_array
    try:
        return cache[ARRAY_OR_STRUCT]
    except KeyError:
        tsc = gccache.translate_support_code
        basesize, itemsize, _ = symbolic.get_array_token(ARRAY_OR_STRUCT, tsc)
        if isinstance(ARRAY_OR_STRUCT, lltype.Array):
            ARRAY_INSIDE = ARRAY_OR_STRUCT
        else:
            ARRAY_INSIDE = ARRAY_OR_STRUCT._flds[ARRAY_OR_STRUCT._arrayfld]
        if ARRAY_INSIDE._hints.get('nolength', False):
            lendescr = None
        else:
            lendescr = get_field_arraylen_descr(gccache, ARRAY_OR_STRUCT)
        flag = get_type_flag(ARRAY_INSIDE.OF)
        is_pure = bool(ARRAY_INSIDE._immutable_field(None))
        arraydescr = ArrayDescr(basesize, itemsize, lendescr, flag, is_pure)
        if ARRAY_INSIDE.OF is lltype.SingleFloat or \
           ARRAY_INSIDE.OF is lltype.Float:
            # it would be better to set the flag as FLOAT_TYPE
            # for single float -> leads to problems
            arraydescr = ArrayDescr(basesize, itemsize, lendescr, flag, is_pure, concrete_type='f')
        cache[ARRAY_OR_STRUCT] = arraydescr
        if isinstance(ARRAY_INSIDE.OF, lltype.Struct):
            descrs = heaptracker.all_interiorfielddescrs(gccache,
                ARRAY_INSIDE, get_field_descr=get_interiorfield_descr)
            arraydescr.all_interiorfielddescrs = descrs
        if ARRAY_OR_STRUCT._gckind == 'gc':
            gccache.init_array_descr(ARRAY_OR_STRUCT, arraydescr)
        return arraydescr
Пример #2
0
def get_array_descr(gccache, ARRAY_OR_STRUCT):
    cache = gccache._cache_array
    try:
        return cache[ARRAY_OR_STRUCT]
    except KeyError:
        tsc = gccache.translate_support_code
        basesize, itemsize, _ = symbolic.get_array_token(ARRAY_OR_STRUCT, tsc)
        if isinstance(ARRAY_OR_STRUCT, lltype.Array):
            ARRAY_INSIDE = ARRAY_OR_STRUCT
        else:
            ARRAY_INSIDE = ARRAY_OR_STRUCT._flds[ARRAY_OR_STRUCT._arrayfld]
        if ARRAY_INSIDE._hints.get('nolength', False):
            lendescr = None
        else:
            lendescr = get_field_arraylen_descr(gccache, ARRAY_OR_STRUCT)
        flag = get_type_flag(ARRAY_INSIDE.OF)
        is_pure = bool(ARRAY_INSIDE._immutable_field(None))
        arraydescr = ArrayDescr(basesize, itemsize, lendescr, flag, is_pure)
        if ARRAY_INSIDE.OF is lltype.SingleFloat or \
           ARRAY_INSIDE.OF is lltype.Float:
            # it would be better to set the flag as FLOAT_TYPE
            # for single float -> leads to problems
            arraydescr = ArrayDescr(basesize, itemsize, lendescr, flag, is_pure, concrete_type='f')
        cache[ARRAY_OR_STRUCT] = arraydescr
        if isinstance(ARRAY_INSIDE.OF, lltype.Struct):
            descrs = heaptracker.all_interiorfielddescrs(gccache,
                ARRAY_INSIDE, get_field_descr=get_interiorfield_descr)
            arraydescr.all_interiorfielddescrs = descrs
        if ARRAY_OR_STRUCT._gckind == 'gc':
            gccache.init_array_descr(ARRAY_OR_STRUCT, arraydescr)
        return arraydescr
Пример #3
0
 def arraydescrof(self, A):
     key = ('array', A)
     try:
         return self.descrs[key]
     except KeyError:
         descr = ArrayDescr(A, self)
         self.descrs[key] = descr
         if isinstance(A, lltype.Array) and isinstance(A.OF, lltype.Struct):
             descrs = heaptracker.all_interiorfielddescrs(self,
                     A, get_field_descr=LLGraphCPU.interiorfielddescrof)
             descr.all_interiorfielddescrs = descrs
         return descr