Index: src/parser.cc |
diff --git a/src/parser.cc b/src/parser.cc |
index 7e648ede5a61dc030b58718e39e3d8c5a4db88ed..35ed47b1298d7dd8677b3c13839f66ca5c2adfa5 100644 |
--- a/src/parser.cc |
+++ b/src/parser.cc |
@@ -3378,6 +3378,7 @@ Expression* Parser::ParseArrayLiteral(bool* ok) { |
isolate()->factory()->NewFixedArray(values->length(), TENURED); |
Handle<FixedDoubleArray> double_literals; |
ElementsKind elements_kind = FAST_SMI_ONLY_ELEMENTS; |
+ bool has_only_undefined_values = true; |
// Fill in the literals. |
bool is_simple = true; |
@@ -3401,6 +3402,7 @@ Expression* Parser::ParseArrayLiteral(bool* ok) { |
// FAST_DOUBLE_ELEMENTS and FAST_ELEMENTS as necessary. Always remember |
// the tagged value, no matter what the ElementsKind is in case we |
// ultimately end up in FAST_ELEMENTS. |
+ has_only_undefined_values = false; |
object_literals->set(i, *boilerplate_value); |
if (elements_kind == FAST_SMI_ONLY_ELEMENTS) { |
// Smi only elements. Notice if a transition to FAST_DOUBLE_ELEMENTS or |
@@ -3439,6 +3441,13 @@ Expression* Parser::ParseArrayLiteral(bool* ok) { |
} |
} |
+ // Very small array literals that don't have a concrete hint about their type |
+ // from a constant value should default to the slow case to avoid lots of |
+ // elements transitions on really small objects. |
+ if (has_only_undefined_values && values->length() <= 2) { |
+ elements_kind = FAST_ELEMENTS; |
+ } |
+ |
// Simple and shallow arrays can be lazily copied, we transform the |
// elements array to a copy-on-write array. |
if (is_simple && depth == 1 && values->length() > 0 && |