Index: src/ast/ast.cc |
diff --git a/src/ast/ast.cc b/src/ast/ast.cc |
index 530bd50aaf7e12fadf6860b241663b594c5c514c..24712e4ef5a9ee61abcd98624f0191fe45c2aeb3 100644 |
--- a/src/ast/ast.cc |
+++ b/src/ast/ast.cc |
@@ -14,6 +14,7 @@ |
#include "src/code-stubs.h" |
#include "src/contexts.h" |
#include "src/conversions.h" |
+#include "src/elements.h" |
#include "src/property-details.h" |
#include "src/property.h" |
#include "src/string-stream.h" |
@@ -580,11 +581,9 @@ void ArrayLiteral::BuildConstantElements(Isolate* isolate) { |
if (!constant_elements_.is_null()) return; |
int constants_length = values()->length(); |
- |
- // Allocate a fixed array to hold all the object literals. |
- Handle<JSArray> array = isolate->factory()->NewJSArray( |
- FAST_HOLEY_SMI_ELEMENTS, constants_length, constants_length, |
- INITIALIZE_ARRAY_ELEMENTS_WITH_HOLE); |
+ ElementsKind kind = FIRST_FAST_ELEMENTS_KIND; |
+ Handle<FixedArray> fixed_array = |
+ isolate->factory()->NewFixedArrayWithHoles(constants_length); |
// Fill in the literals. |
bool is_simple = true; |
@@ -615,29 +614,34 @@ void ArrayLiteral::BuildConstantElements(Isolate* isolate) { |
is_simple = false; |
} |
- JSObject::AddDataElement(array, array_index, boilerplate_value, NONE) |
- .Assert(); |
+ kind = GetMoreGeneralElementsKind(kind, |
+ boilerplate_value->OptimalElementsKind()); |
+ fixed_array->set(array_index, *boilerplate_value); |
} |
- JSObject::ValidateElements(array); |
- Handle<FixedArrayBase> element_values(array->elements()); |
+ if (is_holey) kind = GetHoleyElementsKind(kind); |
// Simple and shallow arrays can be lazily copied, we transform the |
// elements array to a copy-on-write array. |
if (is_simple && depth_acc == 1 && array_index > 0 && |
- array->HasFastSmiOrObjectElements()) { |
- element_values->set_map(isolate->heap()->fixed_cow_array_map()); |
+ IsFastSmiOrObjectElementsKind(kind)) { |
+ fixed_array->set_map(isolate->heap()->fixed_cow_array_map()); |
+ } |
+ |
+ Handle<FixedArrayBase> elements = fixed_array; |
+ if (IsFastDoubleElementsKind(kind)) { |
+ ElementsAccessor* accessor = ElementsAccessor::ForKind(kind); |
+ elements = isolate->factory()->NewFixedDoubleArray(constants_length); |
+ // We are copying from non-fast-double to fast-double. |
+ ElementsKind from_kind = TERMINAL_FAST_ELEMENTS_KIND; |
+ accessor->CopyElements(fixed_array, from_kind, elements, constants_length); |
} |
// Remember both the literal's constant values as well as the ElementsKind |
// in a 2-element FixedArray. |
Handle<FixedArray> literals = isolate->factory()->NewFixedArray(2, TENURED); |
- |
- ElementsKind kind = array->GetElementsKind(); |
- kind = is_holey ? GetHoleyElementsKind(kind) : GetPackedElementsKind(kind); |
- |
literals->set(0, Smi::FromInt(kind)); |
- literals->set(1, *element_values); |
+ literals->set(1, *elements); |
constant_elements_ = literals; |
set_is_simple(is_simple); |