Index: src/mark-compact.cc |
diff --git a/src/mark-compact.cc b/src/mark-compact.cc |
index 2378a5e0a4e0690ab99a5701125bc9d331d846c4..54a293685f2875b2a8935b6586b0cfe0788acc18 100644 |
--- a/src/mark-compact.cc |
+++ b/src/mark-compact.cc |
@@ -1626,13 +1626,23 @@ void MarkCompactCollector::MarkDescriptorArray( |
RecordSlot(slot, slot, *slot); |
- if (details.type() < FIRST_PHANTOM_PROPERTY_TYPE) { |
+ PropertyType type = details.type(); |
+ if (type < FIRST_PHANTOM_PROPERTY_TYPE) { |
HeapObject* object = HeapObject::cast(value); |
MarkBit mark = Marking::MarkBitFrom(HeapObject::cast(object)); |
if (!mark.Get()) { |
SetMark(HeapObject::cast(object), mark); |
marking_deque_.PushBlack(object); |
} |
+ } else if (type == ELEMENTS_TRANSITION && value->IsFixedArray()) { |
+ // For maps with multiple elements transitions, the transition maps are |
+ // stored in a FixedArray. Keep the fixed array alive but not the maps |
+ // that it refers to. |
+ HeapObject* object = HeapObject::cast(value); |
+ MarkBit mark = Marking::MarkBitFrom(HeapObject::cast(object)); |
+ if (!mark.Get()) { |
+ SetMark(HeapObject::cast(object), mark); |
+ } |
} |
} |
// The DescriptorArray descriptors contains a pointer to its contents array, |