| Index: src/arm64/full-codegen-arm64.cc
|
| diff --git a/src/arm64/full-codegen-arm64.cc b/src/arm64/full-codegen-arm64.cc
|
| index e6b57ea8bd62dbb5d0f26e290e5ae6ea3dbc619e..2099fde186898ae49305d47dfaa83667b7fbbeca 100644
|
| --- a/src/arm64/full-codegen-arm64.cc
|
| +++ b/src/arm64/full-codegen-arm64.cc
|
| @@ -1824,12 +1824,35 @@ void FullCodeGenerator::VisitArrayLiteral(ArrayLiteral* expr) {
|
| __ Ldr(x3, FieldMemOperand(x3, JSFunction::kLiteralsOffset));
|
| __ Mov(x2, Smi::FromInt(expr->literal_index()));
|
| __ Mov(x1, Operand(constant_elements));
|
| - if (expr->depth() > 1) {
|
| + if (has_fast_elements && constant_elements_values->map() ==
|
| + isolate()->heap()->fixed_cow_array_map()) {
|
| + FastCloneShallowArrayStub stub(
|
| + isolate(),
|
| + FastCloneShallowArrayStub::COPY_ON_WRITE_ELEMENTS,
|
| + allocation_site_mode,
|
| + length);
|
| + __ CallStub(&stub);
|
| + __ IncrementCounter(
|
| + isolate()->counters()->cow_arrays_created_stub(), 1, x10, x11);
|
| + } else if ((expr->depth() > 1) || Serializer::enabled() ||
|
| + length > FastCloneShallowArrayStub::kMaximumClonedLength) {
|
| __ Mov(x0, Smi::FromInt(flags));
|
| __ Push(x3, x2, x1, x0);
|
| __ CallRuntime(Runtime::kHiddenCreateArrayLiteral, 4);
|
| } else {
|
| - FastCloneShallowArrayStub stub(isolate(), allocation_site_mode);
|
| + ASSERT(IsFastSmiOrObjectElementsKind(constant_elements_kind) ||
|
| + FLAG_smi_only_arrays);
|
| + FastCloneShallowArrayStub::Mode mode =
|
| + FastCloneShallowArrayStub::CLONE_ANY_ELEMENTS;
|
| +
|
| + if (has_fast_elements) {
|
| + mode = FastCloneShallowArrayStub::CLONE_ELEMENTS;
|
| + }
|
| +
|
| + FastCloneShallowArrayStub stub(isolate(),
|
| + mode,
|
| + allocation_site_mode,
|
| + length);
|
| __ CallStub(&stub);
|
| }
|
|
|
|
|