Index: src/heap/objects-visiting-inl.h |
diff --git a/src/heap/objects-visiting-inl.h b/src/heap/objects-visiting-inl.h |
index d22f6d268db27ded38e9d468afd739a57233e6e5..433fc6deab3e0efc7cb921501d7757d1c42a2688 100644 |
--- a/src/heap/objects-visiting-inl.h |
+++ b/src/heap/objects-visiting-inl.h |
@@ -537,6 +537,11 @@ |
template <typename StaticVisitor> |
void StaticMarkingVisitor<StaticVisitor>::MarkMapContents(Heap* heap, |
Map* map) { |
+ Object* raw_transitions = map->raw_transitions(); |
+ if (TransitionArray::IsFullTransitionArray(raw_transitions)) { |
+ MarkTransitionArray(heap, TransitionArray::cast(raw_transitions)); |
+ } |
+ |
// Since descriptor arrays are potentially shared, ensure that only the |
// descriptors that belong to this map are marked. The first time a |
// non-empty descriptor array is marked, its header is also visited. The slot |
@@ -562,6 +567,23 @@ |
StaticVisitor::VisitPointers( |
heap, HeapObject::RawField(map, Map::kPointerFieldsBeginOffset), |
HeapObject::RawField(map, Map::kPointerFieldsEndOffset)); |
+} |
+ |
+ |
+template <typename StaticVisitor> |
+void StaticMarkingVisitor<StaticVisitor>::MarkTransitionArray( |
+ Heap* heap, TransitionArray* transitions) { |
+ if (!StaticVisitor::MarkObjectWithoutPush(heap, transitions)) return; |
+ |
+ if (transitions->HasPrototypeTransitions()) { |
+ StaticVisitor::VisitPointer(heap, |
+ transitions->GetPrototypeTransitionsSlot()); |
+ } |
+ |
+ int num_transitions = TransitionArray::NumberOfTransitions(transitions); |
+ for (int i = 0; i < num_transitions; ++i) { |
+ StaticVisitor::VisitPointer(heap, transitions->GetKeySlot(i)); |
+ } |
} |