Index: src/incremental-marking.cc |
diff --git a/src/incremental-marking.cc b/src/incremental-marking.cc |
index 4b0c5786003728964f52998c0dce9bc8e67b7a50..154799ba6fb9d299009126e74bd58e4be2043b57 100644 |
--- a/src/incremental-marking.cc |
+++ b/src/incremental-marking.cc |
@@ -44,7 +44,6 @@ IncrementalMarking::IncrementalMarking(Heap* heap) |
state_(STOPPED), |
marking_deque_memory_(NULL), |
marking_deque_memory_committed_(false), |
- marker_(this, heap->mark_compact_collector()), |
steps_count_(0), |
steps_took_(0), |
longest_step_(0.0), |
@@ -226,6 +225,7 @@ class IncrementalMarkingMarkingVisitor |
} |
} |
+ // Marks the object grey and pushes it on the marking stack. |
INLINE(static void MarkObject(Heap* heap, Object* obj)) { |
HeapObject* heap_object = HeapObject::cast(obj); |
MarkBit mark_bit = Marking::MarkBitFrom(heap_object); |
@@ -238,6 +238,20 @@ class IncrementalMarkingMarkingVisitor |
heap->incremental_marking()->WhiteToGreyAndPush(heap_object, mark_bit); |
} |
} |
+ |
+ // Marks the object black without pushing it on the marking stack. |
+ // Returns true if object needed marking and false otherwise. |
+ INLINE(static bool MarkObjectWithoutPush(Heap* heap, Object* obj)) { |
+ HeapObject* heap_object = HeapObject::cast(obj); |
+ MarkBit mark_bit = Marking::MarkBitFrom(heap_object); |
+ if (Marking::IsWhite(mark_bit)) { |
+ mark_bit.Set(); |
+ MemoryChunk::IncrementLiveBytesFromGC(heap_object->address(), |
+ heap_object->Size()); |
+ return true; |
+ } |
+ return false; |
+ } |
}; |
@@ -641,23 +655,6 @@ void IncrementalMarking::Hurry() { |
} else if (map == native_context_map) { |
// Native contexts have weak fields. |
IncrementalMarkingMarkingVisitor::VisitNativeContext(map, obj); |
- } else if (map->instance_type() == MAP_TYPE) { |
- Map* map = Map::cast(obj); |
- heap_->ClearCacheOnMap(map); |
- |
- // When map collection is enabled we have to mark through map's |
- // transitions and back pointers in a special way to make these links |
- // weak. Only maps for subclasses of JSReceiver can have transitions. |
- STATIC_ASSERT(LAST_TYPE == LAST_JS_RECEIVER_TYPE); |
- if (FLAG_collect_maps && |
- map->instance_type() >= FIRST_JS_RECEIVER_TYPE) { |
- marker_.MarkMapContents(map); |
- } else { |
- IncrementalMarkingMarkingVisitor::VisitPointers( |
- heap_, |
- HeapObject::RawField(map, Map::kPointerFieldsBeginOffset), |
- HeapObject::RawField(map, Map::kPointerFieldsEndOffset)); |
- } |
} else { |
MarkBit map_mark_bit = Marking::MarkBitFrom(map); |
if (Marking::IsWhite(map_mark_bit)) { |
@@ -822,23 +819,6 @@ void IncrementalMarking::Step(intptr_t allocated_bytes, |
MarkObjectGreyDoNotEnqueue(ctx->normalized_map_cache()); |
IncrementalMarkingMarkingVisitor::VisitNativeContext(map, ctx); |
- } else if (map->instance_type() == MAP_TYPE) { |
- Map* map = Map::cast(obj); |
- heap_->ClearCacheOnMap(map); |
- |
- // When map collection is enabled we have to mark through map's |
- // transitions and back pointers in a special way to make these links |
- // weak. Only maps for subclasses of JSReceiver can have transitions. |
- STATIC_ASSERT(LAST_TYPE == LAST_JS_RECEIVER_TYPE); |
- if (FLAG_collect_maps && |
- map->instance_type() >= FIRST_JS_RECEIVER_TYPE) { |
- marker_.MarkMapContents(map); |
- } else { |
- IncrementalMarkingMarkingVisitor::VisitPointers( |
- heap_, |
- HeapObject::RawField(map, Map::kPointerFieldsBeginOffset), |
- HeapObject::RawField(map, Map::kPointerFieldsEndOffset)); |
- } |
} else { |
IncrementalMarkingMarkingVisitor::IterateBody(map, obj); |
} |