| Index: src/elements.cc | 
| diff --git a/src/elements.cc b/src/elements.cc | 
| index 751a292cfa074e34cf2bda1bfd2666ac1215d1e6..1f1cd5696ab7153e6bd40cbee1f753df97d92ac8 100644 | 
| --- a/src/elements.cc | 
| +++ b/src/elements.cc | 
| @@ -1372,43 +1372,45 @@ class DictionaryElementsAccessor | 
| int capacity = dict->Capacity(); | 
| uint32_t old_length = 0; | 
| CHECK(array->length()->ToArrayLength(&old_length)); | 
| -    if (dict->requires_slow_elements() && length < old_length) { | 
| -      // Find last non-deletable element in range of elements to be | 
| -      // deleted and adjust range accordingly. | 
| -      for (int i = 0; i < capacity; i++) { | 
| -        DisallowHeapAllocation no_gc; | 
| -        Object* key = dict->KeyAt(i); | 
| -        if (key->IsNumber()) { | 
| -          uint32_t number = static_cast<uint32_t>(key->Number()); | 
| -          if (length <= number && number < old_length) { | 
| -            PropertyDetails details = dict->DetailsAt(i); | 
| -            if (!details.IsConfigurable()) length = number + 1; | 
| +    if (length < old_length) { | 
| +      if (dict->requires_slow_elements()) { | 
| +        // Find last non-deletable element in range of elements to be | 
| +        // deleted and adjust range accordingly. | 
| +        for (int i = 0; i < capacity; i++) { | 
| +          DisallowHeapAllocation no_gc; | 
| +          Object* key = dict->KeyAt(i); | 
| +          if (key->IsNumber()) { | 
| +            uint32_t number = static_cast<uint32_t>(key->Number()); | 
| +            if (length <= number && number < old_length) { | 
| +              PropertyDetails details = dict->DetailsAt(i); | 
| +              if (!details.IsConfigurable()) length = number + 1; | 
| +            } | 
| } | 
| } | 
| } | 
| -    } | 
|  | 
| -    if (length == 0) { | 
| -      // Flush the backing store. | 
| -      JSObject::ResetElements(array); | 
| -    } else { | 
| -      DisallowHeapAllocation no_gc; | 
| -      // Remove elements that should be deleted. | 
| -      int removed_entries = 0; | 
| -      Handle<Object> the_hole_value = isolate->factory()->the_hole_value(); | 
| -      for (int i = 0; i < capacity; i++) { | 
| -        Object* key = dict->KeyAt(i); | 
| -        if (key->IsNumber()) { | 
| -          uint32_t number = static_cast<uint32_t>(key->Number()); | 
| -          if (length <= number && number < old_length) { | 
| -            dict->SetEntry(i, the_hole_value, the_hole_value); | 
| -            removed_entries++; | 
| +      if (length == 0) { | 
| +        // Flush the backing store. | 
| +        JSObject::ResetElements(array); | 
| +      } else { | 
| +        DisallowHeapAllocation no_gc; | 
| +        // Remove elements that should be deleted. | 
| +        int removed_entries = 0; | 
| +        Handle<Object> the_hole_value = isolate->factory()->the_hole_value(); | 
| +        for (int i = 0; i < capacity; i++) { | 
| +          Object* key = dict->KeyAt(i); | 
| +          if (key->IsNumber()) { | 
| +            uint32_t number = static_cast<uint32_t>(key->Number()); | 
| +            if (length <= number && number < old_length) { | 
| +              dict->SetEntry(i, the_hole_value, the_hole_value); | 
| +              removed_entries++; | 
| +            } | 
| } | 
| } | 
| -      } | 
|  | 
| -      // Update the number of elements. | 
| -      dict->ElementsRemoved(removed_entries); | 
| +        // Update the number of elements. | 
| +        dict->ElementsRemoved(removed_entries); | 
| +      } | 
| } | 
|  | 
| Handle<Object> length_obj = isolate->factory()->NewNumberFromUint(length); | 
|  |