Chromium Code Reviews| 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)); |
|
Toon Verwaest
2015/03/05 13:18:54
This keeps all simple transitions alive?
Jakob Kummerow
2015/03/05 15:26:36
No, the WeakCell takes care of that. (We must keep
|
| + } |
| + 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)); |
| } |
| } |