| Index: src/heap/objects-visiting-inl.h
|
| diff --git a/src/heap/objects-visiting-inl.h b/src/heap/objects-visiting-inl.h
|
| index 58afeae0167dd7aedbdbbc70ff6b3b6d9fb579f8..b4240d2a491e44be26f4e8fbb6bda132953e8bc1 100644
|
| --- a/src/heap/objects-visiting-inl.h
|
| +++ b/src/heap/objects-visiting-inl.h
|
| @@ -584,18 +584,13 @@ void StaticMarkingVisitor<StaticVisitor>::VisitJSDataView(Map* map,
|
| template <typename StaticVisitor>
|
| void StaticMarkingVisitor<StaticVisitor>::MarkMapContents(Heap* heap,
|
| Map* map) {
|
| - // Make sure that the back pointer stored either in the map itself or
|
| - // inside its transitions array is marked. Skip recording the back
|
| - // pointer slot since map space is not compacted.
|
| - StaticVisitor::MarkObject(heap, HeapObject::cast(map->GetBackPointer()));
|
| -
|
| - // Treat pointers in the transitions array as weak and also mark that
|
| - // array to prevent visiting it later. Skip recording the transition
|
| - // array slot, since it will be implicitly recorded when the pointer
|
| - // fields of this map are visited.
|
| - if (map->HasTransitionArray()) {
|
| - TransitionArray* transitions = map->transitions();
|
| - MarkTransitionArray(heap, transitions);
|
| + Object* raw_transitions = map->raw_transitions();
|
| + if (TransitionArray::IsSimpleTransition(raw_transitions)) {
|
| + StaticVisitor::VisitPointer(
|
| + heap, HeapObject::RawField(map, Map::kTransitionsOffset));
|
| + }
|
| + if (TransitionArray::IsFullTransitionArray(raw_transitions)) {
|
| + MarkTransitionArray(heap, TransitionArray::cast(raw_transitions));
|
| }
|
|
|
| // Since descriptor arrays are potentially shared, ensure that only the
|
| @@ -631,20 +626,18 @@ void StaticMarkingVisitor<StaticVisitor>::MarkTransitionArray(
|
| Heap* heap, TransitionArray* transitions) {
|
| if (!StaticVisitor::MarkObjectWithoutPush(heap, transitions)) return;
|
|
|
| - // Simple transitions do not have keys nor prototype transitions.
|
| - if (transitions->IsSimpleTransition()) return;
|
| -
|
| if (transitions->HasPrototypeTransitions()) {
|
| // Mark prototype transitions array but do not push it onto marking
|
| // stack, this will make references from it weak. We will clean dead
|
| - // prototype transitions in ClearNonLiveTransitions.
|
| + // prototype transitions in ClearNonLiveReferences.
|
| Object** slot = transitions->GetPrototypeTransitionsSlot();
|
| HeapObject* obj = HeapObject::cast(*slot);
|
| heap->mark_compact_collector()->RecordSlot(slot, slot, obj);
|
| StaticVisitor::MarkObjectWithoutPush(heap, obj);
|
| }
|
|
|
| - for (int i = 0; i < transitions->number_of_transitions(); ++i) {
|
| + int num_transitions = TransitionArray::NumberOfTransitions(transitions);
|
| + for (int i = 0; i < num_transitions; ++i) {
|
| StaticVisitor::VisitPointer(heap, transitions->GetKeySlot(i));
|
| }
|
| }
|
|
|