| Index: src/code-stubs.cc
|
| diff --git a/src/code-stubs.cc b/src/code-stubs.cc
|
| index c53d817cc1e7afa11fd946a9d239e2959246668e..ca4a13d0407309df726047cdebd3f9b19cd13fb7 100644
|
| --- a/src/code-stubs.cc
|
| +++ b/src/code-stubs.cc
|
| @@ -4509,6 +4509,101 @@ void InternalArrayNoArgumentConstructorStub::GenerateAssembly(
|
| assembler->Return(array);
|
| }
|
|
|
| +namespace {
|
| +
|
| +void SingleArgumentConstructorCommon(CodeStubAssembler* assembler,
|
| + ElementsKind elements_kind,
|
| + compiler::Node* array_map,
|
| + compiler::Node* allocation_site,
|
| + Runtime::FunctionId runtime_fallback,
|
| + AllocationSiteMode mode) {
|
| + typedef compiler::Node Node;
|
| + typedef CodeStubAssembler::Label Label;
|
| +
|
| + Label ok(assembler);
|
| + Label smi_size(assembler);
|
| + Label small_smi_size(assembler);
|
| + Label call_runtime(assembler, Label::kDeferred);
|
| +
|
| + Node* size = assembler->Parameter(
|
| + ArraySingleArgumentConstructorDescriptor::kArraySizeSmiParameterIndex);
|
| + assembler->Branch(assembler->WordIsSmi(size), &smi_size, &call_runtime);
|
| +
|
| + assembler->Bind(&smi_size);
|
| + int element_size =
|
| + IsFastDoubleElementsKind(elements_kind) ? kDoubleSize : kPointerSize;
|
| + int max_fast_elements =
|
| + (Page::kMaxRegularHeapObjectSize - FixedArray::kHeaderSize -
|
| + JSArray::kSize - AllocationMemento::kSize) /
|
| + element_size;
|
| + assembler->Branch(
|
| + assembler->SmiAboveOrEqual(
|
| + size, assembler->SmiConstant(Smi::FromInt(max_fast_elements))),
|
| + &call_runtime, &small_smi_size);
|
| +
|
| + assembler->Bind(&small_smi_size);
|
| + {
|
| + Node* array = assembler->AllocateJSArray(
|
| + elements_kind, array_map, size, size,
|
| + mode == DONT_TRACK_ALLOCATION_SITE ? nullptr : allocation_site,
|
| + CodeStubAssembler::SMI_PARAMETERS);
|
| + assembler->Return(array);
|
| + }
|
| +
|
| + assembler->Bind(&call_runtime);
|
| + {
|
| + Node* context = assembler->Parameter(
|
| + ArraySingleArgumentConstructorDescriptor::kContextIndex);
|
| + Node* constructor = assembler->Parameter(
|
| + ArraySingleArgumentConstructorDescriptor::kFunctionIndex);
|
| + Node* argument_count = assembler->Parameter(
|
| + ArraySingleArgumentConstructorDescriptor::kArgumentsCountIndex);
|
| + Node* argument_base_offset = assembler->IntPtrAdd(
|
| + assembler->IntPtrConstant(CommonFrameConstants::kFixedFrameSizeAboveFp -
|
| + kPointerSize),
|
| + assembler->Word32Shl(argument_count,
|
| + assembler->IntPtrConstant(kPointerSizeLog2)));
|
| + Node* argument_base = assembler->IntPtrAdd(assembler->LoadFramePointer(),
|
| + argument_base_offset);
|
| + Node* array = assembler->CallRuntime(
|
| + runtime_fallback, context, constructor, argument_base,
|
| + assembler->SmiTag(argument_count), allocation_site);
|
| + assembler->Return(array);
|
| + }
|
| +}
|
| +} // namespace
|
| +
|
| +void ArraySingleArgumentConstructorStub::GenerateAssembly(
|
| + CodeStubAssembler* assembler) const {
|
| + typedef compiler::Node Node;
|
| + Node* function = assembler->Parameter(
|
| + ArraySingleArgumentConstructorDescriptor::kFunctionIndex);
|
| + Node* native_context =
|
| + assembler->LoadObjectField(function, JSFunction::kContextOffset);
|
| + Node* array_map =
|
| + assembler->LoadJSArrayElementsMap(elements_kind(), native_context);
|
| + AllocationSiteMode mode = override_mode() == DISABLE_ALLOCATION_SITES
|
| + ? DONT_TRACK_ALLOCATION_SITE
|
| + : AllocationSite::GetMode(elements_kind());
|
| + Node* allocation_site = assembler->Parameter(
|
| + ArrayNoArgumentConstructorDescriptor::kAllocationSiteIndex);
|
| + SingleArgumentConstructorCommon(
|
| + assembler, elements_kind(), array_map, allocation_site,
|
| + Runtime::kArraySingleArgumentConstructor, mode);
|
| +}
|
| +
|
| +void InternalArraySingleArgumentConstructorStub::GenerateAssembly(
|
| + CodeStubAssembler* assembler) const {
|
| + typedef compiler::Node Node;
|
| + Node* function = assembler->Parameter(
|
| + ArraySingleArgumentConstructorDescriptor::kFunctionIndex);
|
| + Node* array_map = assembler->LoadObjectField(
|
| + function, JSFunction::kPrototypeOrInitialMapOffset);
|
| + SingleArgumentConstructorCommon(
|
| + assembler, elements_kind(), array_map, assembler->UndefinedConstant(),
|
| + Runtime::kArraySingleArgumentConstructor, DONT_TRACK_ALLOCATION_SITE);
|
| +}
|
| +
|
| ArrayConstructorStub::ArrayConstructorStub(Isolate* isolate)
|
| : PlatformCodeStub(isolate) {
|
| minor_key_ = ArgumentCountBits::encode(ANY);
|
|
|