| Index: src/objects.cc
 | 
| diff --git a/src/objects.cc b/src/objects.cc
 | 
| index 2ce145104693c26f371290267a7aa4410e3d7c9f..122550f5d5c42e8bbf55f0ea20202f2f2bdca999 100644
 | 
| --- a/src/objects.cc
 | 
| +++ b/src/objects.cc
 | 
| @@ -5700,21 +5700,20 @@ void DescriptorArray::CopyFrom(int dst_index,
 | 
|    Set(dst_index, &desc, witness);
 | 
|  }
 | 
|  
 | 
| +
 | 
|  MaybeObject* DescriptorArray::CopyReplace(Descriptor* descriptor,
 | 
|                                            int insertion_index) {
 | 
|    ASSERT(0 <= insertion_index && insertion_index < number_of_descriptors());
 | 
|  
 | 
|    // Ensure the key is a symbol.
 | 
| -  { MaybeObject* maybe_result = descriptor->KeyToSymbol();
 | 
| -    if (maybe_result->IsFailure()) return maybe_result;
 | 
| -  }
 | 
| +  MaybeObject* maybe_failure = descriptor->KeyToSymbol();
 | 
| +  if (maybe_failure->IsFailure()) return maybe_failure;
 | 
|  
 | 
|    int size = number_of_descriptors();
 | 
|  
 | 
|    DescriptorArray* new_descriptors;
 | 
| -  { MaybeObject* maybe_result = Allocate(size, MAY_BE_SHARED);
 | 
| -    if (!maybe_result->To(&new_descriptors)) return maybe_result;
 | 
| -  }
 | 
| +  MaybeObject* maybe_descriptors = Allocate(size, MAY_BE_SHARED);
 | 
| +  if (!maybe_descriptors->To(&new_descriptors)) return maybe_descriptors;
 | 
|  
 | 
|    FixedArray::WhitenessWitness witness(new_descriptors);
 | 
|  
 | 
| @@ -5736,8 +5735,8 @@ MaybeObject* DescriptorArray::CopyReplace(Descriptor* descriptor,
 | 
|  
 | 
|  MaybeObject* DescriptorArray::CopyAdd(Descriptor* descriptor) {
 | 
|    // Ensure the key is a symbol.
 | 
| -  MaybeObject* maybe_result = descriptor->KeyToSymbol();
 | 
| -  if (maybe_result->IsFailure()) return maybe_result;
 | 
| +  MaybeObject* maybe_failure = descriptor->KeyToSymbol();
 | 
| +  if (maybe_failure->IsFailure()) return maybe_failure;
 | 
|  
 | 
|    String* key = descriptor->GetKey();
 | 
|    ASSERT(Search(key) == kNotFound);
 | 
| @@ -5793,19 +5792,14 @@ MaybeObject* DescriptorArray::Copy(SharedMode shared_mode) {
 | 
|    return new_descriptors;
 | 
|  }
 | 
|  
 | 
| +
 | 
|  // We need the whiteness witness since sort will reshuffle the entries in the
 | 
|  // descriptor array. If the descriptor array were to be black, the shuffling
 | 
|  // would move a slot that was already recorded as pointing into an evacuation
 | 
|  // candidate. This would result in missing updates upon evacuation.
 | 
| -void DescriptorArray::SortUnchecked(const WhitenessWitness& witness) {
 | 
| +void DescriptorArray::Sort(const WhitenessWitness& witness) {
 | 
|    // In-place heap sort.
 | 
|    int len = number_of_descriptors();
 | 
| -  // Nothing to sort.
 | 
| -  if (len == 0) return;
 | 
| -
 | 
| -  ASSERT(LastAdded() == kNoneAdded ||
 | 
| -         GetDetails(LastAdded()).index() == number_of_descriptors());
 | 
| -
 | 
|    // Bottom-up max-heap construction.
 | 
|    // Index of the last node with children
 | 
|    const int max_parent_index = (len / 2) - 1;
 | 
| @@ -5852,36 +5846,6 @@ void DescriptorArray::SortUnchecked(const WhitenessWitness& witness) {
 | 
|        parent_index = child_index;
 | 
|      }
 | 
|    }
 | 
| -
 | 
| -#ifdef DEBUG
 | 
| -  // Ensure that all enumeration indexes between 1 and length occur uniquely in
 | 
| -  // the descriptor array.
 | 
| -  for (int i = 1; i <= len; ++i) {
 | 
| -    int j;
 | 
| -    for (j = 0; j < len; ++j) {
 | 
| -      if (GetDetails(j).index() == i) break;
 | 
| -    }
 | 
| -    ASSERT(j != len);
 | 
| -    for (j++; j < len; ++j) {
 | 
| -      ASSERT(GetDetails(j).index() != i);
 | 
| -    }
 | 
| -  }
 | 
| -#endif
 | 
| -
 | 
| -  for (int i = 0; i < len; ++i) {
 | 
| -    if (GetDetails(i).index() == len) {
 | 
| -      SetLastAdded(i);
 | 
| -      return;
 | 
| -    }
 | 
| -  }
 | 
| -
 | 
| -  UNREACHABLE();
 | 
| -}
 | 
| -
 | 
| -
 | 
| -void DescriptorArray::Sort(const WhitenessWitness& witness) {
 | 
| -  SortUnchecked(witness);
 | 
| -  SLOW_ASSERT(IsSortedNoDuplicates());
 | 
|  }
 | 
|  
 | 
|  
 | 
| @@ -12555,10 +12519,10 @@ MaybeObject* StringDictionary::TransformPropertiesToFastFor(
 | 
|    descriptors->Sort(witness);
 | 
|    // Allocate new map.
 | 
|    Map* new_map;
 | 
| -  MaybeObject* maybe_new_map =
 | 
| -      obj->map()->CopyReplaceDescriptors(descriptors, NULL, OMIT_TRANSITION);
 | 
| +  MaybeObject* maybe_new_map = obj->map()->CopyDropDescriptors();
 | 
|    if (!maybe_new_map->To(&new_map)) return maybe_new_map;
 | 
|  
 | 
| +  new_map->InitializeDescriptors(descriptors);
 | 
|    new_map->set_unused_property_fields(unused_property_fields);
 | 
|  
 | 
|    // Transform the object.
 | 
| 
 |