Index: src/objects-visiting-inl.h |
diff --git a/src/objects-visiting-inl.h b/src/objects-visiting-inl.h |
index 7332a0c8d6ad591df61a2e7c3195e103de1cfdf5..4fabba4852eeaa83cdbf57c235040494bc33b435 100644 |
--- a/src/objects-visiting-inl.h |
+++ b/src/objects-visiting-inl.h |
@@ -396,6 +396,33 @@ void StaticMarkingVisitor<StaticVisitor>::MarkMapContents( |
ASSERT(transitions->IsMap() || transitions->IsUndefined()); |
} |
+ // Since descriptor arrays are potentially shared, ensure that only the |
+ // descriptors that appeared for this map are marked. The first time a |
+ // non-empty descriptor array is marked, its header is also visited. The slot |
+ // holding the descriptor array will be implicitly recorded when the pointer |
+ // fields of this map are visited. |
+ DescriptorArray* descriptors = map->instance_descriptors(); |
+ if (StaticVisitor::MarkObjectWithoutPush(heap, descriptors) && |
+ descriptors->length() > 0) { |
+ StaticVisitor::VisitPointers(heap, |
+ descriptors->GetFirstElementAddress(), |
+ descriptors->GetDescriptorEndSlot(0)); |
+ } |
+ int start = 0; |
+ int end = map->NumberOfOwnDescriptors(); |
+ Object* back_pointer = map->GetBackPointer(); |
+ if (!back_pointer->IsUndefined()) { |
+ Map* parent_map = Map::cast(back_pointer); |
+ if (descriptors == parent_map->instance_descriptors()) { |
+ start = parent_map->NumberOfOwnDescriptors(); |
+ } |
+ } |
+ if (start < end) { |
+ StaticVisitor::VisitPointers(heap, |
+ descriptors->GetDescriptorStartSlot(start), |
+ descriptors->GetDescriptorEndSlot(end)); |
+ } |
+ |
// Mark prototype dependent codes array but do not push it onto marking |
// stack, this will make references from it weak. We will clean dead |
// codes when we iterate over maps in ClearNonLiveTransitions. |