Index: src/heap/mark-compact.cc |
diff --git a/src/heap/mark-compact.cc b/src/heap/mark-compact.cc |
index 2a77888fa784b510f230743fd9e461d6ea29f66d..fc5495163e69b5c9c0dacedfd5ac4cb34e00d747 100644 |
--- a/src/heap/mark-compact.cc |
+++ b/src/heap/mark-compact.cc |
@@ -1550,9 +1550,16 @@ class MarkCompactCollector::HeapObjectVisitor { |
class MarkCompactCollector::EvacuateVisitorBase |
: public MarkCompactCollector::HeapObjectVisitor { |
- public: |
+ protected: |
+ enum MigrationMode { kFast, kProfiled }; |
+ |
EvacuateVisitorBase(Heap* heap, CompactionSpaceCollection* compaction_spaces) |
- : heap_(heap), compaction_spaces_(compaction_spaces) {} |
+ : heap_(heap), |
+ compaction_spaces_(compaction_spaces), |
+ profiling_( |
+ heap->isolate()->cpu_profiler()->is_profiling() || |
+ heap->isolate()->logger()->is_logging_code_events() || |
+ heap->isolate()->heap_profiler()->is_tracking_object_moves()) {} |
inline bool TryEvacuateObject(PagedSpace* target_space, HeapObject* object, |
HeapObject** target_object) { |
@@ -1568,6 +1575,16 @@ class MarkCompactCollector::EvacuateVisitorBase |
inline void MigrateObject(HeapObject* dst, HeapObject* src, int size, |
AllocationSpace dest) { |
+ if (profiling_) { |
+ MigrateObject<kProfiled>(dst, src, size, dest); |
+ } else { |
+ MigrateObject<kFast>(dst, src, size, dest); |
+ } |
+ } |
+ |
+ template <MigrationMode mode> |
+ inline void MigrateObject(HeapObject* dst, HeapObject* src, int size, |
+ AllocationSpace dest) { |
Address dst_addr = dst->address(); |
Address src_addr = src->address(); |
DCHECK(heap_->AllowedToBeMigrated(src, dest)); |
@@ -1575,8 +1592,8 @@ class MarkCompactCollector::EvacuateVisitorBase |
if (dest == OLD_SPACE) { |
DCHECK_OBJECT_SIZE(size); |
DCHECK(IsAligned(size, kPointerSize)); |
- heap_->MoveBlock(dst_addr, src_addr, size); |
- if (FLAG_ignition && dst->IsBytecodeArray()) { |
+ heap_->CopyBlock(dst_addr, src_addr, size); |
+ if ((mode == kProfiled) && FLAG_ignition && dst->IsBytecodeArray()) { |
PROFILE(heap_->isolate(), |
CodeMoveEvent(AbstractCode::cast(src), dst_addr)); |
} |
@@ -1584,24 +1601,28 @@ class MarkCompactCollector::EvacuateVisitorBase |
dst->IterateBodyFast(dst->map()->instance_type(), size, &visitor); |
} else if (dest == CODE_SPACE) { |
DCHECK_CODEOBJECT_SIZE(size, heap_->code_space()); |
- PROFILE(heap_->isolate(), |
- CodeMoveEvent(AbstractCode::cast(src), dst_addr)); |
- heap_->MoveBlock(dst_addr, src_addr, size); |
+ if (mode == kProfiled) { |
+ PROFILE(heap_->isolate(), |
+ CodeMoveEvent(AbstractCode::cast(src), dst_addr)); |
+ } |
+ heap_->CopyBlock(dst_addr, src_addr, size); |
RememberedSet<OLD_TO_OLD>::InsertTyped(Page::FromAddress(dst_addr), |
RELOCATED_CODE_OBJECT, dst_addr); |
Code::cast(dst)->Relocate(dst_addr - src_addr); |
} else { |
DCHECK_OBJECT_SIZE(size); |
DCHECK(dest == NEW_SPACE); |
- heap_->MoveBlock(dst_addr, src_addr, size); |
+ heap_->CopyBlock(dst_addr, src_addr, size); |
+ } |
+ if (mode == kProfiled) { |
+ heap_->OnMoveEvent(dst, src, size); |
} |
- heap_->OnMoveEvent(dst, src, size); |
Memory::Address_at(src_addr) = dst_addr; |
} |
- protected: |
Heap* heap_; |
CompactionSpaceCollection* compaction_spaces_; |
+ bool profiling_; |
}; |
class MarkCompactCollector::EvacuateNewSpaceVisitor final |