| 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);
|
|
|