Пример #1
0
 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
Пример #2
0
 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
Пример #3
0
 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
Пример #4
0
 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
Пример #5
0
 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