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
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