diff --git a/deps/v8/src/elements.cc b/deps/v8/src/elements.cc index 3e80d5570b90e4..caa596102f3535 100644 --- a/deps/v8/src/elements.cc +++ b/deps/v8/src/elements.cc @@ -1071,13 +1071,18 @@ class FastElementsAccessor } int num_used = 0; for (int i = 0; i < backing_store->length(); ++i) { - if (!backing_store->is_the_hole(i)) ++num_used; - // Bail out early if more than 1/4 is used. - if (4 * num_used > backing_store->length()) break; - } - if (4 * num_used <= backing_store->length()) { - JSObject::NormalizeElements(obj); + if (!backing_store->is_the_hole(i)) { + ++num_used; + // Bail out if a number dictionary wouldn't be able to save at least + // 75% space. + if (4 * SeededNumberDictionary::ComputeCapacity(num_used) * + SeededNumberDictionary::kEntrySize > + backing_store->length()) { + return; + } + } } + JSObject::NormalizeElements(obj); } } diff --git a/deps/v8/src/objects.cc b/deps/v8/src/objects.cc index 65d5d5f528de79..f6902fc2071273 100644 --- a/deps/v8/src/objects.cc +++ b/deps/v8/src/objects.cc @@ -12226,6 +12226,8 @@ static bool ShouldConvertToFastElements(JSObject* object, uint32_t dictionary_size = static_cast(dictionary->Capacity()) * SeededNumberDictionary::kEntrySize; + + // Turn fast if the dictionary only saves 50% space. return 2 * dictionary_size >= *new_capacity; }