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