Index: src/heap/mark-compact.cc |
diff --git a/src/heap/mark-compact.cc b/src/heap/mark-compact.cc |
index 8d4921f8d15e39d33d803866ee9d6d827176d2c6..d1e233a36a780433ded4f259d3d68a30236b22d9 100644 |
--- a/src/heap/mark-compact.cc |
+++ b/src/heap/mark-compact.cc |
@@ -831,6 +831,7 @@ void MarkCompactCollector::Prepare() { |
ClearMarkbits(); |
AbortWeakCollections(); |
AbortWeakCells(); |
+ AbortTransitionArrays(); |
AbortCompaction(); |
was_marked_incrementally_ = false; |
} |
@@ -2329,14 +2330,15 @@ void MarkCompactCollector::ProcessWeakReferences() { |
ClearNonLiveReferences(); |
ClearWeakCollections(); |
- |
- heap_->set_encountered_weak_cells(Smi::FromInt(0)); |
} |
void MarkCompactCollector::ClearNonLiveReferences() { |
GCTracer::Scope gc_scope(heap()->tracer(), |
GCTracer::Scope::MC_NONLIVEREFERENCES); |
+ |
+ ProcessAndClearTransitionArrays(); |
+ |
// Iterate over the map space, setting map transitions that go from |
// a marked map to an unmarked map to null transitions. This action |
// is carried out only on maps of JSObjects and related subtypes. |
@@ -2655,6 +2657,31 @@ void MarkCompactCollector::AbortWeakCells() { |
} |
+void MarkCompactCollector::ProcessAndClearTransitionArrays() { |
+ HeapObject* undefined = heap()->undefined_value(); |
+ Object* obj = heap()->encountered_transition_arrays(); |
+ while (obj != Smi::FromInt(0)) { |
+ TransitionArray* array = TransitionArray::cast(obj); |
+ // TODO(ulan): move logic from ClearMapTransitions here. |
+ obj = array->next_link(); |
+ array->set_next_link(undefined, SKIP_WRITE_BARRIER); |
+ } |
+ heap()->set_encountered_transition_arrays(Smi::FromInt(0)); |
+} |
+ |
+ |
+void MarkCompactCollector::AbortTransitionArrays() { |
+ HeapObject* undefined = heap()->undefined_value(); |
+ Object* obj = heap()->encountered_transition_arrays(); |
+ while (obj != Smi::FromInt(0)) { |
+ TransitionArray* array = TransitionArray::cast(obj); |
+ obj = array->next_link(); |
+ array->set_next_link(undefined, SKIP_WRITE_BARRIER); |
+ } |
+ heap()->set_encountered_transition_arrays(Smi::FromInt(0)); |
+} |
+ |
+ |
void MarkCompactCollector::RecordMigratedSlot( |
Object* value, Address slot, SlotsBuffer** evacuation_slots_buffer) { |
// When parallel compaction is in progress, store and slots buffer entries |