Index: runtime/vm/scavenger.cc |
=================================================================== |
--- runtime/vm/scavenger.cc (revision 22083) |
+++ runtime/vm/scavenger.cc (working copy) |
@@ -19,14 +19,14 @@ |
namespace dart { |
-// Scavenger uses RawObject::kFreeBit to distinguish forwaded and non-forwarded |
-// objects because scavenger can never encounter free list element during |
-// evacuation and thus all objects scavenger encounters have |
-// kFreeBit cleared. |
+// Scavenger uses RawObject::kMarkBit to distinguish forwaded and non-forwarded |
+// objects because scavenger can never encounter marked elements during |
+// evacuation and thus all objects scavenger encounters have the |
+// kMarkBit cleared. |
enum { |
- kForwardingMask = 1, |
+ kForwardingMask = RawObject::kMarkBit, |
kNotForwarded = 0, |
- kForwarded = 1, |
+ kForwarded = kForwardingMask, |
}; |
@@ -122,7 +122,10 @@ |
ASSERT(!heap_->CodeContains(ptr)); |
ASSERT(heap_->Contains(ptr)); |
// If the newly written object is not a new object, drop it immediately. |
- if (!obj->IsNewObject()) return; |
+ if (!obj->IsNewObject() || visiting_old_object_->IsRemembered()) { |
+ return; |
+ } |
+ visiting_old_object_->SetRememberedBit(); |
isolate()->store_buffer()->AddPointer( |
reinterpret_cast<uword>(visiting_old_object_)); |
} |
@@ -299,7 +302,6 @@ |
// Verify assumptions about the first word in objects which the scavenger is |
// going to use for forwarding pointers. |
ASSERT(Object::tags_offset() == 0); |
- ASSERT(kForwardingMask == (1 << RawObject::kFreeBit)); |
// Allocate the virtual memory for this scavenge heap. |
space_ = VirtualMemory::Reserve(max_capacity); |
@@ -399,6 +401,8 @@ |
for (intptr_t i = 0; i < size; i++) { |
RawObject* raw_object = reinterpret_cast<RawObject*>(set->At(i)); |
if (raw_object != NULL) { |
+ ASSERT(raw_object->IsRemembered()); |
+ raw_object->ClearRememberedBit(); |
visitor->VisitingOldObject(raw_object); |
raw_object->VisitPointers(visitor); |
handled++; |
@@ -536,6 +540,7 @@ |
// Resolve or copy all objects referred to by the current object. This |
// can potentially push more objects on this stack as well as add more |
// objects to be resolved in the to space. |
+ ASSERT(!raw_object->IsRemembered()); |
visitor->VisitingOldObject(raw_object); |
raw_object->VisitPointers(visitor); |
} |