| 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,
|
|
|