Index: src/incremental-marking-inl.h |
diff --git a/src/incremental-marking-inl.h b/src/incremental-marking-inl.h |
index c82d67845622451f958950b75a3445429d4cf8aa..94f52eefaa546075a15f6a02d5332e57100cc3c8 100644 |
--- a/src/incremental-marking-inl.h |
+++ b/src/incremental-marking-inl.h |
@@ -34,7 +34,9 @@ namespace v8 { |
namespace internal { |
-void IncrementalMarking::RecordWrite(HeapObject* obj, Object* value) { |
+void IncrementalMarking::RecordWrite(HeapObject* obj, |
+ Object** slot, |
+ Object* value) { |
if (IsMarking() && value->IsHeapObject()) { |
MarkBit value_bit = Marking::MarkBitFrom(HeapObject::cast(value)); |
if (Marking::IsWhite(value_bit)) { |
@@ -43,6 +45,18 @@ void IncrementalMarking::RecordWrite(HeapObject* obj, Object* value) { |
BlackToGreyAndUnshift(obj, obj_bit); |
RestartIfNotMarking(); |
} |
+ |
+ // Object is either grey or white it will be scanned if survives. |
+ return; |
+ } |
+ |
+ if (is_compacting_ && slot != NULL) { |
+ MarkBit obj_bit = Marking::MarkBitFrom(obj); |
+ if (Marking::IsBlack(obj_bit)) { |
+ // Object is not going to be rescanned we need to record the slot. |
+ heap_->mark_compact_collector()->RecordSlot( |
+ HeapObject::RawField(obj, 0), slot, value); |
+ } |
} |
} |
} |
@@ -50,6 +64,8 @@ void IncrementalMarking::RecordWrite(HeapObject* obj, Object* value) { |
void IncrementalMarking::RecordWriteOf(HeapObject* value) { |
if (IsMarking()) { |
+ ASSERT(!MarkCompactCollector::IsOnEvacuationCandidate(value)); |
+ |
MarkBit value_bit = Marking::MarkBitFrom(value); |
if (Marking::IsWhite(value_bit)) { |
WhiteToGreyAndPush(value, value_bit); |