| 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 &&
|
|
|