Index: src/objects.cc |
diff --git a/src/objects.cc b/src/objects.cc |
index 375034c18c31551376c9dc625b0309b65a6e985a..2c8c339d996bd6429c7dc534605971893ed48be0 100644 |
--- a/src/objects.cc |
+++ b/src/objects.cc |
@@ -5408,17 +5408,12 @@ MUST_USE_RESULT MaybeObject* JSObject::Freeze(Isolate* isolate) { |
GetElementsCapacityAndUsage(&capacity, &used); |
MaybeObject* maybe_dict = SeededNumberDictionary::Allocate(heap, used); |
if (!maybe_dict->To(&new_element_dictionary)) return maybe_dict; |
- // Make sure that we never go back to fast case. |
- new_element_dictionary->set_requires_slow_elements(); |
// Move elements to a dictionary; avoid calling NormalizeElements to avoid |
// unnecessary transitions. |
maybe_dict = CopyFastElementsToDictionary(isolate, elements(), length, |
new_element_dictionary); |
if (!maybe_dict->To(&new_element_dictionary)) return maybe_dict; |
- |
- // Freeze all the elements in the dictionary. |
- FreezeDictionary(new_element_dictionary); |
} else { |
// No existing elements, use a pre-allocated empty backing store |
new_element_dictionary = heap->empty_slow_element_dictionary(); |
@@ -5470,8 +5465,17 @@ MUST_USE_RESULT MaybeObject* JSObject::Freeze(Isolate* isolate) { |
} |
ASSERT(map()->has_dictionary_elements()); |
- if (new_element_dictionary != NULL) |
+ if (new_element_dictionary != NULL) { |
set_elements(new_element_dictionary); |
+ } |
+ |
+ if (elements() != heap->empty_slow_element_dictionary()) { |
+ SeededNumberDictionary* dictionary = element_dictionary(); |
+ // Make sure we never go back to the fast case |
+ dictionary->set_requires_slow_elements(); |
+ // Freeze all elements in the dictionary |
+ FreezeDictionary(dictionary); |
+ } |
return this; |
} |