def copy_and_compact(self, obj, typeid, basesize, toaddr, grow_hash_field): # 'basesize' is the size without any hash field # restore the normal header hdr = self.header_forwarded(obj) gcflags = hdr.tid & 3 if grow_hash_field: gcflags |= GCFLAG_SAVED_HASHFIELD hashvalue = self.get_identityhash_from_addr(obj) elif gcflags & GCFLAG_SAVED_HASHFIELD: fromaddr = llarena.getfakearenaaddress(obj) fromaddr -= self.gcheaderbuilder.size_gc_header hashvalue = (fromaddr + basesize).signed[0] else: hashvalue = 0 # not used # hdr.tid = self.combine(typeid, gcflags << first_gcflag_bit) # fromaddr = obj - self.gcheaderbuilder.size_gc_header if translated_to_c(): llmemory.raw_memmove(fromaddr, toaddr, basesize) else: llmemory.raw_memcopy(fromaddr, toaddr, basesize) # if gcflags & GCFLAG_SAVED_HASHFIELD: (toaddr + basesize).signed[0] = hashvalue
def copy_and_compact(self, obj, typeid, basesize, toaddr, grow_hash_field): # 'basesize' is the size without any hash field # restore the normal header hdr = self.header_forwarded(obj) gcflags = hdr.tid & 3 if grow_hash_field: gcflags |= GCFLAG_SAVED_HASHFIELD hashvalue = self.get_identityhash_from_addr(obj) elif gcflags & GCFLAG_SAVED_HASHFIELD: fromaddr = llarena.getfakearenaaddress(obj) fromaddr -= self.gcheaderbuilder.size_gc_header hashvalue = (fromaddr + basesize).signed[0] else: hashvalue = 0 # not used # hdr.tid = self.combine(typeid, gcflags << first_gcflag_bit) # fromaddr = obj - self.gcheaderbuilder.size_gc_header if translated_to_c(): llmemory.raw_memmove(fromaddr, toaddr, basesize) else: llmemory.raw_memcopy(fromaddr, toaddr, basesize) # if gcflags & GCFLAG_SAVED_HASHFIELD: (toaddr + basesize).signed[0] = hashvalue
def compact(self, resizing): fromaddr = self.space size_gc_header = self.gcheaderbuilder.size_gc_header start = fromaddr end = fromaddr num = 0 while fromaddr < self.free: obj = fromaddr + size_gc_header hdr = llmemory.cast_adr_to_ptr(fromaddr, lltype.Ptr(self.HDR)) objsize = self.get_size_from_backup(obj, num) totalsize = size_gc_header + objsize if not self.surviving(obj): # this object dies. Following line is a noop in C, # we clear it to make debugging easier llarena.arena_reset(fromaddr, totalsize, False) else: ll_assert(self.is_forwarded(obj), "not forwarded, surviving obj") forward_ptr = hdr.forward_ptr if resizing: end = fromaddr val = (self.get_typeid_from_backup(num) << 16) + 1 hdr.forward_ptr = llmemory.cast_int_to_adr(val) if fromaddr != forward_ptr: #llop.debug_print(lltype.Void, "Copying from to", # fromaddr, forward_ptr, totalsize) llmemory.raw_memmove(fromaddr, forward_ptr, totalsize) if resizing and end - start > GC_CLEARANCE: diff = end - start #llop.debug_print(lltype.Void, "Cleaning", start, diff) diff = (diff / GC_CLEARANCE) * GC_CLEARANCE #llop.debug_print(lltype.Void, "Cleaning", start, diff) end = start + diff if we_are_translated(): # XXX wuaaaaa.... those objects are freed incorrectly # here in case of test_gc llarena.arena_reset(start, diff, True) start += diff num += 1 fromaddr += totalsize
def compact(self, resizing): fromaddr = self.space size_gc_header = self.gcheaderbuilder.size_gc_header start = fromaddr end = fromaddr num = 0 while fromaddr < self.free: obj = fromaddr + size_gc_header objsize = self.get_size_from_backup(obj, num) totalsize = size_gc_header + objsize if not self.surviving(obj): # this object dies. Following line is a noop in C, # we clear it to make debugging easier llarena.arena_reset(fromaddr, totalsize, False) else: if resizing: end = fromaddr forward_obj = self.get_header_forwarded_addr(obj) self.restore_normal_header(obj, num) if obj != forward_obj: #llop.debug_print(lltype.Void, "Copying from to", # fromaddr, forward_ptr, totalsize) llmemory.raw_memmove(fromaddr, forward_obj - size_gc_header, totalsize) if resizing and end - start > GC_CLEARANCE: diff = end - start #llop.debug_print(lltype.Void, "Cleaning", start, diff) diff = (diff / GC_CLEARANCE) * GC_CLEARANCE #llop.debug_print(lltype.Void, "Cleaning", start, diff) end = start + diff if we_are_translated(): # XXX wuaaaaa.... those objects are freed incorrectly # here in case of test_gc llarena.arena_reset(start, diff, True) start += diff num += 1 fromaddr += totalsize
def compact(self, resizing): fromaddr = self.space size_gc_header = self.gcheaderbuilder.size_gc_header start = fromaddr end = fromaddr num = 0 while fromaddr < self.free: obj = fromaddr + size_gc_header objsize = self.get_size_from_backup(obj, num) totalsize = size_gc_header + objsize if not self.surviving(obj): # this object dies. Following line is a noop in C, # we clear it to make debugging easier llarena.arena_reset(fromaddr, totalsize, False) else: if resizing: end = fromaddr forward_obj = self.get_header_forwarded_addr(obj) self.restore_normal_header(obj, num) if obj != forward_obj: #llop.debug_print(lltype.Void, "Copying from to", # fromaddr, forward_ptr, totalsize) llmemory.raw_memmove(fromaddr, forward_obj - size_gc_header, totalsize) if resizing and end - start > GC_CLEARANCE: diff = end - start #llop.debug_print(lltype.Void, "Cleaning", start, diff) diff = (diff / GC_CLEARANCE) * GC_CLEARANCE #llop.debug_print(lltype.Void, "Cleaning", start, diff) end = start + diff if we_are_translated(): # XXX wuaaaaa.... those objects are freed incorrectly # here in case of test_gc llarena.arena_reset(start, diff, True) start += diff num += 1 fromaddr += totalsize