def get_size_descr(gccache, STRUCT, vtable=lltype.nullptr(rclass.OBJECT_VTABLE)): cache = gccache._cache_size assert not isinstance(vtable, bool) try: return cache[STRUCT] except KeyError: size = symbolic.get_size(STRUCT, gccache.translate_support_code) immutable_flag = heaptracker.is_immutable_struct(STRUCT) if vtable: assert heaptracker.has_gcstruct_a_vtable(STRUCT) else: assert not heaptracker.has_gcstruct_a_vtable(STRUCT) sizedescr = SizeDescr(size, vtable=vtable, immutable_flag=immutable_flag) gccache.init_size_descr(STRUCT, sizedescr) cache[STRUCT] = sizedescr # XXX do we really need gc_fielddescrs if we also have # all_fielddescrs and can ask is_pointer_field() on them? gc_fielddescrs = heaptracker.gc_fielddescrs(gccache, STRUCT) sizedescr.gc_fielddescrs = gc_fielddescrs all_fielddescrs = heaptracker.all_fielddescrs(gccache, STRUCT) sizedescr.all_fielddescrs = all_fielddescrs return sizedescr
def sizeof(self, S, vtable=lltype.nullptr(rclass.OBJECT_VTABLE)): key = ('size', S) try: descr = self.descrs[key] except KeyError: descr = SizeDescr(S, vtable, self) self.descrs[key] = descr descr.all_fielddescrs = heaptracker.all_fielddescrs(self, S, get_field_descr=LLGraphCPU.fielddescrof) if descr._is_object and vtable is not Ellipsis: assert vtable heaptracker.testing_gcstruct2vtable.setdefault(S, vtable) return descr